From 9247c044fe4b4f6c176f2b61112034af51131b6c Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Wed, 20 Oct 2021 09:18:17 +0800 Subject: [PATCH] feat: reduce dependencies and remove useless query criteria --- aspnet-core/LINGYUN.MicroService.All.sln | 2077 ++++++++--------- .../Abp/IM/SignalR/AbpIMSignalROptions.cs | 38 +- .../Abp/IM/SignalR/Hubs/MessagesHub.cs | 263 ++- .../LINGYUN/Abp/IM/Contract/IFriendStore.cs | 318 ++- .../LINGYUN/Abp/IM/Group/IUserGroupStore.cs | 214 +- .../LINGYUN/Abp/IM/IUserCardFinder.cs | 118 +- .../Abp/IM/Messages/IMessageBlocker.cs | 3 + .../Abp/IM/Messages/IMessageProcessor.cs | 23 + .../LINGYUN/Abp/IM/Messages/IMessageStore.cs | 211 +- .../{MessageSendState.cs => MessageState.cs} | 54 +- .../Abp/IM/Messages/NullMessageProcessor.cs | 19 + .../Abp/IM/Settings/AbpIMSettingNames.cs | 11 + .../SignalR/AbpNotificationsSignalROptions.cs | 30 +- .../SignalR/Hubs/NotificationsHub.cs | 159 +- .../Abp/Notifications/INotificationStore.cs | 251 +- .../Notifications/NullNotificationStore.cs | 375 ++- .../LINGYUN.Abp.RealTime.csproj | 1 + .../Chat/Dto/GetMyFriendsDto.cs | 19 +- .../Chat/Dto/GetUserLastMessageDto.cs | 21 +- .../Chat/Dto/GroupMessageGetByPagedDto.cs | 29 +- .../Chat/Dto/GroupUserGetByPagedDto.cs | 28 +- .../Chat/Dto/MyFriendGetByPagedDto.cs | 28 +- .../Chat/Dto/UserMessageGetByPagedDto.cs | 31 +- .../Dto/UserNotificationGetByPagedDto.cs | 26 +- .../Abp/MessageService/Chat/ChatAppService.cs | 272 +-- .../MessageService/Chat/MyFriendAppService.cs | 134 +- .../Notifications/MyNotificationAppService.cs | 242 +- .../Localization/MessageServiceResource.cs | 18 +- .../MessageServiceErrorCodes.cs | 202 +- ...MessageServiceSettingDefinitionProvider.cs | 30 + .../MessageServiceSettingNames.cs | 41 +- .../Abp/MessageService/Chat/FriendStore.cs | 557 +++-- .../MessageService/Chat/IMessageRepository.cs | 204 +- .../Chat/IUserChatCardRepository.cs | 75 +- .../Chat/IUserChatFriendRepository.cs | 114 +- .../Abp/MessageService/Chat/Message.cs | 103 +- .../MessageService/Chat/MessageProcessor.cs | 82 + .../Abp/MessageService/Chat/MessageStore.cs | 511 ++-- .../Abp/MessageService/Chat/UserCardFinder.cs | 115 +- .../Group/IUserChatGroupRepository.cs | 158 +- .../MessageService/Group/UserGroupStore.cs | 293 ++- .../IUserNotificationRepository.cs | 95 +- .../Notifications/NotificationStore.cs | 877 ++++--- .../Chat/EfCoreMessageRepository.cs | 511 ++-- .../Chat/EfCoreUserChatCardRepository.cs | 137 +- .../Chat/EfCoreUserChatFriendRepository.cs | 441 ++-- .../Group/EfCoreUserChatGroupRepository.cs | 338 ++- .../EfCoreUserNotificationRepository.cs | 262 +-- .../LINGYUN.Abp.WeChat.csproj | 4 +- .../LINGYUN/Abp/WeChat/AbpWeChatModule.cs | 4 +- .../account/AuthServer.Host/Startup.cs | 53 +- .../BackendAdminHostModule.cs | 18 - .../Dockerfile | 27 +- ...NGYUN.Abp.BackendAdmin.HttpApi.Host.csproj | 14 +- ...GYUN.Abp.Account.Application.Contracts.dll | Bin 0 -> 12800 bytes .../LINGYUN.Abp.Aliyun.SettingManagement.dll | Bin 0 -> 21504 bytes .../Modules/LINGYUN.Abp.Aliyun.dll | Bin 0 -> 25600 bytes .../Modules/LINGYUN.Abp.IM.dll | Bin 0 -> 25088 bytes ...YUN.Abp.Identity.Application.Contracts.dll | Bin 0 -> 24064 bytes .../LINGYUN.Abp.Identity.Domain.Shared.dll | Bin 0 -> 20992 bytes ...p.IdentityServer.Application.Contracts.dll | Bin 0 -> 69632 bytes ...zationManagement.Application.Contracts.dll | Bin 0 -> 18432 bytes ...p.LocalizationManagement.Domain.Shared.dll | Bin 0 -> 13824 bytes ...p.MessageService.Application.Contracts.dll | Bin 0 -> 19968 bytes ...NGYUN.Abp.MessageService.Domain.Shared.dll | Bin 0 -> 12288 bytes .../Modules/LINGYUN.Abp.Notifications.dll | Bin 0 -> 49664 bytes ...bp.OssManagement.Application.Contracts.dll | Bin 0 -> 19456 bytes ...INGYUN.Abp.OssManagement.Domain.Shared.dll | Bin 0 -> 16896 bytes .../Modules/LINGYUN.Abp.RealTime.dll | Bin 0 -> 18944 bytes .../Modules/LINGYUN.Abp.Sms.Aliyun.dll | Bin 0 -> 37888 bytes .../LINGYUN.Abp.WeChat.MiniProgram.dll | Bin 0 -> 26624 bytes .../Modules/LINGYUN.Abp.WeChat.Official.dll | Bin 0 -> 16384 bytes .../LINGYUN.Abp.WeChat.SettingManagement.dll | Bin 0 -> 19968 bytes .../Modules/LINGYUN.Abp.WeChat.dll | Bin 0 -> 32768 bytes ...NGYUN.ApiGateway.Application.Contracts.dll | Bin 0 -> 41472 bytes .../LINGYUN.ApiGateway.Domain.Shared.dll | Bin 0 -> 13824 bytes ...LINGYUN.Platform.Application.Contracts.dll | Bin 0 -> 40448 bytes .../LINGYUN.Platform.Domain.Shared.dll | Bin 0 -> 23040 bytes ...Volo.Abp.Account.Application.Contracts.dll | Bin 0 -> 101888 bytes ...olo.Abp.Identity.Application.Contracts.dll | Bin 0 -> 19968 bytes .../Volo.Abp.Identity.Domain.Shared.dll | Bin 0 -> 213504 bytes .../Volo.Abp.IdentityServer.Domain.Shared.dll | Bin 0 -> 50176 bytes .../Modules/Volo.Abp.Users.Abstractions.dll | Bin 0 -> 8192 bytes .../Modules/Volo.Abp.Users.Domain.Shared.dll | Bin 0 -> 5120 bytes .../Properties/launchSettings.json | 40 +- .../Startup.cs | 49 +- .../LINGYUN.ApiGateway.Host/Startup.cs | 49 +- .../Startup.cs | 49 +- .../Startup.cs | 47 +- .../Startup.cs | 63 +- .../Startup.cs | 49 +- .../LINGYUN.Platform.HttpApi.Host/Startup.cs | 49 +- build/build-aspnetcore-ef-update.ps1 | 16 +- build/build-aspnetcore-modules.ps1 | 31 + build/modules.dependencies.json | 51 + docker-compose.override.yml | 35 +- 96 files changed, 5574 insertions(+), 5233 deletions(-) create mode 100644 aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs rename aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/{MessageSendState.cs => MessageState.cs} (75%) create mode 100644 aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs create mode 100644 aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs create mode 100644 aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs rename aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/{ => Settings}/MessageServiceSettingNames.cs (53%) create mode 100644 aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IdentityServer.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Sms.Aliyun.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.MiniProgram.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.IdentityServer.Domain.Shared.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll create mode 100644 aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll create mode 100644 build/build-aspnetcore-modules.ps1 create mode 100644 build/modules.dependencies.json diff --git a/aspnet-core/LINGYUN.MicroService.All.sln b/aspnet-core/LINGYUN.MicroService.All.sln index 01b61ee50..6703f7ee7 100644 --- a/aspnet-core/LINGYUN.MicroService.All.sln +++ b/aspnet-core/LINGYUN.MicroService.All.sln @@ -1,1042 +1,1035 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30011.22 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{C5CAD011-DF84-4914-939C-0C029DCEF26F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{672E1170-7B18-474B-85C7-1961BF2A48AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "modules\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{77BDEF2B-1A30-4E64-BC35-0DFC21091327}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{573B7B0E-3065-42DE-A391-EE026CE7A366}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{68ADC230-B563-4948-BBF1-2112DFE93BC1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain.Shared", "modules\apigateway\LINGYUN.ApiGateway.Domain.Shared\LINGYUN.ApiGateway.Domain.Shared.csproj", "{40E217A9-46EA-48DE-BE0B-6CC824240E97}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain", "modules\apigateway\LINGYUN.ApiGateway.Domain\LINGYUN.ApiGateway.Domain.csproj", "{1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application.Contracts", "modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj", "{269FF49F-97A3-4502-B424-D8CD55FC5727}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application", "modules\apigateway\LINGYUN.ApiGateway.Application\LINGYUN.ApiGateway.Application.csproj", "{87049236-4808-4C33-88BA-D3CA6BB1F786}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.EntityFrameworkCore", "modules\apigateway\LINGYUN.ApiGateway.EntityFrameworkCore\LINGYUN.ApiGateway.EntityFrameworkCore.csproj", "{3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Client", "modules\apigateway\LINGYUN.ApiGateway.HttpApi.Client\LINGYUN.ApiGateway.HttpApi.Client.csproj", "{089BE2D2-D579-47DA-B135-449C1153F27E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi", "modules\apigateway\LINGYUN.ApiGateway.HttpApi\LINGYUN.ApiGateway.HttpApi.csproj", "{D137106D-DCD5-455B-A297-44831DF38EE8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{19E6BD61-062B-4FAD-A51A-B55F5CE88B7A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{E2408063-FB1F-4513-B4A7-1FE50667C6E8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Host", "services\apigateway\LINGYUN.ApiGateway.Host\LINGYUN.ApiGateway.Host.csproj", "{7DF65FB1-AFA3-4D50-83D6-A37318296E6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Host", "services\apigateway\LINGYUN.ApiGateway.HttpApi.Host\LINGYUN.ApiGateway.HttpApi.Host.csproj", "{9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthServer.Host", "services\account\AuthServer.Host\AuthServer.Host.csproj", "{C1F56ED5-E898-45F1-97B5-61F4AB30FB58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{0439B173-F41E-4CE0-A44A-CCB70328F272}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application.Contracts", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj", "{3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{A584D040-95AC-4422-93FF-7B80532213F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{76249548-4344-4CD0-A0AC-12AC54184B58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenants", "tenants", "{A5543E56-DA53-494D-A531-DA75091D46FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application.Contracts", "modules\tenants\LINGYUN.Abp.TenantManagement.Application.Contracts\LINGYUN.Abp.TenantManagement.Application.Contracts.csproj", "{FF4A3402-8DE2-4494-8F2B-614356DA72EA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application", "modules\tenants\LINGYUN.Abp.TenantManagement.Application\LINGYUN.Abp.TenantManagement.Application.csproj", "{EAE87281-4C33-4E8B-A489-480C55BA9E89}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi\LINGYUN.Abp.TenantManagement.HttpApi.csproj", "{51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{E5D1B78A-1A8F-4D52-BF99-A4A863ADE898}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackendAdmin.HttpApi.Host", "services\admin\LINGYUN.Abp.BackendAdmin.HttpApi.Host\LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj", "{85090598-6B03-43D3-BE61-1E9777252D50}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{8AC72641-30D3-4ACF-89FA-808FADC55C2E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EventBus.CAP", "modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{AEC1E6D3-DC23-41BD-B456-3AAD26E34978}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{9E72FEB9-A626-4312-892B-CDD043879758}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application.Contracts", "modules\account\LINGYUN.Abp.Account.Application.Contracts\LINGYUN.Abp.Account.Application.Contracts.csproj", "{8B09385A-719C-4B83-B61E-0ECD5D2734BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{8E569C1C-2637-4D89-804C-50FBC83948FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "modules\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{FF1839EA-FB6B-4ED5-9804-E40427046D35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location", "modules\common\LINGYUN.Abp.Location\LINGYUN.Abp.Location.csproj", "{9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu", "modules\common\LINGYUN.Abp.Location.Baidu\LINGYUN.Abp.Location.Baidu.csproj", "{6E4A0D87-C3CE-430F-A475-A6B68C116D96}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{A5851F0F-CB0D-4E29-A829-D1BDEADB807B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{FDEECE0D-6F66-4053-948E-9AC021B97C8D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\common\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{B9FA1A02-A2BF-480D-914E-0780DAE442FC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{59619184-02E7-4C61-8F96-89320CD7A3AE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{865A2AE3-864B-4425-8FA6-AFD62F6466DB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock", "modules\common\LINGYUN.Abp.DistributedLock\LINGYUN.Abp.DistributedLock.csproj", "{35A23613-85BA-4E1B-835C-DB33AB4A2751}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock.Redis", "modules\common\LINGYUN.Abp.DistributedLock.Redis\LINGYUN.Abp.DistributedLock.Redis.csproj", "{F6776BF7-5F73-4224-8915-C017F4EEDD28}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{371B293B-0CA9-4385-8EBB-5224332066D2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Host", "services\messages\LINGYUN.Abp.MessageService.HttpApi.Host\LINGYUN.Abp.MessageService.HttpApi.Host.csproj", "{0D1DB712-B48D-4FB7-9A47-694C668A62E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{9E12ADBF-713B-4FE7-B71F-52B5078A57CE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.MySql", "modules\common\LINGYUN.Abp.Hangfire.MySqlStorage\LINGYUN.Abp.Hangfire.Storage.MySql.csproj", "{47CC8F7A-681D-42B9-AE04-78453782C1B6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.SqlServer", "modules\common\LINGYUN.Abp.Hangfire.Storage.SqlServer\LINGYUN.Abp.Hangfire.Storage.SqlServer.csproj", "{F595CB9F-B117-4D62-A1AE-48599927DB36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs.Hangfire", "modules\common\LINGYUN.Abp.BackgroundJobs.Hangfire\LINGYUN.Abp.BackgroundJobs.Hangfire.csproj", "{5CF403B2-47C9-4E4E-8856-0294BDD64884}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun", "modules\common\LINGYUN.Abp.BlobStoring.Aliyun\LINGYUN.Abp.BlobStoring.Aliyun.csproj", "{059473BA-FAF9-405F-9985-33DDCA2E9F0D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun.Tests", "tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests.csproj", "{C8A00439-5B8D-4923-8FAA-AB75E2A786ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{31B03DCB-ED12-4412-867A-61E347D40D8C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{AB984240-EF03-416F-A9B2-F5CF169E04B7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Client", "modules\message\LINGYUN.Abp.MessageService.HttpApi.Client\LINGYUN.Abp.MessageService.HttpApi.Client.csproj", "{EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "modules\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{65DDA934-B76B-4018-A565-CF6CEF0D6BB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\common\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{0F14C850-7F4C-4791-9C6C-7E56F985C71D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{376D8343-DF83-41D2-BF6E-2F5DC8DBF259}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing.Tests", "tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests.csproj", "{6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi.Client", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi.Client\LINGYUN.Abp.TenantManagement.HttpApi.Client.csproj", "{87C7DDCF-F80D-4A15-9044-71552DCB5550}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.RemoteService", "modules\tenants\LINGYUN.Abp.MultiTenancy.RemoteService\LINGYUN.Abp.MultiTenancy.RemoteService.csproj", "{7208C9AB-AB76-43E7-95FA-A0E463E82A3C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.DbFinder", "modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj", "{9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy", "modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj", "{A2B4ECAE-DABE-40F7-9335-496A79EDE671}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent", "modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj", "{1DA91161-8757-4A68-A0A1-8C94C36C9240}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F4923692-D343-4318-AECA-96F580B1A563}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{F135B9E8-3FFE-44E9-835B-7B6A928F4823}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{75A6D078-C19D-4030-88CC-C2A8608FF604}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{2D895594-3FF5-4507-853A-CB65F2DB72ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{0655A0FB-59E8-4A9F-BAF5-47A89377F747}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{F4615BCE-D5C1-407A-8681-8EEE92DEF9D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFrameworkCore.Tests", "tests\LINGYUN.Abp.EntityFrameworkCore.Tests\LINGYUN.Abp.EntityFrameworkCore.Tests.csproj", "{F3D9B137-32DE-4018-8058-78AB17FCDF9C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}" - ProjectSection(SolutionItems) = preProject - modules\oss-management\README.md = modules\oss-management\README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{86A67B8C-EFA0-4103-B60F-312F07C15A7A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi.Host", "services\platform\LINGYUN.Platform.HttpApi.Host\LINGYUN.Platform.HttpApi.Host.csproj", "{372123C3-3AFD-42C8-BB80-778322EA72C3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{F359AAA1-C854-444A-88F2-1C0D8A07F864}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{5D0ED1FC-3A7C-4531-9512-832E73AD9555}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{2BF7FB73-0C62-4ECF-99F0-0583855D2777}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{6FE7E243-2D99-4567-8786-6C9283D608EF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{685188AC-A145-4A27-BF5F-9C970A59AA9C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer4.HttpApi.Host", "services\identity-server\LINGYUN.Abp.IdentityServer4.HttpApi.Host\LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj", "{F85552D4-D22E-483A-B1F8-3DFB840F6F7C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Settings", "modules\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj", "{6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests.csproj", "{F12F4645-C0FE-4129-8C71-65B4039DC445}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Tests\LINGYUN.Abp.Features.LimitValidation.Tests.csproj", "{C457FA70-8732-44B8-A018-C96D14025D4B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "features", "features", "{08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{7071E78B-755B-410A-830B-AA05D7168944}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "modules\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{87B65CBD-0FF4-4FB5-9ABC-161911A71179}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application.Contracts", "modules\auditing\LINGYUN.Abp.Auditing.Application.Contracts\LINGYUN.Abp.Auditing.Application.Contracts.csproj", "{F40F88F1-CA90-4A79-B772-80E287E25982}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{AC3C8985-73C2-472A-8E76-A0B8786FEC3F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permission-management", "permission-management", "{CC362C67-6FC1-42B3-A130-8120AA8D790C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain\LINGYUN.Abp.PermissionManagement.Domain.csproj", "{B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.Identity", "modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj", "{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{A66D48C9-F141-4111-9169-CEB64AFFF61D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{524276E1-053D-4191-ABF7-4CDA01BFFBC3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json", "modules\common\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json.csproj", "{43083268-74DE-4C68-824A-FB0CEC77358D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{BAE74ABC-1096-495F-A624-BEBFBC1896F2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{E92A1CAA-5758-41EF-B67E-C0D394E85417}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{F18DE651-A3E4-478F-A2B5-686429729EB8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "modules\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{42309C06-C0F2-490F-931B-CF41FA1970FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "modules\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat\LINGYUN.Abp.IdentityServer.WeChat.csproj", "{7356FC4B-CAB2-4808-8C97-9AF74583F3A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-aliyun", "cloud-aliyun", "{14CDBAD1-10C8-464A-B445-1F727C988010}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-tencent", "cloud-tencent", "{3B96F4D8-4993-419B-BCEB-AFE4ED39449F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "modules\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{97B4A37E-B93E-48C9-95D5-689CB9495D8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Sms", "modules\common\LINGYUN.Abp.Notifications.Sms\LINGYUN.Abp.Notifications.Sms.csproj", "{8C3312E7-F51E-4780-A893-CE0E0B80B579}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{B86EBB6F-A27F-4277-8265-937951A9DCB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Aliyun", "modules\oss-management\LINGYUN.Abp.OssManagement.Aliyun\LINGYUN.Abp.OssManagement.Aliyun.csproj", "{35B17218-9FB6-439E-AF73-9A1454BC923C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{D5036D3F-1C53-47EE-BA50-AD290AE062D7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem.ImageSharp", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj", "{3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{BD74BE00-54E4-4979-8797-E8027695F396}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{48DE251A-3482-4934-BC26-F99D2235AC9F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent.Tests", "tests\LINGYUN.Abp.Location.Tencent.Tests\LINGYUN.Abp.Location.Tencent.Tests.csproj", "{94B47385-E47F-4FD7-A3A9-A7AA122EFC93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu.Tests", "tests\LINGYUN.Abp.Location.Baidu.Tests\LINGYUN.Abp.Location.Baidu.Tests.csproj", "{C892CD81-50AE-49E5-BF44-A0C28A1614CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Client", "modules\common\LINGYUN.Abp.AspNetCore.Mvc.Client\LINGYUN.Abp.AspNetCore.Mvc.Client.csproj", "{EEF03CC6-1013-4AAF-BEED-BB4BA5021039}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{90E88EAC-4291-4406-8D88-EFDF61B11292}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml", "modules\localization\LINGYUN.Abp.Localization.Xml\LINGYUN.Abp.Localization.Xml.csproj", "{84868710-ECBB-4025-900A-EEB99EC49534}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml.Tests", "tests\LINGYUN.Abp.Localization.Xml.Tests\LINGYUN.Abp.Localization.Xml.Tests.csproj", "{A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Dynamic", "modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj", "{4A9043FD-24A3-4A4A-956B-9CB71876F415}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{D3BAA44E-8395-4E8A-AA96-6B463356C537}" - ProjectSection(SolutionItems) = preProject - modules\lt\README.md = modules\lt\README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{5BE18D72-0D02-4854-966E-745CE5DAF77F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{06D34108-01BA-4C77-A704-4DD9E6F7E32C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{A98C939C-9F48-414A-A2D3-853BE4447397}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\lt\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{FBE91498-D83B-4873-A67E-0FB9D1C366F0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi.Host", "services\localization\LINGYUN.Abp.LocalizationManagement.HttpApi.Host\LINGYUN.Abp.LocalizationManagement.HttpApi.Host.csproj", "{6FFC14FE-F659-4B23-9746-4B767CE520D2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rules", "rules", "{6084D52D-775B-4A39-8CD5-AA2F362B5A61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules", "modules\rules\LINGYUN.Abp.Rules\LINGYUN.Abp.Rules.csproj", "{D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.NRules", "modules\rules\LINGYUN.Abp.Rules.NRules\LINGYUN.Abp.Rules.NRules.csproj", "{34BB9810-2983-4E55-A96A-132D32310145}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine", "modules\rules\LINGYUN.Abp.Rules.RulesEngine\LINGYUN.Abp.Rules.RulesEngine.csproj", "{4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine.Tests", "tests\LINGYUN.Abp.Rules.RulesEngine.Tests\LINGYUN.Abp.Rules.RulesEngine.Tests.csproj", "{8EF31071-3521-409D-9740-BBFBFC04C50E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "modules\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{13219C1C-23E1-4EBA-93FB-86830C93A800}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ApiGateway.Host", "services\apigateway\LINGYUN.Abp.ApiGateway.Host\LINGYUN.Abp.ApiGateway.Host.csproj", "{A320E23E-792D-4736-B963-381F9D7AF605}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundWorkers.Hangfire", "modules\common\LINGYUN.Abp.BackgroundWorkers.Hangfire\LINGYUN.Abp.BackgroundWorkers.Hangfire.csproj", "{60D0BEF2-FEAF-4066-8377-6C873CB24858}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Dashboard", "modules\common\LINGYUN.Abp.Hangfire.Dashboard\LINGYUN.Abp.Hangfire.Dashboard.csproj", "{340BE5AC-68EC-41A5-9D0D-266037C58F13}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.Build.0 = Release|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.Build.0 = Debug|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.ActiveCfg = Release|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.Build.0 = Release|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.Build.0 = Release|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.ActiveCfg = Release|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.Build.0 = Release|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.Build.0 = Release|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.Build.0 = Debug|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.ActiveCfg = Release|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.Build.0 = Release|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.Build.0 = Release|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.Build.0 = Release|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.Build.0 = Release|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.Build.0 = Release|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.Build.0 = Release|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.Build.0 = Release|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.Build.0 = Release|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.Build.0 = Release|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.Build.0 = Release|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.Build.0 = Release|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.Build.0 = Release|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.Build.0 = Release|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.Build.0 = Release|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.Build.0 = Release|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.Build.0 = Release|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.Build.0 = Release|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.Build.0 = Release|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.Build.0 = Release|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.Build.0 = Release|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.Build.0 = Release|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.Build.0 = Release|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.Build.0 = Release|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.Build.0 = Release|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.Build.0 = Release|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.Build.0 = Release|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.Build.0 = Release|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.Build.0 = Release|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.Build.0 = Release|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.Build.0 = Release|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.Build.0 = Release|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.Build.0 = Release|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.Build.0 = Release|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.Build.0 = Release|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.Build.0 = Release|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.Build.0 = Release|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.Build.0 = Release|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.Build.0 = Release|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.Build.0 = Release|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.Build.0 = Release|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.Build.0 = Release|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.Build.0 = Release|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.Build.0 = Release|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.Build.0 = Release|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.Build.0 = Release|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.Build.0 = Debug|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.ActiveCfg = Release|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.Build.0 = Release|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.Build.0 = Release|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.Build.0 = Release|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.Build.0 = Release|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.Build.0 = Release|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.Build.0 = Release|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.Build.0 = Release|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.Build.0 = Release|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.Build.0 = Release|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.Build.0 = Release|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.Build.0 = Release|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.Build.0 = Release|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.Build.0 = Release|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.Build.0 = Release|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.Build.0 = Release|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.Build.0 = Release|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.Build.0 = Release|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.Build.0 = Release|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.Build.0 = Release|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.Build.0 = Release|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.Build.0 = Release|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.Build.0 = Release|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.Build.0 = Release|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.Build.0 = Release|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.Build.0 = Release|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.Build.0 = Release|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.Build.0 = Release|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.Build.0 = Release|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.Build.0 = Release|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.Build.0 = Release|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.Build.0 = Release|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.Build.0 = Release|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.Build.0 = Release|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.Build.0 = Release|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.Build.0 = Release|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.Build.0 = Release|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.Build.0 = Release|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.Build.0 = Release|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.Build.0 = Release|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.Build.0 = Release|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.Build.0 = Release|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.Build.0 = Release|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.Build.0 = Release|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.Build.0 = Release|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.Build.0 = Release|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.Build.0 = Release|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.Build.0 = Release|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.Build.0 = Release|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.Build.0 = Release|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.Build.0 = Release|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.Build.0 = Release|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.Build.0 = Release|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.Build.0 = Release|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.Build.0 = Release|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.Build.0 = Release|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.Build.0 = Release|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.Build.0 = Release|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.Build.0 = Release|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.Build.0 = Release|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.Build.0 = Release|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.Build.0 = Release|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.Build.0 = Release|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.Build.0 = Release|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.Build.0 = Release|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.Build.0 = Release|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.Build.0 = Release|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.Build.0 = Release|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.Build.0 = Release|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.Build.0 = Release|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.Build.0 = Release|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.Build.0 = Release|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.Build.0 = Release|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.Build.0 = Release|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.Build.0 = Release|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.Build.0 = Release|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.Build.0 = Release|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.Build.0 = Release|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.Build.0 = Debug|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.ActiveCfg = Release|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.Build.0 = Release|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Release|Any CPU.Build.0 = Release|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.Build.0 = Release|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {77BDEF2B-1A30-4E64-BC35-0DFC21091327} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {573B7B0E-3065-42DE-A391-EE026CE7A366} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {68ADC230-B563-4948-BBF1-2112DFE93BC1} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {40E217A9-46EA-48DE-BE0B-6CC824240E97} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {269FF49F-97A3-4502-B424-D8CD55FC5727} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {87049236-4808-4C33-88BA-D3CA6BB1F786} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {089BE2D2-D579-47DA-B135-449C1153F27E} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {D137106D-DCD5-455B-A297-44831DF38EE8} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {E2408063-FB1F-4513-B4A7-1FE50667C6E8} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58} = {685188AC-A145-4A27-BF5F-9C970A59AA9C} - {0439B173-F41E-4CE0-A44A-CCB70328F272} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {A584D040-95AC-4422-93FF-7B80532213F0} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {76249548-4344-4CD0-A0AC-12AC54184B58} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {A5543E56-DA53-494D-A531-DA75091D46FF} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {FF4A3402-8DE2-4494-8F2B-614356DA72EA} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {EAE87281-4C33-4E8B-A489-480C55BA9E89} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {85090598-6B03-43D3-BE61-1E9777252D50} = {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} - {8AC72641-30D3-4ACF-89FA-808FADC55C2E} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {9E72FEB9-A626-4312-892B-CDD043879758} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {8B09385A-719C-4B83-B61E-0ECD5D2734BD} = {9E72FEB9-A626-4312-892B-CDD043879758} - {8E569C1C-2637-4D89-804C-50FBC83948FB} = {9E72FEB9-A626-4312-892B-CDD043879758} - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D} = {9E72FEB9-A626-4312-892B-CDD043879758} - {FF1839EA-FB6B-4ED5-9804-E40427046D35} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {6E4A0D87-C3CE-430F-A475-A6B68C116D96} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {FDEECE0D-6F66-4053-948E-9AC021B97C8D} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {B9FA1A02-A2BF-480D-914E-0780DAE442FC} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {59619184-02E7-4C61-8F96-89320CD7A3AE} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {865A2AE3-864B-4425-8FA6-AFD62F6466DB} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {35A23613-85BA-4E1B-835C-DB33AB4A2751} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F6776BF7-5F73-4224-8915-C017F4EEDD28} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {371B293B-0CA9-4385-8EBB-5224332066D2} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {0D1DB712-B48D-4FB7-9A47-694C668A62E3} = {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {47CC8F7A-681D-42B9-AE04-78453782C1B6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F595CB9F-B117-4D62-A1AE-48599927DB36} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {5CF403B2-47C9-4E4E-8856-0294BDD64884} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {059473BA-FAF9-405F-9985-33DDCA2E9F0D} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {31B03DCB-ED12-4412-867A-61E347D40D8C} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {AB984240-EF03-416F-A9B2-F5CF169E04B7} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {0F14C850-7F4C-4791-9C6C-7E56F985C71D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {87C7DDCF-F80D-4A15-9044-71552DCB5550} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {A2B4ECAE-DABE-40F7-9335-496A79EDE671} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {1DA91161-8757-4A68-A0A1-8C94C36C9240} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F4923692-D343-4318-AECA-96F580B1A563} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F135B9E8-3FFE-44E9-835B-7B6A928F4823} = {F4923692-D343-4318-AECA-96F580B1A563} - {75A6D078-C19D-4030-88CC-C2A8608FF604} = {F4923692-D343-4318-AECA-96F580B1A563} - {2D895594-3FF5-4507-853A-CB65F2DB72ED} = {F4923692-D343-4318-AECA-96F580B1A563} - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93} = {F4923692-D343-4318-AECA-96F580B1A563} - {0655A0FB-59E8-4A9F-BAF5-47A89377F747} = {F4923692-D343-4318-AECA-96F580B1A563} - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE} = {F4923692-D343-4318-AECA-96F580B1A563} - {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {F3D9B137-32DE-4018-8058-78AB17FCDF9C} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {52B5D4F7-237B-4E0A-A167-68442164F70A} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F19C8B0F-A332-4190-9ABE-95790E0AE864} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {86A67B8C-EFA0-4103-B60F-312F07C15A7A} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {372123C3-3AFD-42C8-BB80-778322EA72C3} = {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} - {F359AAA1-C854-444A-88F2-1C0D8A07F864} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {5D0ED1FC-3A7C-4531-9512-832E73AD9555} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {2BF7FB73-0C62-4ECF-99F0-0583855D2777} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {6FE7E243-2D99-4567-8786-6C9283D608EF} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {685188AC-A145-4A27-BF5F-9C970A59AA9C} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C} = {E2408063-FB1F-4513-B4A7-1FE50667C6E8} - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F12F4645-C0FE-4129-8C71-65B4039DC445} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C457FA70-8732-44B8-A018-C96D14025D4B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {7071E78B-755B-410A-830B-AA05D7168944} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} - {87B65CBD-0FF4-4FB5-9ABC-161911A71179} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} - {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F40F88F1-CA90-4A79-B772-80E287E25982} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {CC362C67-6FC1-42B3-A130-8120AA8D790C} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727} = {CC362C67-6FC1-42B3-A130-8120AA8D790C} - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {A66D48C9-F141-4111-9169-CEB64AFFF61D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {524276E1-053D-4191-ABF7-4CDA01BFFBC3} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {43083268-74DE-4C68-824A-FB0CEC77358D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {BAE74ABC-1096-495F-A624-BEBFBC1896F2} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {E92A1CAA-5758-41EF-B67E-C0D394E85417} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {F18DE651-A3E4-478F-A2B5-686429729EB8} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {42309C06-C0F2-490F-931B-CF41FA1970FF} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {14CDBAD1-10C8-464A-B445-1F727C988010} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {97B4A37E-B93E-48C9-95D5-689CB9495D8B} = {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} - {8C3312E7-F51E-4780-A893-CE0E0B80B579} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {B86EBB6F-A27F-4277-8265-937951A9DCB0} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {35B17218-9FB6-439E-AF73-9A1454BC923C} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {D5036D3F-1C53-47EE-BA50-AD290AE062D7} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {BD74BE00-54E4-4979-8797-E8027695F396} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {48DE251A-3482-4934-BC26-F99D2235AC9F} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C892CD81-50AE-49E5-BF44-A0C28A1614CC} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {90E88EAC-4291-4406-8D88-EFDF61B11292} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {84868710-ECBB-4025-900A-EEB99EC49534} = {90E88EAC-4291-4406-8D88-EFDF61B11292} - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {4A9043FD-24A3-4A4A-956B-9CB71876F415} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {D3BAA44E-8395-4E8A-AA96-6B463356C537} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {5BE18D72-0D02-4854-966E-745CE5DAF77F} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {06D34108-01BA-4C77-A704-4DD9E6F7E32C} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A98C939C-9F48-414A-A2D3-853BE4447397} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {FBE91498-D83B-4873-A67E-0FB9D1C366F0} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {6FFC14FE-F659-4B23-9746-4B767CE520D2} = {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} - {6084D52D-775B-4A39-8CD5-AA2F362B5A61} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {34BB9810-2983-4E55-A96A-132D32310145} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {8EF31071-3521-409D-9740-BBFBFC04C50E} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {13219C1C-23E1-4EBA-93FB-86830C93A800} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {A320E23E-792D-4736-B963-381F9D7AF605} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {60D0BEF2-FEAF-4066-8377-6C873CB24858} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {340BE5AC-68EC-41A5-9D0D-266037C58F13} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{C5CAD011-DF84-4914-939C-0C029DCEF26F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{672E1170-7B18-474B-85C7-1961BF2A48AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "modules\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{77BDEF2B-1A30-4E64-BC35-0DFC21091327}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{573B7B0E-3065-42DE-A391-EE026CE7A366}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{68ADC230-B563-4948-BBF1-2112DFE93BC1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain.Shared", "modules\apigateway\LINGYUN.ApiGateway.Domain.Shared\LINGYUN.ApiGateway.Domain.Shared.csproj", "{40E217A9-46EA-48DE-BE0B-6CC824240E97}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain", "modules\apigateway\LINGYUN.ApiGateway.Domain\LINGYUN.ApiGateway.Domain.csproj", "{1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application.Contracts", "modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj", "{269FF49F-97A3-4502-B424-D8CD55FC5727}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application", "modules\apigateway\LINGYUN.ApiGateway.Application\LINGYUN.ApiGateway.Application.csproj", "{87049236-4808-4C33-88BA-D3CA6BB1F786}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.EntityFrameworkCore", "modules\apigateway\LINGYUN.ApiGateway.EntityFrameworkCore\LINGYUN.ApiGateway.EntityFrameworkCore.csproj", "{3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Client", "modules\apigateway\LINGYUN.ApiGateway.HttpApi.Client\LINGYUN.ApiGateway.HttpApi.Client.csproj", "{089BE2D2-D579-47DA-B135-449C1153F27E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi", "modules\apigateway\LINGYUN.ApiGateway.HttpApi\LINGYUN.ApiGateway.HttpApi.csproj", "{D137106D-DCD5-455B-A297-44831DF38EE8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{19E6BD61-062B-4FAD-A51A-B55F5CE88B7A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{E2408063-FB1F-4513-B4A7-1FE50667C6E8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Host", "services\apigateway\LINGYUN.ApiGateway.Host\LINGYUN.ApiGateway.Host.csproj", "{7DF65FB1-AFA3-4D50-83D6-A37318296E6D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Host", "services\apigateway\LINGYUN.ApiGateway.HttpApi.Host\LINGYUN.ApiGateway.HttpApi.Host.csproj", "{9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthServer.Host", "services\account\AuthServer.Host\AuthServer.Host.csproj", "{C1F56ED5-E898-45F1-97B5-61F4AB30FB58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{0439B173-F41E-4CE0-A44A-CCB70328F272}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application.Contracts", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj", "{3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{A584D040-95AC-4422-93FF-7B80532213F0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{76249548-4344-4CD0-A0AC-12AC54184B58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenants", "tenants", "{A5543E56-DA53-494D-A531-DA75091D46FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application.Contracts", "modules\tenants\LINGYUN.Abp.TenantManagement.Application.Contracts\LINGYUN.Abp.TenantManagement.Application.Contracts.csproj", "{FF4A3402-8DE2-4494-8F2B-614356DA72EA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application", "modules\tenants\LINGYUN.Abp.TenantManagement.Application\LINGYUN.Abp.TenantManagement.Application.csproj", "{EAE87281-4C33-4E8B-A489-480C55BA9E89}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi\LINGYUN.Abp.TenantManagement.HttpApi.csproj", "{51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{E5D1B78A-1A8F-4D52-BF99-A4A863ADE898}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackendAdmin.HttpApi.Host", "services\admin\LINGYUN.Abp.BackendAdmin.HttpApi.Host\LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj", "{85090598-6B03-43D3-BE61-1E9777252D50}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{8AC72641-30D3-4ACF-89FA-808FADC55C2E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EventBus.CAP", "modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{AEC1E6D3-DC23-41BD-B456-3AAD26E34978}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{9E72FEB9-A626-4312-892B-CDD043879758}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application.Contracts", "modules\account\LINGYUN.Abp.Account.Application.Contracts\LINGYUN.Abp.Account.Application.Contracts.csproj", "{8B09385A-719C-4B83-B61E-0ECD5D2734BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{8E569C1C-2637-4D89-804C-50FBC83948FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "modules\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{FF1839EA-FB6B-4ED5-9804-E40427046D35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location", "modules\common\LINGYUN.Abp.Location\LINGYUN.Abp.Location.csproj", "{9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu", "modules\common\LINGYUN.Abp.Location.Baidu\LINGYUN.Abp.Location.Baidu.csproj", "{6E4A0D87-C3CE-430F-A475-A6B68C116D96}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{A5851F0F-CB0D-4E29-A829-D1BDEADB807B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{FDEECE0D-6F66-4053-948E-9AC021B97C8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\common\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{B9FA1A02-A2BF-480D-914E-0780DAE442FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{59619184-02E7-4C61-8F96-89320CD7A3AE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{865A2AE3-864B-4425-8FA6-AFD62F6466DB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock", "modules\common\LINGYUN.Abp.DistributedLock\LINGYUN.Abp.DistributedLock.csproj", "{35A23613-85BA-4E1B-835C-DB33AB4A2751}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock.Redis", "modules\common\LINGYUN.Abp.DistributedLock.Redis\LINGYUN.Abp.DistributedLock.Redis.csproj", "{F6776BF7-5F73-4224-8915-C017F4EEDD28}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{371B293B-0CA9-4385-8EBB-5224332066D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Host", "services\messages\LINGYUN.Abp.MessageService.HttpApi.Host\LINGYUN.Abp.MessageService.HttpApi.Host.csproj", "{0D1DB712-B48D-4FB7-9A47-694C668A62E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{9E12ADBF-713B-4FE7-B71F-52B5078A57CE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.MySql", "modules\common\LINGYUN.Abp.Hangfire.MySqlStorage\LINGYUN.Abp.Hangfire.Storage.MySql.csproj", "{47CC8F7A-681D-42B9-AE04-78453782C1B6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.SqlServer", "modules\common\LINGYUN.Abp.Hangfire.Storage.SqlServer\LINGYUN.Abp.Hangfire.Storage.SqlServer.csproj", "{F595CB9F-B117-4D62-A1AE-48599927DB36}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs.Hangfire", "modules\common\LINGYUN.Abp.BackgroundJobs.Hangfire\LINGYUN.Abp.BackgroundJobs.Hangfire.csproj", "{5CF403B2-47C9-4E4E-8856-0294BDD64884}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun", "modules\common\LINGYUN.Abp.BlobStoring.Aliyun\LINGYUN.Abp.BlobStoring.Aliyun.csproj", "{059473BA-FAF9-405F-9985-33DDCA2E9F0D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun.Tests", "tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests.csproj", "{C8A00439-5B8D-4923-8FAA-AB75E2A786ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{31B03DCB-ED12-4412-867A-61E347D40D8C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{AB984240-EF03-416F-A9B2-F5CF169E04B7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Client", "modules\message\LINGYUN.Abp.MessageService.HttpApi.Client\LINGYUN.Abp.MessageService.HttpApi.Client.csproj", "{EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "modules\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{65DDA934-B76B-4018-A565-CF6CEF0D6BB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\common\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{0F14C850-7F4C-4791-9C6C-7E56F985C71D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{376D8343-DF83-41D2-BF6E-2F5DC8DBF259}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing.Tests", "tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests.csproj", "{6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi.Client", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi.Client\LINGYUN.Abp.TenantManagement.HttpApi.Client.csproj", "{87C7DDCF-F80D-4A15-9044-71552DCB5550}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.RemoteService", "modules\tenants\LINGYUN.Abp.MultiTenancy.RemoteService\LINGYUN.Abp.MultiTenancy.RemoteService.csproj", "{7208C9AB-AB76-43E7-95FA-A0E463E82A3C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.DbFinder", "modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj", "{9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy", "modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj", "{A2B4ECAE-DABE-40F7-9335-496A79EDE671}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent", "modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj", "{1DA91161-8757-4A68-A0A1-8C94C36C9240}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F4923692-D343-4318-AECA-96F580B1A563}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{F135B9E8-3FFE-44E9-835B-7B6A928F4823}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{75A6D078-C19D-4030-88CC-C2A8608FF604}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{2D895594-3FF5-4507-853A-CB65F2DB72ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{0655A0FB-59E8-4A9F-BAF5-47A89377F747}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{F4615BCE-D5C1-407A-8681-8EEE92DEF9D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFrameworkCore.Tests", "tests\LINGYUN.Abp.EntityFrameworkCore.Tests\LINGYUN.Abp.EntityFrameworkCore.Tests.csproj", "{F3D9B137-32DE-4018-8058-78AB17FCDF9C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}" + ProjectSection(SolutionItems) = preProject + modules\oss-management\README.md = modules\oss-management\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{86A67B8C-EFA0-4103-B60F-312F07C15A7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi.Host", "services\platform\LINGYUN.Platform.HttpApi.Host\LINGYUN.Platform.HttpApi.Host.csproj", "{372123C3-3AFD-42C8-BB80-778322EA72C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{F359AAA1-C854-444A-88F2-1C0D8A07F864}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{5D0ED1FC-3A7C-4531-9512-832E73AD9555}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{2BF7FB73-0C62-4ECF-99F0-0583855D2777}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{6FE7E243-2D99-4567-8786-6C9283D608EF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{685188AC-A145-4A27-BF5F-9C970A59AA9C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer4.HttpApi.Host", "services\identity-server\LINGYUN.Abp.IdentityServer4.HttpApi.Host\LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj", "{F85552D4-D22E-483A-B1F8-3DFB840F6F7C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Settings", "modules\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj", "{6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests.csproj", "{F12F4645-C0FE-4129-8C71-65B4039DC445}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Tests\LINGYUN.Abp.Features.LimitValidation.Tests.csproj", "{C457FA70-8732-44B8-A018-C96D14025D4B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "features", "features", "{08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{7071E78B-755B-410A-830B-AA05D7168944}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "modules\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{87B65CBD-0FF4-4FB5-9ABC-161911A71179}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application.Contracts", "modules\auditing\LINGYUN.Abp.Auditing.Application.Contracts\LINGYUN.Abp.Auditing.Application.Contracts.csproj", "{F40F88F1-CA90-4A79-B772-80E287E25982}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{AC3C8985-73C2-472A-8E76-A0B8786FEC3F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permission-management", "permission-management", "{CC362C67-6FC1-42B3-A130-8120AA8D790C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain\LINGYUN.Abp.PermissionManagement.Domain.csproj", "{B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.Identity", "modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj", "{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{A66D48C9-F141-4111-9169-CEB64AFFF61D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{524276E1-053D-4191-ABF7-4CDA01BFFBC3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json", "modules\common\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json.csproj", "{43083268-74DE-4C68-824A-FB0CEC77358D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{BAE74ABC-1096-495F-A624-BEBFBC1896F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{E92A1CAA-5758-41EF-B67E-C0D394E85417}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{F18DE651-A3E4-478F-A2B5-686429729EB8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "modules\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{42309C06-C0F2-490F-931B-CF41FA1970FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "modules\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat\LINGYUN.Abp.IdentityServer.WeChat.csproj", "{7356FC4B-CAB2-4808-8C97-9AF74583F3A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-aliyun", "cloud-aliyun", "{14CDBAD1-10C8-464A-B445-1F727C988010}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-tencent", "cloud-tencent", "{3B96F4D8-4993-419B-BCEB-AFE4ED39449F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "modules\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{97B4A37E-B93E-48C9-95D5-689CB9495D8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Sms", "modules\common\LINGYUN.Abp.Notifications.Sms\LINGYUN.Abp.Notifications.Sms.csproj", "{8C3312E7-F51E-4780-A893-CE0E0B80B579}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{B86EBB6F-A27F-4277-8265-937951A9DCB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Aliyun", "modules\oss-management\LINGYUN.Abp.OssManagement.Aliyun\LINGYUN.Abp.OssManagement.Aliyun.csproj", "{35B17218-9FB6-439E-AF73-9A1454BC923C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{D5036D3F-1C53-47EE-BA50-AD290AE062D7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem.ImageSharp", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj", "{3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{BD74BE00-54E4-4979-8797-E8027695F396}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{48DE251A-3482-4934-BC26-F99D2235AC9F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent.Tests", "tests\LINGYUN.Abp.Location.Tencent.Tests\LINGYUN.Abp.Location.Tencent.Tests.csproj", "{94B47385-E47F-4FD7-A3A9-A7AA122EFC93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu.Tests", "tests\LINGYUN.Abp.Location.Baidu.Tests\LINGYUN.Abp.Location.Baidu.Tests.csproj", "{C892CD81-50AE-49E5-BF44-A0C28A1614CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Client", "modules\common\LINGYUN.Abp.AspNetCore.Mvc.Client\LINGYUN.Abp.AspNetCore.Mvc.Client.csproj", "{EEF03CC6-1013-4AAF-BEED-BB4BA5021039}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{90E88EAC-4291-4406-8D88-EFDF61B11292}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml", "modules\localization\LINGYUN.Abp.Localization.Xml\LINGYUN.Abp.Localization.Xml.csproj", "{84868710-ECBB-4025-900A-EEB99EC49534}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml.Tests", "tests\LINGYUN.Abp.Localization.Xml.Tests\LINGYUN.Abp.Localization.Xml.Tests.csproj", "{A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Dynamic", "modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj", "{4A9043FD-24A3-4A4A-956B-9CB71876F415}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{D3BAA44E-8395-4E8A-AA96-6B463356C537}" + ProjectSection(SolutionItems) = preProject + modules\lt\README.md = modules\lt\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{5BE18D72-0D02-4854-966E-745CE5DAF77F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{06D34108-01BA-4C77-A704-4DD9E6F7E32C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{A98C939C-9F48-414A-A2D3-853BE4447397}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\lt\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{FBE91498-D83B-4873-A67E-0FB9D1C366F0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi.Host", "services\localization\LINGYUN.Abp.LocalizationManagement.HttpApi.Host\LINGYUN.Abp.LocalizationManagement.HttpApi.Host.csproj", "{6FFC14FE-F659-4B23-9746-4B767CE520D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rules", "rules", "{6084D52D-775B-4A39-8CD5-AA2F362B5A61}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules", "modules\rules\LINGYUN.Abp.Rules\LINGYUN.Abp.Rules.csproj", "{D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.NRules", "modules\rules\LINGYUN.Abp.Rules.NRules\LINGYUN.Abp.Rules.NRules.csproj", "{34BB9810-2983-4E55-A96A-132D32310145}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine", "modules\rules\LINGYUN.Abp.Rules.RulesEngine\LINGYUN.Abp.Rules.RulesEngine.csproj", "{4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine.Tests", "tests\LINGYUN.Abp.Rules.RulesEngine.Tests\LINGYUN.Abp.Rules.RulesEngine.Tests.csproj", "{8EF31071-3521-409D-9740-BBFBFC04C50E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "modules\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{13219C1C-23E1-4EBA-93FB-86830C93A800}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundWorkers.Hangfire", "modules\common\LINGYUN.Abp.BackgroundWorkers.Hangfire\LINGYUN.Abp.BackgroundWorkers.Hangfire.csproj", "{60D0BEF2-FEAF-4066-8377-6C873CB24858}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Dashboard", "modules\common\LINGYUN.Abp.Hangfire.Dashboard\LINGYUN.Abp.Hangfire.Dashboard.csproj", "{340BE5AC-68EC-41A5-9D0D-266037C58F13}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.Build.0 = Release|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.Build.0 = Debug|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.ActiveCfg = Release|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.Build.0 = Release|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.Build.0 = Release|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.Build.0 = Release|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.Build.0 = Release|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.Build.0 = Debug|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.ActiveCfg = Release|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.Build.0 = Release|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.Build.0 = Release|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.Build.0 = Release|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.Build.0 = Release|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.Build.0 = Release|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.Build.0 = Release|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.Build.0 = Release|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.Build.0 = Release|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.Build.0 = Release|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.Build.0 = Release|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.Build.0 = Release|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.Build.0 = Release|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.Build.0 = Release|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.Build.0 = Release|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.Build.0 = Release|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.Build.0 = Release|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.Build.0 = Release|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.Build.0 = Release|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.Build.0 = Release|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.Build.0 = Release|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.Build.0 = Release|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.Build.0 = Release|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.Build.0 = Release|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.Build.0 = Release|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.Build.0 = Release|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.Build.0 = Release|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.Build.0 = Release|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.Build.0 = Release|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.Build.0 = Release|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.Build.0 = Release|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.Build.0 = Release|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.Build.0 = Release|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.Build.0 = Release|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.Build.0 = Release|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.Build.0 = Release|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.Build.0 = Release|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.Build.0 = Release|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.Build.0 = Release|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.Build.0 = Release|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.Build.0 = Release|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.Build.0 = Release|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.Build.0 = Release|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.Build.0 = Release|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.Build.0 = Release|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.Build.0 = Release|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.Build.0 = Release|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.Build.0 = Release|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.Build.0 = Release|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.Build.0 = Release|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.Build.0 = Release|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.Build.0 = Release|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.Build.0 = Release|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.Build.0 = Release|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.Build.0 = Release|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.Build.0 = Release|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.Build.0 = Release|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.Build.0 = Release|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.Build.0 = Release|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.Build.0 = Release|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.Build.0 = Release|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.Build.0 = Release|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.Build.0 = Release|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.Build.0 = Release|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.Build.0 = Release|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.Build.0 = Release|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.Build.0 = Release|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.Build.0 = Release|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.Build.0 = Release|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.Build.0 = Release|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.Build.0 = Release|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.Build.0 = Release|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.Build.0 = Release|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.Build.0 = Release|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.Build.0 = Release|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.Build.0 = Release|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.Build.0 = Release|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.Build.0 = Release|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.Build.0 = Release|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.Build.0 = Release|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.Build.0 = Release|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.Build.0 = Release|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.Build.0 = Release|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.Build.0 = Release|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.Build.0 = Release|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.Build.0 = Release|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.Build.0 = Release|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.Build.0 = Release|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.Build.0 = Release|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.Build.0 = Release|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.Build.0 = Release|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.Build.0 = Release|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.Build.0 = Release|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.Build.0 = Release|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.Build.0 = Release|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.Build.0 = Release|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.Build.0 = Release|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.Build.0 = Release|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.Build.0 = Release|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.Build.0 = Release|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.Build.0 = Release|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.Build.0 = Release|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.Build.0 = Release|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.Build.0 = Release|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.Build.0 = Release|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.Build.0 = Release|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.Build.0 = Release|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.Build.0 = Release|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.Build.0 = Release|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.Build.0 = Release|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.Build.0 = Release|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.Build.0 = Release|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.Build.0 = Release|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.Build.0 = Release|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.Build.0 = Release|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.Build.0 = Release|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.Build.0 = Release|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.Build.0 = Release|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.Build.0 = Release|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.Build.0 = Release|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.Build.0 = Release|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.Build.0 = Release|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.Build.0 = Release|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.Build.0 = Release|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.Build.0 = Release|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {77BDEF2B-1A30-4E64-BC35-0DFC21091327} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {573B7B0E-3065-42DE-A391-EE026CE7A366} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {68ADC230-B563-4948-BBF1-2112DFE93BC1} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {40E217A9-46EA-48DE-BE0B-6CC824240E97} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {269FF49F-97A3-4502-B424-D8CD55FC5727} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {87049236-4808-4C33-88BA-D3CA6BB1F786} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {089BE2D2-D579-47DA-B135-449C1153F27E} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {D137106D-DCD5-455B-A297-44831DF38EE8} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {E2408063-FB1F-4513-B4A7-1FE50667C6E8} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58} = {685188AC-A145-4A27-BF5F-9C970A59AA9C} + {0439B173-F41E-4CE0-A44A-CCB70328F272} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {A584D040-95AC-4422-93FF-7B80532213F0} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {76249548-4344-4CD0-A0AC-12AC54184B58} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {A5543E56-DA53-494D-A531-DA75091D46FF} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {FF4A3402-8DE2-4494-8F2B-614356DA72EA} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {EAE87281-4C33-4E8B-A489-480C55BA9E89} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {85090598-6B03-43D3-BE61-1E9777252D50} = {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} + {8AC72641-30D3-4ACF-89FA-808FADC55C2E} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {9E72FEB9-A626-4312-892B-CDD043879758} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {8B09385A-719C-4B83-B61E-0ECD5D2734BD} = {9E72FEB9-A626-4312-892B-CDD043879758} + {8E569C1C-2637-4D89-804C-50FBC83948FB} = {9E72FEB9-A626-4312-892B-CDD043879758} + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D} = {9E72FEB9-A626-4312-892B-CDD043879758} + {FF1839EA-FB6B-4ED5-9804-E40427046D35} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {6E4A0D87-C3CE-430F-A475-A6B68C116D96} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {FDEECE0D-6F66-4053-948E-9AC021B97C8D} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {B9FA1A02-A2BF-480D-914E-0780DAE442FC} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {59619184-02E7-4C61-8F96-89320CD7A3AE} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {865A2AE3-864B-4425-8FA6-AFD62F6466DB} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {35A23613-85BA-4E1B-835C-DB33AB4A2751} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F6776BF7-5F73-4224-8915-C017F4EEDD28} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {371B293B-0CA9-4385-8EBB-5224332066D2} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {0D1DB712-B48D-4FB7-9A47-694C668A62E3} = {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {47CC8F7A-681D-42B9-AE04-78453782C1B6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F595CB9F-B117-4D62-A1AE-48599927DB36} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {5CF403B2-47C9-4E4E-8856-0294BDD64884} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {059473BA-FAF9-405F-9985-33DDCA2E9F0D} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {31B03DCB-ED12-4412-867A-61E347D40D8C} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {AB984240-EF03-416F-A9B2-F5CF169E04B7} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {0F14C850-7F4C-4791-9C6C-7E56F985C71D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {87C7DDCF-F80D-4A15-9044-71552DCB5550} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {A2B4ECAE-DABE-40F7-9335-496A79EDE671} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {1DA91161-8757-4A68-A0A1-8C94C36C9240} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F4923692-D343-4318-AECA-96F580B1A563} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F135B9E8-3FFE-44E9-835B-7B6A928F4823} = {F4923692-D343-4318-AECA-96F580B1A563} + {75A6D078-C19D-4030-88CC-C2A8608FF604} = {F4923692-D343-4318-AECA-96F580B1A563} + {2D895594-3FF5-4507-853A-CB65F2DB72ED} = {F4923692-D343-4318-AECA-96F580B1A563} + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93} = {F4923692-D343-4318-AECA-96F580B1A563} + {0655A0FB-59E8-4A9F-BAF5-47A89377F747} = {F4923692-D343-4318-AECA-96F580B1A563} + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE} = {F4923692-D343-4318-AECA-96F580B1A563} + {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {F3D9B137-32DE-4018-8058-78AB17FCDF9C} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {52B5D4F7-237B-4E0A-A167-68442164F70A} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F19C8B0F-A332-4190-9ABE-95790E0AE864} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {86A67B8C-EFA0-4103-B60F-312F07C15A7A} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {372123C3-3AFD-42C8-BB80-778322EA72C3} = {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} + {F359AAA1-C854-444A-88F2-1C0D8A07F864} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {5D0ED1FC-3A7C-4531-9512-832E73AD9555} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {2BF7FB73-0C62-4ECF-99F0-0583855D2777} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {6FE7E243-2D99-4567-8786-6C9283D608EF} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {685188AC-A145-4A27-BF5F-9C970A59AA9C} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C} = {E2408063-FB1F-4513-B4A7-1FE50667C6E8} + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F12F4645-C0FE-4129-8C71-65B4039DC445} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C457FA70-8732-44B8-A018-C96D14025D4B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {7071E78B-755B-410A-830B-AA05D7168944} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} + {87B65CBD-0FF4-4FB5-9ABC-161911A71179} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} + {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F40F88F1-CA90-4A79-B772-80E287E25982} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {CC362C67-6FC1-42B3-A130-8120AA8D790C} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727} = {CC362C67-6FC1-42B3-A130-8120AA8D790C} + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {A66D48C9-F141-4111-9169-CEB64AFFF61D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {524276E1-053D-4191-ABF7-4CDA01BFFBC3} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {43083268-74DE-4C68-824A-FB0CEC77358D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {BAE74ABC-1096-495F-A624-BEBFBC1896F2} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {E92A1CAA-5758-41EF-B67E-C0D394E85417} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {F18DE651-A3E4-478F-A2B5-686429729EB8} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {42309C06-C0F2-490F-931B-CF41FA1970FF} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {14CDBAD1-10C8-464A-B445-1F727C988010} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {97B4A37E-B93E-48C9-95D5-689CB9495D8B} = {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} + {8C3312E7-F51E-4780-A893-CE0E0B80B579} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {B86EBB6F-A27F-4277-8265-937951A9DCB0} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {35B17218-9FB6-439E-AF73-9A1454BC923C} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {D5036D3F-1C53-47EE-BA50-AD290AE062D7} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {BD74BE00-54E4-4979-8797-E8027695F396} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {48DE251A-3482-4934-BC26-F99D2235AC9F} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C892CD81-50AE-49E5-BF44-A0C28A1614CC} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {90E88EAC-4291-4406-8D88-EFDF61B11292} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {84868710-ECBB-4025-900A-EEB99EC49534} = {90E88EAC-4291-4406-8D88-EFDF61B11292} + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {4A9043FD-24A3-4A4A-956B-9CB71876F415} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {D3BAA44E-8395-4E8A-AA96-6B463356C537} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {5BE18D72-0D02-4854-966E-745CE5DAF77F} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {06D34108-01BA-4C77-A704-4DD9E6F7E32C} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A98C939C-9F48-414A-A2D3-853BE4447397} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {FBE91498-D83B-4873-A67E-0FB9D1C366F0} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {6FFC14FE-F659-4B23-9746-4B767CE520D2} = {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} + {6084D52D-775B-4A39-8CD5-AA2F362B5A61} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {34BB9810-2983-4E55-A96A-132D32310145} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {8EF31071-3521-409D-9740-BBFBFC04C50E} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {13219C1C-23E1-4EBA-93FB-86830C93A800} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {60D0BEF2-FEAF-4066-8377-6C873CB24858} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {340BE5AC-68EC-41A5-9D0D-266037C58F13} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} + EndGlobalSection +EndGlobal diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs index 769be79bc..e0e0482bb 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs @@ -1,19 +1,19 @@ -namespace LINGYUN.Abp.IM.SignalR -{ - public class AbpIMSignalROptions - { - /// - /// 自定义的客户端接收消息方法名称 - /// - public string GetChatMessageMethod { get; set; } - /// - /// 用户上线接收方法名称 - /// - public string UserOnlineMethod { get; set; } - public AbpIMSignalROptions() - { - GetChatMessageMethod = "getChatMessage"; - UserOnlineMethod = "onUserOnlined"; - } - } -} +namespace LINGYUN.Abp.IM.SignalR +{ + public class AbpIMSignalROptions + { + /// + /// 自定义的客户端接收消息方法名称 + /// + public string GetChatMessageMethod { get; set; } + /// + /// 用户上线接收方法名称 + /// + public string UserOnlineMethod { get; set; } + public AbpIMSignalROptions() + { + GetChatMessageMethod = "get-chat-message"; + UserOnlineMethod = "on-user-onlined"; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs index 9b9b9eb34..1b51b2f91 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs @@ -1,124 +1,139 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.RealTime.Client; -using LINGYUN.Abp.RealTime.SignalR; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using System; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.SignalR.Hubs -{ - [Authorize] - public class MessagesHub : OnlineClientHubBase - { - protected AbpIMSignalROptions Options { get; } - protected IFriendStore FriendStore { get; } - protected IMessageStore MessageStore { get; } - protected IUserGroupStore UserGroupStore { get; } - - public MessagesHub( - IFriendStore friendStore, - IMessageStore messageStore, - IUserGroupStore userGroupStore, - IOptions options) - { - FriendStore = friendStore; - MessageStore = messageStore; - UserGroupStore = userGroupStore; - Options = options.Value; - } - - protected override async Task OnClientConnectedAsync(IOnlineClient client) - { - await base.OnClientConnectedAsync(client); - // 加入通讯组 - var userGroups = await UserGroupStore.GetUserGroupsAsync(client.TenantId, client.UserId.Value); - foreach (var group in userGroups) - { - await Groups.AddToGroupAsync(client.ConnectionId, group.Name); - var groupClient = Clients.Group(group.Name); - if (groupClient != null) - { - // 发送用户上线通知 - await groupClient.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); - } - } - - // 发送好友上线通知 - var userFriends = await FriendStore.GetListAsync(client.TenantId, client.UserId.Value); - if (userFriends.Count > 0) - { - var friendClientIds = userFriends.Select(friend => friend.FriendId.ToString()).ToImmutableArray(); - var userClients = Clients.Users(friendClientIds); - if (userClients != null) - { - await userClients.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); - } - } - } - /// - /// 客户端调用发送消息方法 - /// - /// - /// - [HubMethodName("SendMessage")] - public virtual async Task SendMessageAsync(ChatMessage chatMessage) - { - // 持久化 - await MessageStore.StoreMessageAsync(chatMessage, cancellationToken: Context.ConnectionAborted); - - if (!chatMessage.GroupId.IsNullOrWhiteSpace()) - { - await SendMessageToGroupAsync(chatMessage); - } - else - { - await SendMessageToUserAsync(chatMessage); - } - } - - protected virtual async Task SendMessageToGroupAsync(ChatMessage chatMessage) - { - var signalRClient = Clients.Group(chatMessage.GroupId); - if (signalRClient == null) - { - Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); - return; - } - - await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); - } - - protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) - { - var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); - var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); - - foreach (var onlineClient in onlineClients) - { - try - { - var signalRClient = Clients.Client(onlineClient.ConnectionId); - if (signalRClient == null) - { - Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " with connectionId " + onlineClient.ConnectionId + " from SignalR hub!"); - continue; - } - await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); - } - catch (Exception ex) - { - // 发送异常记录就行了,因为消息已经持久化 - Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); - Logger.LogWarning("Send to user message error: {0}", ex.Message); - } - } - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.RealTime.Client; +using LINGYUN.Abp.RealTime.SignalR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.SignalR.Hubs +{ + [Authorize] + public class MessagesHub : OnlineClientHubBase + { + protected IMessageProcessor Processor => LazyServiceProvider.LazyGetRequiredService(); + + protected AbpIMSignalROptions Options { get; } + protected IFriendStore FriendStore { get; } + protected IMessageStore MessageStore { get; } + protected IUserGroupStore UserGroupStore { get; } + + public MessagesHub( + IFriendStore friendStore, + IMessageStore messageStore, + IUserGroupStore userGroupStore, + IOptions options) + { + FriendStore = friendStore; + MessageStore = messageStore; + UserGroupStore = userGroupStore; + Options = options.Value; + } + + protected override async Task OnClientConnectedAsync(IOnlineClient client) + { + await base.OnClientConnectedAsync(client); + // 加入通讯组 + var userGroups = await UserGroupStore.GetUserGroupsAsync(client.TenantId, client.UserId.Value); + foreach (var group in userGroups) + { + await Groups.AddToGroupAsync(client.ConnectionId, group.Name); + var groupClient = Clients.Group(group.Name); + if (groupClient != null) + { + // 发送用户上线通知 + await groupClient.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); + } + } + + // 发送好友上线通知 + var userFriends = await FriendStore.GetListAsync(client.TenantId, client.UserId.Value); + if (userFriends.Count > 0) + { + var friendClientIds = userFriends.Select(friend => friend.FriendId.ToString()).ToImmutableArray(); + var userClients = Clients.Users(friendClientIds); + if (userClients != null) + { + await userClients.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); + } + } + } + /// + /// 客户端调用发送消息方法 + /// + /// + /// + // [HubMethodName("SendMessage")] + [HubMethodName("send")] + public virtual async Task SendAsync(ChatMessage chatMessage) + { + // 持久化 + await MessageStore.StoreMessageAsync(chatMessage, cancellationToken: Context.ConnectionAborted); + + if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + { + await SendMessageToGroupAsync(chatMessage); + } + else + { + await SendMessageToUserAsync(chatMessage); + } + } + + [HubMethodName("recall")] + public virtual async Task ReCallAsync(ChatMessage chatMessage) + { + await Processor.ReCallAsync(chatMessage); + } + + [HubMethodName("read")] + public virtual async Task ReadAsync(ChatMessage chatMessage) + { + await Processor.ReadAsync(chatMessage); + } + + protected virtual async Task SendMessageToGroupAsync(ChatMessage chatMessage) + { + var signalRClient = Clients.Group(chatMessage.GroupId); + if (signalRClient == null) + { + Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); + return; + } + + await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); + } + + protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) + { + var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); + var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); + + foreach (var onlineClient in onlineClients) + { + try + { + var signalRClient = Clients.Client(onlineClient.ConnectionId); + if (signalRClient == null) + { + Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " with connectionId " + onlineClient.ConnectionId + " from SignalR hub!"); + continue; + } + await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); + } + catch (Exception ex) + { + // 发送异常记录就行了,因为消息已经持久化 + Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); + Logger.LogWarning("Send to user message error: {0}", ex.Message); + } + } + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs index 237a9a486..fada32ad7 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs @@ -1,161 +1,157 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Contract -{ - public interface IFriendStore - { - /// - /// 是否是好友关系 - /// - /// - /// - /// - /// - Task IsFriendAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default - ); - /// - /// 查询好友列表 - /// - /// - /// - /// - /// - /// - Task> GetListAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ); - /// - /// 获取好友数量 - /// - /// - /// - /// - /// - Task GetCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - CancellationToken cancellationToken = default); - /// - /// 获取好友列表 - /// - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetPagedListAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取最近联系好友列表 - /// - /// - /// - /// - /// - /// - Task> GetLastContactListAsync( - Guid? tenantId, - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取好友信息 - /// - /// - /// - /// - /// - Task GetMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 添加好友 - /// - /// - /// - /// - /// - Task AddMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - CancellationToken cancellationToken = default); - /// - /// 添加好友请求 - /// - /// - /// - /// - /// - /// - Task AddRequestAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - string description = "", - CancellationToken cancellationToken = default); - /// - /// 移除好友 - /// - /// - /// - /// - /// - Task RemoveMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 添加黑名单 - /// - /// - /// - /// - /// - Task AddShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 移除黑名单 - /// - /// - /// - /// - /// - Task RemoveShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Contract +{ + public interface IFriendStore + { + /// + /// 是否是好友关系 + /// + /// + /// + /// + /// + Task IsFriendAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default + ); + /// + /// 查询好友列表 + /// + /// + /// + /// + /// + Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ); + /// + /// 获取好友数量 + /// + /// + /// + /// + /// + Task GetCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + CancellationToken cancellationToken = default); + /// + /// 获取好友列表 + /// + /// + /// + /// + /// + /// + /// + /// + Task> GetPagedListAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(UserFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取最近联系好友列表 + /// + /// + /// + /// + /// + /// + Task> GetLastContactListAsync( + Guid? tenantId, + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取好友信息 + /// + /// + /// + /// + /// + Task GetMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 添加好友 + /// + /// + /// + /// + /// + Task AddMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + CancellationToken cancellationToken = default); + /// + /// 添加好友请求 + /// + /// + /// + /// + /// + /// + Task AddRequestAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + string description = "", + CancellationToken cancellationToken = default); + /// + /// 移除好友 + /// + /// + /// + /// + /// + Task RemoveMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 添加黑名单 + /// + /// + /// + /// + /// + Task AddShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 移除黑名单 + /// + /// + /// + /// + /// + Task RemoveShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs index ea7212f7f..0cd6f9058 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs @@ -1,108 +1,106 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Group -{ - public interface IUserGroupStore - { - /// - /// 成员是否在群组 - /// - /// - /// - /// - /// - Task MemberHasInGroupAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组用户身份 - /// - /// - /// - /// - /// - Task GetUserGroupCardAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取用户所在通讯组列表 - /// - /// - /// - /// - Task> GetUserGroupsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员列表 - /// - /// - /// - /// - Task> GetMembersAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员数 - /// - /// - /// - /// - Task GetMembersCountAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取通讯组用户 - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetMembersAsync( - Guid? tenantId, - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 用户加入通讯组 - /// - /// - /// - /// - /// - Task AddUserToGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - Guid acceptUserId, - CancellationToken cancellationToken = default); - /// - /// 用户退出通讯组 - /// - /// - /// - /// - /// - Task RemoveUserFormGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Group +{ + public interface IUserGroupStore + { + /// + /// 成员是否在群组 + /// + /// + /// + /// + /// + Task MemberHasInGroupAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组用户身份 + /// + /// + /// + /// + /// + Task GetUserGroupCardAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取用户所在通讯组列表 + /// + /// + /// + /// + Task> GetUserGroupsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员列表 + /// + /// + /// + /// + Task> GetMembersAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员数 + /// + /// + /// + /// + Task GetMembersCountAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取通讯组用户 + /// + /// + /// + /// + /// + /// + /// + Task> GetMembersAsync( + Guid? tenantId, + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 用户加入通讯组 + /// + /// + /// + /// + /// + Task AddUserToGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + Guid acceptUserId, + CancellationToken cancellationToken = default); + /// + /// 用户退出通讯组 + /// + /// + /// + /// + /// + Task RemoveUserFormGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs index cdbe9834c..0e82b9103 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs @@ -1,60 +1,58 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM -{ - /// - /// IM用户资料查找接口 - /// - public interface IUserCardFinder - { - /// - /// 查询IM用户数量 - /// - /// - /// 用户名称 - /// 起止年龄 - /// 起止年龄 - /// 性别 - /// - Task GetCountAsync( - Guid? tenantId, - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null); - /// - /// 查询IM用户列表 - /// - /// - /// 用户名称 - /// 起止年龄 - /// 起止年龄 - /// 性别 - /// 排序字段 - /// 是否倒序 - /// 起始记录位置 - /// 最大返回数量 - /// - Task> GetListAsync( - Guid? tenantId, - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - string sorting = nameof(UserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10); - /// - /// 获取IM用户信息 - /// - /// - /// - /// - Task GetMemberAsync( - Guid? tenantId, - Guid findUserId); - } -} +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM +{ + /// + /// IM用户资料查找接口 + /// + public interface IUserCardFinder + { + /// + /// 查询IM用户数量 + /// + /// + /// 用户名称 + /// 起止年龄 + /// 起止年龄 + /// 性别 + /// + Task GetCountAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null); + /// + /// 查询IM用户列表 + /// + /// + /// 用户名称 + /// 起止年龄 + /// 起止年龄 + /// 性别 + /// 排序字段 + /// 起始记录位置 + /// 最大返回数量 + /// + Task> GetListAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserCard.UserId), + int skipCount = 0, + int maxResultCount = 10); + /// + /// 获取IM用户信息 + /// + /// + /// + /// + Task GetMemberAsync( + Guid? tenantId, + Guid findUserId); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs index 0d01a38c1..7704eb3d9 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs @@ -2,6 +2,9 @@ namespace LINGYUN.Abp.IM.Messages { + /// + /// 消息拦截器 + /// public interface IMessageBlocker { Task InterceptAsync(ChatMessage message); diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs new file mode 100644 index 000000000..12f309078 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Messages +{ + /// + /// 消息处理器 + /// + public interface IMessageProcessor + { + /// + /// 撤回 + /// + /// + /// + Task ReCallAsync(ChatMessage message); + /// + /// 消息已读 + /// + /// + /// + Task ReadAsync(ChatMessage message); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs index 560548237..b6dae836c 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs @@ -1,108 +1,103 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Messages -{ - public interface IMessageStore - { - /// - /// 存储聊天记录 - /// - /// - /// - /// - /// - Task StoreMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default); - /// - /// 获取群组聊天记录总数 - /// - /// - /// - /// - /// - /// - Task GetGroupMessageCountAsync( - Guid? tenantId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - /// - /// 获取群组聊天记录 - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetGroupMessageAsync( - Guid? tenantId, - long groupId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取上一次通讯消息记录 - /// - /// - /// - /// - /// - /// - /// - Task> GetLastChatMessagesAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default - ); - /// - /// 获取与某个用户的聊天记录总数 - /// - /// - /// - /// - /// - /// - /// - Task GetChatMessageCountAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - /// - /// 获取与某个用户的聊天记录 - /// - /// - /// - /// - /// - Task> GetChatMessageAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Messages +{ + public interface IMessageStore + { + /// + /// 存储聊天记录 + /// + /// + /// + /// + /// + Task StoreMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default); + /// + /// 获取群组聊天记录总数 + /// + /// + /// + /// + /// + /// + Task GetGroupMessageCountAsync( + Guid? tenantId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + /// + /// 获取群组聊天记录 + /// + /// + /// + /// + /// + /// + /// + /// + /// + Task> GetGroupMessageAsync( + Guid? tenantId, + long groupId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取上一次通讯消息记录 + /// + /// + /// + /// + /// + /// + Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default + ); + /// + /// 获取与某个用户的聊天记录总数 + /// + /// + /// + /// + /// + /// + /// + Task GetChatMessageCountAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + /// + /// 获取与某个用户的聊天记录 + /// + /// + /// + /// + /// + Task> GetChatMessageAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs similarity index 75% rename from aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs rename to aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs index 3fbbfafe1..422347a87 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs @@ -1,25 +1,29 @@ -namespace LINGYUN.Abp.IM.Messages -{ - /// - /// 消息状态 - /// - public enum MessageSendState : sbyte - { - /// - /// 已发送 - /// - Send = 0, - /// - /// 撤回 - /// - ReCall = 10, - /// - /// 发送失败 - /// - Failed = 50, - /// - /// 退回 - /// - BackTo = 100 - } -} +namespace LINGYUN.Abp.IM.Messages +{ + /// + /// 消息状态 + /// + public enum MessageState : sbyte + { + /// + /// 已发送 + /// + Send = 0, + /// + /// 已读 + /// + Read = 1, + /// + /// 撤回 + /// + ReCall = 10, + /// + /// 发送失败 + /// + Failed = 50, + /// + /// 退回 + /// + BackTo = 100 + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs new file mode 100644 index 000000000..28eef382f --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.IM.Messages +{ + [Dependency(TryRegister = true)] + public class NullMessageProcessor : IMessageProcessor, ISingletonDependency + { + public Task ReadAsync(ChatMessage message) + { + return Task.CompletedTask; + } + + public Task ReCallAsync(ChatMessage message) + { + return Task.CompletedTask; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs new file mode 100644 index 000000000..2ea585770 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LINGYUN.Abp.IM.Settings +{ + public static class AbpIMSettingNames + { + + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs index 9c9abceca..f5fdf7f10 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs @@ -1,15 +1,15 @@ -namespace LINGYUN.Abp.Notifications.SignalR -{ - public class AbpNotificationsSignalROptions - { - /// - /// 自定义的客户端订阅通知方法名称 - /// - public string MethodName { get; set; } - - public AbpNotificationsSignalROptions() - { - MethodName = "getNotification"; - } - } -} +namespace LINGYUN.Abp.Notifications.SignalR +{ + public class AbpNotificationsSignalROptions + { + /// + /// 自定义的客户端订阅通知方法名称 + /// + public string MethodName { get; set; } + + public AbpNotificationsSignalROptions() + { + MethodName = "get-notification"; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs index 978c8ce6d..159a3ab20 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs @@ -1,78 +1,81 @@ -using LINGYUN.Abp.RealTime.Client; -using LINGYUN.Abp.RealTime.SignalR; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Uow; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.Notifications.SignalR.Hubs -{ - [Authorize] - public class NotificationsHub : OnlineClientHubBase - { - protected INotificationStore NotificationStore => LazyServiceProvider.LazyGetRequiredService(); - - protected override async Task OnClientConnectedAsync(IOnlineClient client) - { - await base.OnClientConnectedAsync(client); - - if (client.TenantId.HasValue) - { - // 以租户为分组,将用户加入租户通讯组 - await Groups.AddToGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); - } - else - { - await Groups.AddToGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); - } - } - - protected override async Task OnClientDisconnectedAsync(IOnlineClient client) - { - await base.OnClientDisconnectedAsync(client); - - if (client.TenantId.HasValue) - { - // 以租户为分组,将移除租户通讯组 - await Groups.RemoveFromGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); - } - else - { - await Groups.RemoveFromGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); - } - } - - [HubMethodName("MySubscriptions")] - public virtual async Task> GetMySubscriptionsAsync() - { - var subscriptions = await NotificationStore - .GetUserSubscriptionsAsync(CurrentTenant.Id, CurrentUser.GetId()); - - return new ListResultDto(subscriptions); - } - - [UnitOfWork] - [HubMethodName("GetNotification")] - public virtual async Task> GetNotificationAsync() - { - var userNotifications = await NotificationStore - .GetUserNotificationsAsync(CurrentTenant.Id, CurrentUser.GetId(), NotificationReadState.UnRead, 10); - - return new ListResultDto(userNotifications); - } - - [HubMethodName("ChangeState")] - public virtual async Task ChangeStateAsync(string id, NotificationReadState readState = NotificationReadState.Read) - { - await NotificationStore - .ChangeUserNotificationReadStateAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - long.Parse(id), - readState, - Context.ConnectionAborted); - } - } -} +using LINGYUN.Abp.RealTime.Client; +using LINGYUN.Abp.RealTime.SignalR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.Notifications.SignalR.Hubs +{ + [Authorize] + public class NotificationsHub : OnlineClientHubBase + { + protected INotificationStore NotificationStore => LazyServiceProvider.LazyGetRequiredService(); + + protected override async Task OnClientConnectedAsync(IOnlineClient client) + { + await base.OnClientConnectedAsync(client); + + if (client.TenantId.HasValue) + { + // 以租户为分组,将用户加入租户通讯组 + await Groups.AddToGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); + } + else + { + await Groups.AddToGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); + } + } + + protected override async Task OnClientDisconnectedAsync(IOnlineClient client) + { + await base.OnClientDisconnectedAsync(client); + + if (client.TenantId.HasValue) + { + // 以租户为分组,将移除租户通讯组 + await Groups.RemoveFromGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); + } + else + { + await Groups.RemoveFromGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); + } + } + + // [HubMethodName("MySubscriptions")] + [HubMethodName("my-subscriptions")] + public virtual async Task> GetMySubscriptionsAsync() + { + var subscriptions = await NotificationStore + .GetUserSubscriptionsAsync(CurrentTenant.Id, CurrentUser.GetId()); + + return new ListResultDto(subscriptions); + } + + [UnitOfWork] + // [HubMethodName("GetNotification")] + [HubMethodName("get-notifications")] + public virtual async Task> GetNotificationAsync() + { + var userNotifications = await NotificationStore + .GetUserNotificationsAsync(CurrentTenant.Id, CurrentUser.GetId(), NotificationReadState.UnRead, 10); + + return new ListResultDto(userNotifications); + } + + // [HubMethodName("ChangeState")] + [HubMethodName("change-state")] + public virtual async Task ChangeStateAsync(string id, NotificationReadState readState = NotificationReadState.Read) + { + await NotificationStore + .ChangeUserNotificationReadStateAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + long.Parse(id), + readState, + Context.ConnectionAborted); + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs index 9bbc95eb3..3e0f502f1 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs @@ -1,126 +1,125 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.Notifications -{ - public interface INotificationStore - { - Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default); - - Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers = null, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default); - - Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default); - - Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default); - - Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default); - - Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default); - - Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default); - - Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default); - - Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.Notifications +{ + public interface INotificationStore + { + Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default); + + Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers = null, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default); + + Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default); + + Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default); + + Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default); + + Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default); + + Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default); + + Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default); + + Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs index 8062548a5..df221796b 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs @@ -1,188 +1,187 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace LINGYUN.Abp.Notifications -{ - [Dependency(TryRegister = true)] - public class NullNotificationStore : INotificationStore, ISingletonDependency - { - public Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new NotificationInfo()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - return Task.FromResult(0); - } - - public Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.FromResult(false); - } - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.Notifications +{ + [Dependency(TryRegister = true)] + public class NullNotificationStore : INotificationStore, ISingletonDependency + { + public Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new NotificationInfo()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + return Task.FromResult(0); + } + + public Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.FromResult(false); + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj b/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj index 184bbf6c6..c69060b43 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj +++ b/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj @@ -9,6 +9,7 @@ + diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs index 25799aa99..007154f6e 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs @@ -1,10 +1,9 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GetMyFriendsDto : ISortedResultRequest - { - public string Sorting { get; set; } - public bool Reverse { get; set; } - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetMyFriendsDto : ISortedResultRequest + { + public string Sorting { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs index 6c9382eaf..ede167fd4 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs @@ -1,11 +1,10 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GetUserLastMessageDto : ILimitedResultRequest, ISortedResultRequest - { - public int MaxResultCount { get; set; } - public string Sorting { get; set; } - public bool Reverse { get; set; } - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetUserLastMessageDto : ILimitedResultRequest, ISortedResultRequest + { + public int MaxResultCount { get; set; } + public string Sorting { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs index 82ec7c4a5..36bb32ca6 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs @@ -1,15 +1,14 @@ -using LINGYUN.Abp.IM.Messages; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GroupMessageGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public long GroupId { get; set; } - public bool Reverse { get; set; } - public string Filter { get; set; } - public MessageType? MessageType { get; set; } - } -} +using LINGYUN.Abp.IM.Messages; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GroupMessageGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public long GroupId { get; set; } + public string Filter { get; set; } + public MessageType? MessageType { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs index 3441332c8..d1a77cde7 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs @@ -1,15 +1,13 @@ -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GroupUserGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public long GroupId { get; set; } - - public bool Reverse { get; set; } - - public string Filter { get; set; } - } -} +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GroupUserGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public long GroupId { get; set; } + + public string Filter { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs index ae27bef2b..85af1d86a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs @@ -1,15 +1,13 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class MyFriendGetByPagedDto : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - - public bool Reverse { get; set; } - } - - public class MyLastContractFriendGetByPagedDto : PagedResultRequestDto - { - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class MyFriendGetByPagedDto : PagedAndSortedResultRequestDto + { + public string Filter { get; set; } + } + + public class MyLastContractFriendGetByPagedDto : PagedResultRequestDto + { + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs index 514e5decc..c6620b82f 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs @@ -1,16 +1,15 @@ -using LINGYUN.Abp.IM.Messages; -using System; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class UserMessageGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public Guid ReceiveUserId { get; set; } - public bool Reverse { get; set; } - public string Filter { get; set; } - public MessageType? MessageType { get; set; } - } -} +using LINGYUN.Abp.IM.Messages; +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class UserMessageGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public Guid ReceiveUserId { get; set; } + public string Filter { get; set; } + public MessageType? MessageType { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs index 4f4651498..542d59d70 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs @@ -1,14 +1,12 @@ -using LINGYUN.Abp.Notifications; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public class UserNotificationGetByPagedDto : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - - public bool Reverse { get; set; } - - public NotificationReadState? ReadState { get; set; } - } -} +using LINGYUN.Abp.Notifications; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public class UserNotificationGetByPagedDto : PagedAndSortedResultRequestDto + { + public string Filter { get; set; } + + public NotificationReadState? ReadState { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs index ee7f85368..0f37e2044 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs @@ -1,136 +1,136 @@ -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.IM.Messages; -using Microsoft.AspNetCore.Authorization; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Chat -{ - [Authorize] - public class ChatAppService : ApplicationService, IChatAppService - { - protected IMessageSender MessageSender => LazyServiceProvider.LazyGetRequiredService(); - - private readonly IUserGroupStore _userGroupStore; - private readonly IMessageStore _messageStore; - - public ChatAppService( - IMessageStore messageStore, - IUserGroupStore userGroupStore) - { - _messageStore = messageStore; - _userGroupStore = userGroupStore; - } - - public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) - { - var chatMessageCount = await _messageStore - .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, - input.Filter, input.MessageType); - - var chatMessages = await _messageStore - .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, - input.Filter, input.Sorting, input.Reverse, - input.MessageType, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(chatMessageCount, chatMessages); - } - - public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) - { - var chatMessages = await _messageStore - .GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Sorting, input.Reverse, input.MaxResultCount); - - return new ListResultDto(chatMessages); - } - - public virtual async Task> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input) - { - if (! await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId())) - { - throw new BusinessException(MessageServiceErrorCodes.YouHaveNotJoinedGroup); - } - - var groupMessageCount = await _messageStore - .GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId, - input.Filter, input.MessageType); - - var groupMessages = await _messageStore - .GetGroupMessageAsync(CurrentTenant.Id, input.GroupId, - input.Filter, input.Sorting, input.Reverse, - input.MessageType, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(groupMessageCount, groupMessages); - } - - //public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) - //{ - // var groupUserCardCount = await _userGroupStore - // .GetMembersCountAsync(CurrentTenant.Id, input.GroupId); - - // var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id, - // input.GroupId, input.Sorting, input.Reverse, - // input.SkipCount, input.MaxResultCount); - - // return new PagedResultDto(groupUserCardCount, groupUserCards); - //} - - //[Authorize] - //public virtual async Task> GetMyGroupsAsync() - //{ - // var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId()); - - // return new ListResultDto(myGroups.ToImmutableList()); - //} - - //public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) - //{ - // var myGroupCard = await _userGroupStore - // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); - // if (myGroupCard == null) - // { - // // 当前登录用户不再用户组 - // throw new UserFriendlyException(""); - // } - // if (!myGroupCard.IsAdmin) - // { - // // 当前登录用户没有加人权限 - // throw new UserFriendlyException(""); - // } - // await _userGroupStore - // .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId()); - //} - - //public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) - //{ - // var myGroupCard = await _userGroupStore - // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); - // if (myGroupCard == null) - // { - // // 当前登录用户不再用户组 - // throw new UserFriendlyException(""); - // } - // if (!myGroupCard.IsAdmin) - // { - // // 当前登录用户没有踢人权限 - // throw new UserFriendlyException(""); - // } - // await _userGroupStore - // .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId); - //} - - public virtual async Task SendMessageAsync(ChatMessage input) - { - // TODO:向其他租户发送消息? - input.TenantId ??= CurrentTenant.Id; - - var messageId = await MessageSender.SendMessageAsync(input); - - return new ChatMessageSendResultDto(messageId); - } - } -} +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.IM.Messages; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Authorize] + public class ChatAppService : ApplicationService, IChatAppService + { + protected IMessageSender MessageSender => LazyServiceProvider.LazyGetRequiredService(); + + private readonly IUserGroupStore _userGroupStore; + private readonly IMessageStore _messageStore; + + public ChatAppService( + IMessageStore messageStore, + IUserGroupStore userGroupStore) + { + _messageStore = messageStore; + _userGroupStore = userGroupStore; + } + + public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) + { + var chatMessageCount = await _messageStore + .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.MessageType); + + var chatMessages = await _messageStore + .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.Sorting, + input.MessageType, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(chatMessageCount, chatMessages); + } + + public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) + { + var chatMessages = await _messageStore + .GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Sorting, input.MaxResultCount); + + return new ListResultDto(chatMessages); + } + + public virtual async Task> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input) + { + if (! await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId())) + { + throw new BusinessException(MessageServiceErrorCodes.YouHaveNotJoinedGroup); + } + + var groupMessageCount = await _messageStore + .GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.MessageType); + + var groupMessages = await _messageStore + .GetGroupMessageAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.Sorting, + input.MessageType, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(groupMessageCount, groupMessages); + } + + //public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) + //{ + // var groupUserCardCount = await _userGroupStore + // .GetMembersCountAsync(CurrentTenant.Id, input.GroupId); + + // var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id, + // input.GroupId, input.Sorting, input.Reverse, + // input.SkipCount, input.MaxResultCount); + + // return new PagedResultDto(groupUserCardCount, groupUserCards); + //} + + //[Authorize] + //public virtual async Task> GetMyGroupsAsync() + //{ + // var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId()); + + // return new ListResultDto(myGroups.ToImmutableList()); + //} + + //public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) + //{ + // var myGroupCard = await _userGroupStore + // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); + // if (myGroupCard == null) + // { + // // 当前登录用户不再用户组 + // throw new UserFriendlyException(""); + // } + // if (!myGroupCard.IsAdmin) + // { + // // 当前登录用户没有加人权限 + // throw new UserFriendlyException(""); + // } + // await _userGroupStore + // .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId()); + //} + + //public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) + //{ + // var myGroupCard = await _userGroupStore + // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); + // if (myGroupCard == null) + // { + // // 当前登录用户不再用户组 + // throw new UserFriendlyException(""); + // } + // if (!myGroupCard.IsAdmin) + // { + // // 当前登录用户没有踢人权限 + // throw new UserFriendlyException(""); + // } + // await _userGroupStore + // .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId); + //} + + public virtual async Task SendMessageAsync(ChatMessage input) + { + // TODO:向其他租户发送消息? + input.TenantId ??= CurrentTenant.Id; + + var messageId = await MessageSender.SendMessageAsync(input); + + return new ChatMessageSendResultDto(messageId); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs index 501ebd55b..101dccaec 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs @@ -1,66 +1,68 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.MessageService.Localization; -using Microsoft.AspNetCore.Authorization; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Chat -{ - [Authorize] - public class MyFriendAppService : ApplicationService, IMyFriendAppService - { - protected IFriendStore FriendStore { get; } - - protected IUserChatCardRepository UserChatCardRepository { get; } - - public MyFriendAppService( - IFriendStore friendStore, - IUserChatCardRepository userChatCardRepository) - { - FriendStore = friendStore; - UserChatCardRepository = userChatCardRepository; - - LocalizationResource = typeof(MessageServiceResource); - } - - public virtual async Task CreateAsync(MyFriendCreateDto input) - { - var friendCard = await UserChatCardRepository.GetMemberAsync(input.FriendId); - - await FriendStore.AddMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, friendCard?.NickName ?? friendCard?.UserName ?? input.FriendId.ToString()); - } - - public virtual async Task AddRequestAsync(MyFriendAddRequestDto input) - { - await FriendStore.AddRequestAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, input.RemarkName, L["AddNewFriendBySearchId"]); - } - - public virtual async Task DeleteAsync(MyFriendOperationDto input) - { - await FriendStore.RemoveMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId); - } - - public virtual async Task> GetAllListAsync(GetMyFriendsDto input) - { - var myFriends = await FriendStore - .GetListAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Sorting, input.Reverse); - - return new ListResultDto(myFriends); - } - - public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) - { - var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); - - var myFriends = await FriendStore - .GetPagedListAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Filter, input.Sorting, input.Reverse, - input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(myFrientCount, myFriends); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.MessageService.Localization; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Authorize] + public class MyFriendAppService : ApplicationService, IMyFriendAppService + { + protected IFriendStore FriendStore { get; } + + protected IUserChatCardRepository UserChatCardRepository { get; } + + public MyFriendAppService( + IFriendStore friendStore, + IUserChatCardRepository userChatCardRepository) + { + FriendStore = friendStore; + UserChatCardRepository = userChatCardRepository; + + LocalizationResource = typeof(MessageServiceResource); + } + + public virtual async Task CreateAsync(MyFriendCreateDto input) + { + var friendCard = await UserChatCardRepository.GetMemberAsync(input.FriendId); + + await FriendStore.AddMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, friendCard?.NickName ?? friendCard?.UserName ?? input.FriendId.ToString()); + } + + public virtual async Task AddRequestAsync(MyFriendAddRequestDto input) + { + await FriendStore.AddRequestAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, input.RemarkName, L["AddNewFriendBySearchId"]); + } + + public virtual async Task DeleteAsync(MyFriendOperationDto input) + { + await FriendStore.RemoveMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId); + } + + public virtual async Task> GetAllListAsync(GetMyFriendsDto input) + { + var myFriends = await FriendStore + .GetListAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + input.Sorting); + + return new ListResultDto(myFriends); + } + + public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) + { + var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); + + var myFriends = await FriendStore + .GetPagedListAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Filter, input.Sorting, + input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(myFrientCount, myFriends); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs index 17bda9d91..3a2cef825 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs @@ -1,121 +1,121 @@ -using LINGYUN.Abp.Notifications; -using Microsoft.AspNetCore.Authorization; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - [Authorize] - public class MyNotificationAppService : ApplicationService, IMyNotificationAppService - { - protected INotificationSender NotificationSender { get; } - - protected INotificationStore NotificationStore { get; } - - protected INotificationDefinitionManager NotificationDefinitionManager { get; } - - public MyNotificationAppService( - INotificationStore notificationStore, - INotificationSender notificationSender, - INotificationDefinitionManager notificationDefinitionManager) - { - NotificationStore = notificationStore; - NotificationSender = notificationSender; - NotificationDefinitionManager = notificationDefinitionManager; - } - - public virtual async Task SendNofiterAsync(NotificationSendDto input) - { - UserIdentifier user = null; - if (input.ToUserId.HasValue) - { - user = new UserIdentifier(input.ToUserId.Value, input.ToUserName); - } - await NotificationSender - .SendNofiterAsync( - input.Name, - input.Data, - user, - CurrentTenant.Id, - input.Severity); - } - - public virtual async Task DeleteAsync(long id) - { - await NotificationStore - .DeleteUserNotificationAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - id); - } - - public virtual Task> GetAssignableNotifiersAsync() - { - var groups = new List(); - - foreach (var group in NotificationDefinitionManager.GetGroups()) - { - if (!group.AllowSubscriptionToClients) - { - continue; - - } - var notificationGroup = new NotificationGroupDto - { - Name = group.Name, - DisplayName = group.DisplayName.Localize(StringLocalizerFactory) - }; - - foreach (var notification in group.Notifications) - { - if (!notification.AllowSubscriptionToClients) - { - continue; - } - - var notificationChildren = new NotificationDto - { - Name = notification.Name, - DisplayName = notification.DisplayName.Localize(StringLocalizerFactory), - Description = notification.Description.Localize(StringLocalizerFactory), - Lifetime = notification.NotificationLifetime, - Type = notification.NotificationType - }; - - notificationGroup.Notifications.Add(notificationChildren); - } - - groups.Add(notificationGroup); - } - - return Task.FromResult(new ListResultDto(groups)); - } - - public virtual async Task GetAsync(long id) - { - return await NotificationStore - .GetNotificationOrNullAsync(CurrentTenant.Id, id); - } - - public virtual async Task> GetListAsync(UserNotificationGetByPagedDto input) - { - var notificationCount = await NotificationStore - .GetUserNotificationsCountAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - input.Filter, - input.ReadState); - - var notifications = await NotificationStore - .GetUserNotificationsAsync( - CurrentTenant.Id, CurrentUser.GetId(), - input.Filter, input.Sorting, input.Reverse, - input.ReadState, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(notificationCount, notifications); - } - } -} +using LINGYUN.Abp.Notifications; +using Microsoft.AspNetCore.Authorization; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + [Authorize] + public class MyNotificationAppService : ApplicationService, IMyNotificationAppService + { + protected INotificationSender NotificationSender { get; } + + protected INotificationStore NotificationStore { get; } + + protected INotificationDefinitionManager NotificationDefinitionManager { get; } + + public MyNotificationAppService( + INotificationStore notificationStore, + INotificationSender notificationSender, + INotificationDefinitionManager notificationDefinitionManager) + { + NotificationStore = notificationStore; + NotificationSender = notificationSender; + NotificationDefinitionManager = notificationDefinitionManager; + } + + public virtual async Task SendNofiterAsync(NotificationSendDto input) + { + UserIdentifier user = null; + if (input.ToUserId.HasValue) + { + user = new UserIdentifier(input.ToUserId.Value, input.ToUserName); + } + await NotificationSender + .SendNofiterAsync( + input.Name, + input.Data, + user, + CurrentTenant.Id, + input.Severity); + } + + public virtual async Task DeleteAsync(long id) + { + await NotificationStore + .DeleteUserNotificationAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + id); + } + + public virtual Task> GetAssignableNotifiersAsync() + { + var groups = new List(); + + foreach (var group in NotificationDefinitionManager.GetGroups()) + { + if (!group.AllowSubscriptionToClients) + { + continue; + + } + var notificationGroup = new NotificationGroupDto + { + Name = group.Name, + DisplayName = group.DisplayName.Localize(StringLocalizerFactory) + }; + + foreach (var notification in group.Notifications) + { + if (!notification.AllowSubscriptionToClients) + { + continue; + } + + var notificationChildren = new NotificationDto + { + Name = notification.Name, + DisplayName = notification.DisplayName.Localize(StringLocalizerFactory), + Description = notification.Description.Localize(StringLocalizerFactory), + Lifetime = notification.NotificationLifetime, + Type = notification.NotificationType + }; + + notificationGroup.Notifications.Add(notificationChildren); + } + + groups.Add(notificationGroup); + } + + return Task.FromResult(new ListResultDto(groups)); + } + + public virtual async Task GetAsync(long id) + { + return await NotificationStore + .GetNotificationOrNullAsync(CurrentTenant.Id, id); + } + + public virtual async Task> GetListAsync(UserNotificationGetByPagedDto input) + { + var notificationCount = await NotificationStore + .GetUserNotificationsCountAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + input.Filter, + input.ReadState); + + var notifications = await NotificationStore + .GetUserNotificationsAsync( + CurrentTenant.Id, CurrentUser.GetId(), + input.Filter, input.Sorting, + input.ReadState, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(notificationCount, notifications); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs index 6f918bea7..589c4c003 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs @@ -1,9 +1,9 @@ -using Volo.Abp.Localization; - -namespace LINGYUN.Abp.MessageService.Localization -{ - [LocalizationResourceName("MessageService")] - public class MessageServiceResource - { - } -} +using Volo.Abp.Localization; + +namespace LINGYUN.Abp.MessageService.Localization +{ + [LocalizationResourceName("AbpMessageService")] + public class MessageServiceResource + { + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs index f804cc102..1245784b2 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs @@ -1,99 +1,103 @@ -namespace LINGYUN.Abp.MessageService -{ - /// - /// 消息系统错误码设计 - /// 状态码分为两部分 前2位领域 后3位状态 - /// - /// - /// 领域部分: - /// 01 输入 - /// 02 群组 - /// 03 用户 - /// 04 应用 - /// 05 内部 - /// 10 输出 - /// - /// - /// - /// 状态部分: - /// 200-299 成功 - /// 300-399 成功但有后续操作 - /// 400-499 业务异常 - /// 500-599 内部异常 - /// 900-999 输入输出异常 - /// - /// - /// - public class MessageServiceErrorCodes - { - public const string Namespace = "LINGYUN.Abp.Message"; - /// - /// 消息不完整 - /// - public const string MessageIncomplete = Namespace + ":01400"; - /// - /// 您还未加入群组,不能进行操作 - /// - public const string YouHaveNotJoinedGroup = Namespace + ":01401"; - /// - /// 已发送群组申请,等待管理员同意 - /// - public const string YouHaveAddingToGroup = Namespace + ":02301"; - /// - /// 你需要验证问题才能加入群聊 - /// - public const string YouNeedValidationQuestingByAddGroup = Namespace + ":02302"; - /// - /// 管理员已开启全员禁言 - /// - public const string GroupNotAllowedToSpeak = Namespace + ":02400"; - /// - /// 管理员已禁止用户发言 - /// - public const string GroupUserHasBlack = Namespace + ":02403"; - /// - /// 管理员不允许匿名发言 - /// - public const string GroupNotAllowedToSpeakAnonymously = Namespace + ":02401"; - /// - /// 群组不存在或已解散 - /// - public const string GroupNotFount = Namespace + ":02404"; - /// - /// 用户已拒接所有消息 - /// - public const string UserHasRejectAllMessage = Namespace + ":03400"; - /// - /// 用户已将发信人拉黑 - /// - public const string UserHasBlack = Namespace + ":03401"; - /// - /// 用户不允许匿名发言 - /// - public const string UserNotAllowedToSpeakAnonymously = Namespace + ":03402"; - /// - /// 用户不接收非好友发言 - /// - public const string UserHasRejectNotFriendMessage = Namespace + ":03403"; - /// - /// 接收消息用户不存在或已注销 - /// - public const string UseNotFount = Namespace + ":03404"; - /// - /// 用户拒绝添加好友 - /// - public const string UseRefuseToAddFriend = Namespace + ":03410"; - /// - /// 对方已是您的好友或已发送验证请求,不能重复操作 - /// - public const string UseHasBeenAddedTheFriendOrSendAuthorization = Namespace + ":03411"; - /// - /// 已发送好友申请,等待对方同意 - /// - public const string YouHaveAddingTheUserToFriend = Namespace + ":03301"; - /// - /// 你需要验证问题才能添加好友 - /// - public const string YouNeedValidationQuestingByAddFriend = Namespace + ":03302"; - } -} +namespace LINGYUN.Abp.MessageService +{ + /// + /// 消息系统错误码设计 + /// 状态码分为两部分 前2位领域 后3位状态 + /// + /// + /// 领域部分: + /// 01 输入 + /// 02 群组 + /// 03 用户 + /// 04 应用 + /// 05 内部 + /// 10 输出 + /// + /// + /// + /// 状态部分: + /// 200-299 成功 + /// 300-399 成功但有后续操作 + /// 400-499 业务异常 + /// 500-599 内部异常 + /// 900-999 输入输出异常 + /// + /// + /// + public class MessageServiceErrorCodes + { + public const string Namespace = "LINGYUN.Abp.Message"; + /// + /// 试图撤回过期消息 + /// + public const string ExpiredMessageCannotBeReCall = Namespace + ":01303"; + /// + /// 消息不完整 + /// + public const string MessageIncomplete = Namespace + ":01400"; + /// + /// 您还未加入群组,不能进行操作 + /// + public const string YouHaveNotJoinedGroup = Namespace + ":01401"; + /// + /// 已发送群组申请,等待管理员同意 + /// + public const string YouHaveAddingToGroup = Namespace + ":02301"; + /// + /// 你需要验证问题才能加入群聊 + /// + public const string YouNeedValidationQuestingByAddGroup = Namespace + ":02302"; + /// + /// 管理员已开启全员禁言 + /// + public const string GroupNotAllowedToSpeak = Namespace + ":02400"; + /// + /// 管理员已禁止用户发言 + /// + public const string GroupUserHasBlack = Namespace + ":02403"; + /// + /// 管理员不允许匿名发言 + /// + public const string GroupNotAllowedToSpeakAnonymously = Namespace + ":02401"; + /// + /// 群组不存在或已解散 + /// + public const string GroupNotFount = Namespace + ":02404"; + /// + /// 用户已拒接所有消息 + /// + public const string UserHasRejectAllMessage = Namespace + ":03400"; + /// + /// 用户已将发信人拉黑 + /// + public const string UserHasBlack = Namespace + ":03401"; + /// + /// 用户不允许匿名发言 + /// + public const string UserNotAllowedToSpeakAnonymously = Namespace + ":03402"; + /// + /// 用户不接收非好友发言 + /// + public const string UserHasRejectNotFriendMessage = Namespace + ":03403"; + /// + /// 接收消息用户不存在或已注销 + /// + public const string UseNotFount = Namespace + ":03404"; + /// + /// 用户拒绝添加好友 + /// + public const string UseRefuseToAddFriend = Namespace + ":03410"; + /// + /// 对方已是您的好友或已发送验证请求,不能重复操作 + /// + public const string UseHasBeenAddedTheFriendOrSendAuthorization = Namespace + ":03411"; + /// + /// 已发送好友申请,等待对方同意 + /// + public const string YouHaveAddingTheUserToFriend = Namespace + ":03301"; + /// + /// 你需要验证问题才能添加好友 + /// + public const string YouNeedValidationQuestingByAddFriend = Namespace + ":03302"; + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs new file mode 100644 index 000000000..208c993db --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs @@ -0,0 +1,30 @@ +using LINGYUN.Abp.MessageService.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Settings; + +namespace LINGYUN.Abp.MessageService.Settings +{ + public class MessageServiceSettingDefinitionProvider : SettingDefinitionProvider + { + public override void Define(ISettingDefinitionContext context) + { + context.Add( + new SettingDefinition( + MessageServiceSettingNames.Messages.RecallExpirationTime, + "2", + L("DisplayName:RecallExpirationTime"), + L("Description:RecallExpirationTime"), + isVisibleToClients: false, + isEncrypted: false) + .WithProviders( + GlobalSettingValueProvider.ProviderName, + TenantSettingValueProvider.ProviderName) + ); + } + + protected ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs similarity index 53% rename from aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs rename to aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs index 0b4a121fe..700b1d35a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs @@ -1,16 +1,25 @@ -namespace LINGYUN.Abp.MessageService -{ - public class MessageServiceSettingNames - { - public const string GroupName = "Abp.MessageService"; - - public class Notifications - { - public const string Default = GroupName + ".Notifications"; - /// - /// 清理过期消息批次 - /// - public const string CleanupExpirationBatchCount = Default + ".CleanupExpirationBatchCount"; - } - } -} +namespace LINGYUN.Abp.MessageService.Settings +{ + public class MessageServiceSettingNames + { + public const string GroupName = "Abp.MessageService"; + + public class Notifications + { + public const string Default = GroupName + ".Notifications"; + /// + /// 清理过期消息批次 + /// + public const string CleanupExpirationBatchCount = Default + ".CleanupExpirationBatchCount"; + } + + public class Messages + { + public const string Default = GroupName + ".Messages"; + /// + /// 撤回消息过期时间(分) + /// + public const string RecallExpirationTime = Default + ".RecallExpirationTime"; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs index 04e744451..ba239fa32 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs @@ -1,280 +1,277 @@ -using LINGYUN.Abp.IM.Contract; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Caching; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Timing; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class FriendStore : IFriendStore, ITransientDependency - { - private readonly IClock _clock; - private readonly ILogger _logger; - private readonly ICurrentTenant _currentTenant; - private readonly IDistributedCache _cache; - private readonly IUserChatFriendRepository _userChatFriendRepository; - private readonly IUserChatSettingRepository _userChatSettingRepository; - - public FriendStore( - IClock clock, - ILogger logger, - ICurrentTenant currentTenant, - IDistributedCache cache, - IUserChatFriendRepository userChatFriendRepository, - IUserChatSettingRepository userChatSettingRepository - ) - { - _clock = clock; - _cache = cache; - _logger = logger; - _currentTenant = currentTenant; - _userChatFriendRepository = userChatFriendRepository; - _userChatSettingRepository = userChatSettingRepository; - } - - public virtual async Task IsFriendAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository.IsFriendAsync(userId, friendId, cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task AddMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - if (!await _userChatFriendRepository.IsAddedAsync(userId, friendId)) - { - var userFriend = new UserChatFriend(userId, friendId, remarkName); - userFriend.SetStatus(UserFriendStatus.Added); - - await _userChatFriendRepository.InsertAsync(userFriend); - } - - var userChatFriend = await _userChatFriendRepository - .FindByUserFriendIdAsync(friendId, userId); - - userChatFriend.SetStatus(UserFriendStatus.Added); - - await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task AddRequestAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - string description = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - if (await _userChatFriendRepository.IsAddedAsync(userId, friendId)) - { - throw new BusinessException(MessageServiceErrorCodes.UseHasBeenAddedTheFriendOrSendAuthorization); - } - - var status = UserFriendStatus.NeedValidation; - var userChatSetting = await _userChatSettingRepository.FindByUserIdAsync(friendId, cancellationToken); - if (userChatSetting != null) - { - if (!userChatSetting.AllowAddFriend) - { - throw new BusinessException(MessageServiceErrorCodes.UseRefuseToAddFriend); - } - - status = userChatSetting.RequireAddFriendValition - ? UserFriendStatus.NeedValidation - : UserFriendStatus.Added; - } - - var userChatFriend = new UserChatFriend(userId, friendId, remarkName, description, tenantId) - { - CreationTime = _clock.Now, - CreatorId = userId, - }; - userChatFriend.SetStatus(status); - - await _userChatFriendRepository.InsertAsync(userChatFriend, cancellationToken: cancellationToken); - - return new UserAddFriendResult(status); - } - } - - [UnitOfWork] - public virtual async Task AddShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - await ChangeFriendShieldAsync(tenantId, userId, friendId, true, cancellationToken); - } - - public virtual async Task> GetListAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await GetAllFriendByCacheItemAsync(userId, sorting, reverse, cancellationToken); - } - } - - public virtual async Task GetCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMembersCountAsync(userId, filter, cancellationToken); - } - } - - public virtual async Task> GetPagedListAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMembersAsync(userId, filter, sorting, reverse, - skipCount, maxResultCount, cancellationToken); - } - } - - public virtual async Task> GetLastContactListAsync( - Guid? tenantId, - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetLastContactMembersAsync(userId, - skipCount, maxResultCount, cancellationToken); - } - } - - public virtual async Task GetMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMemberAsync(userId, friendId, cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task RemoveMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); - if (userChatFriend != null) - { - await _userChatFriendRepository.DeleteAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - } - - [UnitOfWork] - public virtual async Task RemoveShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - await ChangeFriendShieldAsync(tenantId, userId, friendId, false, cancellationToken); - } - - - protected virtual async Task ChangeFriendShieldAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - bool isBlack = false, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); - if (userChatFriend != null) - { - userChatFriend.Black = isBlack; - await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - } - - protected virtual async Task> GetAllFriendByCacheItemAsync( - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ) - { - var cacheKey = UserFriendCacheItem.CalculateCacheKey(userId.ToString()); - _logger.LogDebug($"FriendStore.GetCacheItemAsync: {cacheKey}"); - - var cacheItem = await _cache.GetAsync(cacheKey, token: cancellationToken); - if (cacheItem != null) - { - _logger.LogDebug($"Found in the cache: {cacheKey}"); - return cacheItem.Friends; - } - - _logger.LogDebug($"Not found in the cache: {cacheKey}"); - var friends = await _userChatFriendRepository - .GetAllMembersAsync(userId, sorting, reverse, cancellationToken); - cacheItem = new UserFriendCacheItem(friends); - _logger.LogDebug($"Set item in the cache: {cacheKey}"); - await _cache.SetAsync(cacheKey, cacheItem, token: cancellationToken); - return friends; - } - } -} +using LINGYUN.Abp.IM.Contract; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Timing; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class FriendStore : IFriendStore, ITransientDependency + { + private readonly IClock _clock; + private readonly ILogger _logger; + private readonly ICurrentTenant _currentTenant; + private readonly IDistributedCache _cache; + private readonly IUserChatFriendRepository _userChatFriendRepository; + private readonly IUserChatSettingRepository _userChatSettingRepository; + + public FriendStore( + IClock clock, + ILogger logger, + ICurrentTenant currentTenant, + IDistributedCache cache, + IUserChatFriendRepository userChatFriendRepository, + IUserChatSettingRepository userChatSettingRepository + ) + { + _clock = clock; + _cache = cache; + _logger = logger; + _currentTenant = currentTenant; + _userChatFriendRepository = userChatFriendRepository; + _userChatSettingRepository = userChatSettingRepository; + } + + public virtual async Task IsFriendAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository.IsFriendAsync(userId, friendId, cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task AddMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + if (!await _userChatFriendRepository.IsAddedAsync(userId, friendId)) + { + var userFriend = new UserChatFriend(userId, friendId, remarkName); + userFriend.SetStatus(UserFriendStatus.Added); + + await _userChatFriendRepository.InsertAsync(userFriend); + } + + var userChatFriend = await _userChatFriendRepository + .FindByUserFriendIdAsync(friendId, userId); + + userChatFriend.SetStatus(UserFriendStatus.Added); + + await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task AddRequestAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + string description = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + if (await _userChatFriendRepository.IsAddedAsync(userId, friendId)) + { + throw new BusinessException(MessageServiceErrorCodes.UseHasBeenAddedTheFriendOrSendAuthorization); + } + + var status = UserFriendStatus.NeedValidation; + var userChatSetting = await _userChatSettingRepository.FindByUserIdAsync(friendId, cancellationToken); + if (userChatSetting != null) + { + if (!userChatSetting.AllowAddFriend) + { + throw new BusinessException(MessageServiceErrorCodes.UseRefuseToAddFriend); + } + + status = userChatSetting.RequireAddFriendValition + ? UserFriendStatus.NeedValidation + : UserFriendStatus.Added; + } + + var userChatFriend = new UserChatFriend(userId, friendId, remarkName, description, tenantId) + { + CreationTime = _clock.Now, + CreatorId = userId, + }; + userChatFriend.SetStatus(status); + + await _userChatFriendRepository.InsertAsync(userChatFriend, cancellationToken: cancellationToken); + + return new UserAddFriendResult(status); + } + } + + [UnitOfWork] + public virtual async Task AddShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + await ChangeFriendShieldAsync(tenantId, userId, friendId, true, cancellationToken); + } + + public virtual async Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await GetAllFriendByCacheItemAsync(userId, sorting, cancellationToken); + } + } + + public virtual async Task GetCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMembersCountAsync(userId, filter, cancellationToken); + } + } + + public virtual async Task> GetPagedListAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(UserFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMembersAsync(userId, filter, sorting, + skipCount, maxResultCount, cancellationToken); + } + } + + public virtual async Task> GetLastContactListAsync( + Guid? tenantId, + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetLastContactMembersAsync(userId, + skipCount, maxResultCount, cancellationToken); + } + } + + public virtual async Task GetMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMemberAsync(userId, friendId, cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task RemoveMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); + if (userChatFriend != null) + { + await _userChatFriendRepository.DeleteAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + } + + [UnitOfWork] + public virtual async Task RemoveShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + await ChangeFriendShieldAsync(tenantId, userId, friendId, false, cancellationToken); + } + + + protected virtual async Task ChangeFriendShieldAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + bool isBlack = false, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); + if (userChatFriend != null) + { + userChatFriend.Black = isBlack; + await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + } + + protected virtual async Task> GetAllFriendByCacheItemAsync( + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ) + { + var cacheKey = UserFriendCacheItem.CalculateCacheKey(userId.ToString()); + _logger.LogDebug($"FriendStore.GetCacheItemAsync: {cacheKey}"); + + var cacheItem = await _cache.GetAsync(cacheKey, token: cancellationToken); + if (cacheItem != null) + { + _logger.LogDebug($"Found in the cache: {cacheKey}"); + return cacheItem.Friends; + } + + _logger.LogDebug($"Not found in the cache: {cacheKey}"); + var friends = await _userChatFriendRepository + .GetAllMembersAsync(userId, sorting, cancellationToken); + cacheItem = new UserFriendCacheItem(friends); + _logger.LogDebug($"Set item in the cache: {cacheKey}"); + await _cache.SetAsync(cacheKey, cacheItem, token: cancellationToken); + return friends; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs index 43b45d938..920209bd5 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs @@ -1,100 +1,104 @@ -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IMessageRepository - { - Task InsertUserMessageAsync( - UserMessage userMessage, - CancellationToken cancellationToken = default); - - Task InsertGroupMessageAsync( - GroupMessage groupMessage, - CancellationToken cancellationToken = default); - - Task GetUserMessageAsync( - long id, - CancellationToken cancellationToken = default); - - Task GetGroupMessageAsync( - long id, - CancellationToken cancellationToken = default); - - Task GetUserMessagesCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetLastMessagesByOneFriendAsync( - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task> GetUserMessagesAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetGroupMessagesCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetGroupMessagesAsync( - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetUserGroupMessagesCountAsync( - Guid sendUserId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetUserGroupMessagesAsync( - Guid sendUserId, - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IMessageRepository + { + Task InsertUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default); + + Task UpdateUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default); + + Task InsertGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default); + + Task UpdateGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default); + + Task GetUserMessageAsync( + long id, + CancellationToken cancellationToken = default); + + Task GetGroupMessageAsync( + long id, + CancellationToken cancellationToken = default); + + Task GetUserMessagesCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task> GetUserMessagesAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetGroupMessagesCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetGroupMessagesAsync( + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetUserGroupMessagesCountAsync( + Guid sendUserId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetUserGroupMessagesAsync( + Guid sendUserId, + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs index e55c9ab96..9cbbbd0d2 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs @@ -1,38 +1,37 @@ -using LINGYUN.Abp.IM; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IUserChatCardRepository : IBasicRepository - { - Task CheckUserIdExistsAsync( - Guid userId, - CancellationToken cancellationToken = default); - - Task GetMemberCountAsync( - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - CancellationToken cancellationToken = default); - - Task> GetMembersAsync( - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - string sorting = nameof(UserChatCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetMemberAsync( - Guid findUserId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IUserChatCardRepository : IBasicRepository + { + Task CheckUserIdExistsAsync( + Guid userId, + CancellationToken cancellationToken = default); + + Task GetMemberCountAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + CancellationToken cancellationToken = default); + + Task> GetMembersAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetMemberAsync( + Guid findUserId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs index debc5aa57..a67c81fdb 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs @@ -1,58 +1,56 @@ -using LINGYUN.Abp.IM.Contract; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IUserChatFriendRepository : IBasicRepository - { - Task IsFriendAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default); - - Task IsAddedAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default); - - Task FindByUserFriendIdAsync( - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - - Task> GetAllMembersAsync( - Guid userId, - string sorting = nameof(UserChatFriend.RemarkName), - bool reverse = false, - CancellationToken cancellationToken = default); - - Task GetMembersCountAsync( - Guid userId, - string filter = "", - CancellationToken cancellationToken = default); - - Task> GetMembersAsync( - Guid userId, - string filter = "", - string sorting = nameof(UserChatFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task> GetLastContactMembersAsync( - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetMemberAsync( - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Contract; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IUserChatFriendRepository : IBasicRepository + { + Task IsFriendAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default); + + Task IsAddedAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default); + + Task FindByUserFriendIdAsync( + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + + Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + CancellationToken cancellationToken = default); + + Task GetMembersCountAsync( + Guid userId, + string filter = "", + CancellationToken cancellationToken = default); + + Task> GetMembersAsync( + Guid userId, + string filter = "", + string sorting = nameof(UserChatFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task> GetLastContactMembersAsync( + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetMemberAsync( + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs index bee4de691..d263a1fce 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs @@ -1,51 +1,52 @@ -using LINGYUN.Abp.IM.Messages; -using System; -using Volo.Abp.Data; -using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public abstract class Message : CreationAuditedAggregateRoot, IMultiTenant - { - /// - /// 租户 - /// - public virtual Guid? TenantId { get; protected set; } - /// - /// 消息标识 - /// - public virtual long MessageId { get; protected set; } - /// - /// 发送用户名称 - /// - public virtual string SendUserName { get; protected set; } - /// - /// 内容 - /// - public virtual string Content { get; protected set; } - /// - /// 消息类型 - /// - public virtual MessageType Type { get; protected set; } - /// - /// 发送状态 - /// - public virtual MessageSendState SendState { get; protected set; } - protected Message() { } - public Message(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text) - { - MessageId = id; - CreatorId = sendUserId; - SendUserName = sendUserName; - Content = content; - Type = type; - CreationTime = DateTime.Now; - } - - public void ChangeSendState(MessageSendState state = MessageSendState.Send) - { - SendState = state; - } - } -} +using LINGYUN.Abp.IM.Messages; +using System; +using Volo.Abp.Data; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public abstract class Message : CreationAuditedAggregateRoot, IMultiTenant + { + /// + /// 租户 + /// + public virtual Guid? TenantId { get; protected set; } + /// + /// 消息标识 + /// + public virtual long MessageId { get; protected set; } + /// + /// 发送用户名称 + /// + public virtual string SendUserName { get; protected set; } + /// + /// 内容 + /// + public virtual string Content { get; protected set; } + /// + /// 消息类型 + /// + public virtual MessageType Type { get; protected set; } + /// + /// 发送状态 + /// + public virtual MessageState SendState { get; protected set; } + protected Message() { } + public Message(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text) + { + MessageId = id; + CreatorId = sendUserId; + SendUserName = sendUserName; + Content = content; + Type = type; + CreationTime = DateTime.Now; + ChangeSendState(); + } + + public void ChangeSendState(MessageState state = MessageState.Send) + { + SendState = state; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs new file mode 100644 index 000000000..bda531003 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs @@ -0,0 +1,82 @@ +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Settings; +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Settings; +using Volo.Abp.Timing; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Dependency(ReplaceServices = true)] + public class MessageProcessor : IMessageProcessor, ITransientDependency + { + private readonly IClock _clock; + private readonly IMessageRepository _repository; + private readonly ISettingProvider _settingProvider; + + public MessageProcessor(IMessageRepository repository) + { + _repository = repository; + } + + public virtual async Task ReadAsync(ChatMessage message) + { + if (!message.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(message.GroupId); + var groupMessage = await _repository.GetGroupMessageAsync(groupId); + groupMessage.ChangeSendState(MessageState.Read); + + await _repository.UpdateGroupMessageAsync(groupMessage); + } + else + { + long messageId = long.Parse(message.MessageId); + var userMessage = await _repository.GetUserMessageAsync(messageId); + userMessage.ChangeSendState(MessageState.Read); + + await _repository.UpdateUserMessageAsync(userMessage); + } + } + + public virtual async Task ReCallAsync(ChatMessage message) + { + var expiration = await _settingProvider.GetAsync( + MessageServiceSettingNames.Messages.RecallExpirationTime, 2d); + + Func hasExpiredMessage = (Message msg) => + msg.CreationTime.AddMinutes(expiration) < _clock.Now; + + if (!message.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(message.GroupId); + var groupMessage = await _repository.GetGroupMessageAsync(groupId); + if (hasExpiredMessage(groupMessage)) + { + throw new BusinessException(MessageServiceErrorCodes.ExpiredMessageCannotBeReCall) + .WithData("Time", expiration); + } + + groupMessage.ChangeSendState(MessageState.ReCall); + + await _repository.UpdateGroupMessageAsync(groupMessage); + } + else + { + long messageId = long.Parse(message.MessageId); + var userMessage = await _repository.GetUserMessageAsync(messageId); + if (hasExpiredMessage(userMessage)) + { + throw new BusinessException(MessageServiceErrorCodes.ExpiredMessageCannotBeReCall) + .WithData("Time", expiration); + } + + userMessage.ChangeSendState(MessageState.ReCall); + + await _repository.UpdateUserMessageAsync(userMessage); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs index a9e128ef0..5254d8ae6 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs @@ -1,257 +1,254 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class MessageStore : IMessageStore, ITransientDependency - { - private readonly IFriendStore _friendStore; - - private readonly IObjectMapper _objectMapper; - - private readonly ICurrentTenant _currentTenant; - - private readonly IUnitOfWorkManager _unitOfWorkManager; - - private readonly IGroupRepository _groupRepository; - - private readonly IMessageRepository _messageRepository; - - private readonly IUserChatSettingRepository _userChatSettingRepository; - public MessageStore( - IFriendStore friendStore, - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IGroupRepository groupRepository, - IMessageRepository messageRepository, - IUserChatSettingRepository userChatSettingRepository) - { - _friendStore = friendStore; - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _unitOfWorkManager = unitOfWorkManager; - _groupRepository = groupRepository; - _messageRepository = messageRepository; - _userChatSettingRepository = userChatSettingRepository; - } - - public virtual async Task StoreMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(chatMessage.TenantId)) - { - if (!chatMessage.GroupId.IsNullOrWhiteSpace()) - { - long groupId = long.Parse(chatMessage.GroupId); - await StoreGroupMessageAsync(chatMessage, groupId, cancellationToken); - } - else - { - await StoreUserMessageAsync(chatMessage, cancellationToken); - } - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - - public virtual async Task> GetGroupMessageAsync( - Guid? tenantId, - long groupId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var groupMessages = await _messageRepository - .GetGroupMessagesAsync(groupId, filter, sorting, reverse, type, skipCount, maxResultCount, cancellationToken); - - var chatMessages = _objectMapper.Map, List>(groupMessages); - - return chatMessages; - } - } - - public virtual async Task> GetChatMessageAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userMessages = await _messageRepository - .GetUserMessagesAsync(sendUserId, receiveUserId, filter, sorting, reverse, type, skipCount, maxResultCount, cancellationToken); - - var chatMessages = _objectMapper.Map, List>(userMessages); - - return chatMessages; - } - } - - public virtual async Task> GetLastChatMessagesAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository - .GetLastMessagesByOneFriendAsync(userId, sorting, reverse, maxResultCount, cancellationToken); - } - } - - public virtual async Task GetGroupMessageCountAsync( - Guid? tenantId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository.GetCountAsync(groupId, filter, type, cancellationToken); - } - } - - public virtual async Task GetChatMessageCountAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, filter, type, cancellationToken); - } - } - - protected virtual async Task StoreUserMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default) - { - // 检查接收用户 - if (!chatMessage.ToUserId.HasValue) - { - throw new BusinessException(MessageServiceErrorCodes.UseNotFount); - } - - var myFriend = await _friendStore - .GetMemberAsync(chatMessage.TenantId, chatMessage.ToUserId.Value, chatMessage.FormUserId, cancellationToken); - - var userChatSetting = await _userChatSettingRepository - .FindByUserIdAsync(chatMessage.ToUserId.Value, cancellationToken); - - if (userChatSetting != null) - { - if (!userChatSetting.AllowReceiveMessage) - { - // 当前发送的用户不接收消息 - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); - } - - if (myFriend == null && !chatMessage.IsAnonymous) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); - } - - if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) - { - // 当前用户不允许匿名发言 - throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); - } - } - else - { - if (myFriend == null) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); - } - } - if (myFriend?.Black == true) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasBlack); - } - - var message = new UserMessage( - long.Parse(chatMessage.MessageId), - chatMessage.FormUserId, - chatMessage.FormUserName, - chatMessage.Content, - chatMessage.MessageType); - - message.SendToUser(chatMessage.ToUserId.Value); - message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); - - await _messageRepository.InsertUserMessageAsync(message, cancellationToken); - } - - protected virtual async Task StoreGroupMessageAsync( - ChatMessage chatMessage, - long groupId, - CancellationToken cancellationToken = default) - { - var userHasBlacked = await _groupRepository - .UserHasBlackedAsync(groupId, chatMessage.FormUserId, cancellationToken); - if (userHasBlacked) - { - // 当前发送的用户已被拉黑 - throw new BusinessException(MessageServiceErrorCodes.GroupUserHasBlack); - } - var group = await _groupRepository.GetByIdAsync(groupId, cancellationToken); - if (!group.AllowSendMessage) - { - // 当前群组不允许发言 - throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeak); - } - if (chatMessage.IsAnonymous && !group.AllowAnonymous) - { - // 当前群组不允许匿名发言 - throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeakAnonymously); - } - - var message = new GroupMessage( - long.Parse(chatMessage.MessageId), - chatMessage.FormUserId, - chatMessage.FormUserName, - chatMessage.Content, - chatMessage.MessageType); - - message.SendToGroup(groupId); - message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); - - await _messageRepository.InsertGroupMessageAsync(message, cancellationToken); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class MessageStore : IMessageStore, ITransientDependency + { + private readonly IFriendStore _friendStore; + + private readonly IObjectMapper _objectMapper; + + private readonly ICurrentTenant _currentTenant; + + private readonly IUnitOfWorkManager _unitOfWorkManager; + + private readonly IGroupRepository _groupRepository; + + private readonly IMessageRepository _messageRepository; + + private readonly IUserChatSettingRepository _userChatSettingRepository; + public MessageStore( + IFriendStore friendStore, + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IGroupRepository groupRepository, + IMessageRepository messageRepository, + IUserChatSettingRepository userChatSettingRepository) + { + _friendStore = friendStore; + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _unitOfWorkManager = unitOfWorkManager; + _groupRepository = groupRepository; + _messageRepository = messageRepository; + _userChatSettingRepository = userChatSettingRepository; + } + + public virtual async Task StoreMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(chatMessage.TenantId)) + { + if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(chatMessage.GroupId); + await StoreGroupMessageAsync(chatMessage, groupId, cancellationToken); + } + else + { + await StoreUserMessageAsync(chatMessage, cancellationToken); + } + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + + public virtual async Task> GetGroupMessageAsync( + Guid? tenantId, + long groupId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var groupMessages = await _messageRepository + .GetGroupMessagesAsync(groupId, filter, sorting, type, skipCount, maxResultCount, cancellationToken); + + var chatMessages = _objectMapper.Map, List>(groupMessages); + + return chatMessages; + } + } + + public virtual async Task> GetChatMessageAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userMessages = await _messageRepository + .GetUserMessagesAsync(sendUserId, receiveUserId, filter, sorting, type, skipCount, maxResultCount, cancellationToken); + + var chatMessages = _objectMapper.Map, List>(userMessages); + + return chatMessages; + } + } + + public virtual async Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository + .GetLastMessagesByOneFriendAsync(userId, sorting, maxResultCount, cancellationToken); + } + } + + public virtual async Task GetGroupMessageCountAsync( + Guid? tenantId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository.GetCountAsync(groupId, filter, type, cancellationToken); + } + } + + public virtual async Task GetChatMessageCountAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, filter, type, cancellationToken); + } + } + + protected virtual async Task StoreUserMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default) + { + // 检查接收用户 + if (!chatMessage.ToUserId.HasValue) + { + throw new BusinessException(MessageServiceErrorCodes.UseNotFount); + } + + var myFriend = await _friendStore + .GetMemberAsync(chatMessage.TenantId, chatMessage.ToUserId.Value, chatMessage.FormUserId, cancellationToken); + + var userChatSetting = await _userChatSettingRepository + .FindByUserIdAsync(chatMessage.ToUserId.Value, cancellationToken); + + if (userChatSetting != null) + { + if (!userChatSetting.AllowReceiveMessage) + { + // 当前发送的用户不接收消息 + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); + } + + if (myFriend == null && !chatMessage.IsAnonymous) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); + } + + if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) + { + // 当前用户不允许匿名发言 + throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); + } + } + else + { + if (myFriend == null) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); + } + } + if (myFriend?.Black == true) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasBlack); + } + + var message = new UserMessage( + long.Parse(chatMessage.MessageId), + chatMessage.FormUserId, + chatMessage.FormUserName, + chatMessage.Content, + chatMessage.MessageType); + + message.SendToUser(chatMessage.ToUserId.Value); + message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); + + await _messageRepository.InsertUserMessageAsync(message, cancellationToken); + } + + protected virtual async Task StoreGroupMessageAsync( + ChatMessage chatMessage, + long groupId, + CancellationToken cancellationToken = default) + { + var userHasBlacked = await _groupRepository + .UserHasBlackedAsync(groupId, chatMessage.FormUserId, cancellationToken); + if (userHasBlacked) + { + // 当前发送的用户已被拉黑 + throw new BusinessException(MessageServiceErrorCodes.GroupUserHasBlack); + } + var group = await _groupRepository.GetByIdAsync(groupId, cancellationToken); + if (!group.AllowSendMessage) + { + // 当前群组不允许发言 + throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeak); + } + if (chatMessage.IsAnonymous && !group.AllowAnonymous) + { + // 当前群组不允许匿名发言 + throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeakAnonymously); + } + + var message = new GroupMessage( + long.Parse(chatMessage.MessageId), + chatMessage.FormUserId, + chatMessage.FormUserName, + chatMessage.Content, + chatMessage.MessageType); + + message.SendToGroup(groupId); + message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); + + await _messageRepository.InsertGroupMessageAsync(message, cancellationToken); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs index 8f8a50711..6e8f5184d 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs @@ -1,51 +1,64 @@ -using LINGYUN.Abp.IM; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class UserCardFinder : IUserCardFinder, ITransientDependency - { - private readonly ICurrentTenant _currentTenant; - private readonly IUserChatCardRepository _userChatCardRepository; - - public UserCardFinder( - ICurrentTenant currentTenant, - IUserChatCardRepository userChatCardRepository) - { - _currentTenant = currentTenant; - _userChatCardRepository = userChatCardRepository; - } - - public virtual async Task GetCountAsync(Guid? tenantId, string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMemberCountAsync(findUserName, startAge, endAge, sex); - } - } - - public virtual async Task> GetListAsync(Guid? tenantId, string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, string sorting = nameof(UserCard.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMembersAsync(findUserName, startAge, endAge, sex, - sorting, reverse, skipCount, maxResultCount); - } - } - - public virtual async Task GetMemberAsync(Guid? tenantId, Guid findUserId) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMemberAsync(findUserId); - } - } - } -} +using LINGYUN.Abp.IM; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class UserCardFinder : IUserCardFinder, ITransientDependency + { + private readonly ICurrentTenant _currentTenant; + private readonly IUserChatCardRepository _userChatCardRepository; + + public UserCardFinder( + ICurrentTenant currentTenant, + IUserChatCardRepository userChatCardRepository) + { + _currentTenant = currentTenant; + _userChatCardRepository = userChatCardRepository; + } + + public virtual async Task GetCountAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMemberCountAsync(findUserName, startAge, endAge, sex); + } + } + + public virtual async Task> GetListAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserCard.UserId), + int skipCount = 0, + int maxResultCount = 10) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMembersAsync(findUserName, startAge, endAge, sex, + sorting, skipCount, maxResultCount); + } + } + + public virtual async Task GetMemberAsync(Guid? tenantId, Guid findUserId) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMemberAsync(findUserId); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs index 7f687e70b..13dfd3495 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs @@ -1,80 +1,78 @@ -using LINGYUN.Abp.IM.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Group -{ - public interface IUserChatGroupRepository : IBasicRepository - { - /// - /// 成员是否在群组里 - /// - /// - /// - /// - Task MemberHasInGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员 - /// - /// - /// - /// - /// - Task GetMemberAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员数 - /// - /// - /// - /// - Task GetMembersCountAsync( - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员列表 - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetMembersAsync( - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取成员所在群组列表 - /// - /// - /// - /// - Task> GetMemberGroupsAsync( - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 从群组中移除成员 - /// - /// - /// - /// - /// - Task RemoveMemberFormGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Group +{ + public interface IUserChatGroupRepository : IBasicRepository + { + /// + /// 成员是否在群组里 + /// + /// + /// + /// + Task MemberHasInGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员 + /// + /// + /// + /// + /// + Task GetMemberAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员数 + /// + /// + /// + /// + Task GetMembersCountAsync( + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员列表 + /// + /// + /// + /// + /// + /// + /// + Task> GetMembersAsync( + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取成员所在群组列表 + /// + /// + /// + /// + Task> GetMemberGroupsAsync( + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 从群组中移除成员 + /// + /// + /// + /// + /// + Task RemoveMemberFormGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs index 1bb3a9191..f186e7d0a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs @@ -1,147 +1,146 @@ -using LINGYUN.Abp.IM.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Group -{ - public class UserGroupStore : IUserGroupStore, ITransientDependency - { - private readonly IObjectMapper _objectMapper; - private readonly ICurrentTenant _currentTenant; - private readonly IUnitOfWorkManager _unitOfWorkManager; - private readonly IUserChatGroupRepository _userChatGroupRepository; - - public UserGroupStore( - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IUserChatGroupRepository userChatGroupRepository) - { - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _unitOfWorkManager = unitOfWorkManager; - _userChatGroupRepository = userChatGroupRepository; - } - - public virtual async Task MemberHasInGroupAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); - } - } - - public virtual async Task AddUserToGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - Guid acceptUserId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(tenantId)) - { - var userHasInGroup = await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); - if (!userHasInGroup) - { - var userGroup = new UserChatGroup(groupId, userId, acceptUserId, tenantId); - - await _userChatGroupRepository.InsertAsync(userGroup, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - } - - public async Task GetUserGroupCardAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var groupUserCard = await _userChatGroupRepository.GetMemberAsync(groupId, userId, cancellationToken); - - return groupUserCard; - } - } - - public async Task> GetMembersAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersAsync(groupId, cancellationToken: cancellationToken); - } - } - - public async Task> GetUserGroupsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMemberGroupsAsync(userId, cancellationToken); - } - } - - public async Task RemoveUserFormGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(tenantId)) - { - await _userChatGroupRepository.RemoveMemberFormGroupAsync(groupId, userId, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - - public async Task GetMembersCountAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersCountAsync(groupId, cancellationToken); - } - } - - public async Task> GetMembersAsync( - Guid? tenantId, - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersAsync(groupId, sorting, reverse, skipCount, maxResultCount, cancellationToken); - } - } - } -} +using LINGYUN.Abp.IM.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Group +{ + public class UserGroupStore : IUserGroupStore, ITransientDependency + { + private readonly IObjectMapper _objectMapper; + private readonly ICurrentTenant _currentTenant; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IUserChatGroupRepository _userChatGroupRepository; + + public UserGroupStore( + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IUserChatGroupRepository userChatGroupRepository) + { + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _unitOfWorkManager = unitOfWorkManager; + _userChatGroupRepository = userChatGroupRepository; + } + + public virtual async Task MemberHasInGroupAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); + } + } + + public virtual async Task AddUserToGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + Guid acceptUserId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(tenantId)) + { + var userHasInGroup = await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); + if (!userHasInGroup) + { + var userGroup = new UserChatGroup(groupId, userId, acceptUserId, tenantId); + + await _userChatGroupRepository.InsertAsync(userGroup, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + } + + public async Task GetUserGroupCardAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var groupUserCard = await _userChatGroupRepository.GetMemberAsync(groupId, userId, cancellationToken); + + return groupUserCard; + } + } + + public async Task> GetMembersAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersAsync(groupId, cancellationToken: cancellationToken); + } + } + + public async Task> GetUserGroupsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMemberGroupsAsync(userId, cancellationToken); + } + } + + public async Task RemoveUserFormGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(tenantId)) + { + await _userChatGroupRepository.RemoveMemberFormGroupAsync(groupId, userId, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + + public async Task GetMembersCountAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersCountAsync(groupId, cancellationToken); + } + } + + public async Task> GetMembersAsync( + Guid? tenantId, + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersAsync(groupId, sorting, skipCount, maxResultCount, cancellationToken); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs index 16312df09..5af844aaf 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs @@ -1,48 +1,47 @@ -using LINGYUN.Abp.Notifications; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public interface IUserNotificationRepository : IBasicRepository - { - Task AnyAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationsAsync( - IEnumerable userNotifications, - CancellationToken cancellationToken = default); - - Task GetByIdAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task> GetNotificationsAsync( - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default); - - Task> GetListAsync( - Guid userId, - string filter = "", - string sorting = nameof(Notification.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.Notifications; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public interface IUserNotificationRepository : IBasicRepository + { + Task AnyAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationsAsync( + IEnumerable userNotifications, + CancellationToken cancellationToken = default); + + Task GetByIdAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task> GetNotificationsAsync( + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default); + + Task> GetListAsync( + Guid userId, + string filter = "", + string sorting = nameof(Notification.CreationTime), + NotificationReadState? readState = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs index 375f64dbf..3e7c04f10 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs @@ -1,439 +1,438 @@ -using LINGYUN.Abp.MessageService.Subscriptions; -using LINGYUN.Abp.Notifications; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Json; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Timing; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] - [ExposeServices(typeof(INotificationStore))] - public class NotificationStore : INotificationStore - { - private readonly IClock _clock; - - private readonly IObjectMapper _objectMapper; - - private readonly ICurrentTenant _currentTenant; - - private readonly IJsonSerializer _jsonSerializer; - - private readonly IUnitOfWorkManager _unitOfWorkManager; - - private readonly INotificationRepository _notificationRepository; - - private readonly IUserNotificationRepository _userNotificationRepository; - - private readonly IUserSubscribeRepository _userSubscribeRepository; - - public NotificationStore( - IClock clock, - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IJsonSerializer jsonSerializer, - IUnitOfWorkManager unitOfWorkManager, - INotificationRepository notificationRepository, - IUserSubscribeRepository userSubscribeRepository, - IUserNotificationRepository userNotificationRepository - ) - { - _clock = clock; - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _jsonSerializer = jsonSerializer; - _unitOfWorkManager = unitOfWorkManager; - _notificationRepository = notificationRepository; - _userSubscribeRepository = userSubscribeRepository; - _userNotificationRepository = userNotificationRepository; - } - - public virtual async Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var notification = await _userNotificationRepository.GetByIdAsync(userId, notificationId); - if (notification != null) - { - notification.ChangeReadState(readState); - await _userNotificationRepository.UpdateAsync(notification); - - await unitOfWork.SaveChangesAsync(); - } - } - } - - public virtual async Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var notify = await _notificationRepository.GetByIdAsync(notification.GetId(), cancellationToken); - await _notificationRepository.DeleteAsync(notify.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - await _notificationRepository.DeleteExpritionAsync(batchCount, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var notify = await _userNotificationRepository - .GetByIdAsync(userId, notificationId, cancellationToken); - await _userNotificationRepository - .DeleteAsync(notify.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - await _userSubscribeRepository - .DeleteUserSubscriptionAsync(notificationName, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var userSubscribe = await _userSubscribeRepository - .GetUserSubscribeAsync(notificationName, userId, cancellationToken); - await _userSubscribeRepository - .DeleteAsync(userSubscribe.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - await _userSubscribeRepository - .DeleteUserSubscriptionAsync(notificationName, identifiers.Select(ids => ids.UserId), cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notification = await _notificationRepository - .GetByIdAsync(notificationId, cancellationToken); - - return _objectMapper.Map(notification); - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptions = new List(); - - if (identifiers == null) - { - userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesAsync(notificationName, null, cancellationToken); - } - else - { - userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesAsync( - notificationName, - identifiers.Select(ids => ids.UserId), - cancellationToken); - } - - return _objectMapper.Map, List>(userSubscriptions); - } - } - - public virtual async Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notifications = await _userNotificationRepository - .GetNotificationsAsync(userId, readState, maxResultCount, cancellationToken); - - return _objectMapper.Map, List>(notifications); - } - } - - public virtual async Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userNotificationRepository - .GetCountAsync(userId, filter, readState, cancellationToken); - } - } - - public virtual async Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notifications = await _userNotificationRepository - .GetListAsync(userId, filter, sorting, reverse, readState, skipCount, maxResultCount, cancellationToken); - - return _objectMapper.Map, List>(notifications); - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptionNames = await _userSubscribeRepository - .GetUserSubscribesAsync(userId, cancellationToken); - - var userSubscriptions = new List(); - - userSubscriptionNames.ForEach(name => userSubscriptions.Add( - new NotificationSubscriptionInfo - { - UserId = userId, - TenantId = tenantId, - NotificationName = name - })); - - return userSubscriptions; - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesByNameAsync(userName, cancellationToken); - - var userSubscriptionInfos = new List(); - - userSubscriptions.ForEach(us => userSubscriptionInfos.Add( - new NotificationSubscriptionInfo - { - UserId = us.UserId, - TenantId = us.TenantId, - NotificationName = us.NotificationName - })); - - return userSubscriptionInfos; - } - } - - public virtual async Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var notify = new Notification( - notification.GetId(), - notification.Name, - notification.Data.GetType().AssemblyQualifiedName, - _jsonSerializer.Serialize(notification.Data), - notification.Severity, notification.TenantId) - { - CreationTime = _clock.Now, - Type = notification.Type, - // TODO: 通知过期时间应该可以配置 - ExpirationTime = _clock.Now.AddDays(60) - }; - - await _notificationRepository.InsertAsync(notify, cancellationToken: cancellationToken); - - notification.Id = notify.NotificationId.ToString(); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var userNotification = new UserNotification(notification.GetId(), userId, notification.TenantId); - await _userNotificationRepository - .InsertAsync(userNotification, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - - var userSubscription = new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId) - { - CreationTime = _clock.Now - }; - - await _userSubscribeRepository - .InsertAsync(userSubscription, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var userSubscribes = new List(); - - foreach (var identifier in identifiers) - { - userSubscribes.Add(new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId)); - } - - await _userSubscribeRepository - .InsertUserSubscriptionAsync(userSubscribes, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - return await _userSubscribeRepository - .UserSubscribeExistsAysnc(notificationName, userId, cancellationToken); - } - - public virtual async Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var userNofitications = new List(); - foreach (var userId in userIds) - { - // 重复检查 - // TODO:如果存在很多个订阅用户,这是个隐患 - if (!await _userNotificationRepository.AnyAsync(userId, notification.GetId(), cancellationToken)) - { - var userNofitication = new UserNotification(notification.GetId(), userId, notification.TenantId); - userNofitications.Add(userNofitication); - } - } - await _userNotificationRepository - .InsertUserNotificationsAsync(userNofitications, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } -} +using LINGYUN.Abp.MessageService.Subscriptions; +using LINGYUN.Abp.Notifications; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Timing; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] + [ExposeServices(typeof(INotificationStore))] + public class NotificationStore : INotificationStore + { + private readonly IClock _clock; + + private readonly IObjectMapper _objectMapper; + + private readonly ICurrentTenant _currentTenant; + + private readonly IJsonSerializer _jsonSerializer; + + private readonly IUnitOfWorkManager _unitOfWorkManager; + + private readonly INotificationRepository _notificationRepository; + + private readonly IUserNotificationRepository _userNotificationRepository; + + private readonly IUserSubscribeRepository _userSubscribeRepository; + + public NotificationStore( + IClock clock, + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IJsonSerializer jsonSerializer, + IUnitOfWorkManager unitOfWorkManager, + INotificationRepository notificationRepository, + IUserSubscribeRepository userSubscribeRepository, + IUserNotificationRepository userNotificationRepository + ) + { + _clock = clock; + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _jsonSerializer = jsonSerializer; + _unitOfWorkManager = unitOfWorkManager; + _notificationRepository = notificationRepository; + _userSubscribeRepository = userSubscribeRepository; + _userNotificationRepository = userNotificationRepository; + } + + public virtual async Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var notification = await _userNotificationRepository.GetByIdAsync(userId, notificationId); + if (notification != null) + { + notification.ChangeReadState(readState); + await _userNotificationRepository.UpdateAsync(notification); + + await unitOfWork.SaveChangesAsync(); + } + } + } + + public virtual async Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var notify = await _notificationRepository.GetByIdAsync(notification.GetId(), cancellationToken); + await _notificationRepository.DeleteAsync(notify.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + await _notificationRepository.DeleteExpritionAsync(batchCount, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var notify = await _userNotificationRepository + .GetByIdAsync(userId, notificationId, cancellationToken); + await _userNotificationRepository + .DeleteAsync(notify.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + await _userSubscribeRepository + .DeleteUserSubscriptionAsync(notificationName, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var userSubscribe = await _userSubscribeRepository + .GetUserSubscribeAsync(notificationName, userId, cancellationToken); + await _userSubscribeRepository + .DeleteAsync(userSubscribe.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + await _userSubscribeRepository + .DeleteUserSubscriptionAsync(notificationName, identifiers.Select(ids => ids.UserId), cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notification = await _notificationRepository + .GetByIdAsync(notificationId, cancellationToken); + + return _objectMapper.Map(notification); + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptions = new List(); + + if (identifiers == null) + { + userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesAsync(notificationName, null, cancellationToken); + } + else + { + userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesAsync( + notificationName, + identifiers.Select(ids => ids.UserId), + cancellationToken); + } + + return _objectMapper.Map, List>(userSubscriptions); + } + } + + public virtual async Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notifications = await _userNotificationRepository + .GetNotificationsAsync(userId, readState, maxResultCount, cancellationToken); + + return _objectMapper.Map, List>(notifications); + } + } + + public virtual async Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userNotificationRepository + .GetCountAsync(userId, filter, readState, cancellationToken); + } + } + + public virtual async Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notifications = await _userNotificationRepository + .GetListAsync(userId, filter, sorting, readState, skipCount, maxResultCount, cancellationToken); + + return _objectMapper.Map, List>(notifications); + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptionNames = await _userSubscribeRepository + .GetUserSubscribesAsync(userId, cancellationToken); + + var userSubscriptions = new List(); + + userSubscriptionNames.ForEach(name => userSubscriptions.Add( + new NotificationSubscriptionInfo + { + UserId = userId, + TenantId = tenantId, + NotificationName = name + })); + + return userSubscriptions; + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesByNameAsync(userName, cancellationToken); + + var userSubscriptionInfos = new List(); + + userSubscriptions.ForEach(us => userSubscriptionInfos.Add( + new NotificationSubscriptionInfo + { + UserId = us.UserId, + TenantId = us.TenantId, + NotificationName = us.NotificationName + })); + + return userSubscriptionInfos; + } + } + + public virtual async Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var notify = new Notification( + notification.GetId(), + notification.Name, + notification.Data.GetType().AssemblyQualifiedName, + _jsonSerializer.Serialize(notification.Data), + notification.Severity, notification.TenantId) + { + CreationTime = _clock.Now, + Type = notification.Type, + // TODO: 通知过期时间应该可以配置 + ExpirationTime = _clock.Now.AddDays(60) + }; + + await _notificationRepository.InsertAsync(notify, cancellationToken: cancellationToken); + + notification.Id = notify.NotificationId.ToString(); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var userNotification = new UserNotification(notification.GetId(), userId, notification.TenantId); + await _userNotificationRepository + .InsertAsync(userNotification, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + + var userSubscription = new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId) + { + CreationTime = _clock.Now + }; + + await _userSubscribeRepository + .InsertAsync(userSubscription, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var userSubscribes = new List(); + + foreach (var identifier in identifiers) + { + userSubscribes.Add(new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId)); + } + + await _userSubscribeRepository + .InsertUserSubscriptionAsync(userSubscribes, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + return await _userSubscribeRepository + .UserSubscribeExistsAysnc(notificationName, userId, cancellationToken); + } + + public virtual async Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var userNofitications = new List(); + foreach (var userId in userIds) + { + // 重复检查 + // TODO:如果存在很多个订阅用户,这是个隐患 + if (!await _userNotificationRepository.AnyAsync(userId, notification.GetId(), cancellationToken)) + { + var userNofitication = new UserNotification(notification.GetId(), userId, notification.TenantId); + userNofitications.Add(userNofitication); + } + } + await _userNotificationRepository + .InsertUserNotificationsAsync(userNofitications, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs index aa6d6c13b..eac37b464 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs @@ -1,254 +1,257 @@ -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using LINGYUN.Abp.MessageService.Group; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreMessageRepository : EfCoreRepository, - IMessageRepository, ITransientDependency - { - public EfCoreMessageRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task GetGroupMessageAsync( - long id, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.MessageId.Equals(id)) - .AsNoTracking() - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetGroupMessagesAsync( - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - var groupMessages = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return groupMessages; - } - - public virtual async Task GetGroupMessagesCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var groupMessagesCount = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - return groupMessagesCount; - } - - public virtual async Task> GetUserGroupMessagesAsync( - Guid sendUserId, - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - var groupMessages = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return groupMessages; - } - - public virtual async Task GetUserGroupMessagesCountAsync( - Guid sendUserId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var groupMessagesCount = await (await GetDbContextAsync()).Set() - .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - return groupMessagesCount; - } - - public virtual async Task GetCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetUserMessageAsync( - long id, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.MessageId.Equals(id)) - .AsNoTracking() - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetLastMessagesByOneFriendAsync( - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(LastChatMessage.SendTime); - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var groupMsgQuery = dbContext.Set() - .Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId) - .GroupBy(msg => new { msg.CreatorId, msg.ReceiveUserId }) - .Select(msg => new - { - msg.Key.CreatorId, - msg.Key.ReceiveUserId, - MessageId = msg.Max(x => x.MessageId) - }); - - var userMessageQuery = from msg in dbContext.Set() - join gMsg in groupMsgQuery - on msg.MessageId equals gMsg.MessageId - select new LastChatMessage - { - Content = msg.Content, - SendTime = msg.CreationTime, - FormUserId = msg.CreatorId.Value, - FormUserName = msg.SendUserName, - MessageId = msg.MessageId.ToString(), - MessageType = msg.Type, - TenantId = msg.TenantId, - ToUserId = msg.ReceiveUserId - }; - - return await userMessageQuery - .OrderBy(sorting) - .Take(maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetUserMessagesAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserMessage.MessageId); - sorting = reverse ? sorting + " desc" : sorting; - var userMessages = await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return userMessages; - } - - public virtual async Task GetUserMessagesCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var userMessagesCount = await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - - return userMessagesCount; - } - - public virtual async Task InsertGroupMessageAsync( - GroupMessage groupMessage, - CancellationToken cancellationToken = default) - { - await (await GetDbContextAsync()).Set() - .AddAsync(groupMessage, GetCancellationToken(cancellationToken)); - } - - public virtual async Task InsertUserMessageAsync( - UserMessage userMessage, - CancellationToken cancellationToken = default) - { - await (await GetDbContextAsync()).Set() - .AddAsync(userMessage, GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.MessageService.Group; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreMessageRepository : EfCoreRepository, + IMessageRepository, ITransientDependency + { + public EfCoreMessageRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task GetGroupMessageAsync( + long id, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.MessageId.Equals(id)) + .AsNoTracking() + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetGroupMessagesAsync( + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var groupMessages = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return groupMessages; + } + + public virtual async Task GetGroupMessagesCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var groupMessagesCount = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + return groupMessagesCount; + } + + public virtual async Task> GetUserGroupMessagesAsync( + Guid sendUserId, + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var groupMessages = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return groupMessages; + } + + public virtual async Task GetUserGroupMessagesCountAsync( + Guid sendUserId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var groupMessagesCount = await (await GetDbContextAsync()).Set() + .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + return groupMessagesCount; + } + + public virtual async Task GetCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetUserMessageAsync( + long id, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.MessageId.Equals(id)) + .AsNoTracking() + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var groupMsgQuery = dbContext.Set() + .Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId) + .GroupBy(msg => new { msg.CreatorId, msg.ReceiveUserId }) + .Select(msg => new + { + msg.Key.CreatorId, + msg.Key.ReceiveUserId, + MessageId = msg.Max(x => x.MessageId) + }); + + var userMessageQuery = from msg in dbContext.Set() + join gMsg in groupMsgQuery + on msg.MessageId equals gMsg.MessageId + select new LastChatMessage + { + Content = msg.Content, + SendTime = msg.CreationTime, + FormUserId = msg.CreatorId.Value, + FormUserName = msg.SendUserName, + MessageId = msg.MessageId.ToString(), + MessageType = msg.Type, + TenantId = msg.TenantId, + ToUserId = msg.ReceiveUserId + }; + + return await userMessageQuery + .OrderBy(sorting ?? nameof(LastChatMessage.SendTime)) + .Take(maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUserMessagesAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var userMessages = await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(UserMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return userMessages; + } + + public virtual async Task GetUserMessagesCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var userMessagesCount = await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + + return userMessagesCount; + } + + public virtual async Task InsertGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default) + { + await (await GetDbContextAsync()).Set() + .AddAsync(groupMessage, GetCancellationToken(cancellationToken)); + } + + public virtual async Task UpdateGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default) + { + (await GetDbContextAsync()).Set().Update(groupMessage); + } + + public virtual async Task InsertUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default) + { + await (await GetDbContextAsync()).Set() + .AddAsync(userMessage, GetCancellationToken(cancellationToken)); + } + + public virtual async Task UpdateUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default) + { + (await GetDbContextAsync()).Set().Update(userMessage); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs index 637df17ef..52e22f3c9 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs @@ -1,63 +1,74 @@ -using LINGYUN.Abp.IM; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreUserChatCardRepository : EfCoreRepository, IUserChatCardRepository - { - public EfCoreUserChatCardRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task CheckUserIdExistsAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucc => ucc.UserId == userId, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberAsync(Guid findUserId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .Where(ucc => ucc.UserId == findUserId) - .Select(ucc => ucc.ToUserCard()) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberCountAsync(string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) - .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) - .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) - .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync(string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, string sorting = nameof(UserChatCard.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10, CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserChatCard.UserId); - sorting = reverse ? sorting + " desc" : sorting; - return await (await GetDbSetAsync()) - .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) - .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) - .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) - .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .Select(ucc => ucc.ToUserCard()) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreUserChatCardRepository : EfCoreRepository, IUserChatCardRepository + { + public EfCoreUserChatCardRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task CheckUserIdExistsAsync(Guid userId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucc => ucc.UserId == userId, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberAsync(Guid findUserId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(ucc => ucc.UserId == findUserId) + .Select(ucc => ucc.ToUserCard()) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberCountAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) + .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) + .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) + .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) + .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) + .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) + .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) + .OrderBy(sorting ?? nameof(UserChatCard.UserId)) + .PageBy(skipCount, maxResultCount) + .Select(ucc => ucc.ToUserCard()) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs index 7cd10cc41..27bb479bc 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs @@ -1,220 +1,221 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreUserChatFriendRepository : EfCoreRepository, IUserChatFriendRepository - { - public EfCoreUserChatFriendRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task FindByUserFriendIdAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .Where(ucf => ucf.UserId == userId && ucf.FrientId == friendId) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetAllMembersAsync( - Guid userId, - string sorting = nameof(UserChatFriend.RemarkName), - bool reverse = false, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - // on ucf.FrientId equals ucc.UserId // 查询双向好友的 - on ucf.UserId equals ucc.UserId - where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName ?? ucc.NickName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .OrderBy(sorting ?? $"{nameof(UserChatFriend.RemarkName)} DESC") - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId && ucf.FrientId == friendId && ucf.Status == UserFriendStatus.Added - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync(Guid userId, string filter = "", string sorting = nameof(UserChatFriend.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10, CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - - var dbContext = await GetDbContextAsync(); - // 过滤用户资料 - var userChatCardQuery = dbContext.Set() - .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); - - // 过滤好友资料 - var userChatFriendQuery = dbContext.Set() - .Where(ucf => ucf.Status == UserFriendStatus.Added) - .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); - - // 组合查询 - var userFriendQuery = from ucf in userChatFriendQuery - join ucc in userChatCardQuery // TODO: Need LEFT JOIN? - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetLastContactMembersAsync( - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userReceiveMsgQuery = dbContext.Set() - .Where(um => um.ReceiveUserId == userId); - - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - on ucf.FrientId equals ucc.UserId - join um in userReceiveMsgQuery - on ucc.UserId equals um.CreatorId - where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added - orderby um.CreationTime descending // 消息创建时间倒序 - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMembersCountAsync(Guid userId, string filter = "", CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userChatCardQuery = dbContext.Set() - .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); - - var userChatFriendQuery = dbContext.Set() - .Where(ucf => ucf.Status == UserFriendStatus.Added) - .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); - - var userFriendQuery = from ucf in userChatFriendQuery - join ucc in userChatCardQuery - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId - select ucc; - - return await userFriendQuery - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task IsFriendAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId && ucf.Status == UserFriendStatus.Added, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task IsAddedAsync(Guid userId, Guid frientId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId, - GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreUserChatFriendRepository : EfCoreRepository, IUserChatFriendRepository + { + public EfCoreUserChatFriendRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task FindByUserFriendIdAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(ucf => ucf.UserId == userId && ucf.FrientId == friendId) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + // on ucf.FrientId equals ucc.UserId // 查询双向好友的 + on ucf.UserId equals ucc.UserId + where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName ?? ucc.NickName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .OrderBy(sorting ?? nameof(UserChatFriend.RemarkName)) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId && ucf.FrientId == friendId && ucf.Status == UserFriendStatus.Added + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + Guid userId, + string filter = "", + string sorting = nameof(UserChatFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + // 过滤用户资料 + var userChatCardQuery = dbContext.Set() + .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); + + // 过滤好友资料 + var userChatFriendQuery = dbContext.Set() + .Where(ucf => ucf.Status == UserFriendStatus.Added) + .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); + + // 组合查询 + var userFriendQuery = from ucf in userChatFriendQuery + join ucc in userChatCardQuery // TODO: Need LEFT JOIN? + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .OrderBy(sorting ?? nameof(UserChatFriend.UserId)) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetLastContactMembersAsync( + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userReceiveMsgQuery = dbContext.Set() + .Where(um => um.ReceiveUserId == userId); + + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + on ucf.FrientId equals ucc.UserId + join um in userReceiveMsgQuery + on ucc.UserId equals um.CreatorId + where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added + orderby um.CreationTime descending // 消息创建时间倒序 + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMembersCountAsync(Guid userId, string filter = "", CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userChatCardQuery = dbContext.Set() + .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); + + var userChatFriendQuery = dbContext.Set() + .Where(ucf => ucf.Status == UserFriendStatus.Added) + .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); + + var userFriendQuery = from ucf in userChatFriendQuery + join ucc in userChatCardQuery + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId + select ucc; + + return await userFriendQuery + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task IsFriendAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId && ucf.Status == UserFriendStatus.Added, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task IsAddedAsync(Guid userId, Guid frientId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId, + GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs index 39635bc6d..65ba42e36 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs @@ -1,171 +1,167 @@ -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.MessageService.Chat; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Group -{ - public class EfCoreUserChatGroupRepository : EfCoreRepository, - IUserChatGroupRepository, ITransientDependency - { - public EfCoreUserChatGroupRepository( - IDbContextProvider dbContextProvider) : base(dbContextProvider) - { - } - - public virtual async Task GetMemberAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId && ugc.UserId == userId - select new GroupUserCard - { - TenantId = uc.TenantId, - UserId = uc.UserId, - UserName = uc.UserName, - Age = uc.Age, - AvatarUrl = uc.AvatarUrl, - IsAdmin = ugc.IsAdmin, - IsSuperAdmin = gp.AdminUserId == uc.UserId, - GroupId = gp.GroupId, - Birthday = uc.Birthday, - Description = uc.Description, - NickName = ugc.NickName ?? uc.NickName, - Sex = uc.Sex, - Sign = uc.Sign - }; - - return await cardQuery - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync( - long groupId, - string sorting = nameof(UserChatCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserChatCard.UserId); - sorting = reverse ? sorting + " desc" : sorting; - - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId - select new GroupUserCard - { - TenantId = uc.TenantId, - UserId = uc.UserId, - UserName = uc.UserName, - Age = uc.Age, - AvatarUrl = uc.AvatarUrl, - IsAdmin = ugc.IsAdmin, - IsSuperAdmin = gp.AdminUserId == uc.UserId, - GroupId = gp.GroupId, - Birthday = uc.Birthday, - Description = uc.Description, - NickName = ugc.NickName ?? uc.NickName, - Sex = uc.Sex, - Sign = uc.Sign - }; - - return await cardQuery - .OrderBy(sorting ?? nameof(UserChatCard.UserId)) - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMembersCountAsync( - long groupId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId - select ucg; - - return await cardQuery - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task MemberHasInGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .AnyAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMemberGroupsAsync( - Guid userId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var groupQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - where ucg.UserId.Equals(userId) - group ucg by new - { - gp.AllowAnonymous, - gp.AllowSendMessage, - gp.MaxUserCount, - gp.Name - } - into cg - select new IM.Group.Group - { - AllowAnonymous = cg.Key.AllowAnonymous, - AllowSendMessage = cg.Key.AllowSendMessage, - MaxUserLength = cg.Key.MaxUserCount, - Name = cg.Key.Name, - GroupUserCount = cg.Count() - }; - - return await groupQuery - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task RemoveMemberFormGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - await DeleteAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, cancellationToken: GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.MessageService.Chat; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Group +{ + public class EfCoreUserChatGroupRepository : EfCoreRepository, + IUserChatGroupRepository, ITransientDependency + { + public EfCoreUserChatGroupRepository( + IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public virtual async Task GetMemberAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId && ugc.UserId == userId + select new GroupUserCard + { + TenantId = uc.TenantId, + UserId = uc.UserId, + UserName = uc.UserName, + Age = uc.Age, + AvatarUrl = uc.AvatarUrl, + IsAdmin = ugc.IsAdmin, + IsSuperAdmin = gp.AdminUserId == uc.UserId, + GroupId = gp.GroupId, + Birthday = uc.Birthday, + Description = uc.Description, + NickName = ugc.NickName ?? uc.NickName, + Sex = uc.Sex, + Sign = uc.Sign + }; + + return await cardQuery + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + long groupId, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId + select new GroupUserCard + { + TenantId = uc.TenantId, + UserId = uc.UserId, + UserName = uc.UserName, + Age = uc.Age, + AvatarUrl = uc.AvatarUrl, + IsAdmin = ugc.IsAdmin, + IsSuperAdmin = gp.AdminUserId == uc.UserId, + GroupId = gp.GroupId, + Birthday = uc.Birthday, + Description = uc.Description, + NickName = ugc.NickName ?? uc.NickName, + Sex = uc.Sex, + Sign = uc.Sign + }; + + return await cardQuery + .OrderBy(sorting ?? nameof(UserChatCard.UserId)) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMembersCountAsync( + long groupId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId + select ucg; + + return await cardQuery + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task MemberHasInGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .AnyAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMemberGroupsAsync( + Guid userId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var groupQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + where ucg.UserId.Equals(userId) + group ucg by new + { + gp.AllowAnonymous, + gp.AllowSendMessage, + gp.MaxUserCount, + gp.Name + } + into cg + select new IM.Group.Group + { + AllowAnonymous = cg.Key.AllowAnonymous, + AllowSendMessage = cg.Key.AllowSendMessage, + MaxUserLength = cg.Key.MaxUserCount, + Name = cg.Key.Name, + GroupUserCount = cg.Count() + }; + + return await groupQuery + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task RemoveMemberFormGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + await DeleteAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, cancellationToken: GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs index 6464527aa..0654ba881 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs @@ -1,133 +1,129 @@ -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using LINGYUN.Abp.Notifications; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public class EfCoreUserNotificationRepository : EfCoreRepository, - IUserNotificationRepository, ITransientDependency - { - public EfCoreUserNotificationRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task AnyAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId), - GetCancellationToken(cancellationToken)); - } - - public virtual async Task InsertUserNotificationsAsync( - IEnumerable userNotifications, - CancellationToken cancellationToken = default) - { - await (await GetDbSetAsync()).AddRangeAsync(userNotifications, GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetByIdAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - var userNofitication = await (await GetDbSetAsync()) - .Where(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId)) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - - return userNofitication; - } - - public virtual async Task> GetNotificationsAsync( - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .OrderBy(nameof(Notification.CreationTime) + " DESC") - .Take(maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetCountAsync( - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .WhereIf(!filter.IsNullOrWhiteSpace(), nf => - nf.NotificationName.Contains(filter) || - nf.NotificationTypeName.Contains(filter)) - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetListAsync( - Guid userId, - string filter = "", - string sorting = nameof(Notification.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(Notification.CreationTime); - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .WhereIf(!filter.IsNullOrWhiteSpace(), nf => - nf.NotificationName.Contains(filter) || - nf.NotificationTypeName.Contains(filter)) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.Notifications; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public class EfCoreUserNotificationRepository : EfCoreRepository, + IUserNotificationRepository, ITransientDependency + { + public EfCoreUserNotificationRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task AnyAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId), + GetCancellationToken(cancellationToken)); + } + + public virtual async Task InsertUserNotificationsAsync( + IEnumerable userNotifications, + CancellationToken cancellationToken = default) + { + await (await GetDbSetAsync()).AddRangeAsync(userNotifications, GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetByIdAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + var userNofitication = await (await GetDbSetAsync()) + .Where(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId)) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + return userNofitication; + } + + public virtual async Task> GetNotificationsAsync( + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .OrderBy(nameof(Notification.CreationTime) + " DESC") + .Take(maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .WhereIf(!filter.IsNullOrWhiteSpace(), nf => + nf.NotificationName.Contains(filter) || + nf.NotificationTypeName.Contains(filter)) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetListAsync( + Guid userId, + string filter = "", + string sorting = nameof(Notification.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .WhereIf(!filter.IsNullOrWhiteSpace(), nf => + nf.NotificationName.Contains(filter) || + nf.NotificationTypeName.Contains(filter)) + .OrderBy(sorting ??= nameof(Notification.CreationTime)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj index 359b2c6a8..7f70d5817 100644 --- a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj +++ b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj @@ -1,4 +1,4 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs index f72cbcb8c..cf692fda7 100644 --- a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs +++ b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs @@ -1,6 +1,5 @@ using LINGYUN.Abp.WeChat.Localization; using Microsoft.Extensions.DependencyInjection; -using Polly; using System; using Volo.Abp.Caching; using Volo.Abp.Features; @@ -37,8 +36,7 @@ namespace LINGYUN.Abp.WeChat options => { options.BaseAddress = new Uri("https://api.weixin.qq.com"); - }).AddTransientHttpErrorPolicy(builder => - builder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i)))); + }); } } } diff --git a/aspnet-core/services/account/AuthServer.Host/Startup.cs b/aspnet-core/services/account/AuthServer.Host/Startup.cs index 5f469b45f..ed49d6522 100644 --- a/aspnet-core/services/account/AuthServer.Host/Startup.cs +++ b/aspnet-core/services/account/AuthServer.Host/Startup.cs @@ -1,20 +1,33 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace AuthServer.Host -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace AuthServer.Host +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs index 263345da7..dd05df80c 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs @@ -1,23 +1,16 @@ using DotNetCore.CAP; -using LINGYUN.Abp.Aliyun.SettingManagement; using LINGYUN.Abp.AspNetCore.HttpOverrides; using LINGYUN.Abp.Auditing; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.FeatureManagement; -using LINGYUN.Abp.LocalizationManagement; using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; -using LINGYUN.Abp.MessageService; using LINGYUN.Abp.MultiTenancy.DbFinder; -using LINGYUN.Abp.OssManagement; using LINGYUN.Abp.PermissionManagement.Identity; using LINGYUN.Abp.SettingManagement; using LINGYUN.Abp.Sms.Aliyun; using LINGYUN.Abp.TenantManagement; -using LINGYUN.Abp.WeChat.SettingManagement; -using LINGYUN.ApiGateway; -using LINGYUN.Platform; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; @@ -51,7 +44,6 @@ using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.Identity.Localization; using Volo.Abp.IdentityServer.EntityFrameworkCore; -using Volo.Abp.Json; using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Localization; using Volo.Abp.Modularity; @@ -71,14 +63,6 @@ namespace LINGYUN.Abp.BackendAdmin { [DependsOn( typeof(AbpAspNetCoreMvcUiMultiTenancyModule), - typeof(PlatformApplicationContractModule), - typeof(ApiGatewayApplicationContractsModule), - typeof(AbpOssManagementApplicationContractsModule), - typeof(AbpMessageServiceApplicationContractsModule), - typeof(AbpLocalizationManagementApplicationContractsModule), - typeof(LINGYUN.Abp.Account.AbpAccountApplicationContractsModule),// 引用类似的包主要用于聚合权限管理和设置 - typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationContractsModule), - typeof(LINGYUN.Abp.IdentityServer.AbpIdentityServerApplicationContractsModule), typeof(AbpSettingManagementApplicationModule), typeof(AbpSettingManagementHttpApiModule), typeof(AbpPermissionManagementApplicationModule), @@ -90,8 +74,6 @@ namespace LINGYUN.Abp.BackendAdmin typeof(AbpAuditingHttpApiModule), typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementHttpApiModule), - typeof(AbpWeChatSettingManagementModule),// 微信配置管理模块 - typeof(AbpAliyunSettingManagementModule),// 阿里云配置管理模块 typeof(AbpEntityFrameworkCoreMySQLModule), typeof(AbpIdentityEntityFrameworkCoreModule),// 用户角色权限需要引用包 typeof(AbpIdentityServerEntityFrameworkCoreModule), // 客户端权限需要引用包 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile index d6224c2ed..e3a75024b 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile @@ -1,13 +1,14 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0 -LABEL maintainer="colin.in@foxmail.com" -WORKDIR /app - -COPY . /app - -ENV TZ=Asia/Shanghai -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone - -EXPOSE 80/tcp -VOLUME [ "./app/Logs" ] - -ENTRYPOINT ["dotnet", "LINGYUN.Abp.BackendAdmin.HttpApi.Host.dll"] +FROM mcr.microsoft.com/dotnet/aspnet:5.0 +LABEL maintainer="colin.in@foxmail.com" +WORKDIR /app + +COPY . /app + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone + +EXPOSE 80/tcp +VOLUME [ "./app/Logs" ] +VOLUME [ "./app/Modules" ] + +ENTRYPOINT ["dotnet", "LINGYUN.Abp.BackendAdmin.HttpApi.Host.dll"] diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj index 6e3d9a6a5..78f076351 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj @@ -59,37 +59,25 @@ - - - - - - - + - - - - - - diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..a5cb1e8f19d9aaa49eb7d64ef7bf5f2e274de0ee GIT binary patch literal 12800 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll new file mode 100644 index 0000000000000000000000000000000000000000..27ffae253ee45e90c4032caa6930dd60965cc8fa GIT binary patch literal 21504 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 S`?nwC|DW*xfB)}A;J*M=^#n=) literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll new file mode 100644 index 0000000000000000000000000000000000000000..8ed2a44363e471640d31971212d8db06cf1a9eb7 GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll new file mode 100644 index 0000000000000000000000000000000000000000..07dbae98f20bbf89b262a4e1b0defec4fdfcff1e GIT binary patch literal 25088 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 FzW}x+y_Wz0 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..541e5555ce765f3f408510d077b1f5c696bee881 GIT binary patch literal 24064 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 O{JYNO?=v?=3H*OU^mNzElyrA>s=AR$ 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll new file mode 100644 index 0000000000000000000000000000000000000000..edc4fc37559b30a4c19004836b23c8bf83a198bc GIT binary patch literal 49664 zcmd?S3w%`7wLiZ0nP(=+Br|ycA;5%}1Az#L2nt9bs3_w530RdwO6a&Tk-#0Ywt62CJ%3W|NZ~||Ig1_S$Q&z4qFVv(Gt`IcHu?E+TT{`}NmEyO8o{n!s-c9moz2`gxEZ$$PPCmzw=z z)uOeHsYpvQu_hT?AE}QuHz!&ntKyMlTXUqbIZ`)oVPt)xAzo8h7#M0)&!0&&Te;|h z*QdT{*LIKwNAlGeqMw7~)!ZYmB8}jC5MQEV!7Xh!GuVFlL=+MD{BhCBOIVcuXH!Em z3!i(TcOD}LiLPfybo(eO0B_6hi57Ls`vyjY$nVJZgFeMU*R;krwt{x=20)&))z}S6 zJ`tjoHOW-69+cR25C}K)aeN)0Y3Qz+WV|T>LAI61_+XC^88D4#dWJB_LG~*?Y@01FkSd`x6Bcl>ju7xXdJ} zA7xyL0pPYRWkGLrAn^SCTq-&Us5=?~9PRgAp%wbB;H-jb@{dG$)`O_wcxF9ST-F!x zCSglUbTAhz@+MKSA*^b5pMq+4xfCC4MTbCwMh>*vA@3eJ*m9)>0R#P_8G?X;8Z<+Y z>#RN^YDEry-%V*2vLesGkThpoQN%hF9}km;0gDDXsBL>sfEc=z?H$gUsIoc{1s3oo zJP^$HjT&g@L24Y<=fsn4;3Viy$0hZoS94mHhP`g@W-f>TMQf@x z5uE^i@T0^R*M$~@QhgkCHE}^Jo#e!oUeAd;-OPz6o!|s@wMgnopT}ugdL1X5xghF- z@u-W5ZgrvIp;U#Vt_@t!N^j=Gl|G*ncX}fyp7bV8P}c>LdeZHjmZjS`*~|q|7mP<; zOz67M1Nk7hCkjkj$ms={o^YjE0N&?(%afMuaaQy=xJ3q;_Kk}$SP4B8A}cx1O~kx|9Xx^U!!b$5vmDPlXqnQF)l)r2-RbJlpeu^Fsgu( zsJA6`Jc?d`fr0T8$ge&ztfG^F6`0~-D>?;aVk$uS5mlHssxmhR0tldhwtxu5r-2;3 z>p)Rh9Vy2M?VqRxgI?#hsbZcR2hi+Bf^9@MW?Yk+4xuy~Y$a#Ftnw=mVJeEri${0~ z>_?~aoQ!rQ!EJHrJd5Y_7Pn2LKm;??C7?W4z<#4htM21a9rTnQalskI(0UV>^=M6G z4x4*T+vsGA8;Ro& zLy0>b@fXGN?+qa2IJQmP)n?+(M4XkVL)#H=!^!3(ALcq|f?eYFhTL}KN!zlK_tS2X z=PmJ6Q^|qIpuq89dD6b#V&{^UMc}5K&f8u1A8O7XKUEf6=ukV+*vKAEUd}X zq0I9|2}VaKz^mv`cIn893&G`SwnI|(1@He#;EU7%ncv;%iy%RkD>@4$Fm1tuMIckB za$`?pEu1+U2$u1ID3hAQIhb;*^L>~e5q1MI678(alZtb&&Xcm$0rGhgSnIIdjKnPL zik=1B9mSHC-H!}`O{LO5+6?qB`dioPj$$?S=3^q4@qwnzXT>9Hl8?e)x?NaC5F)ai zpqurIFUYFQr0GhtgyoK68Ain;S-nQtAMgu;fy&q~gTybcbO+?gLZh*{@7icMX#`mp zehVVQM)w(hVJDCy-XXT&unx`?ovg{Q02!a^2I z(XxVoQEoE?0i%!25Cn|AHbW3F`Z0ssb~@U|pR6~cjqC;s*87ILQVY08*9pfHT`wtS z_wzL3j;1u?jV1(1ErfVlltU-)g}DD<7SC5$Hmeau=s`qL6v5_oB^FC0=w(8D-5>I> zIz-8*(T7%aEyR+a1Le^jkQpB4SFrgDGB&4{a<#%N8RH>DB%z_GGx^_K66;;{a4Wh| zYFx%@yraUD^eA5cW`Ite0e}sLNVpKCKY{45{KT1HlTUUD+?EN@i?;QySGUeXh{qzk zKEyOO1Xu-iEMeZ&b6;<^X&rqii7kAKEBOSVG(E@0#ByjI&Vd7exkrw(+HvXPPGIB& zm>9ssIZTL8F@4D=<1cp_(>1oSdP~bHENj>i-z8{uY6Xh*Nv#A-vl_{`lryk`BLf@P zK$Z*G{f;-eBw%6j3NOqCIRfW;OnQl_!`?U`x;4cd=QMlxQ=3y@bYD2Ad1aG zwOP>F_ZYK;YHb-8U$tcOwGPWST6|+CX0F#O-%Fb-c-q2q#+AU|)EFVF1f$fvoN9)P2KKEw5vcrjah;bVnH^Ht>OoxJU2ydPco1C4W=ZUt|U zv}qH}3Z#Z&qRIDJ?cBi$49Y+nJ%Pz8nr5pp)q8zMyu)}lYC&ccjOr++zv=?C7=sy& zEe*SPaB^!yZf^n|gZUY}Ht$t47VAAfN_+~5Cn{<%@72P5jH~*FwlissUTof+YCW2 z&5X(9SPLWlX7;v~LI?+)@&e=gq@L)0NpU^-93x!a3@$stvNq2I5-ou} zShb?RLv{jo2S(1dj(FbymHG~-KB=wDLtFc!&6s>?u*BSX7=-<=V4$zWPr(&+9rWdw z7x-{da~TTZ=q*PI8`2VTS<&A@ceE7Mc5-o|1NnZ;z0u3L$m^y|i5oMpd!&7>J#LK zP$&Uq(%&b8(0c=PC&B(uYLwXHN?(U8(+-%l4HP0#Zxpx`?|Mh`@&O~zHLx|1X4TxS z3pnKoR1h#0+6+O!SY$H<0b{YvFo?N0VP7e6_%PT;QTRfSn*UGoi{ZoJY-j384yR3k|Si!jtEZ|(nJ)F4HKjy@fzL%4-^xd3n zWz>_k&!}NQkH&zlg%s$-B|qKDJF7s zvv06F38hZZy5Z|UdN&ue(!b!umHs&=?(}1vc+!t^0^dBrX<2#~C!4td>KG(-FcH1Q z;Tx`F4A(JL*Rh4`_;)U7rGLqZEBzEF?(|+xJn5%7K^^-zElXo$qYf^BIwDdB6S~Kt z+wSABTt}^=ju*I~m41m6SNcUx+-WS0T*t3DK^^-!ElWSo$!0EqI;x}&Cc4!zj_as% z)Pa?g>-ZxluJrFYai?G9#FPF5C#d5!PRr7-aI%>TppL;(2NOAUa2y@Ob)4*|;{X@5 z(rY~A`=Q5kb`|nfq&99put!JhSk1GU_EDA?QtPi14d8csR>g+pb%GH zcOV^IXO#~Nq`3ksFMTd2C2mXK9CC%-(W77(z2QP-Ry*ewTAMjJQU)jVx616I&~_KJ zrPs28c82+HV660HkX(ce)0QWG#Ley5!V*u|qfMM)^|9*-dAiu>v28rCN*h?>>BT~i zwy;qwWSD=T0;j5jj_AfqlSAI<-E7f;vRu9|x|7-Hms-q`{PE$t5MDVG-wNP}J>|`w zf=d5kQ1aOh`fnYoL;qRTR`uCvZc=PmFR)o)LST!)^8m9QRe(LGbksEIDAr{8)2*DK zFPe~sEqFi5{d6E^wR28^wV4w~CrL4Al1@r-;dX}X0yj5R@@fUCgS#p`}PTd1?u@fh9pQ+BxGvCemr3rkZJ}#%gCq0^L}hz;Y5` z-#&tLwDv7q3*TPI34FT&sra^9e7n(V=N$N!lOttlp^^c>#h~a>uF=%+Q{W|Tgl2yr z`3I^HlyI`>FV#kg_K?T;y0XV?+vU!fuw2@HEQ@*)_N_!;D~@tDc$ z$mG?e24kx1=maAxcaqj2C+1yLoMXvxOaiN7z!k;d4z&5vquH{Ec{jx^qKVS?Tc9{I zXZflF6JZfedq^ks~fYF4`t0@@};ljN;6*Z!7HQ1D~KZ~<=hgVwV6}Lh~UCd zCnJL32ICDj@<6o2&%rMGOLf1O>b@1nhy2k!FozBd{wAsDlPoh5HaN#d31Y7TU(AJF z$A-iv`kbG?!Mt=8EHU%(S!l-hL0autKmorekU7y;**X8tPJG>VQ$B8lI%W*kWBJn8 za)OEBYNTO>xu8a7j0ILZ=j2qsxa|I0UJ|$WJ|mmSJ6GzLy_?sg7cV zRO9@w{W`GB5D%c69Yb8!wG>9g2~x-P5Hx-Sj~6)4M8rSJSnW3=FM+@gM8`sH`eu+; z`%QpRjMhMM5+6%qAXP_y2@;*)5Rj{=JSYrXdi44e7>hbkGd(av)0P8^-UCGAdd8iuE!oQ84yvS|kvVx%d@uVF53yG!OaJ{4CYk zX8Cq&(b;Amxazvz+dEa-`v9tNv=@_(-QI`9gogz_0>~#BJ@ziEKzp&MNPDrj((Oe* z>fYrXw3ib{d!?A&UTlfbUWS?WO1@mS=e9S?|3}-aWBNpC?=Do~i0NN|H2sU6226NN z;Nt?H0OZFDy@~yZB97^okeZlgMQHUNPSDG{kxDNgXSbSj&}vSOlufi_T8cr_Z=osu zZ(O*YVW!oRFWS)RmpOR#)kc=@i@w6_{~@M5)PONQP1^hYUguZb zHlbSS7tD}$ESAWkh&jxi_#Ns={|1<>m{xVm#2>Iztaj!le$TlG9$sY-jc^`jM?hv- z?U?NV5v}e-0e2jGsLPVbm10RmXvwAov%TJwU|WEWyF&cWnOG7zad?PJ+Djs@d%8-o zsu}ehf5z8ee|?~zxBO@vDlm6cfw38_#T^cmV6NHGh#7L~l(VDBvh5|!+>0JekN%z? zgW!*k{`zJ2{Y`&7gMl#Qhr6-A!5Fc98-uI<2+~9pJP04X3TUGJ55jnj8AI%_$~aA5 z`>{4S?R8EN(dZ)Wv=bz#u#@8)c#IQ=$GDj7G1G3*Bnoocon>d+U98)B<+h&M>ZYF| zdxo_24OHWp!`}jF+WIC?tNozBLx72)y)=+jpn-35f(9NyDqGdbb^|#F4dlepKrYs$ zfuczigEZ|s4Ag4>lfd@`z7NO`n0JYN z-HogWt^5y8(8_m_N-L+>t>hfEk`qTOxmcH0iY8Hz)5p&PQ>WKQ>QDv zC6jj*HjJ+sQ*+FiW5!~Z;wRXf0B0kRhg^tvQIIwb2fna1+1R`$#S%jsu}5=(w|F6~ zgfNH7kdqhBszcfW`i=_F)0_B;Up^MhSUTvo{JbE@|5C^B!!MYIXd}KS;)@33{S%^l z@T~%lF+v^q&H~Lk``|kt-*4eN5MN9dQl9HA!x#E_|HN21is0j=MJ4+yy>w9EnWc=c z4u8M0gublg+~Sf!WnQW+y{wOy?kQooM&K5KB>Zh*=8pvo&~yD~_YF`7pqGvta$$LZ z4h!e4zRX!3y0F|!r-iweBGlrg3jl-ka&X+>Fg*}#uPmqQgH!uf(1?3J*zk}m}Zv+!M_!JFC7YVEiaZ`KEO+FD&~Bs z7=KwY|FECoedPyAE9mH9b$y0Yon_&4;hn+H_-klV<^G~^biVag#7q0c&i@oU*A=tP zXITvWeOW`b;FC+Z6^;FwU+v<$o`q*7(8J+p2ER>Z;=}&Jf4qoGmAV-AE4{G1f+|qE zm+rSNEFVZahjF_`iew{NagmfANH-P7pzU60tD$^rf6?*u#1Qu|FI`uDVR@K#sdm)+ zso3*Qzx|cN>9@nIvZ-`ZzmH0X(+w3?Sp|(Qt?Lt{U7>MY>f)(^jk?~f3HK>B}2C~jn<$=Z z{dAzkK~CG<40+u09oF55zeyQtaMhawYe9J=?_0q)2d>8&T_9Ax zK2@mJzD(uQ$)qC1cu7%K&LfwSc)?zQTQK$h@dw)t(Cv-iI7S-Z8vTsZ6{j4_!20(2U$;o2NFgzX4 zzTPJ~N6}qET_#qKr3Xo2vYA@^=D-nZ677||r6?D~^{b|01Gt70=~=07q|`Tqej}1+ zi!CSPI-9k81fPviv*?geQ-(7&n<>oAws(n=~7>NTO(Q6Hhgh`L&8 zqY9x~q})X`Kq#EHA+Li5DOXi7HG7!qq$<#H!4eKd2xHD6>kOh0$-f}Oh)H8X~o_E+x7@-*11FJ_Ocft^Xaht zfE)5($!K_`>a~Eazs3J2=x+vO&IiEP48G63q~qbf3=;yWlJU>V*eALb3-UgK&QhuI zuV{;{&FXUzG+bEDa7BM^OIDKm`cv5OqtM=fm!7Qp0`TKX%J2QgR1NsG{goE_y!ICyRuE{DA@3zIyz%5 z+dP53_>UIPa9DK;@XZ6}0Co;ofUM&H=p4wF)rb&G>_A zHDIBO_1m6d4Ts9lVUDz@a{yoJYa2QTw1VHS-!t&o2DPb6sXq+e0#4_Et&m@-_M%5# zx30{Twe^1=GTP5e#Q(aMe=FZ1W$%LgJ?h6&>Jf+jY^jO@#p0P^n z*S6)B;!*#gdd^`L`%1UPEAjJ9rF!zSE~`DzQ`z6Z56@c#-F)~z*Q@)>_IXymdo8_5 z_GT5!&yQd-#@T4R@9VH_i=meHeK+4tFBmF+Xxi&1e-%q!+IMxO!n=#E8?9b>4v0fRuD zkW-Fzz!RP)`wm5({_OKa%4-V38S1&d#rz(VeD--}4jErinxX!??DzuNLV~l;b9DK5 z2eq)Ot^k)~^4aHUD4v_83O@=im1{4~+~+CxE-K(FG5+i;JiDr)z#NDmZ-8&TgSy}M z?E=0|gzwI9`Y*ap|l-jUOhp%P8JS%QZz$ zyPpc~q?Zl#s{1#=`>75m9mOdEx|j{fXE9Q-L&O87GMVen`4h)|c(aL?_* z-E`1UV?B2Ve@^`1i)iWpsd}86gu*S6p@)Ny)5;N&C$>C6jY3`Lj}QAS_yn~Ws&&|x zpf+krsw+DZ`~`hssJTN5i=L!{k-CQFA^nSlu!`l|ps;Z}E%+)u{8JrLbrpeM?hxf8n^IXXt97uA{SuoLKZMeX8?B=kxS; zLwyk}rsoOo&2roQmle$}dV%oDpHMdzEdUiURJiZ#q8BM@sKI>~fEsJ4#NbcWuV|8? zt{nVv{;z1dp{k0{DEc*>YN+Fj&jGd2P%joY6z!+84E0v=xu6;hb#~QxMK4j4rqI4k zpk5GapX#W(tmyajcTLfTvZeGY4H?B&U+h1n>YAcgsahz#%DhU`ggUHvPJWfHHx$pw zf27w9#dGrOG@37yXp5gm&Kq>Bp*BZuE_#Ee8){hON1)~l#Wg$x>RzGtDW1#Uq>l~7 zbNN9ktzn(}6wl=cX}nN}70=~|XqixZRc&NX(IFZo6Y5@dOXM0*`lILhL-eWSZ9#pC z-lDIBy43$B-pP84JY!h)QvYG!7*Ii>4(FZbf4=B#DmQt{{Kxv8=v|se8X5gj%Z zx9=nRNK?|jk0~@(_XAt~G4(SPTm3N&HWZJsPiUl}c#M5QQw+sp?5{M_P&~%|N^=dx zW9&a^iJ^Fm{U@z3)RzN~FZh(2gt`Q_d|vb^-7VBU^-?(%e@?$Qk{lCX(VK>1Uw=jK z8H%kwLLVE7tv*6u8tP5oQk+yMS>id)ia`Yo#l9vLHWd4sRDVOUuaz2NDE75dqYUN4 z%wVbUhAPF(V5upFdJHpzOU*RYUd#+GHP=wwM{c#mP~1muwL(+U4<2>1rf8;rjL)N9 zFw}{7hsLYk7fO$CulmGLt)XzSSAA(HPrqx(t8n(sqY66vAdepe!6>FY?@`5hDy8%M z?9YJW7sGh`u|ET9i=jTm*vwZ~7>Zy^zS?G}L7}Bopl&hLm{2jOyA1W0s<(;?)%}LD z5NCzzXPSa7V~T@{YlAJa=L@U1ByWqKtq!X{n{sarn^_!IUzofd6{G!O z;sNS6h8pd^5!4?IwFY~Xf$D8TwH6hF`oK`5kT*zuYN%S|4N_le3biYWD8Fo04=djD zMO4I4yu%%)CK`%&qfs?KLtRifQmr)I-P4ny%id5pR~Lp@e7UOiwa-i=OFFBppV z$tS4y48?oX6P5co_TXW~d(%2qX(-;C&QcQ%#e2om)uIeFxp0wcF%<8im#Xg=iucK9 zsO^U0ee!a(%TT=6U!nGAsK*NG)q95Gefb(35U?$J6%@m5GU}tec&B^554{D=OdufRG--?s!sZ8E8#VPf&Q2P|` znp@RGx%;(Gu_rdFYctg3!glqsp|}kfszq|?u}|@y{ab2RhI*{vQdNnYvb-|$F8wmq zVJP0gU#VWtkBHk0ozVuTINK-k@F+ zN=x3T-WKX&dVu~|e53lCBkv~lwaF`0e=NR9g=+~Pz5l#f;g}j9t>tEQlu#Gbcu3x? zCOPtMQPWM{b9AWq7Img0?^e|yly3X2>eCslQ@8zA^*5n(4L?+J;}Ch=q93YP>#~wR zRIdr8CAX`0gu0l1K@A1l)ySDFc`>Ecd&S$;6rr@_4t0u9TIUY+ce#+%weL_zgwm3? zDgVj3KCb;X^|7J2k8V?c6-rCquKwlX%TcZKcJ-D}TJjF{fyrZ?cc}fdvMstp z{YEG)d8c~a(YQM>2$-C6@*;&cE)Hy^bB>WL*-oK@QkE|Q(rFI(7(7C&z}2>i#<5?wKdqevB6z)<9^oT zMJrsi1hu&d}~ zIQiUCr+)3jyDGcZsP&h?l3Z^vC)YNu%@bzHzo9NqPTO_v_oPQyruW>7$~c#0yz~L| z_(Yq(i#GOo2|Vu>$*$UZ?va1CXS?^{|4zd{+p~I%gm8Xi(R_>u7fq|`8omE)Z1V`} zJ@Uhn%j3>PQwDHd7voe$Lp{3fF}pd)dT_uBtDZ(FH=Tt(_0TwsdPU!y`#DCsC7NAk z9{AGDr8HmT-Rmv$u#EP}A93($$!vg`LHL^E#PwXE<#nrdu7*3&I<3Lh*?mTGa-4I~ zxV{|QpBHm`7Xsp`51Dh`F}?FmvljOtMx}VwIh*Mj%vob^_yUI?dXxD__|6vDvuoD! z-rD$&Xm-lHhq0+7ZY{c7)`EWMJ4A>?ms8S-b192zMZVn3&s^$nh1nR;dYp5h zma)vJaq4&CdRDjRx1MJb=M2!>T$-z=>pa#sA34^3Tqt-972-P0qEb6TVWkSoS15*6f+{53GCwWhDs z_$t+pB6w8yK0Ng^O!dci5b!FzcU6USFn*6HQQGdiR3t-<#g ze8=NE0pH{Borv!we2>TX1bipsI|bjV`0}$odBj)zAwUo6WxNV7Kw|-mQIcV;z*z!M z7kGxin7~HBGTH%%d%uAF=_NosU!b^bCt#Ge0xG&ju4k^1t3BLT2j^Llc}d`x!kJ_- zf2+U;Ek4QKMBgecrfXyNr0ZA^8tTWc8=<#GeRAziEb+WKH#b4H>*4sx4ntNl~1ZxdTz)o zYBSXhdkCB}hP@AbW9diWPa68E3b|gx?=3e;ExWB@LtNHw>*}(j0PimxWi?To|7PfC zKUBF!4Vh~dh=wg9Um$fAP;L1-3-`ug{|MJrL)xt^D76ie+{Ur4N#*xilf<5Dg;VP~ zYxpm%YpFE&d(<*)$YJYd;omHpPZ!CXMf1&~`DVJW^nG=Qc;H@vk4Rnj0@k=57yJ&v z_tLll^{$v}@X+z+yFH5~IOO2ac;uC9U z@fi2tMe_*P)FIQ{BV6N#u5!Coxbh-*fnp5>h^0?esp4mbN)yrhpHjt70+lL$ zW~fy0Gef0PJHu^OrNr1!1KCUOtB;1h zapa6gse^dVi(9?bbwmHYo~^D~Lxy^;alKzS!gHSWvx*ZuHvpgRsT29xB3~!+Bh;R< zCeH|U>yXW!Mc^n}F7O(}`JX&DSgAsO=S1R4Nn9z8t0v(z38zUoO8F6KH_#>JY40fM z#T|XJ{U2m&u>;Ig0v)YAc2O4OH|Bt|T!dI1wTZ)M7`&VxRJv?NawFR|r zv(AJ5QNAsT?~-g$e73kn@hScm#b@1H6rWCSQGA}f(^c+W=^Fw4N#AbKzZ;tIT!Z5K zExWDT1{`ILwd}Fh>AL|V;tt;xV$ZcA-)ONt*NQzis{z4v7Ca1l8m)(+XOne%`Ja4u zz^a3^L-ai8;uG54uKMA}_@8uryKE}pB)}bta4LVVXnsVuRI%nqM010ZHY#r8<07+H zWST@~ugJiksJBUEUO+^B%f9Fue=tr}qVZD7l|V?o2o5#syv@@D_o03cOF?69Qip z_=dpu1%4^e<6+Ht9`C=qkX4bR*zd0_$lv4pCWWt>}yi z9uvG%@J_)mrgmD!Z{@PA;FbfG`K~B z;8lXx3SKLCOz@cCoq~4?zC-XGf%@Q=PAJt8OWTs1y??4wU0S2!G{Q(A+TOxr-3YUvEVxlWX|n^?-BT< zfy{qO@Ph&m8OZ#%1t-7MYasI@f>#;HoN0pB8pxcO;4wer9sbKHucX8OefV%Y@P#GY z1>Xbw){;GfKPmE0iu^&r4;jcBD35K32&@e-UK@~F1dj>cDR`&gI|Sb$cx}GO=d=7u z!D9xBZGv|i$ed{fEWc7+Xe0scu*jfioC#S z0#^#`5V%L+L4niCSaPMn4uRVRM#`B#P2fs_9Rjxt+#~RyK+Xe0s zcu*kqW%&+)+Xe0sNc}FS|0tn;97U0SQoF#F0y_k57q~~@L4j1kk}CziQ}GmV>M!;P zT-pC}I<|CWe~C=t9Mrj$qF>-jfgJ+33)~~{pgX@M*vwE}JI!O5pv=R|?(%yuG|b@a@1~E#EHq9^l9J*(3Nt z;Mev!C^!wioc`8_2DAP>gMSPd8N#qbAPr-DrNGE=;R`${aN1GK*)EWxA}Mf>z{m)Z z7q}3s?FDo>Jx7z&TGgs9QFo~O)feiB%Cm~Can=NDigl)SleNQo(t6AKn{~uG#Wmlx z#kJkF%N24z=YHK?;5pi}$g|p$^jzuriRVSnYo1R$U*YM6!QL8gt#^+13~$_fp7+Pz zFTLfy%Y3i-{^slJKiz+$|5^VR{vmm@^IG#R%iEsk!YPRdC)xP*b;`%ztt!IFLNWfH zM+mS4|4Q+%9RK>@ub}kBdyo}4XXuYpj7pqZ44`B1?$QZ3`IrjsbewUVf?u~h6{j9^ z@r#;#yXwCkw(vgzUo2&KU)AS;i7JH?m{SJi13pw#4ES1ADd4LW0|37od=%i& z%F%!mtBwKmh>Vt;Fkm7$%R^kMwR}2Y{{bfhZX9+xpqAO;S)9RdE#lLj;e8o?Z!p_4 zwRjEi!^KU2uT>=hmsDK@KM_bhqcLflqhQv(DdDYb@(|msYuDE92>lwIynZidG`Pj)@!}t^ zSg7mOGKYt~2FX_|4g&tR;xOQjexCqp|7)GPy<`2KgTGNcKU1KSGqLKc5dYOMjvp_e zh4|t30R4a#V#o)aW6DAtr|>rf*8|@T|0(=gy9DsZ;6H^w zTX!DtC*VK4AqI%MLAWkgvvd{(>O7-@LXCu;Ir_n!rYh!{yhAu@C!W`0e=zK z@rr&0Xwk3nyo93tfEN9RE&=>4-m0|dW%PhWufX>f{SIEY@J#Jhko*Ing*P9s0elml zw(xG_Ht^p9wCHVl>+&5yi{6F56&(h&=uhys!U@1lz`usSafz*N0j|^!fm?tU-gVr8 zlgW|RQGlbY5s0rbz(>cnwViehl97JqmC>@bR<=_;^|Zd;+ZmK7m#NKaN%d zKaSP{pGZx>CsH%;Nt6UWiCTdlPaAT>m>I;0w`r1hBfq2+dk zT@lyut}|WtxDL4fgSkkH_}}d?({O1>dRoo`^4h#?wyes-LK53+G{O znTK&c599c3%2(@X8NSWSTNu z;=2Ohb@-m|ouTs8Om&y{G<6u?fDg}h`{Jt6cbeMhYga$V_a%Hk^u0|5{&(@b#5{`n zzpIY-x2se9H>mI6`!jqG`|nhJ^4isL_|Cw09lo9T{s7-H zws9g|H9c0pZVlSl+;D1Q)ylDSQd@I961F_Hswob1*39O%_3@;k7R6HQz^tujZ*cC6 zL{n4TrWV9wO^X`W$7i-CSc$`rnj=-RiaGJtwTXu5ZH-Ov8LQD9&xKHPhG5a!^J9&z zTF6)ecW{w;Ez%>5u3z8Q$_CDEOtmu2&a-jY)G)8PX_KL6Bg!B$xutDYQ)6na-EZvF zaWolS*vy@e7}SjTMuVWk7N^j^3w5OHx--#^qU>8v;M;N9jpOLF_@*VXrndO}SYvYK zIGR=0D4vQXH-VarKLMPHGp^+r2@9^J=Sq;jFy7oSH?f)>lBs*_cv?KGxpl&LqcNr< zw=UKivm+hKkz1EonnV{gCIftS0+RXKx!o+C z0F~WliXNHAQIE6A#EkAtt@wGI$y4!lPC`vhnQY|DNi?)I#i!zr6mQ_pSh0fEV7_7h zP|8M@CgIcBiTYSm;|1{s$rIMX)>v~xEU7t*5;x!$h2iX5VJu2+g12pS zp+TMHW^O?2i9iFJ=FBqw#1KVW>uKSpRBL>FO?K#|YEF(f$CHiq(lXQQJd~w@PI@&n zyY(LB_6j+D$rC!wSQ~3z6X(!$n#Ds49x*dKIj4IvCQCn%Bl2=|n|>mA#;I4&oTg~J zDV{qeJNaEL(s{F*VW#A*P>Nz`GopT`RqK*-y89fXQZhqH> z=;20L)lQ2|rYYvEG&jc{q>jmo90uhI=TtBQD?+O_cnyZgtOf}rBuqIaO->h9vtwp6 zg}8x6*r08igI0i#0bv9e#hYWzOz_yu5Un20YR>{IabTC1>yX`qwa8XGW$ zVq{KTw_*h^o7h5})EI99*D=7lXU=Nq&dYUI_k8W4?tI%F-E%U2=$g9vGwupg%-s1>^8T@T&Mj#OK=N%&XGM9HV?c{=w9#a#?|rG9&?;^_AVvcrfwbN zEZeh$y$|R)ccJXSx~VmuogQngU%L?NM)&5_wzM>von-gSx;XEdWpH-STo_MoXsnOh zc6Aq+5o@lGW0%I8phbyw@#fw|&91te{R^8D=dW&xt&7iUko6=X4 zulhLl0KC(lmt49Q8=r+O%vxk(j(CrZX?a2XytYP6pf+1pf@anP;beSuJQ-(<*>mEl zRBTP0)|(X5^8(&6U;*2J*re<=1aE>y*^X3^@)}^>8pE< zr-Z|naYTu|f^@Ytlk2oon9dH$6rIJJi}jcew4+!xYqaOHjJ6y`i{p}?606R|<+KQ% ztizpJSxshlG6RPJqEr?on&mW1vv^>4=dO@r1e%d(UfsB+4LZb^dKPJ{&yENk?bBl^ zcwI(noaV=pptSpPu1gRe`T_tUZ)0`wRc(BTGd-C&Uq-of53XCru7C;X98{c&uV2-) z35NhNzSOC0HM=Yrx4xyZDV{W|5w0yWSz0a68eMsgs3@t6OU_{g$fXO&80XHO{o9#&injKw@bu+03ZfJMlS~ z96@lL>!0?elNvY18@jXkEP{Xfmr{u&H<-0aSQ5rtvNg4|v2`sq;=(;%zYddR&SnzY z*2xsY=WBXux37wX<6Hrp6G^HD=S=ZrbF7I@!nkeX1sNM6>RrA8xe$_lp1!JQ(qK@{ zQ`?~$q7 zu9@n)?xXqI(rExSJJv2y<=EAW%}zQqPupF_D<;;l`H57kLv9wIC-Y&GjHYZ*Wyi;? zW?l%maF5~Dlb{`H@zv%?mh1&EdsLJ&e`mMKIqWWn-c*}hgCpQ(>8+U?>*I3C!uzW% zfn_*L@W^yr+=!2ybVK&SC);w~tI^!}`K>r*=bagT{?7XE!#VM_eyk5>LuHhs5@)y^c#*bQxu6cFw5FU8>DFP)5P5 zZjqVEVt4kQ%bTd)b9sREo}06I$Oc2E<`%Ov(R+n%2lrUiao=W@KE=;%9v?HYpPU0J zTfv-Ia|~OA+-zqD^(fHAWf_^SdzVaxzV4O2F(^CBpn5xF2zHZ0+Ho%`*GAqE@zp+T z=k52b%d-tlXXtrJeOke$5kcgoD$zSJJGx*%iuWAQgh>(bqB(nw-8sO zazLKs*tXG`$z%dunY}r~#yKbs-=0nyFo?3}5B8Q1no>P-Rl_AP;J27%v;M_)#9BK}71;&z{#geiqN$EQhx@^u+$u4@SoE|h|0IkHNoFZ&B zQy7KgSFC7V+n6yuvoopTkV(v*arIVJ)a_53z#l^y9=)A*Jw?gYu9rF|CQfQh zrcfqB;$jGglSY@puv<6StU1VO)c2Ld`7_#*IM!_?91Nw<4n|k;jz{hYQfgfzrc)fu z()!p&twNJ>(aBd=X8$1j1sh+K$eil(Qy8=;A;}zEiO-F1Y{jD-ytUv(HFMLBS0~Og ze2{W#CCh-F*X!k!EzryE)6VYg?90yQ)0=qGrs|DF-0O1_=Ti$#z#BK>+6dfp;RgiB=#W+4DI}^Ei$z!rAX@vyxi`D~T`hmn6rbDYC zpG0ko!4v7SdeCv?vlWX_l1osZ2EY_FC&6h!UL(pi^N%bP)gfm! zBvwO;ZLy`bWFyM4Jz7HqKUHxy9${~WoYZvwB0QLZY5jYjI`k&)X1gr+_{IJ z^HpR287)%p33Xyu6Kd7I;&%7m65CHw)>n(?+*|PHL#B(}+>>0oUizB7q+86MYC)dU z>*vBBtKhvF`A28W{05os8g*&*CBGRO!M6>y)}wZgt<|8KY|W?t-_y*I)hO+0ur-#< zL|eE&lX!Zy9Z$NZF?0sqcHi$mod4%jw-7!7(NmI?xb zvDgbZAUubO@Ej(>9nTh&g*y&e!Lo2#h3EUq!ktyBg#1WHBe%olQvqlVdVH>6pb}W6 zn^Yj^!;i+!33bMN_=|<%InapgpydG-47wu}-sJIF;R4G8v~#S#SgC=G-aLEg?@pg*zJ=cHALGb*}gLK-}vUqvo(N=Yj6zrd0MV#53sOO*W4$MrLWSSXtps zhCdL0Ne(>DL#v`DjhI@6->Jfr{ivX`6U~+C9`KfhI$lvhJOV373Hin-rHTiNfgKOz zMF>{kVv9c_20tQ2cL~0WTh6Yiv?{qOc(u|Wv8)pO88qdC?RdLL<@wkLoE7%DEmZU& zP$ZuqvGP#`b6C)4@-*+0437oTfuPxW3SDBs*;csD4WHGa3xdI*7v8T6*OmLc;kqtW z1R;ph92O8n_gY?`yVA0(Vqd;xRaRD7;c4=}&MVy(WKT}Z^SQ$vkB8@5mhO}J=%*4L zCmml};FrSv1KB?}psSI53CiN4^Eueq!!U7vfYt1Qcz8a70wMzuS={eiJ>1oZGDt1U zN5vL;=1!<`1ynEq4WhY(U~drb-oWx8qJrHRZt?kCR=6eHB86KDQP5*t9L}Ydao&A) z-m-l3h%idX%E@7k;bkyH_tke*co~OaAu3xYK>*82R0vjr`>1X&H=CQgjC)}jeqhTQ z$hn2wMr3&cQds&P`dVy#EnKE$n9qbucp1uszzMf#WEt!*?PMFI!OK|q1_)_eLhvp) zQq1JA1k=j~A^?_$JD!no6e$aJmZ@+g9I-to!?Rx=Nc7>HaHIlei*B~v*^>kDgA5{3 zER9a*wmG6>BEt4?6>N{L3K?rbTHZh&53U_5)N!Zf4Z6Ldj?Wle%_9&av|~FgmQ>Tr zIDpZ14;E`k62~jg2rn?B^H>R)7ufoaZH#wLVt;yo)G~6PAU=42rCbP8}6JF z?#vTYUX>QSD){RKaPup6m6GwgWE>Rypy2Na{*K`9=}FHL)_cPGK=2O)|5)&k1^-m= zPX+%%@Gk`ayWoH4IVn6RPlk1P(?IGAEE7dCmJP+unbXJT^9OnQdr<|$9S_*ZOYj1G z7?e;#UJ0>%kO_>jES`#s2dex)wwx>%9WNF8JpQ1q-mPeXglji1nT5!{}^5|w+$reB-Vl$gl2!h()#^m zRbrhB&*|sO^IJTvzlfd;b?ijwYLS;bymAJ4pmNmkB+nuRrcL2iNSXnO3EWovLV?eX zpVL7T_M-(-=}tRuf4&5YjNoWyEJyW#jk2?&MQ{&Fiyf~*0W-(T;IG9bk3a0k(`;oP zxnv9ssI*nTT8V;sU|uVR8a&+bI<)Y{ArsvkcQ4v;7c#BMiubDMAQW{IKiI4IJ3WcN z!`-iA!U}i12N4}bSgY75%MJ$4EI}}2L_ZLhW`YIzAJ|R*Amj0mp$|^r8Mk9QPcN8Q zftW7;I3xEd%Ng#c8SWPj?iU&E-yPh)`(J1;`TE7tZ=CKQbKktf58ZYDhyMF^Z<;vb zjr&*nA2@NvMWI&$$A`OL;<&K^l)pKM>k$>;-rqNd&i?FBU zs}0MGRou@rZ^tEA4s0aq@`h&%@gTNFZg05bQ3kugE*176><$bPtPF5*#2kW@rM9}f zp^ZGFU++Z*R&vbuW_b<*bF9d@PA4&#QeZ2=sEl$w zS6E&*r*}fWz?7W>d=qfl#i3Zob}%Lj12c$NB%R3OJb1bM8!We1@?;;wwe>?r=dqm8 z0R@}!WzFoLR($8f2YS%5#1;nMvAr>ejSF|4&dfU)yi};oF(ZL%+{ygA*^xZMTq^>Z zkz=g4jL{YwW&$pP(K)3uJTnk+SB7VW=K$sT%fdt^+x_r)yweJ|VS>T-SoQ|ezZop* z#)3IJFX9TfV9MQ!%{lfEd|?n?Ci88$13MGF!C|aL)b%ZjU|4Jmw`N8F?}E7(`bDs3 zwqW`anmHUCfbP8o?%To6SH`OwK#|?^jT}z zP-2BFxWYk3$ZwZKKCgvr=@rO7D#EjunW&vg zf*C14>**8mI9v)Puz<_!_~ALh?86!5#iQdJ08V+fy$o1wU;i&b4CHO zP!~@Jm6ZtDN_|OMX-i--LEuV$urdfM>cZ2))3E9W!_)Ga45AZ03kH4gC2;)3VvJo( z7=+mevFE}sQ@IiI!Ju7_o|X!+OX6BJkYy6K0O$M#St%WW47WyGD90J_#MaZ`+ z8PC__Fb+eyqXVIcYk56lG6R?!-Z@FzsJGPE_3*}vBxj1aq|+p0a{?S@Az-*osKwMM zcHgP}bthj0b9k~@1rjo{jn$$B#;(rOrCH;pBEINH8%qJvIqcSmoLq#Xn3SVr;p@+f zvX^-+%V1G=6muOigMQBB`AX+W@FEYv%WyZ#mFg@B&nUvvCWDnOKLzteyN(bkvlV3! z2LK({`?U68K!kKhGio|IgD!(90T#0RluLgmIOi zr~UF)+$i%j+msFCYQ{iAur%}7BR?sDcYNhh;{ud7w^51kmoz>4K{fo=CHcnJ@SnLK zqxnLJIsJOS?Mn0T_cZYsdm_cp0Bl;EY?{2bwY4R6{Lx3R!L6{iRW@z{HM13+{LiWC;mtBpHsPOXVfOig>YiTTrnw5wC^{YxcX}t4 zr~q>g=QT#iRf%a%X(L5KW&(!x0mN|C8E#cnGQ5eoeNA*Xh{7 z_)}8&13Ihzg%vrC$VLVJz|;ScdJxAe6rK66Xiv8nP1#=v?&XS>{wwqwM>&3W0KxwM zoO1lhq;v3hv;P&AcYVW_9W#+ArfB)UT7AyT(EqZo?WqCy%?H9-p+B8hD*WsbQO9?B zzuk{#Nm{x+1EAlt85QZh81nQ3@Kem{F)A_xx3Te3!<6QD8{Xw<8WoZ0rylo8<=wa` z&3M4Ct_Js zNjs1(xcfKHk(x8#LNMKj@2kJZcef5QhAdZt?@{<(@+!VR2jckP2hDOm3l`Qby!fQ^ zO2_>YAG7;2{HAk2j){ z@puhCvCp5che1bI*X1hv{}rXg8GSLI z3-QZhOYqBQ3xLhSuLjKpJqz$8;QV>Q{m~JQZu_^8?DRy*<=;rk{aq+#*Ws(6HHOo? zlgwRVenx_yVc^eDDYXc>eD6DjyT;jP4@7_-aNmr9reM?m)y~hRlM;8_ zGgivsfHr0B5^p8z>GFXvh2C@vTwhy+E9$Q8InT42dWn-7snibx3X0x5PaQd}>U(Sq z>nN@@mJ0g;+h~i4$W$3z&zP^4S`(HTSj3ie9T$43DjM{!*vDY-C?pDYN5w}fq7glR z9+_1!bcP!-d_-vx7&E8khGFwOFZP9@ia|$_$xpECjPor%PWY25A+)0G=4ecu$~)g# tsA$=?*=4-pn@W;)pDf6SG&LpJEKIlZevb0=>t9UdMpo`Bg!EN7$7A z6+V^96kbQ+w~K`w(Z;+JCe-UFQ8mQ&KB68)ozq7oUv)7LK;P)f7|oamGtht63P75) zRn;4sydp$>Q7df?K$E)VAo%cZ$J_O4!Ei+_GoFMY*OiXq&AzU|+x2R(OK~woFQWbY z;=1YNr5`Rpp;r)T!oGc&t2cy+g0yJ1ek*)<7R}Ww4v7GQ$4dwiKp^sLLJ19%oxB(d zJ4FPTdL2Rp5a#=?!)GxVW)m!Q#qk`=%wQ zpcV^I(L!~CPEHZvs>&gh&@k1hIYz)PRRoyUID`lwLJpyXLNT>YiU=@8AUju^d!bQSmn1KWB&Ip9zz~n;J0RJ;0=K7W_nV1pLK-!CtN)HsSa5G#e9jM zfVEIB=O}J~leGnE{gq*hP z)=Bny3mTt92y)xG&Qo-&szUL))!~R!rY8}W+!5~wHLW_VHy|p5y7iJ{p<5SvRK7Ig zGnlRiOrM^dix2eEZX{Zd0CejK$4<92ugWql(z3Re(io3m8e!?mxB({CCjq+kcaF7g z{n8Pqk#>nb0mrWb1YeyGw^-Fn6m%hl5F&)0H0M3v=Zj(GZ7zQP&pS~dpq8MBU9 zww4$~XAE%(z_=8RA?Bic4D*9oDj*itc3-nrQ&%)B%5zN~ zSt5VV%c*aAngc<4rebC&L_e)~e;`bId^gsHN%!1X>!Vj|nql)@FPAcmQgF%ioeWN+ zOO}4Aatzrz?G!mtTjU zlYYj1DAz|9&`x-m3|xS@_Dac1m$ZjO^H8N|cR;%dqc&Z%f0wjsx=6IYm9$!#C)!PtHie=z zijuaWw~1yTE?7IPwAG^RQ(BAU+gZt_&p_mG%`&3RqE0%jO`;FfaN1n-9j6UR+B~J* zCE6m|BWZ6`zFBn-EvKw#bF1I1>VS4ov==IGtNIN3ZbY=Ms@ssZg5HhxPNFOVvV&IA zA<o;CWW{yUFG&uEOd>VE*bnTI6xUhOULCw1Mc(G1N8{EhIx zm0YFvHe=f?c3EC7_PU^5qHWnPHa7o=7J~nSS{-nQHVyb=nlrA%TCx9#-T;2RzSz4X z*Wuy%pOkvqo{PP)AGf#D)zIzvR=o+HuZL#`>q0E=@iN{aSjv2vIMwF=v4Z8_)-ZnG z&-kP;Uh(s5VQz%HC4x|*_sw_-b5x^UwiY;5GYZX6+RthxLEERa6aG<*q@}dy{ga^a zW(r;cshVbQ1-(~k@2*)3?XPT2O7PG}RT`Jzp$C-4C3xtwO5+l|^bbno61?^OW;q8>qC8(Oq6_ z@|0%Lz24b*?QR^2m`59w z7WY5noljj#%le;%_AaHhdtdNgOnpk*?)^7tF{NGLJ?ULQHz{qY_eaofQCc(o%6kdj zuC#0DO=x%7n)FfweMF^kgf!6oPCi6P1ARtm90d#MA*FE?ETk_fZ70$e(bG!XgS18T zjM5&g@%t9j^GbWHMx({_veJH3UFBOsV@mr?^;Bp-u{Eh#BmGgOT@u{rZ6q(YxxDr? z1v{aIl*Z8$rD;mz=!w!CrEy;`rAw5?eZ7>HDUJJj8C|Y4?(1dLsH(s+z6r*A8b$LMnUSEcb7T|uuZ zjmPK;`hn6?H4)#H^xsN*cg-SbuiKim=qd`#=TSL9_jy+NuA-Mk2Ozt%AD*4d7Hd47`x;1N!Je;9Pn{o0QfTUgy=u$7r-%E zu7~J{lmY%&_@B`ekYA%w&+ce*(Tqe*}_tjVDAN?Ez0c?WeE#>nTm&@GqoW zAxF`}pYlalHH7B66!jX8J@n6f%<&`LIG}?$o(%qr!~p%p4c_xX5E7pHj%FR3SA{$V^1!dWFoi zh}^1>8AD{Fg5{jZhZQn&ROC^G%p4Q>xI$*eL_VdE8S+R?6fzSLxn3bNeIgqQnaPQK zSRpef>b4zf-Qo5f;qvXg2x2M1gTo=1zQCB1apGN1jhua zMl1ze1p5SYf=309362R;NbCh$1p926hOoMP6Q@}kz9V|@T`-96eAVQ~_niQ~SyW?x zUqiE?&BgZ`9GKH3Z!@;d zJz`^9zV2cBK0&)g+j6RuV)G;ZIBa%#Q^1wp1HjFc1G-DxCq5sq`5^c=s_zC~9^@L@ zK8yXZ2e+To)y?fQSMzb7j&JJRixv3Or6)D?rWdjgy{X}ig$>taKBWo*b*jQ2pNm&P zuEC#%YgY~ATKw_pQ7z;;{Au`Rh+}hHYbHaU0@U%1Y%1g#Kpoe1KI^&wsNxMWZD^ zouWw5u%llHc^OhP>?RgNUO|nJR|0kHs+U4u1=Oh(=^AdQE{EKPbPcylS3+Kgbe!=3 zb=rVEvxa+~mqG5pK3K!8(kmc$;`*u4CZLWnZHC+h)M*P{4S6e2r)?-f!&S8vat}(- zXgg5Hi5s65z6+?+E|j3rbwHi2M+qAB0(H89u7!LfP^aA}N25NVP6o=+s2`}~io6x_ zAW+A-T{q+*piX;Hjz%${PW$A1Z$D7S>Gdw~!$6%9C{3dz5O*(7nnpJPak_)jH0&jI zqX#c1Pma%-J(yX}s|9Czx})IpS(;bDYO&QZrp9pzoPCeyG_TDSJibV4_yBuc-bb-( zAJ5%i#@{T|ZoJ)tW&FLb3>TM^-Qsp^#EzB_$6=g6gb~A25C>VNHfQ5;qd#u;EvFtM zy&oT)v2+F>9qqA!Oe~o&tdYJIw0cu=FdH}5AY8gf(iw9&+R;TrW@h&$Gh+-I8H3Vp zMcK3^<8f2Gq@x?mglWYFsLe8sjMEq z$(s}Lq%laH9h*1o+P*p3+MkMcrPG^?gfV0en~6-cJvnT|64CCxhGh<-{;Hm9_V3=k z))?528y)LoW*jM-jbXEtU3V}QvkdNlo>y?kod0n@tKij~XQ9lNEByDdg$Z)qVN>GjF@plOw+Y%;9<<@n8bMB{X67^&DW z>Qu&ETQZSBZ<|)Sw5Tmsa==WNNw7z_Ou{DP;I-yRnFKpWX%TC)1N+TPDbLkHER-f} zvCKWOgC%_H;9%R{7=pqMQd>@#nRLcT3>wxTb!;<-lNqzyv<}1uOzLP&rQ)#x36ngB zFwA!c((`reSV3%S9rZi-LKZnNDUc6zIe~d!g+qo&q9{&tM0?9sBmo zC784i4!SB_;0sbwsV-Y?kYx;H(#n))KF=GO^&%8?j4&IlWHu#If-O1Fc`C`OQ9QfE z%Q&hX1C&4y+xH}Q81byhQ;m9(LqlMIn9eMhXi^?RzN8*Kkvmy zL2FH?&Efv|h_i~dW^k*vKa0%U%$u??tZ)UUEjgS*cv!OF!oMrYt^k)@FfXZ8A;~GV zCzdJ75tGWdW(Q*#tbhgk9>YRktjB|J=FLfKe<7jWOqq$nbXTH4Ilei3cVOMXQdpYU zk=T>8hGlvg@e-?cyB>&**r3>yIzZg+i4A4#g}jh#cah}TX2y+!BBcxIPUWz44Q2;2 zr3vi7NQ@K`wq+9;1h?>+Sbr=Y%eYbxaQMmq^Xe^QD}uUAs?1T@6o(DO@12bMw$6;aDZUOoL4)HVO3`2`?47>^Sw zVj9D0CqQeH$+&4Gh-Y^Gd8Onp5NRy! z*?6YN#>H*HZf3AGG1#57Fp+Irp7CZ{vN(~z-7Hn$RlaBqFKHk``ald@f)dL@V+t+I z8}kz9Y$hbg@(QQe8wTN($ZTONAt^33-+Bq${I){O3R(w-J!`75Pg>Zi4)X?b9IJwF z92*_TAcq?7_Lwo0NTzY|O&8+F6=+d)iB3BiocZXir1|ts7^+y0nJ^LqBi-o5v|7?J zJ#k@#dYbO%tDviFH7Myb#BJWh8RDqw2*haAb(PE4xo0n?ByUKgyp4Ai)|$=iO+<_QjIXk-6@+6PLfjdLsqe+ha*rqO*_eJx>#l)a70 zucbCw_zpQP0VR!NVp3d3$(ktD#-r&Sh1f2vfli{d2}X9X@Ye@vz5Pw1u&%h52p7xW zo(+7V8{zNV^{qJfNa5rIk%+Sp17{cpPCQJUXqb>QM9a58vY^MrCWiBk1YLQi9IMXe zlkbqQmki2^;gkK-!t&*mv22@&e=gHPNd`(a@xb8eN^{vvu$*@IkK=u&a*Axup}*|$ z>B3m;gXaMrm(%oD8Ow8MM`^Bc{WU=!MeW>h_Hip$k9Ne$&4`jXJ`J4A(Iw@_uEef! zJ^G5rJ1ZlfK6BJIms+<=%%@PYfxD}lfjldm*e@E5vbnLn##mYKl0q$tXHHS>uJh9~ z>rnlk=*G{~hCH~6#I=9xA`kGjqw_`3iGdUk?SD$+u&pm(nc9qS) z>7BR56%DNuYt7j_oV`6R58dy)MI|G?VPfq%H$P`@U5OuTUuq8|-~8VL5NCx~3BMH&7zBfLxySue!?_P>;brP`b(Oy& zoVzcadjS8cBP@r)xyR~qPt`;`pp>F}{aQFT>Yt?XN5~t*$MH(e`cOFch+Y}dA&G6o z2O`9x{QIVks!2`4x$lJ|{&9&q*EA3i?~et(bL-@{o@+e0HSqA&yWdmyz2KFRvyExf z*$m2Uyw*-6Q}OO#f-c;fgL9~Q>E7TR$}P?GwyR#wg}dtO&)$LMT@-I?HlH6i&YHUA z{J1MDDLc-O!|}8Dnu)nBw~Tkbb617tZhPm>#y9o4iMix&We0KJx%9fp-;J`eXV872 z3g4`d?$axL;T!zEsda`{XX?J7$5)p-60mgUi)Nd<8R9za8u zu=82%B;62>p!gscAM{2D_2;DwKPET_9Jp z`*7}~_{9dV=C<~rH0ZHVMFWLA4d@pLIs|k>gX#t_L2m=suToLAq^i(>DuB1Eke5~m zH1(VM*&3b+=+UR`w2ai|WMbXH0W&4{c=z%x84Y%RjlZE^s?p5o=5;+ds*oFhOVrVP z^MMsn{K~Q?G$ntR19u@(abrYobX6n2I#0(>+VEtG++4vg)WJ7J`6qbTLo+W5Q4=2W zc$??%`02hzHQUToG9AMi=g4*|zItyalS*H?bm>qmvp3rx9Y_u@9Z1GwiCAK((VuEO zkTn~P!Qoh<5jUFn-gsjMchb@WRxFjlZ|*$YVzk_T9iGoW_#(>Pe};;UJ7g}s+qfih z`rJh~=9fgAo>l#`B+`cCC)|K*PMBF7n#Gqywq*NplNEP_dy@OjL~{a9EF8)o&AE@+ za8z0D7AMMZZt{&g$eUp4s;equwNH??X$yDPDZD@4hxb~Qh!5^k{2(1q^bn00c(*}t zz4$kk?$@^N_U?OjUG?m#p|P${*RI*SdFdw}Vjt~S_Tog6pN2^HZi)?9Np&9G+qP{} z?~bh5D+Ao0>NV0S+^lXKz@5zAVR>F7-J49O8;A2xMf9G2Slk`SXI^q%*_-U&*DFEX z>$(k&Iq-HJMN@g0+k#dU2^BN?~*Aku$ zHsbv*r2I^t8DfUzCg2V{xwIR&4o^*W;|ZuPoMG(7=Vm;I)g^XMd4BmPjt=Ju9q03E zN#&=0il0nkx*c!)1`k&y3x4bq2fozp!PSUg^CedgQu#D7EvF~W>4zB5!=6smm7n6u z$mvJ|Cyu3_8pOu_w$Ipv(=YS^-T~z0Yu_-giCjkEY=-@JN((pOiLC8tDdDN{Ww3Yr z^UkgGRHigv6i=A($!PQpC!K7QlIwB|=RADUWS{XAw%ObVd|JmpWVY+=)ME$gVS%@E zaQRIri{H!S&Gl|Vy$hQNKADZ@Poc)Q^L*Dgij%fD{`hyf{Hxne)OSc~z&)QrpYyra z5T1*}sfWZbu)K1sACE92mt;h`Gi;^chyACEWx z2DG^R@uOZCb3CCcaoviTNTZ*I5q)v=as)H2I8q9EI9C4h`aj(RefIwu^g0gu{_^_& H*8~3xz^s@q literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f7b76e2b61d17314dab3a798fc66fb901ac5e0c GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll new file mode 100644 index 0000000000000000000000000000000000000000..3082040540c8c6b72f0a3a02f17c56a2875e473f GIT binary patch literal 18944 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 Wfc$-Idc~e_pHkibum1m*2mUXn(%Llu literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll new file mode 100644 index 0000000000000000000000000000000000000000..4d4a948e2b4eea29469769a19b562fae095ab494 GIT binary patch literal 16384 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 a56{`#e0ACXXZT|q-sW-sDE=Mkf&T%CLq(hb literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll new file mode 100644 index 0000000000000000000000000000000000000000..7cce1d8d0eb329158e633128785192bae490d7c4 GIT binary patch literal 19968 zcmeHveRN#ab??4+KBO7Vj5JpxV~jE5PsXx6mMz&BV~k}AbbcNN$>Y}B6 zjq`qc-_Mao;L`Muw_eBGea_i?pMCZ|XPd-xB>9QvPid`1W85 zKyInJXlF_YEe;j1fH@ zjfR(5qWAX^?NNO6;)7p$-fry`T9Ry1I*4`v6Ev}D9cdEJ6ds}$$*ZQ`j9~rc_XHsD z{PWTA8<~~=b5pCxDEwX=A=<~8DWbQyBWC{YBZ>g`hgqUSGih&EP7*bG=#41v@|4qM z{rWP>U9ewlVOuS|ZMG!Q@pQ3NMAN2jQ^>HPUO^~s!++_bo;SeAy3&1kSk@jqp5Hd2 z?Vh4!W8AO!u}GBylu%jIh>SaAj&;6E3<0E1YX zPZVB0#T1sdirOKhwZli;2l7+TglnszMzFL%sxc)6gH}O!Q!Uqp%(YOsn3BQ}G8ekR zs{+K>Tud>!+Lx%Qi&2x>7pWB}<>wTwND4Xr_V1{vMa)2|ugVOnzshtqP-U|E+$Qu> z>Jo6Ik|GC&w05WjH1}V;bP<{j2UCkdtj16ys8*XfX{$y#In6kYQW(-zW+Al{tnIc8 zv=uKw0Y^rwDI;OZ&_o8~AR{0$xZuiQmx7}45)^P`pj%lFsOAs)s^~s{&|gLWuvQo; zXvG|mh=~WSxL`^|=Ri?^`*t<8jIHHP5rktiO7RkCPFs6fo?6BHV(9~%oMs%PH;8mD zxcYLx!H#(8Qjd&5uBBEFane>j$jNEOK?d9l8gjvw5fGP$=5g{BF$Cjk5jKsd&{e?; zjpa}~94uZT_^gA!z*qsoieT{`A^cz_0pp>_yn@bMC_rmedM6VG$lZZe~;K zQ9IQM5Y>F==Ari$17RR+V6Fs>4ah|_HMJ4xnr?O8^00WX+E|T4jN0l~O+QvOe+m^= z(aRaN!la0Lnv-*F7>|q8HoG1~VW7iR1ZBTkVc7KYg4Td~$vIQ5NQ(zjmxGC3ZmY#N zq&73UofL`b4fOjD(gF;EBBNmrg4q5jY{x*scAh4d?R~JFCr@!2wkPVCw@u9B8ZZw- z=~tub=~kqgs`*mrMbkQ_z&cJm)=4$nx;Cy{VaV3`*$SbHw7B1Eor`y@gF%*kXKt)# zUx0p$u7=aVKAyDUU?0j7^Wmi8tmt}zf`o}qNjz|V3A$^MVsHuFORKhQx*D@&lMn8> zsTrYSlY%+C=^q%J#Z27vGYs9P+aPk&r{PGOK87CM#BqAlhv1>4mN1pVRYYIEs#Z9n zq_zN2yb--?T!~z2D}a~sr5Z}|RXlPUtTqYtzW z7SFP%Ze~k*NZT2)m=R{HFx6yLD;yQo3J1jtj2^HVm}xQx`jD>a5hvkphm*XA6F7+k zO?HwPJIPCzp?}m06X7SEoNGhhnX^D@!cTUv0!z4lMO3bcb`?`4#?Lo)f@Ou8FilFB z>L*O46INB}c8ri2*Nk1LVe|vE2DCtGH!^Gb)C(~8q}6z!x`!LI6%IgQ1Oq7iQH-iu zVIrpDX-?0z!3M9!ffNi0SC_JY3d2@^+<*CE_zBe+zf07)oZ#vjiaCDESg2azqzX^1 z8NV~oCTx!13J*!f?@~s%<0q_hj9+U|3#McM`_%bPhXiX!FzAfn1jfr8!Pej$Ll`uN z5a9=^cnZ43uTO-Ev%z$HdyN4uZuaYKZ=z})v zTxK_D4Yt`AI%YT2n%&@-&3iV>?1nkaZZOSWEjozS6;ZHaYQ=chY@sKr!jPy6N1`fK zEwk5nY!kDwC$L5vOQGWkVm4w|&1f_0TxK_Fjkehf9J6Q4*G9+en=pecvm56yyU{ee zLv#?WE23b<)Qa)0*+NfLg&|QDjzm?eT4t~F*d}K0bIe}vA&J>onQP2u*160MX(8L} ziyX5_ zUdBg;@_;jx*abMFEJKOSK#d18>s&(_)uQ%LE^;~~T04~3r&#~izVsycSZ=CC_v+6_&hgs5E+4J)QvjCbu8dZH=}iK=iU zs#4Xm8~Y%~II(-svAfqpLX~h8t89(k%sQ9d&04c#ci6GJxz_Gx$L^OE$L{7i>~1#g z-XThe+7;2TVyeY>*KVOFs=|;k6;D*9s%7_1k8xu6A;<1r9+KGIFHOpfKwu4?Vb;0q zZqZsCyPF)lTWalYaqRvZa_nxI!|oQ-?%kqqACoDs&FK#%)%i{ zrg>$d2;zOYaTtbRnlYwy1o@_y*S5y_Oe4F>gn0x=m|OXTxfz!oaXfAvblT5@**X1m zqaFSsTv9PYG>HdGD5dJ0^S%arlbnMFpqzEi>xHgZB>jA13mORaGfuJQF^?-?2ai}J z8)9rG%wt{)M_N9_G6hkV6VEYEs@captV!^6hR!ih=yJ_bd(3n3wxRYJulkXCXFMOV zZ7>~YJOmD}ZSX70HbnKhws8g6hOrXcFab^5;~cTcceQzI@e*9;+vm5;0sZrrDuqGW4MdfkRL1;bA{0o zbNp)({egJD^za}xE;H|Om+m~=kI75(QGP1~+V;FL%*^}LNf&8X(gUkJnU;+hIlz1vwo;A*RAMeK5NUdn(HUw%w#H2O~9P2W6H8XwT+QDczd^YI6?AgyfR7XMF68|q%Fw1pSYfyjRkFQRyh5?(@U zT229F7Nq+{ z@{d3bk{;w%jw%duer{`f6T@wSNi*W(PAH|fngXmjXPcsG44@F3*h8)ysfpv!^T zOK(OsZ6mdSCrCTBUxziC-^`Xi8dm^!HM70@wNrrC1{nTx>{R$5jRcN|_EJY&(*T<_ zZ98S7)8Xy3GBh1-Ctu`1yq)e29*Bo&UTiWJqjj-AfbFBOg-7(TK=xV%uMxE1t?_=z z-w)aafm<>B3VeiVT_{Z;7nIWa=&kWT2PG<{OCz_&pNEIXrL-@0Yy2=u3Gyv&p>ecu z825B-GUKRS$B7fI>kQqpLVl&%BuFkL{4rSu-S;9>akGAZ39rGs=SsGstG%eRjY(Eo3tUWs;tbeYD`lyi<+{R+LHECigdCIQC;{;9eg z`JbxofWJ|HrYf}1w-))Ue9W_q7=DqM=Wd00-cp!nmDDXu-LFgCm!z&=YAy9K|7v3X zuMqQpR$)0L{GGyoTKK;sa?T1q;$!|*KIZQt*5NT}{g0$>qwriIbw46?pOU(-3qB!r zJEiUxsr6&g`61D{MfiJ!|2E-&R^+@X_zRWwXzLAS^Q<1;4*cBxUrXJegyYat^wsDN z)H-dI9z{u&C`$Cv`DM&xac<@e{DE(e-!1)IN`b{JB)$W z(#29@nWs?NFQumxmJ+19tP;0?@t4y7P`>B89;NmrW(ysGoBWNmUP>(GHk5j$WJ(Fq z%~pw}gy=8K5`8fENtBi?6)9Bk-Qy3_7AcwbHBnzpX|I$%G5?0>ef}nTUkxoQr4M69 z{UKhu6EDar&y1Oiqm+w`k0%(QTbB zr$)C+$>eOMPg^wRY^9T3E+?;s3L&^U@Y7ffRZ3#X^wG=6D|986J{2>X^Lqj==WgH? z`hf8CVjrcD7v3z?deD!xHGn5XcVnf!8#}tYQMwy(@NVGBQ3ZChzg`F!#+qG@w$M6( zmkaC`*e~#az@q{)fNgXO;6-#lV37V9a0wzUPs7=tsewh}~xXS>zX5d6xDX@>n71%K-!VVjzX6^+NDwz(0+D60jQj9DPEh zeNkBy`6+!x=?(uCJ*K=6{3p8K#9I=2w1D!4^23%UOF~i9js6A7pVQw)S1KV@ zjjvTMRQEJ(1kA^_DX-C0@tm?wUF|oNFVddS^~!2`Z}cXmi;ns~t1P4K{`-+%7=Il3 ztD2q!ToHd-*&=PdM%Va`s+X&8g@)8_wIzN+eHHjNdX)}`#?-i?#wXO*=qBy7swj{6 z{;S$6lJ|(@Jt8xsJP`W48dC1?eO)~y)MG+DCe)+q3jfd4qiQhD@F!S#j;ag83{zMW zGD6J=H6!?p;J46v|I^9{Gm$pgiv1*ND6D^6S!31Hl;#;71*YH82BE+90z7s@VH>I zf|&y5^T8>>d{{8|34BoCE1(7&UJ>dm%C{ir73C4SrU7Rhng(Raq%xk=N9g5-`+T3_ zyr1E5flmlb1{iZ4eSyA8k7I3kj^4nR7tbnhDZf_d`FIb5N|^h%M81wB7JVG>`;qSf zb_Jfsy1}c3ihVMg!EOZ&V|Iq{Zxi}DM4Rz~DNI|D57Rc}o3N``3b+IL2<=8bf_Jma zQD;B$Q96kHX1W@EeVR@ypHL2{x2t!l-&Mb_zNq@Ac;C&s*gxK9AFQ1^|2gCv;Ta+HP#8}W z9**o$Je?Tx%jko6uAx4<7tcd@zJcdSJU_x$IKQR$(=ufUsX<>>4EhzG&!`6d1)iYK zAiUBh+OktGcjxmvjAGA3v8Wfyhx9_GQ0^{G7P4DMhKAO4(3Y(wH(hU)JFT>f)60j3 zI);$hU(|by!in7IL{T5qi`V9|dTHyhMP#mZ%vF~~D2^^Waq7(ET_x68N?7T7q+_{4 zZom0y)SzB2<50VG!_ZKt#nHv7G>FU`4T4fKYwj!>6XPYWZ&l}Hf=h=orBlb(QFpeS zGYZJ;$(70n_0mMX+*>x7!2QHb1A6(SF|vIkmmkrKATX}`x=gMtrT&9@W@KL>Kgsn$ zb$cBqT$@7`*Vgrxtya3;N;|Ezi&L=-nK>*2DqU6;EA6z>E~L)r)%PTu(-O475@e;FR@#Ns5j4XMEEX$Sx6zVd zrJYvVWu;cK?lOzbN;|Ez%Sx?e-6o68N;|F8N^qwlUAEpzJ2}N;oH&uo<}!ItPXRk% zj7;S9t#ri58|m)h@$}(-8r91~dr&D$gOjDQK9=q=@_AkSs+8WT7xZE-OZ}ytMa({Z zMBIVubp#{#757f$&FSIt)OeDMo;?_@THU4by?VLFDC+5fYqKw4-Q@Sr|xmM+zfo`W-iD3fpIS=S=*78#`T+o2xOJd~ zlf9WSo$zI<#4afm7-PA%r8~*+=+rOXJXp?@^?^+GWUc^4yT+*9#-1eFZPd?6h4uOmGk0 z)^G><;fP-3DdkqOiT#BWMsZ9$JCmQ2%U-vH&lO^JvNbL8nd>E2a_M#>2z4V9*|JO6 zRW6TXdbkLilO<*flPO~IFQ!?}E}?4j2BZ`#ryVTr6MtB;r$=+tk|VR0(HQ>R0Q zMMH?R;+I`b3`yH_yToh4;hY2$-Y3wW{=GYo9^NZUg*o}s_SEHg+Y4{Z5+V%4j1b(duF{Ep0NtKbLdE}Sf0q_d2r2MfIX-5g3BZjg2Pdq+mn zp3v$N?4IL*>zUzw*O&DIJ5?!N!%?SmYUu8&<&j{zwO+_h_7|=(S6L@G=_jmpm!lAG z9NkrfTtn(2CH8qJ5YTshRv#Br&<|E8?k>TyI(pCULa!wr|IiERYyQ15ZaBFH%S6c( zWLsJ`Y@ZgRHmX?>>h+Pm`JjF*L)I>s#@y_dt>vMiVRLs({Wbki z6la`)Dw!i=t?EtRqS}yc+|11YueG(~YuD;`ZLoF)qQq?M_{`lyZC4ia5Qw%xJ+Vm2=sW)BWDrleUjjyax*O^=;)%z)8EXQzahN|auy&}eQFM2n zH8a7j!(J`xl@0;$F3)PSKT|CCpV(_)7%&#K;!W?SeZ#yk@UEKVB$6#6XN(W^;|PN@ zolr1mFjqKaTDkrj2aupqi}6PNS$4Qndp5~i(b@ydX2SNhSSIfPna)N7#;(ShaD$qItUS?%ca~MB)|&d#2Ozb8XFs$vXcRC5 zE$NE$X=9GMlWTDU+)sOHCmqF`>%I7<$839TO`ojAy}XXTDT@Z9cpsO6CK>3ULjxW8 zGHULDR#~w-M>im4ZtlCaxMjqd75NG1oRvKJ@WG4^Upy`E1y>29kVlP4XuvkrO*^V+A7I{v^TQpAqA+3+K9&O3BxX3DG4nd- z^#+2J_|#c{gQ6{KYKu?(5o(Po+K2F}KuWFDz@l1AIm;T8)TZT>R^kdN7LnrIYR;|Z zTnFbmIM>Cwt^jgVKaV7RfH7_AwfNNQ(WGCSdc!KH!thc<3mfuMEPy&wuLhE&O}&ZB zb7+o?6n_(HQG6i&CKhACjf|WQ1o7u++H@#HDj@!gHQ71z)WU{fqiGFHxyLdrKJ{5` znKpI5)NgAfg%Q(j=!s>YJcC0WurcImPFlX;{%#8&=n6t3R3jL2YW9!Ho=V@ddRAo@9eHF|9OXrMenyjBrQU zGY-5hOyf=xg6(yUK*|t;<3lX^D-0fG@R%A@QHOgwW~C~)5)vH-BIaZ@Matk#3%pU_ zEtr&;Pt(vB+QyQq>;0HwaD|9SiI@)k6ZRZTP`q|h1dl+2DVq_f5Gq55*GBC0K8+G@j2)%I#$Y)vX;EK2F5DTe(fcH;TY_rTN3k4ihg0eCLSIr_O7~ zM*9?s9@NK;QjT{zxSH8=5|>q_&1=_==E^50hSOPNY;D%a<4U%$HZwfF=GqB;O=e^) zS6HLxb-vSCQ^u`tDO=2qm)GLmAzL}3(9robpRPH$%Qjcu%B^zWvD9o|<+jm!?MEL_ z=)J$AMrORoS+|a8NTK)rj-=a{53ct3ZYQhI2mkHzc{gkx=-;u6@Qu$rd`L4qxh8AA zIbDPME4;iRI;POozoVvSbR7ONCZXHz%TY1%nj;|N!K zxHm8LS0~@5((0r=hpd^fI@yC$5#I4$S&tr?T|VoY0WzUbx1cN?C+|JHXa;bd}2)*PTEo0CiQ!jjdD z;v--Q2&SXx-ac%$j+?fVa3v?tRqJwlhJ!0`F^P%D|ErQEs8bDBKUrTN>t6C*D0TM6 zFaP!9pE~>4BWLe;SgN0oVrL(|<8Qz4v9sU2!_ta-is%D(e)n}!2KKASe+$oBSv-AA zF@HR(_{+UZ@jNnuXNQTmp?un57mywt>>d2eyOiWNp1WxGO+8PB9{TjiFIYzJ=40p- zzGx^NlZ$HWe15Fw;J~pX6Z$cU_QT`HGNti?US5;Ms&#BkULTi^nL~T5&NQ0kH^+?O zYmUj9bqr##)SXwY^!Ugy4esh*zhNU;+TZX4OMCRt*rUN${^$2@{#4@mCo-L??wY%h z^GUbt&DsA46caauWw={VyCBYExxrsl4AKx_A5P_iIQ#FznR`g?0CphHzi<2h{v3Zt zWPk5vr}%p``S}6a=e@sP6ck9!;Pkx%XK6lH_v4Ix0_SP|ErT@vzxD8)MFFRDKJDA5 zcwxX-y#ETJ3Un&VDZhXd{A@`t2u}y>Hve_u1_ynB2S+H};TX6*7?(EOy9AbBd&_~p zVZyg=iX*@N*?D%ov~@dDdt=03Exyz32+J~cv~4n=mMzUmE0^gF&Wh{@Su|2jlBhQR{ zAditYgqS5<37Bvs7!vY;tT_TX2qrNbU^g3Ba*!;$8;BiZ6S8>_*oA$NJb2%#?%&K$ z)|jw)`C~ty_r^?hRdscBb#-@j|GIx8R$X=zIf%%K??)dIeH$r%8U%hk7(ljv?05Y1 zc+m^vzHO|0VO;x;cskshN^Va@d%~U3L?W39Z;gdheTi^95pG`77Vb%Q#p+8-edlP^ zYnKtNG#oU0aOIb++D_2;aIrCyXdgIk#Win38pihszC`7Mo62rxu>JBm0SG>S9JJ-r zEXx1oQ%y1ppN9?;tzqN{(GGURnV;iCCE(q1D^dHIc^^lIiM+OaFX$E^zDq%u33lLIUfqzFpZDIziw1*Z~OI?<#+`Uaa$*vdMWaN@{bz=<>4 zz)59x5hn*&0y3B0T3U<-d zuclDAS2U!`7~{f<$K_IJcJF``fj=r{I`iFO9$W!|iPNhl9fYr(AG$w}Mx{qX>%;-h ziJ*KPnFrA+cBxxfYOF|cP6WE^$dL?#6DdO8!PcSj7_#p4IFaX^$atWWro#RSKnShx zcYzItBP$3Pm~Dz7$RyoVn!3%xOh+UDwPZRY6`Zmbk5xzzFuWE+kiuH3v=(>?TEstK zaV!c@Y6e_qrZ7l)9g%ZjtgnvTToYQU%o79*A2W~^b9zJG$Sh}=&MfoIgA<`5GDa%m zv9t>Hz;}T(#y*eFNyyG#1Rll`VgZk(m7F-UkaW6T+0~p>W-sLA01IMB!DARwOhh6m zk6|j~bOTak1=6=G-BVb18y7UQmvG|9Vs^1^NV4vYocNvDi#e^#uIJk%ALovUV2Lu75)M5w%hTmcc0tUvWDxwiRe365=sB#1W16`{af`AdU7=nO-PFE6w zs5Z|+n_+5z%*b?LBR+Ka+|x=yp&Q-lX|ViCGXf#E89A3Zl>o(cUwm5F>yo+Q?|Ft2UkF`&rBg$_D1Hjrqt6GT2(b7U60&*lc)~Enspfx2Qm7f zD*}~uGJsGWtbj=E!4cdHOn*sh4`SpADQWG&YE4R7dk{lZawV-jSgT1%YY!qwNv@=| z2hkuQC9OS(NiC$LwFfZ>g_P9Re6jg*w4XnzVgr$bO-qesjIBz|WsD6WW|@sBnTXr3woIZ3tJ2AxK`^Hk-E1TH6-U z!ehWiD6iwm-DszodH}G@NPUYNje+RPhZdH168tv94|)5tEP!~#@}?`xVkRa%iOjWV2n04K4)0N_4W_AxJj%=C}XEwu$ zE8E9OWp+0w2UrlAVGJ}gp*6F=lx~EfK>A*#dp_HFB^NZa2RU(M`#EuD4{+kjW;vyB=osyKeBq?=!i;^qAu5bpNo)MlK;>i}KT#;5J0ax-urrZH{h3D1kfODER z;7ncw7X89K&EwW+z%!MMQM|`pO5?i-UCFqIcJ3yOK%!i8a|qk+AVdxrP64xjHbw>3 zHM7n&|1BwiNs687huelQZab6lQ!vbaDUFEWPOi3< zej}d;e_DBwH4stylWT#d*8yZP0bvWeA5h`**rN5w8>CNVd zi9XqXo8ByjveT?^nrbI*2AvVi?mBwqOYEzD&Mh$yaPna#{5R69w2DI8#n6_;1a_Kc zKPTA*jE5AfpNZmEXH>Y%u^+11LdtO=WphZ0OT_^fFAY9=b?PS&_Czja*{RfszU2=V zds>1%TZS*@Gu2`r;kIowxK9z+DJXrq2zKc{#hQy&sy=OG+xr#7pHwmxNc3Qw%L zJ{87fFwA}tM(DJ196&7L$gUTIrFd4l45K9!iXb}H(bPR) zYyu;7D?7RjywrWbBAdaRG<7xN-XB1wJ3uD408m~RVuOo*h!ImE;|LK*jU%&eBc{q4 zkf|9?9ubHU=p2LtKul|A5_=eTG74=x2e%@f-XL?3RiIBWkDX?zsh%=SOjiWXI(l`R z+0QxX4^BR;gt2P=Nik^Zf~G7Y0jgn`tVT7(uhwEVW5$V)s0=tGF>cALl|%U+-hc2s zGEg7SqFe5y+TnA@L#LcXA!##48QQ!IGy6)3j6=Qf9v@hM40l4Z<6+ zd1SyjqA0l&l0%)V0vy{4=c4Ht@Get5UztHyB*@-sG`#Bd5=EUY;DQYG zlPrc34|rkqGZFgG!K=`;b1hq?MYnxSi?~$rD~<4t-3L#fy@VDU3n$1Ef3h15&R))z z@Y3#{X!bLa>|sA77)%70z{c*{nZ#~M2=;#xn=25h=`M_Y>_^>{#auvVh_-%(vxoUW z#?2AXSK$eIBE3MSFE^_Y`^7Z@PZmSR=2j2fidg}-9z)NY{hV9jF%NM1VI>@{2Cnj} zC$by*vYo8K?B^tV1>+&b>SrRE;)Wn{`jQ!d3UAOGL9Apes&iI&vluTnE4;7*;}llR z6Dv5k!fPJj^utQz*sbtJuod=YF^AX+PO^vrY=veq6{&=}EP?^caFU!0$7HuC2D{Yk zXCgh4*)lq81A86Ztj6uIft}um%F#t!I0^r_$L_ndJF*|l^pya~egMiMWLPuBJ_l4i zDs%XJIKbtz02M{SBHrn-(`s@~E6VO*t+^Rd1gDJUM%F=oG!tMh53Ku2eGz=2#6%nzleZ`{?hLv^-swwVEE784m=kBJFQ5W&>0lCJ+7v6pjs zE6C}Gl{MCUk;2gT*U*HJ1GJps(fPH`*MBU;>UarN9YPsgpSWz%_Ww}lv#SY35sb(MYa?Lqd zO*panPl`d4_-`*4?q`@}FXfhN5t7GkEZ52rvRvo+xu)mV>l+UjUa$YjMSQM-_9CG0 zdJTHmdJTtAUCsQ*kj(cXT+Y9a!H*pPU%+_hg&UCswjvZcd8^^hV)BDVM3D`JJM~BO zuG!DrVew5#sqxAJL5CWzMI(6amf`Bm57(TZ)ymCQ!_V-7ic^S)>}VHXDj>N30p^+g zoC{xbV)L~WwS0}P?A45ivYN#d?>FnR2&F8;2?t_# z7GaVZ>`JqriS$-x%Mh^*Z?$|E>{+#ZM{YnY;#GD6$;aCexp63G^YO?{;G}N`NPZ50 zvIx)CB+5?@Q--A3&zS|M%I8^uEb6|X&%UTDSNgIr#pX&MTsc}?`HzT;WY5w@c?JYgJ6hi^9#miqc?de!==Lw523iVzs3f ztCVU>$r)`a$+gAIw*@o5P+Lk=TP%}fXiQ4&PzrXVc%64BeqM8=`jCopq3i%VG?bO; z6;g98WDRsZ(qv$T)Nl%^j+K!d@JDW8m#Q7gUrenhaw}^cy7rBC5lzAOQgjriFwQ-2 z;oElMQbXV7mVm!!PW{aKb7!7AYXJz{RCNO`!kC?aZoD7qC75*++A^tlVmsDCd@jKK zya&7uZM1T^x;vk+Vnb^)vNnO{gT@I}l`V5qQ!&Gf zMRTfT9yBjBE~#|W_M+>9ZhEAG;r}YDhUS-wx!yne7>13jLY?%x3ad&^%H8x#_4UD8s;Paad=hmUOZ-#mJGIvbePkGy!?r7>_DYm; z(|Z+Hh3cukYJ_Vx{krt;QOgIxaODWPwI*CSk8bm`whLU@vW0ZYR~D$H+e_amuca2i zCA7WTQM;7BU(r^DE1K$T**uzCa$mWh{w4TY$WQ$>uZ8B(7oee*>S2kSz8XAO>!#bv z4%RND3j<|=sq}m$!@7zxc=((CY}q90F;j_ zxphB5y>9y7C_9PXuUz7vM4ziz;>SU>$-ep(JUN^GSpD~~@aM2(DP0rzR~~k>1WOQ) zLW2fzJmMR1eQ<$Ld|P&7)#Fu6Iq)r~xxUA%ZpW-DrF&4~d%<6p@f<6Yyv^mmEL#Ao zT&VUkraYJ)T<$m|7hoQY7HU)tQzdkcP<_QrmD6;g{v$ZM@@F`KIZtdk7MfkT0MtUs zdoi>J)Cf>qdq+j3lV~ih7V08Rtrf|=pcWu+y-;zdqBaP%q>QQYbcIk?iR3w$zig+s zhV!OSQm8G(OijnDE1c&lda`^0&7!M?dMWsB$S`Knr^U`d<+~xyJ0!Mz+q*VMG#eC` zdjiw~P}hmxNkGH;`joIpI7MdCTc$$y+UX7t&#&4j~vUKznW%>RN<~ z1r(>dgnCh^-E_B5e$ld@?!{5nZSFgb0CfnwQs8eqcjDQ1vcMA0{Vsz(?_y4~=WD>D zo`+rIXs-9$fc5UDzytzAI((+BOcnS97Paao|8X*V~NT09`3? znbhv|GUpP34+?*`;BQNAh1A0Gut#7Gat(S$@J+7g#KM1oZ9nk*6mY-iWt+9Hi}?=P)g>)To1FU%^D^-NX!3Zd zb8H4~NL`)8ZNJB08Lro$kBm;hMzb663NvG~WPi@`)s=(DRrNk^d>Z&dli>$+?HTf0 zi_WxMmHl@bF8?`{J)6AMMlNNw(GT3-#yiYAzH1*9gj`E`wCA9}= za*jIb4p5_(e9-ALDyUUck2}k8pRit2i^^Yjhv+g*tt|f?s7^(R&PwXZQSZ1b>5x!| zsi}6Iql&(!%iU4&zPpAV)6{(x4o?jo6Y6U33$=bvEj^>D=Ziw1o>!8nVGO9>3-z4A zo)|?du|Fhw#yIYn<{3*zg}TP;EAtr>=o^|EQC3b9=)0PlR_rs*q31NUu(%v++KZav zwojyg(iFFSBAw8bv)X4&qTgsLSY1w&=xs$w+b7cpI&V_ZEAGi;o}+qYPLYcyQ?aJ{ zi+o0eDm3-kqH>%HjnWkN<`gc8EO>u8dr3OXOCiF@jWfdj1)X^cK zo}+ht3q5u8l2BLE3P+=78vV{DIi21W>acf)^O$=&{ZUg3oyS2rCvqDOd;c1F^;E2> z!^o?r3QaA;446T+np%$;FoVWx>U7O9_e`3isW)qmgPNtOcWaNiXVH9386%H_YS7fr zy~o_MX@#a<^BxDaMpLCDkGapKjhY&Pa_7=!O^q)*=AJ__P0cJj4ys2}j}#qq&!vo} zzFTx0)B&N?Y@A1jgi^C{9yc7H=Uf>_iziRr;b`~FS6Rrr$+6k9&_?a_ET-R!meU58 zTS6t1IQz80%&ZyK3Yn%6b0}4jHR?dQ-?9?meNv9%|KogU8t#r$ZMiDO>L<4 z8O?OLrn+j&shPSIB{eLgM2^aMmeEaGGK4YMLSN9-XpF%Yx<^yXoc*3wdO%Yfodcl0 zt|-xYAsx$6*LW_ZmxbaPe!XWUc_(xG)O=q}bwXX^y`$n*&ssWHQ}LU&6@gA#Ur3rYKmjQI%?O{^F`kTwMi)U;Binl3H6+DlVhi61N|aLZT4)W`4P5- zBg0FcOX+5zRAkshw`+!Hnzz3^S^_!k;v_+LOn2M9Pj`P%*@20>IYLrkXjSFiGJoW#Y zH`;X4C@UTZ>aQi{P;$2UI{-~)8 z{n3-8+8M0nQ}lJi;q9e*p;WouG+!uX*=`E+STaLDIxnv?Lq8EpN%qk%bRJ8BTAY{c18QJz z%x4rcYRbzU*ozkCIQ`5Y4j-;z{&$_MAzYo;V3*tjohChlXUd@(RH>a(BaS^F!yHTI zH5{Rs^z)*^`t$M*sn@A3x7YhgaAp5PzI?r(q?BFe8EHG)W6-Ce$HZQp@vX32wTLaW zT7jpYv&h?ZD*RI-nXYB8-fQ!W%2oRJ2w!=UHCuhbxt1qSh;I+U1_!ZMoi?u)vU9lQ z!)^O`j@_%R4)(*hFisqlM(qX-=ZwXvn?VX*RK>U*+H;5E*kj{l?NRJn=i~b*cA<-K z^45iKsWB3fc@(~5@Ewb97~gUD@(Do^@!mQB=%O0I#{v3i7GOD^z!^3QY!$dp;H3hi z0^@*{Gzd5nCjhMNQGrho&$1_oXtSG?!#-qj$ouiF_d2?}{@qp;uZMIZ57*87y z`qyF)!J1c!o|U3!rRZrFPP=g0h0|(|9eJzKYOWi3C*aYlFB$vI`@Hu7PgXu?6q#QP ze#0;ugJu+&Shwbd6(?xrr83uf>{XhN5OS zxm~->5_-$o2fVHNI^ahGHvwKzeb{U@{;KLJ^9SaO&hMM+jJrcWF@J3S(D|}?(tJ5^ z!hAzKcBzr7`mLFPwj##?(Kbi49T07EMB5yt4Q*fNcpHAW*zvyklz*$^v-C&D0mmYd z-)$VOzRPi`v9;>U4m_{I=1rpW7SVZ&XuF+$Uj39K;CRUKeaBsr`xVLkisaTfUaES{ zal7=?I7fTvEyv%W)rZa7jlZq=2z9xf#m?QP85-xj+2B^+Y_wGym>=BUMPlI_#=k;h zii1bO8;0Mx-uXCvPm8SsNN+W4|7 zjI)%^qA*s)&E7Dci#L16QNO@D>8fHpc>u=~2Xz9Dq;9|obRA$F-2!+n{SfecdKs{Z zUIV-cXRP(qMt=ajTwo_v6g8lhrvbT^2GQ9lwKNjf(j=TM!ij3g`~krSHDu1G=*x7d z_=s@s(UAGa1%FyY=A01xq=w8PgWF|j$egg?<1}PWgW!!CGAAl{)L?v2@Ik@v5gg|` z;6E++(}JHA{G{NxY~mU znvc=>rJd%Jba81MGS8MCm)xf{WSQ@q-=`Z&PYCCvhRi32SfwFz!h(;}kU5QlH#!)P z3LX`_Q}96zIrme79}#$uhRpx6;Kv0%ts(QjFZc<8CpBdLYl4$gY}1hW4#CH1$eam+ zH#m3EC|`qMewMG%!#{rJPZnF(8Zi)g8&?>;#sT9- z<6+}_#Pl~YMA31$?$bA!&<@TlrjFdMGWr{8x9EE zQOi0Pi{`jK;3zcmX#5PrSzGzU|lx9_nvN;gC%xhxj z%szDj@^778+Q0le5D#!KpecSf;O8RX<%C59zAgsNtE~Zl-4$#D%+Bo3# zfOww7`fJckKok4wiNI$AnplY^1D^wE;>K?Z@bdvp>`dx_F9tO6i%PyVya3Ro257=< z1R(zgW)|=!KojR!=K@~_XyR^dF7OqACeEqO1KtW~(uLSv;8_CDqz$MCcRYY5U5t7R z+|@4zektlP=rTYPPX>*^Hv^hDpJ@WV1<=GT;xgdd08QGCdQ94Z8cf{OT?Dujzsxmp zx3~r}y?`cm@9Ti408Q*9+JI*OO+0<`UF9A?6St2S1K$s5;#XRi0`CVj=>T00JPT;z zm)Croc@>~Z1F*=%6Gs$1P;HC@tTiU!sbCE7Q4|I~hU$Tjp_#zP(j4GpX&&$}-T@c~ zxCr<-Y5+ctmI5D7%Yl!l7T^uA{AT(py+E(gf6xY_)A%dw*e^48nx><|(d|e(9&r57 z@ngq(jw_tooJr>%=O~wRfS)Dt(3$%@j%PPBM-eS_-Hwrerqty)OE{DF8s2$0llPs# za9+4_IIjgyk7t&Rc}&$RCXyu+eC29npI{Rj}oYhV%2yHWU#hR4TX&X2{H9^$B${V z_U4Wyf3eTcnen6~;k)zvvuk{2Jf4@%_;G7WrHwjalr3C&J7ei3TXoL**zUeqI&*QXX-72EgukfKp4=5nG^Y0_I+t`o zh8C@eWrp%*&C)e+Dm4H(OAW}`9?PtcrMZ#~sqUqH@pyMvEVX1VEF7L^%j%4F?ucC! z+pi^u*tw=RmT2wD8Oe5Vi;?tk(%KwPFi6;|`up5}UDwf%i?1J%ZATnB4Cbw@FjP>S-oIc57&q?*InOINW z*xA}zPQ`mbawZM!ALJyZsiKBG0ggC^Rcc!NE1jqr?1b3`oPe@BGMQd|F2+}c~OCVRc=263lG(~z}sm7Fba z2%|kYgxqWET1v{ORXvq}Z(#uI-k|Y5ow99>y}deDVNs#`#FNz6)y3asJzHa4U9m1v z*qUza%k01)i+4uRHzX5yLn0mB7F&~OO7`@2$CxecPUq=W@y=8-o!pkGU$zfJG|fF; z&+`heC)V2n2Ce9eG#$elGTfrZJ(!@Wf?3P<^~MpaS`!6Ibz&h* zt57kl`Kq7KlBojzaE(oUsT2k#hk@alZL!W&EHj*sp>eh>t*LCRs>2H8l`W5UW|FA_B2CG@M5bUyJTqJz?Lr77)~l9JO2jhhOf=CI zO?6Rgnpe&>sf%~SGqJYbXlIOCmCu_v<|g$*NUaGjf?S@@)^w3zk|S0oJEPt4E2A95 zv2-N+QV>_VawM1Lc_SqSVNPy33417oWgtdtqg`E?`+_&cdw0ZAf_8EqH_Te8^t=-z zMUBPas5gY6O389<$*7j;`Kg;`QDQf5VMvyJS=D=!Y2L38Lb;A#YRO{8h3RA>Pvx=Y zv1kU{zjU611tP<5X6HG|Wt!%Stq>qKepJlbIEfec)-+?i(eMdgCJ(_}-m*da)#r7ssyYd;$F%A&vH3>UQ zxu_+M<=)26E!lZds~yYXmW{C#$F<>^t%+^PRF6c4X!lvAtlhWB<&|LRK=0{+md^84 zU+8et9o;9GE#I;X0jjI7Gm|f<8jM}#{yfhTW~I@DEn_`mEe5vmGx4qQZp7GpF`nnp z-y2KWxjdRTM!WlBv_~LEAN-)Ab5~pZN=$_PX*@O5ql2*J#MGDJt|J^ROCYE*v*137 z7d+0)PYJbgvUF-=>$Qtnba^V-!wdGjIcjgq&rB*#W29YPli`=1o)}ux+1R~3nTlt2^iZo>*mCU<>vG!@u_8~! ztZfS|O(wfz(FC<)Fkqcb6l$x49ctor5>L6j4k`}*Y~~ppX?cF%quOqxIp4PRk$gLC zZTgk|y|U+5c!tjnFpM}5b*<~e?h#!XPpBGnKT7+=zWhkCMg?14sBJ^?a~|h40e)4B zeqLFAhP5Vk#^f=+@PIBPsOQJ}*tTw6v{g_3rewFp(#xhSH*v99FRill+1OZ&hZwnR zUuR67GkKZL6VR6@a?RuEO{-&jGk8ehM;4*+AfyMHkOiLT?7phUG9+7}bbTyQzmpYy z@)B3>nBIcvcGhBQDChiM*vGupu>!>ESf*ZRG(tQ@jj{BQot|vxaJph`17%d@m}(4a zSLeNaM*gtQ$>sO*gBEL7VMd?iP%GP{w$K)9(UMF@$5wUHW7(qCdVa=d`*?e=>>0x6 z{p?w?^l_2Qc=hZc(?X+cgWe0aCiY+&p$^-Vgp{(=o%yGX{H`Q_mWAR7r}9(`lqYm+ zTDG86&-;2nNz|sK84o4A-G*b->d+jIZcilBc(_jUlQ*7Bl31f9np-%lv{uEu0XdE} zjnw*8Z|z)i`CL3VHua_mkstfcSX#$f-H*KgfE8PNmA9L^qwyYoGECkgeE|58;&#-J__T?*&e=UORHR_F1)}!QQWz`t#>kM?r+Yk(?A2LpY|@9E6))pQTq`rF zP6qSijVE|oCKc}`FhNpyq?XBSr+J9WW&jVo`SH5~KW&Y6W3!oNZWm4!_osRO;25jG z2qg9Vyj=FLm?o$=&X2jVHCuUQ6B|~3{_IM9Ra}!`KYYTHqOpU#!9nm!ktpe(kbyI=LYz8{Z>sT%Fvj`fJ#pX?=|M zc6)F`!!q2%IONftzK_G*|y8+^C>aT!r4tth{1}LN?>MKqRLgQ4ZF5p49|e*3%04HKs^|-xGK-*TlHy?wp zb-0a=<97gfph2naz!QWcAEasM?}p@l{029QH|b;0X|L^*YQg~+^rxV)7j1~6mc*Z< zsbVkg%BQ1rFDywwPZt@Liq|JJ>lJQ*Q*IHrlkFx?8gL&`8T*f=Gq4Bl4fG;S;wGM3 z-N};ha2&bFD~*EBUXMbCDp)culI*wbENf6v6xN8(OV5X1t|i5ucQm8?`Ov6(3mn&U z!aEC&nMB2N@HWIuyalm9@VUTe;UA6t!+~EOY&`hS9VH)i?RqcvpVv{xkK0@WrB~Lh zy?))#t~11T?)xyEh_%FwaW{YAGwHR5=dCaK=*3-AS4aBJ+xp@z_xihUnI-zi?J_E+ zZolL5*40<g}55Kc6nnwS5-3vEE-`M5Q#qH~Z&D=*rdzVIb%4nF5k;2}Y z0m&qM%Dy+wzW{kDlx9zM;JaUXWieXZ4QZBPKKDA0F-6BA-;I$w2`PJx`)V=Xc9@B` z9H?rNcu$qchB<9Hu~{iEv0YoW3$Au%0qm~i{kWNes$xzmbSvI1{zY(P2#Z;tTnoH1m+uv8MZ zuos5vo`GL}a}V&?OhJNiI(G-^&Oi(I%nbZvuf;Lr_aZ-z(agP4k9SOV19A&{;6?lV zYzI&E7p*DGUyIt*=;uDdHXSX9q0T1M)rmIZY!g%rnj2xoe$>|qTf+FQ(Q>ghfgTKt z9bw3^d>9f|S&`he8j>0Cw|#;V(;&w)i`&hu+b-qU#vWi+4VGV;Y-3I8n(zrm->kMX z^jlii%Ewlu;WBCP6DY+Rx{+=d?N+~xBO3TtyY3nuIQi<7FuPebC_kOTViGIn zpvi+yP2+lSHb~>ccx{VAZ@sRPwM<5?3M75tvN_hYvzpD?RQ=qwJXkEpu|xCqUj%AD z8LRArb`9)cC$ypiREPW*hb+<4kB@)xhqpet@{xO=NIm%ex1J|Qm<(swFuX2+KqaGo zSJ*WCfQAuVEbt1+%(}rD9bC*wVBnO~V+6b1m4O~3xC(DJF;YREnTBDMkHMcQLnhu$ zuMD<=%c8x^>h)Fz2ktR~1NU(qqpFKpTv%hsh5Uj0EP)4vd;qVy2M22`=285O>fqow zaQs@&QHRIyd+=i{{&*^bgHw!P*y|QV)w@rbSk2Y%V?z!o#wcbSaCuBKSPdm69O3te zq0Jv0cm@BNrsV*)764teD-B4!&juP=JJm|XM;1&Lou*pq_Twh=VT+V1w*x<5w zc@phn9Xtl0vVuUfX1Lk(%`{COB;{iapU+hMV7HUs;NpQMm7+uegL;GUe2HEe9MPh3 z!vTAu@DqBbT$phlhrz)fKi&XE!Wg?EIM`S2ae0H)m4Sh$jo_%@zF=G#KB|cA1QSD8 zXBM+*T5O7^*c%+B$-o96&l+a%fEIweAm^Lm864%W2s_zn6;uJAagG_-V5{^1EDjDF#XLkG^=YeC`B}N??n4i4hEU4AC(p&cXkU#0U)DTv2z8)c z9-qmrJ22i;I4N}nTa<8MLvUaK{UeT)Y+cR3N!{cYSjVHJMK`9U#By;9 ziUzo6nzhQ{z}3OHJ^Shfo-(ggg^sh;c<9VNcprwcv6hWP)f~#{TooKRWH}R4=@1W| zb`0>q!257Kpyj23_w!yFc;Bl$F>uKHe1FA9FHC=Bo%iSy`{z%2<)JO!nMc>0{`yxR z`k$df&m8j$F+a)UgA-3cm`+}YJ6O$;ZQvV5Fzj>(2c8h>DU4%eHCtILIqPi(?^^jS z9*hbO(~w(-?>P>4U<1w@P5HrUCvXaWAb z7(%1Le+|fx={@kplCUaK?e{|imU$6dg4GgRsu9XCE2??ED_8n>4k(l-)W8!e zi~Wip{lE!NAXiZ`Uomr8xvKD=Ws<()FIKS-G2kS}S(%D{aFsR9D8Z4D2Y)jnkpqha z0y+ho#inLuQ?rL-2Q=htTbZ|QrP%hiz;|;NwjhSU!gtZ*IXhddT3a{}Nz`+(l~}q^ zGkA(QaGz?y11dS{@RHvVk+0VofxC(#mWNy*;TECU5uDwe%U&tjZwq`kC)5I6rqjUC z_3~T!{29Z4W~bd8aWT#$Rwom=>lePc-kUZc=V5u8hgb3IS1)VF$&$RYGELuZF5WY{ z9{+orc7G^$scnCup#{5B3=Zj!e*(+g+J*pB3?G(vrsBPs8AMm$?RtGUW8KEcm5e%)`?v$*x<&e|OrOK!q+U*v8}n}o(`5#2 z_={*)cPcs6co<)fpBfBzP`#L--(?(fSyWf>m1X?-JX-c&R+GEz%^Nfue+dykiYTB; znXXN;-wo9bdlUBmTE%=iTZ2Bv3LN7WXb{dmFy_@~@KOFv3(?Np$yojXf9Tsr)52$p zfTP~SSgeQnv~UxSAMx7J;zXw$peQ}IIDtE}o}3=*!Ukvhy%w%s zN3vCBW&D}7MRT?BQ8CxV>9AUu`DfOUZ;y3{#I;!Xu$rulKeIOc2toB7hqN-pi*CG1 zXWg|K2w|K%{p^EPzjS9GtvCw9kHyqn$6wJz*ovi6^2(cJfapnY#|8!eXSAriI?$1k zyMHRfZ=Lju3mv%mCu}~8)9RJOj$JrImf}gg^n({{MX$UE%mm#9Gv9jhd;Pv}csx#? zdC-hs7#<%>jGx9VJ|Itn!TBJqF|be>$&wmlX$Y*1rF!CWBz;y9TgX1UjE>UX%shMGUbK(pY!>lN*Lhh!*c;_SB&2L_WyYS*`XQq39 zcrVtAFkYDsb0>zk;|d`W-U{}AYq3}=)-@gu&HA!m zFWf)+J%LZ!NvFR1(67IDYrr*6Di%ABpM3JDJPB>T-SdFqMBPTly3r5IOcvh)q@ zytB&>>B!e_x&QQ`Z@qr|lc%1#HK#EDa~WmntTjR2jqh)6#dojDW5^K#e~tu)Mns=Ej4ux7?H~DxmW{E#t+{Q~ zxt`j6znHW9(}|xHz4_iP5!TVXa1-9Q;LFMMCb_=VVQ5p+`c<1Y_Qf{I24!pSrf9ks zuL4i+#A}tCdgRv@=}miMo%jLLrs08VQ*!IhO|pgBWP5)YJFo(>^}StNsja1P_S|`- zEj;|Jwh&%uIC1JHqZXKNJi7athkyTbwAA|ip7F3n4NZS#lfz#^#k-)*-QBCAh;Kb< zZb7V`-!xO7k0wIPneG~@?*AEz{~jyh7p*ifw8?5k!WMWKpXFNcz2pd12RutzpAyF$ zpd0aP%?`k2IG=CB(c>DN?RUsY|8n5`dCK|Lhdi3CU-elj{_M1ToPazB?4M>3{0mgR zSK^~gzE5h!(I%h$^5-1c4e^Pwx?kWsIO`Td1n3cGHWDf+_TEW+$i;~(R}tYOIvp5?iSDR*PpI`x%gAvy>#KmrxP{iTl2}< z!|j-fU)LM>iz$3RV(B^4n|WX2H}KN$e3Qe+?LBe>%y$xJFT;KC-~4lv`kU)c`P*jy O&29bv=KaMz@P7ax_f{PM literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..362cb560e1e10653d01a8595d1e380918f536994 GIT binary patch literal 41472 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll new file mode 100644 index 0000000000000000000000000000000000000000..d68c690492feb8cdba8e95618a6ea27d4d1affbd GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b325ba4df3bbe5457020c96d405f5051174ff89 GIT binary patch literal 40448 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 K*TVnW!vA0CzeleC literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll new file mode 100644 index 0000000000000000000000000000000000000000..478bf901789af784106a100929de3da7fb0aeb32 GIT binary patch literal 23040 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..bec3e97ba5bcd0d3552c873b55db63f053b82aba GIT binary patch literal 101888 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 NTZtbQ^a0|)e*uV!0!9D; literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..5dc16f35dc6b06d5cae502ce92300e637b6788d4 GIT binary patch literal 19968 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

nVARJlwT}(+9%ULWt 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

^z&X4ePx}P%q?V2N zBA}2j!;{)9_aP*eWx%_xFm%!Ij_zL46+Y#b; z@O$8)z1I%8^!|A*>o+g`@J~lpQSJ}c4f*ul!uPHoFv#dN3Qxlg7&f@SF*vVxKVxui zKMSDvUKSawGI-?Rk)kpRPtBUliFeW<37?T#A+4^OU2A53_6j?wYkkcT z3nrarnZ}4S`%TA_A}qk$&5?vj%CV5?LPej;^tq>5hB5ep9N@^om)~N@Lk8i*q&{WK zg{Lx!4H(ser&?JQAyoIvE?6kKlQN%L7gnQzQRWYiYE?@2f;lA+yiR z19)nHs8`P55q)$T^tDi5&*i5ydRsKOBo|q43@#ZkfQ>&>jGx2~3v!U&!HYzUPl6bO zFV9=i7v-{O@FJwEkD>;MeqjzWXu#mhh2f9~^u_~31A67s05c~Sd@l33;B$K;TL$3M zCV3g%A)A}$m^mgQ&vQ7aJO@={0RAAtGdjH|Lf&g4BooPmt`AAct2Od`?7=4&(`0rd{ zbMYLM)cjFg#>>t8YeIJ2;$R>#1;tbxXOaxD>{e)-qJ1GA6)jpkXL*@ExH8o(-1_s1 zrX!pILld`HQ|{Z~F)Qk$i=XgB6QL%cE=;*-hCS1netzYuii;~(U2uVY-pmUxn7PV6 zfBHog7oC5x_kwe0TzK)!O78`D`J_SP5|zuHrKl-Z`fe+FSuV~27a7!l89sIy_F?7N zup;CiTOEnig)f;ltqSMqq7_Az!P;qdMcpd*jxaNL*hc>*wf+r{!!26MsqVnv{6qMA z({)u>Jo=OPow@f;iaOZT_D7amf>T&E1r8?VIk(91wAz_ZPZ!7l*L1dj0Qw%-4_y@WbCya$_!)nN6jHQwKLSJL7ngb1^m3 z>v>LAgmeWlqv1JF0Nr#MRZ9wGHiUTj-5hS5D`f^0PKoP$_~1X)-?NRAq0hMz5#0d7 z@+ap^r_i<{%%XVyM|dv)p1#F=6$d^fw%JHe9cId$!&OKP=8n>h+#efcTDHwi z8*?(R`&?{Xk9o6!SzrjZd1dAsK|DO4Oy*`XFQ?$`05f3EOlV9;{#K%nRp4C(e7ykw zY`oiGCf;Lk0dN(#^PzPSG%f;lF~Yw91MUpCUkvw3;kjO1EM-|D^H2wAtw8DY%b;Qs=U5pOO4 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll new file mode 100644 index 0000000000000000000000000000000000000000..8749e393401415300bd1bbcd64506ee5feaf8bae GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll new file mode 100644 index 0000000000000000000000000000000000000000..b1ec3c0a23c0ee71b8833a1a1982ca69d53d002a GIT binary patch literal 5120 zcmeHLU2Ggz6+W}Ob~aA4B!EI{nr18;wROmN6aU0+p{(t-6Q_3UW*w&m3;WLQ_3k9I zGpm`|#HPYBAyleBf>Nn3eV_=05WFB2LZEXfk&vZPqI9oF7enndc4|enf zv}SvoQe6j(JkbN_X^(ro6KKtt7Vnr&#eQ=y`!8h!h<+|M6Lz0s zxj<&1(sr(6HNr~Ux!#trN&6@Ub@YDAWN*aY@xlh%LBr$Y zeja-K&_-(r1RdC`vC{c5BUuH<f#X#} z*7)7NI8VCIUYaU`{|opE+~^*2eVY|f*t^TeUNsOdqQ4pabmYe}BhLqOgdubg6|NC) zGxX^Ls4yda9SM!;QU0FdeopwGr;nxEsn@X69rRavPo|yT1l>-57Mw6<(;uW87}QP; z<4~%dUNG{IenaqC!9zf{6|7Y5H`+eI2q4-AuUeLzba0B-~FSYonJE?zfP&(JR6|e{@XN^flpLJbEsD9Bca7 z4jD(K16y%#JWOn1zu<#{UBGknn9!$yO&SH>q$$Ct1)mjEz-}W)N2wQae27NK#J(S< zE6XFTV8t8i{}zPE}&zYub#R-Ez~(QM`Fi;}tYkr}_zboG<8;JdyxYB#J)p$X|%VkkQZLWLV4>XO2p|0ER+Ki4=MMY{f z!d+!IBTeIez2UezIIBG!s7P0~L`7{kt5s#YdaJKxXx@poch9S!s-sDKxAk>DxVl?^ z5_2qI103JmEu8XJ{GhHP2$j1_EA~*N7qzQag$lQCn>K)|2S$$cdKP&dx-0TW+-Uws$33yE3Gu zyIZii^Y_SjtKzyzFlf@RtR;cijE`P%b(!~pta9WBKxvZj6&+Re{4jFL;pT`q_*N^8 zN;8HPKxlZgW5{+afqUjX6-BR3(4xO zIMrsLN3SaBoME7M=@x$(=dJpYqF zQTEN}-goEr$+w62dZ(w_a;`$y1@ZPB>d~4(FWzi$DkeGc04vWWYB}wg^Br6a^OFl z?9xZCowo8YmV5u^K`T08!&PgXfAoMs`vxq2sNn6}ZxBc@C(iV%5uG0>uh_%omBB%E zdSqyDWJL|+&)8=MhAV@o`iF)`%9TN)E`uK0D|zsVH&aF~cgCQD7j?rA9i+(GrNHf} zMNuPsysxk7M75@EmHm33vKuR{>wuX)i3Wqb)s2}sUh(%(Yj|(f@1$w9xm)~k*}Vxp~`v@6Q10h{v;l^T7}ZPSeNfYxY*>+!6IJA zi+e43(YLQG;?|Mj+wNd&#Gd1#mfiiV$A3FKQ@|TK{&I5{=mFpY-ZM+U z3AzYsie~8o_$lBdXf8j>yz@_fi?!Ybt@dLgjo;Dn$x1rV6j2RWRTRLELoR99^k{{A zQR;y;qIpOadPB$+MbPuX#pOGhn=op?rwCdO`m6V_v@AM#tULZ0Ae&$G)`U#oT|-ryJAjmQl^dj*jj zmUa*y1VyJI8v-=~iGoHRBW%E#~AG~k( VNipO988n`_PyG468~@V?{0pRLN(cY| literal 0 HcmV?d00001 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json index 9388bc29c..7a6916353 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json @@ -1,20 +1,20 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:54521", - "sslPort": 0 - } - }, - "profiles": { - "LINGYUN.Abp.BackendAdminApp.Host": { - "commandName": "Project", - "launchBrowser": false, - "applicationUrl": "http://0.0.0.0:30010", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:54521", + "sslPort": 0 + } + }, + "profiles": { + "LINGYUN.Abp.BackendAdminApp.Host": { + "commandName": "Project", + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30010", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs index 734395818..e1edd53ec 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.BackendAdmin -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.BackendAdmin +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs index 956b8f5bc..e7f68a9ea 100644 --- a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs +++ b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.ApiGateway -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.ApiGateway +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs index a48493cbb..58fed07bb 100644 --- a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.ApiGateway -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.ApiGateway +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs index 116954420..d88b092f2 100644 --- a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.IdentityServer4 -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.IdentityServer4 +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } } \ No newline at end of file diff --git a/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs b/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs index 5976dbf86..dcc2112fe 100644 --- a/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs @@ -1,25 +1,38 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.LocalizationManagement -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.LocalizationManagement +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs index ad091b0da..21396aba9 100644 --- a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.MessageService -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.MessageService +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs index f92b5443a..981834511 100644 --- a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Platform -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Platform +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/build/build-aspnetcore-ef-update.ps1 b/build/build-aspnetcore-ef-update.ps1 index 626935f6e..1b6a3e55b 100644 --- a/build/build-aspnetcore-ef-update.ps1 +++ b/build/build-aspnetcore-ef-update.ps1 @@ -1,9 +1,9 @@ -. "./build-aspnetcore-common.ps1" - -# Build all solutions -foreach ($service in $serviceArray) { - Set-Location $service.Path - dotnet ef database update -} - +. "./build-aspnetcore-common.ps1" + +# Build all solutions +foreach ($service in $serviceArray) { + Set-Location $service.Path + dotnet ef database update +} + Set-Location $rootFolder \ No newline at end of file diff --git a/build/build-aspnetcore-modules.ps1 b/build/build-aspnetcore-modules.ps1 new file mode 100644 index 000000000..6dda28d82 --- /dev/null +++ b/build/build-aspnetcore-modules.ps1 @@ -0,0 +1,31 @@ +# COMMON PATHS + +$rootFolder = (Get-Item -Path "./" -Verbose).FullName + +# List of solutions used only in development mode +$dependenciesFile = Join-Path $rootFolder "../build/modules.dependencies.json" + +function ReadFile($path) { + return (Get-Content -Raw -Encoding "UTF8" -Path "$path" ) +} + +function ReadJsonFile($path) { + $content = ReadFile $path + return ConvertFrom-Json -InputObject $content +} + +$modules = (ReadJsonFile -path $dependenciesFile) + +foreach ($module in $modules) { + foreach ($dependencieRoot in $module.dependencies) { + foreach ($dependencie in $dependencieRoot.dependencies) { + $thisPath = Join-Path $rootFolder $dependencieRoot.depPath + $modulePath = Join-Path $rootFolder $dependencieRoot.path + Write-host $thisPath + if (!(Test-Path $modulePath)) { + New-Item -ItemType Directory -Force -Path $modulePath + } + Copy-Item (Join-Path $thisPath $dependencie) -Destination $modulePath + } + } +} diff --git a/build/modules.dependencies.json b/build/modules.dependencies.json new file mode 100644 index 000000000..c92a05f33 --- /dev/null +++ b/build/modules.dependencies.json @@ -0,0 +1,51 @@ +[ + { + "tag": "net5.0", + "dependencies": [ + { + "service": "Backend-Admin", + "path": "/../aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/", + "depPath": "/../aspnet-core/LocalNuget/net5.0/", + "dependencies": [ + "LINGYUN.ApiGateway.Application.Contracts.dll", + "LINGYUN.ApiGateway.Domain.Shared.dll", + "LINGYUN.Abp.Aliyun.SettingManagement.dll", + "LINGYUN.Abp.Sms.Aliyun.dll", + "LINGYUN.Abp.Aliyun.dll", + "LINGYUN.Abp.WeChat.MiniProgram.dll", + "LINGYUN.Abp.WeChat.Official.dll", + "LINGYUN.Abp.WeChat.dll", + "LINGYUN.Abp.WeChat.SettingManagement.dll", + "LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll", + "LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll", + "LINGYUN.Abp.OssManagement.Application.Contracts.dll", + "LINGYUN.Abp.OssManagement.Domain.Shared.dll", + "LINGYUN.Abp.MessageService.Application.Contracts.dll", + "LINGYUN.Abp.IM.dll", + "LINGYUN.Abp.MessageService.Domain.Shared.dll", + "LINGYUN.Abp.RealTime.dll", + "LINGYUN.Abp.Notifications.dll", + "LINGYUN.Platform.Application.Contracts.dll", + "LINGYUN.Platform.Domain.Shared.dll" + ] + }, + { + "service": "Backend-Admin", + "path": "/../aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/", + "depPath": "/../aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/bin/Debug/net5.0", + "dependencies": [ + "LINGYUN.Abp.Account.Application.Contracts.dll", + "Volo.Abp.Account.Application.Contracts.dll", + "Volo.Abp.Identity.Application.Contracts.dll", + "LINGYUN.Abp.Identity.Application.Contracts.dll", + "LINGYUN.Abp.Identity.Domain.Shared.dll", + "Volo.Abp.Identity.Domain.Shared.dll", + "Volo.Abp.Users.Domain.Shared.dll", + "Volo.Abp.Users.Abstractions.dll", + "LINGYUN.Abp.IdentityServer.Application.Contracts.dll", + "Volo.Abp.IdentityServer.Domain.Shared.dll" + ] + } + ] + } +] \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 5d31ac5c7..ee30631c4 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -4,60 +4,61 @@ services: identity-server-sts: build: context: ./aspnet-core/services/Publish/identityserver - volumes: + volumes: - /var/opt/abp/logs/ids-sts:/app/Logs restart: always identity-server-admin: build: context: ./aspnet-core/services/Publish/identityserver4-admin - volumes: + volumes: - /var/opt/abp/logs/ids-admin:/app/Logs - depends_on: + depends_on: - identity-server-sts restart: always admin-service: build: context: ./aspnet-core/services/Publish/admin - volumes: + volumes: - /var/opt/abp/logs/backend-admin:/app/Logs - depends_on: + - /var/opt/abp/data/backend-admin/Modules:/app/Modules + depends_on: - identity-server-sts restart: always localization-service: build: context: ./aspnet-core/services/Publish/localization - volumes: + volumes: - /var/opt/abp/logs/localization:/app/Logs restart: always platform-service: build: context: ./aspnet-core/services/Publish/platform - volumes: + volumes: - /var/opt/abp/logs/platform:/app/Logs - /var/opt/abp/data/platform:/app/file-blob-storing - depends_on: + depends_on: - identity-server-sts restart: always messages-service: build: context: ./aspnet-core/services/Publish/messages - volumes: + volumes: - /var/opt/abp/logs/messages:/app/Logs - depends_on: + depends_on: - identity-server-sts restart: always - + apigateway-admin-service: build: context: ./aspnet-core/services/Publish/apigateway-admin - volumes: + volumes: - /var/opt/abp/logs/apigateway-admin:/app/Logs - depends_on: + depends_on: - identity-server-sts - admin-service restart: always @@ -65,9 +66,9 @@ services: apigateway-host-service: build: context: ./aspnet-core/services/Publish/apigateway-host - volumes: + volumes: - /var/opt/abp/logs/apigateway-host:/app/Logs - depends_on: + depends_on: - identity-server-sts - apigateway-admin-service restart: always @@ -76,9 +77,9 @@ services: build: context: ./aspnet-core/services/Publish/client restart: always - + volumes: dbdata: -networks: +networks: linyun-abp: