From fc4c6bd340eb6870fa69ae56f28453e96f957ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Tue, 23 Oct 2018 09:38:02 +0200 Subject: [PATCH] Importing SVN archives - B6M1 --- .project | 17 + build-tools/BUILD.sh | 51 + build-tools/deploy.sh | 34 + build-tools/execute-clit.sh | 5 + build-tools/server-config-example.sh | 1 + build-tools/start-server.sh | 9 + build-tools/stop-server.sh | 2 + eclipse-code-format.xml | 269 +++ legacyworlds-server/.project | 17 + .../legacyworlds-server-beans/.project | 17 + .../.classpath | 10 + .../.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../pom.xml | 15 + .../lw/beans/acm/AccountCleanupBean.java | 75 + .../lw/beans/acm/AccountCleanupTask.java | 96 ++ .../lw/beans/acm/AccountManagementBean.java | 757 +++++++++ .../lw/beans/acm/QuitProcessorBean.java | 75 + .../lw/beans/acm/QuitProcessorTask.java | 53 + .../lw/beans/acm/RequestsExpirationBean.java | 65 + .../lw/beans/acm/RequestsExpirationTask.java | 38 + .../lw/beans/acm/UserSessionDAOBean.java | 137 ++ .../deepclone/lw/beans/acm/UsersDAOBean.java | 550 ++++++ .../lw/beans/acm/VacationProcessorBean.java | 65 + .../lw/beans/acm/VacationProcessorTask.java | 38 + .../lw/beans/admin/AdminDAOBean.java | 251 +++ .../lw/beans/admin/AdminRecapBean.java | 78 + .../lw/beans/admin/AdminRecapTask.java | 162 ++ .../lw/beans/admin/AdministrationBean.java | 356 ++++ .../deepclone/lw/beans/admin/BansDAOBean.java | 284 ++++ .../lw/beans/admin/BansProcessorBean.java | 62 + .../lw/beans/admin/BansProcessorTask.java | 62 + .../deepclone/lw/beans/admin/IpBanBean.java | 87 + .../lw/beans/prefs/BoolPreferenceType.java | 28 + .../beans/prefs/DefaultPreferencesBean.java | 79 + .../lw/beans/prefs/EnumPreferenceType.java | 63 + .../lw/beans/prefs/IntPreferenceType.java | 31 + .../prefs/PreferenceDefinitionsBean.java | 278 +++ .../lw/beans/prefs/PreferenceTypeImpl.java | 42 + .../prefs/PreferenceTypesRegistryBean.java | 66 + .../lw/beans/prefs/PreferencesDAOBean.java | 164 ++ .../lw/beans/prefs/StringPreferenceType.java | 27 + .../configuration/accounts-beans.xml | 24 + .../accounts/account-cleanup-bean.xml | 8 + .../accounts/account-management-bean.xml | 9 + .../configuration/accounts/admin-dao-bean.xml | 9 + .../accounts/admin-recap-bean.xml | 9 + .../accounts/administration-bean.xml | 9 + .../configuration/accounts/bans-dao-bean.xml | 9 + .../accounts/bans-processor-bean.xml | 9 + .../accounts/default-preferences-bean.xml | 9 + .../configuration/accounts/ip-ban-bean.xml | 9 + .../accounts/preference-definitions-bean.xml | 9 + .../accounts/preferences-dao-bean.xml | 9 + .../accounts/quit-processor-bean.xml | 9 + .../accounts/requests-expiration-bean.xml | 9 + .../accounts/user-session-dao-bean.xml | 9 + .../configuration/accounts/users-dao-bean.xml | 9 + .../accounts/vacation-processor-bean.xml | 9 + .../legacyworlds-server-beans-bt/.classpath | 10 + .../legacyworlds-server-beans-bt/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-beans-bt/pom.xml | 25 + .../deepclone/lw/beans/bt/AdminBugsBean.java | 179 ++ .../deepclone/lw/beans/bt/BugsDAOBean.java | 395 +++++ .../lw/beans/bt/EmpireSummaryBean.java | 240 +++ .../deepclone/lw/beans/bt/PlayerBugsBean.java | 114 ++ .../beans/bt/esdata/AccountInformation.java | 98 ++ .../beans/bt/esdata/AllianceInformation.java | 66 + .../beans/bt/esdata/BuildingsInformation.java | 96 ++ .../lw/beans/bt/esdata/DebugInformation.java | 81 + .../lw/beans/bt/esdata/EmpireInformation.java | 80 + .../lw/beans/bt/esdata/FleetInformation.java | 133 ++ .../beans/bt/esdata/MovementInformation.java | 157 ++ .../lw/beans/bt/esdata/PlanetInformation.java | 124 ++ .../lw/beans/bt/esdata/QueueInformation.java | 61 + .../beans/bt/esdata/QueueItemInformation.java | 108 ++ .../beans/bt/esdata/ResearchInformation.java | 83 + .../lw/beans/bt/esdata/ShipsInformation.java | 96 ++ .../lw/beans/bt/esdata/SystemInformation.java | 50 + .../main/resources/configuration/bt-beans.xml | 11 + .../configuration/bt/admin-bugs-bean.xml | 9 + .../configuration/bt/bugs-dao-bean.xml | 9 + .../configuration/bt/empire-summary-bean.xml | 8 + .../configuration/bt/player-bugs-bean.xml | 9 + .../.classpath | 10 + .../.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../pom.xml | 15 + .../lw/beans/eventlog/AdminErrorMailBean.java | 80 + .../lw/beans/eventlog/AdminErrorMailTask.java | 135 ++ .../lw/beans/eventlog/EntryQueueItem.java | 34 + .../lw/beans/eventlog/LogCleanerBean.java | 107 ++ .../lw/beans/eventlog/LogCleanerTask.java | 61 + .../lw/beans/eventlog/LogReaderBean.java | 284 ++++ .../lw/beans/eventlog/LogWriterBean.java | 122 ++ .../lw/beans/eventlog/LogWriterTask.java | 166 ++ .../lw/beans/eventlog/LoggerBean.java | 61 + .../lw/beans/eventlog/SystemLoggerImpl.java | 183 ++ .../configuration/eventlog-beans.xml | 12 + .../eventlog/admin-error-mail-bean.xml | 8 + .../eventlog/log-cleaner-bean.xml | 9 + .../eventlog/log-reader-bean.xml | 9 + .../eventlog/log-writer-bean.xml | 9 + .../configuration/eventlog/logger-bean.xml | 9 + .../legacyworlds-server-beans-i18n/.classpath | 10 + .../legacyworlds-server-beans-i18n/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../legacyworlds-server-beans-i18n/pom.xml | 16 + .../lw/beans/i18n/I18NAdministrationImpl.java | 232 +++ .../com/deepclone/lw/beans/i18n/I18NData.java | 350 ++++ .../lw/beans/i18n/I18NManagerBean.java | 97 ++ .../lw/beans/i18n/LanguageStore.java | 79 + .../lw/beans/i18n/LoaderTransaction.java | 86 + .../lw/beans/i18n/TranslatorBean.java | 122 ++ .../resources/configuration/i18n-beans.xml | 10 + .../configuration/i18n/i18n-manager-bean.xml | 9 + .../i18n/i18n-translator-bean.xml | 9 + .../.classpath | 10 + .../legacyworlds-server-beans-mailer/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../legacyworlds-server-beans-mailer/pom.xml | 35 + .../lw/beans/mailer/MailDataImpl.java | 170 ++ .../lw/beans/mailer/MailQueueHandler.java | 52 + .../lw/beans/mailer/MailQueueItem.java | 13 + .../lw/beans/mailer/MailQueueTask.java | 211 +++ .../lw/beans/mailer/MailQueueTerminator.java | 14 + .../deepclone/lw/beans/mailer/MailerBean.java | 140 ++ .../deepclone/lw/beans/mailer/QueuedMail.java | 26 + .../resources/configuration/mailer-beans.xml | 12 + .../configuration/mailer/mailer-bean.xml | 10 + .../.classpath | 10 + .../legacyworlds-server-beans-naming/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-beans-naming/pom.xml | 15 + .../lw/beans/naming/NamesManagerBean.java | 98 ++ .../lw/beans/naming/NamingDAOBean.java | 215 +++ .../resources/configuration/naming-beans.xml | 10 + .../naming/names-manager-bean.xml | 8 + .../configuration/naming/naming-dao-bean.xml | 9 + .../.classpath | 10 + .../legacyworlds-server-beans-simple/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-beans-simple/pom.xml | 13 + .../lw/beans/empire/AllianceDAOBean.java | 265 +++ .../beans/empire/AllianceManagementBean.java | 176 ++ .../lw/beans/empire/EmpireDAOBean.java | 289 ++++ .../lw/beans/empire/EmpireManagementBean.java | 238 +++ .../lw/beans/empire/PlanetListMapper.java | 59 + .../lw/beans/fleets/BattleViewerBean.java | 359 ++++ .../lw/beans/fleets/BattlesCacheBean.java | 336 ++++ .../lw/beans/fleets/BattlesDAOBean.java | 309 ++++ .../lw/beans/fleets/FleetManagementBean.java | 236 +++ .../lw/beans/fleets/FleetsDAOBean.java | 446 +++++ .../deepclone/lw/beans/map/MapViewerBean.java | 96 ++ .../deepclone/lw/beans/map/PlanetDAOBean.java | 341 ++++ .../lw/beans/map/PlanetsManagementBean.java | 302 ++++ .../lw/beans/map/UniverseDAOBean.java | 67 + .../lw/beans/map/UniverseGeneratorBean.java | 65 + .../lw/beans/map/UniverseGeneratorTask.java | 38 + .../lw/beans/msgs/AdminMessagesBean.java | 344 ++++ .../lw/beans/msgs/EmpireMessagesBean.java | 449 +++++ .../deepclone/lw/beans/msgs/MailTaskBase.java | 157 ++ .../lw/beans/msgs/MessageBoxDAOBean.java | 420 +++++ .../lw/beans/msgs/MessageCleanerBean.java | 44 + .../beans/msgs/MessageContentCacheBean.java | 194 +++ .../beans/msgs/MessageFormatRegistryBean.java | 47 + .../beans/msgs/MessageFormatWiringBean.java | 62 + .../lw/beans/msgs/MessageRecordsDAOBean.java | 328 ++++ .../lw/beans/msgs/MessageTasksBean.java | 130 ++ .../lw/beans/msgs/NotificationsDAOBean.java | 168 ++ .../lw/beans/msgs/NotificationsTask.java | 97 ++ .../lw/beans/msgs/RecapitulationTask.java | 173 ++ .../msgs/fmt/AbandonMessageFormatterBean.java | 100 ++ .../beans/msgs/fmt/AdminMessageExtractor.java | 87 + .../msgs/fmt/AdminMessageFormatterBean.java | 52 + ...AllianceDisbandedMessageFormatterBean.java | 85 + .../msgs/fmt/AllianceMessageExtractor.java | 32 + .../msgs/fmt/BattleMessageFormatterBean.java | 104 ++ .../msgs/fmt/BugMessageFormatterBean.java | 103 ++ .../msgs/fmt/DebtMessageFormatterBean.java | 101 ++ .../msgs/fmt/ExternalMessageFormatBean.java | 75 + .../beans/msgs/fmt/FleetMessageExtractor.java | 190 +++ .../msgs/fmt/FleetMessageFormatterBean.java | 55 + .../msgs/fmt/KickedMessageFormatterBean.java | 93 + .../fmt/LeadershipMessageFormatterBean.java | 91 + .../fmt/LeftAllianceMessageFormatterBean.java | 91 + .../fmt/LostPlanetMessageFormatterBean.java | 107 ++ .../PendingRequestMessageFormatterBean.java | 91 + .../msgs/fmt/PlanetMessageExtractor.java | 28 + .../msgs/fmt/QueueMessageFormatterBean.java | 168 ++ .../RequestResultMessageFormatterBean.java | 86 + .../msgs/fmt/StrikeMessageFormatterBean.java | 102 ++ .../fmt/TakenPlanetMessageFormatterBean.java | 110 ++ .../msgs/fmt/TechMessageFormatterBean.java | 103 ++ .../lw/beans/updates/GameUpdateBean.java | 138 ++ .../lw/beans/updates/UpdatesDAOBean.java | 43 + .../resources/configuration/simple-beans.xml | 22 + .../simple/alliance-dao-bean.xml | 8 + .../simple/alliance-management-bean.xml | 8 + .../simple/battle-data-beans.xml | 10 + .../configuration/simple/empire-dao-bean.xml | 9 + .../simple/empire-management-bean.xml | 8 + .../simple/fleet-management-bean.xml | 8 + .../configuration/simple/fleets-dao-bean.xml | 9 + .../configuration/simple/game-update-bean.xml | 9 + .../configuration/simple/map-viewer-bean.xml | 8 + .../configuration/simple/message-beans.xml | 29 + .../configuration/simple/planet-dao-bean.xml | 9 + .../simple/planets-management-bean.xml | 9 + .../simple/universe-dao-bean.xml | 9 + .../simple/universe-generator-bean.xml | 9 + .../configuration/simple/updates-dao-bean.xml | 9 + .../.classpath | 10 + .../legacyworlds-server-beans-system/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-beans-system/pom.xml | 15 + .../sys/ConstantsAdministrationImpl.java | 106 ++ .../deepclone/lw/beans/sys/ConstantsData.java | 630 +++++++ .../lw/beans/sys/ConstantsManagerBean.java | 115 ++ .../lw/beans/sys/ConstantsRegistrarBean.java | 202 +++ .../lw/beans/sys/ServerSessionData.java | 251 +++ .../lw/beans/sys/SessionManagerBean.java | 396 +++++ .../lw/beans/sys/SystemStatusBean.java | 302 ++++ .../deepclone/lw/beans/sys/TickerBean.java | 160 ++ .../lw/beans/sys/TickerManagerBean.java | 269 +++ .../deepclone/lw/beans/sys/TickerTask.java | 312 ++++ .../lw/beans/sys/TickerTaskStatusHandler.java | 12 + .../deepclone/lw/beans/sys/TickerThread.java | 251 +++ .../resources/configuration/system-beans.xml | 12 + .../system/constants-manager-bean.xml | 9 + .../system/constants-registrar-bean.xml | 9 + .../system/session-manager-bean.xml | 21 + .../system/system-status-bean.xml | 9 + .../configuration/system/ticker-bean.xml | 10 + .../legacyworlds-server-beans-user/.classpath | 10 + .../legacyworlds-server-beans-user/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-beans-user/pom.xml | 15 + .../beans/user/ObjectNameValidatorBean.java | 77 + .../user/abst/AutowiredCommandDelegate.java | 10 + .../user/abst/AutowiredSubTypeDelegate.java | 10 + .../user/abst/SessionCommandDelegate.java | 18 + .../user/abst/SessionCommandHandler.java | 40 + .../user/abst/SessionCommandWiringBean.java | 64 + .../user/abst/SessionSubTypeDelegate.java | 20 + .../user/abst/SessionSubTypeWiringBean.java | 64 + .../user/abst/StatefulSessionTypeDefiner.java | 129 ++ .../user/admin/AdminSessionDefinerBean.java | 98 ++ .../beans/user/admin/AdminSessionSubType.java | 36 + .../user/admin/common/AdminOperation.java | 29 + .../user/admin/common/CommonCommandsBean.java | 18 + ...reateAuthChallengeCommandDelegateBean.java | 55 + .../NoOperationCommandDelegateBean.java | 51 + .../SetPasswordCommandDelegateBean.java | 96 ++ .../user/admin/main/AdminCommandsBean.java | 18 + .../AdminOverviewCommandDelegateBean.java | 55 + .../bans/BansSummaryCommandDelegateBean.java | 59 + .../bans/ConfirmBanCommandDelegateBean.java | 63 + .../main/bans/LiftBanCommandDelegateBean.java | 63 + .../bans/ListBansCommandDelegateBean.java | 59 + .../bans/RejectBanCommandDelegateBean.java | 70 + .../bans/RequestBanCommandDelegateBean.java | 72 + .../bt/BugsSummaryCommandDelegateBean.java | 60 + .../bt/GetSnapshotCommandDelegateBean.java | 61 + .../main/bt/ListBugsCommandDelegateBean.java | 68 + .../bt/MergeReportsCommandDelegateBean.java | 63 + .../ModerateCommentCommandDelegateBean.java | 61 + .../bt/PostCommentCommandDelegateBean.java | 85 + .../main/bt/ReportBugCommandDelegateBean.java | 87 + .../bt/ReportStatusCommandDelegateBean.java | 60 + .../ReportVisibilityCommandDelegateBean.java | 60 + .../bt/ValidateReportCommandDelegateBean.java | 67 + .../main/bt/ViewBugCommandDelegateBean.java | 62 + .../cnst/GetConstantsCommandDelegateBean.java | 84 + .../cnst/SetConstantCommandDelegateBean.java | 96 ++ .../ChangeLanguageCommandDelegateBean.java | 96 ++ .../i18n/GetLanguageCommandDelegateBean.java | 86 + .../i18n/SetStringCommandDelegateBean.java | 110 ++ .../ViewLanguagesCommandDelegateBean.java | 81 + .../logs/GetEntryCommandDelegateBean.java | 60 + .../logs/ViewLogsCommandDelegateBean.java | 60 + .../EnableMaintenanceCommandDelegateBean.java | 88 + .../EndMaintenanceCommandDelegateBean.java | 65 + .../ExtendMaintenanceCommandDelegateBean.java | 65 + .../MaintenanceStatusCommandDelegateBean.java | 66 + .../ComposeMessageCommandDelegateBean.java | 79 + .../msgs/GetMessagesCommandDelegateBean.java | 53 + .../msgs/MessageBoxCommandDelegateBean.java | 74 + .../PrepareMessageCommandDelegateBean.java | 62 + .../msgs/ReadMessageCommandDelegateBean.java | 55 + .../msgs/SendSpamCommandDelegateBean.java | 62 + .../names/GetNamesCommandDelegateBean.java | 59 + .../names/NamesActionCommandDelegateBean.java | 92 + .../NamesSummaryCommandDelegateBean.java | 59 + .../GetPrefDefaultsCommandDelegateBean.java | 61 + .../SetPrefDefaultCommandDelegateBean.java | 60 + .../AddAdministratorCommandDelegateBean.java | 100 ++ ...ListAdministratorsCommandDelegateBean.java | 57 + ...ResetAdminPasswordCommandDelegateBean.java | 51 + .../admin/main/su/SUExistingOperation.java | 25 + .../su/SetPrivilegesCommandDelegateBean.java | 52 + .../admin/main/su/SuperUserOperation.java | 44 + .../ViewAdministratorCommandDelegateBean.java | 47 + .../SetTaskStatusCommandDelegateBean.java | 73 + .../tick/TickerStatusCommandDelegateBean.java | 68 + .../tick/ToggleTickerCommandDelegateBean.java | 61 + .../users/GiveCreditsCommandDelegateBean.java | 66 + .../ListAccountsCommandDelegateBean.java | 64 + .../ListSessionsCommandDelegateBean.java | 61 + .../users/ViewAccountCommandDelegateBean.java | 63 + .../AccountCreationCommandDelegateBean.java | 142 ++ .../ConfPwdRecoveryCommandDelegateBean.java | 94 ++ .../user/ext/ExternalSessionDefinerBean.java | 103 ++ .../beans/user/ext/LanguageListRequired.java | 30 + .../ext/ListLanguagesCommandDelegateBean.java | 49 + .../ReqPwdRecoveryCommandDelegateBean.java | 74 + .../player/BanDetailsCommandDelegateBean.java | 51 + .../beans/user/player/BannedSubTypeBean.java | 14 + .../user/player/DisabledSubTypeBean.java | 14 + .../lw/beans/user/player/GameSubTypeBean.java | 14 + .../GetLanguageCommandDelegateBean.java | 55 + .../user/player/PlayerCommonCommandsBean.java | 15 + .../user/player/PlayerSessionDefinerBean.java | 167 ++ .../user/player/PlayerSessionSubType.java | 53 + .../player/ReactivateCommandDelegateBean.java | 64 + .../player/ValidationCommandDelegateBean.java | 132 ++ .../user/player/ValidationSubTypeBean.java | 14 + .../CancelQuitCommandDelegateBean.java | 55 + ...reateAuthChallengeCommandDelegateBean.java | 56 + .../GetAccountCommandDelegateBean.java | 67 + .../account/QuitGameCommandDelegateBean.java | 56 + .../SetAddressCommandDelegateBean.java | 104 ++ .../SetLanguageCommandDelegateBean.java | 55 + .../SetPasswordCommandDelegateBean.java | 110 ++ .../SetPreferencesCommandDelegateBean.java | 62 + .../ToggleVacationCommandDelegateBean.java | 55 + ...ValidateSetAddressCommandDelegateBean.java | 79 + .../bt/ListBugsCommandDelegateBean.java | 60 + .../bt/PostCommentCommandDelegateBean.java | 76 + .../bt/ReportBugCommandDelegateBean.java | 89 + .../player/bt/ViewBugCommandDelegateBean.java | 52 + .../game/GetBattleCommandDelegateBean.java | 58 + .../game/GetNewPlanetCommandDelegateBean.java | 74 + .../ImplementTechCommandDelegateBean.java | 56 + .../game/ListBattlesCommandDelegateBean.java | 53 + .../game/ListPlanetsCommandDelegateBean.java | 52 + .../game/OverviewCommandDelegateBean.java | 52 + .../game/ViewMapCommandDelegateBean.java | 125 ++ .../AllianceStatusCommandDelegateBean.java | 52 + .../CancelJoinCommandDelegateBean.java | 55 + .../CreateAllianceCommandDelegateBean.java | 82 + .../JoinAllianceCommandDelegateBean.java | 55 + .../KickMembersCommandDelegateBean.java | 55 + .../LeaveAllianceCommandDelegateBean.java | 55 + .../ManageRequestsCommandDelegateBean.java | 55 + ...TransferLeadershipCommandDelegateBean.java | 55 + .../ViewAllianceCommandDelegateBean.java | 52 + .../elist/AddEnemyCommandDelegateBean.java | 55 + .../elist/EnemyListCommandDelegateBean.java | 50 + .../RemoveEnemiesCommandDelegateBean.java | 55 + .../DisbandFleetsCommandDelegateBean.java | 54 + .../MergeFleetsCommandDelegateBean.java | 54 + .../fleets/MoveFleetsCommandDelegateBean.java | 64 + .../RenameFleetsCommandDelegateBean.java | 88 + .../SetFleetsModeCommandDelegateBean.java | 54 + .../fleets/SplitFleetCommandDelegateBean.java | 88 + .../fleets/ViewFleetsCommandDelegateBean.java | 51 + .../AbandonPlanetCommandDelegateBean.java | 61 + .../BuildingActionCommandDelegateBean.java | 58 + .../FlushQueueCommandDelegateBean.java | 57 + .../RenamePlanetCommandDelegateBean.java | 78 + .../ShipBuildingCommandDelegateBean.java | 58 + .../ViewPlanetCommandDelegateBean.java | 54 + .../ComposeMessageCommandDelegateBean.java | 76 + .../msgs/GetMessagesCommandDelegateBean.java | 52 + .../msgs/ListTargetsCommandDelegateBean.java | 51 + .../msgs/MessageBoxCommandDelegateBean.java | 71 + .../PrepareMessageCommandDelegateBean.java | 59 + .../msgs/ReadMessageCommandDelegateBean.java | 52 + .../resources/configuration/user-beans.xml | 14 + .../user/admin-session-definer-bean.xml | 97 ++ .../user/external-session-definer-bean.xml | 15 + .../user/object-name-validator-bean.xml | 9 + .../user/player-session-definer-bean.xml | 106 ++ .../user/session-command-wiring-bean.xml | 9 + .../user/session-subtype-wiring-bean.xml | 9 + .../legacyworlds-server-beans/pom.xml | 36 + .../legacyworlds-server-data/.classpath | 10 + .../legacyworlds-server-data/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../db-structure/database.sql | 54 + .../db-structure/db-config.txt | 4 + .../db-structure/parts/000-schemas.sql | 46 + .../db-structure/parts/010-data.sql | 29 + .../db-structure/parts/020-functions.sql | 36 + .../db-structure/parts/030-updates.sql | 22 + .../db-structure/parts/data/000-typedefs.sql | 53 + .../db-structure/parts/data/010-i18n-data.sql | 53 + .../parts/data/020-prefs-data.sql | 57 + .../parts/data/030-users-data.sql | 111 ++ .../parts/data/035-session-data.sql | 92 + .../parts/data/040-admin-data.sql | 169 ++ .../parts/data/050-accounts-data.sql | 137 ++ .../db-structure/parts/data/055-bugs-data.sql | 273 +++ .../parts/data/060-naming-data.sql | 109 ++ .../parts/data/070-constants-data.sql | 44 + .../parts/data/080-techs-data.sql | 56 + .../parts/data/090-buildables-data.sql | 75 + .../parts/data/100-universe-data.sql | 95 ++ .../parts/data/110-empires-data.sql | 176 ++ .../parts/data/120-construction-data.sql | 82 + .../parts/data/130-fleets-data.sql | 118 ++ .../parts/data/140-status-data.sql | 107 ++ .../db-structure/parts/data/150-logs-data.sql | 126 ++ .../parts/data/160-battle-data.sql | 230 +++ .../parts/data/170-events-data.sql | 311 ++++ .../parts/data/180-messages-data.sql | 235 +++ .../parts/functions/000-defs-functions.sql | 128 ++ .../parts/functions/002-sys-functions.sql | 158 ++ .../parts/functions/005-logs-functions.sql | 250 +++ .../functions/010-constants-functions.sql | 318 ++++ .../parts/functions/020-naming-functions.sql | 623 +++++++ .../parts/functions/030-tech-functions.sql | 379 +++++ .../parts/functions/035-users-view.sql | 85 + .../parts/functions/040-empire-functions.sql | 662 ++++++++ .../functions/050-computation-functions.sql | 232 +++ .../functions/060-universe-functions.sql | 394 +++++ .../parts/functions/070-users-functions.sql | 1086 ++++++++++++ .../parts/functions/075-session-functions.sql | 313 ++++ .../functions/080-buildings-functions.sql | 84 + .../parts/functions/100-status-functions.sql | 107 ++ .../parts/functions/110-prefs-functions.sql | 283 ++++ .../parts/functions/120-map-functions.sql | 58 + .../parts/functions/140-planets-functions.sql | 1102 ++++++++++++ .../parts/functions/150-battle-functions.sql | 839 +++++++++ .../parts/functions/160-battle-views.sql | 483 ++++++ .../functions/163-alliance-functions.sql | 354 ++++ .../parts/functions/165-fleets-functions.sql | 1497 +++++++++++++++++ .../parts/functions/167-planet-list.sql | 150 ++ .../parts/functions/170-event-functions.sql | 928 ++++++++++ .../functions/180-messages-functions.sql | 1277 ++++++++++++++ .../parts/functions/190-admin-functions.sql | 937 +++++++++++ .../parts/functions/200-bugs-functions.sql | 1277 ++++++++++++++ .../parts/functions/210-admin-overview.sql | 64 + .../parts/updates/000-updates-ctrl.sql | 172 ++ .../parts/updates/010-empire-money.sql | 81 + .../parts/updates/020-empire-research.sql | 86 + .../parts/updates/025-empire-debt.sql | 62 + .../parts/updates/030-fleet-arrivals.sql | 148 ++ .../parts/updates/040-fleet-movements.sql | 110 ++ .../parts/updates/050-fleet-status.sql | 77 + .../parts/updates/060-planet-battle.sql | 181 ++ .../parts/updates/070-planet-abandon.sql | 48 + .../parts/updates/080-planet-construction.sql | 217 +++ .../parts/updates/090-planet-military.sql | 227 +++ .../parts/updates/100-planet-population.sql | 104 ++ .../parts/updates/110-planet-money.sql | 45 + .../db-structure/test-mode.sql | 7 + .../legacyworlds-server-data/pom.xml | 24 + .../deepclone/lw/sqld/accounts/Account.java | 251 +++ .../sqld/accounts/AccountOperationResult.java | 35 + .../lw/sqld/accounts/QuittingAccount.java | 47 + .../lw/sqld/accounts/ValidationResult.java | 52 + .../lw/sqld/admin/AdminConnection.java | 10 + .../deepclone/lw/sqld/admin/AdminRecord.java | 126 ++ .../lw/sqld/game/AllianceMembership.java | 35 + .../lw/sqld/game/BuildingOutputType.java | 11 + .../lw/sqld/game/EmpireTechLine.java | 66 + .../lw/sqld/game/EmpireTechnology.java | 90 + .../lw/sqld/game/GeneralInformation.java | 66 + .../com/deepclone/lw/sqld/game/MapData.java | 119 ++ .../deepclone/lw/sqld/game/PlanetData.java | 293 ++++ .../deepclone/lw/sqld/game/RawFleetOwner.java | 59 + .../deepclone/lw/sqld/game/RawFleetShip.java | 73 + .../lw/sqld/game/RawStaticFleet.java | 111 ++ .../lw/sqld/game/battle/BattleListRecord.java | 137 ++ .../game/battle/BuildingHistoryRecord.java | 73 + .../sqld/game/battle/EmpireBattleRecord.java | 138 ++ .../lw/sqld/game/battle/EventItemRecord.java | 59 + .../lw/sqld/game/battle/EventRecord.java | 86 + .../lw/sqld/game/battle/PresenceRecord.java | 46 + .../sqld/game/battle/ProtagonistRecord.java | 73 + .../sqld/game/battle/ShipHistoryRecord.java | 21 + .../deepclone/lw/sqld/i18n/Translation.java | 60 + .../lw/sqld/msgs/AdminEventRecord.java | 61 + .../lw/sqld/msgs/AllianceEventRecord.java | 74 + .../lw/sqld/msgs/BugEventRecord.java | 48 + .../lw/sqld/msgs/EmpireEventRecord.java | 21 + .../deepclone/lw/sqld/msgs/EventRecord.java | 40 + .../com/deepclone/lw/sqld/msgs/EventType.java | 12 + .../lw/sqld/msgs/EventTypeRecord.java | 33 + .../lw/sqld/msgs/FleetEventFleet.java | 112 ++ .../lw/sqld/msgs/FleetEventRecord.java | 91 + .../deepclone/lw/sqld/msgs/FormatType.java | 86 + .../deepclone/lw/sqld/msgs/InboxRecord.java | 157 ++ .../lw/sqld/msgs/MessageDataRecord.java | 63 + .../lw/sqld/msgs/NotificationsRecord.java | 154 ++ .../lw/sqld/msgs/PlanetEventRecord.java | 112 ++ .../lw/sqld/msgs/QueueEventLocation.java | 86 + .../lw/sqld/msgs/QueueEventRecord.java | 26 + .../lw/sqld/msgs/TextMessageRecord.java | 41 + .../com/deepclone/lw/sqld/sys/Constant.java | 111 ++ .../deepclone/lw/sqld/sys/ExceptionLog.java | 75 + .../deepclone/lw/sqld/sys/StackTraceLog.java | 65 + .../com/deepclone/lw/sqld/sys/Status.java | 135 ++ .../deepclone/lw/sqld/sys/SystemLogEntry.java | 93 + .../lw/sqld/sys/TickerTaskRecord.java | 64 + .../configuration/transaction-bean.xml | 14 + .../legacyworlds-server-interfaces/.classpath | 10 + .../legacyworlds-server-interfaces/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../legacyworlds-server-interfaces/pom.xml | 29 + .../interfaces/acm/AccountMailException.java | 10 + .../lw/interfaces/acm/AccountManagement.java | 112 ++ .../lw/interfaces/acm/AccountSession.java | 20 + .../interfaces/acm/EmailChangeException.java | 17 + .../lw/interfaces/acm/JoinGameException.java | 28 + .../acm/PasswordProhibitedException.java | 10 + .../acm/PasswordRecoveryException.java | 17 + .../acm/PermanentlyDisabledException.java | 9 + .../lw/interfaces/acm/UserSessionDAO.java | 28 + .../deepclone/lw/interfaces/acm/UsersDAO.java | 107 ++ .../lw/interfaces/admin/AdminDAO.java | 56 + .../interfaces/admin/AdminDAOException.java | 24 + .../lw/interfaces/admin/Administration.java | 71 + .../lw/interfaces/admin/BanMailData.java | 27 + .../lw/interfaces/admin/BansDAO.java | 54 + .../deepclone/lw/interfaces/admin/IpBan.java | 33 + .../deepclone/lw/interfaces/bt/AdminBugs.java | 45 + .../deepclone/lw/interfaces/bt/BugsDAO.java | 71 + .../lw/interfaces/bt/EmpireSummary.java | 9 + .../lw/interfaces/bt/PlayerBugs.java | 23 + .../interfaces/eventlog/ExtendedLogEntry.java | 24 + .../lw/interfaces/eventlog/LogReader.java | 31 + .../lw/interfaces/eventlog/LogWriter.java | 27 + .../lw/interfaces/eventlog/Logger.java | 21 + .../lw/interfaces/eventlog/SystemLogger.java | 49 + .../lw/interfaces/game/AllianceDAO.java | 49 + .../interfaces/game/AllianceManagement.java | 36 + .../lw/interfaces/game/BattleViewer.java | 19 + .../lw/interfaces/game/BattlesCache.java | 8 + .../lw/interfaces/game/BattlesDAO.java | 36 + .../lw/interfaces/game/EmpireDAO.java | 46 + .../lw/interfaces/game/EmpireManagement.java | 41 + .../lw/interfaces/game/FleetManagement.java | 36 + .../lw/interfaces/game/FleetsDAO.java | 50 + .../lw/interfaces/game/MapViewParameters.java | 23 + .../lw/interfaces/game/MapViewer.java | 17 + .../lw/interfaces/game/PlanetDAO.java | 58 + .../lw/interfaces/game/PlanetsManagement.java | 31 + .../lw/interfaces/game/UniverseDAO.java | 18 + .../lw/interfaces/game/UpdatesDAO.java | 7 + .../i18n/DuplicateLanguageException.java | 22 + .../i18n/DuplicateStringException.java | 22 + .../interfaces/i18n/I18NAdministration.java | 143 ++ .../lw/interfaces/i18n/I18NException.java | 22 + .../lw/interfaces/i18n/I18NManager.java | 30 + .../i18n/InvalidUpdateException.java | 37 + .../interfaces/i18n/TranslationException.java | 22 + .../lw/interfaces/i18n/Translator.java | 65 + .../i18n/UnknownLanguageException.java | 29 + .../i18n/UnknownStringException.java | 30 + .../mailer/AlreadySentException.java | 15 + .../lw/interfaces/mailer/MailData.java | 53 + .../lw/interfaces/mailer/Mailer.java | 35 + .../lw/interfaces/mailer/MailerException.java | 33 + .../mailer/MissingDataException.java | 21 + .../interfaces/mailer/NotSentException.java | 21 + .../lw/interfaces/msg/AdminMessages.java | 46 + .../lw/interfaces/msg/EmpireMessages.java | 48 + .../lw/interfaces/msg/MessageBoxDAO.java | 44 + .../interfaces/msg/MessageContentCache.java | 20 + .../lw/interfaces/msg/MessageExtractor.java | 14 + .../interfaces/msg/MessageFormatRegistry.java | 16 + .../lw/interfaces/msg/MessageFormatter.java | 18 + .../lw/interfaces/msg/MessageRecordsDAO.java | 21 + .../lw/interfaces/msg/NotificationsDAO.java | 24 + .../naming/EmpireNameException.java | 42 + .../interfaces/naming/MapNameException.java | 48 + .../lw/interfaces/naming/NamesManager.java | 32 + .../lw/interfaces/naming/NamingDAO.java | 45 + .../interfaces/prefs/AccountPreferences.java | 46 + .../lw/interfaces/prefs/Preference.java | 75 + .../prefs/PreferenceDefinitionException.java | 25 + .../prefs/PreferenceDefinitions.java | 71 + .../lw/interfaces/prefs/PreferenceGroup.java | 60 + .../lw/interfaces/prefs/PreferenceType.java | 24 + .../prefs/PreferenceTypesRegistry.java | 12 + .../lw/interfaces/prefs/PreferencesDAO.java | 44 + .../lw/interfaces/session/ServerSession.java | 104 ++ .../lw/interfaces/session/SessionManager.java | 34 + .../session/SessionTypeDefiner.java | 125 ++ .../lw/interfaces/sys/ConstantDefinition.java | 122 ++ .../sys/ConstantsAdministration.java | 48 + .../lw/interfaces/sys/ConstantsManager.java | 63 + .../lw/interfaces/sys/ConstantsUser.java | 32 + .../sys/EndAutowiredTransaction.java | 10 + .../interfaces/sys/InvalidConstantValue.java | 17 + .../lw/interfaces/sys/MaintenanceData.java | 27 + .../sys/MaintenanceStatusException.java | 27 + .../lw/interfaces/sys/SystemStatus.java | 53 + .../interfaces/sys/TickStatusException.java | 25 + .../deepclone/lw/interfaces/sys/Ticker.java | 78 + .../lw/interfaces/sys/TickerManager.java | 24 + .../interfaces/sys/UnknownConstantError.java | 21 + .../lw/interfaces/sys/WiringException.java | 16 + .../legacyworlds-server-main/.classpath | 10 + .../legacyworlds-server-main/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-server-main/data-source.xml | 21 + .../data/addressChangeMail-en.txt | 11 + .../data/addressChangeMail-fr.txt | 11 + .../data/adminErrorMail.txt | 4 + .../data/adminRecapMail.txt | 4 + .../data/banLiftedMail-en.txt | 9 + .../data/banLiftedMail-fr.txt | 9 + .../data/bannedMail-en.txt | 12 + .../data/bannedMail-fr.txt | 12 + .../data/buildables-test.xml | 40 + .../data/buildables.xml | 40 + .../data/buildables.xsd | 64 + .../data/i18n-text.xml | 1033 ++++++++++++ .../data/i18n-text.xsd | 36 + .../data/inactivityQuitMail-en.txt | 11 + .../data/inactivityQuitMail-fr.txt | 11 + .../data/inactivityWarningMail-en.txt | 9 + .../data/inactivityWarningMail-fr.txt | 9 + .../data/messageMail-en.txt | 10 + .../data/messageMail-fr.txt | 10 + .../data/passwordRecoveryMail-en.txt | 19 + .../data/passwordRecoveryMail-fr.txt | 19 + .../data/quitMail-en.txt | 11 + .../data/quitMail-fr.txt | 11 + .../data/reactivationMail-en.txt | 17 + .../data/reactivationMail-fr.txt | 17 + .../data/recapMail-en.txt | 8 + .../data/recapMail-fr.txt | 8 + .../data/registrationMail-en.txt | 17 + .../data/registrationMail-fr.txt | 17 + .../data/techs-test.xml | 23 + .../legacyworlds-server-main/data/techs.xml | 23 + .../legacyworlds-server-main/data/techs.xsd | 28 + .../legacyworlds-server-main/hibernate.xml | 25 + .../legacyworlds-server-main/pom.xml | 127 ++ .../src/main/java/com/deepclone/lw/Main.java | 149 ++ .../java/com/deepclone/lw/cli/CLITool.java | 106 ++ .../com/deepclone/lw/cli/CreateSuperuser.java | 132 ++ .../java/com/deepclone/lw/cli/CreateUser.java | 168 ++ .../java/com/deepclone/lw/cli/ExportDB.java | 176 ++ .../deepclone/lw/cli/ImportBuildables.java | 316 ++++ .../com/deepclone/lw/cli/ImportTechs.java | 217 +++ .../java/com/deepclone/lw/cli/ImportText.java | 267 +++ .../main/java/com/deepclone/lw/cli/Stop.java | 41 + .../main/java/com/deepclone/lw/cli/Tick.java | 114 ++ .../java/com/deepclone/lw/cli/ToolBase.java | 70 + .../lw/cli/dbexport/Administrator.java | 29 + .../deepclone/lw/cli/dbexport/BREComment.java | 20 + .../lw/cli/dbexport/BREInitialReport.java | 22 + .../deepclone/lw/cli/dbexport/BREMerger.java | 19 + .../lw/cli/dbexport/BREStatusChange.java | 18 + .../lw/cli/dbexport/BREVisibilityChange.java | 16 + .../lw/cli/dbexport/BugEventMapper.java | 109 ++ .../deepclone/lw/cli/dbexport/BugGroup.java | 22 + .../lw/cli/dbexport/BugReportEvent.java | 23 + .../deepclone/lw/cli/dbexport/BugReports.java | 17 + .../lw/cli/dbexport/BugSubmitter.java | 24 + .../lw/cli/dbexport/LegacyWorldsDB.java | 26 + .../com/deepclone/lw/cli/dbexport/User.java | 39 + .../deepclone/lw/cli/dbexport/UserMapper.java | 49 + .../deepclone/lw/cli/dbexport/Warnings.java | 23 + .../com/deepclone/lw/srv/LogAppender.java | 513 ++++++ .../java/com/deepclone/lw/srv/Server.java | 108 ++ .../deepclone/lw/srv/ServerTerminator.java | 9 + .../lw/srv/ServerTerminatorBean.java | 25 + .../configuration/context-configuration.xml | 11 + .../src/main/resources/log4j.properties | 38 + .../src/main/resources/lw-server.xml | 27 + .../legacyworlds-server-tests/.classpath | 10 + .../legacyworlds-server-tests/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../legacyworlds-server-tests/pom.xml | 77 + .../legacyworlds-server-utils/.classpath | 10 + .../legacyworlds-server-utils/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../legacyworlds-server-utils/pom.xml | 23 + .../deepclone/lw/utils/Base64Serializer.java | 91 + .../com/deepclone/lw/utils/EmailAddress.java | 78 + .../java/com/deepclone/lw/utils/Password.java | 110 ++ .../lw/utils/RandomStringGenerator.java | 95 ++ .../com/deepclone/lw/utils/StoredProc.java | 54 + legacyworlds-server/pom.xml | 85 + legacyworlds-session/.classpath | 10 + legacyworlds-session/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + legacyworlds-session/pom.xml | 16 + .../lw/cmd/CreateAuthChallengeCommand.java | 11 + .../lw/cmd/CreateAuthChallengeResponse.java | 28 + .../java/com/deepclone/lw/cmd/MailError.java | 12 + .../deepclone/lw/cmd/MaintenanceResponse.java | 60 + .../com/deepclone/lw/cmd/ObjectNameError.java | 11 + .../com/deepclone/lw/cmd/PasswordError.java | 10 + .../lw/cmd/admin/AdminOverviewCommand.java | 11 + .../lw/cmd/admin/AdminOverviewResponse.java | 29 + .../deepclone/lw/cmd/admin/AdminResponse.java | 44 + .../lw/cmd/admin/NoOperationCommand.java | 35 + .../lw/cmd/admin/SetPasswordCommand.java | 52 + .../lw/cmd/admin/SetPasswordResponse.java | 53 + .../lw/cmd/admin/adata/AdminOverview.java | 106 ++ .../lw/cmd/admin/adata/Administrator.java | 46 + .../cmd/admin/adata/AdministratorBasics.java | 139 ++ .../lw/cmd/admin/adata/PrivEntry.java | 44 + .../lw/cmd/admin/adata/Privileges.java | 71 + .../lw/cmd/admin/bans/ArchivedBanRequest.java | 80 + .../lw/cmd/admin/bans/BanRequest.java | 107 ++ .../deepclone/lw/cmd/admin/bans/BanType.java | 8 + .../lw/cmd/admin/bans/BansSummaryCommand.java | 14 + .../cmd/admin/bans/BansSummaryResponse.java | 39 + .../lw/cmd/admin/bans/ConfirmBanCommand.java | 28 + .../lw/cmd/admin/bans/LiftBanCommand.java | 28 + .../lw/cmd/admin/bans/ListBansCommand.java | 28 + .../lw/cmd/admin/bans/ListBansResponse.java | 48 + .../lw/cmd/admin/bans/RejectBanCommand.java | 36 + .../lw/cmd/admin/bans/RejectBanResponse.java | 45 + .../lw/cmd/admin/bans/RequestBanCommand.java | 44 + .../lw/cmd/admin/bans/RequestBanResponse.java | 70 + .../lw/cmd/admin/bans/SummaryEntry.java | 36 + .../cmd/admin/bans/ValidatedBanRequest.java | 67 + .../lw/cmd/admin/bt/BugsSummaryCommand.java | 12 + .../lw/cmd/admin/bt/BugsSummaryResponse.java | 73 + .../lw/cmd/admin/bt/GetSnapshotCommand.java | 28 + .../lw/cmd/admin/bt/GetSnapshotResponse.java | 37 + .../lw/cmd/admin/bt/ListBugsResponse.java | 87 + .../deepclone/lw/cmd/admin/bt/MergeError.java | 10 + .../lw/cmd/admin/bt/MergeReportsCommand.java | 36 + .../lw/cmd/admin/bt/MergeReportsResponse.java | 66 + .../cmd/admin/bt/ModerateCommentCommand.java | 36 + .../lw/cmd/admin/bt/PostCommentResponse.java | 92 + .../lw/cmd/admin/bt/ReportBugResponse.java | 119 ++ .../lw/cmd/admin/bt/ReportStatusCommand.java | 37 + .../cmd/admin/bt/ReportVisibilityCommand.java | 28 + .../cmd/admin/bt/ValidateReportCommand.java | 62 + .../lw/cmd/admin/bt/ViewBugResponse.java | 68 + .../lw/cmd/admin/constants/Category.java | 49 + .../lw/cmd/admin/constants/Definition.java | 90 + .../admin/constants/GetConstantsCommand.java | 11 + .../admin/constants/GetConstantsResponse.java | 44 + .../admin/constants/SetConstantCommand.java | 36 + .../admin/constants/SetConstantResponse.java | 56 + .../cmd/admin/i18n/ChangeLanguageCommand.java | 36 + .../admin/i18n/ChangeLanguageResponse.java | 45 + .../lw/cmd/admin/i18n/GetLanguageCommand.java | 28 + .../cmd/admin/i18n/GetLanguageResponse.java | 52 + .../lw/cmd/admin/i18n/I18NString.java | 46 + .../deepclone/lw/cmd/admin/i18n/Language.java | 64 + .../lw/cmd/admin/i18n/SetStringCommand.java | 44 + .../lw/cmd/admin/i18n/SetStringResponse.java | 45 + .../cmd/admin/i18n/ViewLanguagesCommand.java | 12 + .../cmd/admin/i18n/ViewLanguagesResponse.java | 41 + .../lw/cmd/admin/logs/ExceptionEntry.java | 50 + .../lw/cmd/admin/logs/GetEntryCommand.java | 28 + .../lw/cmd/admin/logs/GetEntryResponse.java | 47 + .../deepclone/lw/cmd/admin/logs/LogEntry.java | 94 ++ .../deepclone/lw/cmd/admin/logs/LogLevel.java | 28 + .../deepclone/lw/cmd/admin/logs/LogType.java | 24 + .../lw/cmd/admin/logs/TraceEntry.java | 44 + .../lw/cmd/admin/logs/ViewLogCommand.java | 69 + .../lw/cmd/admin/logs/ViewLogResponse.java | 48 + .../admin/mntm/EnableMaintenanceCommand.java | 36 + .../cmd/admin/mntm/EndMaintenanceCommand.java | 14 + .../admin/mntm/ExtendMaintenanceCommand.java | 28 + .../admin/mntm/MaintenanceChangeResponse.java | 58 + .../admin/mntm/MaintenanceStatusCommand.java | 14 + .../admin/mntm/MaintenanceStatusResponse.java | 57 + .../cmd/admin/msg/ComposeMessageCommand.java | 97 ++ .../cmd/admin/msg/ComposeMessageResponse.java | 160 ++ .../lw/cmd/admin/msg/GetMessagesCommand.java | 28 + .../lw/cmd/admin/msg/GetMessagesResponse.java | 33 + .../lw/cmd/admin/msg/MessageBoxAction.java | 10 + .../lw/cmd/admin/msg/MessageBoxCommand.java | 52 + .../cmd/admin/msg/PrepareMessageCommand.java | 68 + .../lw/cmd/admin/msg/ReadMessageCommand.java | 36 + .../lw/cmd/admin/msg/ReadMessageResponse.java | 47 + .../lw/cmd/admin/msg/SendSpamCommand.java | 36 + .../lw/cmd/admin/naming/GetNamesCommand.java | 28 + .../lw/cmd/admin/naming/GetNamesResponse.java | 48 + .../deepclone/lw/cmd/admin/naming/Name.java | 52 + .../lw/cmd/admin/naming/NameAction.java | 10 + .../lw/cmd/admin/naming/NameType.java | 30 + .../cmd/admin/naming/NamesActionCommand.java | 44 + .../cmd/admin/naming/NamesSummaryCommand.java | 14 + .../admin/naming/NamesSummaryResponse.java | 68 + .../admin/prefs/GetPrefDefaultsCommand.java | 14 + .../cmd/admin/prefs/PrefDefaultsResponse.java | 40 + .../admin/prefs/SetPrefDefaultCommand.java | 36 + .../cmd/admin/su/AddAdministratorCommand.java | 49 + .../admin/su/AddAdministratorResponse.java | 99 ++ .../admin/su/ListAdministratorsCommand.java | 11 + .../admin/su/ListAdministratorsResponse.java | 39 + .../admin/su/ResetAdminPasswordCommand.java | 15 + .../lw/cmd/admin/su/SetPrivilegesCommand.java | 33 + .../admin/su/ViewAdministratorCommand.java | 28 + .../admin/su/ViewAdministratorResponse.java | 37 + .../cmd/admin/tick/SetTaskStatusCommand.java | 51 + .../cmd/admin/tick/TickerStatusCommand.java | 14 + .../cmd/admin/tick/TickerStatusResponse.java | 48 + .../lw/cmd/admin/tick/TickerTaskInfo.java | 91 + .../lw/cmd/admin/tick/TickerTaskStatus.java | 24 + .../cmd/admin/tick/ToggleTickerCommand.java | 14 + .../lw/cmd/admin/users/AccountBanEntry.java | 67 + .../lw/cmd/admin/users/AccountListEntry.java | 80 + .../cmd/admin/users/AccountSessionEntry.java | 41 + .../lw/cmd/admin/users/AccountStatus.java | 65 + .../lw/cmd/admin/users/AccountViewEntry.java | 147 ++ .../cmd/admin/users/GiveCreditsCommand.java | 36 + .../cmd/admin/users/ListAccountsCommand.java | 50 + .../cmd/admin/users/ListAccountsResponse.java | 64 + .../cmd/admin/users/ListSessionsCommand.java | 28 + .../cmd/admin/users/ListSessionsResponse.java | 37 + .../admin/users/SessionTerminationType.java | 26 + .../lw/cmd/admin/users/UserSession.java | 134 ++ .../cmd/admin/users/ViewAccountCommand.java | 28 + .../cmd/admin/users/ViewAccountResponse.java | 37 + .../deepclone/lw/cmd/bt/ListBugsCommand.java | 53 + .../lw/cmd/bt/PostCommentCommand.java | 52 + .../deepclone/lw/cmd/bt/ReportBugCommand.java | 52 + .../deepclone/lw/cmd/bt/ViewBugCommand.java | 28 + .../deepclone/lw/cmd/bt/data/BugEvent.java | 134 ++ .../lw/cmd/bt/data/BugEventType.java | 12 + .../deepclone/lw/cmd/bt/data/BugReport.java | 133 ++ .../deepclone/lw/cmd/bt/data/BugStatus.java | 12 + .../lw/cmd/bt/data/BugSubmitter.java | 54 + .../ext/ConfirmPasswordRecoveryCommand.java | 55 + .../ext/ConfirmPasswordRecoveryResponse.java | 38 + .../lw/cmd/ext/CreateAccountCommand.java | 60 + .../lw/cmd/ext/CreateAccountResponse.java | 98 ++ .../lw/cmd/ext/ListLanguagesCommand.java | 14 + .../lw/cmd/ext/ListLanguagesResponse.java | 66 + .../ext/RequestPasswordRecoveryCommand.java | 28 + .../ext/RequestPasswordRecoveryResponse.java | 37 + .../com/deepclone/lw/cmd/msgdata/Message.java | 164 ++ .../lw/cmd/msgdata/MessageListEntry.java | 94 ++ .../deepclone/lw/cmd/msgdata/MessageType.java | 9 + .../lw/cmd/player/EmpireResponse.java | 52 + .../lw/cmd/player/GetNewPlanetCommand.java | 28 + .../lw/cmd/player/GetNewPlanetResponse.java | 56 + .../lw/cmd/player/ImplementTechCommand.java | 28 + .../lw/cmd/player/ListPlanetsCommand.java | 14 + .../lw/cmd/player/ListPlanetsResponse.java | 34 + .../lw/cmd/player/OverviewCommand.java | 14 + .../lw/cmd/player/ViewMapCommand.java | 62 + .../lw/cmd/player/ViewMapResponse.java | 74 + .../account/AccountReactivationCommand.java | 14 + .../account/AccountReactivationResponse.java | 36 + .../account/AccountValidationCommand.java | 64 + .../account/AccountValidationResponse.java | 121 ++ .../cmd/player/account/BanDetailsCommand.java | 14 + .../player/account/BanDetailsResponse.java | 46 + .../cmd/player/account/CancelQuitCommand.java | 14 + .../cmd/player/account/GetAccountCommand.java | 11 + .../player/account/GetAccountResponse.java | 31 + .../player/account/GetLanguageCommand.java | 14 + .../player/account/GetLanguageResponse.java | 28 + .../cmd/player/account/QuitGameCommand.java | 28 + .../cmd/player/account/SetAddressCommand.java | 52 + .../player/account/SetAddressResponse.java | 65 + .../player/account/SetLanguageCommand.java | 28 + .../player/account/SetPasswordCommand.java | 52 + .../player/account/SetPasswordResponse.java | 55 + .../player/account/SetPreferencesCommand.java | 41 + .../player/account/ToggleVacationCommand.java | 14 + .../account/ValidateSetAddressCommand.java | 43 + .../account/ValidateSetAddressResponse.java | 46 + .../alliances/AllianceStatusCommand.java | 14 + .../alliances/AllianceStatusResponse.java | 31 + .../player/alliances/CancelJoinCommand.java | 14 + .../alliances/CreateAllianceCommand.java | 35 + .../alliances/CreateAllianceResponse.java | 31 + .../player/alliances/JoinAllianceCommand.java | 27 + .../alliances/JoinAllianceResponse.java | 30 + .../player/alliances/KickMembersCommand.java | 28 + .../alliances/LeaveAllianceCommand.java | 14 + .../alliances/ManageRequestsCommand.java | 36 + .../alliances/TransferLeadershipCommand.java | 28 + .../player/alliances/ViewAllianceCommand.java | 27 + .../alliances/ViewAllianceResponse.java | 40 + .../cmd/player/battles/GetBattleCommand.java | 43 + .../cmd/player/battles/GetBattleResponse.java | 29 + .../player/battles/ListBattlesCommand.java | 34 + .../player/battles/ListBattlesResponse.java | 48 + .../lw/cmd/player/bt/ListBugsResponse.java | 75 + .../lw/cmd/player/bt/PostCommentResponse.java | 69 + .../lw/cmd/player/bt/ReportBugResponse.java | 96 ++ .../lw/cmd/player/bt/ViewBugResponse.java | 68 + .../lw/cmd/player/elist/AddEnemyCommand.java | 36 + .../lw/cmd/player/elist/AddEnemyResponse.java | 50 + .../lw/cmd/player/elist/EnemyListCommand.java | 14 + .../cmd/player/elist/EnemyListResponse.java | 40 + .../player/elist/RemoveEnemiesCommand.java | 36 + .../player/fleets/DisbandFleetsCommand.java | 25 + .../player/fleets/DisbandFleetsResponse.java | 20 + .../cmd/player/fleets/MergeFleetsCommand.java | 16 + .../player/fleets/MergeFleetsResponse.java | 20 + .../cmd/player/fleets/MoveFleetsCommand.java | 41 + .../cmd/player/fleets/MoveFleetsResponse.java | 60 + .../cmd/player/fleets/MultiFleetsCommand.java | 27 + .../player/fleets/MultiFleetsResponse.java | 39 + .../player/fleets/RenameFleetsCommand.java | 41 + .../player/fleets/RenameFleetsResponse.java | 47 + .../player/fleets/SetFleetsModeCommand.java | 33 + .../player/fleets/SetFleetsModeResponse.java | 34 + .../cmd/player/fleets/SplitFleetCommand.java | 63 + .../cmd/player/fleets/SplitFleetResponse.java | 106 ++ .../cmd/player/fleets/ViewFleetsCommand.java | 14 + .../cmd/player/fleets/ViewFleetsResponse.java | 30 + .../lw/cmd/player/gdata/GamePageData.java | 87 + .../lw/cmd/player/gdata/GameResponseBase.java | 28 + .../lw/cmd/player/gdata/GameTime.java | 58 + .../lw/cmd/player/gdata/MailPreference.java | 32 + .../lw/cmd/player/gdata/MapSize.java | 33 + .../lw/cmd/player/gdata/NameIdPair.java | 36 + .../lw/cmd/player/gdata/PlanetListData.java | 335 ++++ .../lw/cmd/player/gdata/PlanetReference.java | 36 + .../cmd/player/gdata/PlanetRelationType.java | 10 + .../lw/cmd/player/gdata/ShortBattleView.java | 54 + .../lw/cmd/player/gdata/TimeCombo.java | 36 + .../cmd/player/gdata/account/AccountData.java | 156 ++ .../player/gdata/account/MailChangeData.java | 55 + .../player/gdata/account/PrefCategory.java | 43 + .../cmd/player/gdata/account/PrefChoice.java | 35 + .../lw/cmd/player/gdata/account/PrefType.java | 9 + .../cmd/player/gdata/account/PrefValue.java | 94 ++ .../alliance/AllianceCreationStatus.java | 54 + .../player/gdata/alliance/AllianceData.java | 45 + .../gdata/alliance/AllianceLeaderData.java | 31 + .../gdata/alliance/AllianceMemberData.java | 39 + .../gdata/alliance/AlliancePlanetData.java | 146 ++ .../alliance/PublicAllianceInformation.java | 69 + .../gdata/battles/BattleDescription.java | 83 + .../player/gdata/battles/BattleDisplay.java | 70 + .../cmd/player/gdata/battles/BattleEvent.java | 82 + .../player/gdata/battles/BattleEventType.java | 13 + .../gdata/battles/BattleHistoryInterval.java | 75 + .../gdata/battles/BattleHistoryTick.java | 45 + .../player/gdata/battles/BattleListEntry.java | 109 ++ .../gdata/battles/BattlePlanetBuildings.java | 28 + .../gdata/battles/BattlePlayerShips.java | 28 + .../player/gdata/battles/BattleShipType.java | 111 ++ .../player/gdata/battles/BattleShipsList.java | 46 + .../player/gdata/battles/BattleShipsView.java | 43 + .../player/gdata/battles/BattleSideShips.java | 62 + .../cmd/player/gdata/battles/BattleView.java | 69 + .../cmd/player/gdata/empire/OverviewData.java | 132 ++ .../player/gdata/empire/ResearchLineData.java | 70 + .../player/gdata/empire/TechnologyData.java | 70 + .../player/gdata/fleets/FleetLocation.java | 181 ++ .../cmd/player/gdata/fleets/FleetOwner.java | 48 + .../cmd/player/gdata/fleets/FleetShips.java | 67 + .../cmd/player/gdata/fleets/FleetStatus.java | 11 + .../cmd/player/gdata/fleets/FleetsView.java | 43 + .../cmd/player/gdata/fleets/MovingFleet.java | 130 ++ .../player/gdata/fleets/ShortFleetView.java | 147 ++ .../cmd/player/gdata/fleets/SplitShips.java | 37 + .../cmd/player/gdata/fleets/StaticFleet.java | 101 ++ .../cmd/player/gdata/map/MapPlanetData.java | 62 + .../cmd/player/gdata/map/MapSystemData.java | 27 + .../gdata/planets/BuildableBuildingData.java | 50 + .../gdata/planets/BuildableItemData.java | 107 ++ .../gdata/planets/BuildableShipData.java | 47 + .../player/gdata/planets/BuildingData.java | 119 ++ .../gdata/planets/OwnPlanetStatusData.java | 68 + .../player/gdata/planets/PlanetBasicView.java | 79 + .../gdata/planets/PlanetOrbitalView.java | 107 ++ .../player/gdata/planets/PlanetOwnView.java | 133 ++ .../cmd/player/gdata/planets/QueueData.java | 38 + .../player/gdata/planets/QueueItemData.java | 107 ++ .../player/msgs/ComposeMessageCommand.java | 97 ++ .../player/msgs/ComposeMessageResponse.java | 160 ++ .../cmd/player/msgs/GetMessagesCommand.java | 28 + .../cmd/player/msgs/GetMessagesResponse.java | 33 + .../cmd/player/msgs/ListTargetsCommand.java | 14 + .../cmd/player/msgs/ListTargetsResponse.java | 52 + .../lw/cmd/player/msgs/MessageBoxAction.java | 10 + .../lw/cmd/player/msgs/MessageBoxCommand.java | 52 + .../player/msgs/PrepareMessageCommand.java | 68 + .../cmd/player/msgs/ReadMessageCommand.java | 36 + .../cmd/player/msgs/ReadMessageResponse.java | 47 + .../player/planets/AbandonPlanetCommand.java | 24 + .../cmd/player/planets/BuildShipsCommand.java | 33 + .../player/planets/BuildingActionCommand.java | 41 + .../planets/BuildingActionResponse.java | 33 + .../cmd/player/planets/FlushQueueCommand.java | 24 + .../player/planets/RenamePlanetCommand.java | 24 + .../player/planets/RenamePlanetResponse.java | 40 + .../cmd/player/planets/ViewPlanetCommand.java | 27 + .../player/planets/ViewPlanetResponse.java | 87 + .../com/deepclone/lw/session/Command.java | 14 + .../deepclone/lw/session/CommandResponse.java | 14 + .../deepclone/lw/session/NullResponse.java | 10 + .../deepclone/lw/session/SessionAccessor.java | 25 + .../lw/session/SessionCommandException.java | 15 + .../lw/session/SessionException.java | 44 + .../session/SessionIdentifierException.java | 21 + .../lw/session/SessionInternalException.java | 21 + .../lw/session/SessionReference.java | 51 + .../deepclone/lw/session/SessionResponse.java | 39 + .../lw/session/SessionStateException.java | 20 + legacyworlds-utils/.classpath | 10 + legacyworlds-utils/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + legacyworlds-utils/pom.xml | 24 + .../com/deepclone/lw/utils/DigestHelper.java | 56 + legacyworlds-web/.project | 17 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-web-admin/.classpath | 25 + .../legacyworlds-web-admin/.project | 37 + .../.settings/.jsdtscope | 11 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../org.eclipse.wst.common.component | 12 + ....eclipse.wst.common.project.facet.core.xml | 6 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../org.eclipse.wst.ws.service.policy.prefs | 3 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../WebContent/META-INF/MANIFEST.MF | 3 + .../WebContent/WEB-INF/admin-servlet.xml | 71 + .../WebContent/WEB-INF/fm/ROOT.ftl | 11 + .../WEB-INF/fm/containers/external.ftl | 20 + .../WEB-INF/fm/containers/internal.ftl | 72 + .../WebContent/WEB-INF/fm/layout/columns.ftl | 18 + .../WEB-INF/fm/layout/datatable.ftl | 20 + .../WebContent/WEB-INF/fm/layout/fields.ftl | 20 + .../WebContent/WEB-INF/fm/layout/form.ftl | 98 ++ .../WebContent/WEB-INF/fm/layout/lists.ftl | 25 + .../WebContent/WEB-INF/fm/layout/tabs.ftl | 13 + .../WebContent/WEB-INF/fm/types/addAdmin.ftl | 68 + .../WebContent/WEB-INF/fm/types/admins.ftl | 43 + .../WebContent/WEB-INF/fm/types/banReject.ftl | 9 + .../WEB-INF/fm/types/banRequest.ftl | 20 + .../WebContent/WEB-INF/fm/types/bans.ftl | 75 + .../WEB-INF/fm/types/bansSummary.ftl | 37 + .../WebContent/WEB-INF/fm/types/bugsList.ftl | 151 ++ .../WEB-INF/fm/types/bugsReport.ftl | 42 + .../WEB-INF/fm/types/bugsSummary.ftl | 53 + .../WebContent/WEB-INF/fm/types/bugsTabs.ftl | 19 + .../WebContent/WEB-INF/fm/types/bugsView.ftl | 220 +++ .../WEB-INF/fm/types/changePassword.ftl | 31 + .../WebContent/WEB-INF/fm/types/constants.ftl | 29 + .../WebContent/WEB-INF/fm/types/language.ftl | 37 + .../WebContent/WEB-INF/fm/types/languages.ftl | 24 + .../WebContent/WEB-INF/fm/types/logEntry.ftl | 41 + .../WebContent/WEB-INF/fm/types/login.ftl | 10 + .../WebContent/WEB-INF/fm/types/logs.ftl | 103 ++ .../WebContent/WEB-INF/fm/types/main.ftl | 42 + .../WEB-INF/fm/types/maintenance.ftl | 40 + .../WebContent/WEB-INF/fm/types/message.ftl | 96 ++ .../WEB-INF/fm/types/messageBox.ftl | 112 ++ .../WEB-INF/fm/types/messageTabs.ftl | 10 + .../WEB-INF/fm/types/messageWriter.ftl | 79 + .../WebContent/WEB-INF/fm/types/names.ftl | 72 + .../WEB-INF/fm/types/namesSummary.ftl | 20 + .../WebContent/WEB-INF/fm/types/offline.ftl | 5 + .../WEB-INF/fm/types/preferences.ftl | 53 + .../WEB-INF/fm/types/resetAdmin.ftl | 18 + .../WebContent/WEB-INF/fm/types/spam.ftl | 27 + .../WebContent/WEB-INF/fm/types/ticker.ftl | 51 + .../WebContent/WEB-INF/fm/types/user.ftl | 58 + .../WEB-INF/fm/types/userSessions.ftl | 57 + .../WebContent/WEB-INF/fm/types/users.ftl | 49 + .../WebContent/WEB-INF/fm/types/viewAdmin.ftl | 41 + .../WebContent/WEB-INF/fm/version.ftl | 2 + .../WebContent/WEB-INF/web.xml | 61 + .../WebContent/css/main.css | 171 ++ .../legacyworlds-web-admin/pom.xml | 95 ++ .../lw/web/admin/BanhammerPages.java | 172 ++ .../lw/web/admin/BugTrackerPages.java | 373 ++++ .../lw/web/admin/ConstantsPages.java | 64 + .../lw/web/admin/ErrorHandlerBean.java | 44 + .../com/deepclone/lw/web/admin/I18NPages.java | 131 ++ .../com/deepclone/lw/web/admin/LogPages.java | 144 ++ .../com/deepclone/lw/web/admin/LoginPage.java | 53 + .../lw/web/admin/MaintenancePages.java | 89 + .../lw/web/admin/MessageBoxView.java | 73 + .../deepclone/lw/web/admin/MessagesPages.java | 453 +++++ .../deepclone/lw/web/admin/NamesPages.java | 107 ++ .../deepclone/lw/web/admin/PasswordPages.java | 51 + .../lw/web/admin/PreferencesPages.java | 48 + .../deepclone/lw/web/admin/SessionPages.java | 54 + .../com/deepclone/lw/web/admin/SpamPages.java | 89 + .../lw/web/admin/SuperUserPages.java | 186 ++ .../deepclone/lw/web/admin/TickerPages.java | 101 ++ .../deepclone/lw/web/admin/UsersPages.java | 144 ++ .../lw/web/admin/i18ne/LanguageExport.java | 28 + .../lw/web/admin/i18ne/StringExport.java | 21 + .../src/main/resources/log4j.properties | 5 + .../legacyworlds-web-beans/.classpath | 10 + .../legacyworlds-web-beans/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../legacyworlds-web-beans/pom.xml | 70 + .../beans/intercept/IEContentTypeBean.java | 26 + .../intercept/LanguageInterceptorBean.java | 159 ++ .../intercept/SessionInterceptorBean.java | 59 + .../beans/intercept/SessionRequirement.java | 24 + .../lw/web/beans/msgs/MessageFormatter.java | 10 + .../web/beans/msgs/MessageFormatterBean.java | 129 ++ .../beans/session/ClientSessionReference.java | 47 + .../web/beans/session/MaintenanceStatus.java | 15 + .../beans/session/MaintenanceStatusBean.java | 32 + .../lw/web/beans/session/Session.java | 103 ++ .../lw/web/beans/session/SessionClient.java | 33 + .../web/beans/session/SessionClientBean.java | 165 ++ .../session/SessionMaintenanceException.java | 27 + .../beans/session/SessionServerException.java | 16 + .../lw/web/beans/session/SessionType.java | 18 + .../lw/web/beans/view/BugTrackerBase.java | 99 ++ .../com/deepclone/lw/web/beans/view/Page.java | 62 + .../lw/web/beans/view/PageControllerBase.java | 163 ++ .../deepclone/lw/web/csess/AdminSession.java | 542 ++++++ .../lw/web/csess/ExternalSession.java | 68 + .../deepclone/lw/web/csess/PlayerSession.java | 578 +++++++ .../legacyworlds-web-main/.classpath | 21 + .../legacyworlds-web-main/.project | 37 + .../.settings/.jsdtscope | 11 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../org.eclipse.wst.common.component | 12 + ....eclipse.wst.common.project.facet.core.xml | 6 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../WebContent/META-INF/MANIFEST.MF | 3 + .../WebContent/WEB-INF/fm/ROOT.ftl | 13 + .../WEB-INF/fm/en/containers/chat.ftl | 28 + .../WEB-INF/fm/en/containers/external.ftl | 44 + .../WEB-INF/fm/en/containers/game.ftl | 70 + .../WEB-INF/fm/en/containers/offline.ftl | 27 + .../WEB-INF/fm/en/containers/restricted.ftl | 33 + .../WebContent/WEB-INF/fm/en/game.ftl | 66 + .../WebContent/WEB-INF/fm/en/static/home.ftl | 28 + .../WEB-INF/fm/en/static/loggedOut.ftl | 8 + .../WEB-INF/fm/en/static/loginFailed.ftl | 8 + .../WEB-INF/fm/en/static/noSession.ftl | 8 + .../fm/en/static/passwordRecoveryOk.ftl | 8 + .../WEB-INF/fm/en/static/reactivate.ftl | 11 + .../WebContent/WEB-INF/fm/en/static/rules.ftl | 113 ++ .../WebContent/WEB-INF/fm/en/static/scope.ftl | 56 + .../WEB-INF/fm/en/types/account.ftl | 220 +++ .../WEB-INF/fm/en/types/alliance.ftl | 268 +++ .../WebContent/WEB-INF/fm/en/types/banned.ftl | 12 + .../WebContent/WEB-INF/fm/en/types/battle.ftl | 261 +++ .../WEB-INF/fm/en/types/battles.ftl | 62 + .../WEB-INF/fm/en/types/bugsList.ftl | 136 ++ .../WEB-INF/fm/en/types/bugsReport.ftl | 57 + .../WEB-INF/fm/en/types/bugsTabs.ftl | 18 + .../WEB-INF/fm/en/types/bugsView.ftl | 124 ++ .../WebContent/WEB-INF/fm/en/types/chat.ftl | 27 + .../WEB-INF/fm/en/types/enemies.ftl | 98 ++ .../WebContent/WEB-INF/fm/en/types/fleets.ftl | 261 +++ .../WEB-INF/fm/en/types/fleetsCommand.ftl | 137 ++ .../WEB-INF/fm/en/types/getNewPlanet.ftl | 17 + .../WEB-INF/fm/en/types/maintenance.ftl | 16 + .../WebContent/WEB-INF/fm/en/types/map.ftl | 83 + .../WEB-INF/fm/en/types/message.ftl | 115 ++ .../WEB-INF/fm/en/types/messageBox.ftl | 125 ++ .../WEB-INF/fm/en/types/messageTabs.ftl | 11 + .../WEB-INF/fm/en/types/messageTargets.ftl | 62 + .../WEB-INF/fm/en/types/messageWriter.ftl | 82 + .../WEB-INF/fm/en/types/offline.ftl | 9 + .../WEB-INF/fm/en/types/overview.ftl | 118 ++ .../WEB-INF/fm/en/types/passwordRecovery.ftl | 69 + .../WebContent/WEB-INF/fm/en/types/planet.ftl | 329 ++++ .../WEB-INF/fm/en/types/planets.ftl | 167 ++ .../WEB-INF/fm/en/types/reactivation.ftl | 24 + .../WEB-INF/fm/en/types/register.ftl | 56 + .../WEB-INF/fm/en/types/registered.ftl | 13 + .../WEB-INF/fm/en/types/splitFleet.ftl | 40 + .../WebContent/WEB-INF/fm/en/types/static.ftl | 1 + .../WEB-INF/fm/en/types/validation.ftl | 50 + .../WEB-INF/fm/fr/containers/chat.ftl | 28 + .../WEB-INF/fm/fr/containers/external.ftl | 44 + .../WEB-INF/fm/fr/containers/game.ftl | 70 + .../WEB-INF/fm/fr/containers/offline.ftl | 27 + .../WEB-INF/fm/fr/containers/restricted.ftl | 33 + .../WebContent/WEB-INF/fm/fr/game.ftl | 66 + .../WebContent/WEB-INF/fm/fr/static/home.ftl | 26 + .../WEB-INF/fm/fr/static/loggedOut.ftl | 8 + .../WEB-INF/fm/fr/static/loginFailed.ftl | 8 + .../WEB-INF/fm/fr/static/noSession.ftl | 8 + .../fm/fr/static/passwordRecoveryOk.ftl | 8 + .../WEB-INF/fm/fr/static/reactivate.ftl | 11 + .../WebContent/WEB-INF/fm/fr/static/rules.ftl | 116 ++ .../WebContent/WEB-INF/fm/fr/static/scope.ftl | 58 + .../WEB-INF/fm/fr/types/account.ftl | 220 +++ .../WEB-INF/fm/fr/types/alliance.ftl | 268 +++ .../WebContent/WEB-INF/fm/fr/types/banned.ftl | 12 + .../WebContent/WEB-INF/fm/fr/types/battle.ftl | 261 +++ .../WEB-INF/fm/fr/types/battles.ftl | 62 + .../WEB-INF/fm/fr/types/bugsList.ftl | 136 ++ .../WEB-INF/fm/fr/types/bugsReport.ftl | 62 + .../WEB-INF/fm/fr/types/bugsTabs.ftl | 18 + .../WEB-INF/fm/fr/types/bugsView.ftl | 124 ++ .../WebContent/WEB-INF/fm/fr/types/chat.ftl | 28 + .../WEB-INF/fm/fr/types/enemies.ftl | 92 + .../WebContent/WEB-INF/fm/fr/types/fleets.ftl | 261 +++ .../WEB-INF/fm/fr/types/fleetsCommand.ftl | 137 ++ .../WEB-INF/fm/fr/types/getNewPlanet.ftl | 17 + .../WEB-INF/fm/fr/types/maintenance.ftl | 16 + .../WebContent/WEB-INF/fm/fr/types/map.ftl | 83 + .../WEB-INF/fm/fr/types/message.ftl | 115 ++ .../WEB-INF/fm/fr/types/messageBox.ftl | 124 ++ .../WEB-INF/fm/fr/types/messageTabs.ftl | 11 + .../WEB-INF/fm/fr/types/messageTargets.ftl | 62 + .../WEB-INF/fm/fr/types/messageWriter.ftl | 82 + .../WEB-INF/fm/fr/types/offline.ftl | 9 + .../WEB-INF/fm/fr/types/overview.ftl | 118 ++ .../WEB-INF/fm/fr/types/passwordRecovery.ftl | 69 + .../WebContent/WEB-INF/fm/fr/types/planet.ftl | 329 ++++ .../WEB-INF/fm/fr/types/planets.ftl | 167 ++ .../WEB-INF/fm/fr/types/reactivation.ftl | 24 + .../WEB-INF/fm/fr/types/register.ftl | 56 + .../WEB-INF/fm/fr/types/registered.ftl | 13 + .../WEB-INF/fm/fr/types/splitFleet.ftl | 40 + .../WebContent/WEB-INF/fm/fr/types/static.ftl | 1 + .../WEB-INF/fm/fr/types/validation.ftl | 50 + .../WebContent/WEB-INF/fm/layout/columns.ftl | 18 + .../WEB-INF/fm/layout/datatable.ftl | 20 + .../WebContent/WEB-INF/fm/layout/fields.ftl | 20 + .../WebContent/WEB-INF/fm/layout/form.ftl | 98 ++ .../WEB-INF/fm/layout/happiness.ftl | 20 + .../WebContent/WEB-INF/fm/layout/lists.ftl | 25 + .../WebContent/WEB-INF/fm/layout/tabs.ftl | 13 + .../WebContent/WEB-INF/fm/version.ftl | 2 + .../WebContent/WEB-INF/main-servlet.xml | 78 + .../WebContent/WEB-INF/web.xml | 83 + .../WebContent/css/main.css | 842 +++++++++ .../WebContent/img/background.jpg | Bin 0 -> 91318 bytes .../WebContent/img/button-0.png | Bin 0 -> 32007 bytes .../WebContent/img/button-1.png | Bin 0 -> 31317 bytes .../WebContent/img/button-2.png | Bin 0 -> 30310 bytes .../WebContent/img/button-3.png | Bin 0 -> 25647 bytes .../WebContent/img/button-4.png | Bin 0 -> 22337 bytes .../WebContent/img/button-5.png | Bin 0 -> 22034 bytes .../WebContent/img/button-6.png | Bin 0 -> 19169 bytes .../WebContent/img/pp/l/1.png | Bin 0 -> 18927 bytes .../WebContent/img/pp/l/10.png | Bin 0 -> 20247 bytes .../WebContent/img/pp/l/100.png | Bin 0 -> 18097 bytes .../WebContent/img/pp/l/101.png | Bin 0 -> 18640 bytes .../WebContent/img/pp/l/102.png | Bin 0 -> 19246 bytes .../WebContent/img/pp/l/103.png | Bin 0 -> 17771 bytes .../WebContent/img/pp/l/104.png | Bin 0 -> 20313 bytes .../WebContent/img/pp/l/105.png | Bin 0 -> 18127 bytes .../WebContent/img/pp/l/106.png | Bin 0 -> 19504 bytes .../WebContent/img/pp/l/107.png | Bin 0 -> 17042 bytes .../WebContent/img/pp/l/108.png | Bin 0 -> 17576 bytes .../WebContent/img/pp/l/109.png | Bin 0 -> 17039 bytes .../WebContent/img/pp/l/11.png | Bin 0 -> 18773 bytes .../WebContent/img/pp/l/110.png | Bin 0 -> 19802 bytes .../WebContent/img/pp/l/111.png | Bin 0 -> 16385 bytes .../WebContent/img/pp/l/112.png | Bin 0 -> 19697 bytes .../WebContent/img/pp/l/113.png | Bin 0 -> 19493 bytes .../WebContent/img/pp/l/114.png | Bin 0 -> 23225 bytes .../WebContent/img/pp/l/115.png | Bin 0 -> 20287 bytes .../WebContent/img/pp/l/116.png | Bin 0 -> 20459 bytes .../WebContent/img/pp/l/117.png | Bin 0 -> 18259 bytes .../WebContent/img/pp/l/118.png | Bin 0 -> 17937 bytes .../WebContent/img/pp/l/119.png | Bin 0 -> 16685 bytes .../WebContent/img/pp/l/12.png | Bin 0 -> 19904 bytes .../WebContent/img/pp/l/120.png | Bin 0 -> 22188 bytes .../WebContent/img/pp/l/121.png | Bin 0 -> 17430 bytes .../WebContent/img/pp/l/122.png | Bin 0 -> 19636 bytes .../WebContent/img/pp/l/123.png | Bin 0 -> 19528 bytes .../WebContent/img/pp/l/124.png | Bin 0 -> 17090 bytes .../WebContent/img/pp/l/125.png | Bin 0 -> 18013 bytes .../WebContent/img/pp/l/126.png | Bin 0 -> 18541 bytes .../WebContent/img/pp/l/127.png | Bin 0 -> 15580 bytes .../WebContent/img/pp/l/128.png | Bin 0 -> 19979 bytes .../WebContent/img/pp/l/129.png | Bin 0 -> 18029 bytes .../WebContent/img/pp/l/13.png | Bin 0 -> 18409 bytes .../WebContent/img/pp/l/130.png | Bin 0 -> 19525 bytes .../WebContent/img/pp/l/131.png | Bin 0 -> 20315 bytes .../WebContent/img/pp/l/132.png | Bin 0 -> 19287 bytes .../WebContent/img/pp/l/133.png | Bin 0 -> 19816 bytes .../WebContent/img/pp/l/134.png | Bin 0 -> 18704 bytes .../WebContent/img/pp/l/135.png | Bin 0 -> 18366 bytes .../WebContent/img/pp/l/136.png | Bin 0 -> 17876 bytes .../WebContent/img/pp/l/137.png | Bin 0 -> 20295 bytes .../WebContent/img/pp/l/138.png | Bin 0 -> 19151 bytes .../WebContent/img/pp/l/139.png | Bin 0 -> 16772 bytes .../WebContent/img/pp/l/14.png | Bin 0 -> 18420 bytes .../WebContent/img/pp/l/140.png | Bin 0 -> 19304 bytes .../WebContent/img/pp/l/141.png | Bin 0 -> 17918 bytes .../WebContent/img/pp/l/142.png | Bin 0 -> 18185 bytes .../WebContent/img/pp/l/143.png | Bin 0 -> 19859 bytes .../WebContent/img/pp/l/144.png | Bin 0 -> 18559 bytes .../WebContent/img/pp/l/145.png | Bin 0 -> 17425 bytes .../WebContent/img/pp/l/146.png | Bin 0 -> 18370 bytes .../WebContent/img/pp/l/147.png | Bin 0 -> 19710 bytes .../WebContent/img/pp/l/148.png | Bin 0 -> 17676 bytes .../WebContent/img/pp/l/149.png | Bin 0 -> 16942 bytes .../WebContent/img/pp/l/15.png | Bin 0 -> 20053 bytes .../WebContent/img/pp/l/150.png | Bin 0 -> 17442 bytes .../WebContent/img/pp/l/151.png | Bin 0 -> 18626 bytes .../WebContent/img/pp/l/152.png | Bin 0 -> 20769 bytes .../WebContent/img/pp/l/153.png | Bin 0 -> 17919 bytes .../WebContent/img/pp/l/154.png | Bin 0 -> 20953 bytes .../WebContent/img/pp/l/155.png | Bin 0 -> 18640 bytes .../WebContent/img/pp/l/156.png | Bin 0 -> 16847 bytes .../WebContent/img/pp/l/157.png | Bin 0 -> 16670 bytes .../WebContent/img/pp/l/158.png | Bin 0 -> 18247 bytes .../WebContent/img/pp/l/159.png | Bin 0 -> 19654 bytes .../WebContent/img/pp/l/16.png | Bin 0 -> 17308 bytes .../WebContent/img/pp/l/160.png | Bin 0 -> 18060 bytes .../WebContent/img/pp/l/161.png | Bin 0 -> 20404 bytes .../WebContent/img/pp/l/162.png | Bin 0 -> 21640 bytes .../WebContent/img/pp/l/163.png | Bin 0 -> 18977 bytes .../WebContent/img/pp/l/164.png | Bin 0 -> 18904 bytes .../WebContent/img/pp/l/165.png | Bin 0 -> 18690 bytes .../WebContent/img/pp/l/166.png | Bin 0 -> 17615 bytes .../WebContent/img/pp/l/167.png | Bin 0 -> 20746 bytes .../WebContent/img/pp/l/168.png | Bin 0 -> 17034 bytes .../WebContent/img/pp/l/169.png | Bin 0 -> 19384 bytes .../WebContent/img/pp/l/17.png | Bin 0 -> 19833 bytes .../WebContent/img/pp/l/170.png | Bin 0 -> 19700 bytes .../WebContent/img/pp/l/171.png | Bin 0 -> 19817 bytes .../WebContent/img/pp/l/172.png | Bin 0 -> 16852 bytes .../WebContent/img/pp/l/173.png | Bin 0 -> 17132 bytes .../WebContent/img/pp/l/174.png | Bin 0 -> 18775 bytes .../WebContent/img/pp/l/175.png | Bin 0 -> 16567 bytes .../WebContent/img/pp/l/176.png | Bin 0 -> 17595 bytes .../WebContent/img/pp/l/177.png | Bin 0 -> 17143 bytes .../WebContent/img/pp/l/178.png | Bin 0 -> 20270 bytes .../WebContent/img/pp/l/179.png | Bin 0 -> 18643 bytes .../WebContent/img/pp/l/18.png | Bin 0 -> 20043 bytes .../WebContent/img/pp/l/180.png | Bin 0 -> 17600 bytes .../WebContent/img/pp/l/181.png | Bin 0 -> 18994 bytes .../WebContent/img/pp/l/182.png | Bin 0 -> 17551 bytes .../WebContent/img/pp/l/183.png | Bin 0 -> 16472 bytes .../WebContent/img/pp/l/184.png | Bin 0 -> 18432 bytes .../WebContent/img/pp/l/185.png | Bin 0 -> 18615 bytes .../WebContent/img/pp/l/186.png | Bin 0 -> 19535 bytes .../WebContent/img/pp/l/187.png | Bin 0 -> 20195 bytes .../WebContent/img/pp/l/188.png | Bin 0 -> 18027 bytes .../WebContent/img/pp/l/189.png | Bin 0 -> 17795 bytes .../WebContent/img/pp/l/19.png | Bin 0 -> 19889 bytes .../WebContent/img/pp/l/190.png | Bin 0 -> 18190 bytes .../WebContent/img/pp/l/191.png | Bin 0 -> 20138 bytes .../WebContent/img/pp/l/192.png | Bin 0 -> 20944 bytes .../WebContent/img/pp/l/193.png | Bin 0 -> 20158 bytes .../WebContent/img/pp/l/194.png | Bin 0 -> 21111 bytes .../WebContent/img/pp/l/195.png | Bin 0 -> 16781 bytes .../WebContent/img/pp/l/196.png | Bin 0 -> 18648 bytes .../WebContent/img/pp/l/197.png | Bin 0 -> 18052 bytes .../WebContent/img/pp/l/198.png | Bin 0 -> 17179 bytes .../WebContent/img/pp/l/199.png | Bin 0 -> 18213 bytes .../WebContent/img/pp/l/2.png | Bin 0 -> 17815 bytes .../WebContent/img/pp/l/20.png | Bin 0 -> 17231 bytes .../WebContent/img/pp/l/200.png | Bin 0 -> 17867 bytes .../WebContent/img/pp/l/21.png | Bin 0 -> 17400 bytes .../WebContent/img/pp/l/22.png | Bin 0 -> 17890 bytes .../WebContent/img/pp/l/23.png | Bin 0 -> 18782 bytes .../WebContent/img/pp/l/24.png | Bin 0 -> 19364 bytes .../WebContent/img/pp/l/25.png | Bin 0 -> 16868 bytes .../WebContent/img/pp/l/26.png | Bin 0 -> 20325 bytes .../WebContent/img/pp/l/27.png | Bin 0 -> 19454 bytes .../WebContent/img/pp/l/28.png | Bin 0 -> 16661 bytes .../WebContent/img/pp/l/29.png | Bin 0 -> 15468 bytes .../WebContent/img/pp/l/3.png | Bin 0 -> 18625 bytes .../WebContent/img/pp/l/30.png | Bin 0 -> 17153 bytes .../WebContent/img/pp/l/31.png | Bin 0 -> 18207 bytes .../WebContent/img/pp/l/32.png | Bin 0 -> 20434 bytes .../WebContent/img/pp/l/33.png | Bin 0 -> 18343 bytes .../WebContent/img/pp/l/34.png | Bin 0 -> 18438 bytes .../WebContent/img/pp/l/35.png | Bin 0 -> 21149 bytes .../WebContent/img/pp/l/36.png | Bin 0 -> 17876 bytes .../WebContent/img/pp/l/37.png | Bin 0 -> 18887 bytes .../WebContent/img/pp/l/38.png | Bin 0 -> 19044 bytes .../WebContent/img/pp/l/39.png | Bin 0 -> 18552 bytes .../WebContent/img/pp/l/4.png | Bin 0 -> 22458 bytes .../WebContent/img/pp/l/40.png | Bin 0 -> 19774 bytes .../WebContent/img/pp/l/41.png | Bin 0 -> 19670 bytes .../WebContent/img/pp/l/42.png | Bin 0 -> 19746 bytes .../WebContent/img/pp/l/43.png | Bin 0 -> 19979 bytes .../WebContent/img/pp/l/44.png | Bin 0 -> 19735 bytes .../WebContent/img/pp/l/45.png | Bin 0 -> 18132 bytes .../WebContent/img/pp/l/46.png | Bin 0 -> 19494 bytes .../WebContent/img/pp/l/47.png | Bin 0 -> 16823 bytes .../WebContent/img/pp/l/48.png | Bin 0 -> 18900 bytes .../WebContent/img/pp/l/49.png | Bin 0 -> 18029 bytes .../WebContent/img/pp/l/5.png | Bin 0 -> 19159 bytes .../WebContent/img/pp/l/50.png | Bin 0 -> 17768 bytes .../WebContent/img/pp/l/51.png | Bin 0 -> 17401 bytes .../WebContent/img/pp/l/52.png | Bin 0 -> 17486 bytes .../WebContent/img/pp/l/53.png | Bin 0 -> 18882 bytes .../WebContent/img/pp/l/54.png | Bin 0 -> 18074 bytes .../WebContent/img/pp/l/55.png | Bin 0 -> 18351 bytes .../WebContent/img/pp/l/56.png | Bin 0 -> 20045 bytes .../WebContent/img/pp/l/57.png | Bin 0 -> 19811 bytes .../WebContent/img/pp/l/58.png | Bin 0 -> 18733 bytes .../WebContent/img/pp/l/59.png | Bin 0 -> 18352 bytes .../WebContent/img/pp/l/6.png | Bin 0 -> 18561 bytes .../WebContent/img/pp/l/60.png | Bin 0 -> 20808 bytes .../WebContent/img/pp/l/61.png | Bin 0 -> 19570 bytes .../WebContent/img/pp/l/62.png | Bin 0 -> 18107 bytes .../WebContent/img/pp/l/63.png | Bin 0 -> 20374 bytes .../WebContent/img/pp/l/64.png | Bin 0 -> 20169 bytes .../WebContent/img/pp/l/65.png | Bin 0 -> 15868 bytes .../WebContent/img/pp/l/66.png | Bin 0 -> 19225 bytes .../WebContent/img/pp/l/67.png | Bin 0 -> 17863 bytes .../WebContent/img/pp/l/68.png | Bin 0 -> 18712 bytes .../WebContent/img/pp/l/69.png | Bin 0 -> 17891 bytes .../WebContent/img/pp/l/7.png | Bin 0 -> 19159 bytes .../WebContent/img/pp/l/70.png | Bin 0 -> 16512 bytes .../WebContent/img/pp/l/71.png | Bin 0 -> 19082 bytes .../WebContent/img/pp/l/72.png | Bin 0 -> 19224 bytes .../WebContent/img/pp/l/73.png | Bin 0 -> 19040 bytes .../WebContent/img/pp/l/74.png | Bin 0 -> 18633 bytes .../WebContent/img/pp/l/75.png | Bin 0 -> 17084 bytes .../WebContent/img/pp/l/76.png | Bin 0 -> 18663 bytes .../WebContent/img/pp/l/77.png | Bin 0 -> 18234 bytes .../WebContent/img/pp/l/78.png | Bin 0 -> 19421 bytes .../WebContent/img/pp/l/79.png | Bin 0 -> 17422 bytes .../WebContent/img/pp/l/8.png | Bin 0 -> 17505 bytes .../WebContent/img/pp/l/80.png | Bin 0 -> 18045 bytes .../WebContent/img/pp/l/81.png | Bin 0 -> 19360 bytes .../WebContent/img/pp/l/82.png | Bin 0 -> 21357 bytes .../WebContent/img/pp/l/83.png | Bin 0 -> 19133 bytes .../WebContent/img/pp/l/84.png | Bin 0 -> 18090 bytes .../WebContent/img/pp/l/85.png | Bin 0 -> 18356 bytes .../WebContent/img/pp/l/86.png | Bin 0 -> 19159 bytes .../WebContent/img/pp/l/87.png | Bin 0 -> 15519 bytes .../WebContent/img/pp/l/88.png | Bin 0 -> 18753 bytes .../WebContent/img/pp/l/89.png | Bin 0 -> 20808 bytes .../WebContent/img/pp/l/9.png | Bin 0 -> 17770 bytes .../WebContent/img/pp/l/90.png | Bin 0 -> 16877 bytes .../WebContent/img/pp/l/91.png | Bin 0 -> 18824 bytes .../WebContent/img/pp/l/92.png | Bin 0 -> 19177 bytes .../WebContent/img/pp/l/93.png | Bin 0 -> 19570 bytes .../WebContent/img/pp/l/94.png | Bin 0 -> 18186 bytes .../WebContent/img/pp/l/95.png | Bin 0 -> 19602 bytes .../WebContent/img/pp/l/96.png | Bin 0 -> 20110 bytes .../WebContent/img/pp/l/97.png | Bin 0 -> 18416 bytes .../WebContent/img/pp/l/98.png | Bin 0 -> 20133 bytes .../WebContent/img/pp/l/99.png | Bin 0 -> 20194 bytes .../WebContent/img/pp/s/1.png | Bin 0 -> 2004 bytes .../WebContent/img/pp/s/10.png | Bin 0 -> 1990 bytes .../WebContent/img/pp/s/100.png | Bin 0 -> 1780 bytes .../WebContent/img/pp/s/101.png | Bin 0 -> 1793 bytes .../WebContent/img/pp/s/102.png | Bin 0 -> 1939 bytes .../WebContent/img/pp/s/103.png | Bin 0 -> 1813 bytes .../WebContent/img/pp/s/104.png | Bin 0 -> 1935 bytes .../WebContent/img/pp/s/105.png | Bin 0 -> 1902 bytes .../WebContent/img/pp/s/106.png | Bin 0 -> 1946 bytes .../WebContent/img/pp/s/107.png | Bin 0 -> 1680 bytes .../WebContent/img/pp/s/108.png | Bin 0 -> 1922 bytes .../WebContent/img/pp/s/109.png | Bin 0 -> 1728 bytes .../WebContent/img/pp/s/11.png | Bin 0 -> 1809 bytes .../WebContent/img/pp/s/110.png | Bin 0 -> 1971 bytes .../WebContent/img/pp/s/111.png | Bin 0 -> 1704 bytes .../WebContent/img/pp/s/112.png | Bin 0 -> 1915 bytes .../WebContent/img/pp/s/113.png | Bin 0 -> 1895 bytes .../WebContent/img/pp/s/114.png | Bin 0 -> 2262 bytes .../WebContent/img/pp/s/115.png | Bin 0 -> 1954 bytes .../WebContent/img/pp/s/116.png | Bin 0 -> 2046 bytes .../WebContent/img/pp/s/117.png | Bin 0 -> 1692 bytes .../WebContent/img/pp/s/118.png | Bin 0 -> 1939 bytes .../WebContent/img/pp/s/119.png | Bin 0 -> 1694 bytes .../WebContent/img/pp/s/12.png | Bin 0 -> 1915 bytes .../WebContent/img/pp/s/120.png | Bin 0 -> 2150 bytes .../WebContent/img/pp/s/121.png | Bin 0 -> 1760 bytes .../WebContent/img/pp/s/122.png | Bin 0 -> 2015 bytes .../WebContent/img/pp/s/123.png | Bin 0 -> 1940 bytes .../WebContent/img/pp/s/124.png | Bin 0 -> 1734 bytes .../WebContent/img/pp/s/125.png | Bin 0 -> 1751 bytes .../WebContent/img/pp/s/126.png | Bin 0 -> 1998 bytes .../WebContent/img/pp/s/127.png | Bin 0 -> 1670 bytes .../WebContent/img/pp/s/128.png | Bin 0 -> 1937 bytes .../WebContent/img/pp/s/129.png | Bin 0 -> 1823 bytes .../WebContent/img/pp/s/13.png | Bin 0 -> 1870 bytes .../WebContent/img/pp/s/130.png | Bin 0 -> 2028 bytes .../WebContent/img/pp/s/131.png | Bin 0 -> 1909 bytes .../WebContent/img/pp/s/132.png | Bin 0 -> 1889 bytes .../WebContent/img/pp/s/133.png | Bin 0 -> 1849 bytes .../WebContent/img/pp/s/134.png | Bin 0 -> 1835 bytes .../WebContent/img/pp/s/135.png | Bin 0 -> 1848 bytes .../WebContent/img/pp/s/136.png | Bin 0 -> 1814 bytes .../WebContent/img/pp/s/137.png | Bin 0 -> 2149 bytes .../WebContent/img/pp/s/138.png | Bin 0 -> 1875 bytes .../WebContent/img/pp/s/139.png | Bin 0 -> 1643 bytes .../WebContent/img/pp/s/14.png | Bin 0 -> 1866 bytes .../WebContent/img/pp/s/140.png | Bin 0 -> 1948 bytes .../WebContent/img/pp/s/141.png | Bin 0 -> 1860 bytes .../WebContent/img/pp/s/142.png | Bin 0 -> 1791 bytes .../WebContent/img/pp/s/143.png | Bin 0 -> 2047 bytes .../WebContent/img/pp/s/144.png | Bin 0 -> 1834 bytes .../WebContent/img/pp/s/145.png | Bin 0 -> 1783 bytes .../WebContent/img/pp/s/146.png | Bin 0 -> 1865 bytes .../WebContent/img/pp/s/147.png | Bin 0 -> 1852 bytes .../WebContent/img/pp/s/148.png | Bin 0 -> 1738 bytes .../WebContent/img/pp/s/149.png | Bin 0 -> 1679 bytes .../WebContent/img/pp/s/15.png | Bin 0 -> 1929 bytes .../WebContent/img/pp/s/150.png | Bin 0 -> 1801 bytes .../WebContent/img/pp/s/151.png | Bin 0 -> 1949 bytes .../WebContent/img/pp/s/152.png | Bin 0 -> 2007 bytes .../WebContent/img/pp/s/153.png | Bin 0 -> 1823 bytes .../WebContent/img/pp/s/154.png | Bin 0 -> 2002 bytes .../WebContent/img/pp/s/155.png | Bin 0 -> 1766 bytes .../WebContent/img/pp/s/156.png | Bin 0 -> 1683 bytes .../WebContent/img/pp/s/157.png | Bin 0 -> 1685 bytes .../WebContent/img/pp/s/158.png | Bin 0 -> 1832 bytes .../WebContent/img/pp/s/159.png | Bin 0 -> 1944 bytes .../WebContent/img/pp/s/16.png | Bin 0 -> 1733 bytes .../WebContent/img/pp/s/160.png | Bin 0 -> 1884 bytes .../WebContent/img/pp/s/161.png | Bin 0 -> 2051 bytes .../WebContent/img/pp/s/162.png | Bin 0 -> 2094 bytes .../WebContent/img/pp/s/163.png | Bin 0 -> 1849 bytes .../WebContent/img/pp/s/164.png | Bin 0 -> 1960 bytes .../WebContent/img/pp/s/165.png | Bin 0 -> 1872 bytes .../WebContent/img/pp/s/166.png | Bin 0 -> 1826 bytes .../WebContent/img/pp/s/167.png | Bin 0 -> 2008 bytes .../WebContent/img/pp/s/168.png | Bin 0 -> 1705 bytes .../WebContent/img/pp/s/169.png | Bin 0 -> 1942 bytes .../WebContent/img/pp/s/17.png | Bin 0 -> 1994 bytes .../WebContent/img/pp/s/170.png | Bin 0 -> 1932 bytes .../WebContent/img/pp/s/171.png | Bin 0 -> 1937 bytes .../WebContent/img/pp/s/172.png | Bin 0 -> 1892 bytes .../WebContent/img/pp/s/173.png | Bin 0 -> 1652 bytes .../WebContent/img/pp/s/174.png | Bin 0 -> 1950 bytes .../WebContent/img/pp/s/175.png | Bin 0 -> 1761 bytes .../WebContent/img/pp/s/176.png | Bin 0 -> 1718 bytes .../WebContent/img/pp/s/177.png | Bin 0 -> 1773 bytes .../WebContent/img/pp/s/178.png | Bin 0 -> 1982 bytes .../WebContent/img/pp/s/179.png | Bin 0 -> 1946 bytes .../WebContent/img/pp/s/18.png | Bin 0 -> 2038 bytes .../WebContent/img/pp/s/180.png | Bin 0 -> 1763 bytes .../WebContent/img/pp/s/181.png | Bin 0 -> 1831 bytes .../WebContent/img/pp/s/182.png | Bin 0 -> 1768 bytes .../WebContent/img/pp/s/183.png | Bin 0 -> 1749 bytes .../WebContent/img/pp/s/184.png | Bin 0 -> 1855 bytes .../WebContent/img/pp/s/185.png | Bin 0 -> 1868 bytes .../WebContent/img/pp/s/186.png | Bin 0 -> 1949 bytes .../WebContent/img/pp/s/187.png | Bin 0 -> 2017 bytes .../WebContent/img/pp/s/188.png | Bin 0 -> 1751 bytes .../WebContent/img/pp/s/189.png | Bin 0 -> 1735 bytes .../WebContent/img/pp/s/19.png | Bin 0 -> 1926 bytes .../WebContent/img/pp/s/190.png | Bin 0 -> 1810 bytes .../WebContent/img/pp/s/191.png | Bin 0 -> 2128 bytes .../WebContent/img/pp/s/192.png | Bin 0 -> 2052 bytes .../WebContent/img/pp/s/193.png | Bin 0 -> 2186 bytes .../WebContent/img/pp/s/194.png | Bin 0 -> 2045 bytes .../WebContent/img/pp/s/195.png | Bin 0 -> 1655 bytes .../WebContent/img/pp/s/196.png | Bin 0 -> 1837 bytes .../WebContent/img/pp/s/197.png | Bin 0 -> 1765 bytes .../WebContent/img/pp/s/198.png | Bin 0 -> 1758 bytes .../WebContent/img/pp/s/199.png | Bin 0 -> 1823 bytes .../WebContent/img/pp/s/2.png | Bin 0 -> 1747 bytes .../WebContent/img/pp/s/20.png | Bin 0 -> 1752 bytes .../WebContent/img/pp/s/200.png | Bin 0 -> 1747 bytes .../WebContent/img/pp/s/21.png | Bin 0 -> 1738 bytes .../WebContent/img/pp/s/22.png | Bin 0 -> 1789 bytes .../WebContent/img/pp/s/23.png | Bin 0 -> 1890 bytes .../WebContent/img/pp/s/24.png | Bin 0 -> 1838 bytes .../WebContent/img/pp/s/25.png | Bin 0 -> 1769 bytes .../WebContent/img/pp/s/26.png | Bin 0 -> 1973 bytes .../WebContent/img/pp/s/27.png | Bin 0 -> 1887 bytes .../WebContent/img/pp/s/28.png | Bin 0 -> 1815 bytes .../WebContent/img/pp/s/29.png | Bin 0 -> 1628 bytes .../WebContent/img/pp/s/3.png | Bin 0 -> 1765 bytes .../WebContent/img/pp/s/30.png | Bin 0 -> 1741 bytes .../WebContent/img/pp/s/31.png | Bin 0 -> 1881 bytes .../WebContent/img/pp/s/32.png | Bin 0 -> 2041 bytes .../WebContent/img/pp/s/33.png | Bin 0 -> 1882 bytes .../WebContent/img/pp/s/34.png | Bin 0 -> 1879 bytes .../WebContent/img/pp/s/35.png | Bin 0 -> 2149 bytes .../WebContent/img/pp/s/36.png | Bin 0 -> 2064 bytes .../WebContent/img/pp/s/37.png | Bin 0 -> 1783 bytes .../WebContent/img/pp/s/38.png | Bin 0 -> 1956 bytes .../WebContent/img/pp/s/39.png | Bin 0 -> 1970 bytes .../WebContent/img/pp/s/4.png | Bin 0 -> 2183 bytes .../WebContent/img/pp/s/40.png | Bin 0 -> 2013 bytes .../WebContent/img/pp/s/41.png | Bin 0 -> 1966 bytes .../WebContent/img/pp/s/42.png | Bin 0 -> 1901 bytes .../WebContent/img/pp/s/43.png | Bin 0 -> 1903 bytes .../WebContent/img/pp/s/44.png | Bin 0 -> 1915 bytes .../WebContent/img/pp/s/45.png | Bin 0 -> 1781 bytes .../WebContent/img/pp/s/46.png | Bin 0 -> 1853 bytes .../WebContent/img/pp/s/47.png | Bin 0 -> 1726 bytes .../WebContent/img/pp/s/48.png | Bin 0 -> 1904 bytes .../WebContent/img/pp/s/49.png | Bin 0 -> 1807 bytes .../WebContent/img/pp/s/5.png | Bin 0 -> 1848 bytes .../WebContent/img/pp/s/50.png | Bin 0 -> 1764 bytes .../WebContent/img/pp/s/51.png | Bin 0 -> 1761 bytes .../WebContent/img/pp/s/52.png | Bin 0 -> 1795 bytes .../WebContent/img/pp/s/53.png | Bin 0 -> 1988 bytes .../WebContent/img/pp/s/54.png | Bin 0 -> 1817 bytes .../WebContent/img/pp/s/55.png | Bin 0 -> 1895 bytes .../WebContent/img/pp/s/56.png | Bin 0 -> 1969 bytes .../WebContent/img/pp/s/57.png | Bin 0 -> 1997 bytes .../WebContent/img/pp/s/58.png | Bin 0 -> 1925 bytes .../WebContent/img/pp/s/59.png | Bin 0 -> 1881 bytes .../WebContent/img/pp/s/6.png | Bin 0 -> 1876 bytes .../WebContent/img/pp/s/60.png | Bin 0 -> 2105 bytes .../WebContent/img/pp/s/61.png | Bin 0 -> 1845 bytes .../WebContent/img/pp/s/62.png | Bin 0 -> 1937 bytes .../WebContent/img/pp/s/63.png | Bin 0 -> 2151 bytes .../WebContent/img/pp/s/64.png | Bin 0 -> 2043 bytes .../WebContent/img/pp/s/65.png | Bin 0 -> 1634 bytes .../WebContent/img/pp/s/66.png | Bin 0 -> 1944 bytes .../WebContent/img/pp/s/67.png | Bin 0 -> 1857 bytes .../WebContent/img/pp/s/68.png | Bin 0 -> 1994 bytes .../WebContent/img/pp/s/69.png | Bin 0 -> 1724 bytes .../WebContent/img/pp/s/7.png | Bin 0 -> 1942 bytes .../WebContent/img/pp/s/70.png | Bin 0 -> 1663 bytes .../WebContent/img/pp/s/71.png | Bin 0 -> 1880 bytes .../WebContent/img/pp/s/72.png | Bin 0 -> 2009 bytes .../WebContent/img/pp/s/73.png | Bin 0 -> 1862 bytes .../WebContent/img/pp/s/74.png | Bin 0 -> 1891 bytes .../WebContent/img/pp/s/75.png | Bin 0 -> 1652 bytes .../WebContent/img/pp/s/76.png | Bin 0 -> 1846 bytes .../WebContent/img/pp/s/77.png | Bin 0 -> 1773 bytes .../WebContent/img/pp/s/78.png | Bin 0 -> 1921 bytes .../WebContent/img/pp/s/79.png | Bin 0 -> 1773 bytes .../WebContent/img/pp/s/8.png | Bin 0 -> 1712 bytes .../WebContent/img/pp/s/80.png | Bin 0 -> 1747 bytes .../WebContent/img/pp/s/81.png | Bin 0 -> 1907 bytes .../WebContent/img/pp/s/82.png | Bin 0 -> 2034 bytes .../WebContent/img/pp/s/83.png | Bin 0 -> 1967 bytes .../WebContent/img/pp/s/84.png | Bin 0 -> 1802 bytes .../WebContent/img/pp/s/85.png | Bin 0 -> 1936 bytes .../WebContent/img/pp/s/86.png | Bin 0 -> 1955 bytes .../WebContent/img/pp/s/87.png | Bin 0 -> 1646 bytes .../WebContent/img/pp/s/88.png | Bin 0 -> 1888 bytes .../WebContent/img/pp/s/89.png | Bin 0 -> 2106 bytes .../WebContent/img/pp/s/9.png | Bin 0 -> 1829 bytes .../WebContent/img/pp/s/90.png | Bin 0 -> 1698 bytes .../WebContent/img/pp/s/91.png | Bin 0 -> 1987 bytes .../WebContent/img/pp/s/92.png | Bin 0 -> 1952 bytes .../WebContent/img/pp/s/93.png | Bin 0 -> 1857 bytes .../WebContent/img/pp/s/94.png | Bin 0 -> 1865 bytes .../WebContent/img/pp/s/95.png | Bin 0 -> 2056 bytes .../WebContent/img/pp/s/96.png | Bin 0 -> 1930 bytes .../WebContent/img/pp/s/97.png | Bin 0 -> 1840 bytes .../WebContent/img/pp/s/98.png | Bin 0 -> 2062 bytes .../WebContent/img/pp/s/99.png | Bin 0 -> 2039 bytes .../WebContent/js/jquery-1.4.2.min.js | 154 ++ .../WebContent/js/main.js | 311 ++++ .../WebContent/pjirc/IRCApplet.class | Bin 0 -> 3158 bytes .../WebContent/pjirc/background.gif | Bin 0 -> 17704 bytes .../WebContent/pjirc/english.lng | 92 + .../WebContent/pjirc/french.lng | 91 + .../WebContent/pjirc/irc.cab | Bin 0 -> 86969 bytes .../WebContent/pjirc/irc.jar | Bin 0 -> 147301 bytes .../WebContent/pjirc/pixx-english.lng | 75 + .../WebContent/pjirc/pixx-french.lng | 75 + .../WebContent/pjirc/pixx.cab | Bin 0 -> 51629 bytes .../WebContent/pjirc/pixx.jar | Bin 0 -> 70487 bytes .../WebContent/pjirc/securedirc.cab | Bin 0 -> 7788 bytes .../legacyworlds-web-main/pom.xml | 89 + .../com/deepclone/lw/web/main/BannedPage.java | 35 + .../deepclone/lw/web/main/CommonPages.java | 54 + .../lw/web/main/ErrorHandlerBean.java | 86 + .../deepclone/lw/web/main/ExternalPages.java | 56 + .../com/deepclone/lw/web/main/LoginPages.java | 46 + .../deepclone/lw/web/main/LogoutPages.java | 34 + .../lw/web/main/PasswordRecoveryPages.java | 73 + .../lw/web/main/PlayerSessionRedirector.java | 45 + .../lw/web/main/ReactivationPages.java | 42 + .../lw/web/main/RegistrationPages.java | 62 + .../lw/web/main/ValidationPages.java | 56 + .../lw/web/main/game/AccountPage.java | 158 ++ .../lw/web/main/game/AlliancePage.java | 172 ++ .../lw/web/main/game/BattlePages.java | 132 ++ .../lw/web/main/game/BugTrackerPages.java | 170 ++ .../deepclone/lw/web/main/game/ChatPage.java | 37 + .../lw/web/main/game/EnemiesPage.java | 111 ++ .../lw/web/main/game/FleetsPage.java | 251 +++ .../lw/web/main/game/GetPlanetPage.java | 61 + .../deepclone/lw/web/main/game/MapPage.java | 98 ++ .../lw/web/main/game/MessageBoxView.java | 73 + .../lw/web/main/game/MessagePages.java | 487 ++++++ .../lw/web/main/game/OverviewPage.java | 55 + .../lw/web/main/game/PlanetListPage.java | 36 + .../lw/web/main/game/PlanetPage.java | 236 +++ .../src/main/resources/log4j.properties | 5 + legacyworlds-web/pom.xml | 22 + pom.xml | 72 + runsrv.sh | 4 + runtool.sh | 4 + 1695 files changed, 98617 insertions(+) create mode 100644 .project create mode 100755 build-tools/BUILD.sh create mode 100755 build-tools/deploy.sh create mode 100755 build-tools/execute-clit.sh create mode 100644 build-tools/server-config-example.sh create mode 100755 build-tools/start-server.sh create mode 100755 build-tools/stop-server.sh create mode 100644 eclipse-code-format.xml create mode 100644 legacyworlds-server/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountManagementBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UserSessionDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UsersDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdministrationBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/IpBanBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/BoolPreferenceType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/DefaultPreferencesBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/EnumPreferenceType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/IntPreferenceType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceDefinitionsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypeImpl.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypesRegistryBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferencesDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/StringPreferenceType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-cleanup-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-management-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-recap-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/administration-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-processor-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/default-preferences-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/ip-ban-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preference-definitions-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preferences-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/quit-processor-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/requests-expiration-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/user-session-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/users-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/vacation-processor-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/AdminBugsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/BugsDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/EmpireSummaryBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/PlayerBugsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AccountInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AllianceInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/BuildingsInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/DebugInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/EmpireInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/FleetInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/MovementInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/PlanetInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueItemInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ResearchInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ShipsInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/SystemInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/admin-bugs-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/bugs-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/empire-summary-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/player-bugs-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/EntryQueueItem.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogReaderBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LoggerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/SystemLoggerImpl.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/admin-error-mail-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-cleaner-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-reader-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-writer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/logger-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NAdministrationImpl.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NData.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NManagerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LanguageStore.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LoaderTransaction.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/TranslatorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-manager-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-translator-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailDataImpl.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueHandler.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueItem.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTerminator.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/QueuedMail.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer/mailer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamesManagerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamingDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/names-manager-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/naming-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceManagementBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireManagementBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/PlanetListMapper.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattleViewerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesCacheBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetManagementBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetsDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/MapViewerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetsManagementBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/AdminMessagesBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/EmpireMessagesBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MailTaskBase.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageBoxDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageCleanerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageContentCacheBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatRegistryBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatWiringBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageRecordsDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageTasksBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/RecapitulationTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AbandonMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageExtractor.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceDisbandedMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceMessageExtractor.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BattleMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BugMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/DebtMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/ExternalMessageFormatBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageExtractor.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/KickedMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeadershipMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeftAllianceMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LostPlanetMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PendingRequestMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PlanetMessageExtractor.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/QueueMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/RequestResultMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/StrikeMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TakenPlanetMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TechMessageFormatterBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/GameUpdateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/UpdatesDAOBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-management-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/battle-data-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-management-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleet-management-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleets-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/game-update-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/map-viewer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/message-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planet-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planets-management-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-generator-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/updates-dao-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsAdministrationImpl.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsData.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsManagerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsRegistrarBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ServerSessionData.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SessionManagerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SystemStatusBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerManagerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTask.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTaskStatusHandler.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerThread.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-manager-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-registrar-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/session-manager-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/system-status-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/ticker-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.project create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ObjectNameValidatorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredCommandDelegate.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredSubTypeDelegate.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandDelegate.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandHandler.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandWiringBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeDelegate.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeWiringBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/StatefulSessionTypeDefiner.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionDefinerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionSubType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/AdminOperation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CommonCommandsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CreateAuthChallengeCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/NoOperationCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/SetPasswordCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminCommandsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminOverviewCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/BansSummaryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ConfirmBanCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/LiftBanCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ListBansCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RejectBanCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RequestBanCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/BugsSummaryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/GetSnapshotCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ListBugsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/MergeReportsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ModerateCommentCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/PostCommentCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportBugCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportStatusCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportVisibilityCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ValidateReportCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ViewBugCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/GetConstantsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/SetConstantCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ChangeLanguageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/GetLanguageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/SetStringCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ViewLanguagesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/GetEntryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/ViewLogsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EnableMaintenanceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EndMaintenanceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/ExtendMaintenanceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/MaintenanceStatusCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ComposeMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/GetMessagesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/MessageBoxCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/PrepareMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ReadMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/SendSpamCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/GetNamesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesActionCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesSummaryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/GetPrefDefaultsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/SetPrefDefaultCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/AddAdministratorCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ListAdministratorsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ResetAdminPasswordCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SUExistingOperation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SetPrivilegesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SuperUserOperation.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ViewAdministratorCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/SetTaskStatusCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/TickerStatusCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/ToggleTickerCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/GiveCreditsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListAccountsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListSessionsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ViewAccountCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/AccountCreationCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ConfPwdRecoveryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ExternalSessionDefinerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/LanguageListRequired.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ListLanguagesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ReqPwdRecoveryCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BanDetailsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BannedSubTypeBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/DisabledSubTypeBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GameSubTypeBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GetLanguageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerCommonCommandsBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionDefinerBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionSubType.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ReactivateCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationSubTypeBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CancelQuitCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CreateAuthChallengeCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/GetAccountCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/QuitGameCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetAddressCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetLanguageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPasswordCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPreferencesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ToggleVacationCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ValidateSetAddressCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ListBugsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/PostCommentCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ReportBugCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ViewBugCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetBattleCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetNewPlanetCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ImplementTechCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListBattlesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListPlanetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/OverviewCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ViewMapCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/AllianceStatusCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CancelJoinCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CreateAllianceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/JoinAllianceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/KickMembersCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/LeaveAllianceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ManageRequestsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/TransferLeadershipCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ViewAllianceCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/AddEnemyCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/EnemyListCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/RemoveEnemiesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/DisbandFleetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MergeFleetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MoveFleetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/RenameFleetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SetFleetsModeCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SplitFleetCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/ViewFleetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/AbandonPlanetCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/BuildingActionCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/FlushQueueCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/RenamePlanetCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ShipBuildingCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ViewPlanetCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ComposeMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/GetMessagesCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ListTargetsCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/MessageBoxCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/PrepareMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ReadMessageCommandDelegateBean.java create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user-beans.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/admin-session-definer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/external-session-definer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/object-name-validator-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/player-session-definer-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-command-wiring-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-subtype-wiring-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-beans/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-data/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-data/.project create mode 100644 legacyworlds-server/legacyworlds-server-data/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/database.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/db-config.txt create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/000-schemas.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/010-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/020-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/030-updates.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/000-typedefs.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/010-i18n-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/020-prefs-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/030-users-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/035-session-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/040-admin-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/050-accounts-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/055-bugs-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/060-naming-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/070-constants-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/080-techs-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/090-buildables-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/100-universe-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/110-empires-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/120-construction-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/130-fleets-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/140-status-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/150-logs-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/160-battle-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/170-events-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/180-messages-data.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/000-defs-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/002-sys-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/005-logs-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/010-constants-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/020-naming-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/030-tech-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/035-users-view.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/040-empire-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/050-computation-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/060-universe-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/070-users-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/075-session-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/080-buildings-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/100-status-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/110-prefs-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/120-map-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/140-planets-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/150-battle-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/160-battle-views.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/163-alliance-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/165-fleets-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/167-planet-list.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/170-event-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/180-messages-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/190-admin-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/200-bugs-functions.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/210-admin-overview.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/000-updates-ctrl.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/010-empire-money.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/020-empire-research.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/025-empire-debt.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/030-fleet-arrivals.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/040-fleet-movements.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/050-fleet-status.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/060-planet-battle.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/070-planet-abandon.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/080-planet-construction.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/090-planet-military.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/100-planet-population.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/110-planet-money.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/db-structure/test-mode.sql create mode 100644 legacyworlds-server/legacyworlds-server-data/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/Account.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/AccountOperationResult.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/QuittingAccount.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/ValidationResult.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminConnection.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/AllianceMembership.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/BuildingOutputType.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechLine.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechnology.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/GeneralInformation.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/MapData.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/PlanetData.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetOwner.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetShip.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawStaticFleet.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BattleListRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BuildingHistoryRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EmpireBattleRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventItemRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/PresenceRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ProtagonistRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ShipHistoryRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/i18n/Translation.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AdminEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AllianceEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/BugEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EmpireEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventType.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventTypeRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventFleet.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FormatType.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/InboxRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/MessageDataRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/NotificationsRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/PlanetEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventLocation.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/TextMessageRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Constant.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/ExceptionLog.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/StackTraceLog.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Status.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/SystemLogEntry.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/TickerTaskRecord.java create mode 100644 legacyworlds-server/legacyworlds-server-data/src/main/resources/configuration/transaction-bean.xml create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/.project create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountMailException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountManagement.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountSession.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/EmailChangeException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/JoinGameException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordProhibitedException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordRecoveryException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PermanentlyDisabledException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UserSessionDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UsersDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAOException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/Administration.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BanMailData.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BansDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/IpBan.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/AdminBugs.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/BugsDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/EmpireSummary.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/PlayerBugs.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/ExtendedLogEntry.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogReader.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogWriter.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/Logger.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/SystemLogger.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceManagement.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattleViewer.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesCache.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireManagement.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetManagement.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetsDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewParameters.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewer.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetsManagement.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UniverseDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UpdatesDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateLanguageException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateStringException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NAdministration.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NManager.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/InvalidUpdateException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/TranslationException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/Translator.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownLanguageException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownStringException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/AlreadySentException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailData.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/Mailer.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailerException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MissingDataException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/NotSentException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/AdminMessages.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/EmpireMessages.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageBoxDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageContentCache.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageExtractor.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatRegistry.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatter.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageRecordsDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/NotificationsDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/EmpireNameException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/MapNameException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamesManager.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamingDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/AccountPreferences.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/Preference.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitionException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitions.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceGroup.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceType.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceTypesRegistry.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferencesDAO.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/ServerSession.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionManager.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionTypeDefiner.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantDefinition.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsAdministration.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsManager.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsUser.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/EndAutowiredTransaction.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/InvalidConstantValue.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceData.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceStatusException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/SystemStatus.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickStatusException.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/Ticker.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickerManager.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/UnknownConstantError.java create mode 100644 legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/WiringException.java create mode 100644 legacyworlds-server/legacyworlds-server-main/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-main/.project create mode 100644 legacyworlds-server/legacyworlds-server-main/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-main/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-server/legacyworlds-server-main/data-source.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/adminErrorMail.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/adminRecapMail.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/bannedMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/bannedMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/buildables-test.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/buildables.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/buildables.xsd create mode 100644 legacyworlds-server/legacyworlds-server-main/data/i18n-text.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/i18n-text.xsd create mode 100644 legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/messageMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/messageMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/quitMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/quitMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/reactivationMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/reactivationMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/recapMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/recapMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/registrationMail-en.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/registrationMail-fr.txt create mode 100644 legacyworlds-server/legacyworlds-server-main/data/techs-test.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/techs.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/data/techs.xsd create mode 100644 legacyworlds-server/legacyworlds-server-main/hibernate.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/Main.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CLITool.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateSuperuser.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateUser.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ExportDB.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportBuildables.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportTechs.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportText.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Stop.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Tick.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ToolBase.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Administrator.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREComment.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREInitialReport.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREMerger.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREStatusChange.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREVisibilityChange.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugEventMapper.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugGroup.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReportEvent.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReports.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugSubmitter.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/LegacyWorldsDB.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/User.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/UserMapper.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Warnings.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/LogAppender.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/Server.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminator.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminatorBean.java create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/resources/configuration/context-configuration.xml create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/resources/log4j.properties create mode 100644 legacyworlds-server/legacyworlds-server-main/src/main/resources/lw-server.xml create mode 100644 legacyworlds-server/legacyworlds-server-tests/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-tests/.project create mode 100644 legacyworlds-server/legacyworlds-server-tests/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-tests/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-utils/.classpath create mode 100644 legacyworlds-server/legacyworlds-server-utils/.project create mode 100644 legacyworlds-server/legacyworlds-server-utils/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-server/legacyworlds-server-utils/pom.xml create mode 100644 legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Base64Serializer.java create mode 100644 legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/EmailAddress.java create mode 100644 legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Password.java create mode 100644 legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/RandomStringGenerator.java create mode 100644 legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/StoredProc.java create mode 100644 legacyworlds-server/pom.xml create mode 100644 legacyworlds-session/.classpath create mode 100644 legacyworlds-session/.project create mode 100644 legacyworlds-session/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-session/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-session/pom.xml create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MailError.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MaintenanceResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ObjectNameError.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/PasswordError.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/NoOperationCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdminOverview.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Administrator.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdministratorBasics.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/PrivEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Privileges.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ArchivedBanRequest.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanRequest.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ConfirmBanCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/LiftBanCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/SummaryEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ValidatedBanRequest.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ListBugsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeError.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ModerateCommentCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/PostCommentResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportBugResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportStatusCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportVisibilityCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ValidateReportCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ViewBugResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Category.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Definition.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/I18NString.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/Language.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ExceptionEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogLevel.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/TraceEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EnableMaintenanceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EndMaintenanceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/ExtendMaintenanceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceChangeResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxAction.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/PrepareMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/SendSpamCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/Name.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameAction.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesActionCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/GetPrefDefaultsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/PrefDefaultsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/SetPrefDefaultCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ResetAdminPasswordCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/SetPrivilegesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/SetTaskStatusCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskInfo.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskStatus.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/ToggleTickerCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountBanEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountListEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountSessionEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountStatus.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountViewEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/GiveCreditsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/SessionTerminationType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/UserSession.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ListBugsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/PostCommentCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ReportBugCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ViewBugCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEvent.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEventType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugReport.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugStatus.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugSubmitter.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/Message.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageListEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/EmpireResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ImplementTechCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/OverviewCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/CancelQuitCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/QuitGameCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetLanguageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPreferencesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ToggleVacationCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CancelJoinCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/KickMembersCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/LeaveAllianceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ManageRequestsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/TransferLeadershipCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ListBugsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/PostCommentResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ReportBugResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ViewBugResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/RemoveEnemiesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GamePageData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameResponseBase.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameTime.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MailPreference.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MapSize.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/NameIdPair.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetListData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetReference.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetRelationType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/ShortBattleView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/TimeCombo.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/AccountData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/MailChangeData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefCategory.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefChoice.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefValue.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceCreationStatus.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceLeaderData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceMemberData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AlliancePlanetData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/PublicAllianceInformation.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDescription.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDisplay.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEvent.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEventType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryInterval.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryTick.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleListEntry.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlanetBuildings.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlayerShips.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipType.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsList.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleSideShips.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/OverviewData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/ResearchLineData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/TechnologyData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetLocation.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetOwner.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetShips.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetStatus.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetsView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/MovingFleet.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/ShortFleetView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/SplitShips.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/StaticFleet.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapPlanetData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapSystemData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableBuildingData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableItemData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableShipData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildingData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/OwnPlanetStatusData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetBasicView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOrbitalView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOwnView.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueItemData.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxAction.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/PrepareMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/AbandonPlanetCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildShipsCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/FlushQueueCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetCommand.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/Command.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/CommandResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/NullResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionAccessor.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionCommandException.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionException.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionIdentifierException.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionInternalException.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionReference.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionResponse.java create mode 100644 legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionStateException.java create mode 100644 legacyworlds-utils/.classpath create mode 100644 legacyworlds-utils/.project create mode 100644 legacyworlds-utils/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-utils/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-utils/pom.xml create mode 100644 legacyworlds-utils/src/main/java/com/deepclone/lw/utils/DigestHelper.java create mode 100644 legacyworlds-web/.project create mode 100644 legacyworlds-web/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-web/legacyworlds-web-admin/.classpath create mode 100644 legacyworlds-web/legacyworlds-web-admin/.project create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/.jsdtscope create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.component create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.ws.service.policy.prefs create mode 100644 legacyworlds-web/legacyworlds-web-admin/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/META-INF/MANIFEST.MF create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/admin-servlet.xml create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/ROOT.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/external.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/internal.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/columns.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/datatable.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/fields.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/form.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/lists.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/tabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/addAdmin.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/admins.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banReject.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banRequest.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bans.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bansSummary.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsList.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsReport.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsSummary.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsView.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/changePassword.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/constants.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/language.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/languages.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logEntry.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/login.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/main.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/maintenance.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/message.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageBox.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageWriter.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/names.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/namesSummary.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/offline.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/preferences.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/resetAdmin.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/spam.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/ticker.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/user.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/userSessions.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/users.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/viewAdmin.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/version.ftl create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/web.xml create mode 100644 legacyworlds-web/legacyworlds-web-admin/WebContent/css/main.css create mode 100644 legacyworlds-web/legacyworlds-web-admin/pom.xml create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BanhammerPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BugTrackerPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ConstantsPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ErrorHandlerBean.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/I18NPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LogPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LoginPage.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MaintenancePages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessageBoxView.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessagesPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/NamesPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PasswordPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PreferencesPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SessionPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SpamPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SuperUserPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/TickerPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/UsersPages.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/LanguageExport.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/StringExport.java create mode 100644 legacyworlds-web/legacyworlds-web-admin/src/main/resources/log4j.properties create mode 100644 legacyworlds-web/legacyworlds-web-beans/.classpath create mode 100644 legacyworlds-web/legacyworlds-web-beans/.project create mode 100644 legacyworlds-web/legacyworlds-web-beans/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-web/legacyworlds-web-beans/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-web/legacyworlds-web-beans/pom.xml create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/IEContentTypeBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/LanguageInterceptorBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionInterceptorBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionRequirement.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatter.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatterBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/ClientSessionReference.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatus.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatusBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/Session.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClient.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClientBean.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionMaintenanceException.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionServerException.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionType.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/BugTrackerBase.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/Page.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/PageControllerBase.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/AdminSession.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/ExternalSession.java create mode 100644 legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/PlayerSession.java create mode 100644 legacyworlds-web/legacyworlds-web-main/.classpath create mode 100644 legacyworlds-web/legacyworlds-web-main/.project create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/.jsdtscope create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.jdt.core.prefs create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.component create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 legacyworlds-web/legacyworlds-web-main/.settings/org.maven.ide.eclipse.prefs create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/META-INF/MANIFEST.MF create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/ROOT.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/chat.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/external.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/game.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/offline.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/restricted.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/game.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/home.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loggedOut.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loginFailed.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/noSession.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/passwordRecoveryOk.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/reactivate.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/rules.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/scope.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/account.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/alliance.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/banned.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battle.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battles.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsList.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsReport.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsView.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/chat.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/enemies.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleetsCommand.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/getNewPlanet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/maintenance.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/map.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/message.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageBox.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTargets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageWriter.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/offline.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/overview.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/passwordRecovery.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/reactivation.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/register.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/registered.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/splitFleet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/static.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/validation.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/chat.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/external.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/game.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/offline.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/restricted.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/game.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/home.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loggedOut.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loginFailed.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/noSession.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/passwordRecoveryOk.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/reactivate.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/rules.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/scope.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/account.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/alliance.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/banned.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battle.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battles.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsList.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsReport.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsView.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/chat.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/enemies.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleetsCommand.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/getNewPlanet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/maintenance.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/map.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/message.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageBox.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTargets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageWriter.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/offline.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/overview.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/passwordRecovery.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planets.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/reactivation.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/register.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/registered.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/splitFleet.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/static.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/validation.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/columns.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/datatable.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/fields.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/form.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/happiness.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/lists.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/tabs.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/version.ftl create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/main-servlet.xml create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/web.xml create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/css/main.css create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/background.jpg create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-0.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-1.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-2.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-3.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-4.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-5.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/button-6.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/1.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/10.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/100.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/101.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/102.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/103.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/104.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/105.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/106.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/107.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/108.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/109.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/11.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/110.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/111.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/112.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/113.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/114.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/115.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/116.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/117.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/118.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/119.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/12.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/120.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/121.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/122.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/123.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/124.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/125.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/126.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/127.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/128.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/129.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/13.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/130.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/131.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/132.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/133.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/134.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/135.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/136.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/137.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/138.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/139.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/14.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/140.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/141.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/142.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/143.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/144.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/145.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/146.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/147.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/148.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/149.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/15.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/150.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/151.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/152.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/153.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/154.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/155.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/156.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/157.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/158.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/159.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/16.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/160.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/161.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/162.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/163.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/164.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/165.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/166.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/167.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/168.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/169.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/17.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/170.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/171.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/172.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/173.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/174.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/175.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/176.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/177.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/178.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/179.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/18.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/180.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/181.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/182.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/183.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/184.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/185.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/186.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/187.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/188.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/189.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/19.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/190.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/191.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/192.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/193.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/194.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/195.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/196.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/197.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/198.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/199.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/2.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/20.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/200.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/21.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/22.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/23.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/24.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/25.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/26.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/27.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/28.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/29.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/3.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/30.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/31.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/32.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/33.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/34.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/35.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/36.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/37.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/38.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/39.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/4.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/40.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/41.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/42.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/43.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/44.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/45.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/46.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/47.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/48.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/49.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/5.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/50.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/51.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/52.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/53.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/54.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/55.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/56.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/57.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/58.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/59.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/6.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/60.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/61.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/62.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/63.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/64.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/65.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/66.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/67.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/68.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/69.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/7.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/70.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/71.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/72.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/73.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/74.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/75.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/76.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/77.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/78.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/79.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/8.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/80.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/81.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/82.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/83.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/84.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/85.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/86.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/87.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/88.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/89.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/9.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/90.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/91.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/92.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/93.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/94.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/95.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/96.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/97.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/98.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/99.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/1.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/10.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/100.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/101.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/102.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/103.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/104.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/105.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/106.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/107.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/108.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/109.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/11.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/110.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/111.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/112.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/113.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/114.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/115.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/116.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/117.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/118.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/119.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/12.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/120.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/121.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/122.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/123.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/124.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/125.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/126.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/127.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/128.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/129.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/13.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/130.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/131.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/132.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/133.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/134.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/135.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/136.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/137.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/138.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/139.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/14.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/140.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/141.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/142.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/143.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/144.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/145.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/146.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/147.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/148.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/149.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/15.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/150.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/151.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/152.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/153.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/154.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/155.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/156.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/157.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/158.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/159.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/16.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/160.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/161.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/162.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/163.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/164.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/165.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/166.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/167.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/168.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/169.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/17.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/170.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/171.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/172.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/173.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/174.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/175.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/176.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/177.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/178.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/179.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/18.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/180.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/181.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/182.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/183.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/184.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/185.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/186.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/187.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/188.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/189.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/19.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/190.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/191.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/192.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/193.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/194.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/195.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/196.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/197.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/198.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/199.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/2.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/20.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/200.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/21.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/22.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/23.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/24.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/25.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/26.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/27.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/28.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/29.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/3.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/30.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/31.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/32.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/33.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/34.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/35.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/36.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/37.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/38.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/39.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/4.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/40.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/41.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/42.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/43.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/44.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/45.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/46.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/47.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/48.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/49.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/5.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/50.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/51.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/52.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/53.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/54.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/55.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/56.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/57.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/58.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/59.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/6.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/60.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/61.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/62.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/63.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/64.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/65.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/66.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/67.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/68.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/69.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/7.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/70.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/71.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/72.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/73.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/74.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/75.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/76.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/77.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/78.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/79.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/8.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/80.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/81.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/82.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/83.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/84.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/85.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/86.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/87.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/88.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/89.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/9.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/90.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/91.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/92.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/93.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/94.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/95.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/96.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/97.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/98.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/99.png create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/js/jquery-1.4.2.min.js create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/js/main.js create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/IRCApplet.class create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/background.gif create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/english.lng create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/french.lng create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/irc.cab create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/irc.jar create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx-english.lng create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx-french.lng create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx.cab create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx.jar create mode 100644 legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/securedirc.cab create mode 100644 legacyworlds-web/legacyworlds-web-main/pom.xml create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/BannedPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/CommonPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ErrorHandlerBean.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ExternalPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LoginPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LogoutPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PasswordRecoveryPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PlayerSessionRedirector.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ReactivationPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/RegistrationPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ValidationPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AccountPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AlliancePage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BattlePages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BugTrackerPages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/ChatPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/EnemiesPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/FleetsPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/GetPlanetPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MapPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessageBoxView.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessagePages.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/OverviewPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetListPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetPage.java create mode 100644 legacyworlds-web/legacyworlds-web-main/src/main/resources/log4j.properties create mode 100644 legacyworlds-web/pom.xml create mode 100644 pom.xml create mode 100755 runsrv.sh create mode 100755 runtool.sh diff --git a/.project b/.project new file mode 100644 index 0000000..b09df49 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + legacyworlds + + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + + diff --git a/build-tools/BUILD.sh b/build-tools/BUILD.sh new file mode 100755 index 0000000..b76b7f5 --- /dev/null +++ b/build-tools/BUILD.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +cd `dirname $0`/.. +SRCDIR=`pwd` +if [ "x$1" = "x" ]; then + OUTDIR="$SRCDIR"; +else + OUTDIR="$1"; +fi + +echo "Building Legacy Worlds..." +mvn clean || { echo "Maven clean-up failed"; exit 1; }; +mvn package || { echo "Maven build failed"; exit 1; }; + +echo "Copying files..." + +TEMPDIR=`mktemp -d` +mkdir $TEMPDIR/legacyworlds +mkdir $TEMPDIR/legacyworlds/server +mkdir $TEMPDIR/legacyworlds/server/data +mkdir $TEMPDIR/legacyworlds/web +mkdir $TEMPDIR/legacyworlds/sql + +# Database and initial data +cp -Rapv legacyworlds-server/legacyworlds-server-data/db-structure/database.sql $TEMPDIR/legacyworlds/sql +cp -Rapv legacyworlds-server/legacyworlds-server-data/db-structure/db-config.txt $TEMPDIR/legacyworlds/sql/db-config-example.txt +cp -Rapv legacyworlds-server/legacyworlds-server-data/db-structure/parts $TEMPDIR/legacyworlds/sql +cp -Rapv legacyworlds-server/legacyworlds-server-main/data/* $TEMPDIR/legacyworlds/server/data +# Server +cp -Rapv legacyworlds-server/legacyworlds-server-main/target/*.jar $TEMPDIR/legacyworlds/server +cp -Rapv legacyworlds-server/legacyworlds-server-main/target/lib $TEMPDIR/legacyworlds/server +cp -Rapv legacyworlds-server/legacyworlds-server-main/data-source.xml $TEMPDIR/legacyworlds/server/data-source-example.xml +# Tools +cp -Rapv build-tools/server-config-example.sh $TEMPDIR/legacyworlds +cp -Rapv build-tools/start-server.sh $TEMPDIR/legacyworlds +cp -Rapv build-tools/stop-server.sh $TEMPDIR/legacyworlds +cp -Rapv build-tools/execute-clit.sh $TEMPDIR/legacyworlds +cp -Rapv build-tools/deploy.sh $TEMPDIR/legacyworlds +# Web sites +cp -Rapv legacyworlds-web/legacyworlds-web-*/target/*.war $TEMPDIR/legacyworlds/web + +echo "Preparing archive..." +cd $TEMPDIR +find $TEMPDIR/legacyworlds -type d -name .svn | xargs rm -rf +tar cvjf $OUTDIR/legacyworlds.tar.bz2 legacyworlds || { echo "Archive generation failed"; exit 1; }; + +echo "Removing temporary directory..." +cd $SRCDIR +rm -rf $TEMPDIR + +echo "All done. Legacy Worlds archive: $OUTDIR/legacyworlds.tar.bz2" diff --git a/build-tools/deploy.sh b/build-tools/deploy.sh new file mode 100755 index 0000000..5edbf77 --- /dev/null +++ b/build-tools/deploy.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +COREDIR="$1" +if [ "x$COREDIR" = "x" ] || ! [ -d "$COREDIR" ]; then + echo "Syntax: $0 main_dir tomcat_dir web_dir" + exit 1; +fi + +TOMCATDIR="$2" +if [ "x$TOMCATDIR" = "x" ] || ! [ -d "$TOMCATDIR" ]; then + echo "Syntax: $0 main_dir tomcat_dir web_dir" + exit 1; +fi + +WEBDIR="$3" +if [ "x$WEBDIR" = "x" ] || ! [ -d "$WEBDIR" ]; then + echo "Syntax: $0 main_dir tomcat_dir web_dir" + exit 1; +fi + + +cd `dirname $0` +SRCDIR=`pwd` +cp -Rap server web *-*.sh $COREDIR + +cd "$TOMCATDIR" +if [ -L "lwmain.war" ]; then + rm -f lwmain.war lwadmin.war +fi +ln -s "$COREDIR/web/legacyworlds-web-main-"*.war lwmain.war +ln -s "$COREDIR/web/legacyworlds-web-admin-"*.war lwadmin.war + +cd $WEBDIR +unzip -o $COREDIR/web/legacyworlds-web-main-*.war "css/*" "js/*" "pjirc/*" "img/*" diff --git a/build-tools/execute-clit.sh b/build-tools/execute-clit.sh new file mode 100755 index 0000000..7119874 --- /dev/null +++ b/build-tools/execute-clit.sh @@ -0,0 +1,5 @@ +#!/bin/sh +BASE="`dirname $0`" +cd "$BASE/server" +source server-config.sh +java $LOG -jar legacyworlds-server-main-*.jar --run-tool $1 "$2" diff --git a/build-tools/server-config-example.sh b/build-tools/server-config-example.sh new file mode 100644 index 0000000..f962497 --- /dev/null +++ b/build-tools/server-config-example.sh @@ -0,0 +1 @@ +LOG="-Dlog4j.configuration=log4j.properties" diff --git a/build-tools/start-server.sh b/build-tools/start-server.sh new file mode 100755 index 0000000..bed8582 --- /dev/null +++ b/build-tools/start-server.sh @@ -0,0 +1,9 @@ +#!/bin/sh +BASE="`dirname $0`" +cd "$BASE/server" +source server-config.sh +if [ "x$1" = "x--debug" ]; then + java $LOG -jar legacyworlds-server-main-*.jar +else + ( java $LOG -jar legacyworlds-server-main-*.jar /dev/null 2>&1 & ) /dev/null 2>&1 & +fi diff --git a/build-tools/stop-server.sh b/build-tools/stop-server.sh new file mode 100755 index 0000000..8b2703d --- /dev/null +++ b/build-tools/stop-server.sh @@ -0,0 +1,2 @@ +#!/bin/sh +"`dirname $0`"/execute-clit.sh Stop diff --git a/eclipse-code-format.xml b/eclipse-code-format.xml new file mode 100644 index 0000000..bbde209 --- /dev/null +++ b/eclipse-code-format.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/.project b/legacyworlds-server/.project new file mode 100644 index 0000000..5ff6ca3 --- /dev/null +++ b/legacyworlds-server/.project @@ -0,0 +1,17 @@ + + + legacyworlds-server + + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/.project b/legacyworlds-server/legacyworlds-server-beans/.project new file mode 100644 index 0000000..7f3bd93 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/.project @@ -0,0 +1,17 @@ + + + legacyworlds-server-beans + + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.project new file mode 100644 index 0000000..a5031a0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-accounts + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..cb25da1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:19:20 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/pom.xml new file mode 100644 index 0000000..093cc46 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-accounts + Legacy Worlds account management + 5.99.1 + This package contains the beans responsible for managing accounts, including registration, inactivity checks, bans and authentication. + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupBean.java new file mode 100644 index 0000000..510bc6e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupBean.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class AccountCleanupBean + implements InitializingBean , DisposableBean +{ + + private TransactionTemplate tTemplate; + + private Ticker ticker; + + private UsersDAO usersDao; + + private Mailer mailer; + + private AccountCleanupTask cleanupTask; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setUsersDAO( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.cleanupTask = new AccountCleanupTask( this.tTemplate , this.usersDao , this.mailer ); + this.ticker.registerTask( Frequency.MEDIUM , "Accounts clean-up task" , this.cleanupTask ); + } + + + @Override + public void destroy( ) + { + this.cleanupTask = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupTask.java new file mode 100644 index 0000000..5eb5ea9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountCleanupTask.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.acm; + + +import java.util.List; + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.sqld.accounts.QuittingAccount; + + + +class AccountCleanupTask + implements Runnable +{ + + private TransactionTemplate tTemplate; + private UsersDAO usersDao; + private Mailer mailer; + + + public AccountCleanupTask( TransactionTemplate tTemplate , UsersDAO usersDao , Mailer mailer ) + { + this.tTemplate = tTemplate; + this.usersDao = usersDao; + this.mailer = mailer; + } + + + @Override + public void run( ) + { + this.sendInactivityWarnings( ); + this.disableInactiveAccounts( ); + this.dropOldAccounts( ); + } + + + private void sendInactivityWarnings( ) + { + List< QuittingAccount > toWarn; + toWarn = this.tTemplate.execute( new TransactionCallback< List< QuittingAccount >>( ) { + @Override + public List< QuittingAccount > doInTransaction( TransactionStatus status ) + { + return usersDao.getInactivesToWarn( ); + } + } ); + + for ( QuittingAccount account : toWarn ) { + try { + this.mailer.createMail( account.getLanguage( ) , "inactivityWarningMail" , account.getAddress( ) ) + .queue( ); + } catch ( Exception e ) { + continue; + } + } + } + + + private void disableInactiveAccounts( ) + { + List< QuittingAccount > toDisable; + toDisable = this.tTemplate.execute( new TransactionCallback< List< QuittingAccount >>( ) { + @Override + public List< QuittingAccount > doInTransaction( TransactionStatus status ) + { + return usersDao.getInactivesToDisable( ); + } + } ); + + for ( QuittingAccount account : toDisable ) { + try { + this.mailer.createMail( account.getLanguage( ) , "inactivityQuitMail" , account.getAddress( ) ).queue( ); + } catch ( Exception e ) { + continue; + } + } + } + + + private void dropOldAccounts( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + usersDao.deleteOldAccounts( ); + } + } ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountManagementBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountManagementBean.java new file mode 100644 index 0000000..38a9ffc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/AccountManagementBean.java @@ -0,0 +1,757 @@ +package com.deepclone.lw.beans.acm; + + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.bans.ValidatedBanRequest; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.users.AccountListEntry; +import com.deepclone.lw.cmd.admin.users.AccountSessionEntry; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.AccountViewEntry; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.cmd.admin.users.UserSession; +import com.deepclone.lw.cmd.ext.ListLanguagesResponse; +import com.deepclone.lw.cmd.player.account.BanDetailsResponse; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.cmd.player.gdata.account.PrefCategory; +import com.deepclone.lw.cmd.player.gdata.account.PrefChoice; +import com.deepclone.lw.cmd.player.gdata.account.PrefType; +import com.deepclone.lw.cmd.player.gdata.account.PrefValue; +import com.deepclone.lw.interfaces.acm.*; +import com.deepclone.lw.interfaces.admin.BansDAO; +import com.deepclone.lw.interfaces.eventlog.*; +import com.deepclone.lw.interfaces.i18n.*; +import com.deepclone.lw.interfaces.mailer.*; +import com.deepclone.lw.interfaces.naming.NamingDAO; +import com.deepclone.lw.interfaces.prefs.Preference; +import com.deepclone.lw.interfaces.prefs.PreferenceGroup; +import com.deepclone.lw.interfaces.prefs.PreferenceType; +import com.deepclone.lw.interfaces.prefs.PreferencesDAO; +import com.deepclone.lw.sqld.accounts.*; +import com.deepclone.lw.utils.*; + + + +public class AccountManagementBean + implements AccountManagement +{ + + private TransactionTemplate tTemplate; + private Mailer mailer; + private Logger logger; + private UsersDAO usersDao; + private UserSessionDAO sessionDao; + private NamingDAO namingDao; + private Translator translator; + private PreferencesDAO prefsDao; + private BansDAO bansDao; + + + @Autowired( required = true ) + public void setTransactionTemplate( PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger; + } + + + @Autowired( required = true ) + public void setUsersDao( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setSessionDao( UserSessionDAO sessionDao ) + { + this.sessionDao = sessionDao; + } + + + @Autowired( required = true ) + public void setNamingDao( NamingDAO namingDao ) + { + this.namingDao = namingDao; + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Autowired( required = true ) + public void setPrefsDao( PreferencesDAO prefsDao ) + { + this.prefsDao = prefsDao; + } + + + @Autowired( required = true ) + public void setBansDao( BansDAO bansDao ) + { + this.bansDao = bansDao; + } + + + @Override + public void createAccount( final EmailAddress address , final Password password , final String language ) + throws AccountMailException , MailerException , TranslationException + { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "Attempting to create account '" + address.getAddress( ) + "'" ).flush( ); + + // Create credentials + AccountOperationResult result; + result = this.tTemplate.execute( new TransactionCallback< AccountOperationResult >( ) { + + @Override + public AccountOperationResult doInTransaction( TransactionStatus status ) + { + AccountOperationResult r = usersDao.createAccount( address , password , language ); + if ( r.getErrorCode( ) != 0 ) { + status.setRollbackOnly( ); + } + return r; + } + + } ); + + // Check creation status + switch ( result.getErrorCode( ) ) { + case 0: + break; + + case -1: + sLog.log( LogLevel.INFO , "Could not create account '" + address.getAddress( ) + "' - it exists" ) + .flush( ); + throw new AccountMailException( ); + + case -2: + sLog + .log( LogLevel.INFO , + "Could not create account '" + address.getAddress( ) + "' - unknown language" ).flush( ); + throw new UnknownLanguageException( language ); + + default: + sLog.log( + LogLevel.ERROR , + "Could not create account '" + address.getAddress( ) + "' - unknown error code " + + result.getErrorCode( ) ).flush( ); + throw new RuntimeException( ); + } + + // Send email + Account account = result.getAccount( ); + MailData data = this.mailer.createMail( language , "registrationMail" , address.getAddress( ) ); + data.setData( "address" , address.getAddress( ) ); + data.setData( "validationKey" , account.getValidationToken( ) ); + try { + data.sendNow( ); + } catch ( MailerException e ) { + this.cancelValidation( account ); + sLog.log( LogLevel.INFO , "Could not create account '" + address.getAddress( ) + "'" , e ).flush( ); + if ( e instanceof NotSentException ) { + throw e; + } + throw new RuntimeException( e ); + } + } + + + private void cancelValidation( final Account account ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + usersDao.cancelAccountValidation( account ); + } + } ); + } + + + @Override + public void reactivateAccount( final EmailAddress address ) + throws AccountMailException , MailerException + { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "trying to re-activate account " + address.getAddress( ) ).flush( ); + + // Check status + Account account = this.tTemplate.execute( new TransactionCallback< Account >( ) { + + @Override + public Account doInTransaction( TransactionStatus status ) + { + Account r = usersDao.reactivateAccount( address ); + if ( r == null ) { + status.setRollbackOnly( ); + } + return r; + } + + } ); + if ( account == null ) { + throw new AccountMailException( ); + } + + // Send email + MailData data; + try { + data = this.mailer.createMail( account.getLanguage( ) , "reactivationMail" , address.getAddress( ) ); + } catch ( TranslationException e ) { + sLog.log( LogLevel.ERROR , "'" + address.getAddress( ) + "' - error while preparing reactivation mail" , e ) + .flush( ); + this.cancelValidation( account ); + throw new RuntimeException( e ); + } + + data.setData( "address" , account.getAddress( ) ); + data.setData( "token" , account.getValidationToken( ) ); + try { + data.sendNow( ); + } catch ( MailerException e ) { + this.cancelValidation( account ); + if ( e instanceof NotSentException ) { + throw e; + } + throw new RuntimeException( e ); + } + } + + + @Override + public ValidationResult validateAccount( final EmailAddress address , final String token , final String empire , + final String planet ) + { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "trying to validate account '" + address.getAddress( ) + "'" ).flush( ); + return this.tTemplate.execute( new TransactionCallback< ValidationResult >( ) { + + @Override + public ValidationResult doInTransaction( TransactionStatus status ) + { + ValidationResult r = usersDao.validateAccount( address , token , empire , planet ); + if ( r.isError( ) ) { + status.setRollbackOnly( ); + } + return r; + } + + } ); + } + + + @Override + public void requestPasswordRecovery( final EmailAddress address ) + throws AccountMailException , MailerException , PasswordRecoveryException + { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "'" + address.getAddress( ) + "' requesting password recovery" ).flush( ); + + AccountOperationResult result = this.tTemplate.execute( new TransactionCallback< AccountOperationResult >( ) { + + @Override + public AccountOperationResult doInTransaction( TransactionStatus status ) + { + AccountOperationResult r = usersDao.requestPasswordRecovery( address ); + if ( r.getErrorCode( ) != 0 ) { + status.setRollbackOnly( ); + } + return r; + } + + } ); + + // Throw exceptions as needed + switch ( result.getErrorCode( ) ) { + case 0: + break; + + case 1: + sLog.log( LogLevel.INFO , "'" + address.getAddress( ) + "' - duplicate password recovery request" ) + .flush( ); + throw new PasswordRecoveryException( false ); + + case 2: + sLog.log( LogLevel.INFO , "'" + address.getAddress( ) + "' - account does not exist" ).flush( ); + throw new AccountMailException( ); + + default: + sLog.log( LogLevel.ERROR , "Unknown error code " + result.getErrorCode( ) ).flush( ); + throw new RuntimeException( ); + } + + // Send email + MailData data; + Account account = result.getAccount( ); + try { + data = this.mailer.createMail( account.getLanguage( ) , "passwordRecoveryMail" , address.getAddress( ) ); + } catch ( TranslationException e ) { + sLog.log( LogLevel.ERROR , "'" + address.getAddress( ) + "' - error while preparing recovery mail" , e ) + .flush( ); + this.cancelPasswordRecovery( account ); + throw new RuntimeException( e ); + } + + data.setData( "address" , address.getAddress( ) ); + data.setData( "token" , account.getPwdRecoveryToken( ) ); + + try { + data.sendNow( ); + } catch ( MailerException e ) { + this.cancelPasswordRecovery( account ); + if ( e instanceof NotSentException ) { + throw e; + } + throw new RuntimeException( e ); + } + } + + + private void cancelPasswordRecovery( final Account account ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + usersDao.cancelPasswordRecovery( account ); + } + } ); + } + + + @Override + public void recoverPassword( final EmailAddress address , final String token , final Password password ) + throws AccountMailException , PasswordRecoveryException , PasswordProhibitedException + { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "'" + address.getAddress( ) + "' confirming password recovery" ).flush( ); + + AccountOperationResult result = this.tTemplate.execute( new TransactionCallback< AccountOperationResult >( ) { + + @Override + public AccountOperationResult doInTransaction( TransactionStatus status ) + { + AccountOperationResult r = usersDao.confirmPasswordRecovery( address , token , password ); + if ( r.getErrorCode( ) != 0 ) { + status.setRollbackOnly( ); + } + return r; + } + + } ); + + // Handle errors + switch ( result.getErrorCode( ) ) { + case 0: + break; + + case 1: + throw new AccountMailException( ); + + case 2: + throw new PasswordProhibitedException( ); + + default: + sLog.log( LogLevel.ERROR , "Unknown error code " + result.getErrorCode( ) ).flush( ); + throw new RuntimeException( ); + + } + } + + + @Override + @Transactional + public AccountSession login( final EmailAddress address , String challenge , String sha1Hash , String md5Hash , + InetAddress ipAddress , String clientType , String sessionName ) + { + Account account = this.usersDao.getAccount( address ); + + // Check account + if ( account == null ) { + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + sLog.log( LogLevel.INFO , "login attempt for unknown address '" + address.getAddress( ) + "'" ).flush( ); + return null; + } + + // Check challenge response + String eSha1 = DigestHelper.digest( "sha-1" , challenge + " " + account.getPassSha1( ) ); + String eMd5 = DigestHelper.digest( "md5" , challenge + " " + account.getPassMd5( ) ); + + if ( ! ( eSha1.equals( sha1Hash ) && eMd5.equals( md5Hash ) ) ) { + return null; + } + + // Create session + long sId = this.sessionDao.startSession( account.getId( ) , sessionName , clientType , ipAddress.toString( ) ); + return new AccountSession( account , sId ); + } + + + @Override + @Transactional + public void logout( long session , SessionTerminationType reason ) + { + this.sessionDao.endSession( session , reason ); + } + + + @Override + @Transactional + public Account restoreSession( long session ) + { + UserSession sData = this.sessionDao.getSession( session ); + if ( sData == null || sData.getEndType( ) != null ) { + return null; + } + return this.usersDao.getAccount( sData.getCredentialsId( ) ); + } + + + @Override + @Transactional + public Account getAccount( final EmailAddress address ) + { + return this.usersDao.getAccount( address ); + } + + + @Override + @Transactional + public List< String > getEmpireNames( final EmailAddress address ) + { + Account accnt = this.usersDao.getAccount( address ); + if ( accnt == null ) { + return null; + } + return this.namingDao.getEmpireNames( accnt.getId( ) ); + } + + + @Override + @Transactional + public AccountData getAccountPage( EmailAddress address ) + { + Account account = this.getAccount( address ); + return this.accountToPage( account ); + } + + + private AccountData accountToPage( Account account ) + { + AccountData data = new AccountData( ); + data.setAddress( account.getAddress( ) ); + data.setGameCredits( account.getGameCredits( ) ); + data.setLanguage( account.getLanguage( ) ); + data.setQuitGame( account.getInactivityStart( ) ); + data.setVacCredits( account.getVacationCredits( ) ); + data.setVacTime( account.getVacationTime( ) ); + data.setVacStart( account.getVacationStart( ) ); + data.setMailChange( this.usersDao.getMailChange( account.getId( ) ) ); + + // Get supported languages + Map< String , String > languages = new HashMap< String , String >( ); + try { + for ( String lId : this.translator.getSupportedLanguages( ) ) { + languages.put( lId , this.translator.getLanguageName( lId ) ); + } + } catch ( UnknownLanguageException e ) { + throw new RuntimeException( e ); + } + data.setSupportedLanguages( new ListLanguagesResponse( languages ) ); + + // Extract account preferences + for ( PreferenceGroup group : this.prefsDao.getPreferences( account ).getGroups( ) ) { + PrefCategory pCat = new PrefCategory( ); + pCat.setName( group.getDisplay( ) ); + for ( Preference pref : group.getPreferences( ) ) { + PrefValue pValue = new PrefValue( ); + + pValue.setId( pref.getName( ) ); + pValue.setName( pref.getDisplayName( ) ); + pValue.setDescription( pref.getDescription( ) ); + + PreferenceType< ? > dType = pref.getType( ); + if ( dType.getType( ) == String.class ) { + pValue.setType( PrefType.STRING ); + } else if ( dType.getType( ) == Integer.class ) { + pValue.setType( PrefType.INTEGER ); + } else if ( dType.getType( ) == Boolean.class ) { + pValue.setType( PrefType.BOOLEAN ); + } else { + Map< String , String > choices = dType.getChoices( ); + List< PrefChoice > cList = new LinkedList< PrefChoice >( ); + for ( Map.Entry< String , String > entry : choices.entrySet( ) ) { + String name; + try { + name = this.translator.translate( data.getLanguage( ) , entry.getValue( ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + cList.add( new PrefChoice( entry.getKey( ) , name ) ); + } + pValue.setType( PrefType.CHOICE ); + pValue.setChoices( cList ); + } + + pValue.setValue( pref.getDBValue( ) ); + pCat.addValue( pValue ); + } + data.addPreferenceCategory( pCat ); + } + + return data; + } + + + @Override + @Transactional + public void setLanguage( EmailAddress address , String language ) + { + this.usersDao.setLanguage( address , language ); + } + + + @Override + @Transactional + public boolean setPassword( final EmailAddress address , String challenge , String sha1Hash , String md5Hash , + Password newPassword ) + throws PasswordProhibitedException + { + Account account = this.usersDao.getAccount( address ); + + // Check challenge response + String eSha1 = DigestHelper.digest( "sha-1" , challenge + " " + account.getPassSha1( ) ); + String eMd5 = DigestHelper.digest( "md5" , challenge + " " + account.getPassMd5( ) ); + if ( ! ( eSha1.equals( sha1Hash ) && eMd5.equals( md5Hash ) ) ) { + return false; + } + + if ( !this.usersDao.setPassword( account , newPassword ) ) { + throw new PasswordProhibitedException( ); + } + + return true; + } + + + @Override + @Transactional( rollbackFor = { + RuntimeException.class , AccountMailException.class , MailerException.class + } ) + public boolean setAddress( EmailAddress address , String challenge , String sha1Hash , String md5Hash , + EmailAddress nAddress ) + throws AccountMailException , MailerException + { + Account account = this.usersDao.getAccount( address ); + + // Check challenge response + String eSha1 = DigestHelper.digest( "sha-1" , challenge + " " + account.getPassSha1( ) ); + String eMd5 = DigestHelper.digest( "md5" , challenge + " " + account.getPassMd5( ) ); + if ( ! ( eSha1.equals( sha1Hash ) && eMd5.equals( md5Hash ) ) ) { + return false; + } + + int errCode = this.usersDao.setAddress( account , nAddress ); + switch ( errCode ) { + case -1: + return true; + case -2: + throw new AccountMailException( ); + } + + // Send email + SystemLogger sLog = this.logger.getSystemLogger( "AccountManagement" ); + MailData data; + account = this.usersDao.getAccount( address ); + try { + data = this.mailer.createMail( account.getLanguage( ) , "addressChangeMail" , nAddress.getAddress( ) ); + } catch ( TranslationException e ) { + sLog.log( LogLevel.ERROR , "'" + address.getAddress( ) + "' - error while preparing recovery mail" , e ) + .flush( ); + this.cancelPasswordRecovery( account ); + throw new RuntimeException( e ); + } + + data.setData( "address" , nAddress.getAddress( ) ); + data.setData( "token" , account.getAddressChangeToken( ) ); + + try { + data.sendNow( ); + } catch ( MailerException e ) { + if ( e instanceof NotSentException ) { + throw e; + } + throw new RuntimeException( e ); + } + + return true; + } + + + @Override + @Transactional + public void cancelAddressChange( EmailAddress cAddress ) + { + this.usersDao.cancelAddressChange( this.usersDao.getAccount( cAddress ) ); + } + + + @Override + @Transactional + public AccountData confirmAddressChange( EmailAddress cAddress , String code ) + { + Account account = this.usersDao.getAccount( cAddress ); + if ( account.getAddressChangeToken( ) != null ) { + int newId = this.usersDao.confirmAddressChange( account , code ); + account = this.usersDao.getAccount( newId ); + } + return this.accountToPage( account ); + } + + + @Override + @Transactional + public void resetPreferences( EmailAddress address ) + { + Account account = this.usersDao.getAccount( address ); + this.prefsDao.resetPreferences( account ); + } + + + @Override + @Transactional + public void setPreferences( EmailAddress address , Map< String , String > values ) + { + Account account = this.usersDao.getAccount( address ); + this.prefsDao.setPreferences( account , values ); + } + + + @Override + @Transactional + public void setQuit( EmailAddress address , String reason ) + { + Account account = this.usersDao.getAccount( address ); + if ( account.getStatus( ) == AccountStatus.ACTIVE ) { + this.usersDao.setQuit( account , reason ); + } + } + + + @Override + @Transactional + public void cancelQuit( EmailAddress address ) + { + Account account = this.usersDao.getAccount( address ); + if ( account.getStatus( ) == AccountStatus.QUITTING ) { + this.usersDao.cancelQuit( account ); + } + } + + + @Override + @Transactional + public void toggleVacation( EmailAddress address ) + { + Account account = this.usersDao.getAccount( address ); + AccountStatus status = account.getStatus( ); + if ( status == AccountStatus.ACTIVE ) { + this.usersDao.enterVacation( account ); + } else if ( status == AccountStatus.START_VACATION || status == AccountStatus.VACATION ) { + this.usersDao.leaveVacation( account ); + } + } + + + @Override + @Transactional + public List< AccountListEntry > listAccounts( AccountStatus status , boolean online ) + { + if ( online ) { + return this.usersDao.listOnlineAccounts( status ); + } + return this.usersDao.listAccounts( status ); + } + + + @Override + @Transactional + public AccountViewEntry getAccountView( int id ) + { + AccountViewEntry basics = this.usersDao.viewAccount( id ); + if ( basics == null ) { + return null; + } + basics.setOnline( this.sessionDao.isOnline( id ) ); + basics.setEmpireNames( this.namingDao.getEmpireNames( id ) ); + return basics; + } + + + @Override + @Transactional + public AccountSessionEntry viewSessions( int id ) + { + AccountViewEntry basics = this.usersDao.viewAccount( id ); + if ( basics == null ) { + return null; + } + + AccountSessionEntry entry = new AccountSessionEntry( basics ); + entry.setSessions( this.sessionDao.getSessions( id ) ); + return entry; + } + + + @Override + @Transactional + public void giveCredits( Administrator admin , int id , int credits ) + { + this.usersDao.giveCredits( admin.getId( ) , id , credits ); + } + + + @Override + @Transactional + public BanDetailsResponse getBanDetails( EmailAddress address ) + { + ValidatedBanRequest ban = this.bansDao.getActiveBan( address ); + if ( ban == null ) { + throw new RuntimeException( "account not banned" ); + } + return new BanDetailsResponse( ban.getUpdate( ) , ban.getReason( ) , ban.isRedeemable( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorBean.java new file mode 100644 index 0000000..9e35dd2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorBean.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class QuitProcessorBean + implements InitializingBean , DisposableBean +{ + + private TransactionTemplate tTemplate; + + private Ticker ticker; + + private UsersDAO usersDao; + + private Mailer mailer; + + private QuitProcessorTask quitProcessor; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setUsersDAO( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.quitProcessor = new QuitProcessorTask( this.tTemplate , this.usersDao , this.mailer ); + this.ticker.registerTask( Frequency.MEDIUM , "Quitting accounts processor" , this.quitProcessor ); + } + + + @Override + public void destroy( ) + { + this.quitProcessor = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorTask.java new file mode 100644 index 0000000..ca67534 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/QuitProcessorTask.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.beans.acm; + + +import java.util.List; + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.sqld.accounts.QuittingAccount; + + + +class QuitProcessorTask + implements Runnable +{ + + private TransactionTemplate tTemplate; + private UsersDAO usersDao; + private Mailer mailer; + + + public QuitProcessorTask( TransactionTemplate tTemplate , UsersDAO usersDao , Mailer mailer ) + { + this.tTemplate = tTemplate; + this.usersDao = usersDao; + this.mailer = mailer; + } + + + @Override + public void run( ) + { + List< QuittingAccount > quitters; + quitters = this.tTemplate.execute( new TransactionCallback< List< QuittingAccount >>( ) { + @Override + public List< QuittingAccount > doInTransaction( TransactionStatus status ) + { + return usersDao.processQuits( ); + } + } ); + + for ( QuittingAccount quitter : quitters ) { + try { + this.mailer.createMail( quitter.getLanguage( ) , "quitMail" , quitter.getAddress( ) ).queue( ); + } catch ( Exception e ) { + continue; + } + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationBean.java new file mode 100644 index 0000000..9e295b5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationBean.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class RequestsExpirationBean + implements InitializingBean , DisposableBean +{ + + private TransactionTemplate tTemplate; + + private Ticker ticker; + + private UsersDAO usersDao; + + private RequestsExpirationTask expiration; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setUsersDAO( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.expiration = new RequestsExpirationTask( this.tTemplate , this.usersDao ); + this.ticker.registerTask( Frequency.MEDIUM , "Account requests expiration" , this.expiration ); + } + + + @Override + public void destroy( ) + { + this.expiration = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationTask.java new file mode 100644 index 0000000..4cde6eb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/RequestsExpirationTask.java @@ -0,0 +1,38 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; + + + +class RequestsExpirationTask + implements Runnable +{ + + private TransactionTemplate tTemplate; + private UsersDAO usersDao; + + + public RequestsExpirationTask( TransactionTemplate tTemplate , UsersDAO usersDao ) + { + this.tTemplate = tTemplate; + this.usersDao = usersDao; + } + + + @Override + public void run( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + usersDao.expireRequests( ); + } + } ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UserSessionDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UserSessionDAOBean.java new file mode 100644 index 0000000..cdb5fb0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UserSessionDAOBean.java @@ -0,0 +1,137 @@ +package com.deepclone.lw.beans.acm; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.cmd.admin.users.UserSession; +import com.deepclone.lw.interfaces.acm.UserSessionDAO; +import com.deepclone.lw.utils.StoredProc; + + + +public class UserSessionDAOBean + implements UserSessionDAO , InitializingBean +{ + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< UserSession > mSession; + + private StoredProc fSessionStart; + private StoredProc fSessionEnd; + + + public UserSessionDAOBean( ) + { + this.mSession = new RowMapper< UserSession >( ) { + @Override + public UserSession mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + UserSession session = new UserSession( ); + + session.setId( rs.getLong( "id" ) ); + session.setCredentialsId( rs.getInt( "credentials_id" ) ); + session.setSessionName( rs.getString( "session" ) ); + session.setClientName( rs.getString( "client_name" ) ); + session.setExclusive( rs.getBoolean( "exclusive" ) ); + session.setFromAddress( rs.getString( "from_address" ) ); + if ( session.getFromAddress( ).startsWith( "/" )) { + session.setFromAddress( session.getFromAddress( ).substring( 1 ) ); + } + session.setStarted( rs.getTimestamp( "started" ) ); + session.setEnded( rs.getTimestamp( "ended" ) ); + if ( session.getEnded( ) != null ) { + session.setEndType( SessionTerminationType.valueOf( rs.getString( "end_type" ) ) ); + } + + return session; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fSessionStart = new StoredProc( dataSource , "users" , "sessions_login" ); + this.fSessionStart.addParameter( "credentials_id" , Types.INTEGER ); + this.fSessionStart.addParameter( "session_name" , Types.VARCHAR ); + this.fSessionStart.addParameter( "client_type" , Types.VARCHAR ); + this.fSessionStart.addParameter( "ip_address" , Types.VARCHAR ); + this.fSessionStart.addOutput( "s_id" , Types.BIGINT ); + + this.fSessionEnd = new StoredProc( dataSource , "users" , "sessions_terminate" ); + this.fSessionEnd.addParameter( "session_id" , Types.BIGINT ); + this.fSessionEnd.addParameter( "end_type" , "session_termination_type" ); + } + + + @Override + public void afterPropertiesSet( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT users.sessions_server_restart()" ); + } + + + @Override + public long startSession( int id , String sName , String client , String address ) + { + return (Long) this.fSessionStart.execute( id , sName , client , address ).get( "s_id" ); + } + + + @Override + public void endSession( long session , SessionTerminationType termination ) + { + this.fSessionEnd.execute( session , termination.toString( ) ); + } + + + @Override + public UserSession getSession( long id ) + { + String sql = "SELECT * FROM users.sessions WHERE id = ?"; + try { + return this.dTemplate.queryForObject( sql , this.mSession , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public boolean isOnline( int id ) + { + String sql = "SELECT credentials_id FROM users.sessions WHERE credentials_id = ? AND end_type IS NULL AND exclusive"; + try { + this.dTemplate.queryForInt( sql , id ); + return true; + } catch ( EmptyResultDataAccessException e ) { + return false; + } + } + + + @Override + public List< UserSession > getSessions( int id ) + { + String sql = "SELECT * FROM users.sessions WHERE credentials_id = ?"; + return this.dTemplate.query( sql , this.mSession , id ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UsersDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UsersDAOBean.java new file mode 100644 index 0000000..7e5d421 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/UsersDAOBean.java @@ -0,0 +1,550 @@ +package com.deepclone.lw.beans.acm; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.users.AccountBanEntry; +import com.deepclone.lw.cmd.admin.users.AccountListEntry; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.AccountViewEntry; +import com.deepclone.lw.cmd.player.gdata.account.MailChangeData; +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.sqld.accounts.AccountOperationResult; +import com.deepclone.lw.sqld.accounts.QuittingAccount; +import com.deepclone.lw.sqld.accounts.ValidationResult; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; +import com.deepclone.lw.utils.StoredProc; + + + +public class UsersDAOBean + implements UsersDAO +{ + private static abstract class AccountListMapper< T extends AccountListEntry > + implements RowMapper< T > + { + + protected void getCommonColumns( AccountListEntry e , ResultSet rs ) + throws SQLException + { + e.setId( rs.getInt( "id" ) ); + e.setAddress( rs.getString( "address" ) ); + e.setLanguage( rs.getString( "language" ) ); + e.setStatus( AccountStatus.valueOf( rs.getString( "status" ) ) ); + e.setCurrentEmpire( rs.getString( "current_empire" ) ); + } + + } + + private final RowMapper< Account > accountMapper; + private final RowMapper< QuittingAccount > quitMapper; + private final RowMapper< MailChangeData > mailChangeMapper; + private final AccountListMapper< AccountListEntry > mAccountList; + private final AccountListMapper< AccountViewEntry > mAccountView; + + private SimpleJdbcTemplate dTemplate; + + private StoredProc fCreateAccount; + private StoredProc fMailFailure; + private StoredProc fValidate; + private StoredProc fReactivate; + private StoredProc fRequestPasswordRecovery; + private StoredProc fCancelPasswordRecovery; + private StoredProc fConfirmPasswordRecovery; + private StoredProc fSetLanguage; + private StoredProc fSetPassword; + private StoredProc fSetAddress; + private StoredProc fCancelAddressChange; + private StoredProc fConfirmAddressChange; + private StoredProc fSetQuit; + private StoredProc fCancelQuit; + private StoredProc fEnterVacation; + private StoredProc fLeaveVacation; + private StoredProc fGrantCredits; + + + public UsersDAOBean( ) + { + this.accountMapper = new RowMapper< Account >( ) { + @Override + public Account mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Account account = new Account( ); + + account.setId( rs.getInt( "id" ) ); + account.setAddress( rs.getString( "address" ) ); + account.setLanguage( rs.getString( "language" ) ); + account.setPassMd5( rs.getString( "pass_md5" ) ); + account.setPassSha1( rs.getString( "pass_sha1" ) ); + account.setGameCredits( rs.getInt( "game_credits" ) ); + account.setStatus( AccountStatus.valueOf( rs.getString( "status" ) ) ); + account.setValidationToken( rs.getString( "validation_token" ) ); + account.setPwdRecoveryToken( rs.getString( "pwd_recovery_token" ) ); + account.setAddressChangeToken( rs.getString( "address_change_token" ) ); + account.setNewAddress( rs.getString( "new_address" ) ); + account.setVacationCredits( rs.getInt( "vacation_credits" ) ); + account.setVacationTime( rs.getInt( "vacation_time" ) ); + account.setVacationStart( rs.getTimestamp( "vacation_start" ) ); + account.setInactivityStart( rs.getTimestamp( "inactivity_begin" ) ); + account.setInactivityReason( rs.getString( "inactivity_reason" ) ); + account.setBanRequestId( rs.getInt( "ban_request_id" ) ); + + return account; + } + }; + + this.mailChangeMapper = new RowMapper< MailChangeData >( ) { + @Override + public MailChangeData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + if ( rs.getBoolean( "used" ) ) { + return new MailChangeData( rs.getTimestamp( "expires" ) ); + } + return new MailChangeData( rs.getTimestamp( "expires" ) , rs.getString( "new_address" ) ); + } + }; + + this.quitMapper = new RowMapper< QuittingAccount >( ) { + @Override + public QuittingAccount mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + QuittingAccount acc = new QuittingAccount( ); + acc.setId( rs.getInt( "id" ) ); + acc.setAddress( rs.getString( "address" ) ); + acc.setLanguage( rs.getString( "language" ) ); + return acc; + } + }; + + this.mAccountList = new AccountListMapper< AccountListEntry >( ) { + @Override + public AccountListEntry mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AccountListEntry e = new AccountListEntry( ); + this.getCommonColumns( e , rs ); + return e; + } + }; + + this.mAccountView = new AccountListMapper< AccountViewEntry >( ) { + @Override + public AccountViewEntry mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AccountViewEntry e = new AccountViewEntry( ); + this.getCommonColumns( e , rs ); + e.setGameCredits( rs.getInt( "game_credits" ) ); + e.setVacationCredits( rs.getInt( "vacation_credits" ) ); + if ( !e.getStatus( ).isActive( ) && e.getStatus( ) != AccountStatus.UNCONFIRMED ) { + e.setStatusStart( rs.getTimestamp( "inactivity_begin" ) ); + } else { + e.setStatusStart( rs.getTimestamp( "vacation_start" ) ); + } + e.setInactivityReason( rs.getString( "inactivity_reason" ) ); + e.setEmpireId( (Integer) rs.getObject( "current_empire_id" ) ); + + if ( e.getStatus( ) == AccountStatus.BANNED ) { + AccountBanEntry ban = new AccountBanEntry( ); + ban.setRequestedById( rs.getInt( "ban_req_id" ) ); + ban.setRequestedByName( rs.getString( "ban_req_name" ) ); + ban.setConfirmedById( rs.getInt( "ban_val_id" ) ); + ban.setConfirmedByName( rs.getString( "ban_val_name" ) ); + e.setBan( ban ); + } + + e.setWarnings( rs.getInt( "warnings_count" ) ); + e.setLastWarning( rs.getTimestamp( "warnings_last" ) ); + + return e; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fCreateAccount = new StoredProc( dataSource , "users" , "create_credentials" ); + this.fCreateAccount.addParameter( "address" , Types.VARCHAR ); + this.fCreateAccount.addParameter( "lang_id" , Types.VARCHAR ); + this.fCreateAccount.addParameter( "pass_md5" , Types.VARCHAR ); + this.fCreateAccount.addParameter( "pass_sha1" , Types.VARCHAR ); + this.fCreateAccount.addOutput( "err_code" , Types.INTEGER ); + this.fCreateAccount.addOutput( "a_id" , Types.INTEGER ); + + this.fMailFailure = new StoredProc( dataSource , "users" , "validation_mail_failure" ); + this.fMailFailure.addParameter( "a_id" , Types.INTEGER ); + + this.fValidate = new StoredProc( dataSource , "users" , "validate" ); + this.fValidate.addParameter( "addr" , Types.VARCHAR ); + this.fValidate.addParameter( "vtoken" , Types.VARCHAR ); + this.fValidate.addParameter( "empname" , Types.VARCHAR ); + this.fValidate.addParameter( "plname" , Types.VARCHAR ); + this.fValidate.addOutput( "account_error" , Types.INTEGER ); + this.fValidate.addOutput( "empire_error" , Types.INTEGER ); + this.fValidate.addOutput( "planet_error" , Types.INTEGER ); + + this.fReactivate = new StoredProc( dataSource , "users" , "reactivate" ); + this.fReactivate.addParameter( "addr" , Types.VARCHAR ); + this.fReactivate.addOutput( "success" , Types.BOOLEAN ); + this.fReactivate.addOutput( "a_id" , Types.INTEGER ); + + this.fRequestPasswordRecovery = new StoredProc( dataSource , "users" , "request_password_recovery" ); + this.fRequestPasswordRecovery.addParameter( "addr" , Types.VARCHAR ); + this.fRequestPasswordRecovery.addOutput( "err_code" , Types.INTEGER ); + this.fRequestPasswordRecovery.addOutput( "a_id" , Types.INTEGER ); + + this.fCancelPasswordRecovery = new StoredProc( dataSource , "users" , "cancel_password_recovery" ); + this.fCancelPasswordRecovery.addParameter( "a_id" , Types.INTEGER ); + + this.fConfirmPasswordRecovery = new StoredProc( dataSource , "users" , "confirm_password_recovery" ); + this.fConfirmPasswordRecovery.addParameter( "umail" , Types.VARCHAR ); + this.fConfirmPasswordRecovery.addParameter( "tok" , Types.VARCHAR ); + this.fConfirmPasswordRecovery.addParameter( "pmd5" , Types.VARCHAR ); + this.fConfirmPasswordRecovery.addParameter( "psha1" , Types.VARCHAR ); + this.fConfirmPasswordRecovery.addOutput( "err_code" , Types.INTEGER ); + this.fConfirmPasswordRecovery.addOutput( "a_id" , Types.INTEGER ); + + this.fSetLanguage = new StoredProc( dataSource , "users" , "set_language" ); + this.fSetLanguage.addParameter( "umail" , Types.VARCHAR ); + this.fSetLanguage.addParameter( "lang_id" , Types.VARCHAR ); + + this.fSetPassword = new StoredProc( dataSource , "users" , "set_password" ); + this.fSetPassword.addParameter( "u_id" , Types.INTEGER ); + this.fSetPassword.addParameter( "pmd5" , Types.VARCHAR ); + this.fSetPassword.addParameter( "psha1" , Types.VARCHAR ); + this.fSetPassword.addOutput( "success" , Types.BOOLEAN ); + + this.fSetAddress = new StoredProc( dataSource , "users" , "request_address_change" ); + this.fSetAddress.addParameter( "u_id" , Types.INTEGER ); + this.fSetAddress.addParameter( "n_address" , Types.VARCHAR ); + this.fSetAddress.addOutput( "err_code" , Types.INTEGER ); + + this.fCancelAddressChange = new StoredProc( dataSource , "users" , "cancel_address_change" ); + this.fCancelAddressChange.addParameter( "u_id" , Types.INTEGER ); + + this.fConfirmAddressChange = new StoredProc( dataSource , "users" , "confirm_address_change" ); + this.fConfirmAddressChange.addParameter( "u_id" , Types.INTEGER ); + this.fConfirmAddressChange.addParameter( "token" , Types.VARCHAR ); + this.fConfirmAddressChange.addOutput( "n_id" , Types.INTEGER ); + + this.fSetQuit = new StoredProc( dataSource , "users" , "set_account_quit" ); + this.fSetQuit.addParameter( "accound_id" , Types.INTEGER ); + this.fSetQuit.addParameter( "reason_text" , Types.VARCHAR ); + + this.fCancelQuit = new StoredProc( dataSource , "users" , "cancel_account_quit" ); + this.fCancelQuit.addParameter( "account_id" , Types.INTEGER ); + + this.fEnterVacation = new StoredProc( dataSource , "users" , "set_vacation" ); + this.fEnterVacation.addParameter( "account_id" , Types.INTEGER ); + + this.fLeaveVacation = new StoredProc( dataSource , "users" , "leave_vacation" ); + this.fLeaveVacation.addParameter( "account_id" , Types.INTEGER ); + + this.fGrantCredits = new StoredProc( dataSource , "admin" , "grant_user_credits" ); + this.fGrantCredits.addParameter( "admin_id" , Types.INTEGER ); + this.fGrantCredits.addParameter( "account_id" , Types.INTEGER ); + this.fGrantCredits.addParameter( "credits" , Types.INTEGER ); + } + + + @Override + public Account getAccount( EmailAddress address ) + { + String sql = "SELECT * FROM users.accounts_view WHERE address = ?"; + try { + return this.dTemplate.queryForObject( sql , this.accountMapper , address.getAddress( ) ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public Account getAccount( int id ) + { + String sql = "SELECT * FROM users.accounts_view WHERE id = ?"; + try { + return this.dTemplate.queryForObject( sql , this.accountMapper , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + private AccountOperationResult mapToResult( Map< String , Object > m ) + { + int errCode = (Integer) m.get( "err_code" ); + + AccountOperationResult result = new AccountOperationResult( ); + result.setErrorCode( errCode ); + if ( errCode == 0 ) { + result.setAccount( this.getAccount( (Integer) m.get( "a_id" ) ) ); + } + + return result; + } + + + @Override + public AccountOperationResult createAccount( EmailAddress address , Password password , String language ) + { + Map< String , Object > m = this.fCreateAccount.execute( address.getAddress( ) , language , password.getMd5( ) , + password.getSha1( ) ); + return this.mapToResult( m ); + } + + + @Override + public void cancelAccountValidation( Account account ) + { + this.fMailFailure.execute( account.getId( ) ); + } + + + @Override + public ValidationResult validateAccount( EmailAddress address , String token , String eName , String pName ) + { + Map< String , Object > m = this.fValidate.execute( address.getAddress( ) , token , eName , pName ); + ValidationResult vr = new ValidationResult( ); + vr.setAccountError( (Integer) m.get( "account_error" ) ); + vr.setEmpireError( (Integer) m.get( "empire_error" ) ); + vr.setPlanetError( (Integer) m.get( "planet_error" ) ); + return vr; + } + + + @Override + public Account reactivateAccount( EmailAddress address ) + { + Map< String , Object > m = this.fReactivate.execute( address.getAddress( ) ); + + boolean success = (Boolean) m.get( "success" ); + if ( !success ) { + return null; + } + + return this.getAccount( (Integer) m.get( "a_id" ) ); + } + + + @Override + public AccountOperationResult requestPasswordRecovery( EmailAddress address ) + { + Map< String , Object > m = this.fRequestPasswordRecovery.execute( address.getAddress( ) ); + return this.mapToResult( m ); + } + + + @Override + public void cancelPasswordRecovery( Account account ) + { + this.fCancelPasswordRecovery.execute( account.getId( ) ); + } + + + @Override + public AccountOperationResult confirmPasswordRecovery( EmailAddress address , String token , Password nPassword ) + { + Map< String , Object > m = this.fConfirmPasswordRecovery.execute( address.getAddress( ) , token , nPassword + .getMd5( ) , nPassword.getSha1( ) ); + return this.mapToResult( m ); + } + + + @Override + public MailChangeData getMailChange( int accountId ) + { + String sql = "SELECT * FROM users.mail_change_view WHERE id = ?"; + try { + return this.dTemplate.queryForObject( sql , this.mailChangeMapper , accountId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public void setLanguage( EmailAddress address , String language ) + { + this.fSetLanguage.execute( address.getAddress( ) , language ); + } + + + @Override + public boolean setPassword( Account account , Password newPassword ) + { + int id = account.getId( ); + String sha1 = newPassword.getSha1( ); + String md5 = newPassword.getMd5( ); + return (Boolean) this.fSetPassword.execute( id , sha1 , md5 ).get( "success" ); + } + + + @Override + public int setAddress( Account account , EmailAddress nAddress ) + { + return (Integer) this.fSetAddress.execute( account.getId( ) , nAddress.getAddress( ) ).get( "err_code" ); + } + + + @Override + public void cancelAddressChange( Account account ) + { + this.fCancelAddressChange.execute( account.getId( ) ); + } + + + @Override + public int confirmAddressChange( Account account , String code ) + { + Integer nv; + nv = (Integer) this.fConfirmAddressChange.execute( account.getId( ) , code ).get( "n_id" ); + return ( nv == null ) ? account.getId( ) : nv.intValue( ); + } + + + @Override + public void expireRequests( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT users.expire_requests( )" ); + } + + + @Override + public void setQuit( Account account , String reason ) + { + this.fSetQuit.execute( account.getId( ) , reason ); + } + + + @Override + public void cancelQuit( Account account ) + { + this.fCancelQuit.execute( account.getId( ) ); + } + + + @Override + public List< QuittingAccount > processQuits( ) + { + String sql = "SELECT * FROM users.process_quit_requests( )"; + return this.dTemplate.query( sql , this.quitMapper ); + } + + + @Override + public void enterVacation( Account account ) + { + this.fEnterVacation.execute( account.getId( ) ); + } + + + @Override + public void leaveVacation( Account account ) + { + this.fLeaveVacation.execute( account.getId( ) ); + } + + + @Override + public void processVacations( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT users.process_vacations( )" ); + } + + + @Override + public List< AccountListEntry > listAccounts( AccountStatus status ) + { + String sql = "SELECT * FROM admin.users_list"; + Object[] params; + if ( status != null ) { + sql += " WHERE status = ?"; + params = new Object[] { + status.toString( ) + }; + } else { + params = new Object[] { }; + } + return this.dTemplate.query( sql , this.mAccountList , params ); + } + + + @Override + public List< AccountListEntry > listOnlineAccounts( AccountStatus status ) + { + String sql = "SELECT u.* FROM admin.users_list u INNER JOIN users.sessions s ON s.credentials_id = u.id AND s.end_type IS NULL AND s.exclusive"; + Object[] params; + if ( status != null ) { + sql += " WHERE u.status = ?"; + params = new Object[] { + status.toString( ) + }; + } else { + params = new Object[] { }; + } + return this.dTemplate.query( sql , this.mAccountList , params ); + } + + + @Override + public AccountViewEntry viewAccount( int id ) + { + String sql = "SELECT * FROM admin.users_list WHERE id = ?"; + try { + return this.dTemplate.queryForObject( sql , this.mAccountView , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public void giveCredits( int adminId , int accountId , int credits ) + { + this.fGrantCredits.execute( adminId , accountId , credits ); + } + + + @Override + public void deleteOldAccounts( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT users.delete_old_accounts( )" ); + } + + + @Override + public List< QuittingAccount > getInactivesToWarn( ) + { + String sql = "SELECT * FROM users.check_inactivity_emails( )"; + return this.dTemplate.query( sql , this.quitMapper ); + } + + + @Override + public List< QuittingAccount > getInactivesToDisable( ) + { + String sql = "SELECT * FROM users.check_inactivity( )"; + return this.dTemplate.query( sql , this.quitMapper ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorBean.java new file mode 100644 index 0000000..02a2dfd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorBean.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class VacationProcessorBean + implements InitializingBean , DisposableBean +{ + + private TransactionTemplate tTemplate; + + private Ticker ticker; + + private UsersDAO usersDao; + + private VacationProcessorTask vacationProcessor; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setUsersDAO( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.vacationProcessor = new VacationProcessorTask( this.tTemplate , this.usersDao ); + this.ticker.registerTask( Frequency.MINUTE , "Vacation processor" , this.vacationProcessor ); + } + + + @Override + public void destroy( ) + { + this.vacationProcessor = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorTask.java new file mode 100644 index 0000000..95d6571 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/acm/VacationProcessorTask.java @@ -0,0 +1,38 @@ +package com.deepclone.lw.beans.acm; + + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.acm.UsersDAO; + + + +class VacationProcessorTask + implements Runnable +{ + + private TransactionTemplate tTemplate; + private UsersDAO usersDao; + + + public VacationProcessorTask( TransactionTemplate tTemplate , UsersDAO usersDao ) + { + this.tTemplate = tTemplate; + this.usersDao = usersDao; + } + + + @Override + public void run( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + usersDao.processVacations( ); + } + } ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminDAOBean.java new file mode 100644 index 0000000..84a3a7a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminDAOBean.java @@ -0,0 +1,251 @@ +package com.deepclone.lw.beans.admin; + + +import java.net.InetAddress; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.sql.Types; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.adata.AdminOverview; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.admin.AdminDAOException; +import com.deepclone.lw.sqld.admin.AdminConnection; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.StoredProc; + + + +public class AdminDAOBean + implements AdminDAO +{ + private static final String sGetAdminById = "SELECT * FROM admin.admins_view WHERE administrator_id = ?"; + private static final String sGetAdminByAddress = "SELECT * FROM admin.admins_view WHERE address = ?"; + private static final String sGetAdminByName = "SELECT * FROM admin.admins_view WHERE lower( name ) = ?"; + private static final String sListAdministrators = "SELECT * FROM admin.admins_view ORDER BY active DESC , name"; + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< AdminRecord > mAdminRecord; + private final RowMapper< AdminOverview > mAdminOverview; + + private StoredProc fCreateAdmin; + private StoredProc fLogConnection; + private StoredProc fLogDisconnection; + private StoredProc fSetPassword; + private StoredProc fResetPassword; + private StoredProc fSetPrivileges; + + + public AdminDAOBean( ) + { + this.mAdminRecord = new RowMapper< AdminRecord >( ) { + @Override + public AdminRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AdminRecord admin = new AdminRecord( ); + admin.setId( rs.getInt( "administrator_id" ) ); + admin.setName( rs.getString( "name" ) ); + admin.setPrivileges( rs.getInt( "privileges" ) ); + admin.setActive( rs.getBoolean( "active" ) ); + admin.setAccount( (Integer) rs.getObject( "account_id" ) ); + admin.setAddress( rs.getString( "address" ) ); + admin.setpMd5( rs.getString( "pass_md5" ) ); + admin.setpSha1( rs.getString( "pass_sha1" ) ); + admin.setPassChangeRequired( (Boolean) rs.getObject( "pass_change_required" ) ); + return admin; + } + }; + this.mAdminOverview = new RowMapper< AdminOverview >( ) { + @Override + public AdminOverview mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AdminOverview ov = new AdminOverview( ); + ov.setId( rs.getInt( "admin_id" ) ); + ov.setNewMessages( rs.getLong( "new_messages" ) ); + ov.setPendingNames( rs.getLong( "pending_names" ) ); + ov.setPendingBans( rs.getLong( "pending_bans" ) ); + ov.setPendingBugs( rs.getLong( "pending_bugs" ) ); + ov.setOpenBugs( rs.getLong( "open_bugs" ) ); + ov.setUpdatedBugs( rs.getLong( "updated_bugs" ) ); + return ov; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fCreateAdmin = new StoredProc( dataSource , "admin" , "create_admin" ); + this.fCreateAdmin.addParameter( "address" , Types.VARCHAR ); + this.fCreateAdmin.addParameter( "admin_name" , Types.VARCHAR ); + this.fCreateAdmin.addParameter( "privileges" , Types.INTEGER ); + this.fCreateAdmin.addOutput( "err_code" , Types.INTEGER ); + this.fCreateAdmin.addOutput( "admin_id" , Types.INTEGER ); + + this.fLogConnection = new StoredProc( dataSource , "admin" , "log_connection" ); + this.fLogConnection.addParameter( "admin_id" , Types.INTEGER ); + this.fLogConnection.addParameter( "result" , "admin_connection_result" ); + this.fLogConnection.addParameter( "ip_address" , Types.VARCHAR ); + + this.fLogDisconnection = new StoredProc( dataSource , "admin" , "log_disconnection" ); + this.fLogDisconnection.addParameter( "admin_id" , Types.INTEGER ); + + this.fSetPassword = new StoredProc( dataSource , "admin" , "set_password" ); + this.fSetPassword.addParameter( "admin_id" , Types.INTEGER ); + this.fSetPassword.addParameter( "pass_sha1" , Types.VARCHAR ); + this.fSetPassword.addParameter( "pass_md5" , Types.VARCHAR ); + this.fSetPassword.addOutput( "success" , Types.BOOLEAN ); + + this.fResetPassword = new StoredProc( dataSource , "admin" , "reset_password" ); + this.fResetPassword.addParameter( "admin_id" , Types.INTEGER ); + this.fResetPassword.addParameter( "superuser_id" , Types.INTEGER ); + this.fResetPassword.addOutput( "success" , Types.BOOLEAN ); + + this.fSetPrivileges = new StoredProc( dataSource , "admin" , "set_privileges" ); + this.fSetPrivileges.addParameter( "admin_id" , Types.INTEGER ); + this.fSetPrivileges.addParameter( "superuser_id" , Types.INTEGER ); + this.fSetPrivileges.addParameter( "privileges" , Types.INTEGER ); + this.fSetPrivileges.addOutput( "success" , Types.BOOLEAN ); + } + + + @Override + public AdminRecord getAdmin( int id ) + { + try { + return this.dTemplate.queryForObject( sGetAdminById , this.mAdminRecord , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public AdminRecord getAdmin( EmailAddress address ) + { + try { + return this.dTemplate.queryForObject( sGetAdminByAddress , this.mAdminRecord , address.getAddress( ) ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public AdminRecord getAdmin( String name ) + { + try { + return this.dTemplate.queryForObject( sGetAdminByName , this.mAdminRecord , name.toLowerCase( ) ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public int createAdmin( String address , String name , int privileges ) + throws AdminDAOException + { + Map< String , Object > result = this.fCreateAdmin.execute( address , name , privileges ); + int errCode = (Integer) result.get( "err_code" ); + if ( errCode != 0 ) { + throw new AdminDAOException( errCode ); + } + return (Integer) result.get( "admin_id" ); + } + + + @Override + public void logConnectionAttempt( int id , AdminConnection status , InetAddress address ) + { + this.fLogConnection.execute( id , status.toString( ) , address.getHostAddress( ) ); + } + + + @Override + public void logDisconnection( int id ) + { + this.fLogDisconnection.execute( id ); + } + + + @Override + public boolean setPassword( int id , String sha1 , String md5 ) + { + return (Boolean) this.fSetPassword.execute( id , sha1 , md5 ).get( "success" ); + } + + + @Override + public List< AdminRecord > listAdministrators( ) + { + return this.dTemplate.query( sListAdministrators , this.mAdminRecord ); + } + + + @Override + public boolean resetPassword( int identifier , int superuser ) + { + return (Boolean) this.fResetPassword.execute( identifier , superuser ).get( "success" ); + } + + + @Override + public boolean setPrivileges( int identifier , int superuser , int privileges ) + { + return (Boolean) this.fSetPrivileges.execute( identifier , superuser , privileges ).get( "success" ); + } + + + @Override + public AdminOverview getOverview( int id ) + { + String sql = "SELECT * FROM admin.overview WHERE admin_id = ?"; + try { + return this.dTemplate.queryForObject( sql , this.mAdminOverview , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public List< AdminOverview > getOverviews( ) + { + String sql = "SELECT * FROM admin.overview"; + return this.dTemplate.query( sql , this.mAdminOverview ); + } + + + @Override + public Timestamp isRecapTime( ) + { + String sql = "SELECT * FROM admin.is_recap_time( )"; + RowMapper< Timestamp > mapper = new RowMapper< Timestamp >( ) { + @Override + public Timestamp mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return rs.getTimestamp( 1 ); + } + }; + return this.dTemplate.queryForObject( sql , mapper ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapBean.java new file mode 100644 index 0000000..19a155a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapBean.java @@ -0,0 +1,78 @@ +package com.deepclone.lw.beans.admin; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class AdminRecapBean + implements InitializingBean , DisposableBean +{ + private AdminRecapTask task; + private TransactionTemplate tTemplate; + private Ticker ticker; + private Mailer mailer; + private AdminDAO adminDao; + private LogReader logReader; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Autowired( required = true ) + public void setAdminDao( AdminDAO adminDao ) + { + this.adminDao = adminDao; + } + + + @Autowired( required = true ) + public void setLogReader( LogReader logReader ) + { + this.logReader = logReader; + } + + + @Override + public void afterPropertiesSet( ) + { + this.task = new AdminRecapTask( this.tTemplate , this.mailer , this.adminDao , this.logReader ); + this.ticker.registerTask( Frequency.LOW , "Admin recap task" , this.task ); + } + + + @Override + public void destroy( ) + { + this.task = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapTask.java new file mode 100644 index 0000000..2183670 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdminRecapTask.java @@ -0,0 +1,162 @@ +package com.deepclone.lw.beans.admin; + + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.AdminOverview; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.logs.LogEntry; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public class AdminRecapTask + implements Runnable +{ + + private final TransactionTemplate tTemplate; + private final Mailer mailer; + private final AdminDAO adminDao; + private final LogReader logReader; + + private Timestamp isTime; + private List< AdminRecord > admins; + private final Map< Integer , AdminOverview > overviews = new HashMap< Integer , AdminOverview >( ); + private List< LogEntry > logs; + + + public AdminRecapTask( TransactionTemplate tTemplate , Mailer mailer , AdminDAO adminDao , LogReader logReader ) + { + this.tTemplate = tTemplate; + this.mailer = mailer; + this.adminDao = adminDao; + this.logReader = logReader; + } + + + @Override + public void run( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + checkRecap( ); + } + } ); + + if ( this.isTime == null ) { + return; + } + + String logs = this.buildLogsString( ); + for ( AdminRecord admin : this.admins ) { + if ( !admin.isActive( ) ) { + continue; + } + + String mailContents = this.buildMailContents( admin , logs ); + if ( "".equals( mailContents ) ) { + continue; + } + + MailData mail; + try { + mail = this.mailer.createMail( "en" , "adminRecapMail" , admin.getAddress( ) ); + mail.setData( "contents" , mailContents ); + mail.queue( ); + } catch ( Exception e ) { + continue; + } + } + } + + + private String buildMailContents( AdminRecord admin , String logs ) + { + AdminOverview overview = this.overviews.get( admin.getId( ) ); + if ( overview == null ) { + return ""; + } + + StringBuilder mail = new StringBuilder( ); + if ( overview.getNewMessages( ) > 0 ) { + mail.append( "Unread messages: " ).append( overview.getNewMessages( ) ).append( "\n" ); + } + + int privs = admin.getPrivileges( ); + if ( Privileges.NAME.hasPrivilege( privs ) && overview.getPendingNames( ) > 0 ) { + mail.append( "Unvalidated map names: " ).append( overview.getPendingNames( ) ).append( "\n" ); + } + if ( Privileges.BANH.hasPrivilege( privs ) && overview.getPendingBans( ) > 0 ) { + mail.append( "Pending ban requests: " ).append( overview.getPendingBans( ) ).append( "\n" ); + } + if ( Privileges.BUGT.hasPrivilege( privs ) ) { + boolean showBugs = false; + if ( overview.getPendingBugs( ) > 0 ) { + mail.append( "Bug reports pending validation: " ).append( overview.getPendingBugs( ) ).append( "\n" ); + showBugs = true; + } + if ( overview.getUpdatedBugs( ) > 0 ) { + mail.append( "Updated bug reports: " ).append( overview.getUpdatedBugs( ) ).append( "\n" ); + showBugs = true; + } + if ( showBugs && overview.getOpenBugs( ) > 0 ) { + mail.append( "Open bug reports: " ).append( overview.getOpenBugs( ) ).append( "\n" ); + } + } + if ( !"".equals( logs ) && Privileges.LOGS.hasPrivilege( privs ) ) { + mail.append( "\n" ).append( logs ); + } + + return mail.toString( ); + } + + + private String buildLogsString( ) + { + if ( this.logs.isEmpty( ) ) { + return ""; + } + + StringBuilder builder = new StringBuilder( ).append( "Administrative actions log\n\n" ); + SimpleDateFormat dfmt = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); + for ( LogEntry entry : this.logs ) { + builder.append( dfmt.format( entry.getTimestamp( ) ) ); + builder.append( " - " ).append( entry.getLevel( ).toString( ) ); + builder.append( " - " ).append( entry.getAbout( ) ); + builder.append( " - " ).append( entry.getEntry( ) ); + builder.append( "\n" ); + } + + return builder.toString( ); + } + + + private void checkRecap( ) + { + this.isTime = this.adminDao.isRecapTime( ); + if ( this.isTime == null ) { + return; + } + + this.admins = this.adminDao.listAdministrators( ); + for ( AdminOverview ov : this.adminDao.getOverviews( ) ) { + this.overviews.put( ov.getId( ) , ov ); + } + this.logs = this.logReader.getAdminLogSince( this.isTime ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdministrationBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdministrationBean.java new file mode 100644 index 0000000..0da764d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/AdministrationBean.java @@ -0,0 +1,356 @@ +package com.deepclone.lw.beans.admin; + + +import java.net.InetAddress; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.AdminOverviewResponse; +import com.deepclone.lw.cmd.admin.adata.AdminOverview; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.BanRequest; +import com.deepclone.lw.cmd.admin.bans.BanType; +import com.deepclone.lw.cmd.admin.bans.BansSummaryResponse; +import com.deepclone.lw.cmd.admin.bans.ListBansResponse; +import com.deepclone.lw.cmd.admin.bans.RequestBanResponse; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse.AddressError; +import com.deepclone.lw.interfaces.acm.PasswordProhibitedException; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.admin.AdminDAOException; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.admin.BanMailData; +import com.deepclone.lw.interfaces.admin.BansDAO; +import com.deepclone.lw.interfaces.admin.IpBan; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.sqld.admin.AdminConnection; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.utils.DigestHelper; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +@Transactional +public class AdministrationBean + implements Administration +{ + + private SystemLogger sysLog; + private AdminDAO adminDao; + private IpBan ipBan; + private BansDAO bansDao; + private Mailer mailer; + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.sysLog = logger.getSystemLogger( "Administration" ); + } + + + @Autowired( required = true ) + public void setAdminDao( AdminDAO adminDao ) + { + this.adminDao = adminDao; + } + + + @Autowired( required = true ) + public void setIpBan( IpBan ipBan ) + { + this.ipBan = ipBan; + } + + + @Autowired( required = true ) + public void setBansDao( BansDAO bansDao ) + { + this.bansDao = bansDao; + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Override + public AdminRecord getAdmin( int id ) + { + return this.adminDao.getAdmin( id ); + } + + + @Override + public AdminRecord login( EmailAddress address , String challenge , String sha1Hash , String md5Hash , + InetAddress ipAddress ) + { + // Check IP ban + if ( this.ipBan.isBanned( ipAddress ) ) { + return null; + } + + // Find admin record + AdminRecord record = this.adminDao.getAdmin( address ); + if ( record == null ) { + this.ipBan.increaseBanCounter( ipAddress ); + this.sysLog.log( LogLevel.WARNING , + "failed login attempt from unknown address '" + address.getAddress( ) + "'" ).flush( ); + return null; + } + + // Make sure the administrator is active + if ( !record.isActive( ) ) { + this.ipBan.increaseBanCounter( ipAddress ); + this.adminDao.logConnectionAttempt( record.getId( ) , AdminConnection.INACTIVE , ipAddress ); + return null; + } + + // Check password + String eSha1 = DigestHelper.digest( "sha-1" , challenge + " " + record.getpSha1( ) ); + String eMd5 = DigestHelper.digest( "md5" , challenge + " " + record.getpMd5( ) ); + if ( eSha1.equals( sha1Hash ) && eMd5.equals( md5Hash ) ) { + this.adminDao.logConnectionAttempt( record.getId( ) , AdminConnection.SUCCESS , ipAddress ); + return record; + } + + this.ipBan.increaseBanCounter( ipAddress ); + this.adminDao.logConnectionAttempt( record.getId( ) , AdminConnection.PASSWORD , ipAddress ); + return null; + } + + + @Override + public void logout( int adminId ) + { + this.adminDao.logDisconnection( adminId ); + } + + + @Override + public boolean setPassword( int id , String challenge , String sha1Auth , String md5Auth , Password password ) + throws PasswordProhibitedException + { + AdminRecord admin = this.getAdmin( id ); + + // Check challenge response + String eSha1 = DigestHelper.digest( "sha-1" , challenge + " " + admin.getpSha1( ) ); + String eMd5 = DigestHelper.digest( "md5" , challenge + " " + admin.getpMd5( ) ); + if ( ! ( eSha1.equals( sha1Auth ) && eMd5.equals( md5Auth ) ) ) { + return false; + } + + // Try setting the password + if ( !this.adminDao.setPassword( id , password.getSha1( ) , password.getMd5( ) ) ) { + throw new PasswordProhibitedException( ); + } + + return true; + } + + + @Override + public List< AdminRecord > listAdministrators( ) + { + return this.adminDao.listAdministrators( ); + } + + + @Override + public AddAdministratorResponse createAdmin( Administrator creator , String address , String name , int privileges ) + { + int errCode; + try { + this.adminDao.createAdmin( address , name , privileges ); + return new AddAdministratorResponse( creator , false ); + } catch ( AdminDAOException e ) { + errCode = e.getErrorCode( ); + } + + AddressError aError; + ObjectNameError nError; + switch ( errCode ) { + case 1: + aError = AddressError.NOT_FOUND; + nError = null; + break; + case 2: + aError = AddressError.STATUS; + nError = null; + break; + case 3: + aError = null; + nError = ObjectNameError.UNAVAILABLE; + break; + case 4: + aError = AddressError.ALREADY_ADMIN; + nError = null; + break; + default: + throw new RuntimeException( "unknown error code " + errCode ); + } + + return new AddAdministratorResponse( creator , aError , address , nError , name , false , privileges ); + } + + + @Override + public AdminRecord resetPassword( Administrator admin , int identifier ) + { + if ( this.adminDao.resetPassword( identifier , admin.getId( ) ) ) { + return this.adminDao.getAdmin( identifier ); + } + return null; + } + + + @Override + public AdminRecord setPrivileges( Administrator admin , int identifier , Set< Privileges > privileges ) + { + int privs = 0; + for ( Privileges p : privileges ) { + privs = p.grant( privs ); + } + if ( this.adminDao.setPrivileges( identifier , admin.getId( ) , privs ) ) { + return this.adminDao.getAdmin( identifier ); + } + return null; + } + + + @Override + public BansSummaryResponse getBansSummary( Administrator admin ) + { + return new BansSummaryResponse( admin , this.bansDao.getSummary( ) ); + } + + + @Override + public ListBansResponse getBans( Administrator admin , BanType type ) + { + List< BanRequest > bans; + switch ( type ) { + case PENDING: + bans = this.bansDao.getPending( ); + break; + case ARCHIVED: + bans = this.bansDao.getArchived( ); + break; + case VALIDATED: + bans = this.bansDao.getActive( ); + break; + default: + throw new RuntimeException( "unknown ban type " + type ); + } + return new ListBansResponse( admin , type , bans ); + } + + + @Override + public RequestBanResponse requestBan( Administrator admin , String user , boolean empire , String reason ) + { + int errCode; + if ( empire ) { + errCode = this.bansDao.requestBan( admin.getId( ) , user , reason ); + } else { + EmailAddress address = new EmailAddress( user ); + if ( !address.isValid( ) ) { + errCode = 1; + } else { + errCode = this.bansDao.requestBan( admin.getId( ) , address , reason ); + } + } + + if ( errCode == 0 ) { + return new RequestBanResponse( admin , false ); + } + + RequestBanResponse.Error error; + switch ( errCode ) { + case 1: + error = RequestBanResponse.Error.NOT_FOUND; + break; + case 2: + error = RequestBanResponse.Error.BANNED; + break; + default: + throw new RuntimeException( "unknown error code " + errCode ); + } + + return new RequestBanResponse( admin , error , user , empire , reason ); + } + + + @Override + public void rejectBan( Administrator admin , int id , String reason ) + { + this.bansDao.rejectBan( admin.getId( ) , id , reason ); + } + + + @Override + public void confirmBan( Administrator admin , int id ) + { + BanMailData result = this.bansDao.validateBan( admin.getId( ) , id ); + if ( result == null ) { + return; + } + + try { + MailData mail = this.mailer.createMail( result.language , "bannedMail" , result.address ); + mail.setData( "reason" , result.reason ); + mail.queue( ); + } catch ( Exception e ) { + throw new RuntimeException( e ); + } + } + + + @Override + public void liftBan( Administrator admin , int id ) + { + BanMailData result = this.bansDao.liftBan( admin.getId( ) , id ); + if ( result == null ) { + return; + } + + try { + MailData mail = this.mailer.createMail( result.language , "banLiftedMail" , result.address ); + mail.queue( ); + } catch ( Exception e ) { + throw new RuntimeException( e ); + } + } + + + @Override + public AdminOverviewResponse getOverview( Administrator admin ) + { + AdminOverview overview = this.adminDao.getOverview( admin.getId( ) ); + if ( !admin.hasPrivilege( Privileges.NAME ) ) { + overview.setPendingNames( null ); + } + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + overview.setPendingBans( null ); + } + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + overview.setPendingBugs( null ); + overview.setOpenBugs( null ); + overview.setUpdatedBugs( null ); + } + return new AdminOverviewResponse( admin , overview ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansDAOBean.java new file mode 100644 index 0000000..ec5f1a9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansDAOBean.java @@ -0,0 +1,284 @@ +package com.deepclone.lw.beans.admin; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.bans.ArchivedBanRequest; +import com.deepclone.lw.cmd.admin.bans.BanRequest; +import com.deepclone.lw.cmd.admin.bans.BanType; +import com.deepclone.lw.cmd.admin.bans.SummaryEntry; +import com.deepclone.lw.cmd.admin.bans.ValidatedBanRequest; +import com.deepclone.lw.interfaces.admin.BanMailData; +import com.deepclone.lw.interfaces.admin.BansDAO; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.StoredProc; + + + +public class BansDAOBean + implements BansDAO +{ + private static final String sGetPending = "SELECT * FROM admin.pending_bans ORDER BY requested DESC"; + private static final String sGetArchived = "SELECT * FROM admin.cancelled_bans ORDER BY updated DESC"; + private static final String sGetValidated = "SELECT * FROM admin.active_bans ORDER BY updated DESC"; + private static final String sGetBan = "SELECT * FROM admin.active_bans WHERE account_mail = ?"; + + private static abstract class BanRequestMapper< T extends BanRequest > + implements RowMapper< T > + { + protected void getCommonData( BanRequest br , ResultSet rs ) + throws SQLException + { + br.setId( rs.getInt( "id" ) ); + br.setRequestedById( rs.getInt( "requested_by_id" ) ); + br.setRequestedByName( rs.getString( "requested_by_name" ) ); + br.setAccountId( rs.getInt( "account_id" ) ); + br.setAccountMail( rs.getString( "account_mail" ) ); + br.setTimestamp( rs.getTimestamp( "requested" ) ); + br.setReason( rs.getString( "reason" ) ); + } + } + + private SimpleJdbcTemplate dTemplate; + + private final BanRequestMapper< BanRequest > mPending; + private final BanRequestMapper< BanRequest > mArchived; + private final BanRequestMapper< BanRequest > mValidated; + private final RowMapper< Boolean > mBoolean; + + private StoredProc fRequestBanAddress; + private StoredProc fRequestBanEmpire; + private StoredProc fRejectBan; + private StoredProc fValidateBan; + private StoredProc fLiftBan; + + + public BansDAOBean( ) + { + this.mPending = new BanRequestMapper< BanRequest >( ) { + @Override + public BanRequest mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BanRequest br = new BanRequest( ); + this.getCommonData( br , rs ); + return br; + } + }; + this.mArchived = new BanRequestMapper< BanRequest >( ) { + @Override + public BanRequest mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ArchivedBanRequest br = new ArchivedBanRequest( ); + this.getCommonData( br , rs ); + br.setUpdate( rs.getTimestamp( "updated" ) ); + br.setExpired( rs.getBoolean( "expired" ) ); + if ( !br.isExpired( ) ) { + br.setRejectedById( rs.getInt( "rejected_by_id" ) ); + br.setRejectedByName( rs.getString( "rejected_by_name" ) ); + br.setRejectionReason( rs.getString( "rejection_reason" ) ); + } + return br; + } + }; + this.mValidated = new BanRequestMapper< BanRequest >( ) { + @Override + public BanRequest mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ValidatedBanRequest br = new ValidatedBanRequest( ); + this.getCommonData( br , rs ); + br.setUpdate( rs.getTimestamp( "updated" ) ); + br.setRedeemable( rs.getBoolean( "redeemable" ) ); + br.setValidatedById( rs.getInt( "validated_by_id" ) ); + br.setValidatedByName( rs.getString( "validated_by_name" ) ); + return br; + } + }; + this.mBoolean = new RowMapper< Boolean >( ) { + @Override + public Boolean mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return rs.getBoolean( 1 ); + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fRequestBanAddress = new StoredProc( dataSource , "admin" , "request_ban_on_address" ); + this.fRequestBanAddress.addParameter( "admin_id" , Types.INTEGER ); + this.fRequestBanAddress.addParameter( "user_address" , Types.VARCHAR ); + this.fRequestBanAddress.addParameter( "reason" , Types.VARCHAR ); + this.fRequestBanAddress.addOutput( "err_code" , Types.INTEGER ); + + this.fRequestBanEmpire = new StoredProc( dataSource , "admin" , "request_ban_on_empire" ); + this.fRequestBanEmpire.addParameter( "admin_id" , Types.INTEGER ); + this.fRequestBanEmpire.addParameter( "user_address" , Types.VARCHAR ); + this.fRequestBanEmpire.addParameter( "reason" , Types.VARCHAR ); + this.fRequestBanEmpire.addOutput( "err_code" , Types.INTEGER ); + + this.fRejectBan = new StoredProc( dataSource , "admin" , "reject_ban_request" ); + this.fRejectBan.addParameter( "admin_id" , Types.INTEGER ); + this.fRejectBan.addParameter( "request_id" , Types.INTEGER ); + this.fRejectBan.addParameter( "reason" , Types.VARCHAR ); + + this.fValidateBan = new StoredProc( dataSource , "admin" , "confirm_ban_request" ); + this.fValidateBan.addParameter( "admin_id" , Types.INTEGER ); + this.fValidateBan.addParameter( "request_id" , Types.INTEGER ); + this.fValidateBan.addOutput( "success" , Types.BOOLEAN ); + this.fValidateBan.addOutput( "addr" , Types.VARCHAR ); + this.fValidateBan.addOutput( "lang" , Types.VARCHAR ); + this.fValidateBan.addOutput( "r_txt" , Types.VARCHAR ); + + this.fLiftBan = new StoredProc( dataSource , "admin" , "lift_ban" ); + this.fLiftBan.addParameter( "admin_id" , Types.INTEGER ); + this.fLiftBan.addParameter( "request_id" , Types.INTEGER ); + this.fLiftBan.addOutput( "success" , Types.BOOLEAN ); + this.fLiftBan.addOutput( "addr" , Types.VARCHAR ); + this.fLiftBan.addOutput( "lang" , Types.VARCHAR ); + } + + + @Override + public List< SummaryEntry > getSummary( ) + { + List< SummaryEntry > result = new ArrayList< SummaryEntry >( 3 ); + final String names[] = { + "pending" , "cancelled" , "active" + }; + + for ( int i = 0 ; i < 3 ; i++ ) { + long count = this.dTemplate.queryForLong( "SELECT count(*) FROM admin." + names[ i ] + "_bans" ); + result.add( new SummaryEntry( BanType.values( )[ i ] , count ) ); + } + + return result; + } + + + @Override + public List< BanRequest > getPending( ) + { + return this.dTemplate.query( sGetPending , this.mPending ); + } + + + @Override + public List< BanRequest > getArchived( ) + { + return this.dTemplate.query( sGetArchived , this.mArchived ); + } + + + @Override + public List< BanRequest > getActive( ) + { + return this.dTemplate.query( sGetValidated , this.mValidated ); + } + + + private int requestBan( StoredProc fRequestBan , int administrator , String address , String reason ) + { + return (Integer) fRequestBan.execute( administrator , address , reason ).get( "err_code" ); + } + + + @Override + public int requestBan( int administrator , EmailAddress address , String reason ) + { + return this.requestBan( this.fRequestBanAddress , administrator , address.getAddress( ) , reason ); + } + + + @Override + public int requestBan( int administrator , String empire , String reason ) + { + return this.requestBan( this.fRequestBanEmpire , administrator , empire , reason ); + } + + + @Override + public void rejectBan( int administrator , int requestId , String reason ) + { + this.fRejectBan.execute( administrator , requestId , reason ); + } + + + @Override + public BanMailData validateBan( int administrator , int requestId ) + { + Map< String , Object > result = this.fValidateBan.execute( administrator , requestId ); + boolean success = (Boolean) result.get( "success" ); + if ( !success ) { + return null; + } + return new BanMailData( (String) result.get( "addr" ) , (String) result.get( "lang" ) , (String) result + .get( "r_txt" ) ); + } + + + @Override + public BanMailData liftBan( int administrator , int requestId ) + { + Map< String , Object > result = this.fLiftBan.execute( administrator , requestId ); + boolean success = (Boolean) result.get( "success" ); + if ( !success ) { + return null; + } + return new BanMailData( (String) result.get( "addr" ) , (String) result.get( "lang" ) ); + } + + + @Override + public void expireBanRequests( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT admin.expire_ban_requests( )" ); + } + + + @Override + public void expireWarnings( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT admin.expire_warnings( )" ); + } + + + @Override + public boolean finaliseBan( ) + { + String sql = "SELECT admin.delete_banned_empires( )"; + return this.dTemplate.queryForObject( sql , this.mBoolean ); + } + + + @Override + public ValidatedBanRequest getActiveBan( EmailAddress address ) + { + try { + return (ValidatedBanRequest) this.dTemplate.queryForObject( sGetBan , this.mValidated , address + .getAddress( ) ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorBean.java new file mode 100644 index 0000000..a04af93 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.admin; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.admin.BansDAO; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class BansProcessorBean + implements InitializingBean , DisposableBean +{ + + private Ticker ticker; + private BansProcessorTask task; + private TransactionTemplate tTemplate; + private BansDAO bansDao; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setBansDao( BansDAO bansDao ) + { + this.bansDao = bansDao; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.task = new BansProcessorTask( this.tTemplate , this.bansDao ); + this.ticker.registerTask( Frequency.LOW , "Bans processor" , this.task ); + } + + + @Override + public void destroy( ) + throws Exception + { + this.task = null; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorTask.java new file mode 100644 index 0000000..72c6077 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/BansProcessorTask.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.admin; + + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.admin.BansDAO; + + + +class BansProcessorTask + implements Runnable +{ + + private final TransactionTemplate tTemplate; + private final BansDAO bansDao; + + + public BansProcessorTask( TransactionTemplate tTemplate , BansDAO bansDao ) + { + this.tTemplate = tTemplate; + this.bansDao = bansDao; + } + + + @Override + public void run( ) + { + this.expire( ); + while ( this.finaliseBans( ) ) { + // EMPTY + } + } + + + private boolean finaliseBans( ) + { + return this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + return bansDao.finaliseBan( ); + } + } ); + } + + + private void expire( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + bansDao.expireBanRequests( ); + bansDao.expireWarnings( ); + } + } ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/IpBanBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/IpBanBean.java new file mode 100644 index 0000000..841c90d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/admin/IpBanBean.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.beans.admin; + + +import java.net.InetAddress; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.admin.IpBan; + + + +/** + * The IP Ban bean specifies a private map container to hold IP Address ban entries. It also + * provides a public method to check whether a specified IP address is banned and a public method to + * increaes the counter of a given IP address. + * + * @author tseeker + * + */ +public class IpBanBean + implements IpBan +{ + + /** + * Static class with the date the ban was last increased and the counter of times increased. + */ + private static class BanEntry + { + public Date lastIncrease = new Date( ); + public int counter = 1; + } + + /** Private HashMap containing current IP addresses and their associated BanEntry's */ + private final Map< InetAddress , BanEntry > entries = new HashMap< InetAddress , BanEntry >( ); + + + /** + * Checks if an IP address is banned. An address is banned if an entry already exists for it, if + * the ban's duration has been reset in the last hour and the IP address's counter has been + * increased 3 or more times. If the ban is more than an hour old it is removed. + */ + @Override + public boolean isBanned( InetAddress address ) + { + synchronized ( this.entries ) { + BanEntry entry = this.entries.get( address ); + if ( entry == null ) { + return false; + } + + if ( entry.lastIncrease.before( new Date( new Date( ).getTime( ) - 60 * 60 * 1000 ) ) ) { + this.entries.remove( address ); + return false; + } + + if ( entry.counter < 3 ) { + return false; + } + + entry.lastIncrease = new Date( ); + return true; + } + } + + + /** + * If the given IP address does not already have an entry associated with it, one is created for + * it. If it does, the entries counter is increased by 1. + */ + @Override + public void increaseBanCounter( InetAddress address ) + { + synchronized ( this.entries ) { + BanEntry entry = this.entries.get( address ); + if ( entry == null ) { + entry = new BanEntry( ); + this.entries.put( address , entry ); + return; + } + + entry.counter++; + entry.lastIncrease = new Date( ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/BoolPreferenceType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/BoolPreferenceType.java new file mode 100644 index 0000000..c379f10 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/BoolPreferenceType.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.beans.prefs; + + +class BoolPreferenceType + extends PreferenceTypeImpl< Boolean > +{ + + public BoolPreferenceType( ) + { + super( Boolean.class ); + } + + + @Override + public String convert( Object value ) + { + Boolean v = (Boolean) value; + return ( v != null && v ) ? "1" : "0"; + } + + + @Override + public Boolean valueOf( String dbValue , Class< Boolean > type ) + { + return "1".equals( dbValue ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/DefaultPreferencesBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/DefaultPreferencesBean.java new file mode 100644 index 0000000..3791181 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/DefaultPreferencesBean.java @@ -0,0 +1,79 @@ +package com.deepclone.lw.beans.prefs; + + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.player.gdata.MailPreference; +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.interfaces.prefs.PreferenceDefinitions; + + + +public class DefaultPreferencesBean + implements InitializingBean +{ + + private PreferenceDefinitions pDefs; + private PreferenceTypesRegistryBean registry; + + + @Autowired( required = true ) + public void setTypesRegistry( PreferenceTypesRegistryBean registry ) + { + this.registry = registry; + } + + + @Autowired( required = true ) + public void setPreferenceDefinitions( PreferenceDefinitions preferenceDefinitions ) + { + this.pDefs = preferenceDefinitions; + } + + + @Override + public void afterPropertiesSet( ) + throws Exception + { + this.createTypes( ); + + this.pDefs.registerGroup( "display" , "pgDisplay" ); + this.pDefs.registerPreference( "useRLTime" , "display" , "pUseRLTime" , "pUseRLTimeDescription" , + (Boolean) false ); + + this.pDefs.registerGroup( "map" , "pgMap" ); + this.pDefs.registerPreference( "mapX" , "map" , "pMapX" , "pMapXDescription" , (Integer) 0 ); + this.pDefs.registerPreference( "mapY" , "map" , "pMapY" , "pMapYDescription" , (Integer) 0 ); + this.pDefs.registerPreference( "mapSize" , "map" , "pMapSize" , "pMapSizeDescription" , MapSize.MEDIUM ); + + this.pDefs.registerGroup( "mail" , "pgMail" ); + this.pDefs.registerPreference( "mailOnPM" , "mail" , "pMailOnPM" , "pMailOnPMDescription" , + MailPreference.INSTANT ); + this.pDefs.registerPreference( "mailOnAlliance" , "mail" , "pMailOnAlliance" , "pMailOnAllianceDescription" , + MailPreference.DAILY_RECAP ); + this.pDefs.registerPreference( "mailOnIM" , "mail" , "pMailOnIM" , "pMailOnIMDescription" , + MailPreference.DAILY_RECAP ); + this.pDefs.registerPreference( "mailOnAdmin" , "mail" , "pMailOnAdmin" , "pMailOnAdminDescription" , + MailPreference.INSTANT ); + } + + + private void createTypes( ) + { + EnumPreferenceType< MapSize > mapSizeType; + mapSizeType = new EnumPreferenceType< MapSize >( MapSize.class ); + mapSizeType.setTranslation( MapSize.SMALL , "mapSizeSmall" ); + mapSizeType.setTranslation( MapSize.MEDIUM , "mapSizeMedium" ); + mapSizeType.setTranslation( MapSize.LARGE , "mapSizeLarge" ); + this.registry.register( mapSizeType ); + + EnumPreferenceType< MailPreference > mailPrefType; + mailPrefType = new EnumPreferenceType< MailPreference >( MailPreference.class ); + mailPrefType.setTranslation( MailPreference.NO_MAIL , "mailPrefNo" ); + mailPrefType.setTranslation( MailPreference.DAILY_RECAP , "mailPrefRecap" ); + mailPrefType.setTranslation( MailPreference.INSTANT , "mailPrefInstant" ); + this.registry.register( mailPrefType ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/EnumPreferenceType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/EnumPreferenceType.java new file mode 100644 index 0000000..6b221bf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/EnumPreferenceType.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.beans.prefs; + + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + + + +public class EnumPreferenceType< T > + extends PreferenceTypeImpl< T > +{ + + private SortedMap< T , String > choices = new TreeMap< T , String >( ); + + + public EnumPreferenceType( Class< T > type ) + { + super( type ); + if ( !type.isEnum( ) ) { + throw new IllegalArgumentException( "Enumerated type expected" ); + } + } + + + @Override + public Map< String , String > getChoices( ) + { + Map< String , String > r = new LinkedHashMap< String , String >( ); + for ( Map.Entry< T , String > entry : this.choices.entrySet( ) ) { + r.put( this.convert( entry.getKey( ) ) , entry.getValue( ) ); + } + return r; + } + + + public void setTranslation( T value , String textId ) + { + this.choices.put( value , textId ); + } + + + @Override + @SuppressWarnings( "unchecked" ) + public String convert( Object value ) + { + return ( (T) value ).toString( ); + } + + + @SuppressWarnings( "unchecked" ) + @Override + public T valueOf( String dbValue , Class< T > type ) + { + try { + return (T) type.getMethod( "valueOf" , String.class ).invoke( null , dbValue ); + } catch ( Exception e ) { + throw new RuntimeException( e ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/IntPreferenceType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/IntPreferenceType.java new file mode 100644 index 0000000..2ba13bf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/IntPreferenceType.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.beans.prefs; + + +class IntPreferenceType + extends PreferenceTypeImpl< Integer > +{ + + public IntPreferenceType( ) + { + super( Integer.class ); + } + + + @Override + public String convert( Object value ) + { + return ( value == null ) ? "0" : ( (Integer) value ).toString( ); + } + + + @Override + public Integer valueOf( String dbValue , Class< Integer > type ) + { + try { + return Integer.parseInt( dbValue ); + } catch ( NumberFormatException e ) { + return null; + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceDefinitionsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceDefinitionsBean.java new file mode 100644 index 0000000..05a1603 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceDefinitionsBean.java @@ -0,0 +1,278 @@ +package com.deepclone.lw.beans.prefs; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.player.gdata.account.PrefCategory; +import com.deepclone.lw.cmd.player.gdata.account.PrefChoice; +import com.deepclone.lw.cmd.player.gdata.account.PrefType; +import com.deepclone.lw.cmd.player.gdata.account.PrefValue; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.prefs.PreferenceDefinitionException; +import com.deepclone.lw.interfaces.prefs.PreferenceDefinitions; +import com.deepclone.lw.interfaces.prefs.PreferenceType; +import com.deepclone.lw.interfaces.prefs.PreferenceTypesRegistry; +import com.deepclone.lw.utils.StoredProc; + + + +public class PreferenceDefinitionsBean + implements PreferenceDefinitions +{ + private static class PrefDefRecord + { + final String groupName; + final String groupDisplay; + final String name; + final String dName; + final String dDescription; + final String type; + final String value; + + + public PrefDefRecord( ResultSet rs ) + throws SQLException + { + this.groupName = rs.getString( "group_name" ); + this.groupDisplay = rs.getString( "group_display" ); + this.name = rs.getString( "name" ); + this.dName = rs.getString( "d_name" ); + this.dDescription = rs.getString( "d_desc" ); + this.type = rs.getString( "java_type" ); + this.value = rs.getString( "default_value" ); + } + } + + private TransactionTemplate tTemplate; + private PreferenceTypesRegistry registry; + private SystemLogger logger; + private Translator translator; + + private SimpleJdbcTemplate dTemplate; + + private StoredProc uocGroup; + private StoredProc uocDef; + private StoredProc fSetDefault; + + private final RowMapper< PrefDefRecord > mPrefDef; + + + public PreferenceDefinitionsBean( ) + { + this.mPrefDef = new RowMapper< PrefDefRecord >( ) { + @Override + public PrefDefRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new PrefDefRecord( rs ); + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.uocGroup = new StoredProc( dataSource , "defs" , "uoc_preference_group" ); + this.uocGroup.addParameter( "name" , Types.VARCHAR ); + this.uocGroup.addParameter( "display" , Types.VARCHAR ); + this.uocGroup.addOutput( "success" , Types.BOOLEAN ); + + this.uocDef = new StoredProc( dataSource , "defs" , "uoc_preference" ); + this.uocDef.addParameter( "g_name" , Types.VARCHAR ); + this.uocDef.addParameter( "p_name" , Types.VARCHAR ); + this.uocDef.addParameter( "d_name" , Types.VARCHAR ); + this.uocDef.addParameter( "d_desc" , Types.VARCHAR ); + this.uocDef.addParameter( "j_type" , Types.VARCHAR ); + this.uocDef.addParameter( "d_val" , Types.VARCHAR ); + this.uocDef.addOutput( "err_code" , Types.INTEGER ); + + this.fSetDefault = new StoredProc( dataSource , "defs" , "set_preference_default" ); + this.fSetDefault.addParameter( "admin_id" , Types.INTEGER ); + this.fSetDefault.addParameter( "pref_name" , Types.VARCHAR ); + this.fSetDefault.addParameter( "default_value" , Types.VARCHAR ); + } + + + @Autowired( required = true ) + public void setTypesRegistry( PreferenceTypesRegistry registry ) + { + this.registry = registry; + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + } + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "PreferenceDefinitions" ); + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public void registerGroup( final String name , final String displayName ) + throws PreferenceDefinitionException + { + boolean success = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + return (Boolean) uocGroup.execute( name , displayName ).get( "success" ); + } + } ); + if ( !success ) { + throw new PreferenceDefinitionException( PreferenceDefinitionException.Error.MISSING_STRING ); + } + this.logger.log( LogLevel.DEBUG , "registered preference group '" + name + "'" ); + } + + + @Override + public void registerPreference( final String name , final String group , final String displayName , + final String displayDescription , final Object defaultValue ) + throws PreferenceDefinitionException + { + final Class< ? > type = defaultValue.getClass( ); + final PreferenceType< ? > pType = this.registry.getType( type ); + + int errCode = this.tTemplate.execute( new TransactionCallback< Integer >( ) { + @Override + public Integer doInTransaction( TransactionStatus status ) + { + return (Integer) uocDef.execute( group , name , displayName , displayDescription , + type.getSimpleName( ) , pType.convert( defaultValue ) ).get( "err_code" ); + } + } ); + + switch ( errCode ) { + case 0: + break; + case 1: + throw new PreferenceDefinitionException( PreferenceDefinitionException.Error.MISSING_GROUP ); + case 2: + throw new PreferenceDefinitionException( PreferenceDefinitionException.Error.MISSING_STRING ); + case 3: + throw new PreferenceDefinitionException( PreferenceDefinitionException.Error.INVALID_TYPE ); + default: + throw new RuntimeException( "unknown error code " + errCode ); + } + + this.logger.log( LogLevel.DEBUG , "registered preference '" + name + "' in group '" + group + "'" ); + } + + + private String translate( String strName ) + { + try { + return this.translator.translate( "en" , strName ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + } + + + @Override + @Transactional + public List< PrefCategory > getDefaults( ) + { + List< PrefCategory > categories = new LinkedList< PrefCategory >( ); + PrefCategory currentCategory = null; + String catName = ""; + for ( PrefDefRecord def : this.dTemplate.query( "SELECT * FROM defs.preferences_view" , this.mPrefDef ) ) { + // Make sure we're modifying the right category + if ( currentCategory == null || !def.groupName.equals( catName ) ) { + currentCategory = new PrefCategory( ); + catName = def.groupName; + currentCategory.setName( this.translate( def.groupDisplay ) ); + categories.add( currentCategory ); + } + + // Add value + PrefValue value = new PrefValue( ); + value.setId( def.name ); + value.setName( this.translate( def.dName ) ); + value.setDescription( this.translate( def.dDescription ) ); + value.setValue( def.value ); + + PreferenceType< ? > dType = this.registry.getType( def.type ); + if ( dType.getType( ) == String.class ) { + value.setType( PrefType.STRING ); + } else if ( dType.getType( ) == Integer.class ) { + value.setType( PrefType.INTEGER ); + } else if ( dType.getType( ) == Boolean.class ) { + value.setType( PrefType.BOOLEAN ); + } else { + Map< String , String > choices = dType.getChoices( ); + List< PrefChoice > cList = new LinkedList< PrefChoice >( ); + for ( Map.Entry< String , String > entry : choices.entrySet( ) ) { + cList.add( new PrefChoice( entry.getKey( ) , this.translate( entry.getValue( ) ) ) ); + } + value.setType( PrefType.CHOICE ); + value.setChoices( cList ); + } + + currentCategory.addValue( value ); + } + + return categories; + } + + + @Override + @Transactional + public void setDefault( Administrator admin , String preference , String value ) + { + String sql = "SELECT * FROM defs.preferences_view WHERE name = ?"; + PrefDefRecord def; + try { + def = this.dTemplate.queryForObject( sql , this.mPrefDef , preference ); + } catch ( EmptyResultDataAccessException e ) { + return; + } + + PreferenceType< ? > pType = this.registry.getType( def.type ); + Object inObject = pType.valueOf( value ); + if ( inObject != null ) { + String dbValue = pType.convert( inObject ); + this.fSetDefault.execute( admin.getId( ) , preference , dbValue ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypeImpl.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypeImpl.java new file mode 100644 index 0000000..7f9fc98 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypeImpl.java @@ -0,0 +1,42 @@ +package com.deepclone.lw.beans.prefs; + + +import java.util.Map; + +import com.deepclone.lw.interfaces.prefs.PreferenceType; + + + +abstract class PreferenceTypeImpl< T > + implements PreferenceType< T > +{ + + private final Class< T > type; + + + public PreferenceTypeImpl( Class< T > type ) + { + this.type = type; + } + + + @Override + public Object valueOf( String inValue ) + { + return this.valueOf( inValue , this.type ); + } + + + @Override + public Map< String , String > getChoices( ) + { + return null; + } + + + public Class< T > getType( ) + { + return type; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypesRegistryBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypesRegistryBean.java new file mode 100644 index 0000000..e10ff59 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferenceTypesRegistryBean.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.beans.prefs; + + +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.prefs.PreferenceType; +import com.deepclone.lw.interfaces.prefs.PreferenceTypesRegistry; + + + +public class PreferenceTypesRegistryBean + implements PreferenceTypesRegistry +{ + + private final Map< String , PreferenceType< ? >> types = new HashMap< String , PreferenceType< ? > >( ); + + + public PreferenceTypesRegistryBean( ) + { + this.register( new StringPreferenceType( ) ); + this.register( new IntPreferenceType( ) ); + this.register( new BoolPreferenceType( ) ); + } + + + void register( PreferenceType< ? > type ) + { + String name = type.getType( ).getSimpleName( ); + synchronized ( this.types ) { + if ( this.types.containsKey( name ) ) { + throw new IllegalArgumentException( "Type '" + name + "' already registered." ); + } + this.types.put( name , type ); + } + } + + + @Override + @SuppressWarnings( "unchecked" ) + public < T > PreferenceType< T > getType( Class< T > jType ) + { + PreferenceType< T > type; + synchronized ( this.types ) { + type = (PreferenceType< T >) this.types.get( jType.getSimpleName( ) ); + } + if ( type == null ) { + throw new IllegalArgumentException( "Type '" + jType.getSimpleName( ) + "' is not registered." ); + } + return type; + } + + + @Override + public PreferenceType< ? > getType( String typeName ) + { + PreferenceType< ? > type; + synchronized ( this.types ) { + type = (PreferenceType< ? >) this.types.get( typeName ); + } + if ( type == null ) { + throw new IllegalArgumentException( "Type '" + typeName + "' is not registered." ); + } + return type; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferencesDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferencesDAOBean.java new file mode 100644 index 0000000..6387587 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/PreferencesDAOBean.java @@ -0,0 +1,164 @@ +package com.deepclone.lw.beans.prefs; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.interfaces.prefs.AccountPreferences; +import com.deepclone.lw.interfaces.prefs.Preference; +import com.deepclone.lw.interfaces.prefs.PreferenceGroup; +import com.deepclone.lw.interfaces.prefs.PreferenceType; +import com.deepclone.lw.interfaces.prefs.PreferenceTypesRegistry; +import com.deepclone.lw.interfaces.prefs.PreferencesDAO; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.utils.StoredProc; + + + +public class PreferencesDAOBean + implements PreferencesDAO +{ + + private SimpleJdbcTemplate dTemplate; + private PreferenceTypesRegistry registry; + private StoredProc fReset; + private StoredProc fSetPref; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fReset = new StoredProc( dataSource , "users" , "reset_preferences" ); + this.fReset.addParameter( "a_id" , Types.INTEGER ); + + this.fSetPref = new StoredProc( dataSource , "users" , "set_preference" ); + this.fSetPref.addParameter( "a_id" , Types.INTEGER ); + this.fSetPref.addParameter( "p_name" , Types.VARCHAR ); + this.fSetPref.addParameter( "p_value" , Types.VARCHAR ); + } + + + @Autowired( required = true ) + public void setTypesRegistry( PreferenceTypesRegistry registry ) + { + this.registry = registry; + } + + + @Override + public AccountPreferences getPreferences( int accountId ) + { + String sql = "SELECT * FROM users.preferences_view WHERE account_id = ?"; + RowMapper< Map< String , String > > mapper = new RowMapper< Map< String , String > >( ) { + + @Override + public Map< String , String > mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + final String[] names = { + "group_name" , "group_i18n_name" , "pref_name" , "pref_i18n_name" , "pref_i18n_description" , + "pref_type" , "value" + }; + Map< String , String > data = new HashMap< String , String >( ); + for ( String n : names ) { + data.put( n , rs.getString( n ) ); + } + return data; + } + + }; + + List< PreferenceGroup > groups = new LinkedList< PreferenceGroup >( ); + Map< String , String > prefGroups = new HashMap< String , String >( ); + String last = null; + PreferenceGroup lg = null; + for ( Map< String , String > data : this.dTemplate.query( sql , mapper , accountId ) ) { + String gName = data.get( "group_name" ); + if ( last == null || !last.equals( gName ) ) { + lg = new PreferenceGroup( gName , data.get( "group_i18n_name" ) ); + groups.add( lg ); + last = gName; + } + + String pName = data.get( "pref_name" ); + prefGroups.put( pName , gName ); + + PreferenceType< ? > prefType = this.registry.getType( data.get( "pref_type" ) ); + + new Preference( pName , lg , data.get( "pref_i18n_name" ) , data.get( "pref_i18n_description" ) , prefType , + data.get( "value" ) ); + } + + return new AccountPreferences( groups , prefGroups ); + } + + + @Override + public AccountPreferences getPreferences( Account account ) + { + return this.getPreferences( account.getId( ) ); + } + + + @Override + public void setPreferences( Account account , Map< String , String > values ) + { + String sql = "SELECT pref_name , pref_type FROM users.preferences_view WHERE account_id = ?"; + RowMapper< Map< String , String > > mapper = new RowMapper< Map< String , String > >( ) { + + @Override + public Map< String , String > mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + final String[] names = { + "pref_name" , "pref_type" + }; + Map< String , String > data = new HashMap< String , String >( ); + for ( String n : names ) { + data.put( n , rs.getString( n ) ); + } + return data; + } + + }; + + for ( Map< String , String > def : this.dTemplate.query( sql , mapper , account.getId( ) ) ) { + String pName = def.get( "pref_name" ); + PreferenceType< ? > pType = this.registry.getType( def.get( "pref_type" ) ); + + String inValue = values.get( pName ); + if ( inValue == null ) { + continue; + } + + Object inObject = pType.valueOf( inValue ); + if ( inObject == null ) { + continue; + } + + String dbValue = pType.convert( inObject ); + this.fSetPref.execute( account.getId( ) , pName , dbValue ); + } + } + + + @Override + public void resetPreferences( Account account ) + { + this.fReset.execute( account.getId( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/StringPreferenceType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/StringPreferenceType.java new file mode 100644 index 0000000..72c1af9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/java/com/deepclone/lw/beans/prefs/StringPreferenceType.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.beans.prefs; + + +class StringPreferenceType + extends PreferenceTypeImpl< String > +{ + + public StringPreferenceType( ) + { + super( String.class ); + } + + + @Override + public String convert( Object value ) + { + return ( value == null ) ? "" : (String) value; + } + + + @Override + public String valueOf( String dbValue , Class< String > type ) + { + return dbValue; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts-beans.xml new file mode 100644 index 0000000..bd7ec9b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts-beans.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-cleanup-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-cleanup-bean.xml new file mode 100644 index 0000000..e1c6a61 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-cleanup-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-management-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-management-bean.xml new file mode 100644 index 0000000..6062c6a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/account-management-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-dao-bean.xml new file mode 100644 index 0000000..8640f69 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-recap-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-recap-bean.xml new file mode 100644 index 0000000..4d609ab --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/admin-recap-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/administration-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/administration-bean.xml new file mode 100644 index 0000000..1039d63 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/administration-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-dao-bean.xml new file mode 100644 index 0000000..f654c86 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-processor-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-processor-bean.xml new file mode 100644 index 0000000..4167e63 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/bans-processor-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/default-preferences-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/default-preferences-bean.xml new file mode 100644 index 0000000..e7bca93 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/default-preferences-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/ip-ban-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/ip-ban-bean.xml new file mode 100644 index 0000000..2c70cf8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/ip-ban-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preference-definitions-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preference-definitions-bean.xml new file mode 100644 index 0000000..73dfc57 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preference-definitions-bean.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preferences-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preferences-dao-bean.xml new file mode 100644 index 0000000..42926c3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/preferences-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/quit-processor-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/quit-processor-bean.xml new file mode 100644 index 0000000..a571d09 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/quit-processor-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/requests-expiration-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/requests-expiration-bean.xml new file mode 100644 index 0000000..f4525e4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/requests-expiration-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/user-session-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/user-session-dao-bean.xml new file mode 100644 index 0000000..0c7e785 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/user-session-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/users-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/users-dao-bean.xml new file mode 100644 index 0000000..817940f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/users-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/vacation-processor-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/vacation-processor-bean.xml new file mode 100644 index 0000000..2c67fea --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-accounts/src/main/resources/configuration/accounts/vacation-processor-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.project new file mode 100644 index 0000000..6701380 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-bt + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1e525bc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Tue Apr 13 08:30:06 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..12bb0a0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Tue Apr 13 08:30:04 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/pom.xml new file mode 100644 index 0000000..35ab5e4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/pom.xml @@ -0,0 +1,25 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + + + + com.thoughtworks.xstream + xstream + ${com.thoughtworks.xstream.version} + jar + + + + + com.deepclone.lw + legacyworlds-server-beans-bt + 5.99.1 + Legacy Worlds bug tracking system + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/AdminBugsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/AdminBugsBean.java new file mode 100644 index 0000000..bdb6dc4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/AdminBugsBean.java @@ -0,0 +1,179 @@ +package com.deepclone.lw.beans.bt; + + +import java.util.Iterator; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.bt.BugsSummaryResponse; +import com.deepclone.lw.cmd.admin.bt.GetSnapshotResponse; +import com.deepclone.lw.cmd.admin.bt.ListBugsResponse; +import com.deepclone.lw.cmd.admin.bt.MergeError; +import com.deepclone.lw.cmd.admin.bt.MergeReportsResponse; +import com.deepclone.lw.cmd.admin.bt.PostCommentResponse; +import com.deepclone.lw.cmd.admin.bt.ReportBugResponse; +import com.deepclone.lw.cmd.admin.bt.ViewBugResponse; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugEventType; +import com.deepclone.lw.cmd.bt.data.BugReport; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.bt.BugsDAO; + + + +@Transactional +public class AdminBugsBean + implements AdminBugs +{ + + private BugsDAO bugsDao; + + + @Autowired( required = true ) + public void setBugsDao( BugsDAO bugsDao ) + { + this.bugsDao = bugsDao; + } + + + private List< BugEvent > getBugEvents( long bugId ) + { + List< BugEvent > events = this.bugsDao.getEvents( bugId ); + Iterator< BugEvent > it = events.iterator( ); + BugStatus status = BugStatus.PENDING; + boolean pub = false; + while ( it.hasNext( ) ) { + BugEvent event = it.next( ); + if ( event.getType( ) == BugEventType.STATUS ) { + if ( event.getStatus( ) == status ) { + it.remove( ); + } else { + status = event.getStatus( ); + } + } else if ( event.getType( ) == BugEventType.VISIBILITY ) { + if ( event.getVisible( ) == pub ) { + it.remove( ); + } else { + pub = event.getVisible( ); + } + } + } + + return events; + } + + + @Override + public BugsSummaryResponse getSummary( Administrator admin ) + { + long pending = this.bugsDao.countReports( admin , BugStatus.PENDING , false ); + long open = this.bugsDao.countReports( admin , BugStatus.OPEN , false ); + long own = this.bugsDao.countReports( admin , null , true ); + long updated = this.bugsDao.countUpdatedReports( admin ); + long total = this.bugsDao.countReports( admin , null , false ); + return new BugsSummaryResponse( admin , pending , open , own , updated , total ); + } + + + @Override + public ListBugsResponse getBugs( Administrator admin , BugStatus status , boolean ownOnly , long first , int count ) + { + long nBugs = this.bugsDao.countReports( admin , status , ownOnly ); + List< BugReport > bugs = this.bugsDao.getReports( admin , status , ownOnly , first , count ); + return new ListBugsResponse( admin , status , ownOnly , first , count , nBugs , bugs ); + } + + + @Override + public ReportBugResponse postReport( Administrator admin , String title , String contents , boolean publicReport ) + { + long bugId = this.bugsDao.postReport( admin , title , contents , publicReport ); + return new ReportBugResponse( admin , bugId ); + } + + + @Override + public ViewBugResponse getReport( Administrator admin , long bugId ) + { + BugReport report = this.bugsDao.getReport( admin , bugId ); + if ( report == null ) { + return new ViewBugResponse( admin , false ); + } + + return new ViewBugResponse( admin , report , this.getBugEvents( bugId ) ); + } + + + @Override + public PostCommentResponse postComment( Administrator admin , long bugId , String comment , boolean publicComment ) + { + this.bugsDao.postComment( admin , bugId , comment , publicComment ); + return new PostCommentResponse( admin ); + } + + + @Override + public void moderateComment( Administrator admin , long commentId , boolean validation ) + { + if ( validation ) { + this.bugsDao.showComment( admin , commentId ); + } else { + this.bugsDao.deleteComment( admin , commentId ); + } + } + + + @Override + public void validateReport( Administrator admin , long bugId , BugStatus status , boolean publicReport , + int credits , boolean snapshot ) + { + this.bugsDao.validateReport( admin , bugId , status , publicReport , credits , snapshot ); + } + + + @Override + public void setStatus( Administrator admin , long bugId , BugStatus status ) + { + this.bugsDao.setStatus( admin , bugId , status ); + } + + + @Override + public void toggleVisibility( Administrator admin , long bugId ) + { + this.bugsDao.toggleVisibility( admin , bugId ); + } + + + @Override + public MergeReportsResponse mergeReports( Administrator admin , long id , long mergeId ) + { + int errCode = this.bugsDao.mergeReports( admin , id , mergeId ); + if ( errCode == 0 ) { + return new MergeReportsResponse( admin ); + } + + BugReport report = this.bugsDao.getReport( admin , id ); + if ( report == null ) { + return new MergeReportsResponse( admin , false ); + } + + return new MergeReportsResponse( admin , report , this.getBugEvents( id ) , + MergeError.values( )[ errCode - 1 ] , mergeId ); + } + + + @Override + public GetSnapshotResponse getSnapshot( Administrator admin , long bugId ) + { + String snapshot = this.bugsDao.getSnapshot( bugId ); + if ( snapshot == null ) { + return new GetSnapshotResponse( admin , false ); + } + return new GetSnapshotResponse( admin , snapshot ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/BugsDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/BugsDAOBean.java new file mode 100644 index 0000000..8f5c37e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/BugsDAOBean.java @@ -0,0 +1,395 @@ +package com.deepclone.lw.beans.bt; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.*; +import com.deepclone.lw.interfaces.bt.BugsDAO; +import com.deepclone.lw.utils.StoredProc; + + + +public class BugsDAOBean + implements BugsDAO +{ + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< BugReport > mBugReport; + private final RowMapper< BugEvent > mBugEvent; + private final RowMapper< String > mString; + + private StoredProc fPostUserReport; + private StoredProc fPostAdminReport; + private StoredProc fPostUserComment; + private StoredProc fPostAdminComment; + private StoredProc fShowComment; + private StoredProc fDeleteComment; + private StoredProc fValidateReport; + private StoredProc fSetStatus; + private StoredProc fToggleVisibility; + private StoredProc fMerge; + + + public BugsDAOBean( ) + { + this.mBugReport = new RowMapper< BugReport >( ) { + @Override + public BugReport mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BugSubmitter sub; + BugReport br = new BugReport( ); + + br.setReportId( rs.getLong( "bug_report_id" ) ); + br.setTitle( rs.getString( "title" ) ); + br.setPosted( rs.getTimestamp( "posted" ) ); + br.setVisible( rs.getBoolean( "visible" ) ); + br.setStatus( BugStatus.valueOf( rs.getString( "status" ) ) ); + br.setLastUpdate( rs.getTimestamp( "last_update" ) ); + br.setUpdated( rs.getBoolean( "updated" ) ); + + sub = new BugSubmitter( ); + sub.setAdmin( rs.getBoolean( "initial_submitter_admin" ) ); + sub.setName( rs.getString( "initial_submitter_name" ) ); + sub.setUserId( (Integer) rs.getObject( "initial_submitter_uid" ) ); + br.setInitialSubmitter( sub ); + + sub = new BugSubmitter( ); + sub.setAdmin( rs.getBoolean( "last_submitter_admin" ) ); + sub.setName( rs.getString( "last_submitter_name" ) ); + sub.setUserId( (Integer) rs.getObject( "last_submitter_uid" ) ); + br.setLatestSubmitter( sub ); + + return br; + } + }; + this.mBugEvent = new RowMapper< BugEvent >( ) { + @Override + public BugEvent mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BugSubmitter sub; + BugEvent be = new BugEvent( ); + + be.setId( rs.getLong( "event_id" ) ); + be.setType( BugEventType.valueOf( rs.getString( "event_type" ) ) ); + be.setTimestamp( rs.getTimestamp( "event_timestamp" ) ); + be.setTitle( rs.getString( "title" ) ); + be.setContents( rs.getString( "contents" ) ); + BugEventType type = be.getType( ); + switch ( type ) { + case STATUS: + be.setStatus( BugStatus.valueOf( rs.getString( "status" ) ) ); + break; + + case COMMENT: + case VISIBILITY: + case INIT: + be.setVisible( rs.getBoolean( "visible" ) ); + break; + + case MERGE: + be.setMergedId( rs.getLong( "merged_report_id" ) ); + break; + } + + sub = new BugSubmitter( ); + sub.setAdmin( rs.getBoolean( "submitter_admin" ) ); + sub.setName( rs.getString( "submitter_name" ) ); + sub.setUserId( (Integer) rs.getObject( "submitter_uid" ) ); + be.setSubmitter( sub ); + + return be; + } + }; + this.mString = new RowMapper< String >( ) { + @Override + public String mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return rs.getString( 1 ); + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fPostUserReport = new StoredProc( dataSource , "bugs" , "post_player_report" ); + this.fPostUserReport.addParameter( "empire_id" , Types.INTEGER ); + this.fPostUserReport.addParameter( "title" , Types.VARCHAR ); + this.fPostUserReport.addParameter( "description" , Types.VARCHAR ); + this.fPostUserReport.addParameter( "extra" , Types.VARCHAR ); + this.fPostUserReport.addOutput( "report_id" , Types.BIGINT ); + this.fPostUserReport.addOutput( "group_id" , Types.BIGINT ); + + this.fPostAdminReport = new StoredProc( dataSource , "bugs" , "post_admin_report" ); + this.fPostAdminReport.addParameter( "admin_id" , Types.INTEGER ); + this.fPostAdminReport.addParameter( "title" , Types.VARCHAR ); + this.fPostAdminReport.addParameter( "description" , Types.VARCHAR ); + this.fPostAdminReport.addParameter( "public_report" , Types.BOOLEAN ); + this.fPostAdminReport.addOutput( "report_id" , Types.BIGINT ); + this.fPostAdminReport.addOutput( "group_id" , Types.BIGINT ); + + this.fPostUserComment = new StoredProc( dataSource , "bugs" , "post_player_comment" ); + this.fPostUserComment.addParameter( "empire_id" , Types.INTEGER ); + this.fPostUserComment.addParameter( "report_id" , Types.BIGINT ); + this.fPostUserComment.addParameter( "comment" , Types.VARCHAR ); + + this.fPostAdminComment = new StoredProc( dataSource , "bugs" , "post_admin_comment" ); + this.fPostAdminComment.addParameter( "admin_id" , Types.INTEGER ); + this.fPostAdminComment.addParameter( "report_id" , Types.BIGINT ); + this.fPostAdminComment.addParameter( "comment" , Types.VARCHAR ); + this.fPostAdminComment.addParameter( "public_comment" , Types.BOOLEAN ); + + this.fShowComment = new StoredProc( dataSource , "bugs" , "show_comment" ); + this.fShowComment.addParameter( "admin_id" , Types.INTEGER ); + this.fShowComment.addParameter( "comment_id" , Types.BIGINT ); + + this.fDeleteComment = new StoredProc( dataSource , "bugs" , "delete_comment" ); + this.fDeleteComment.addParameter( "admin_id" , Types.INTEGER ); + this.fDeleteComment.addParameter( "comment_id" , Types.BIGINT ); + + this.fValidateReport = new StoredProc( dataSource , "bugs" , "validate_report" ); + this.fValidateReport.addParameter( "admin_id" , Types.INTEGER ); + this.fValidateReport.addParameter( "report_id" , Types.BIGINT ); + this.fValidateReport.addParameter( "new_status" , "bug_status_type" ); + this.fValidateReport.addParameter( "public_report" , Types.BOOLEAN ); + this.fValidateReport.addParameter( "grant_credits" , Types.INTEGER ); + this.fValidateReport.addParameter( "keep_snapshot" , Types.BOOLEAN ); + + this.fSetStatus = new StoredProc( dataSource , "bugs" , "set_report_status" ); + this.fSetStatus.addParameter( "admin_id" , Types.INTEGER ); + this.fSetStatus.addParameter( "report_id" , Types.BIGINT ); + this.fSetStatus.addParameter( "new_status" , "bug_status_type" ); + + this.fToggleVisibility = new StoredProc( dataSource , "bugs" , "toggle_report_visibility" ); + this.fToggleVisibility.addParameter( "admin_id" , Types.INTEGER ); + this.fToggleVisibility.addParameter( "report_id" , Types.BIGINT ); + + this.fMerge = new StoredProc( dataSource , "bugs" , "merge_reports" ); + this.fMerge.addParameter( "admin_id" , Types.INTEGER ); + this.fMerge.addParameter( "report1_id" , Types.BIGINT ); + this.fMerge.addParameter( "report2_id" , Types.BIGINT ); + this.fMerge.addOutput( "err_code" , Types.INTEGER ); + } + + + @Override + public long countReports( int empireId , BugStatus status , boolean ownOnly ) + { + StringBuilder builder = new StringBuilder( ); + List< Object > qData = new ArrayList< Object >( ); + qData.add( (Integer) empireId ); + + builder.append( "SELECT count(*) FROM bugs.br_user_view WHERE empire_id = ?" ); + this.addQueryParameters( builder , qData , status , ownOnly ); + + Object[] args = qData.toArray( ); + return this.dTemplate.queryForLong( builder.toString( ) , args ); + } + + + @Override + public long countReports( Administrator admin , BugStatus status , boolean ownOnly ) + { + StringBuilder builder = new StringBuilder( ); + List< Object > qData = new ArrayList< Object >( ); + qData.add( (Integer) admin.getId( ) ); + + builder.append( "SELECT count(*) FROM bugs.br_admin_view WHERE administrator_id = ?" ); + this.addQueryParameters( builder , qData , status , ownOnly ); + + Object[] args = qData.toArray( ); + return this.dTemplate.queryForLong( builder.toString( ) , args ); + } + + + @Override + public long countUpdatedReports( Administrator admin ) + { + String sql = "SELECT count(*) FROM bugs.br_admin_view WHERE administrator_id = ? AND updated"; + return this.dTemplate.queryForLong( sql , admin.getId( ) ); + } + + + @Override + public List< BugReport > getReports( int empireId , BugStatus status , boolean ownOnly , long first , int count ) + { + StringBuilder builder = new StringBuilder( ).append( "SELECT * FROM bugs.br_user_view WHERE empire_id = ?" ); + List< Object > qData = new ArrayList< Object >( ); + qData.add( (Integer) empireId ); + + this.addQueryParameters( builder , qData , status , ownOnly ); + this.addWindowParameters( builder , qData , first , count ); + + Object[] args = qData.toArray( ); + return this.dTemplate.query( builder.toString( ) , this.mBugReport , args ); + } + + + @Override + public List< BugReport > getReports( Administrator admin , BugStatus status , boolean ownOnly , long first , + int count ) + { + StringBuilder builder = new StringBuilder( ); + List< Object > qData = new ArrayList< Object >( ); + qData.add( (Integer) admin.getId( ) ); + + builder.append( "SELECT * FROM bugs.br_admin_view WHERE administrator_id = ?" ); + this.addQueryParameters( builder , qData , status , ownOnly ); + this.addWindowParameters( builder , qData , first , count ); + + Object[] args = qData.toArray( ); + return this.dTemplate.query( builder.toString( ) , this.mBugReport , args ); + } + + + private void addQueryParameters( StringBuilder builder , List< Object > qData , BugStatus status , boolean ownOnly ) + { + if ( status != null ) { + builder.append( " AND status = ?" ); + qData.add( status.toString( ) ); + } + if ( ownOnly ) { + builder.append( " AND own_report" ); + } + } + + + private void addWindowParameters( StringBuilder builder , List< Object > qData , long first , int count ) + { + builder.append( " ORDER BY last_update DESC , bug_report_id DESC OFFSET ? LIMIT ?" ); + qData.add( (Long) first ); + qData.add( (Integer) count ); + } + + + @Override + public BugReport getReport( int empireId , long reportId ) + { + return this.getReport( "player" , empireId , reportId ); + } + + + @Override + public BugReport getReport( Administrator admin , long reportId ) + { + return this.getReport( "admin" , admin.getId( ) , reportId ); + } + + + private BugReport getReport( String viewerType , int viewerId , long reportId ) + { + String sql = "SELECT * FROM bugs.read_" + viewerType + "_report( ? , ? )"; + try { + return this.dTemplate.queryForObject( sql , this.mBugReport , viewerId , reportId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public long postReport( int empireId , String title , String contents , String extra ) + { + return (Long) this.fPostUserReport.execute( empireId , title , contents , extra ).get( "report_id" ); + } + + + @Override + public long postReport( Administrator admin , String title , String contents , boolean publicReport ) + { + return (Long) this.fPostAdminReport.execute( admin.getId( ) , title , contents , publicReport ).get( + "report_id" ); + } + + + @Override + public void postComment( int empireId , long reportId , String comment ) + { + this.fPostUserComment.execute( empireId , reportId , comment ); + } + + + @Override + public void postComment( Administrator admin , long reportId , String comment , boolean publicComment ) + { + this.fPostAdminComment.execute( admin.getId( ) , reportId , comment , publicComment ); + } + + + @Override + public List< BugEvent > getEvents( long bugId ) + { + String sql = "SELECT * FROM bugs.br_events WHERE bug_report_id = ?"; + return this.dTemplate.query( sql , this.mBugEvent , bugId ); + } + + + @Override + public void showComment( Administrator admin , long commentId ) + { + this.fShowComment.execute( admin.getId( ) , commentId ); + } + + + @Override + public void deleteComment( Administrator admin , long commentId ) + { + this.fDeleteComment.execute( admin.getId( ) , commentId ); + } + + + @Override + public void validateReport( Administrator admin , long bugId , BugStatus status , boolean publicReport , + int credits , boolean snapshot ) + { + this.fValidateReport.execute( admin.getId( ) , bugId , status.toString( ) , publicReport , credits , snapshot ); + } + + + @Override + public void setStatus( Administrator admin , long bugId , BugStatus status ) + { + this.fSetStatus.execute( admin.getId( ) , bugId , status.toString( ) ); + } + + + @Override + public void toggleVisibility( Administrator admin , long bugId ) + { + this.fToggleVisibility.execute( admin.getId( ) , bugId ); + } + + + @Override + public int mergeReports( Administrator admin , long id , long mergeId ) + { + return (Integer) this.fMerge.execute( admin.getId( ) , id , mergeId ).get( "err_code" ); + } + + + @Override + public String getSnapshot( long bugId ) + { + String sql = "SELECT account_status FROM bugs.account_status_data WHERE event_id = ?"; + return this.dTemplate.queryForObject( sql , this.mString , bugId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/EmpireSummaryBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/EmpireSummaryBean.java new file mode 100644 index 0000000..07c8949 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/EmpireSummaryBean.java @@ -0,0 +1,240 @@ +package com.deepclone.lw.beans.bt; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.beans.bt.esdata.*; +import com.deepclone.lw.interfaces.bt.EmpireSummary; +import com.thoughtworks.xstream.XStream; + + + +public class EmpireSummaryBean + implements EmpireSummary +{ + + private SimpleJdbcTemplate dTemplate; + + private final XStream xStream; + + private final RowMapper< DebugInformation > mMainInfo; + private final RowMapper< ResearchInformation > mResearch; + private final RowMapper< PlanetInformation > mPlanet; + private final RowMapper< QueueItemInformation > mQueueItem; + private final RowMapper< BuildingsInformation > mBuildings; + private final RowMapper< FleetInformation > mFleet; + private final RowMapper< ShipsInformation > mShips; + + + public EmpireSummaryBean( ) + { + this.xStream = new XStream( ); + this.xStream.processAnnotations( new Class< ? >[] { + AccountInformation.class , AllianceInformation.class , BuildingsInformation.class , + DebugInformation.class , EmpireInformation.class , FleetInformation.class , MovementInformation.class , + PlanetInformation.class , QueueInformation.class , QueueItemInformation.class , + ResearchInformation.class , ShipsInformation.class , SystemInformation.class + } ); + + this.mMainInfo = new RowMapper< DebugInformation >( ) { + @Override + public DebugInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + DebugInformation di = new DebugInformation( ); + + di.getSystem( ).setNextTick( rs.getLong( "next_tick" ) ); + di.getSystem( ).setCurrentTick( (Long) rs.getObject( "current_tick" ) ); + + di.getAccount( ).setId( rs.getInt( "account_id" ) ); + di.getAccount( ).setAddress( rs.getString( "account_address" ) ); + di.getAccount( ).setGameCredits( rs.getInt( "game_credits" ) ); + di.getAccount( ).setStatus( rs.getString( "account_status" ) ); + di.getAccount( ).setLanguage( rs.getString( "account_language" ) ); + + di.getEmpire( ).setId( rs.getInt( "empire_id" ) ); + di.getEmpire( ).setName( rs.getString( "empire_name" ) ); + di.getEmpire( ).setCash( rs.getDouble( "cash" ) ); + + String allianceTag = rs.getString( "alliance_tag" ); + if ( allianceTag != null ) { + AllianceInformation alliance = new AllianceInformation( ); + alliance.setId( rs.getInt( "alliance_id" ) ); + alliance.setTag( allianceTag ); + alliance.setPending( rs.getBoolean( "alliance_pending" ) ); + di.getEmpire( ).setAlliance( alliance ); + } + + return di; + } + }; + this.mResearch = new RowMapper< ResearchInformation >( ) { + @Override + public ResearchInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ResearchInformation ri = new ResearchInformation( ); + ri.setId( rs.getInt( "line_id" ) ); + ri.setCurrentLevel( rs.getInt( "level" ) ); + ri.setLevelName( rs.getString( "name" ) ); + ri.setAccumulated( rs.getDouble( "accumulated" ) ); + return ri; + } + }; + this.mPlanet = new RowMapper< PlanetInformation >( ) { + @Override + public PlanetInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + PlanetInformation pi = new PlanetInformation( ); + pi.setId( rs.getInt( "planet_id" ) ); + pi.setPopulation( rs.getDouble( "population" ) ); + pi.setCurrentHappiness( rs.getDouble( "current_happiness" ) ); + pi.setTargetHappiness( rs.getDouble( "target_happiness" ) ); + pi.getCivilianQueue( ).setAccMoney( rs.getDouble( "civ_money" ) ); + pi.getCivilianQueue( ).setAccWork( rs.getDouble( "civ_work" ) ); + pi.getMilitaryQueue( ).setAccMoney( rs.getDouble( "mil_money" ) ); + pi.getMilitaryQueue( ).setAccWork( rs.getDouble( "mil_work" ) ); + return pi; + } + }; + this.mQueueItem = new RowMapper< QueueItemInformation >( ) { + @Override + public QueueItemInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + QueueItemInformation qii = new QueueItemInformation( ); + qii.setPlanetId( rs.getInt( "planet_id" ) ); + qii.setMilitary( rs.getBoolean( "military" ) ); + qii.setId( rs.getInt( "item_id" ) ); + qii.setName( rs.getString( "item_name" ) ); + qii.setDestroy( rs.getBoolean( "destroy" ) ); + qii.setAmount( rs.getInt( "amount" ) ); + return qii; + } + }; + this.mBuildings = new RowMapper< BuildingsInformation >( ) { + @Override + public BuildingsInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildingsInformation bi = new BuildingsInformation( ); + bi.setPlanetId( rs.getInt( "planet_id" ) ); + bi.setId( rs.getInt( "building_id" ) ); + bi.setName( rs.getString( "building_name" ) ); + bi.setAmount( rs.getInt( "amount" ) ); + bi.setDamage( rs.getDouble( "damage" ) ); + return bi; + } + }; + this.mFleet = new RowMapper< FleetInformation >( ) { + @Override + public FleetInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + FleetInformation fi = new FleetInformation( ); + fi.setId( rs.getLong( "fleet_id" ) ); + fi.setName( rs.getString( "fleet_name" ) ); + fi.setStatus( rs.getString( "status" ) ); + fi.setAttacking( rs.getBoolean( "attacking" ) ); + fi.setLocationId( rs.getInt( "location_id" ) ); + fi.setLocationName( rs.getString( "location_name" ) ); + + Integer sourceId = (Integer) rs.getObject( "source_id" ); + if ( sourceId != null ) { + MovementInformation mi = new MovementInformation( ); + mi.setSourceId( sourceId ); + mi.setSourceName( rs.getString( "source_name" ) ); + mi.setTimeLeft( rs.getInt( "time_left" ) ); + mi.setStateTimeLeft( rs.getInt( "state_time_left" ) ); + mi.setNearId( (Integer) rs.getObject( "ref_point_id" ) ); + mi.setNearName( rs.getString( "ref_point_name" ) ); + mi.setOutwards( (Boolean) rs.getObject( "outwards" ) ); + mi.setPastRefPoint( (Boolean) rs.getObject( "past_ref_point" ) ); + mi.setStartX( (Float) rs.getObject( "start_x" ) ); + mi.setStartY( (Float) rs.getObject( "start_y" ) ); + fi.setMovement( mi ); + } + + return fi; + } + }; + this.mShips = new RowMapper< ShipsInformation >( ) { + @Override + public ShipsInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ShipsInformation si = new ShipsInformation( ); + si.setFleetId( rs.getLong( "fleet_id" ) ); + si.setId( rs.getInt( "ship_id" ) ); + si.setName( rs.getString( "ship_name" ) ); + si.setAmount( rs.getInt( "amount" ) ); + si.setDamage( rs.getDouble( "damage" ) ); + return si; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + } + + + @Override + public String getSummary( int empireId ) + { + String sql = "SELECT * FROM bugs.dump_main_view WHERE empire_id = ?"; + DebugInformation di = this.dTemplate.queryForObject( sql , this.mMainInfo , empireId ); + + sql = "SELECT * FROM bugs.dump_research_view WHERE empire_id = ?"; + for ( ResearchInformation ri : this.dTemplate.query( sql , this.mResearch , empireId ) ) { + di.getResearch( ).add( ri ); + } + + sql = "SELECT * FROM bugs.dump_planets_view WHERE empire_id = ?"; + Map< Integer , PlanetInformation > planets = new HashMap< Integer , PlanetInformation >( ); + for ( PlanetInformation pi : this.dTemplate.query( sql , this.mPlanet , empireId ) ) { + di.getPlanets( ).add( pi ); + planets.put( pi.getId( ) , pi ); + } + + sql = "SELECT * FROM bugs.dump_queues_view WHERE empire_id = ? ORDER BY queue_order"; + for ( QueueItemInformation qii : this.dTemplate.query( sql , this.mQueueItem , empireId ) ) { + PlanetInformation pi = planets.get( qii.getPlanetId( ) ); + QueueInformation qi = ( qii.isMilitary( ) ? pi.getMilitaryQueue( ) : pi.getCivilianQueue( ) ); + qi.getItems( ).add( qii ); + } + + sql = "SELECT * FROM bugs.dump_buildings_view WHERE empire_id = ?"; + for ( BuildingsInformation bi : this.dTemplate.query( sql , this.mBuildings , empireId ) ) { + planets.get( bi.getPlanetId( ) ).getBuildings( ).add( bi ); + } + + sql = "SELECT * FROM bugs.dump_fleets_view WHERE empire_id = ?"; + Map< Long , FleetInformation > fleets = new HashMap< Long , FleetInformation >( ); + for ( FleetInformation fi : this.dTemplate.query( sql , this.mFleet , empireId ) ) { + di.getFleets( ).add( fi ); + fleets.put( fi.getId( ) , fi ); + } + + sql = "SELECT * FROM bugs.dump_ships_view WHERE empire_id = ?"; + for ( ShipsInformation si : this.dTemplate.query( sql , this.mShips , empireId ) ) { + fleets.get( si.getFleetId( ) ).getShips( ).add( si ); + } + + return this.xStream.toXML( di ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/PlayerBugsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/PlayerBugsBean.java new file mode 100644 index 0000000..29a3b8f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/PlayerBugsBean.java @@ -0,0 +1,114 @@ +package com.deepclone.lw.beans.bt; + + +import java.util.Iterator; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.bt.data.*; +import com.deepclone.lw.cmd.player.bt.*; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.interfaces.bt.*; +import com.deepclone.lw.interfaces.game.EmpireManagement; + + + +@Transactional +public class PlayerBugsBean + implements PlayerBugs +{ + private EmpireManagement empireMgr; + private BugsDAO bugsDao; + private EmpireSummary summary; + + + @Autowired( required = true ) + public void setBugsDao( BugsDAO bugsDao ) + { + this.bugsDao = bugsDao; + } + + + @Autowired( required = true ) + public void setEmpireMgr( EmpireManagement empireMgr ) + { + this.empireMgr = empireMgr; + } + + + @Autowired( required = true ) + public void setSummary( EmpireSummary summary ) + { + this.summary = summary; + } + + + @Override + public ListBugsResponse getBugs( int empireId , BugStatus status , boolean ownOnly , long first , int count ) + { + long nBugs = this.bugsDao.countReports( empireId , status , ownOnly ); + List< BugReport > bugs = this.bugsDao.getReports( empireId , status , ownOnly , first , count ); + GamePageData page = this.empireMgr.getGeneralInformation( empireId ); + return new ListBugsResponse( page , status , ownOnly , first , count , nBugs , bugs ); + } + + + @Override + public ReportBugResponse postReport( int empireId , String title , String desc ) + { + long bugId = this.bugsDao.postReport( empireId , title , desc , this.summary.getSummary( empireId ) ); + return new ReportBugResponse( this.empireMgr.getGeneralInformation( empireId ) , bugId ); + } + + + @Override + public ViewBugResponse getReport( int empireId , long bugId ) + { + GamePageData page = this.empireMgr.getGeneralInformation( empireId ); + + BugReport report = this.bugsDao.getReport( empireId , bugId ); + if ( report == null ) { + return new ViewBugResponse( page ); + } + + List< BugEvent > events = this.bugsDao.getEvents( bugId ); + Iterator< BugEvent > it = events.iterator( ); + BugStatus status = BugStatus.PENDING; + boolean pub = false; + while ( it.hasNext( ) ) { + BugEvent event = it.next( ); + BugEventType type = event.getType( ); + if ( type == BugEventType.STATUS ) { + if ( event.getStatus( ) == status ) { + it.remove( ); + } else { + status = event.getStatus( ); + } + } else if ( type == BugEventType.VISIBILITY ) { + if ( event.getVisible( ) == pub ) { + it.remove( ); + } else { + pub = event.getVisible( ); + } + } else if ( type == BugEventType.COMMENT && !event.getVisible( ) ) { + BugSubmitter submitter = event.getSubmitter( ); + if ( submitter.isAdmin( ) || submitter.getUserId( ) == null + || !page.getEmpire( ).equals( submitter.getName( ) ) ) { + it.remove( ); + } + } + } + return new ViewBugResponse( page , report , events ); + } + + + @Override + public PostCommentResponse postComment( int empireId , long reportId , String comment ) + { + this.bugsDao.postComment( empireId , reportId , comment ); + return new PostCommentResponse( this.empireMgr.getGeneralInformation( empireId ) , true ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AccountInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AccountInformation.java new file mode 100644 index 0000000..d6496e8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AccountInformation.java @@ -0,0 +1,98 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "account" ) +public class AccountInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "address" ) + private String address; + + @XStreamAsAttribute + @XStreamAlias( "language" ) + private String language; + + @XStreamAsAttribute + @XStreamAlias( "game-credits" ) + private int gameCredits; + + @XStreamAsAttribute + @XStreamAlias( "status" ) + private String status; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + + + public int getGameCredits( ) + { + return gameCredits; + } + + + public void setGameCredits( int gameCredits ) + { + this.gameCredits = gameCredits; + } + + + public String getStatus( ) + { + return status; + } + + + public void setStatus( String status ) + { + this.status = status; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AllianceInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AllianceInformation.java new file mode 100644 index 0000000..e156b4b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/AllianceInformation.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "alliance" ) +public class AllianceInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "tag" ) + private String tag; + + @XStreamAsAttribute + @XStreamAlias( "pending" ) + private boolean pending; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getTag( ) + { + return tag; + } + + + public void setTag( String tag ) + { + this.tag = tag; + } + + + public boolean isPending( ) + { + return pending; + } + + + public void setPending( boolean pending ) + { + this.pending = pending; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/BuildingsInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/BuildingsInformation.java new file mode 100644 index 0000000..61a9415 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/BuildingsInformation.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "building" ) +public class BuildingsInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private transient int planetId; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "name" ) + private String name; + + @XStreamAsAttribute + @XStreamAlias( "amount" ) + private int amount; + + @XStreamAsAttribute + @XStreamAlias( "damage" ) + private double damage; + + + public int getPlanetId( ) + { + return planetId; + } + + + public void setPlanetId( int planetId ) + { + this.planetId = planetId; + } + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + + + public double getDamage( ) + { + return damage; + } + + + public void setDamage( double damage ) + { + this.damage = damage; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/DebugInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/DebugInformation.java new file mode 100644 index 0000000..847fcb1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/DebugInformation.java @@ -0,0 +1,81 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "debug" ) +public class DebugInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "dump-version" ) + private int version = 1; + + private SystemInformation system = new SystemInformation( ); + + private AccountInformation account = new AccountInformation( ); + + private EmpireInformation empire = new EmpireInformation( ); + + @XStreamAlias( "research" ) + private List< ResearchInformation > research = new LinkedList< ResearchInformation >( ); + + @XStreamAlias( "planets" ) + private List< PlanetInformation > planets = new LinkedList< PlanetInformation >( ); + + @XStreamAlias( "fleets" ) + private List< FleetInformation > fleets = new LinkedList< FleetInformation >( ); + + + public int getVersion( ) + { + return version; + } + + + public SystemInformation getSystem( ) + { + return system; + } + + + public AccountInformation getAccount( ) + { + return account; + } + + + public EmpireInformation getEmpire( ) + { + return empire; + } + + + public List< ResearchInformation > getResearch( ) + { + return research; + } + + + public List< PlanetInformation > getPlanets( ) + { + return planets; + } + + + public List< FleetInformation > getFleets( ) + { + return fleets; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/EmpireInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/EmpireInformation.java new file mode 100644 index 0000000..94825fe --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/EmpireInformation.java @@ -0,0 +1,80 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "empire" ) +public class EmpireInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "name" ) + private String name; + + @XStreamAsAttribute + @XStreamAlias( "cash" ) + private double cash; + + private AllianceInformation alliance; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public double getCash( ) + { + return cash; + } + + + public void setCash( double cash ) + { + this.cash = cash; + } + + + public AllianceInformation getAlliance( ) + { + return alliance; + } + + + public void setAlliance( AllianceInformation alliance ) + { + this.alliance = alliance; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/FleetInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/FleetInformation.java new file mode 100644 index 0000000..d049007 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/FleetInformation.java @@ -0,0 +1,133 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "fleet" ) +public class FleetInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + private long id; + + @XStreamAsAttribute + private String name; + + @XStreamAsAttribute + private String status; + + @XStreamAsAttribute + private boolean attacking; + + @XStreamAlias( "location-id" ) + private int locationId; + + @XStreamAlias( "location-name" ) + private String locationName; + + @XStreamAlias( "ships" ) + private List< ShipsInformation > ships = new LinkedList< ShipsInformation >( ); + + private MovementInformation movement; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getStatus( ) + { + return status; + } + + + public void setStatus( String status ) + { + this.status = status; + } + + + public boolean isAttacking( ) + { + return attacking; + } + + + public void setAttacking( boolean attacking ) + { + this.attacking = attacking; + } + + + public int getLocationId( ) + { + return locationId; + } + + + public void setLocationId( int locationId ) + { + this.locationId = locationId; + } + + + public String getLocationName( ) + { + return locationName; + } + + + public void setLocationName( String locationName ) + { + this.locationName = locationName; + } + + + public MovementInformation getMovement( ) + { + return movement; + } + + + public void setMovement( MovementInformation movement ) + { + this.movement = movement; + } + + + public List< ShipsInformation > getShips( ) + { + return ships; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/MovementInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/MovementInformation.java new file mode 100644 index 0000000..b3f20a0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/MovementInformation.java @@ -0,0 +1,157 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + + + +@XStreamAlias( "movement" ) +public class MovementInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int sourceId; + + private String sourceName; + + private int timeLeft; + + private int stateTimeLeft; + + private Float startX; + + private Float startY; + + private Integer nearId; + + private String nearName; + + private Boolean outwards; + + private Boolean pastRefPoint; + + + public int getSourceId( ) + { + return sourceId; + } + + + public void setSourceId( int sourceId ) + { + this.sourceId = sourceId; + } + + + public String getSourceName( ) + { + return sourceName; + } + + + public void setSourceName( String sourceName ) + { + this.sourceName = sourceName; + } + + + public int getTimeLeft( ) + { + return timeLeft; + } + + + public void setTimeLeft( int timeLeft ) + { + this.timeLeft = timeLeft; + } + + + public int getStateTimeLeft( ) + { + return stateTimeLeft; + } + + + public void setStateTimeLeft( int stateTimeLeft ) + { + this.stateTimeLeft = stateTimeLeft; + } + + + public Float getStartX( ) + { + return startX; + } + + + public void setStartX( Float startX ) + { + this.startX = startX; + } + + + public Float getStartY( ) + { + return startY; + } + + + public void setStartY( Float startY ) + { + this.startY = startY; + } + + + public Integer getNearId( ) + { + return nearId; + } + + + public void setNearId( Integer nearId ) + { + this.nearId = nearId; + } + + + public String getNearName( ) + { + return nearName; + } + + + public void setNearName( String nearName ) + { + this.nearName = nearName; + } + + + public Boolean getOutwards( ) + { + return outwards; + } + + + public void setOutwards( Boolean outwards ) + { + this.outwards = outwards; + } + + + public Boolean getPastRefPoint( ) + { + return pastRefPoint; + } + + + public void setPastRefPoint( Boolean pastRefPoint ) + { + this.pastRefPoint = pastRefPoint; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/PlanetInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/PlanetInformation.java new file mode 100644 index 0000000..e2c10a9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/PlanetInformation.java @@ -0,0 +1,124 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "planet" ) +public class PlanetInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private String name; + + @XStreamAlias( "population" ) + private double population; + + @XStreamAlias( "current-happiness" ) + private double currentHappiness; + + @XStreamAlias( "target-happiness" ) + private double targetHappiness; + + @XStreamAlias( "buildings" ) + private List< BuildingsInformation > buildings = new LinkedList< BuildingsInformation >( ); + + @XStreamAlias( "civ-queue" ) + private QueueInformation civilianQueue = new QueueInformation( ); + + @XStreamAlias( "mil-queue" ) + private QueueInformation militaryQueue = new QueueInformation( ); + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public double getPopulation( ) + { + return population; + } + + + public void setPopulation( double population ) + { + this.population = population; + } + + + public double getCurrentHappiness( ) + { + return currentHappiness; + } + + + public void setCurrentHappiness( double currentHappiness ) + { + this.currentHappiness = currentHappiness; + } + + + public double getTargetHappiness( ) + { + return targetHappiness; + } + + + public void setTargetHappiness( double targetHappiness ) + { + this.targetHappiness = targetHappiness; + } + + + public List< BuildingsInformation > getBuildings( ) + { + return buildings; + } + + + public QueueInformation getCivilianQueue( ) + { + return civilianQueue; + } + + + public QueueInformation getMilitaryQueue( ) + { + return militaryQueue; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueInformation.java new file mode 100644 index 0000000..3aacd7a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueInformation.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +public class QueueInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "accumulated-work" ) + private double accWork; + + @XStreamAsAttribute + @XStreamAlias( "accumulated-money" ) + private double accMoney; + + @XStreamImplicit( itemFieldName = "item" ) + private List< QueueItemInformation > items = new LinkedList< QueueItemInformation >( ); + + + public double getAccWork( ) + { + return accWork; + } + + + public void setAccWork( double accWork ) + { + this.accWork = accWork; + } + + + public double getAccMoney( ) + { + return accMoney; + } + + + public void setAccMoney( double accMoney ) + { + this.accMoney = accMoney; + } + + + public List< QueueItemInformation > getItems( ) + { + return items; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueItemInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueItemInformation.java new file mode 100644 index 0000000..a96a3d2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/QueueItemInformation.java @@ -0,0 +1,108 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +public class QueueItemInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + transient private int planetId; + + transient private boolean military; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "name" ) + private String name; + + @XStreamAsAttribute + @XStreamAlias( "destroy" ) + private boolean destroy; + + @XStreamAsAttribute + @XStreamAlias( "amount" ) + private int amount; + + public int getPlanetId( ) + { + return planetId; + } + + + public void setPlanetId( int planetId ) + { + this.planetId = planetId; + } + + + public boolean isMilitary( ) + { + return military; + } + + + public void setMilitary( boolean military ) + { + this.military = military; + } + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public boolean isDestroy( ) + { + return destroy; + } + + + public void setDestroy( boolean destroy ) + { + this.destroy = destroy; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ResearchInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ResearchInformation.java new file mode 100644 index 0000000..69d9f63 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ResearchInformation.java @@ -0,0 +1,83 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "research-line" ) +public class ResearchInformation + implements Serializable + +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "line") + private int id; + + @XStreamAsAttribute + @XStreamAlias( "level") + private int currentLevel; + + @XStreamAsAttribute + @XStreamAlias( "name") + private String levelName; + + @XStreamAsAttribute + @XStreamAlias( "accumulated-points") + private double accumulated; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public int getCurrentLevel( ) + { + return currentLevel; + } + + + public void setCurrentLevel( int currentLevel ) + { + this.currentLevel = currentLevel; + } + + + public String getLevelName( ) + { + return levelName; + } + + + public void setLevelName( String levelName ) + { + this.levelName = levelName; + } + + + public double getAccumulated( ) + { + return accumulated; + } + + + public void setAccumulated( double accumulated ) + { + this.accumulated = accumulated; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ShipsInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ShipsInformation.java new file mode 100644 index 0000000..047ddfd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/ShipsInformation.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "ship-type" ) +public class ShipsInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + transient private long fleetId; + + @XStreamAsAttribute + @XStreamAlias( "id" ) + private int id; + + @XStreamAsAttribute + @XStreamAlias( "name" ) + private String name; + + @XStreamAsAttribute + @XStreamAlias( "amount" ) + private long amount; + + @XStreamAsAttribute + @XStreamAlias( "damage" ) + private double damage; + + + public long getFleetId( ) + { + return fleetId; + } + + + public void setFleetId( long fleetId ) + { + this.fleetId = fleetId; + } + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public long getAmount( ) + { + return amount; + } + + + public void setAmount( long amount ) + { + this.amount = amount; + } + + + public double getDamage( ) + { + return damage; + } + + + public void setDamage( double damage ) + { + this.damage = damage; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/SystemInformation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/SystemInformation.java new file mode 100644 index 0000000..1d51bca --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/java/com/deepclone/lw/beans/bt/esdata/SystemInformation.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.beans.bt.esdata; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@XStreamAlias( "system-info" ) +public class SystemInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + @XStreamAsAttribute + @XStreamAlias( "computing-tick" ) + private Long currentTick; + + @XStreamAsAttribute + @XStreamAlias( "next-tick" ) + private long nextTick; + + + public Long getCurrentTick( ) + { + return currentTick; + } + + + public void setCurrentTick( Long currentTick ) + { + this.currentTick = currentTick; + } + + + public long getNextTick( ) + { + return nextTick; + } + + + public void setNextTick( long nextTick ) + { + this.nextTick = nextTick; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt-beans.xml new file mode 100644 index 0000000..2673721 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt-beans.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/admin-bugs-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/admin-bugs-bean.xml new file mode 100644 index 0000000..5ddaaca --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/admin-bugs-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/bugs-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/bugs-dao-bean.xml new file mode 100644 index 0000000..3850ac1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/bugs-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/empire-summary-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/empire-summary-bean.xml new file mode 100644 index 0000000..bb9f28c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/empire-summary-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/player-bugs-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/player-bugs-bean.xml new file mode 100644 index 0000000..47c377f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-bt/src/main/resources/configuration/bt/player-bugs-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.project new file mode 100644 index 0000000..e52eaf0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-eventlog + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..82cc298 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:19:28 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/pom.xml new file mode 100644 index 0000000..0305043 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-eventlog + 5.99.1 + Legacy Worlds event log + This package is responsible for all logging in Legacy Worlds through three different beans (system event logger, admin event logger and user event logger). + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailBean.java new file mode 100644 index 0000000..59d9620 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailBean.java @@ -0,0 +1,80 @@ +package com.deepclone.lw.beans.eventlog; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class AdminErrorMailBean + implements InitializingBean , DisposableBean +{ + + private Ticker ticker; + private LogReader logReader; + private AdminDAO adminDao; + private TransactionTemplate tTemplate; + private Mailer mailer; + + private AdminErrorMailTask task; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setLogReader( LogReader logReader ) + { + this.logReader = logReader; + } + + + @Autowired( required = true ) + public void setAdminDao( AdminDAO adminDao ) + { + this.adminDao = adminDao; + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Override + public void afterPropertiesSet( ) + { + this.task = new AdminErrorMailTask( this.adminDao , this.logReader , this.mailer , this.tTemplate ); + this.ticker.registerTask( Frequency.LOW , "Admin error mail sender" , this.task ); + } + + + @Override + public void destroy( ) + { + this.task = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailTask.java new file mode 100644 index 0000000..bfb4f12 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/AdminErrorMailTask.java @@ -0,0 +1,135 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.text.SimpleDateFormat; +import java.util.LinkedList; +import java.util.List; + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.logs.ExceptionEntry; +import com.deepclone.lw.cmd.admin.logs.TraceEntry; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.eventlog.ExtendedLogEntry; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +class AdminErrorMailTask + implements Runnable +{ + private static class ErrorData + { + public final List< AdminRecord > administrators; + public final List< ExtendedLogEntry > logEntries; + + + public ErrorData( List< AdminRecord > administrators , List< ExtendedLogEntry > logEntries ) + { + this.administrators = administrators; + this.logEntries = logEntries; + } + + } + + private final TransactionTemplate tTemplate; + private final AdminDAO adminDao; + private final LogReader logReader; + private final Mailer mailer; + + + public AdminErrorMailTask( AdminDAO adminDao , LogReader logReader , Mailer mailer , TransactionTemplate tTemplate ) + { + this.adminDao = adminDao; + this.logReader = logReader; + this.mailer = mailer; + this.tTemplate = tTemplate; + } + + + @Override + public void run( ) + { + // Get errors and administrators + ErrorData errorData; + errorData = this.tTemplate.execute( new TransactionCallback< ErrorData >( ) { + @Override + public ErrorData doInTransaction( TransactionStatus status ) + { + return getErrorData( ); + } + } ); + + // No receiving administrators or no errors -> exit + if ( errorData.administrators.isEmpty( ) || errorData.logEntries.isEmpty( ) ) { + return; + } + + // Generate message contents + String message = this.buildMessage( errorData.logEntries ); + for ( AdminRecord admin : errorData.administrators ) { + try { + MailData mail = this.mailer.createMail( "en" , "adminErrorMail" , admin.getAddress( ) ); + mail.setData( "contents" , message ); + mail.queue( ); + } catch ( Exception e ) { + throw new RuntimeException( e ); + } + } + } + + + private ErrorData getErrorData( ) + { + List< AdminRecord > admins = new LinkedList< AdminRecord >( ); + for ( AdminRecord admin : this.adminDao.listAdministrators( ) ) { + if ( Privileges.BUGM.hasPrivilege( admin.getPrivileges( ) ) ) { + admins.add( admin ); + } + } + return new ErrorData( admins , this.logReader.getErrorEntries( ) ); + } + + + private String buildMessage( List< ExtendedLogEntry > logEntries ) + { + StringBuilder builder = new StringBuilder( ); + SimpleDateFormat dFmt = new SimpleDateFormat( "yyyy-MM-dd" ); + SimpleDateFormat tFmt = new SimpleDateFormat( "HH:mm:ss" ); + + for ( ExtendedLogEntry entry : logEntries ) { + builder.append( "Date: " ).append( dFmt.format( entry.logEntry.getTimestamp( ) ) ); + builder.append( "\nTime: " ).append( tFmt.format( entry.logEntry.getTimestamp( ) ) ); + builder.append( "\nComponent: " ).append( entry.logEntry.getAbout( ) ); + builder.append( "\nMessage: " ).append( entry.logEntry.getEntry( ) ).append( "\n" ); + + for ( ExceptionEntry eEntry : entry.exceptions ) { + builder.append( "\n " ).append( eEntry.getClassName( ) ); + if ( eEntry.getMessage( ) != null && !"".equals( eEntry ) ) { + builder.append( ": " ).append( eEntry.getMessage( ) ); + } + + int i = 0; + for ( TraceEntry tEntry : eEntry.getTrace( ) ) { + builder.append( "\n " ); + if ( i++ > 5 ) { + builder.append( "..." ); + break; + } + builder.append( tEntry.getLocation( ) ); + } + } + + builder.append( "\n\n\n" ); + } + + return builder.toString( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/EntryQueueItem.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/EntryQueueItem.java new file mode 100644 index 0000000..7e32ec8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/EntryQueueItem.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.beans.eventlog; + + +import com.deepclone.lw.sqld.sys.SystemLogEntry; + + + +/** + * Log writer queue entries only carry a log entry, which may be null to indicate that the log + * writer's task must be terminated. + * + * @author tseeker + */ +class EntryQueueItem +{ + + /** The log entry */ + final SystemLogEntry entry; + + + /** Initialises a "termination" queue entry */ + EntryQueueItem( ) + { + this.entry = null; + } + + + /** Initialises a log-carrying queue entry */ + EntryQueueItem( SystemLogEntry entry ) + { + this.entry = entry; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerBean.java new file mode 100644 index 0000000..2f88527 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerBean.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.beans.eventlog; + + +import javax.sql.DataSource; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; + +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +/** + * Log clean-up bean. + * + *

+ * This bean is responsible for removing old log entries from the various logging tables. It + * registers a set of constants which determine the maximal age of a log entry depending on its + * category (administrative, account or system) and starts a ticker task with a high frequency. + * + * @author tseeker + * + */ +public class LogCleanerBean + implements InitializingBean , DisposableBean +{ + /** Ticker bean */ + private Ticker ticker; + + /** Transaction manager */ + private PlatformTransactionManager transactionManager; + + /** Log cleaner task instance */ + private LogCleanerTask cleanerTask; + + private DataSource dataSource; + + + + /** + * Sets the ticker bean reference (DI). + * + * @param ticker + * the ticker bean + */ + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + /** + * Sets the transaction manager reference (DI). + * + * @param manager + * the transaction manager + */ + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager manager ) + { + this.transactionManager = manager; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dataSource = dataSource; + } + + + /** + * Registers constants and initialises the log clean-up task. + * + *

+ * Once the dependencies have been injected, this method will register the + * log.maxAge.admin, log.maxAge.account and log.maxAge.system + * constants, setting their default values to 7 days. It will then create the clean-up task + * instance, register it as a constants user, and add it to the ticker with a high frequency. + */ + @Override + public void afterPropertiesSet( ) + { + // Create clean-up task + this.cleanerTask = new LogCleanerTask( this.dataSource , this.transactionManager ); + this.ticker.registerTask( Frequency.LOW , "Log cleaner" , this.cleanerTask ); + } + + + /** + * Removes references to the clean-up task. + * + *

+ * Before the bean is destroyed, this method will unregister the clean-up task from the + * constants manager and remove the local reference. + */ + @Override + public void destroy( ) + { + this.cleanerTask = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerTask.java new file mode 100644 index 0000000..9a04e37 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogCleanerTask.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.eventlog; + + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + + + +/** + * Log clean-up task. + * + *

+ * This class implements the log clean-up task; it is simultaneously a constants user (as it needs + * to keep informed about log.maxAge.*), a runnable (as it needs to be registered as a + * ticker task) and a transaction callback (to perform the actual clean-up). + * + * @author tseeker + */ +class LogCleanerTask + implements Runnable +{ + + /** Transaction manager interface */ + private final TransactionTemplate tTemplate; + private JdbcTemplate dTemplate; + + + + /** + * @param sessionFactory + * the Hibernate session factory + * @param transactionManager + * the transaction manager + */ + LogCleanerTask( DataSource dataSource , PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + this.dTemplate = new JdbcTemplate( dataSource ); + } + + + /** + * Executes the clean-up transaction if the constants have been set. + */ + @Override + synchronized public void run( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + dTemplate.execute( "SELECT sys.clean_logs( )" ); + } + } ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogReaderBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogReaderBean.java new file mode 100644 index 0000000..1476bab --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogReaderBean.java @@ -0,0 +1,284 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.logs.ExceptionEntry; +import com.deepclone.lw.cmd.admin.logs.GetEntryResponse; +import com.deepclone.lw.cmd.admin.logs.LogEntry; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.logs.LogType; +import com.deepclone.lw.cmd.admin.logs.TraceEntry; +import com.deepclone.lw.cmd.admin.logs.ViewLogResponse; +import com.deepclone.lw.interfaces.eventlog.ExtendedLogEntry; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.sqld.sys.ExceptionLog; +import com.deepclone.lw.sqld.sys.StackTraceLog; + + + +public class LogReaderBean + implements LogReader +{ + + private SimpleJdbcTemplate dTemplate; + private TransactionTemplate tTemplate; + + private final RowMapper< LogEntry > mLogEntry; + private final RowMapper< ExceptionLog > mExceptionLog; + private final RowMapper< StackTraceLog > mTraceLog; + + + public LogReaderBean( ) + { + this.mLogEntry = new RowMapper< LogEntry >( ) { + @Override + public LogEntry mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + LogEntry entry = new LogEntry( ); + entry.setId( (Long) rs.getObject( "id" ) ); + entry.setTimestamp( rs.getTimestamp( "t" ) ); + entry.setAbout( rs.getString( "component" ) ); + entry.setLevel( LogLevel.valueOf( rs.getString( "level" ) ) ); + entry.setEntry( rs.getString( "message" ) ); + entry.setException( (Long) rs.getObject( "exception_id" ) ); + return entry; + } + }; + this.mExceptionLog = new RowMapper< ExceptionLog >( ) { + @Override + public ExceptionLog mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new ExceptionLog( rs.getLong( "id" ) , rs.getInt( "depth" ) , rs.getString( "exc_class" ) , rs + .getString( "message" ) ); + } + }; + this.mTraceLog = new RowMapper< StackTraceLog >( ) { + @Override + public StackTraceLog mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new StackTraceLog( rs.getLong( "exception_id" ) , rs.getInt( "depth" ) , rs + .getString( "location" ) , rs.getString( "file_name" ) , (Integer) rs.getObject( "line_number" ) ); + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Override + public ViewLogResponse getLog( final Administrator admin , final LogType type , final long first , final int count , + final LogLevel minLevel , final String component , final boolean excOnly ) + { + if ( excOnly && type != LogType.SYSTEM ) { + return new ViewLogResponse( admin , 0 , new LinkedList< LogEntry >( ) ); + } + + return this.tTemplate.execute( new TransactionCallback< ViewLogResponse >( ) { + @Override + public ViewLogResponse doInTransaction( TransactionStatus status ) + { + return getLogQueries( admin , type , first , count , minLevel , component , excOnly ); + } + } ); + } + + + private ViewLogResponse getLogQueries( Administrator admin , LogType type , long first , int count , + LogLevel minLevel , String component , boolean excOnly ) + { + String countQuery = this.buildQuery( true , type , first , count , minLevel , component , excOnly ); + Object[] cqParams = this.buildQueryParams( true , first , count , minLevel , component ); + long nEntries = this.dTemplate.queryForLong( countQuery , cqParams ); + + String mainQuery = this.buildQuery( false , type , first , count , minLevel , component , excOnly ); + Object[] mqParams = this.buildQueryParams( false , first , count , minLevel , component ); + List< LogEntry > entries = this.dTemplate.query( mainQuery , this.mLogEntry , mqParams ); + + return new ViewLogResponse( admin , nEntries , entries ); + } + + + private Object[] buildQueryParams( boolean isCount , long first , int count , LogLevel minLevel , String component ) + { + boolean hasComponent = ( component != null && !"".equals( component ) ); + Object[] params = new Object[ ( hasComponent ? 2 : 1 ) + ( isCount ? 0 : 2 ) ]; + int i = 0; + + params[ i++ ] = minLevel.toString( ); + if ( hasComponent ) { + params[ i++ ] = "%" + component + "%"; + } + if ( !isCount ) { + params[ i++ ] = (Long) first; + params[ i++ ] = (Integer) count; + } + + return params; + } + + + private String buildQuery( boolean isCount , LogType type , long first , int count , LogLevel minLevel , + String component , boolean excOnly ) + { + StringBuilder builder = new StringBuilder( ); + + // Selection from the right view + builder.append( "SELECT " ); + if ( isCount ) { + builder.append( "count(*)" ); + } else { + builder.append( "*" ); + } + builder.append( " FROM sys." ).append( type.toString( ).toLowerCase( ) ).append( "_logs_view WHERE " ); + + // Minimal log level + builder.append( "level >= ?::log_level" ); + + // Component + if ( component != null && !"".equals( component ) ) { + builder.append( " AND lower( component ) LIKE ?" ); + } + + // Exception only + if ( excOnly ) { + builder.append( " AND exception_id IS NOT NULL" ); + } + + if ( !isCount ) { + // Ordering, index, count + builder.append( " ORDER BY t DESC OFFSET ? LIMIT ?" ); + } + + return builder.toString( ); + } + + + @Override + public GetEntryResponse getEntry( final Administrator admin , final long id ) + { + return this.tTemplate.execute( new TransactionCallback< GetEntryResponse >( ) { + @Override + public GetEntryResponse doInTransaction( TransactionStatus status ) + { + return doGetEntryResponse( admin , id ); + } + } ); + } + + + private GetEntryResponse doGetEntryResponse( Administrator admin , long id ) + { + ExtendedLogEntry lEntry = this.doGetEntry( id ); + if ( lEntry == null ) { + return new GetEntryResponse( admin , false ); + } + return new GetEntryResponse( admin , lEntry.logEntry , lEntry.exceptions ); + } + + + private ExtendedLogEntry doGetEntry( long id ) + { + String sql = "SELECT * FROM sys.system_logs_view WHERE id = ?"; + + // Get log entry + LogEntry entry; + try { + entry = this.dTemplate.queryForObject( sql , this.mLogEntry , id ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + + // Get exceptions + List< ExceptionLog > eLog; + sql = "SELECT * FROM sys.exceptions WHERE log_id = ? ORDER BY depth"; + eLog = this.dTemplate.query( sql , this.mExceptionLog , id ); + + Map< Long , ExceptionLog > eLogId = new HashMap< Long , ExceptionLog >( ); + for ( ExceptionLog ee : eLog ) { + eLogId.put( ee.getId( ) , ee ); + } + + // Get stack trace entries + sql = "SELECT st.* FROM sys.stack_traces st INNER JOIN sys.exceptions e ON e.id = st.exception_id WHERE e.log_id = ? ORDER BY st.depth DESC"; + for ( StackTraceLog stLog : this.dTemplate.query( sql , this.mTraceLog , id ) ) { + ExceptionLog ee = eLogId.get( stLog.getExcId( ) ); + ee.addStackTrace( stLog ); + } + + // Generate output + List< ExceptionEntry > exceptions = new LinkedList< ExceptionEntry >( ); + for ( ExceptionLog ee : eLog ) { + ExceptionEntry eEntry = new ExceptionEntry( ee.getClassName( ) , ee.getMessage( ) ); + List< TraceEntry > stackTrace = new LinkedList< TraceEntry >( ); + for ( StackTraceLog stLog : ee.getStack( ) ) { + stackTrace.add( new TraceEntry( stLog.getLocation( ) , stLog.getFileName( ) , stLog.getLine( ) ) ); + } + eEntry.setTrace( stackTrace ); + exceptions.add( eEntry ); + } + + return new ExtendedLogEntry( entry , exceptions ); + } + + + @Override + public List< ExtendedLogEntry > getErrorEntries( ) + { + List< ExtendedLogEntry > result = new LinkedList< ExtendedLogEntry >( ); + String sql = "SELECT * FROM admin.get_error_entries( )"; + RowMapper< Long > longLister = new RowMapper< Long >( ) { + @Override + public Long mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return rs.getLong( 1 ); + } + }; + for ( Long id : this.dTemplate.query( sql , longLister ) ) { + result.add( this.doGetEntry( id ) ); + } + return result; + } + + + @Override + public List< LogEntry > getAdminLogSince( Timestamp timestamp ) + { + String sql = "SELECT * FROM sys.admin_logs_view WHERE t >= ? AND level >= 'INFO'::log_level ORDER BY t DESC"; + return this.dTemplate.query( sql , this.mLogEntry , timestamp ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterBean.java new file mode 100644 index 0000000..c43d5ae --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterBean.java @@ -0,0 +1,122 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.eventlog.LogWriter; +import com.deepclone.lw.sqld.sys.SystemLogEntry; + + + +/** + * The log writer bean, once initialised, spawns a task while continuously examines a blocking + * queue. When entries are added to the queue, they are flushed to the database. When the bean + * container destroys the bean, a queue entry carrying the null value is added to the queue, causing + * the task to terminate. + * + * @author tseeker + * + */ +public class LogWriterBean + implements LogWriter , InitializingBean , DisposableBean +{ + + /** Transaction management instance */ + private TransactionTemplate tTemplate; + + /** JDBC data source */ + private DataSource dataSource; + + /** The queue used for log entries */ + private LinkedBlockingQueue< EntryQueueItem > queue = null; + + + /** + * Sets the JDBC data source (DI) + * + * @param dataSource + * the JDBC data source + */ + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dataSource = dataSource; + } + + + /** + * Initialises the interface to the transaction manager (DI) + * + * @param manager + * the transaction manager to use + */ + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager manager ) + { + this.tTemplate = new TransactionTemplate( manager ); + } + + + /* Documentation in LogWriter interface */ + @Override + synchronized public void addEntries( List< SystemLogEntry > entries ) + { + if ( this.queue == null ) { + return; + } + + LinkedList< EntryQueueItem > items = new LinkedList< EntryQueueItem >( ); + for ( SystemLogEntry e : entries ) { + if ( e == null ) { + continue; + } + items.add( new EntryQueueItem( e ) ); + } + this.queue.addAll( items ); + } + + + /** + * Bean initialisation - creates the queue and spawns the log writer task. + */ + @Override + public void afterPropertiesSet( ) + { + this.queue = new LinkedBlockingQueue< EntryQueueItem >( ); + + LogWriterTask task; + task = new LogWriterTask( this.queue , this.dataSource , this.tTemplate ); + + Thread t; + t = new Thread( task ); + t.start( ); + } + + + /** + * Bean destruction - inserts a null entry on the log writer queue, then waits for the task to + * terminate. + */ + @Override + public void destroy( ) + { + this.queue.add( new EntryQueueItem( ) ); + while ( !this.queue.isEmpty( ) ) { + Thread.yield( ); + } + synchronized ( this ) { + this.queue = null; + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterTask.java new file mode 100644 index 0000000..a1fe4cc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LogWriterTask.java @@ -0,0 +1,166 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.sql.Types; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.sql.DataSource; + +import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.transaction.CannotCreateTransactionException; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.sqld.sys.ExceptionLog; +import com.deepclone.lw.sqld.sys.StackTraceLog; +import com.deepclone.lw.sqld.sys.SystemLogEntry; +import com.deepclone.lw.utils.StoredProc; + + + +/** + * The log writer task is spawned by the log writer bean. Whenever log entries are pushed to the log + * writer, they are added to a queue which this tasks continuously reads. If a queue item carrying + * the null value is found, the queue is flushed and the task terminates. + * + * @author tseeker + */ +class LogWriterTask + implements Runnable +{ + + /** The queue */ + private final LinkedBlockingQueue< EntryQueueItem > queue; + + /** Transaction management interface */ + private final TransactionTemplate tTemplate; + + private StoredProc fLog; + private StoredProc fException; + private StoredProc fTrace; + + + /** Copies the required references */ + LogWriterTask( LinkedBlockingQueue< EntryQueueItem > queue , DataSource dataSource , TransactionTemplate tTemplate ) + { + this.queue = queue; + this.tTemplate = tTemplate; + + this.fLog = new StoredProc( dataSource , "sys" , "write_log" ); + this.fLog.addParameter( "component" , Types.VARCHAR ); + this.fLog.addParameter( "level" , "log_level" ); + this.fLog.addParameter( "message" , Types.VARCHAR ); + this.fLog.addOutput( "entry_id" , Types.BIGINT ); + + this.fException = new StoredProc( dataSource , "sys" , "append_exception" ); + this.fException.addParameter( "log_id" , Types.BIGINT ); + this.fException.addParameter( "class_name" , Types.VARCHAR ); + this.fException.addParameter( "message" , Types.VARCHAR ); + this.fException.addOutput( "entry_id" , Types.BIGINT ); + + this.fTrace = new StoredProc( dataSource , "sys" , "append_trace" ); + this.fTrace.addParameter( "exc_id" , Types.BIGINT ); + this.fTrace.addParameter( "location" , Types.VARCHAR ); + this.fTrace.addParameter( "file_name" , Types.VARCHAR ); + this.fTrace.addParameter( "line_number" , Types.INTEGER ); + } + + + /** + * Implements the consumer side of the queue; when an item is found, all items are flushed and + * written to the DB in the same transaction. + */ + @Override + public void run( ) + { + boolean keepRunning = true; + while ( keepRunning ) { + LinkedList< EntryQueueItem > items; + items = new LinkedList< EntryQueueItem >( ); + + // Wait for the next queue entry + EntryQueueItem item; + try { + item = this.queue.take( ); + } catch ( InterruptedException e ) { + continue; + } + + // Take everything else on the queue + this.queue.drainTo( items ); + items.add( item ); + + // Process the items obtained from the queue, watching for null values as they will + // interrupt the task + final LinkedList< SystemLogEntry > okItems = new LinkedList< SystemLogEntry >( ); + for ( EntryQueueItem i : items ) { + if ( i.entry == null ) { + keepRunning = false; + } else { + okItems.add( i.entry ); + } + } + + // If there's nothing to write, restart the loop (that usually means we're being + // terminated) + if ( okItems.isEmpty( ) ) { + continue; + } + + // Try writing to the DB + boolean writeSuccess = false; + while ( ! writeSuccess ) { + try { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + writeLogEntries( okItems ); + } + } ); + writeSuccess = true; + } catch ( DataAccessResourceFailureException e ) { + // Do nothing + } catch ( CannotCreateTransactionException e ) { + // Do nothing + } + + if (! writeSuccess ) { + if ( !this.queue.isEmpty( ) ) { + // If there is stuff in the queue, abort writing. + // We might actually need to exit. + break; + } + + try { + Thread.sleep( 2000 ); + } catch ( InterruptedException e1 ) { + break; + } + } + } + } + } + + + private void writeLogEntries( List< SystemLogEntry > entries ) + { + for ( SystemLogEntry entry : entries ) { + Long id = (Long) this.fLog.execute( entry.getComponent( ) , entry.getLevel( ).toString( ) , + entry.getMessage( ) ).get( "entry_id" ); + + for ( ExceptionLog exc : entry.getException( ) ) { + Long eid = (Long) this.fException.execute( id , exc.getClassName( ) , exc.getMessage( ) ).get( + "entry_id" ); + + for ( StackTraceLog st : exc.getStack( ) ) { + this.fTrace.execute( eid , st.getLocation( ) , st.getFileName( ) , st.getLine( ) ); + } + } + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LoggerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LoggerBean.java new file mode 100644 index 0000000..2c7de82 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/LoggerBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.interfaces.eventlog.LogWriter; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.sqld.sys.SystemLogEntry; + + + +/** + * The logger bean can be used to generate the various types of log entry generators. It + * communicates with a log writer to which entries produced by the generators will be flushed. + * + * @author tseeker + * + */ +public class LoggerBean + implements Logger +{ + + /** The log writer bean this logger pushes entries to */ + private LogWriter logWriter; + + + /** + * Sets the log writer bean (DI) + * + * @param logWriter + * the log writer bean to push entries to + */ + @Autowired( required = true ) + public void setLogWriter( LogWriter logWriter ) + { + this.logWriter = logWriter; + } + + + /** + * Pushes a set of log entries to the log writer. + * + * @param entries + * the list of log entries to push + */ + void flush( List< SystemLogEntry > entries ) + { + this.logWriter.addEntries( entries ); + } + + + /* Documentation in Logger interface */ + @Override + public SystemLogger getSystemLogger( String component ) + { + return new SystemLoggerImpl( this , component ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/SystemLoggerImpl.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/SystemLoggerImpl.java new file mode 100644 index 0000000..d03a032 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/java/com/deepclone/lw/beans/eventlog/SystemLoggerImpl.java @@ -0,0 +1,183 @@ +package com.deepclone.lw.beans.eventlog; + + +import java.util.LinkedList; +import java.util.List; + +import org.apache.log4j.Logger; + + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.sqld.sys.ExceptionLog; +import com.deepclone.lw.sqld.sys.StackTraceLog; +import com.deepclone.lw.sqld.sys.SystemLogEntry; + + + +/** + * The system logger implementation generates {@link SystemLogEntry} instances, setting their fields + * to the proper values and parsing exceptions as required. When flushed it simply uses the logger + * bean's flush() method to push its contents to the log writer. + * + * @author tseeker + */ +class SystemLoggerImpl + implements SystemLogger +{ + + /** External (log4j) logger */ + private final Logger l4j = Logger.getLogger( SystemLogger.class ); + + /** The logger bean */ + private final LoggerBean logger; + + /** The name of the component this system logger is used by */ + private final String component; + + /** The list of entries that have been created but that haven't been flushed to the logger bean */ + private List< SystemLogEntry > entries = new LinkedList< SystemLogEntry >( ); + + + /** Stores the logger bean reference and the component's name */ + SystemLoggerImpl( LoggerBean logger , String component ) + { + this.logger = logger; + this.component = component; + } + + + /* Documentation in SystemLogger interface */ + @Override + public SystemLogger flush( ) + { + synchronized ( this.entries ) { + if ( !this.entries.isEmpty( ) ) { + this.logger.flush( this.entries ); + this.entries.clear( ); + } + } + return this; + } + + + /* Documentation in SystemLogger interface */ + @Override + public SystemLogger log( LogLevel level , String message ) + { + this.toLog4j( level , message , null ); + + SystemLogEntry entry = this.makeEntry( level , message ); + synchronized ( this.entries ) { + this.entries.add( entry ); + } + + return this; + } + + + /* Documentation in SystemLogger interface */ + @Override + public SystemLogger log( LogLevel level , String message , Throwable exception ) + { + this.toLog4j( level , message , exception ); + + + SystemLogEntry entry = this.makeEntry( level , message ); + this.parseException( entry , exception ); + + synchronized ( this.entries ) { + this.entries.add( entry ); + } + + return this; + } + + + /** + * Logs a message through Log4J (in addition to the DB log). + * + * @param level + * log level + * @param message + * message to log + * @param exception + * optional exception to log along with the message + */ + private void toLog4j( LogLevel level , String message , Throwable exception ) + { + message = this.component + " - " + message; + switch ( level ) { + case DEBUG: + this.l4j.debug( message , exception ); + break; + case ERROR: + this.l4j.error( message , exception ); + break; + case INFO: + this.l4j.info( message , exception ); + break; + case TRACE: + this.l4j.trace( message , exception ); + break; + case WARNING: + this.l4j.warn( message , exception ); + break; + } + } + + + /** + * Generates the basic contents of a log entry using a log level and message + * + * @param level + * the entry's log level + * @param message + * the entry's message + * @return a fully usable {@link SystemLogEntry} instance + */ + private SystemLogEntry makeEntry( LogLevel level , String message ) + { + return new SystemLogEntry( level , this.component , message ); + } + + + /** + * Parses the specified exception so that the ExceptionLog instance and associated data can + * later be retrieved. + * + * @param exception + * the exception to parse + */ + private void parseException( SystemLogEntry logEntry , Throwable exception ) + { + do { + ExceptionLog excData; + excData = new ExceptionLog( logEntry , exception.getClass( ).getCanonicalName( ) , exception.getMessage( ) ); + this.parseTrace( excData , exception ); + exception = exception.getCause( ); + } while ( exception != null ); + } + + + /** + * This method converts an exception's stack trace into TracebackLog instances, adding them to + * the list of associated objects and returning the top-most item. + * + * @param logData + * the exception's log entry + * @param exception + * the exception whose stack trace is to be converted + */ + private void parseTrace( ExceptionLog logData , Throwable exception ) + { + StackTraceElement[] trace = exception.getStackTrace( ); + + for ( int i = trace.length - 1 ; i >= 0 ; i-- ) { + StackTraceElement e = trace[ i ]; + new StackTraceLog( logData , e.getClassName( ) + "." + e.getMethodName( ) , e.getFileName( ) , e + .getLineNumber( ) ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog-beans.xml new file mode 100644 index 0000000..934a2d8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog-beans.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/admin-error-mail-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/admin-error-mail-bean.xml new file mode 100644 index 0000000..f0e6a6e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/admin-error-mail-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-cleaner-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-cleaner-bean.xml new file mode 100644 index 0000000..7773c57 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-cleaner-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-reader-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-reader-bean.xml new file mode 100644 index 0000000..1e56da0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-reader-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-writer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-writer-bean.xml new file mode 100644 index 0000000..21fc777 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/log-writer-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/logger-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/logger-bean.xml new file mode 100644 index 0000000..22b1347 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-eventlog/src/main/resources/configuration/eventlog/logger-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.project new file mode 100644 index 0000000..dffe14c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-i18n + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..9640d22 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:19:36 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/pom.xml new file mode 100644 index 0000000..26ad335 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-i18n + Legacy Worlds internationalisation + 5.99.1 + This package defines the two beans which control server-side internationalised text management. + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NAdministrationImpl.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NAdministrationImpl.java new file mode 100644 index 0000000..47e8e06 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NAdministrationImpl.java @@ -0,0 +1,232 @@ +package com.deepclone.lw.beans.i18n; + + +import java.util.Map; +import java.util.Set; + +import com.deepclone.lw.interfaces.i18n.*; + + + +/** + * The implementation of the I18N administrative session uses the manager's shared {@link I18NData} + * instance to modify the I18N database, logging all actions in the process. It also provides some + * read access to languages and translations, but (as opposed to access through the + * {@link Translator} bean) completely ignores language support requirements, allowing new or + * incomplete languages to be managed. + * + * @author tseeker + */ +class I18NAdministrationImpl + implements I18NAdministration +{ + + /** The shared I18N data instance */ + private I18NData data; + private int administrator; + + + /** + * Copies the various required references + * + * @param data + * shared I18N data instance + * @param administrator + */ + I18NAdministrationImpl( I18NData data, int administrator ) + { + this.data = data; + this.administrator = administrator; + } + + + /* Documented in I18NAdministration interface */ + @Override + public Set< String > getLanguages( ) + { + this.data.readLock( ).lock( ); + try { + return this.data.getLanguages( ); + } finally { + this.data.readLock( ).unlock( ); + } + } + + + /* Documented in I18NAdministration interface */ + @Override + public String getLanguageName( String language ) + throws UnknownLanguageException + { + String l; + this.data.readLock( ).lock( ); + try { + l = this.data.getLanguageName( language ); + } finally { + this.data.readLock( ).unlock( ); + } + + if ( l == null ) { + throw new UnknownLanguageException( language ); + } + return l; + } + + + /* Documented in I18NAdministration interface */ + @Override + public double getLanguageSupport( String language ) + throws UnknownLanguageException + { + int sCount; + double lSize; + + this.data.readLock( ).lock( ); + try { + if ( !this.data.hasLanguage( language ) ) { + throw new UnknownLanguageException( language ); + } + lSize = this.data.getLanguageSize( language ); + sCount = this.data.getStringsCount( ); + } finally { + this.data.readLock( ).unlock( ); + } + + if ( sCount == 0 ) { + return 0; + } + return lSize / (double) sCount; + } + + + /* Documented in I18NAdministration interface */ + @Override + public void createLanguage( String language , String name ) + throws DuplicateLanguageException + { + this.data.writeLock( ).lock( ); + try { + if ( !this.data.addLanguage( this.administrator , language , name ) ) { + throw new DuplicateLanguageException( language ); + } + } finally { + this.data.writeLock( ).unlock( ); + } + } + + + /* Documented in I18NAdministration interface */ + @Override + public void setLanguageName( String language , String name ) + throws UnknownLanguageException + { + String oldName; + + this.data.writeLock( ).lock( ); + try { + oldName = this.data.updateLanguage( this.administrator , language , name ); + if ( oldName == null ) { + throw new UnknownLanguageException( language ); + } + } finally { + this.data.writeLock( ).unlock( ); + } + } + + + @Override + public Set< String > getStrings( ) + { + this.data.readLock( ).lock( ); + try { + return this.data.getStrings( ); + } finally { + this.data.readLock( ).unlock( ); + } + } + + + /* Documented in I18NAdministration interface */ + @Override + public String getTranslation( String language , String string ) + throws UnknownStringException , UnknownLanguageException + { + this.data.readLock( ).lock( ); + try { + if ( !this.data.hasLanguage( language ) ) { + throw new UnknownLanguageException( language ); + } + if ( !this.data.hasString( string ) ) { + throw new UnknownStringException( string ); + } + return this.data.getTranslation( language , string ); + } finally { + this.data.readLock( ).unlock( ); + } + } + + + @Override + public boolean updateTranslation( String language , String string , String translation ) + throws UnknownStringException , UnknownLanguageException + { + String oldString; + this.data.writeLock( ).lock( ); + try { + if ( !this.data.hasLanguage( language ) ) { + throw new UnknownLanguageException( language ); + } + if ( !this.data.hasString( string ) ) { + throw new UnknownStringException( string ); + } + oldString = this.data.setTranslation( this.administrator , language , string , translation ); + } finally { + this.data.writeLock( ).unlock( ); + } + return ( oldString == null ); + } + + + /* Documented in I18NAdministration interface */ + @Override + public void createString( String string , Map< String , String > translations ) + throws DuplicateStringException , UnknownLanguageException , InvalidUpdateException + { + Set< String > languages; + + this.data.writeLock( ).lock( ); + try { + // Check for duplicate string ID + if ( this.data.hasString( string ) ) { + throw new DuplicateStringException( string ); + } + + // Make sure all specified languages actually exist + languages = this.data.getLanguages( ); + for ( String lId : translations.keySet( ) ) { + if ( !languages.contains( lId ) ) { + throw new UnknownLanguageException( lId ); + } + languages.remove( lId ); + } + + // Make sure no 100% supported language becomes unsupported because a translation is + // missing + int sCount = this.data.getStringsCount( ); + for ( String lId : languages ) { + if ( this.data.getLanguageSize( lId ) < sCount ) { + languages.remove( lId ); + } + } + if ( !languages.isEmpty( ) ) { + throw new InvalidUpdateException( languages ); + } + + // Create the string + this.data.createString( this.administrator , string , translations ); + } finally { + this.data.writeLock( ).unlock( ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NData.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NData.java new file mode 100644 index 0000000..c48b5f6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NData.java @@ -0,0 +1,350 @@ +package com.deepclone.lw.beans.i18n; + + +import java.sql.Types; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.utils.StoredProc; + + + +/** + * This class is used by all parts of the I18N support system; it centralises all I18N-related data, + * providing both read and write access. It implements the {@link ReadWriteLock} interface, although + * only as a convenience. + * + * @author tseeker + */ +class I18NData + implements ReadWriteLock +{ + /** The instance's read/write lock */ + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock( ); + + /** Database interface */ + private final SimpleJdbcTemplate dTemplate; + + /** Transaction manager interface */ + private final TransactionTemplate tTemplate; + + /** String definitions, by identifier */ + private HashSet< String > strings; + + /** Languages by identifier. Each language is represented by a {@link LanguageStore} */ + private HashMap< String , LanguageStore > languages; + + private StoredProc fUocLanguage; + private StoredProc fUocTranslation; + + + /** Copies the required references then loads all data */ + I18NData( DataSource dataSource , TransactionTemplate tTemplate ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + this.tTemplate = tTemplate; + + this.fUocLanguage = new StoredProc( dataSource , "defs" , "uoc_language" ); + this.fUocLanguage.addParameter( "language" , Types.VARCHAR ); + this.fUocLanguage.addParameter( "name" , Types.VARCHAR ); + this.fUocLanguage.addParameter( "admin_id" , Types.INTEGER ); + + this.fUocTranslation = new StoredProc( dataSource , "defs" , "uoc_translation" ); + this.fUocTranslation.addParameter( "language" , Types.VARCHAR ); + this.fUocTranslation.addParameter( "string_id" , Types.VARCHAR ); + this.fUocTranslation.addParameter( "contents" , Types.VARCHAR ); + this.fUocTranslation.addParameter( "admin_id" , Types.INTEGER ); + + this.loadAll( ); + } + + + /** + * (Re)initialises the strings and languages definition maps, then starts a loader transaction + * to fill them from the database's contents. + */ + void loadAll( ) + { + this.strings = new HashSet< String >( ); + this.languages = new HashMap< String , LanguageStore >( ); + + LoaderTransaction trans = new LoaderTransaction( this.dTemplate , this.strings , this.languages ); + this.tTemplate.execute( trans ); + } + + + /** @return the set of known language identifiers */ + Set< String > getLanguages( ) + { + return new HashSet< String >( this.languages.keySet( ) ); + } + + + /** + * @param identifier + * a language's identifier + * @return whether a language exists or not + */ + boolean hasLanguage( String identifier ) + { + return this.languages.containsKey( identifier ); + } + + + /** + * @param string + * a string identifier + * @return whether such a string definition exists or not + */ + boolean hasString( String string ) + { + return this.strings.contains( string ); + } + + + /** + * @param identifier + * a language's identifier + * @return the amount of translations defined for the specified language, or 0 if the language + * does not exist + */ + int getLanguageSize( String identifier ) + { + if ( !this.hasLanguage( identifier ) ) { + return 0; + } + return this.languages.get( identifier ).getTranslationsCount( ); + } + + + /** @return the amount of defined string identifiers */ + int getStringsCount( ) + { + return this.strings.size( ); + } + + + /** + * Checks whether a language is fully supported. + * + * @param identifier + * the language's identifier + * @return true if there's a translation for each string definition in the specified language. + */ + boolean isLanguageComplete( String identifier ) + { + return this.getLanguageSize( identifier ) == this.getStringsCount( ); + } + + + /** @return the set of defined string identifiers */ + Set< String > getStrings( ) + { + return new HashSet< String >( this.strings ); + } + + + String getLanguageName( String id ) + { + if ( !this.hasLanguage( id ) ) { + return null; + } + return this.languages.get( id ).getLanguageName( ); + } + + + /** + * Creates a new language definition in the database. + * + * @param id + * the new language's identifier + * @param name + * the new language's name + * @return true on success, false otherwise + */ + boolean addLanguage( int administrator , String id , String name ) + { + if ( this.hasLanguage( id ) ) { + return false; + } + this.uocLanguage( administrator , id , name ); + this.languages.put( id , new LanguageStore( id , name ) ); + return true; + } + + + /** + * Modifies the name of a language. + * + * @param administrator + * + * @param id + * the language's identifier + * @param name + * the language's new name + * @return null if the language does not exist, or the old name of the language if it does + */ + String updateLanguage( int administrator , String id , String name ) + { + LanguageStore ls = this.languages.get( id ); + if ( ls == null ) { + return null; + } + + String oldName = ls.getLanguageName( ); + this.uocLanguage( administrator , id , name ); + ls.setLanguageName( name ); + return oldName; + } + + + private void uocLanguage( final int administrator , final String id , final String name ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + fUocLanguage.execute( id , name , administrator ); + } + } ); + } + + + /** + * Accesses the {@link Translation} object for a given language/string identifier pair. + * + * @param language + * the language's identifier + * @param string + * the string's identifier + * @return the translation + * @throws NullPointerException + * if the language does not exist + */ + String getTranslation( String language , String string ) + { + return this.languages.get( language ).getTranslation( string ); + } + + + /** + * Sets or creates the translation for a given language/string identifier pair. + * + * @param administrator + * + * @param language + * the language's identifier + * @param string + * the string's identifier + * @param translation + * the translated text for the string + * @return the old translated text if the translation existed or null if a new translation was + * created + * @throws NullPointerException + * if the language does not exist + * @throws IllegalArgumentException + * if the string does not exist + */ + String setTranslation( final int administrator , final String language , final String string , final String translation ) + { + // Get existing translation + LanguageStore store = this.languages.get( language ); + String old = store.getTranslation( string ); + if ( !this.strings.contains( string ) ) { + throw new IllegalArgumentException( ); + } + + // Create or update the database record + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + fUocTranslation.execute( language , string , translation , administrator ); + } + } ); + + // Store the new translation + store.addTranslation( string , translation ); + return old; + } + + + /** + * Creates a string from scratch, storing initial translations along with it. + * + * @param string + * the new string's identifier + * @param translations + * a language identifiers -> translated text map to use as the string's initial + * translations. + * @throws ConstraintViolationException + * if the string identifier already existed in the DB + * @throws NullPointerException + * if one of the languages does not exist + * @throws IllegalArgumentException + * if the string exists + */ + void createString( final int administrator , final String string , final Map< String , String > translations ) + { + if ( this.strings.contains( string ) ) { + throw new IllegalArgumentException( ); + } + + // Map language stores to translations + Map< LanguageStore , String > nTrans = new HashMap< LanguageStore , String >( ); + for ( String lId : translations.keySet( ) ) { + LanguageStore store = this.languages.get( lId ); + nTrans.put( store , translations.get( lId ) ); + } + + // Update the database + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + for ( Map.Entry< String , String > entry : translations.entrySet( ) ) { + fUocTranslation.execute( entry.getKey( ) , string , entry.getValue( ) , administrator ); + } + } + + } ); + + // Add the string definition to the local cache + this.strings.add( string ); + + // Add the various translations to each language's store + for ( Map.Entry< LanguageStore , String > entry : nTrans.entrySet( ) ) { + entry.getKey( ).addTranslation( string , entry.getValue( ) ); + } + } + + + /** @return the instance's read lock */ + @Override + public Lock readLock( ) + { + return this.lock.readLock( ); + } + + + /** @return the instance's write lock */ + @Override + public Lock writeLock( ) + { + return this.lock.writeLock( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NManagerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NManagerBean.java new file mode 100644 index 0000000..056a618 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/I18NManagerBean.java @@ -0,0 +1,97 @@ +package com.deepclone.lw.beans.i18n; + + +import javax.sql.DataSource; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.i18n.I18NAdministration; +import com.deepclone.lw.interfaces.i18n.I18NManager; + + + +/** + * The I18N manager bean creates the {@link I18NData} instance on initialisation, which it then + * shares with translator beans and administrative session instances. + * + * @author tseeker + */ +public class I18NManagerBean + implements I18NManager , InitializingBean +{ + + /** Transaction manager interface */ + private TransactionTemplate tTemplate; + + /** Database interface */ + private DataSource dataSource; + + /** Data store shared amongst the translator beans and administrative session instances */ + private I18NData data; + + + /** + * Sets the transaction manager interface (DI) + * + * @param manager + * the transaction manager + */ + @Autowired( required = true ) + public void setTransactionManager( DataSourceTransactionManager manager ) + { + this.tTemplate = new TransactionTemplate( manager ); + } + + + /** + * Sets the JBDC interface (DI) + * + * @param dSource + * the data source + */ + @Autowired( required = true ) + public void setDataSource( DataSource dSource ) + { + this.dataSource = dSource; + } + + + /** Creates the shared {@link I18NData} instance on initialisation */ + @Override + public void afterPropertiesSet( ) + { + this.data = new I18NData( this.dataSource , this.tTemplate ); + } + + + /** @return the shared {@link I18NData} instance */ + I18NData getData( ) + { + return this.data; + } + + + /* Documentation in I18NManager interface */ + @Override + public I18NAdministration getAdminSession( int administrator ) + { + return new I18NAdministrationImpl( this.data , administrator ); + } + + + /* Documentation in I18NManager interface */ + @Override + public void reload( ) + { + this.data.writeLock( ).lock( ); + try { + this.data.loadAll( ); + } finally { + this.data.writeLock( ).unlock( ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LanguageStore.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LanguageStore.java new file mode 100644 index 0000000..dce2219 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LanguageStore.java @@ -0,0 +1,79 @@ +package com.deepclone.lw.beans.i18n; + + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + + + +/** + * A language store encapsulates all data that defines a language - from the language definition + * itself to the various translations available in this language. + * + * @author tseeker + */ +class LanguageStore + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String languageId; + + private String languageName; + + private final Map translations = new HashMap< String , String >( ); + + + public LanguageStore( String languageId , String languageName ) + { + this.languageId = languageId; + this.languageName = languageName; + } + + + /** @return the store's language identifier */ + String getLanguageIdentifier( ) + { + return this.languageId; + } + + + /** @return the name of the language encapsulated by the store */ + String getLanguageName( ) + { + return this.languageName; + } + + + /** @return the amount of translations available from the store */ + int getTranslationsCount( ) + { + return this.translations.size( ); + } + + + /** + * @param string + * a string identifier + * @return the translated string + */ + String getTranslation( String string ) + { + return this.translations.get( string ); + } + + + void addTranslation( String stringId , String translation ) + { + this.translations.put( stringId , translation ); + } + + + void setLanguageName( String name ) + { + this.languageName = name; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LoaderTransaction.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LoaderTransaction.java new file mode 100644 index 0000000..ffedd04 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/LoaderTransaction.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.beans.i18n; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.HashSet; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; + +import com.deepclone.lw.sqld.i18n.Translation; + + + + +/** + * The I18N data loader transaction reads all string definitions and language definitions from the + * database, creating {@link LanguageStore} instances for each language. + * + * @author tseeker + */ +class LoaderTransaction + extends TransactionCallbackWithoutResult +{ + + /** Database interface */ + private final SimpleJdbcTemplate dTemplate; + + /** String definition map being initialised */ + private final HashSet< String > strings; + + /** Language definition map being initialised */ + private final HashMap< String , LanguageStore > languages; + + + /** Copies the required references */ + LoaderTransaction( SimpleJdbcTemplate dTemplate , HashSet< String > strings , + HashMap< String , LanguageStore > languages ) + { + this.dTemplate = dTemplate; + this.strings = strings; + this.languages = languages; + } + + + /** + * The transaction loads all string definitions, storing them in the string definition map, then + * loads all languages, creating a {@link LanguageStore} for each instance. + */ + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + String sql; + RowMapper< Translation > mapper = new RowMapper< Translation >( ) { + + @Override + public Translation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Translation t = new Translation( ); + t.setLanguageId( rs.getString( "language_id" ) ); + t.setLanguageName( rs.getString( "language_name" ) ); + t.setStringId( rs.getString( "string_id" ) ); + t.setTranslation( rs.getString( "translation" ) ); + return t; + } + + }; + + sql = "SELECT language_id , language_name , string_id , translation FROM defs.translations_view"; + for ( Translation trans : this.dTemplate.query( sql , mapper ) ) { + this.strings.add( trans.getStringId( ) ); + + LanguageStore ls = this.languages.get( trans.getLanguageId( ) ); + if ( ls == null ) { + ls = new LanguageStore( trans.getLanguageId( ) , trans.getLanguageName( ) ); + this.languages.put( trans.getLanguageId( ) , ls ); + } + ls.addTranslation( trans.getStringId( ) , trans.getTranslation( ) ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/TranslatorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/TranslatorBean.java new file mode 100644 index 0000000..7ce8046 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/java/com/deepclone/lw/beans/i18n/TranslatorBean.java @@ -0,0 +1,122 @@ +package com.deepclone.lw.beans.i18n; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.i18n.UnknownLanguageException; +import com.deepclone.lw.interfaces.i18n.UnknownStringException; + + + +/** + * The translator bean's implementation uses the contents of the {@link I18NData} instance, which it + * only accesses in read-only mode. + * + * @author tseeker + */ +public class TranslatorBean + implements Translator +{ + private I18NData data; + + + /** + * Sets the bean's I18N manager (DI) + * + * @param manager + * the I18N manager to use + */ + @Autowired( required = true ) + public void setI18NManager( I18NManagerBean manager ) + { + this.data = manager.getData( ); + } + + + /* Documentation in Translator interface */ + @Override + public Set< String > getSupportedLanguages( ) + { + Set< String > supported = new HashSet< String >( ); + int sCount , lSize; + + this.data.readLock( ).lock( ); + try { + sCount = this.data.getStringsCount( ); + if ( sCount == 0 ) { + return supported; + } + + for ( String lId : this.data.getLanguages( ) ) { + lSize = this.data.getLanguageSize( lId ); + if ( lSize == sCount ) { + supported.add( lId ); + } + } + + return supported; + } finally { + this.data.readLock( ).unlock( ); + } + } + + + /* Documentation in Translator interface */ + @Override + public boolean isLanguageSupported( String language ) + { + int lSize , sCount; + + this.data.readLock( ).lock( ); + try { + lSize = this.data.getLanguageSize( language ); + sCount = this.data.getStringsCount( ); + + return ( sCount > 0 && lSize == sCount ); + } finally { + this.data.readLock( ).unlock( ); + } + } + + + /* Documentation in Translator interface */ + @Override + public String translate( String language , String string ) + throws UnknownStringException , UnknownLanguageException + { + this.data.readLock( ).lock( ); + try { + if ( !this.data.hasString( string ) ) { + throw new UnknownStringException( string ); + } + if ( !this.data.isLanguageComplete( language ) ) { + throw new UnknownLanguageException( language ); + } + return this.data.getTranslation( language , string ); + } finally { + this.data.readLock( ).unlock( ); + } + } + + + /* Documentation in Translator interface */ + @Override + public String getLanguageName( String language ) + throws UnknownLanguageException + { + this.data.readLock( ).lock( ); + try { + if ( !this.data.isLanguageComplete( language ) ) { + throw new UnknownLanguageException( language ); + } + return this.data.getLanguageName( language ); + } finally { + this.data.readLock( ).unlock( ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n-beans.xml new file mode 100644 index 0000000..bfaaebb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n-beans.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-manager-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-manager-bean.xml new file mode 100644 index 0000000..a683f48 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-manager-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-translator-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-translator-bean.xml new file mode 100644 index 0000000..9118332 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-i18n/src/main/resources/configuration/i18n/i18n-translator-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.project new file mode 100644 index 0000000..1c8b8cf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-mailer + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..0a8422b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:19:43 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/pom.xml new file mode 100644 index 0000000..9b2eba1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-mailer + 5.99.1 + Legacy Worlds mailer + + This package contains the mailer component, which uses LW's i18n system and Spring's mail sending interfaces. +It is capable of sending mails synchronously or asynchronously. + + + + + org.springframework + spring-context-support + ${org.springframework.version} + jar + + + + javax.mail + mail + ${javax.mail.version} + runtime + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailDataImpl.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailDataImpl.java new file mode 100644 index 0000000..052cf6c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailDataImpl.java @@ -0,0 +1,170 @@ +package com.deepclone.lw.beans.mailer; + + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.deepclone.lw.interfaces.mailer.AlreadySentException; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.MissingDataException; +import com.deepclone.lw.interfaces.mailer.NotSentException; + + + +/** + * The mail data implementation consists in a single-use message sender that includes templating + * capabilities. + * + * @author tseeker + */ +class MailDataImpl + implements MailData +{ + + /* Regular expressions used to identify template variables */ + private static final String camelCase = "[a-z]+([A-Z][a-z]*)*"; + private static final String fieldName = camelCase + "(\\." + camelCase + ")*"; + private static final String field = "\\$\\{(" + fieldName + ")\\}"; + private static final Pattern fPattern = Pattern.compile( field ); + + /** Queue-handling task */ + private final MailQueueHandler mailQueueTask; + + /** Address of the message's recipient */ + private final String mailTo; + + /** Template string of the message */ + private final String template; + + /** Field values to use when replacing */ + private Map< String , Object > fields = new HashMap< String , Object >( ); + + /** Flag indicating whether the message has already been sent */ + private Boolean sent = false; + + + /** + * Initialise the instance's data then extract variable names from the template string.f + * + * @param task + * the queue-handling task + * @param target + * the address of the message's recipient + * @param template + * the message's template + */ + MailDataImpl( MailQueueHandler task , String target , String template ) + { + this.mailQueueTask = task; + this.mailTo = target; + this.template = template; + this.parseTemplate( ); + } + + + /** + * Extracts variable names from the template. + */ + private void parseTemplate( ) + { + Matcher m = fPattern.matcher( this.template ); + while ( m.find( ) ) { + this.fields.put( m.group( 1 ) , null ); + } + } + + + /** + * Makes sure a message is never sent twice. + * + * @throws AlreadySentException + * if the message had already been sent. + */ + private void checkSent( ) + throws AlreadySentException + { + synchronized ( this.sent ) { + if ( this.sent ) { + throw new AlreadySentException( ); + } + this.sent = true; + } + } + + + /** + * Prepares the message's data. + * + * This method will check that the message has not been sent, then start replacing variables by + * their assigned values in the template. It will return the fully-substituted message text. + * + * @return the message's text after variable substitution + * @throws AlreadySentException + * if the message has already been sent + * @throws MissingDataException + * if one of the variables has no value + */ + private String prepareMail( ) + throws AlreadySentException , MissingDataException + { + this.checkSent( ); + + String message = this.template; + for ( String fName : this.fields.keySet( ) ) { + Object value = this.fields.get( fName ); + if ( value == null ) { + synchronized ( this.sent ) { + this.sent = false; + } + throw new MissingDataException( fName ); + } + + String regexp = "\\$\\{"; + regexp += fName.replace( (CharSequence) "." , (CharSequence) "\\." ); + regexp += "\\}"; + + Pattern p = Pattern.compile( regexp ); + message = p.matcher( message ).replaceAll( value.toString( ).replace( "$" , "\\$" ) ); + } + + return message; + } + + + /* Documented in MailData interface */ + @Override + public void queue( ) + throws AlreadySentException , MissingDataException + { + this.mailQueueTask.queueMessage( this.mailTo , this.prepareMail( ) ); + } + + + /* Documented in MailData interface */ + @Override + public void sendNow( ) + throws AlreadySentException , NotSentException , MissingDataException + { + this.mailQueueTask.sendMessage( this.mailTo , this.prepareMail( ) ); + } + + + /* Documented in MailData interface */ + @Override + public void setData( String identifier , Object value ) + { + if ( !this.fields.containsKey( identifier ) ) { + throw new IllegalArgumentException( "unknown field '" + identifier + "'" ); + } + if ( this.fields.get( identifier ) != null ) { + throw new IllegalArgumentException( "field '" + identifier + "' already set" ); + } + if ( value == null ) { + throw new IllegalArgumentException( "field value may not be null" ); + } + this.fields.put( identifier , value ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueHandler.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueHandler.java new file mode 100644 index 0000000..8b35e5c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueHandler.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.mailer; + + +import com.deepclone.lw.interfaces.mailer.NotSentException; + + + +/** + * Mail queue handler interface + * + * This interface is normally implemented by the mail queue task. However, it is required in order + * to test the MailData implementation separately. + * + * @author tseeker + */ +interface MailQueueHandler +{ + + /** + * Stops the queue-handling task. + * + * This method inserts a terminator into the queue, then waits for the queue to be + * de-initialised (which indicates that the main loop ended). + */ + public void stop( ); + + + /** + * Adds a message to the queue. + * + * @param mailTo + * the address of the email's recipient. + * @param message + * the contents of the email + */ + public void queueMessage( String mailTo , String message ); + + + /** + * Sends a message. + * + * @param mailTo + * address of the email's recipient + * @param message + * contents of the message + * @throws NotSentException + * if the mail could not be sent for some reason + */ + public void sendMessage( String mailTo , String message ) + throws NotSentException; + +} \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueItem.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueItem.java new file mode 100644 index 0000000..d882c66 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueItem.java @@ -0,0 +1,13 @@ +package com.deepclone.lw.beans.mailer; + + +/** + * This empty abstract class is used as the base class for both queued mails and termination + * signals. + * + * @author tseeker + */ +abstract class MailQueueItem +{ + // EMPTY +} \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTask.java new file mode 100644 index 0000000..4b5d478 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTask.java @@ -0,0 +1,211 @@ +package com.deepclone.lw.beans.mailer; + + +import java.util.concurrent.LinkedBlockingQueue; + +import org.springframework.mail.MailException; +import org.springframework.mail.MailSender; +import org.springframework.mail.SimpleMailMessage; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.mailer.NotSentException; + + + +/** + * This class implements the queue-handling task of the mailer bean. This task is responsible for + * sending mail asynchronously, but it also provides a method allowing mails to be sent + * synchronously by {@link MailData} instances. + * + * @author tseeker + */ +class MailQueueTask + implements Runnable , MailQueueHandler +{ + + /** The bean's system logger */ + private final SystemLogger logger; + + /** The From: address */ + private final String mailFrom; + + /** The mail sender bean */ + private final MailSender mailSender; + + /** The mail queue */ + private LinkedBlockingQueue< MailQueueItem > queue; + + + /** Copies the various data and references */ + MailQueueTask( SystemLogger logger , String mailFrom , LinkedBlockingQueue< MailQueueItem > queue , + MailSender mailSender ) + { + this.logger = logger; + this.mailFrom = mailFrom; + this.queue = queue; + this.mailSender = mailSender; + } + + + /** + * Stops the queue-handling task. + * + * This method inserts a terminator into the queue, then waits for the queue to be + * de-initialised (which indicates that the main loop ended). + */ + @Override + public void stop( ) + { + this.queue.add( new MailQueueTerminator( ) ); + while ( this.queue != null ) { + Thread.yield( ); + } + } + + + /** + * Adds a message to the queue. + * + * This method adds a new {@link QueuedMail} instance to the queue, initialising it using the + * specified parameters. Should the queueing fail for some reason, the error is logged. + * + * @param mailTo + * the address of the email's recipient. + * @param message + * the contents of the email + */ + @Override + public void queueMessage( String mailTo , String message ) + { + try { + this.queue.put( new QueuedMail( mailTo , message ) ); + this.logger.log( LogLevel.DEBUG , "queued mail to " + mailTo ); + } catch ( InterruptedException e ) { + // This should never happen, as the queue is non-blocking on this end + this.logger.log( LogLevel.ERROR , "could not queue mail to " + mailTo , e ); + } + this.logger.flush( ); + } + + + /** + * Sends a message. + * + * This method splits the message into two parts (subject and body), then initialises the + * {@link SimpleMailMessage} instance corresponding to the mail, before finally trying to send + * it through the mail sender bean. + * + * @param mailTo + * address of the email's recipient + * @param message + * contents of the message + * @throws NotSentException + * if the mail could not be sent for some reason + */ + @Override + public void sendMessage( String mailTo , String message ) + throws NotSentException + { + // Extract title and body from message + // FIXME: there are better ways to do this + String title = ""; + int i = 0; + while ( i < message.length( ) && message.charAt( i ) != '\n' ) { + title += message.charAt( i ); + i++; + } + while ( i < message.length( ) && message.charAt( i ) == '\n' ) { + i++; + } + String body = ( i == message.length( ) ) ? "" : message.substring( i ); + + // Write log if the title or the body are empty + if ( title.equals( "" ) ) { + this.logger.log( LogLevel.WARNING , "sending email with no title" ); + } + if ( body.equals( "" ) ) { + this.logger.log( LogLevel.WARNING , "sending email with empty body" ); + } + this.logger.flush( ); + + // Create actual mail data + SimpleMailMessage smm = new SimpleMailMessage( ); + smm.setFrom( this.mailFrom ); + smm.setTo( mailTo ); + smm.setSubject( title ); + smm.setText( body ); + + // Try to send it + synchronized ( this.mailSender ) { + try { + this.mailSender.send( smm ); + } catch ( MailException e ) { + this.logger.log( LogLevel.INFO , "could not send mail to " + mailTo , e ).flush( ); + throw new NotSentException( e ); + } + } + this.logger.log( LogLevel.DEBUG , "sent mail to " + mailTo ).flush( ); + } + + + /** + * Main queue-handling loop. + * + * This method contains the task's main loop. It constantly polls the queue for incoming + * information, sending queued email. All errors while sending messages are ignored. When a + * terminator is found on the queue, all remaining messages will be flushed and the main loop + * will exit. + */ + @Override + public void run( ) + { + boolean keepRunning = true; + LinkedBlockingQueue< MailQueueItem > queue = this.queue; + while ( keepRunning ) { + MailQueueItem item; + + // Wait for items to send + try { + item = queue.take( ); + } catch ( InterruptedException e ) { + this.logger.log( LogLevel.WARNING , "mail queue consumer interrupted" ).flush( ); + continue; + } + + // Handle terminators + if ( item instanceof MailQueueTerminator ) { + keepRunning = false; + this.logger.log( LogLevel.INFO , "termination order received" ).flush( ); + } + + do { + // Send mail + if ( item instanceof QueuedMail ) { + QueuedMail mail = (QueuedMail) item; + try { + this.sendMessage( mail.mailTo , mail.message ); + } catch ( NotSentException e ) { + // Unable to send; it's been logged, so we ignore it + } + } + // If we're terminating, flush the queue + if ( ! ( keepRunning || queue.isEmpty( ) ) ) { + boolean fail; + do { + try { + item = queue.take( ); + fail = false; + } catch ( InterruptedException e ) { + fail = true; + } + } while ( fail ); + } + } while ( !keepRunning && !queue.isEmpty( ) ); + } + + // Kill the queue + this.queue = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTerminator.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTerminator.java new file mode 100644 index 0000000..d8f6fd3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailQueueTerminator.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.beans.mailer; + + +/** + * This empty class is a mail queue item which indicates that the mail queue handling task should + * terminate. + * + * @author tseeker + */ +class MailQueueTerminator + extends MailQueueItem +{ + // EMPTY +} \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailerBean.java new file mode 100644 index 0000000..c57f329 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/MailerBean.java @@ -0,0 +1,140 @@ +package com.deepclone.lw.beans.mailer; + + +import java.util.concurrent.LinkedBlockingQueue; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailSender; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.*; +import com.deepclone.lw.interfaces.i18n.*; +import com.deepclone.lw.interfaces.mailer.*; + + + +/** + * The mailer bean spawns a queue-handling task on initialisation. It is responsible for + * initialising mail data instances, giving them access to the queue-handling task. When the + * container destroys the bean, it inserts a terminator in the mail queue then waits for the task to + * end. + * + * @author tseeker + */ +public class MailerBean + implements Mailer , InitializingBean , DisposableBean +{ + /** The default From: address for mails sent by the bean */ + private final static String defaultSender = "webmaster@legacyworlds.com"; + + /** Translator bean */ + private Translator translator; + + /** Spring mail sender bean */ + private MailSender mailSender; + + /** System logger for the mailer bean */ + private SystemLogger logger; + + /** From: address to use when sending mails */ + private String mailFrom = defaultSender; + + /** Mail queue */ + private LinkedBlockingQueue< MailQueueItem > queue; + + /** Queue-handling task */ + private MailQueueTask task; + + + /** + * Sets the translator bean (DI) + * + * @param translator + * the translator bean + */ + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + /** + * Sets the mail sender bean (DI) + * + * @param mailSender + * the mail sender bean + */ + @Autowired( required = true ) + public void setMailSender( MailSender mailSender ) + { + this.mailSender = mailSender; + } + + + /** + * Initialises the system logger (DI) + * + * @param logger + * the logger bean + */ + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "Mailer" ); + } + + + /** + * Changes the From: address. + * + * @param mailFrom + * the new From: address + */ + public void setMailFrom( String mailFrom ) + { + this.mailFrom = mailFrom; + } + + + /** + * Creates the mail queue and spawns the queue-handling task when the bean is initialised. + */ + @Override + public void afterPropertiesSet( ) + { + this.logger.log( LogLevel.INFO , "mailer task initialising" ).flush( ); + + this.queue = new LinkedBlockingQueue< MailQueueItem >( ); + this.task = new MailQueueTask( this.logger , this.mailFrom , this.queue , this.mailSender ); + + Thread t = new Thread( this.task ); + t.start( ); + } + + + /** + * Terminates and waits for the queue-handling task when the bean is destroyed. + */ + @Override + public void destroy( ) + { + this.task.stop( ); + this.task = null; + this.queue = null; + } + + + /* Documentation in Mailer interface */ + @Override + public MailData createMail( String language , String contentsDef , String target ) + throws TranslationException + { + + String template = this.translator.translate( language , contentsDef ); + return new MailDataImpl( this.task , target , template ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/QueuedMail.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/QueuedMail.java new file mode 100644 index 0000000..c01b9da --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/java/com/deepclone/lw/beans/mailer/QueuedMail.java @@ -0,0 +1,26 @@ +package com.deepclone.lw.beans.mailer; + + +/** + * This class represents a queued mail on the mail task's queue. It carries both the target address + * and the message's contents. + * + * @author tseeker + */ +class QueuedMail + extends MailQueueItem +{ + /** The target mail address */ + final String mailTo; + + /** The contents of the email */ + final String message; + + + /** Initialises the queued mail */ + QueuedMail( String mailTo , String message ) + { + this.mailTo = mailTo; + this.message = message; + } +} \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer-beans.xml new file mode 100644 index 0000000..e5e284f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer-beans.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer/mailer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer/mailer-bean.xml new file mode 100644 index 0000000..a430dd0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-mailer/src/main/resources/configuration/mailer/mailer-bean.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.project new file mode 100644 index 0000000..f7bc35d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-naming + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..d627e17 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Thu Feb 25 09:52:02 CET 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..8e6c298 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Feb 25 09:52:02 CET 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/pom.xml new file mode 100644 index 0000000..00964d7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-naming + 5.99.1 + Legacy Worlds object naming system + This module contains the beans responsible for managing the names of the various objects (players and planets). + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamesManagerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamesManagerBean.java new file mode 100644 index 0000000..c246ffc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamesManagerBean.java @@ -0,0 +1,98 @@ +package com.deepclone.lw.beans.naming; + + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.naming.GetNamesResponse; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.cmd.admin.naming.NamesSummaryResponse; +import com.deepclone.lw.cmd.admin.naming.NamesSummaryResponse.Entry; +import com.deepclone.lw.interfaces.naming.NamesManager; +import com.deepclone.lw.interfaces.naming.NamingDAO; + + + +@Transactional +public class NamesManagerBean + implements NamesManager +{ + + private NamingDAO namingDao; + + + @Autowired( required = true ) + public void setNamingDao( NamingDAO namingDao ) + { + this.namingDao = namingDao; + } + + + @Override + public NamesSummaryResponse getSummary( Administrator admin ) + { + List< Entry > entries = new LinkedList< Entry >( ); + for ( Map.Entry< NameType , Long > entry : this.namingDao.countNames( ).entrySet( ) ) { + entries.add( new Entry( entry.getKey( ) , entry.getValue( ) ) ); + } + return new NamesSummaryResponse( admin , entries ); + } + + + @Override + public GetNamesResponse getNames( Administrator admin , NameType type ) + { + return new GetNamesResponse( admin , type , this.namingDao.getNames( type ) ); + } + + + @Override + public void validateMapNames( Administrator admin , int[] ids ) + { + for ( int id : ids ) { + this.namingDao.validateMapName( admin.getId( ) , id ); + } + } + + + @Override + public void allowMapNameChanges( Administrator admin , int[] ids ) + { + for ( int id : ids ) { + this.namingDao.allowMapNameChange( admin.getId( ) , id ); + } + } + + + @Override + public void rejectMapNames( Administrator admin , int[] ids , boolean ban ) + { + for ( int id : ids ) { + this.namingDao.rejectMapName( admin.getId( ) , id , ban ); + } + } + + + @Override + public void rejectEmpireNames( Administrator admin , int[] ids , boolean ban ) + { + for ( int id : ids ) { + this.namingDao.rejectEmpireName( admin.getId( ) , id , ban ); + } + } + + + @Override + public void rejectAllianceNames( Administrator admin , int[] ids ) + { + for ( int id : ids ) { + this.namingDao.rejectAllianceName( admin.getId( ) , id ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamingDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamingDAOBean.java new file mode 100644 index 0000000..2c2be52 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/java/com/deepclone/lw/beans/naming/NamingDAOBean.java @@ -0,0 +1,215 @@ +package com.deepclone.lw.beans.naming; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.admin.naming.Name; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.interfaces.naming.NamingDAO; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.utils.StoredProc; + + + +public class NamingDAOBean + implements NamingDAO +{ + private static final String sCountNames = "SELECT * FROM naming.names_status_view ORDER BY status"; + + private static class CountRow + { + String status; + long count; + } + + private SimpleJdbcTemplate dTemplate; + + private StoredProc fGetEmpire; + private StoredProc fRenamePlanet; + private StoredProc fValidateMapName; + private StoredProc fAllowMapRename; + private StoredProc fRejectMapName; + private StoredProc fRejectEmpireName; + private StoredProc fRejectAllianceName; + + private final RowMapper< Name > mName; + private final RowMapper< CountRow > mCount; + + + public NamingDAOBean( ) + { + this.mName = new RowMapper< Name >( ) { + @Override + public Name mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new Name( rs.getInt( "id" ) , rs.getString( "name" ) , rs.getString( "extra" ) , NameType + .valueOf( rs.getString( "status" ) ) ); + } + }; + this.mCount = new RowMapper< CountRow >( ) { + @Override + public CountRow mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + CountRow cRow = new CountRow( ); + cRow.count = rs.getLong( "count" ); + cRow.status = rs.getString( "status" ); + return cRow; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fGetEmpire = new StoredProc( dataSource , "emp" , "get_current" ); + this.fGetEmpire.addParameter( "account_id" , Types.INTEGER ); + this.fGetEmpire.addOutput( "empire_id" , Types.INTEGER ); + + this.fRenamePlanet = new StoredProc( dataSource , "verse" , "rename_planet" ); + this.fRenamePlanet.addParameter( "planet_id" , Types.INTEGER ); + this.fRenamePlanet.addParameter( "new_name" , Types.VARCHAR ); + this.fRenamePlanet.addOutput( "err_code" , Types.INTEGER ); + + this.fValidateMapName = new StoredProc( dataSource , "naming" , "validate_map_name" ); + this.fValidateMapName.addParameter( "admin_id" , Types.INTEGER ); + this.fValidateMapName.addParameter( "name_id" , Types.INTEGER ); + + this.fAllowMapRename = new StoredProc( dataSource , "naming" , "allow_map_name_change" ); + this.fAllowMapRename.addParameter( "admin_id" , Types.INTEGER ); + this.fAllowMapRename.addParameter( "name_id" , Types.INTEGER ); + + this.fRejectMapName = new StoredProc( dataSource , "naming" , "reject_map_name" ); + this.fRejectMapName.addParameter( "admin_id" , Types.INTEGER ); + this.fRejectMapName.addParameter( "name_id" , Types.INTEGER ); + this.fRejectMapName.addParameter( "ban_name" , Types.BOOLEAN ); + + this.fRejectEmpireName = new StoredProc( dataSource , "naming" , "reject_empire_name" ); + this.fRejectEmpireName.addParameter( "admin_id" , Types.INTEGER ); + this.fRejectEmpireName.addParameter( "name_id" , Types.INTEGER ); + this.fRejectEmpireName.addParameter( "ban_name" , Types.BOOLEAN ); + + this.fRejectAllianceName = new StoredProc( dataSource , "naming" , "reject_alliance_name" ); + this.fRejectAllianceName.addParameter( "admin_id" , Types.INTEGER ); + this.fRejectAllianceName.addParameter( "alliance_id" , Types.INTEGER ); + } + + + @Override + public List< String > getEmpireNames( int account ) + { + String sql = "SELECT name FROM naming.empire_names WHERE owner_id = ? ORDER BY name"; + RowMapper< String > mapper = new RowMapper< String >( ) { + @Override + public String mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return rs.getString( "name" ); + } + }; + + return this.dTemplate.query( sql , mapper , account ); + } + + + @Override + public Integer getCurrentEmpire( Account account ) + { + return (Integer) this.fGetEmpire.execute( account.getId( ) ).get( "empire_id" ); + } + + + @Override + public int renamePlanet( int id , String name ) + { + return (Integer) this.fRenamePlanet.execute( id , name ).get( "err_code" ); + } + + + @Override + public Map< NameType , Long > countNames( ) + { + Map< NameType , Long > result = new HashMap< NameType , Long >( ); + for ( NameType t : NameType.values( ) ) { + result.put( t , 0L ); + } + + for ( CountRow qr : this.dTemplate.query( sCountNames , this.mCount ) ) { + NameType type = NameType.valueOf( qr.status ); + result.put( type , qr.count ); + } + + result.put( NameType.MAP_CHANGED , result.get( NameType.MAP_PENDING ) + result.get( NameType.MAP_VALIDATED ) ); + + return result; + } + + + @Override + public List< Name > getNames( NameType type ) + { + String sql = "SELECT * FROM naming.names_view WHERE status "; + if ( type == NameType.MAP_CHANGED ) { + sql += "IN ('MAP_PENDING','MAP_VALIDATED')"; + } else { + sql += "= '" + type + "'"; + } + if ( type == NameType.ALLIANCE || type == NameType.EMPIRE ) { + sql += " ORDER BY id DESC"; + } else { + sql += " ORDER BY name"; + } + + return this.dTemplate.query( sql , this.mName ); + } + + + @Override + public void validateMapName( int administrator , int name ) + { + this.fValidateMapName.execute( administrator , name ); + } + + + @Override + public void allowMapNameChange( int administrator , int name ) + { + this.fAllowMapRename.execute( administrator , name ); + } + + + @Override + public void rejectMapName( int administrator , int name , boolean ban ) + { + this.fRejectMapName.execute( administrator , name , ban ); + } + + + @Override + public void rejectEmpireName( int administrator , int empire , boolean ban ) + { + this.fRejectEmpireName.execute( administrator , empire , ban ); + } + + + @Override + public void rejectAllianceName( int administrator , int alliance ) + { + this.fRejectAllianceName.execute( administrator , alliance ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming-beans.xml new file mode 100644 index 0000000..f4ab8cc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming-beans.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/names-manager-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/names-manager-bean.xml new file mode 100644 index 0000000..060f506 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/names-manager-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/naming-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/naming-dao-bean.xml new file mode 100644 index 0000000..0a3dfe5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-naming/src/main/resources/configuration/naming/naming-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.project new file mode 100644 index 0000000..e30c96f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-simple + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..a82c1db --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Thu Apr 22 11:23:34 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..fa121cb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Apr 22 11:23:34 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/pom.xml new file mode 100644 index 0000000..e1929cf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + com.deepclone.lw + legacyworlds-server-beans-simple + 5.99.1 + Legacy Worlds simple game + This module contains code that corresponds to a simple "placeholder" game. This code should become obsolete over time, as it is being replaced with actual LWB6 code, until the module can finally be removed. + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceDAOBean.java new file mode 100644 index 0000000..df2d7cc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceDAOBean.java @@ -0,0 +1,265 @@ +package com.deepclone.lw.beans.empire; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceLeaderData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceMemberData; +import com.deepclone.lw.cmd.player.gdata.alliance.AlliancePlanetData; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; +import com.deepclone.lw.interfaces.game.AllianceDAO; +import com.deepclone.lw.sqld.game.AllianceMembership; +import com.deepclone.lw.utils.StoredProc; + + + +public class AllianceDAOBean + implements AllianceDAO +{ + + private SimpleJdbcTemplate dTemplate; + private StoredProc fCreateAlliance; + private StoredProc fJoinAlliance; + private StoredProc fCancelJoin; + private StoredProc fLeaveAlliance; + private StoredProc fTransferLeadership; + private StoredProc fAcceptMembers; + private StoredProc fRejectMembers; + private StoredProc fKickMembers; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fCreateAlliance = new StoredProc( dataSource , "emp" , "create_alliance" ); + this.fCreateAlliance.addParameter( "empire_id" , Types.INTEGER ); + this.fCreateAlliance.addParameter( "alliance_tag" , Types.VARCHAR ); + this.fCreateAlliance.addParameter( "alliance_name" , Types.VARCHAR ); + this.fCreateAlliance.addOutput( "alliance_id" , Types.INTEGER ); + + this.fJoinAlliance = new StoredProc( dataSource , "emp" , "join_alliance" ); + this.fJoinAlliance.addParameter( "empire_id" , Types.INTEGER ); + this.fJoinAlliance.addParameter( "alliance_id" , Types.INTEGER ); + this.fJoinAlliance.addOutput( "success" , Types.BOOLEAN ); + + this.fCancelJoin = new StoredProc( dataSource , "emp" , "cancel_join" ); + this.fCancelJoin.addParameter( "empire_id" , Types.INTEGER ); + + this.fLeaveAlliance = new StoredProc( dataSource , "emp" , "leave_alliance" ); + this.fLeaveAlliance.addParameter( "empire_id" , Types.INTEGER ); + + this.fTransferLeadership = new StoredProc( dataSource , "emp" , "transfer_leadership" ); + this.fTransferLeadership.addParameter( "empire_id" , Types.INTEGER ); + this.fTransferLeadership.addParameter( "target_id" , Types.INTEGER ); + + this.fAcceptMembers = new StoredProc( dataSource , "emp" , "accept_members" ); + this.fAcceptMembers.addParameter( "empire_id" , Types.INTEGER ); + this.fAcceptMembers.addParameter( "member_ids" , "INT[]" ); + + this.fRejectMembers = new StoredProc( dataSource , "emp" , "reject_members" ); + this.fRejectMembers.addParameter( "empire_id" , Types.INTEGER ); + this.fRejectMembers.addParameter( "member_ids" , "INT[]" ); + + this.fKickMembers = new StoredProc( dataSource , "emp" , "kick_members" ); + this.fKickMembers.addParameter( "empire_id" , Types.INTEGER ); + this.fKickMembers.addParameter( "member_ids" , "INT[]" ); + } + + + @Override + public Integer findAlliance( String tag ) + { + String sql = "SELECT id FROM emp.alliances_public WHERE lower( tag ) = ?"; + try { + return this.dTemplate.queryForInt( sql , tag.toLowerCase( ) ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public AllianceMembership getAlliance( int empireId ) + { + String sql = "SELECT alliance , pending FROM emp.alliance_membership WHERE id = ?"; + RowMapper< AllianceMembership > mapper = new RowMapper< AllianceMembership >( ) { + @Override + public AllianceMembership mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AllianceMembership am = new AllianceMembership( ); + am.setAllianceId( rs.getInt( "alliance" ) ); + am.setPending( rs.getBoolean( "pending" ) ); + return am; + } + }; + try { + return this.dTemplate.queryForObject( sql , mapper , empireId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public Integer createAlliance( int empireId , String tag , String name ) + { + return (Integer) this.fCreateAlliance.execute( empireId , tag , name ).get( "alliance_id" ); + } + + + @Override + public PublicAllianceInformation getPublicInformation( int allianceId ) + { + String sql = "SELECT * FROM emp.alliances_public WHERE id = ?"; + RowMapper< PublicAllianceInformation > mapper = new RowMapper< PublicAllianceInformation >( ) { + @Override + public PublicAllianceInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new PublicAllianceInformation( rs.getInt( "id" ) , rs.getString( "tag" ) , + rs.getString( "name" ) , rs.getInt( "leader_id" ) , rs.getString( "leader_name" ) , rs + .getLong( "planets" ) ); + } + }; + + try { + return this.dTemplate.queryForObject( sql , mapper , allianceId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + private List< NameIdPair > getMembers( int allianceId , boolean pending ) + { + String mSql = "SELECT id , name FROM emp.alliance_membership WHERE alliance = ? AND "; + if ( !pending ) { + mSql += "NOT "; + } + mSql += "pending"; + RowMapper< NameIdPair > mMapper = new RowMapper< NameIdPair >( ) { + @Override + public NameIdPair mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new NameIdPair( rs.getInt( 1 ) , rs.getString( 2 ) ); + } + }; + List< NameIdPair > members = this.dTemplate.query( mSql , mMapper , allianceId ); + return members; + } + + + private List< AlliancePlanetData > getPlanets( int allianceId ) + { + String pSql = "SELECT * FROM emp.alliance_planets WHERE alliance = ?"; + RowMapper< AlliancePlanetData > pMapper = new RowMapper< AlliancePlanetData >( ) { + @Override + public AlliancePlanetData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AlliancePlanetData apd = new AlliancePlanetData( ); + + apd.setId( rs.getInt( "planet_id" ) ); + apd.setName( rs.getString( "planet_name" ) ); + apd.setX( rs.getInt( "x" ) ); + apd.setY( rs.getInt( "y" ) ); + apd.setOrbit( rs.getInt( "orbit" ) ); + apd.setOwnerId( rs.getInt( "owner_id" ) ); + apd.setOwner( rs.getString( "owner_name" ) ); + + apd.setBattle( rs.getBoolean( "battle" ) ); + apd.setAttack( rs.getLong( "attack" ) ); + apd.setDefence( rs.getLong( "defence" ) ); + + return apd; + } + }; + return this.dTemplate.query( pSql , pMapper , allianceId ); + } + + + @Override + public AllianceMemberData getMemberData( int allianceId ) + { + List< NameIdPair > members = this.getMembers( allianceId , false ); + List< AlliancePlanetData > planets = this.getPlanets( allianceId ); + return new AllianceMemberData( members , planets ); + } + + + @Override + public AllianceLeaderData getLeaderData( int allianceId ) + { + return new AllianceLeaderData( this.getMembers( allianceId , true ) ); + } + + + @Override + public boolean requestJoin( int empireId , int allianceId ) + { + return (Boolean) this.fJoinAlliance.execute( empireId , allianceId ).get( "success" ); + } + + + @Override + public void cancelJoin( int empireId ) + { + this.fCancelJoin.execute( empireId ); + } + + + @Override + public void leave( int empireId ) + { + this.fLeaveAlliance.execute( empireId ); + } + + + @Override + public void transferLeadership( int empireId , int toMember ) + { + this.fTransferLeadership.execute( empireId , toMember ); + } + + + private String toSQLArray( int[] members ) + { + StringBuilder mArray = new StringBuilder( ).append( "{" ); + for ( int i = 0 ; i < members.length ; i++ ) { + mArray.append( members[ i ] ).append( ( i == members.length - 1 ) ? '}' : ',' ); + } + String mStr = mArray.toString( ); + return mStr; + } + + + @Override + public void manageRequests( int empireId , boolean accept , int[] members ) + { + StoredProc proc = accept ? this.fAcceptMembers : this.fRejectMembers; + proc.execute( empireId , this.toSQLArray( members ) ); + } + + + @Override + public void kick( int empireId , int[] members ) + { + this.fKickMembers.execute( empireId , this.toSQLArray( members ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceManagementBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceManagementBean.java new file mode 100644 index 0000000..0d77488 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/AllianceManagementBean.java @@ -0,0 +1,176 @@ +package com.deepclone.lw.beans.empire; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.alliances.AllianceStatusResponse; +import com.deepclone.lw.cmd.player.alliances.CreateAllianceResponse; +import com.deepclone.lw.cmd.player.alliances.JoinAllianceResponse; +import com.deepclone.lw.cmd.player.alliances.ViewAllianceResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceCreationStatus; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceLeaderData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceMemberData; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; +import com.deepclone.lw.interfaces.game.AllianceDAO; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.sqld.game.AllianceMembership; + + + +@Transactional +public class AllianceManagementBean + implements AllianceManagement +{ + + private EmpireManagement empireManagement; + private AllianceDAO allianceDao; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Autowired( required = true ) + public void setAllianceDao( AllianceDAO allianceDao ) + { + this.allianceDao = allianceDao; + } + + + private AllianceData getAllianceData( int empireId ) + { + PublicAllianceInformation pub = null; + AllianceMemberData member = null; + AllianceLeaderData leader = null; + + AllianceMembership m = this.allianceDao.getAlliance( empireId ); + if ( m != null ) { + int allianceId = m.getAllianceId( ); + pub = this.allianceDao.getPublicInformation( allianceId ); + if ( !m.isPending( ) ) { + member = this.allianceDao.getMemberData( allianceId ); + if ( empireId == pub.getLeaderId( ) ) { + leader = this.allianceDao.getLeaderData( allianceId ); + } + } + } + + return new AllianceData( pub , member , leader ); + } + + + @Override + public AllianceStatusResponse getView( int empireId ) + { + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + AllianceData alliance = this.getAllianceData( empireId ); + return new AllianceStatusResponse( page , alliance ); + } + + + @Override + public AllianceStatusResponse getInformation( int empireId , String tag ) + { + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + AllianceData alliance = this.getAllianceData( empireId ); + + if ( "".equals( tag ) ) { + return new AllianceStatusResponse( page , alliance ); + } + + Integer allianceId = this.allianceDao.findAlliance( tag ); + PublicAllianceInformation pub; + if ( allianceId == null ) { + pub = null; + } else { + pub = this.allianceDao.getPublicInformation( allianceId ); + } + + return new ViewAllianceResponse( page , alliance , tag , pub ); + } + + + @Override + public AllianceStatusResponse create( int empireId , String tag , String name ) + { + Integer aId = this.allianceDao.createAlliance( empireId , tag , name ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + AllianceData alliance = this.getAllianceData( empireId ); + + if ( aId == null ) { + AllianceCreationStatus acs = new AllianceCreationStatus( tag , ObjectNameError.UNAVAILABLE , name , null ); + return new CreateAllianceResponse( page , alliance , acs ); + } + + return new AllianceStatusResponse( page , alliance ); + } + + + @Override + public AllianceStatusResponse requestJoin( int empireId , String tag ) + { + Integer aId = this.allianceDao.findAlliance( tag ); + boolean joined; + if ( aId == null ) { + joined = false; + } else { + joined = this.allianceDao.requestJoin( empireId , aId ); + } + + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + AllianceData alliance = this.getAllianceData( empireId ); + + return joined + ? new AllianceStatusResponse( page , alliance ) + : new JoinAllianceResponse( page , alliance , tag ); + } + + + @Override + public AllianceStatusResponse cancelJoin( int empireId ) + { + this.allianceDao.cancelJoin( empireId ); + return this.getView( empireId ); + } + + + @Override + public AllianceStatusResponse leave( int empireId ) + { + this.allianceDao.leave( empireId ); + return this.getView( empireId ); + } + + + @Override + public AllianceStatusResponse transferLeadership( int empireId , int toMember ) + { + this.allianceDao.transferLeadership( empireId , toMember ); + return this.getView( empireId ); + } + + + @Override + public AllianceStatusResponse manageRequests( int empireId , boolean accept , int[] members ) + { + this.allianceDao.manageRequests( empireId , accept , members ); + return this.getView( empireId ); + } + + + @Override + public AllianceStatusResponse kick( int empireId , int[] members ) + { + this.allianceDao.kick( empireId , members ); + return this.getView( empireId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireDAOBean.java new file mode 100644 index 0000000..daaa57b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireDAOBean.java @@ -0,0 +1,289 @@ +package com.deepclone.lw.beans.empire; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetListData; +import com.deepclone.lw.cmd.player.gdata.empire.OverviewData; +import com.deepclone.lw.interfaces.game.EmpireDAO; +import com.deepclone.lw.sqld.game.EmpireTechLine; +import com.deepclone.lw.sqld.game.EmpireTechnology; +import com.deepclone.lw.sqld.game.GeneralInformation; +import com.deepclone.lw.utils.StoredProc; + + + +public class EmpireDAOBean + implements EmpireDAO +{ + private SimpleJdbcTemplate dTemplate; + private StoredProc fImplementTech; + private StoredProc fAddEmpEnemy; + private StoredProc fAddAllEnemy; + private StoredProc fRemoveEmpEnemy; + private StoredProc fRemoveAllEnemy; + private StoredProc fGetNewPlanet; + + private final PlanetListMapper mPlanetList = new PlanetListMapper( ); + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fImplementTech = new StoredProc( dataSource , "emp" , "implement_tech" ); + this.fImplementTech.addParameter( "empire_id" , Types.INTEGER ); + this.fImplementTech.addParameter( "line_id" , Types.INTEGER ); + + this.fAddEmpEnemy = new StoredProc( dataSource , "emp" , "add_enemy_empire" ); + this.fAddEmpEnemy.addParameter( "empire_id" , Types.INTEGER ); + this.fAddEmpEnemy.addParameter( "enemy_name" , Types.VARCHAR ); + this.fAddEmpEnemy.addOutput( "err_code" , Types.INTEGER ); + + this.fAddAllEnemy = new StoredProc( dataSource , "emp" , "add_enemy_alliance" ); + this.fAddAllEnemy.addParameter( "empire_id" , Types.INTEGER ); + this.fAddAllEnemy.addParameter( "enemy_tag" , Types.VARCHAR ); + this.fAddAllEnemy.addOutput( "err_code" , Types.INTEGER ); + + this.fRemoveEmpEnemy = new StoredProc( dataSource , "emp" , "remove_enemy_empires" ); + this.fRemoveEmpEnemy.addParameter( "empire_id" , Types.INTEGER ); + this.fRemoveEmpEnemy.addParameter( "to_remove" , "INT[]" ); + + this.fRemoveAllEnemy = new StoredProc( dataSource , "emp" , "remove_enemy_alliances" ); + this.fRemoveAllEnemy.addParameter( "empire_id" , Types.INTEGER ); + this.fRemoveAllEnemy.addParameter( "to_remove" , "INT[]" ); + + this.fGetNewPlanet = new StoredProc( dataSource , "emp" , "get_new_planet" ); + this.fGetNewPlanet.addParameter( "empire_id" , Types.INTEGER ); + this.fGetNewPlanet.addParameter( "planet_name" , Types.VARCHAR ); + this.fGetNewPlanet.addOutput( "err_code" , Types.INTEGER ); + } + + + @Override + public GeneralInformation getInformation( int empireId ) + { + String sql = "SELECT * FROM emp.general_information WHERE id = ?"; + RowMapper< GeneralInformation > mapper = new RowMapper< GeneralInformation >( ) { + @Override + public GeneralInformation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + String st = rs.getString( "status" ); + Character status = ( st == null ) ? null : st.charAt( 0 ); + return new GeneralInformation( status , rs.getString( "name" ) , rs.getString( "alliance" ) , rs + .getLong( "cash" ) , rs.getLong( "game_time" ) , rs.getInt( "account_id" ) ); + } + }; + try { + return this.dTemplate.queryForObject( sql , mapper , empireId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public List< NameIdPair > getPlanets( int empireId ) + { + String sql = "SELECT id , name FROM emp.planets_view WHERE empire = ?"; + RowMapper< NameIdPair > mapper = new RowMapper< NameIdPair >( ) { + @Override + public NameIdPair mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new NameIdPair( rs.getInt( "id" ) , rs.getString( "name" ) ); + } + }; + return this.dTemplate.query( sql , mapper , empireId ); + } + + + @Override + public OverviewData getOverview( int empireId ) + { + String sql = "SELECT * FROM emp.overview WHERE empire = ?"; + RowMapper< OverviewData > mapper = new RowMapper< OverviewData >( ) { + @Override + public OverviewData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + OverviewData info = new OverviewData( ); + info.setPlanets( rs.getLong( "planets" ) ); + + Double dTemp; + dTemp = rs.getDouble( "population" ); + info.setPopulation( dTemp == null ? 0 : dTemp.longValue( ) ); + dTemp = rs.getDouble( "avg_happiness" ); + info.setAvgHappiness( dTemp == null ? 0 : dTemp.intValue( ) ); + dTemp = rs.getDouble( "planet_income" ); + info.setPlanetIncome( dTemp == null ? 0 : dTemp.longValue( ) ); + dTemp = rs.getDouble( "planet_upkeep" ); + info.setPlanetUpkeep( dTemp == null ? 0 : dTemp.longValue( ) ); + + Long lTemp; + lTemp = rs.getLong( "fleet_power" ); + info.setFleetPower( lTemp == null ? 0 : lTemp ); + lTemp = rs.getLong( "fleet_upkeep" ); + info.setFleetUpkeep( lTemp == null ? 0 : lTemp ); + + Long lTemp2; + lTemp = rs.getLong( "civ_investment" ); + lTemp2 = rs.getLong( "mil_investment" ); + info.setInvestment( ( lTemp == null ? 0 : lTemp ) + ( lTemp2 == null ? 0 : lTemp2 ) ); + + info.setNewMessages( rs.getInt( "new_messages" ) ); + + return info; + } + }; + return this.dTemplate.queryForObject( sql , mapper , empireId ); + } + + + @Override + public List< EmpireTechLine > getTechnology( int empireId ) + { + String sql = "SELECT * FROM emp.tech_lines_view WHERE empire = ?"; + RowMapper< EmpireTechLine > lineMapper = new RowMapper< EmpireTechLine >( ) { + @Override + public EmpireTechLine mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EmpireTechLine etl = new EmpireTechLine( ); + etl.setId( rs.getInt( "tech_line" ) ); + etl.setName( rs.getString( "name" ) ); + etl.setDescription( rs.getString( "description" ) ); + return etl; + } + }; + + List< EmpireTechLine > lines = this.dTemplate.query( sql , lineMapper , empireId ); + if ( lines.isEmpty( ) ) { + return lines; + } + + Map< Integer , EmpireTechLine > linesById = new HashMap< Integer , EmpireTechLine >( ); + for ( EmpireTechLine etl : lines ) { + linesById.put( etl.getId( ) , etl ); + } + + sql = "SELECT * FROM emp.technologies_view WHERE empire = ?"; + RowMapper< EmpireTechnology > techMapper = new RowMapper< EmpireTechnology >( ) { + @Override + public EmpireTechnology mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EmpireTechnology et = new EmpireTechnology( ); + et.setLine( rs.getInt( "tech_line" ) ); + et.setName( rs.getString( "name" ) ); + et.setDescription( rs.getString( "description" ) ); + et.setImplemented( rs.getBoolean( "implemented" ) ); + et.setProgress( (int) rs.getDouble( "progress" ) ); + et.setCost( rs.getInt( "cost" ) ); + return et; + } + }; + + for ( EmpireTechnology et : this.dTemplate.query( sql , techMapper , empireId ) ) { + linesById.get( et.getLine( ) ).addTechnology( et ); + } + + return lines; + } + + + @Override + public void implementTechnology( int empireId , int lineId ) + { + this.fImplementTech.execute( empireId , lineId ); + } + + + @Override + public List< PlanetListData > getPlanetList( int empireId ) + { + String sql = "SELECT * FROM emp.planets_list WHERE empire = ?"; + return this.dTemplate.query( sql , this.mPlanetList , empireId ); + } + + + @Override + public List< NameIdPair > getEnemies( int empireId , boolean alliances ) + { + String sql = "SELECT id , name FROM emp.enemy_lists WHERE empire = ? AND "; + if ( !alliances ) { + sql += "NOT "; + } + sql += "alliance"; + + RowMapper< NameIdPair > mapper = new RowMapper< NameIdPair >( ) { + @Override + public NameIdPair mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + return new NameIdPair( rs.getInt( "id" ) , rs.getString( "name" ) ); + } + }; + + return this.dTemplate.query( sql , mapper , empireId ); + } + + + @Override + public ObjectNameError addEnemy( int empireId , boolean alliance , String name ) + { + StoredProc addProc = alliance ? this.fAddAllEnemy : this.fAddEmpEnemy; + int rv = (Integer) addProc.execute( empireId , name ).get( "err_code" ); + + switch ( rv ) { + case 0: + return null; + case 1: + return ObjectNameError.INVALID; + case 2: + return ObjectNameError.BANNED; + case 3: + return ObjectNameError.UNAVAILABLE; + default: + throw new RuntimeException( "unexpected error code " + rv ); + } + } + + + @Override + public void removeEnemies( int empireId , boolean alliance , int[] ids ) + { + StoredProc remProc = alliance ? this.fRemoveAllEnemy : this.fRemoveEmpEnemy; + StringBuilder idArray = new StringBuilder( ).append( "{" ); + + for ( int i = 0 ; i < ids.length ; i++ ) { + idArray.append( ids[ i ] ).append( ( i == ids.length - 1 ) ? "}" : "," ); + } + + remProc.execute( empireId , idArray.toString( ) ); + } + + + @Override + public int getNewPlanet( int empireId , String name ) + { + return (Integer) this.fGetNewPlanet.execute( empireId , name ).get( "err_code" ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireManagementBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireManagementBean.java new file mode 100644 index 0000000..18a9571 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/EmpireManagementBean.java @@ -0,0 +1,238 @@ +package com.deepclone.lw.beans.empire; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.EmpireResponse; +import com.deepclone.lw.cmd.player.GetNewPlanetResponse; +import com.deepclone.lw.cmd.player.ListPlanetsResponse; +import com.deepclone.lw.cmd.player.elist.AddEnemyResponse; +import com.deepclone.lw.cmd.player.elist.EnemyListResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetListData; +import com.deepclone.lw.cmd.player.gdata.battles.BattleListEntry; +import com.deepclone.lw.cmd.player.gdata.empire.OverviewData; +import com.deepclone.lw.cmd.player.gdata.empire.ResearchLineData; +import com.deepclone.lw.cmd.player.gdata.empire.TechnologyData; +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.game.BattlesCache; +import com.deepclone.lw.interfaces.game.BattlesDAO; +import com.deepclone.lw.interfaces.game.EmpireDAO; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.naming.NamingDAO; +import com.deepclone.lw.interfaces.prefs.AccountPreferences; +import com.deepclone.lw.interfaces.prefs.PreferencesDAO; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.sqld.game.EmpireTechLine; +import com.deepclone.lw.sqld.game.EmpireTechnology; +import com.deepclone.lw.sqld.game.GeneralInformation; +import com.deepclone.lw.sqld.game.battle.BattleListRecord; +import com.deepclone.lw.utils.EmailAddress; + + + +@Transactional +public class EmpireManagementBean + implements EmpireManagement +{ + private NamingDAO namingDao; + private UsersDAO usersDao; + private EmpireDAO empireDao; + private PreferencesDAO prefsDao; + private BattlesDAO battlesDao; + + + @Autowired( required = true ) + public void setUsersDao( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setNamingDao( NamingDAO namingDao ) + { + this.namingDao = namingDao; + } + + + @Autowired( required = true ) + public void setEmpireDao( EmpireDAO empireDao ) + { + this.empireDao = empireDao; + } + + + @Autowired( required = true ) + public void setPrefsDao( PreferencesDAO prefsDao ) + { + this.prefsDao = prefsDao; + } + + + @Autowired( required = true ) + public void setBattlesDao( BattlesCache battlesDao ) + { + this.battlesDao = battlesDao; + } + + + @Override + public Integer getEmpireId( EmailAddress address ) + { + Account acnt = usersDao.getAccount( address ); + if ( acnt == null || !acnt.getStatus( ).isActive( ) ) { + return null; + } + return namingDao.getCurrentEmpire( acnt ); + } + + + @Override + public GamePageData getGeneralInformation( int empireId ) + { + GeneralInformation generalInformation = this.empireDao.getInformation( empireId ); + List< NameIdPair > planets = this.empireDao.getPlanets( empireId ); + + AccountPreferences prefs = this.prefsDao.getPreferences( generalInformation.getAccountId( ) ); + boolean rlTime = prefs.getPreference( "useRLTime" , Boolean.class ); + + return new GamePageData( generalInformation.getName( ) , generalInformation.getStatus( ) , generalInformation + .getTag( ) , generalInformation.getCash( ) , generalInformation.getNextTick( ) , planets , rlTime ); + } + + + @Override + public EmpireResponse getOverview( int empireId ) + { + OverviewData overview = this.empireDao.getOverview( empireId ); + List< ResearchLineData > research = new LinkedList< ResearchLineData >( ); + + for ( EmpireTechLine etl : this.empireDao.getTechnology( empireId ) ) { + List< TechnologyData > implemented = new LinkedList< TechnologyData >( ); + TechnologyData current = null; + + for ( EmpireTechnology et : etl.getTechnologies( ) ) { + if ( et.isImplemented( ) ) { + implemented.add( new TechnologyData( et.getName( ) , et.getDescription( ) ) ); + } else if ( et.getProgress( ) == 100 ) { + current = new TechnologyData( et.getName( ) , et.getDescription( ) , 100 , et.getCost( ) ); + } else { + current = new TechnologyData( et.getName( ) , et.getDescription( ) , et.getProgress( ) ); + } + } + + research.add( new ResearchLineData( etl.getId( ) , etl.getName( ) , etl.getDescription( ) , implemented , + current ) ); + } + + List< BattleListEntry > battles = new LinkedList< BattleListEntry >( ); + for ( BattleListRecord record : this.battlesDao.getBattles( empireId ) ) { + if ( record.getLastTick( ) != null ) { + break; + } + BattleListEntry entry = new BattleListEntry( ); + entry.setId( record.getBattle( ) ); + entry.setLocation( new NameIdPair( record.getPlanetId( ) , record.getName( ) ) ); + entry.setX( record.getX( ) ); + entry.setY( record.getY( ) ); + entry.setOrbit( record.getOrbit( ) ); + entry.setFirst( record.getFirstTick( ) ); + if ( record.getLastTick( ) != null ) { + entry.setLast( record.getLastTick( ) ); + } + battles.add( entry ); + } + + return new EmpireResponse( this.getGeneralInformation( empireId ) , overview , research , battles ); + } + + + @Override + public EmpireResponse implementTechnology( int empireId , int techId ) + { + this.empireDao.implementTechnology( empireId , techId ); + return this.getOverview( empireId ); + } + + + @Override + public ListPlanetsResponse getPlanetList( int empireId ) + { + GamePageData page = this.getGeneralInformation( empireId ); + List< PlanetListData > planets = this.empireDao.getPlanetList( empireId ); + return new ListPlanetsResponse( page , planets ); + } + + + @Override + public EnemyListResponse getEnemyLists( int empireId ) + { + GamePageData page = this.getGeneralInformation( empireId ); + List< NameIdPair > empires = this.empireDao.getEnemies( empireId , false ); + List< NameIdPair > alliances = this.empireDao.getEnemies( empireId , true ); + return new EnemyListResponse( page , empires , alliances ); + } + + + @Override + public EnemyListResponse addEnemy( int empireId , boolean alliance , String name ) + { + ObjectNameError error = this.empireDao.addEnemy( empireId , alliance , name ); + GamePageData page = this.getGeneralInformation( empireId ); + List< NameIdPair > empires = this.empireDao.getEnemies( empireId , false ); + List< NameIdPair > alliances = this.empireDao.getEnemies( empireId , true ); + if ( error == null ) { + return new EnemyListResponse( page , empires , alliances ); + } + return new AddEnemyResponse( page , empires , alliances , error , alliance , name ); + } + + + @Override + public EnemyListResponse removeEnemies( int empireId , boolean alliance , int[] ids ) + { + this.empireDao.removeEnemies( empireId , alliance , ids ); + return this.getEnemyLists( empireId ); + } + + + @Override + public GetNewPlanetResponse getNewPlanet( int empireId , String name ) + { + int errCode = this.empireDao.getNewPlanet( empireId , name ); + ObjectNameError error; + switch ( errCode ) { + case 0: + error = null; + break; + case 1: + error = ObjectNameError.BANNED; + break; + case 2: + error = ObjectNameError.UNAVAILABLE; + break; + default: + return new GetNewPlanetResponse( this.getGeneralInformation( empireId ) , null , null ); + } + + Integer planetId; + if ( error == null ) { + planetId = this.empireDao.getPlanetList( empireId ).get( 0 ).getId( ); + } else { + planetId = null; + } + + if ( planetId == null ) { + return new GetNewPlanetResponse( this.getGeneralInformation( empireId ) , name , error ); + } + + return new GetNewPlanetResponse( this.getGeneralInformation( empireId ) , planetId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/PlanetListMapper.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/PlanetListMapper.java new file mode 100644 index 0000000..7a89808 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/empire/PlanetListMapper.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.empire; + + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; + +import com.deepclone.lw.cmd.player.gdata.PlanetListData; + + + +final class PlanetListMapper + implements RowMapper< PlanetListData > +{ + + @Override + public PlanetListData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + PlanetListData pl = new PlanetListData( ); + + pl.setId( rs.getInt( "id" ) ); + pl.setName( rs.getString( "name" ) ); + + pl.setX( rs.getInt( "x" ) ); + pl.setY( rs.getInt( "y" ) ); + pl.setOrbit( rs.getInt( "orbit" ) ); + + pl.setPopulation( rs.getLong( "population" ) ); + pl.setHappiness( rs.getInt( "happiness" ) ); + + pl.setIncome( rs.getLong( "income" ) ); + pl.setUpkeep( rs.getLong( "upkeep" ) ); + + pl.setMilitaryProduction( rs.getLong( "military_production" ) ); + pl.setIndustrialProduction( rs.getLong( "industrial_production" ) ); + pl.setGrowthProduction( rs.getLong( "growth_production" ) ); + + pl.setCivInvestment( rs.getLong( "civ_investment" ) ); + pl.setCivAmount( rs.getInt( "civ_amount" ) ); + pl.setCivDestroy( rs.getBoolean( "civ_destroy" ) ); + pl.setCivName( rs.getString( "civ_name" ) ); + + pl.setMilInvestment( rs.getLong( "mil_investment" ) ); + pl.setMilAmount( rs.getInt( "mil_amount" ) ); + pl.setMilName( rs.getString( "mil_name" ) ); + + pl.setFpStatic( rs.getLong( "static_defence" ) ); + pl.setFpOwn( rs.getLong( "own_fleet" ) ); + pl.setFpFriendly( rs.getLong( "friendly_fleet" ) ); + pl.setFpHostile( rs.getLong( "hostile_fleet" ) ); + + pl.setBattle( (Long) rs.getObject( "battle" ) ); + + return pl; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattleViewerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattleViewerBean.java new file mode 100644 index 0000000..de6038b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattleViewerBean.java @@ -0,0 +1,359 @@ +package com.deepclone.lw.beans.fleets; + + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.player.battles.GetBattleResponse; +import com.deepclone.lw.cmd.player.battles.ListBattlesResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; +import com.deepclone.lw.cmd.player.gdata.TimeCombo; +import com.deepclone.lw.cmd.player.gdata.battles.*; +import com.deepclone.lw.interfaces.game.BattleViewer; +import com.deepclone.lw.interfaces.game.BattlesCache; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.sqld.game.battle.*; + + + +public class BattleViewerBean + implements BattleViewer +{ + + private static final int pageSize = 10; + + private EmpireManagement empireManagement; + private BattlesCache battlesDao; + + + @Autowired( required = true ) + public void setEmpireManagement( EmpireManagement empireManagement ) + { + this.empireManagement = empireManagement; + } + + + @Autowired( required = true ) + public void setBattlesDao( BattlesCache dao ) + { + this.battlesDao = dao; + } + + + @Override + public GetBattleResponse getBattle( int empireId , long battleId ) + { + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + BattleView battle = this.createBattleView( empireId , battleId , null ); + return new GetBattleResponse( page , battle ); + } + + + @Override + public GetBattleResponse getBattle( int empireId , long battleId , long tick ) + { + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + BattleView battle = this.createBattleView( empireId , battleId , tick ); + return new GetBattleResponse( page , battle ); + } + + + private BattleView createBattleView( int empireId , long battleId , Long tick ) + { + EmpireBattleRecord battle = this.battlesDao.getBattleRecord( empireId , battleId ); + if ( battle == null ) { + return null; + } + + BattleView view = new BattleView( ); + BattleDescription bDescription = new BattleDescription( ); + BattleDisplay bDisplay = new BattleDisplay( ); + view.setDescription( bDescription ); + view.setDisplay( bDisplay ); + + // Generate main battle description + bDescription.setId( battleId ); + bDescription.setLocation( new NameIdPair( battle.getPlanetId( ) , battle.getPlanetName( ) ) ); + bDescription.setX( battle.getX( ) ); + bDescription.setY( battle.getY( ) ); + bDescription.setOrbit( battle.getOrbit( ) ); + + // Generate list of ticks + List< PresenceRecord > presence = this.battlesDao.getPresence( battle ); + Long previous = null; + Long next = null; + Long display = null; + boolean planetOwner = false; + boolean wasPresent = false; + for ( PresenceRecord pRec : presence ) { + if ( !pRec.isPresent( ) && !wasPresent ) { + continue; + } + + long prTick = pRec.getTick( ); + if ( tick == null || display == null || display < tick ) { + previous = display; + display = prTick; + planetOwner = pRec.isPlanetOwner( ); + } else if ( next == null ) { + next = prTick; + } + bDisplay.addTime( prTick ); + wasPresent = pRec.isPresent( ); + } + if ( display == null && presence.size( ) == 1 ) { + display = presence.get( 0 ).getTick( ); + bDisplay.addTime( display ); + } + bDisplay.setCurrent( display ); + if ( previous != null ) { + bDisplay.setPrevious( previous ); + } + if ( next != null ) { + bDisplay.setNext( next ); + } + + // Get the status at the current tick + Map< Long , Map< Long , ProtagonistRecord >> protagonists = this.battlesDao.getProtagonists( battle ); + view.setShips( this.getBattleStatus( battle , display , protagonists , planetOwner ) ); + + // Determine history intervals to display + List< BattleHistoryInterval > intervals = this.getIntervals( battle , presence , display ); + + // Add battle history + Collections.reverse( intervals ); + this.addEvents( battle , intervals , protagonists , display ); + for ( BattleHistoryInterval i : intervals ) { + view.addHistoryInterval( i ); + } + + return view; + } + + + private List< BattleHistoryInterval > getIntervals( EmpireBattleRecord battle , List< PresenceRecord > presence , + long display ) + { + List< BattleHistoryInterval > intervals = new LinkedList< BattleHistoryInterval >( ); + for ( PresenceRecord pRec : presence ) { + long prTick = pRec.getTick( ); + if ( prTick > display ) { + break; + } + + if ( intervals.isEmpty( ) || intervals.get( intervals.size( ) - 1 ).getEnd( ) != null ) { + if ( !pRec.isPresent( ) ) { + continue; + } + + BattleHistoryInterval interval = new BattleHistoryInterval( ); + interval.setBegin( prTick , prTick == battle.getFirstTick( ) ); + intervals.add( interval ); + } else if ( !pRec.isPresent( ) ) { + BattleHistoryInterval interval = intervals.get( intervals.size( ) - 1 ); + interval.setEnd( prTick , false ); + } else if ( battle.getLastTick( ) != null && prTick == battle.getLastTick( ) ) { + BattleHistoryInterval interval = intervals.get( intervals.size( ) - 1 ); + interval.setEnd( prTick , true ); + } + } + if ( intervals.isEmpty( ) && presence.size( ) == 1 ) { + PresenceRecord pRec = presence.get( 0 ); + BattleHistoryInterval interval = new BattleHistoryInterval( ); + interval.setBegin( pRec.getTick( ) , true ); + interval.setEnd( pRec.getTick( ) , true ); + intervals.add( interval ); + } + return intervals; + } + + + private void addEvents( EmpireBattleRecord battle , List< BattleHistoryInterval > intervals , + Map< Long , Map< Long , ProtagonistRecord >> protagonists , long display ) + { + Map< Boolean , Map< Long , List< EventItemRecord >>> eItems = this.battlesDao.getEventItems( battle ); + ListIterator< BattleHistoryInterval > bhIterator = intervals.listIterator( ); + BattleHistoryInterval cInterval = bhIterator.next( ); + BattleHistoryTick cTick = null; + + for ( EventRecord event : this.battlesDao.getEvents( battle ) ) { + long eTick = event.getTick( ); + if ( eTick > display ) { + continue; + } + + // Do not add events after the end of the current interval + TimeCombo intEnd = cInterval.getEnd( ); + if ( intEnd != null && eTick > intEnd.getTicks( ) ) { + continue; + } + + // If the event is before the current interval, try fetching the "next" (previous in + // terms of ticks) interval + if ( eTick < cInterval.getBegin( ).getTicks( ) ) { + if ( !bhIterator.hasNext( ) ) { + break; + } + cInterval = bhIterator.next( ); + cTick = null; + if ( eTick > cInterval.getEnd( ).getTicks( ) ) { + continue; + } + } + + // Create and add the event's tick if necessary + if ( cTick == null || cTick.getTime( ).getTicks( ) != eTick ) { + cTick = new BattleHistoryTick( eTick ); + cInterval.addEntry( cTick ); + } + + // Create the event's record + BattleEvent bEvent = new BattleEvent( ); + bEvent.setType( BattleEventType.valueOf( event.getEventType( ) ) ); + bEvent.setPlanet( event.isPlanet( ) ); + bEvent.setName( event.getName( ) ); + if ( event.getAttack( ) != null ) { + ProtagonistRecord self = protagonists.get( eTick ).get( battle.getProtagonistId( ) ); + if ( !event.isPlanet( ) && self.getName( ).equals( event.getName( ) ) ) { + bEvent.setHostile( event.getAttack( ) ); + } else { + bEvent.setHostile( self.isAttacking( ) != event.getAttack( ) ); + } + } + + // Add event to history + cTick.addEvent( bEvent ); + + // Add ships/buildings + if ( event.getEventId( ) == null ) { + continue; + } + + List< EventItemRecord > items = eItems.get( event.isPlanet( ) ).get( event.getEventId( ) ); + if ( items == null ) { + continue; + } + for ( EventItemRecord eir : items ) { + BattleShipType item = new BattleShipType( ); + item.setName( eir.getNature( ) ); + item.setcAmount( eir.getAmount( ) ); + bEvent.addShip( item ); + } + } + } + + + private BattleShipsView getBattleStatus( EmpireBattleRecord battle , Long display , + Map< Long , Map< Long , ProtagonistRecord >> pHistory , boolean planetOwner ) + { + BattleShipsView view = new BattleShipsView( ); + Map< Long , ProtagonistRecord > protagonists = pHistory.get( display ); + Map< Long , List< ShipHistoryRecord >> ships = this.battlesDao.getShipsHistory( battle ).get( display ); + boolean vMode = protagonists.get( battle.getProtagonistId( ) ).isAttacking( ); + + // Handle fleets + for ( ProtagonistRecord protagonist : protagonists.values( ) ) { + BattlePlayerShips pShips; + boolean isSelf = ( protagonist.getProtagonistId( ) == battle.getProtagonistId( ) ); + if ( isSelf ) { + pShips = view.getOwn( ); + } else { + pShips = new BattlePlayerShips( ); + } + + // Add ships + List< ShipHistoryRecord > pShipList = ships.get( protagonist.getProtagonistId( ) ); + if ( pShipList == null ) { + continue; + } + for ( ShipHistoryRecord shr : pShipList ) { + BattleShipType shipType = new BattleShipType( ); + shipType.setName( shr.getNature( ) ); + shipType.setcAmount( shr.getCurrent( ) ); + shipType.setcPower( shr.getCurrent( ) * shr.getPower( ) ); + shipType.setlAmount( shr.getLost( ) ); + shipType.setlPower( shr.getLost( ) * shr.getPower( ) ); + pShips.addShip( shipType ); + } + + // Set empire name & identifier + int eId = protagonist.getEmpireId( ) == null ? -1 : protagonist.getEmpireId( ).intValue( ); + pShips.setPlayer( new NameIdPair( eId , protagonist.getName( ) ) ); + + // Add to the appropriate list + if ( isSelf || pShips.getcPower( ) == 0 && pShips.getlPower( ) == 0 ) { + continue; + } + BattleSideShips side = ( protagonist.isAttacking( ) == vMode ) ? view.getFriendly( ) : view.getHostile( ); + side.addPlayer( pShips ); + } + + // Handle planet + BattlePlanetBuildings planet = view.getPlanet( ); + if ( planetOwner ) { + planet.setRelation( PlanetRelationType.OWN ); + } else { + planet.setRelation( vMode ? PlanetRelationType.ENEMY : PlanetRelationType.ALLIED ); + } + + List< BuildingHistoryRecord > toDisplay = this.battlesDao.getBuildingsHistory( battle ).get( display ); + if ( toDisplay != null ) { + for ( BuildingHistoryRecord bhr : toDisplay ) { + BattleShipType building = new BattleShipType( ); + building.setName( bhr.getNature( ) ); + building.setcAmount( bhr.getCurrent( ) ); + building.setcPower( bhr.getCurrent( ) * bhr.getPower( ) ); + building.setlAmount( bhr.getLost( ) ); + building.setlPower( bhr.getLost( ) * bhr.getPower( ) ); + planet.addShip( building ); + } + } + + return view; + } + + + @Override + public ListBattlesResponse getBattles( int empireId , int page ) + { + List< BattleListRecord > records = this.battlesDao.getBattles( empireId ); + int rSize = records.size( ); + int mod = rSize % BattleViewerBean.pageSize; + int pages = ( rSize - mod ) / BattleViewerBean.pageSize + ( mod > 0 ? 1 : 0 ); + if ( page < 0 ) { + page = 0; + } else if ( page >= pages ) { + page = pages - 1; + } + + List< BattleListEntry > entries = new LinkedList< BattleListEntry >( ); + if ( pages > 0 ) { + records = records.subList( page * BattleViewerBean.pageSize , Math.min( ( page + 1 ) + * BattleViewerBean.pageSize , rSize ) ); + + for ( BattleListRecord record : records ) { + BattleListEntry entry = new BattleListEntry( ); + entry.setId( record.getBattle( ) ); + entry.setLocation( new NameIdPair( record.getPlanetId( ) , record.getName( ) ) ); + entry.setX( record.getX( ) ); + entry.setY( record.getY( ) ); + entry.setOrbit( record.getOrbit( ) ); + entry.setFirst( record.getFirstTick( ) ); + if ( record.getLastTick( ) != null ) { + entry.setLast( record.getLastTick( ) ); + } + entries.add( entry ); + } + } + + return new ListBattlesResponse( this.empireManagement.getGeneralInformation( empireId ) , entries , page , + pages ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesCacheBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesCacheBean.java new file mode 100644 index 0000000..cdb4703 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesCacheBean.java @@ -0,0 +1,336 @@ +package com.deepclone.lw.beans.fleets; + + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.game.BattlesCache; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; +import com.deepclone.lw.sqld.game.battle.*; + + + +public class BattlesCacheBean + implements BattlesCache , Runnable +{ + private static final int cacheTime = 6; // Half an hour + + private static class CacheKey + { + private final int empireId; + private final long battleId; + + + public CacheKey( int empireId , long battleId ) + { + this.empireId = empireId; + this.battleId = battleId; + } + + + @Override + public int hashCode( ) + { + final int prime = 31; + int result = 1; + result = prime * result + (int) ( battleId ^ ( battleId >>> 32 ) ); + result = prime * result + empireId; + return result; + } + + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + if ( getClass( ) != obj.getClass( ) ) + return false; + CacheKey other = (CacheKey) obj; + if ( battleId != other.battleId ) + return false; + if ( empireId != other.empireId ) + return false; + return true; + } + + } + + private static class CacheData + { + public int timeLeft = BattlesCacheBean.cacheTime; + public EmpireBattleRecord battle; + public List< PresenceRecord > presence; + public Map< Long , Map< Long , ProtagonistRecord >> protagonists; + public List< EventRecord > events; + public Map< Boolean , Map< Long , List< EventItemRecord >>> eventItems; + public Map< Long , List< BuildingHistoryRecord >> buildings; + public Map< Long , Map< Long , List< ShipHistoryRecord >>> ships; + }; + + private static class ListCache + { + public int timeLeft = BattlesCacheBean.cacheTime; + public Long lastUpdate; + public List< BattleListRecord > list = new LinkedList< BattleListRecord >( ); + }; + + private BattlesDAOBean battlesDao; + private SystemLogger logger; + private final Map< CacheKey , CacheData > cache = new HashMap< CacheKey , CacheData >( ); + private final Map< Integer , ListCache > listCache = new HashMap< Integer , ListCache >( ); + + + @Autowired( required = true ) + public void setBattlesDAO( BattlesDAOBean battlesDao ) + { + this.battlesDao = battlesDao; + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + ticker.registerTask( Frequency.LOW , "Battles cache cleaner" , this ); + } + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "BattlesCache" ); + } + + + private void initCache( CacheKey cKey , EmpireBattleRecord record ) + { + this.logger.log( LogLevel.TRACE , + "Adding battle #" + record.getBattleId( ) + " for empire #" + record.getEmpireId( ) + " to the cache" ) + .flush( ); + + CacheData data = new CacheData( ); + data.battle = record; + data.presence = this.battlesDao.getPresence( record ); + data.protagonists = this.battlesDao.getProtagonists( record ); + data.events = this.battlesDao.getEvents( record ); + data.eventItems = this.battlesDao.getEventItems( record ); + data.buildings = this.battlesDao.getBuildingsHistory( record ); + data.ships = this.battlesDao.getShipsHistory( record ); + this.cache.put( cKey , data ); + } + + + private CacheData getCached( EmpireBattleRecord record ) + { + CacheKey cKey = new CacheKey( record.getEmpireId( ) , record.getBattleId( ) ); + CacheData data; + synchronized ( this.cache ) { + data = this.cache.get( cKey ); + if ( data != null ) { + data.timeLeft = BattlesCacheBean.cacheTime; + } + } + return data; + } + + + @Override + public void run( ) + { + + // Battle data cache + synchronized ( this.cache ) { + List< CacheKey > toRemove = new LinkedList< CacheKey >( ); + for ( Map.Entry< CacheKey , CacheData > entry : this.cache.entrySet( ) ) { + CacheData data = entry.getValue( ); + data.timeLeft--; + if ( data.timeLeft < 0 ) { + toRemove.add( entry.getKey( ) ); + } + } + + for ( CacheKey k : toRemove ) { + this.cache.remove( k ); + } + + if ( !toRemove.isEmpty( ) ) { + this.logger.log( LogLevel.DEBUG , + "data cache - " + toRemove.size( ) + " entries removed; cache size: " + this.cache.size( ) ) + .flush( ); + } + } + + // Battle lists cache + synchronized ( this.listCache ) { + List< Integer > toRemove = new LinkedList< Integer >( ); + for ( Map.Entry< Integer , ListCache > entry : this.listCache.entrySet( ) ) { + ListCache data = entry.getValue( ); + data.timeLeft--; + if ( data.timeLeft < 0 ) { + toRemove.add( entry.getKey( ) ); + } + } + + for ( Integer k : toRemove ) { + this.listCache.remove( k ); + } + + if ( !toRemove.isEmpty( ) ) { + this.logger.log( LogLevel.DEBUG , + "list cache - " + toRemove.size( ) + " entries removed; cache size: " + this.listCache.size( ) ) + .flush( ); + } + } + } + + + @Override + public EmpireBattleRecord getBattleRecord( int empireId , long battleId ) + { + CacheKey cKey = new CacheKey( empireId , battleId ); + synchronized ( this.cache ) { + CacheData data = this.cache.get( cKey ); + if ( data != null ) { + data.timeLeft = BattlesCacheBean.cacheTime; + return data.battle; + } + + EmpireBattleRecord record = this.battlesDao.getBattleRecord( empireId , battleId ); + if ( record != null && record.getLastTick( ) != null ) { + this.initCache( cKey , record ); + } + return record; + } + } + + + @Override + public List< PresenceRecord > getPresence( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.presence; + } + return this.battlesDao.getPresence( record ); + } + + + @Override + public Map< Long , Map< Long , ProtagonistRecord >> getProtagonists( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.protagonists; + } + return this.battlesDao.getProtagonists( record ); + } + + + @Override + public List< EventRecord > getEvents( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.events; + } + return this.battlesDao.getEvents( record ); + } + + + @Override + public Map< Boolean , Map< Long , List< EventItemRecord >>> getEventItems( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.eventItems; + } + return this.battlesDao.getEventItems( record ); + } + + + @Override + public Map< Long , List< BuildingHistoryRecord >> getBuildingsHistory( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.buildings; + } + return this.battlesDao.getBuildingsHistory( record ); + } + + + @Override + public Map< Long , Map< Long , List< ShipHistoryRecord >>> getShipsHistory( EmpireBattleRecord record ) + { + CacheData cData = this.getCached( record ); + if ( cData != null ) { + return cData.ships; + } + return this.battlesDao.getShipsHistory( record ); + } + + + @Override + public List< BattleListRecord > getBattles( int empireId ) + { + List< BattleListRecord > results; + synchronized ( this.listCache ) { + ListCache lcEntry = this.listCache.get( empireId ); + int nCached; + + if ( lcEntry == null ) { + // No cached data, get the whole list and add finished battles to the cache + lcEntry = new ListCache( ); + nCached = 0; + results = this.battlesDao.getBattles( empireId ); + + for ( BattleListRecord record : results ) { + if ( !record.isFinished( ) ) { + continue; + } + if ( lcEntry.lastUpdate == null ) { + lcEntry.lastUpdate = record.getLastUpdate( ); + } + lcEntry.list.add( record ); + } + if ( !lcEntry.list.isEmpty( ) ) { + this.listCache.put( empireId , lcEntry ); + } + } else { + // Cached data present, get updates + results = new LinkedList< BattleListRecord >( ); + nCached = lcEntry.list.size( ); + int i = 0; + for ( BattleListRecord record : this.battlesDao.getBattles( empireId , lcEntry.lastUpdate ) ) { + if ( !record.isFinished( ) ) { + results.add( record ); + continue; + } + if ( i == 0 ) { + lcEntry.lastUpdate = record.getLastUpdate( ); + } + lcEntry.list.add( i++ , record ); + } + results.addAll( lcEntry.list ); + lcEntry.timeLeft = BattlesCacheBean.cacheTime; + } + + nCached = lcEntry.list.size( ) - nCached; + this.logger.log( + LogLevel.TRACE , + "List of battles for empire #" + empireId + ": " + nCached + " new items cached (" + + lcEntry.list.size( ) + " total), " + results.size( ) + " items returned" ).flush( ); + } + return results; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesDAOBean.java new file mode 100644 index 0000000..f7ce1a4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/BattlesDAOBean.java @@ -0,0 +1,309 @@ +package com.deepclone.lw.beans.fleets; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.interfaces.game.BattlesDAO; +import com.deepclone.lw.sqld.game.battle.*; + + + +public class BattlesDAOBean + implements BattlesDAO +{ + + private static final String sGetBattleRecord = "SELECT * FROM battles.empire_list_view WHERE empire = ? AND battle = ?"; + private static final String sGetPresenceList = "SELECT * FROM battles.protagonist_presence WHERE protagonist = ?"; + private static final String sGetEvents = "SELECT e.* FROM battles.events_history e WHERE e.battle = ? AND e.tick IN ( SELECT tick FROM battles.protagonist_presence WHERE protagonist = ? AND present )"; + private static final String sGetEventItems = "SELECT is_planet , event_id , nature , amount FROM battles.event_items i WHERE empire = ? AND battle = ?"; + private static final String sGetProtagonists = "SELECT * FROM battles.mode_history_view WHERE battle = ?"; + private static final String sGetBuildings = "SELECT * FROM battles.buildings_history WHERE empire = ? AND battle = ?"; + private static final String sGetShips = "SELECT * FROM battles.fleets_history WHERE empire = ? AND battle = ?"; + private static final String sGetAllBattles = "SELECT * FROM battles.battles_list WHERE empire = ? ORDER BY last_tick DESC NULLS FIRST , first_tick DESC , x , y , orbit"; + private static final String sGetNewBattles = "SELECT * FROM battles.battles_list WHERE empire = ? AND ( last_update > ? OR NOT finished ) ORDER BY last_tick DESC NULLS FIRST , first_tick DESC , x , y , orbit"; + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< EmpireBattleRecord > mGetBattleRecord; + private final RowMapper< PresenceRecord > mGetPresenceList; + private final RowMapper< EventRecord > mGetEvents; + private final RowMapper< EventItemRecord > mGetEventItems; + private final RowMapper< ProtagonistRecord > mGetProtagonists; + private final RowMapper< BuildingHistoryRecord > mGetBuildings; + private final RowMapper< ShipHistoryRecord > mGetShips; + private final RowMapper< BattleListRecord > mBattleListEntry; + + + public BattlesDAOBean( ) + { + this.mGetBattleRecord = new RowMapper< EmpireBattleRecord >( ) { + @Override + public EmpireBattleRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EmpireBattleRecord r = new EmpireBattleRecord( ); + r.setFirstTick( rs.getLong( "first_tick" ) ); + r.setLastTick( (Long) rs.getObject( "last_tick" ) ); + r.setPlanetId( rs.getInt( "planet" ) ); + r.setPlanetName( rs.getString( "name" ) ); + r.setX( rs.getInt( "x" ) ); + r.setY( rs.getInt( "y" ) ); + r.setOrbit( rs.getInt( "orbit" ) ); + r.setProtagonistId( rs.getLong( "protagonist" ) ); + return r; + } + }; + this.mGetPresenceList = new RowMapper< PresenceRecord >( ) { + @Override + public PresenceRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + PresenceRecord pView = new PresenceRecord( ); + pView.setTick( rs.getLong( "tick" ) ); + pView.setPresent( rs.getBoolean( "present" ) ); + pView.setPlanetOwner( rs.getBoolean( "planet_owner" ) ); + return pView; + } + }; + this.mGetEvents = new RowMapper< EventRecord >( ) { + @Override + public EventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EventRecord r = new EventRecord( ); + r.setEventType( rs.getString( "event_type" ) ); + r.setTick( rs.getLong( "tick" ) ); + r.setPlanet( rs.getBoolean( "is_planet" ) ); + r.setAttack( (Boolean) rs.getObject( "attack" ) ); + r.setEventId( (Long) rs.getObject( "event_id" ) ); + r.setName( rs.getString( "name" ) ); + return r; + } + }; + this.mGetEventItems = new RowMapper< EventItemRecord >( ) { + @Override + public EventItemRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EventItemRecord r = new EventItemRecord( ); + r.setPlanetEvent( rs.getBoolean( "is_planet" ) ); + r.setEventId( rs.getLong( "event_id" ) ); + r.setNature( rs.getString( "nature" ) ); + r.setAmount( rs.getInt( "amount" ) ); + return r; + } + }; + this.mGetProtagonists = new RowMapper< ProtagonistRecord >( ) { + @Override + public ProtagonistRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ProtagonistRecord p = new ProtagonistRecord( ); + p.setTick( rs.getLong( "tick" ) ); + p.setProtagonistId( rs.getLong( "protagonist" ) ); + p.setEmpireId( (Long) rs.getObject( "empire_id" ) ); + p.setName( rs.getString( "empire_name" ) ); + p.setAttacking( rs.getBoolean( "attacking" ) ); + return p; + } + }; + this.mGetBuildings = new RowMapper< BuildingHistoryRecord >( ) { + @Override + public BuildingHistoryRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildingHistoryRecord bhr = new BuildingHistoryRecord( ); + bhr.setTick( rs.getLong( "tick" ) ); + bhr.setNature( rs.getString( "building" ) ); + bhr.setCurrent( rs.getLong( "current" ) ); + bhr.setLost( rs.getLong( "lost" ) ); + bhr.setPower( (long) Math.floor( rs.getDouble( "power" ) ) ); + return bhr; + } + }; + this.mGetShips = new RowMapper< ShipHistoryRecord >( ) { + @Override + public ShipHistoryRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ShipHistoryRecord shr = new ShipHistoryRecord( ); + shr.setProtagonist( rs.getLong( "protagonist" ) ); + shr.setTick( rs.getLong( "tick" ) ); + shr.setNature( rs.getString( "ship_type" ) ); + shr.setCurrent( rs.getLong( "current" ) ); + shr.setLost( rs.getLong( "lost" ) ); + shr.setPower( rs.getInt( "ship_power" ) ); + return shr; + } + }; + this.mBattleListEntry = new RowMapper< BattleListRecord >( ) { + @Override + public BattleListRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BattleListRecord entry = new BattleListRecord( ); + entry.setBattle( rs.getLong( "battle" ) ); + entry.setPlanetId( rs.getInt( "planet" ) ); + entry.setX( rs.getInt( "x" ) ); + entry.setY( rs.getInt( "y" ) ); + entry.setOrbit( rs.getInt( "orbit" ) ); + entry.setName( rs.getString( "name" ) ); + entry.setFirstTick( rs.getLong( "first_tick" ) ); + entry.setLastTick( (Long) rs.getObject( "last_tick" ) ); + entry.setLastUpdate( rs.getLong( "last_update" ) ); + entry.setFinished( rs.getBoolean( "finished" ) ); + return entry; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + } + + + @Override + public EmpireBattleRecord getBattleRecord( int empireId , long battleId ) + { + EmpireBattleRecord ebv; + try { + ebv = this.dTemplate.queryForObject( sGetBattleRecord , this.mGetBattleRecord , empireId , battleId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + ebv.setBattleId( battleId ); + ebv.setEmpireId( empireId ); + return ebv; + } + + + @Override + public List< PresenceRecord > getPresence( EmpireBattleRecord record ) + { + return this.dTemplate.query( sGetPresenceList , this.mGetPresenceList , record.getProtagonistId( ) ); + } + + + @Override + public Map< Long , Map< Long , ProtagonistRecord > > getProtagonists( EmpireBattleRecord record ) + { + List< ProtagonistRecord > all; + all = this.dTemplate.query( sGetProtagonists , this.mGetProtagonists , record.getBattleId( ) ); + + Map< Long , Map< Long , ProtagonistRecord >> result = new HashMap< Long , Map< Long , ProtagonistRecord > >( ); + for ( ProtagonistRecord r : all ) { + Map< Long , ProtagonistRecord > atTick = result.get( r.getTick( ) ); + if ( atTick == null ) { + atTick = new HashMap< Long , ProtagonistRecord >( ); + result.put( r.getTick( ) , atTick ); + } + atTick.put( r.getProtagonistId( ) , r ); + } + return result; + } + + + @Override + public List< EventRecord > getEvents( EmpireBattleRecord record ) + { + return this.dTemplate.query( sGetEvents , this.mGetEvents , record.getBattleId( ) , record.getProtagonistId( ) ); + } + + + @Override + public Map< Boolean , Map< Long , List< EventItemRecord >>> getEventItems( EmpireBattleRecord record ) + { + List< EventItemRecord > raw; + raw = this.dTemplate + .query( sGetEventItems , this.mGetEventItems , record.getEmpireId( ) , record.getBattleId( ) ); + + Map< Boolean , Map< Long , List< EventItemRecord >>> result = new HashMap< Boolean , Map< Long , List< EventItemRecord >> >( ); + result.put( true , new HashMap< Long , List< EventItemRecord >>( ) ); + result.put( false , new HashMap< Long , List< EventItemRecord >>( ) ); + for ( EventItemRecord eir : raw ) { + List< EventItemRecord > event = result.get( eir.isPlanetEvent( ) ).get( eir.getEventId( ) ); + if ( event == null ) { + event = new LinkedList< EventItemRecord >( ); + result.get( eir.isPlanetEvent( ) ).put( eir.getEventId( ) , event ); + } + event.add( eir ); + } + + return result; + } + + + @Override + public Map< Long , List< BuildingHistoryRecord >> getBuildingsHistory( EmpireBattleRecord record ) + { + List< BuildingHistoryRecord > records; + records = this.dTemplate.query( sGetBuildings , this.mGetBuildings , record.getEmpireId( ) , record + .getBattleId( ) ); + + Map< Long , List< BuildingHistoryRecord > > result = new HashMap< Long , List< BuildingHistoryRecord > >( ); + for ( BuildingHistoryRecord bhr : records ) { + List< BuildingHistoryRecord > atTick = result.get( bhr.getTick( ) ); + if ( atTick == null ) { + atTick = new LinkedList< BuildingHistoryRecord >( ); + result.put( bhr.getTick( ) , atTick ); + } + atTick.add( bhr ); + } + + return result; + } + + + @Override + public Map< Long , Map< Long , List< ShipHistoryRecord >>> getShipsHistory( EmpireBattleRecord record ) + { + List< ShipHistoryRecord > records; + records = this.dTemplate.query( sGetShips , this.mGetShips , record.getEmpireId( ) , record.getBattleId( ) ); + + Map< Long , Map< Long , List< ShipHistoryRecord > >> result = new HashMap< Long , Map< Long , List< ShipHistoryRecord > > >( ); + for ( ShipHistoryRecord shr : records ) { + Map< Long , List< ShipHistoryRecord > > atTick = result.get( shr.getTick( ) ); + if ( atTick == null ) { + atTick = new HashMap< Long , List< ShipHistoryRecord > >( ); + result.put( shr.getTick( ) , atTick ); + } + + List< ShipHistoryRecord > pShips = atTick.get( shr.getProtagonist( ) ); + if ( pShips == null ) { + pShips = new LinkedList< ShipHistoryRecord >( ); + atTick.put( shr.getProtagonist( ) , pShips ); + } + pShips.add( shr ); + } + + return result; + } + + + @Override + public List< BattleListRecord > getBattles( int empireId ) + { + return this.dTemplate.query( sGetAllBattles , this.mBattleListEntry , empireId ); + } + + + public List< BattleListRecord > getBattles( int empireId , long after ) + { + return this.dTemplate.query( sGetNewBattles , this.mBattleListEntry , empireId , after ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetManagementBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetManagementBean.java new file mode 100644 index 0000000..57fb1b0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetManagementBean.java @@ -0,0 +1,236 @@ +package com.deepclone.lw.beans.fleets; + + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.player.fleets.DisbandFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.MergeFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.MoveFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.MultiFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.RenameFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.SetFleetsModeResponse; +import com.deepclone.lw.cmd.player.fleets.SplitFleetResponse; +import com.deepclone.lw.cmd.player.fleets.ViewFleetsResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.fleets.FleetStatus; +import com.deepclone.lw.cmd.player.gdata.fleets.FleetsView; +import com.deepclone.lw.cmd.player.gdata.fleets.ShortFleetView; +import com.deepclone.lw.cmd.player.gdata.fleets.SplitShips; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.game.FleetsDAO; + + + +@Transactional +public class FleetManagementBean + implements FleetManagement +{ + private EmpireManagement empireManagement; + private FleetsDAO fleetsDao; + + + @Autowired( required = true ) + public void setEmpireManagement( EmpireManagement empireManagement ) + { + this.empireManagement = empireManagement; + } + + + @Autowired( required = true ) + public void setFleetsDao( FleetsDAO fleetsDao ) + { + this.fleetsDao = fleetsDao; + } + + + @Override + public ViewFleetsResponse getFleets( int empireId ) + { + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + FleetsView fleets = this.fleetsDao.getFleets( empireId ); + return new ViewFleetsResponse( page , fleets ); + } + + + @Override + public MultiFleetsResponse setMode( int empireId , long[] fleets , boolean attack , boolean doIt ) + { + SetFleetsModeResponse response; + response = new SetFleetsModeResponse( this.empireManagement.getGeneralInformation( empireId ) ); + + List< ShortFleetView > sFleets = new LinkedList< ShortFleetView >( ); + for ( ShortFleetView sfv : this.fleetsDao.getShortFleets( empireId , fleets , false ) ) { + if ( sfv.isAttack( ) != attack ) { + sFleets.add( sfv ); + } + } + + if ( sFleets.isEmpty( ) ) { + return response; + } + + if ( doIt ) { + this.fleetsDao.setMode( empireId , fleets , attack ); + return response; + } + + for ( ShortFleetView sfv : sFleets ) { + response.addFleet( sfv ); + } + response.setAttack( attack ); + return response; + } + + + @Override + public MultiFleetsResponse move( int empireId , long[] fleets , String destination , boolean attack ) + { + MoveFleetsResponse response = new MoveFleetsResponse( this.empireManagement.getGeneralInformation( empireId ) ); + List< ShortFleetView > sFleets = this.fleetsDao.getShortFleets( empireId , fleets , true ); + if ( sFleets.isEmpty( ) ) { + return response; + } + + boolean moved; + if ( destination != null && !sFleets.isEmpty( ) ) { + moved = this.fleetsDao.move( empireId , fleets , destination ); + if ( !moved ) { + response.setError( true ); + response.setDestination( destination ); + response.setMode( attack ); + } else { + this.fleetsDao.setMode( empireId , fleets , attack ); + } + } else { + moved = false; + } + + if ( !moved ) { + for ( ShortFleetView sfv : sFleets ) { + response.addFleet( sfv ); + } + } + + return response; + } + + + @Override + public MultiFleetsResponse rename( int empireId , long[] fleets , String name ) + { + RenameFleetsResponse response; + response = new RenameFleetsResponse( this.empireManagement.getGeneralInformation( empireId ) ); + + List< ShortFleetView > sFleets = this.fleetsDao.getShortFleets( empireId , fleets , false ); + if ( sFleets.isEmpty( ) ) { + return response; + } + + if ( name != null ) { + this.fleetsDao.rename( empireId , fleets , name ); + } else { + for ( ShortFleetView sfv : sFleets ) { + response.addFleet( sfv ); + } + } + + return response; + } + + + @Override + public MultiFleetsResponse merge( int empireId , long[] fleets ) + { + MergeFleetsResponse response = new MergeFleetsResponse( this.empireManagement.getGeneralInformation( empireId ) ); + List< ShortFleetView > sFleets = this.fleetsDao.getShortFleets( empireId , fleets , true ); + if ( !sFleets.isEmpty( ) ) { + this.fleetsDao.merge( empireId , fleets ); + } + return response; + } + + + @Override + public SplitFleetResponse split( int empireId , long fleetId , Map< Integer , Integer > ships , int nFleets , + String name , boolean simulate ) + { + SplitFleetResponse response = new SplitFleetResponse( this.empireManagement.getGeneralInformation( empireId ) ); + if ( fleetId == -1 ) { + return response; + } + + // Try finding the fleet + ShortFleetView fleet = this.fleetsDao.getShortFleet( empireId , fleetId ); + if ( fleet == null || fleet.getStatus( ) != FleetStatus.AVAILABLE ) { + return response; + } + + // If the name is not set, this is the initial request + if ( name == null ) { + for ( SplitShips sShips : this.fleetsDao.getShips( empireId , fleetId ) ) { + sShips.setSelectedAmount( 0 ); + response.addShips( sShips ); + } + response.setInitialFleet( fleet ); + return response; + } + + // Try splitting / simulating the split + boolean splitOk; + splitOk = this.fleetsDao.initSplit( fleetId , nFleets , name ); + if ( splitOk ) { + for ( Map.Entry< Integer , Integer > entry : ships.entrySet( ) ) { + this.fleetsDao.setSplitShips( entry.getKey( ) , entry.getValue( ) ); + } + splitOk = this.fleetsDao.executeSplit( simulate ); + } + + // If there was an error, or if we were simulating + if ( !splitOk || simulate ) { + for ( SplitShips sShips : this.fleetsDao.getShips( empireId , fleetId ) ) { + Integer amount = ships.get( sShips.getType( ) ); + if ( amount == null ) { + amount = 0; + } + sShips.setSelectedAmount( amount ); + response.addShips( sShips ); + } + response.setInitialFleet( fleet ); + response.setShipsError( !splitOk ); + response.setnFleets( nFleets ); + response.setName( name ); + } + + return response; + } + + + @Override + public MultiFleetsResponse disband( int empireId , long[] fleets , boolean doIt ) + { + DisbandFleetsResponse response; + response = new DisbandFleetsResponse( this.empireManagement.getGeneralInformation( empireId ) ); + + List< ShortFleetView > sFleets = this.fleetsDao.getShortFleets( empireId , fleets , false ); + if ( sFleets.isEmpty( ) ) { + return response; + } + + if ( doIt ) { + this.fleetsDao.disband( empireId , fleets ); + } else { + for ( ShortFleetView sfv : sFleets ) { + response.addFleet( sfv ); + } + } + + return response; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetsDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetsDAOBean.java new file mode 100644 index 0000000..3fdbb24 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/fleets/FleetsDAOBean.java @@ -0,0 +1,446 @@ +package com.deepclone.lw.beans.fleets; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; +import com.deepclone.lw.cmd.player.gdata.ShortBattleView; +import com.deepclone.lw.cmd.player.gdata.fleets.*; +import com.deepclone.lw.interfaces.game.FleetsDAO; +import com.deepclone.lw.sqld.game.RawFleetOwner; +import com.deepclone.lw.sqld.game.RawFleetShip; +import com.deepclone.lw.sqld.game.RawStaticFleet; +import com.deepclone.lw.utils.StoredProc; + + + +public class FleetsDAOBean + implements FleetsDAO +{ + private static String sqlLocations = "SELECT * FROM fleets.locations_view WHERE empire = ?"; + private static String sqlOwners = "SELECT * FROM fleets.owners_view WHERE empire = ? ORDER BY relation"; + private static String sqlStaticFleets = "SELECT * FROM fleets.static_fleets WHERE empire = ? ORDER BY power DESC, name NULLS LAST, id DESC"; + private static String sqlMovingFleets = "SELECT * FROM fleets.moving_fleets WHERE empire = ? ORDER BY time_left + penalty, name NULLS LAST, id DESC"; + private static String sqlShips = "SELECT * FROM fleets.ships_view WHERE empire = ?"; + private static String sqlShortStatic = "SELECT * FROM fleets.short_static_fleets WHERE empire = ? AND id IN ( SELECT unnest AS id FROM unnest( ?::BIGINT[] ) )"; + private static String sqlShortMoving = "SELECT * FROM fleets.moving_fleets WHERE empire = ? AND id IN ( SELECT unnest AS id FROM unnest( ?::BIGINT[] ) )"; + private static String sqlSingleShort = "SELECT * FROM fleets.short_static_fleets WHERE empire = ? AND id = ?"; + private static String sqlSingleMoving = "SELECT * FROM fleets.moving_fleets WHERE empire = ? AND id = ?"; + private static String sqlFleetShips = "SELECT * FROM fleets.ships_view WHERE empire = ? AND id = ?"; + + private SimpleJdbcTemplate dTemplate; + + private RowMapper< FleetLocation > mLocations; + private RowMapper< RawFleetOwner > mOwners; + private RowMapper< RawStaticFleet > mStaticFleets; + private RowMapper< MovingFleet > mMovingFleets; + private RowMapper< RawFleetShip > mShips; + private RowMapper< ShortFleetView > mShortStatic; + private RowMapper< ShortFleetView > mShortMoving; + + private StoredProc fMoveFleets; + private StoredProc fSetMode; + private StoredProc fRenameFleets; + private StoredProc fMergeFleets; + private StoredProc fDisbandFleets; + private StoredProc fInitSplit; + private StoredProc fSetSplitShips; + private StoredProc fExecuteSplit; + + + public FleetsDAOBean( ) + { + this.mLocations = new RowMapper< FleetLocation >( ) { + @Override + public FleetLocation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + FleetLocation location = new FleetLocation( rs.getInt( "location" ) , rs.getString( "name" ) ); + location.setOwn( rs.getBoolean( "is_own" ) ); + location.setAttacking( rs.getBoolean( "attacking" ) ); + location.setX( rs.getInt( "x" ) ); + location.setY( rs.getInt( "y" ) ); + location.setOrbit( rs.getInt( "orbit" ) ); + location.setTag( rs.getString( "tag" ) ); + location.setPicture( rs.getInt( "picture" ) ); + location.setPopulation( rs.getLong( "population" ) ); + location.setDefence( rs.getLong( "defence" ) ); + if ( rs.getObject( "battle" ) == null ) { + location.setBattle( null ); + location.setOnVacation( rs.getBoolean( "on_vacation" ) ); + } else { + ShortBattleView battle = new ShortBattleView( ); + battle.setId( rs.getLong( "battle" ) ); + battle.setFriendly( rs.getLong( "friendly_power" ) ); + battle.setHostile( rs.getLong( "hostile_power" ) ); + location.setBattle( battle ); + location.setOnVacation( false ); + } + return location; + } + }; + + this.mOwners = new RowMapper< RawFleetOwner >( ) { + @Override + public RawFleetOwner mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + RawFleetOwner info = new RawFleetOwner( ); + info.setLocation( rs.getInt( "location" ) ); + info.setId( rs.getInt( "id" ) ); + info.setName( rs.getString( "name" ) ); + info.setRelation( rs.getString( "relation" ) ); + return info; + } + }; + + this.mStaticFleets = new RowMapper< RawStaticFleet >( ) { + @Override + public RawStaticFleet mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + RawStaticFleet info = new RawStaticFleet( ); + info.setLocation( rs.getInt( "location" ) ); + info.setOwner( rs.getInt( "owner" ) ); + info.setId( rs.getLong( "id" ) ); + info.setName( rs.getString( "name" ) ); + info.setStatus( rs.getString( "status" ) ); + info.setPenalty( rs.getInt( "penalty" ) ); + info.setPower( rs.getLong( "power" ) ); + info.setFlightTime( rs.getInt( "flight_time" ) ); + return info; + } + }; + + this.mMovingFleets = new RowMapper< MovingFleet >( ) { + @Override + public MovingFleet mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + MovingFleet fleet = new MovingFleet( rs.getLong( "id" ) , rs.getString( "name" ) ); + fleet.setAttacking( rs.getBoolean( "attacking" ) ); + fleet.setStatus( FleetStatus.valueOf( rs.getString( "status" ) ) ); + fleet.setPenalty( rs.getInt( "penalty" ) ); + fleet.setFlightTime( rs.getInt( "flight_time" ) ); + fleet.setPower( rs.getLong( "power" ) ); + fleet.setTimeLeft( rs.getInt( "time_left" ) ); + fleet.setSource( new NameIdPair( rs.getInt( "from_id" ) , rs.getString( "from_name" ) ) ); + fleet.setDestination( new NameIdPair( rs.getInt( "to_id" ) , rs.getString( "to_name" ) ) ); + fleet.setCurrentX( rs.getDouble( "cx" ) ); + fleet.setCurrentY( rs.getDouble( "cy" ) ); + if ( rs.getString( "nearest_name" ) != null ) { + fleet.setNearest( new NameIdPair( rs.getInt( "nearest_id" ) , rs.getString( "nearest_name" ) ) ); + } + return fleet; + } + }; + + this.mShips = new RowMapper< RawFleetShip >( ) { + @Override + public RawFleetShip mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + RawFleetShip ship = new RawFleetShip( ); + ship.setFleet( rs.getLong( "id" ) ); + ship.setShipType( rs.getInt( "ship_id" ) ); + ship.setAmount( rs.getInt( "amount" ) ); + ship.setPower( rs.getInt( "power" ) ); + ship.setName( rs.getString( "name" ) ); + return ship; + } + }; + + this.mShortStatic = new RowMapper< ShortFleetView >( ) { + @Override + public ShortFleetView mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ShortFleetView sfv = new ShortFleetView( rs.getLong( "id" ) , rs.getString( "name" ) ); + sfv.setFlightTime( rs.getInt( "flight_time" ) ); + sfv.setStatus( FleetStatus.valueOf( rs.getString( "status" ) ) ); + sfv.setPenalty( rs.getInt( "penalty" ) ); + sfv.setPower( rs.getLong( "power" ) ); + sfv.setAttack( rs.getBoolean( "attacking" ) ); + sfv.setAtPlanet( true ); + sfv.setX( rs.getDouble( "x" ) ); + sfv.setY( rs.getDouble( "y" ) ); + sfv.setNearest( new NameIdPair( rs.getInt( "location_id" ) , rs.getString( "location_name" ) ) ); + return sfv; + } + }; + + this.mShortMoving = new RowMapper< ShortFleetView >( ) { + @Override + public ShortFleetView mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + ShortFleetView sfv = new ShortFleetView( rs.getLong( "id" ) , rs.getString( "name" ) ); + sfv.setFlightTime( rs.getInt( "flight_time" ) ); + sfv.setStatus( FleetStatus.valueOf( rs.getString( "status" ) ) ); + sfv.setPenalty( rs.getInt( "penalty" ) ); + sfv.setPower( rs.getLong( "power" ) ); + sfv.setAttack( rs.getBoolean( "attacking" ) ); + sfv.setAtPlanet( false ); + sfv.setX( rs.getDouble( "cx" ) ); + sfv.setY( rs.getDouble( "cy" ) ); + if ( rs.getString( "nearest_name" ) != null ) { + sfv.setNearest( new NameIdPair( rs.getInt( "nearest_id" ) , rs.getString( "nearest_name" ) ) ); + } + return sfv; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fMoveFleets = new StoredProc( dataSource , "fleets" , "move_fleets" ); + this.fMoveFleets.addParameter( "empire_id" , Types.INTEGER ); + this.fMoveFleets.addParameter( "fleet_ids" , "BIGINT[]" ); + this.fMoveFleets.addParameter( "destination" , Types.VARCHAR ); + this.fMoveFleets.addOutput( "success" , Types.BOOLEAN ); + + this.fSetMode = new StoredProc( dataSource , "fleets" , "set_mode" ); + this.fSetMode.addParameter( "empire_id" , Types.INTEGER ); + this.fSetMode.addParameter( "fleet_ids" , "BIGINT[]" ); + this.fSetMode.addParameter( "attack" , Types.BOOLEAN ); + + this.fRenameFleets = new StoredProc( dataSource , "fleets" , "rename_fleets" ); + this.fRenameFleets.addParameter( "empire_id" , Types.INTEGER ); + this.fRenameFleets.addParameter( "fleet_ids" , "BIGINT[]" ); + this.fRenameFleets.addParameter( "new_name" , Types.VARCHAR ); + + this.fMergeFleets = new StoredProc( dataSource , "fleets" , "merge" ); + this.fMergeFleets.addParameter( "empire_id" , Types.INTEGER ); + this.fMergeFleets.addParameter( "fleet_ids" , "BIGINT[]" ); + + this.fDisbandFleets = new StoredProc( dataSource , "fleets" , "disband" ); + this.fDisbandFleets.addParameter( "empire_id" , Types.INTEGER ); + this.fDisbandFleets.addParameter( "fleet_ids" , "BIGINT[]" ); + + this.fInitSplit = new StoredProc( dataSource , "fleets" , "init_split" ); + this.fInitSplit.addParameter( "fleet_id" , Types.BIGINT ); + this.fInitSplit.addParameter( "n_fleets" , Types.INTEGER ); + this.fInitSplit.addParameter( "name" , Types.VARCHAR ); + this.fInitSplit.addOutput( "success" , Types.BOOLEAN ); + + this.fSetSplitShips = new StoredProc( dataSource , "fleets" , "set_split_ships" ); + this.fSetSplitShips.addParameter( "ships_type" , Types.INTEGER ); + this.fSetSplitShips.addParameter( "split_amount" , Types.INTEGER ); + + this.fExecuteSplit = new StoredProc( dataSource , "fleets" , "execute_split" ); + this.fExecuteSplit.addParameter( "simulate" , Types.BOOLEAN ); + this.fExecuteSplit.addOutput( "success" , Types.BOOLEAN ); + } + + + private String getSQLArray( long[] fleets ) + { + StringBuilder fArray = new StringBuilder( ).append( "{" ); + for ( int i = 0 ; i < fleets.length ; i++ ) { + fArray.append( fleets[ i ] ); + if ( i != fleets.length - 1 ) { + fArray.append( "," ); + } + } + fArray.append( "}" ); + return fArray.toString( ); + } + + + @Override + public FleetsView getFleets( int empireId ) + { + FleetsView result = new FleetsView( ); + + // Get visible locations + Map< Integer , FleetLocation > locations = new HashMap< Integer , FleetLocation >( ); + Map< Integer , Map< Integer , FleetOwner >> owners = new HashMap< Integer , Map< Integer , FleetOwner > >( ); + for ( FleetLocation l : this.dTemplate.query( FleetsDAOBean.sqlLocations , this.mLocations , empireId ) ) { + locations.put( (int) l.getId( ) , l ); + owners.put( (int) l.getId( ) , new HashMap< Integer , FleetOwner >( ) ); + result.addLocation( l ); + } + + // Get visible fleet owners + for ( RawFleetOwner rfo : this.dTemplate.query( FleetsDAOBean.sqlOwners , this.mOwners , empireId ) ) { + FleetOwner owner; + int ownerId = rfo.getId( ); + owner = new FleetOwner( ownerId , rfo.getName( ) , PlanetRelationType.valueOf( rfo.getRelation( ) ) ); + + int locationId = rfo.getLocation( ); + FleetLocation location = locations.get( locationId ); + Map< Integer , FleetOwner > lOwners = owners.get( locationId ); + location.addFleetOwner( owner ); + lOwners.put( ownerId , owner ); + } + + // Get static fleets + Map< Long , StaticFleet > fleets = new HashMap< Long , StaticFleet >( ); + for ( RawStaticFleet rsf : this.dTemplate.query( FleetsDAOBean.sqlStaticFleets , this.mStaticFleets , empireId ) ) { + int ownerId = rsf.getOwner( ); + int locationId = rsf.getLocation( ); + long fleetId = rsf.getId( ); + + StaticFleet fleet = new StaticFleet( fleetId , rsf.getName( ) ); + fleet.setFlightTime( rsf.getFlightTime( ) ); + fleet.setStatus( FleetStatus.valueOf( rsf.getStatus( ) ) ); + fleet.setPenalty( rsf.getPenalty( ) ); + fleet.setPower( rsf.getPower( ) ); + + fleets.put( fleetId , fleet ); + owners.get( locationId ).get( ownerId ).addFleet( fleet ); + } + + // Get moving fleets + for ( MovingFleet f : this.dTemplate.query( FleetsDAOBean.sqlMovingFleets , this.mMovingFleets , empireId ) ) { + result.addMovingFleet( f ); + fleets.put( f.getId( ) , f ); + } + + // Fetch fleet ships + for ( RawFleetShip rfs : this.dTemplate.query( FleetsDAOBean.sqlShips , this.mShips , empireId ) ) { + FleetShips ships = new FleetShips( ); + ships.setAmount( rfs.getAmount( ) ); + ships.setPower( rfs.getPower( ) ); + ships.setName( rfs.getName( ) ); + fleets.get( rfs.getFleet( ) ).addShips( ships ); + } + + return result; + } + + + @Override + public List< ShortFleetView > getShortFleets( int empireId , long[] fleets , boolean needsAvailable ) + { + String fArray = this.getSQLArray( fleets ); + + List< ShortFleetView > result = new LinkedList< ShortFleetView >( ); + for ( ShortFleetView sfv : this.dTemplate.query( FleetsDAOBean.sqlShortStatic , this.mShortStatic , empireId , + fArray ) ) { + if ( needsAvailable && sfv.getStatus( ) != FleetStatus.AVAILABLE ) { + continue; + } + result.add( sfv ); + } + for ( ShortFleetView sfv : this.dTemplate.query( FleetsDAOBean.sqlShortMoving , this.mShortMoving , empireId , + fArray ) ) { + if ( needsAvailable && sfv.getStatus( ) != FleetStatus.AVAILABLE ) { + continue; + } + result.add( sfv ); + } + + return result; + } + + + @Override + public boolean move( int empireId , long[] fleets , String destination ) + { + return (Boolean) this.fMoveFleets.execute( empireId , this.getSQLArray( fleets ) , destination ) + .get( "success" ); + } + + + @Override + public void setMode( int empireId , long[] fleets , boolean attack ) + { + this.fSetMode.execute( empireId , this.getSQLArray( fleets ) , attack ); + } + + + @Override + public void rename( int empireId , long[] fleets , String name ) + { + this.fRenameFleets.execute( empireId , this.getSQLArray( fleets ) , name ); + } + + + @Override + public void merge( int empireId , long[] fleets ) + { + this.fMergeFleets.execute( empireId , this.getSQLArray( fleets ) ); + } + + + @Override + public void disband( int empireId , long[] fleets ) + { + this.fDisbandFleets.execute( empireId , this.getSQLArray( fleets ) ); + } + + + @Override + public ShortFleetView getShortFleet( int empireId , long fleetId ) + { + try { + return this.dTemplate.queryForObject( sqlSingleShort , mShortStatic , empireId , fleetId ); + } catch ( EmptyResultDataAccessException e ) { + // EMPTY + } + + try { + return this.dTemplate.queryForObject( sqlSingleMoving , mShortMoving , empireId , fleetId ); + } catch ( EmptyResultDataAccessException e ) { + return null; + } + } + + + @Override + public List< SplitShips > getShips( int empireId , long fleetId ) + { + List< SplitShips > result = new LinkedList< SplitShips >( ); + for ( RawFleetShip rfs : this.dTemplate.query( sqlFleetShips , mShips , empireId , fleetId ) ) { + SplitShips ships = new SplitShips( ); + ships.setId( rfs.getShipType( ) ); + ships.setType( rfs.getShipType( ) ); + ships.setAmount( rfs.getAmount( ) ); + ships.setPower( rfs.getPower( ) ); + ships.setName( rfs.getName( ) ); + result.add( ships ); + } + return result; + } + + + @Override + public boolean initSplit( long fleetId , int nFleets , String name ) + { + return (Boolean) this.fInitSplit.execute( fleetId , nFleets , name ).get( "success" ); + } + + + @Override + public void setSplitShips( int shipType , int amount ) + { + this.fSetSplitShips.execute( shipType , amount ); + } + + + @Override + public boolean executeSplit( boolean simulate ) + { + return (Boolean) this.fExecuteSplit.execute( simulate ).get( "success" ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/MapViewerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/MapViewerBean.java new file mode 100644 index 0000000..a15b69b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/MapViewerBean.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.map; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; +import com.deepclone.lw.cmd.player.gdata.map.MapPlanetData; +import com.deepclone.lw.cmd.player.gdata.map.MapSystemData; +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.game.MapViewParameters; +import com.deepclone.lw.interfaces.game.MapViewer; +import com.deepclone.lw.interfaces.game.UniverseDAO; +import com.deepclone.lw.interfaces.prefs.AccountPreferences; +import com.deepclone.lw.interfaces.prefs.PreferencesDAO; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.sqld.game.MapData; +import com.deepclone.lw.utils.EmailAddress; + + + +@Transactional +public class MapViewerBean + implements MapViewer +{ + + private UsersDAO usersDao; + private PreferencesDAO preferencesDao; + private UniverseDAO universeDao; + + + @Autowired( required = true ) + public void setUsersDao( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setPreferencesDao( PreferencesDAO preferencesDao ) + { + this.preferencesDao = preferencesDao; + } + + + @Autowired( required = true ) + public void setUniverseDao( UniverseDAO universeDao ) + { + this.universeDao = universeDao; + } + + + @Override + public MapViewParameters getDefaults( EmailAddress address ) + { + Account accnt = this.usersDao.getAccount( address ); + AccountPreferences prefs = this.preferencesDao.getPreferences( accnt ); + int x = (Integer) prefs.getPreference( "mapX" , Integer.class ); + int y = (Integer) prefs.getPreference( "mapY" , Integer.class ); + MapSize size = (MapSize) prefs.getPreference( "mapSize" , MapSize.class ); + return new MapViewParameters( x , y , size ); + } + + + @Override + public MapSystemData[][] getMapView( int empireId , MapViewParameters parameters ) + { + int size = 3 + ( 2 * parameters.size.ordinal( ) ); + int minX = parameters.x - ( size >> 1 ); + int maxX = parameters.x + ( size >> 1 ); + int minY = parameters.y - ( size >> 1 ); + int maxY = parameters.y + ( size >> 1 ); + + MapSystemData[][] results = new MapSystemData[ size ][ size ]; + for ( MapData entry : this.universeDao.getMap( empireId , minX , minY , maxX , maxY ) ) { + int x = entry.getX( ) - minX; + int y = maxY - entry.getY( ); + if ( entry.getOrbit( ) == 1 ) { + results[ y ][ x ] = new MapSystemData( ); + } + + PlanetRelationType relation; + String rValue = entry.getDisplay( ); + relation = ( rValue == null ) ? null : PlanetRelationType.valueOf( rValue ); + + MapPlanetData planet; + planet = new MapPlanetData( entry.getId( ) , entry.getPicture( ) , entry.getName( ) , entry.getTag( ) , + relation ); + results[ y ][ x ].setPlanet( entry.getOrbit( ) , planet ); + } + + return results; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetDAOBean.java new file mode 100644 index 0000000..8fe710b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetDAOBean.java @@ -0,0 +1,341 @@ +package com.deepclone.lw.beans.map; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.player.gdata.planets.BuildableBuildingData; +import com.deepclone.lw.cmd.player.gdata.planets.BuildableShipData; +import com.deepclone.lw.cmd.player.gdata.planets.BuildingData; +import com.deepclone.lw.cmd.player.gdata.planets.QueueData; +import com.deepclone.lw.cmd.player.gdata.planets.QueueItemData; +import com.deepclone.lw.interfaces.game.PlanetDAO; +import com.deepclone.lw.sqld.game.PlanetData.AccessType; +import com.deepclone.lw.sqld.game.PlanetData.Basic; +import com.deepclone.lw.sqld.game.PlanetData.Orbital; +import com.deepclone.lw.sqld.game.PlanetData.Owner; +import com.deepclone.lw.utils.StoredProc; + + + +public class PlanetDAOBean + implements PlanetDAO +{ + + private SimpleJdbcTemplate dTemplate; + + private RowMapper< Basic > mPlanetBasics; + private RowMapper< Orbital > mPlanetOrbital; + private RowMapper< Owner > mPlanetOwner; + private RowMapper< BuildingData > mOwnerBuildings; + private RowMapper< BuildingData > mOrbitalBuildings; + private RowMapper< QueueItemData > mQueueItem; + private RowMapper< BuildableBuildingData > mAvailableBuilding; + private RowMapper< BuildableShipData > mAvailableShip; + + private StoredProc fFlushBuildQueue; + private StoredProc fFlushMilitaryQueue; + private StoredProc fAddToMilitaryQueue; + private StoredProc fConstructBuildings; + private StoredProc fDestroyBuildings; + private StoredProc fAbandon; + private StoredProc fCancelAbandon; + + + public PlanetDAOBean( ) + { + this.mPlanetBasics = new RowMapper< Basic >( ) { + @Override + public Basic mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + if ( rs.getString( "access" ) == null ) { + return null; + } + + Basic info = new Basic( ); + info.setAccess( AccessType.valueOf( rs.getString( "access" ) ) ); + info.setX( rs.getInt( "x" ) ); + info.setY( rs.getInt( "y" ) ); + info.setOrbit( rs.getInt( "orbit" ) ); + info.setPicture( rs.getInt( "picture" ) ); + info.setName( rs.getString( "name" ) ); + info.setTag( rs.getString( "tag" ) ); + return info; + } + }; + + this.mPlanetOrbital = new RowMapper< Orbital >( ) { + @Override + public Orbital mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Orbital info = new Orbital( ); + info.setPopulation( rs.getLong( "population" ) ); + info.setDefence( rs.getLong( "defence" ) ); + info.setOwnPower( rs.getLong( "own_power" ) ); + info.setFriendlyPower( rs.getLong( "friendly_power" ) ); + info.setHostilePower( rs.getLong( "hostile_power" ) ); + info.setBattle( (Long) rs.getObject( "battle_id" ) ); + return info; + } + }; + + this.mPlanetOwner = new RowMapper< Owner >( ) { + @Override + public Owner mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Owner info = new Owner( ); + info.setHappiness( rs.getInt( "happiness" ) ); + info.sethChange( rs.getInt( "h_change" ) ); + info.setIncome( rs.getLong( "income" ) ); + info.setUpkeep( rs.getLong( "upkeep" ) ); + info.setRenamePossible( rs.getBoolean( "can_rename" ) ); + info.setAbandonPossible( rs.getBoolean( "can_abandon" ) ); + info.setAbandonTime( rs.getInt( "abandon_time" ) ); + return info; + } + }; + + this.mOrbitalBuildings = new RowMapper< BuildingData >( ) { + @Override + public BuildingData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildingData info = new BuildingData( ); + info.setAmount( rs.getInt( "amount" ) ); + info.setName( rs.getString( "name" ) ); + info.setDescription( rs.getString( "description" ) ); + return info; + } + }; + + this.mOwnerBuildings = new RowMapper< BuildingData >( ) { + @Override + public BuildingData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildingData info = new BuildingData( ); + info.setId( rs.getInt( "id" ) ); + info.setAmount( rs.getInt( "amount" ) ); + info.setName( rs.getString( "name" ) ); + info.setDescription( rs.getString( "description" ) ); + info.setJobs( rs.getInt( "jobs" ) ); + info.setUpkeep( rs.getLong( "upkeep" ) ); + info.setProduces( rs.getString( "p_type" ) ); + info.setOutput( rs.getLong( "p_value" ) ); + return info; + } + }; + + this.mQueueItem = new RowMapper< QueueItemData >( ) { + @Override + public QueueItemData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + QueueItemData item = new QueueItemData( ); + item.setName( rs.getString( "name" ) ); + item.setDescription( rs.getString( "description" ) ); + item.setAmount( rs.getInt( "amount" ) ); + item.setDestroy( rs.getBoolean( "destroy" ) ); + item.setInvested( rs.getLong( "investment" ) ); + item.setTimeLeft( (Long) rs.getObject( "time_left" ) ); + return item; + } + }; + + this.mAvailableBuilding = new RowMapper< BuildableBuildingData >( ) { + @Override + public BuildableBuildingData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildableBuildingData info = new BuildableBuildingData( ); + info.setId( rs.getInt( "id" ) ); + info.setName( rs.getString( "name" ) ); + info.setDescription( rs.getString( "description" ) ); + info.setCost( rs.getInt( "cost" ) ); + info.setTime( (Long) rs.getObject( "time_to_build" ) ); + info.setUpkeep( rs.getInt( "upkeep" ) ); + info.setWorkers( rs.getInt( "workers" ) ); + info.setProdType( rs.getString( "p_type" ) ); + info.setOutput( rs.getInt( "p_value" ) ); + return info; + } + }; + + this.mAvailableShip = new RowMapper< BuildableShipData >( ) { + @Override + public BuildableShipData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BuildableShipData info = new BuildableShipData( ); + info.setId( rs.getInt( "id" ) ); + info.setName( rs.getString( "name" ) ); + info.setDescription( rs.getString( "description" ) ); + info.setCost( rs.getInt( "cost" ) ); + info.setTime( (Long) rs.getObject( "time_to_build" ) ); + info.setUpkeep( rs.getInt( "upkeep" ) ); + info.setFlightTime( rs.getInt( "flight_time" ) ); + info.setPower( rs.getInt( "power" ) ); + return info; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fFlushBuildQueue = new StoredProc( dataSource , "verse" , "flush_build_queue" ); + this.fFlushBuildQueue.addParameter( "planet_id" , Types.INTEGER ); + + this.fFlushMilitaryQueue = new StoredProc( dataSource , "verse" , "flush_military_queue" ); + this.fFlushMilitaryQueue.addParameter( "planet_id" , Types.INTEGER ); + + this.fAddToMilitaryQueue = new StoredProc( dataSource , "verse" , "add_military_item" ); + this.fAddToMilitaryQueue.addParameter( "planet_id" , Types.INTEGER ); + this.fAddToMilitaryQueue.addParameter( "ship_id" , Types.INTEGER ); + this.fAddToMilitaryQueue.addParameter( "amount" , Types.INTEGER ); + + this.fConstructBuildings = new StoredProc( dataSource , "verse" , "construct_buildings" ); + this.fConstructBuildings.addParameter( "planet_id" , Types.INTEGER ); + this.fConstructBuildings.addParameter( "building_id" , Types.INTEGER ); + this.fConstructBuildings.addParameter( "amount" , Types.INTEGER ); + + this.fDestroyBuildings = new StoredProc( dataSource , "verse" , "destroy_buildings" ); + this.fDestroyBuildings.addParameter( "planet_id" , Types.INTEGER ); + this.fDestroyBuildings.addParameter( "building_id" , Types.INTEGER ); + this.fDestroyBuildings.addParameter( "amount" , Types.INTEGER ); + this.fDestroyBuildings.addOutput( "success" , Types.BOOLEAN ); + + this.fAbandon = new StoredProc( dataSource , "verse" , "abandon" ); + this.fAbandon.addParameter( "planet_id" , Types.INTEGER ); + this.fAbandon.addOutput( "tta" , Types.INTEGER ); + + this.fCancelAbandon = new StoredProc( dataSource , "verse" , "cancel_abandon" ); + this.fCancelAbandon.addParameter( "planet_id" , Types.INTEGER ); + } + + + @Override + public Basic getBasicInformation( int empireId , int planetId ) + { + String sql = "SELECT * FROM verse.get_planet_basics( ? , ? )"; + return this.dTemplate.queryForObject( sql , this.mPlanetBasics , empireId , planetId ); + } + + + @Override + public Orbital getOrbitalInformation( int empireId , int planetId ) + { + String sql = "SELECT * FROM verse.get_orbital_view( ? , ? )"; + return this.dTemplate.queryForObject( sql , this.mPlanetOrbital , empireId , planetId ); + } + + + @Override + public Owner getOwnerInformation( int empireId , int planetId ) + { + String sql = "SELECT * FROM verse.get_owner_view( ? , ? )"; + return this.dTemplate.queryForObject( sql , this.mPlanetOwner , empireId , planetId ); + } + + + @Override + public List< BuildingData > getBuildings( int empireId , int planetId , boolean isOwner ) + { + RowMapper< BuildingData > mapper = isOwner ? this.mOwnerBuildings : this.mOrbitalBuildings; + String sql = "SELECT * FROM verse.get_buildings_view( ? , ? )"; + return this.dTemplate.query( sql , mapper , empireId , planetId ); + } + + + @Override + public QueueData getConstructionQueue( int planetId ) + { + String sql = "SELECT * FROM verse.get_build_queue( ? )"; + List< QueueItemData > items = this.dTemplate.query( sql , this.mQueueItem , planetId ); + return new QueueData( ( items.size( ) < 5 ) , items ); + } + + + @Override + public QueueData getMilitaryQueue( int planetId ) + { + String sql = "SELECT * FROM verse.get_military_queue( ? )"; + List< QueueItemData > items = this.dTemplate.query( sql , this.mQueueItem , planetId ); + return new QueueData( ( items.size( ) < 5 ) , items ); + } + + + @Override + public List< BuildableBuildingData > getAvailableBuildings( int planetId ) + { + String sql = "SELECT * FROM verse.get_available_buildings( ? )"; + return this.dTemplate.query( sql , this.mAvailableBuilding , planetId ); + } + + + @Override + public List< BuildableShipData > getAvailableShips( int planetId ) + { + String sql = "SELECT * FROM verse.get_available_ships( ? )"; + return this.dTemplate.query( sql , this.mAvailableShip , planetId ); + } + + + @Override + public void flushQueue( int planetId , boolean military ) + { + StoredProc proc = military ? this.fFlushMilitaryQueue : this.fFlushBuildQueue; + proc.execute( planetId ); + } + + + @Override + public void addToMilitaryQueue( int planetId , int sType , int amount ) + { + this.fAddToMilitaryQueue.execute( planetId , sType , amount ); + } + + + @Override + public void constructBuildings( int planetId , int bType , int amount ) + { + this.fConstructBuildings.execute( planetId , bType , amount ); + } + + + @Override + public boolean destroyBuildings( int planetId , int bType , int amount ) + { + return (Boolean) this.fDestroyBuildings.execute( planetId , bType , amount ).get( "success" ); + } + + + @Override + public Integer abandon( int planetId ) + { + int v; + v = (Integer) this.fAbandon.execute( planetId ).get( "tta" ); + return v == 0 ? null : v; + } + + + @Override + public void cancelAbandon( int planetId ) + { + this.fCancelAbandon.execute( planetId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetsManagementBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetsManagementBean.java new file mode 100644 index 0000000..709fe4b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/PlanetsManagementBean.java @@ -0,0 +1,302 @@ +package com.deepclone.lw.beans.map; + + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.planets.BuildingData; +import com.deepclone.lw.cmd.player.gdata.planets.OwnPlanetStatusData; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetBasicView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOrbitalView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOwnView; +import com.deepclone.lw.cmd.player.planets.BuildingActionResponse; +import com.deepclone.lw.cmd.player.planets.RenamePlanetResponse; +import com.deepclone.lw.cmd.player.planets.ViewPlanetResponse; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.game.PlanetDAO; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.naming.NamingDAO; +import com.deepclone.lw.sqld.game.PlanetData; +import com.deepclone.lw.sqld.game.PlanetData.AccessType; +import com.deepclone.lw.sqld.game.PlanetData.Basic; +import com.deepclone.lw.sqld.game.PlanetData.Orbital; +import com.deepclone.lw.sqld.game.PlanetData.Owner; + + + +@Transactional +public class PlanetsManagementBean + implements PlanetsManagement +{ + + private EmpireManagement empireManagement; + private PlanetDAO planetDao; + private NamingDAO namingDao; + + + @Autowired( required = true ) + public void setEmpireManagement( EmpireManagement empireManagement ) + { + this.empireManagement = empireManagement; + } + + + @Autowired( required = true ) + public void setPlanetDAO( PlanetDAO planetDao ) + { + this.planetDao = planetDao; + } + + + @Autowired( required = true ) + public void setNamingDao( NamingDAO namingDao ) + { + this.namingDao = namingDao; + } + + + private PlanetOrbitalView getOrbitalView( int empireId , int planetId , AccessType access ) + { + if ( access == AccessType.BASIC ) { + return null; + } + + Orbital orbital = this.planetDao.getOrbitalInformation( empireId , planetId ); + List< BuildingData > buildings = this.planetDao.getBuildings( empireId , planetId , + ( access == AccessType.OWNER ) ); + + PlanetOrbitalView view = new PlanetOrbitalView( ); + view.setPopulation( orbital.getPopulation( ) ); + view.setDefencePoints( orbital.getDefence( ) ); + view.setOwnFleet( orbital.getOwnPower( ) ); + view.setFriendlyFleet( orbital.getFriendlyPower( ) ); + view.setHostileFleet( orbital.getHostilePower( ) ); + view.setBattle( orbital.getBattle( ) ); + view.setBuildings( buildings ); + + return view; + } + + + private PlanetOwnView getOwnerView( int empireId , int planetId , AccessType access ) + { + if ( access != AccessType.OWNER ) { + return null; + } + + Owner data = this.planetDao.getOwnerInformation( empireId , planetId ); + OwnPlanetStatusData status = new OwnPlanetStatusData( ); + status.setRenamePossible( data.isRenamePossible( ) ); + status.setAbandonPossible( data.isAbandonPossible( ) ); + status.setAbandonTime( data.getAbandonTime( ) ); + + PlanetOwnView view = new PlanetOwnView( ); + view.setStatus( status ); + view.setHappiness( data.getHappiness( ) ); + view.sethChange( data.gethChange( ) ); + view.setIncome( data.getIncome( ) ); + view.setUpkeep( data.getUpkeep( ) ); + + view.setCivQueue( this.planetDao.getConstructionQueue( planetId ) ); + view.setMilQueue( this.planetDao.getMilitaryQueue( planetId ) ); + + view.setbBuildings( this.planetDao.getAvailableBuildings( planetId ) ); + view.setbShips( this.planetDao.getAvailableShips( planetId ) ); + + return view; + } + + + private PlanetBasicView getBasicView( Basic data ) + { + return new PlanetBasicView( data.getName( ) , data.getPicture( ) , data.getTag( ) , data.getX( ) , + data.getY( ) , data.getOrbit( ) ); + } + + + private ViewPlanetResponse planetNotFound( int empireId ) + { + return new ViewPlanetResponse( this.empireManagement.getGeneralInformation( empireId ) ); + } + + + private ViewPlanetResponse ownershipError( int empireId , int planetId , Basic basic ) + { + AccessType access = basic.getAccess( ); + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + return new ViewPlanetResponse( planetId , page , this.getBasicView( basic ) , orbital ); + } + + + private ViewPlanetResponse fullView( int empireId , int planetId , Basic basic ) + { + AccessType access = basic.getAccess( ); + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + PlanetOwnView owner = this.getOwnerView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + return new ViewPlanetResponse( planetId , page , this.getBasicView( basic ) , orbital , owner ); + + } + + + @Override + public ViewPlanetResponse viewPlanet( int empireId , int planetId ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } + + AccessType access = basic.getAccess( ); + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + PlanetOwnView owner = this.getOwnerView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + return new ViewPlanetResponse( planetId , page , this.getBasicView( basic ) , orbital , owner ); + } + + + @Override + public ViewPlanetResponse renamePlanet( int empireId , int planetId , String name ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } + + AccessType access = basic.getAccess( ); + if ( access != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + + int rv = this.namingDao.renamePlanet( planetId , name ); + ObjectNameError one = null; + switch ( rv ) { + case 0: + basic.setName( name ); + break; + case 1: + one = ObjectNameError.BANNED; + break; + case 2: + one = ObjectNameError.UNAVAILABLE; + break; + case 3: + // "Too early" - someone probably pressed F5 + break; + default: + throw new RuntimeException( "unknown error code " + rv ); + } + + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + PlanetOwnView owner = this.getOwnerView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + + if ( one == null ) { + return new ViewPlanetResponse( planetId , page , this.getBasicView( basic ) , orbital , owner ); + } + return new RenamePlanetResponse( planetId , page , this.getBasicView( basic ) , orbital , owner , name , one + .toString( ) ); + } + + + @Override + public ViewPlanetResponse flushQueue( int empireId , int planetId , boolean military ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } else if ( basic.getAccess( ) != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + this.planetDao.flushQueue( planetId , military ); + + return this.fullView( empireId , planetId , basic ); + } + + + @Override + public ViewPlanetResponse addToMilitaryQueue( int empireId , int planetId , int sType , int amount ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } else if ( basic.getAccess( ) != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + this.planetDao.addToMilitaryQueue( planetId , sType , amount ); + return this.fullView( empireId , planetId , basic ); + } + + + @Override + public ViewPlanetResponse addToCivilianQueue( int empireId , int planetId , int bType , boolean destroy , int amount ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } else if ( basic.getAccess( ) != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + + if ( !destroy ) { + this.planetDao.constructBuildings( planetId , bType , amount ); + } else if ( !this.planetDao.destroyBuildings( planetId , bType , amount ) ) { + AccessType access = basic.getAccess( ); + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + PlanetOwnView owner = this.getOwnerView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + return new BuildingActionResponse( planetId , page , this.getBasicView( basic ) , orbital , owner ); + } + return this.fullView( empireId , planetId , basic ); + } + + + @Override + public ViewPlanetResponse abandon( int empireId , int planetId ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } else if ( basic.getAccess( ) != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + + AccessType access = basic.getAccess( ); + PlanetOrbitalView orbital = this.getOrbitalView( empireId , planetId , access ); + PlanetOwnView owner = this.getOwnerView( empireId , planetId , access ); + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + + Integer x; + if ( owner.getStatus( ).isAbandonPossible( ) ) { + x = this.planetDao.abandon( planetId ); + } else { + x = null; + } + + if ( x != null ) { + owner.getStatus( ).setAbandonPossible( false ); + owner.getStatus( ).setAbandonTime( x ); + } + + return new ViewPlanetResponse( planetId , page , this.getBasicView( basic ) , orbital , owner ); + } + + + @Override + public ViewPlanetResponse cancelAbandon( int empireId , int planetId ) + { + PlanetData.Basic basic = this.planetDao.getBasicInformation( empireId , planetId ); + if ( basic == null ) { + return this.planetNotFound( empireId ); + } else if ( basic.getAccess( ) != AccessType.OWNER ) { + return this.ownershipError( empireId , planetId , basic ); + } + this.planetDao.cancelAbandon( planetId ); + return this.fullView( empireId , planetId , basic ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseDAOBean.java new file mode 100644 index 0000000..b7dfe92 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseDAOBean.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.beans.map; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.interfaces.game.UniverseDAO; +import com.deepclone.lw.sqld.game.MapData; + + + +public class UniverseDAOBean + implements UniverseDAO +{ + private SimpleJdbcTemplate dTemplate; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + } + + + @Override + public void generate( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT verse.generate( )" ); + } + + + @Override + public List< MapData > getMap( int empireId , int minX , int minY , int maxX , int maxY ) + { + String sql = "SELECT * FROM verse.get_map( ? , ? , ? , ? , ? )"; + + RowMapper< MapData > mapper = new RowMapper< MapData >( ) { + @Override + public MapData mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + MapData entry = new MapData( ); + + entry.setX( rs.getInt( "x" ) ); + entry.setY( rs.getInt( "y" ) ); + entry.setOrbit( rs.getInt( "orbit" ) ); + entry.setId( rs.getInt( "id" ) ); + entry.setPicture( rs.getInt( "picture" ) ); + entry.setName( rs.getString( "name" ) ); + entry.setTag( rs.getString( "tag" ) ); + entry.setDisplay( rs.getString( "display" ) ); + + return entry; + } + }; + + return this.dTemplate.query( sql , mapper , empireId , minX , minY , maxX , maxY ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorBean.java new file mode 100644 index 0000000..e2aba49 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorBean.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.beans.map; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.game.UniverseDAO; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class UniverseGeneratorBean + implements InitializingBean , DisposableBean +{ + + private TransactionTemplate tTemplate; + + private Ticker ticker; + + private UniverseDAO universeDao; + + private UniverseGeneratorTask generator; + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tTemplate = new TransactionTemplate( tManager ); + } + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setUniverseDAO( UniverseDAO universeDao ) + { + this.universeDao = universeDao; + } + + + @Override + public void afterPropertiesSet( ) + { + // Create ticker task + this.generator = new UniverseGeneratorTask( this.tTemplate , this.universeDao ); + this.ticker.registerTask( Frequency.HIGH , "Universe generator" , this.generator ); + } + + + @Override + public void destroy( ) + { + this.generator = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorTask.java new file mode 100644 index 0000000..b123053 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/map/UniverseGeneratorTask.java @@ -0,0 +1,38 @@ +package com.deepclone.lw.beans.map; + + +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.game.UniverseDAO; + + + +class UniverseGeneratorTask + implements Runnable +{ + private final TransactionTemplate tTemplate; + private final UniverseDAO universeDao; + + + UniverseGeneratorTask( TransactionTemplate tTemplate , UniverseDAO universeDao ) + { + this.tTemplate = tTemplate; + this.universeDao = universeDao; + } + + + @Override + public void run( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + universeDao.generate( ); + } + } ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/AdminMessagesBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/AdminMessagesBean.java new file mode 100644 index 0000000..0f07a8f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/AdminMessagesBean.java @@ -0,0 +1,344 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.*; +import com.deepclone.lw.cmd.admin.msg.*; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.game.EmpireDAO; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.msg.MessageBoxDAO; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Transactional +public class AdminMessagesBean + implements AdminMessages +{ + + private MessageBoxDAO mboxDao; + private MessageContentCache contentCache; + private MessageFormatRegistry formats; + private EmpireDAO empireDao; + private AdminDAO adminDao; + + + @Autowired( required = true ) + public void setMboxDao( MessageBoxDAO mboxDao ) + { + this.mboxDao = mboxDao; + } + + + @Autowired( required = true ) + public void setContentCache( MessageContentCache contentCache ) + { + this.contentCache = contentCache; + } + + + @Autowired( required = true ) + public void setFormats( MessageFormatRegistry formats ) + { + this.formats = formats; + } + + + @Autowired( required = true ) + public void setEmpireDao( EmpireDAO empireDao ) + { + this.empireDao = empireDao; + } + + + @Autowired( required = true ) + public void setAdminDao( AdminDAO adminDao ) + { + this.adminDao = adminDao; + } + + + private Message readMessage( Administrator admin , boolean inbox , long id ) + { + // Get list of messages + List< InboxRecord > mbox = this.mboxDao.getList( true , admin.getId( ) , inbox ); + Map< Long , MessageDataRecord > contents = this.contentCache.getContent( mbox ); + if ( !contents.containsKey( id ) ) { + return null; + } + + // Find next and previous messages + Long previous = null; + Long next = null; + InboxRecord record = null; + boolean found = false; + for ( InboxRecord message : mbox ) { + if ( !found ) { + if ( message.getId( ) == id ) { + found = true; + record = message; + } else { + previous = message.getId( ); + } + } else if ( next == null ) { + next = message.getId( ); + break; + } + } + + MessageDataRecord content = contents.get( record.getId( ) ); + MessageExtractor formatter = this.formats.getFormatter( content ).getExtractor( record , content , "en" ); + + // Extract basic information + Message message = new Message( ); + message.setId( id ); + message.setNext( next ); + message.setPrevious( previous ); + message.setTime( record.getReceived( ) ); + message.setSender( inbox ? formatter.getSender( ) : record.getSenderName( ) ); + message.setReceiver( record.getReceiverName( ) ); + message.setTitle( formatter.getSubject( ) ); + message.setContents( formatter.getContents( ) ); + message.setUnread( !record.isRead( ) ); + message.setGameTime( content.getTick( ) ); + + // Handle message type + String type = inbox ? record.getSenderType( ) : record.getReceiverType( ); + if ( "EMP".equals( type ) ) { + message.setType( MessageType.EMPIRE ); + } else if ( "ADM".equals( type ) ) { + message.setType( MessageType.ADMINISTRATOR ); + } else { + throw new RuntimeException( "unknown message type " + type ); + } + + return message; + } + + + @Override + public GetMessagesResponse getMessages( Administrator admin , boolean inbox ) + { + // Get list of messages + List< InboxRecord > mbox = this.mboxDao.getList( true , admin.getId( ) , inbox ); + Map< Long , MessageDataRecord > contents = this.contentCache.getContent( mbox ); + + // Format messages and create list of entries + List< MessageListEntry > results = new LinkedList< MessageListEntry >( ); + for ( InboxRecord mRecord : mbox ) { + MessageDataRecord content = contents.get( mRecord.getId( ) ); + MessageExtractor formatter = this.formats.getFormatter( content ).getExtractor( mRecord , content , "en" ); + + MessageListEntry result = new MessageListEntry( ); + result.setId( mRecord.getId( ) ); + result.setTime( mRecord.getReceived( ) ); + result.setRead( mRecord.isRead( ) ); + result.setTitle( formatter.getSubject( ) ); + result.setSender( inbox ? formatter.getSender( ) : mRecord.getReceiverName( ) ); + + String type = inbox ? mRecord.getSenderType( ) : mRecord.getReceiverType( ); + if ( "ADM".equals( type ) ) { + result.setType( MessageType.ADMINISTRATOR ); + } else if ( "EMP".equals( type ) ) { + result.setType( MessageType.EMPIRE ); + } else { + throw new RuntimeException( "unknown message type " + type ); + } + results.add( result ); + } + + return new GetMessagesResponse( admin , results ); + } + + + @Override + public ReadMessageResponse getMessage( Administrator admin , boolean inbox , long id ) + { + // Get list of messages + Message message = this.readMessage( admin , inbox , id ); + if ( message == null ) { + return new ReadMessageResponse( admin , inbox ); + } + + // Mark message as read + if ( inbox && message.isUnread( ) ) { + this.mboxDao.markRead( true , admin.getId( ) , new long[] { + id + } ); + } + + return new ReadMessageResponse( admin , inbox , message ); + } + + + @Override + public void deleteMessages( Administrator admin , boolean inbox , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.delete( true , admin.getId( ) , inbox ); + } else { + this.mboxDao.delete( true , admin.getId( ) , inbox , selection ); + } + } + + + @Override + public void markRead( Administrator admin , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.markRead( true , admin.getId( ) ); + } else { + this.mboxDao.markRead( true , admin.getId( ) , selection ); + } + } + + + @Override + public void markUnread( Administrator admin , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.markUnread( true , admin.getId( ) ); + } else { + this.mboxDao.markUnread( true , admin.getId( ) , selection ); + } + } + + + @Override + public ComposeMessageResponse prepareBlankMessage( Administrator admin ) + { + ComposeMessageResponse response = new ComposeMessageResponse( admin ); + response.setMessageType( MessageType.ADMINISTRATOR ); + response.setTarget( "" ); + response.setTitle( "" ); + response.setContents( "" ); + return response; + } + + + @Override + public ComposeMessageResponse prepareMessageTo( Administrator admin , MessageType type , int id ) + { + ComposeMessageResponse response = this.prepareBlankMessage( admin ); + response.setMessageType( type ); + try { + switch ( type ) { + case EMPIRE: + response.setTarget( this.empireDao.getInformation( id ).getName( ) ); + break; + case ADMINISTRATOR: + response.setTarget( this.adminDao.getAdmin( id ).getName( ) ); + break; + default: + throw new RuntimeException( "unsupported target type " + type ); + } + } catch ( NullPointerException e ) { + response.setTargetError( true ); + } + return response; + } + + + @Override + public ComposeMessageResponse sendMessage( Administrator admin , MessageType type , String target , String title , + String contents , boolean simulate ) + { + int errCode = this.mboxDao.sendMessage( true , admin.getId( ) , type , target , title , contents , simulate ); + if ( errCode == 0 && !simulate ) { + return this.prepareBlankMessage( admin ); + } + + ComposeMessageResponse response = new ComposeMessageResponse( admin ); + return this.sendError( type , target , title , contents , errCode , response ); + } + + + @Override + public ComposeMessageResponse sendReply( Administrator admin , boolean inbox , long replyTo , MessageType type , + String target , String title , String contents , boolean simulate ) + { + int errCode = this.mboxDao.sendMessage( true , admin.getId( ) , type , target , title , contents , simulate ); + if ( errCode == 0 && !simulate ) { + return this.prepareBlankMessage( admin ); + } + + Message message = this.readMessage( admin , inbox , replyTo ); + ComposeMessageResponse response; + if ( message == null || message.getType( ) == MessageType.INTERNAL ) { + response = new ComposeMessageResponse( admin ); + } else { + response = new ComposeMessageResponse( admin , inbox , message ); + } + + return this.sendError( type , target , title , contents , errCode , response ); + } + + + private ComposeMessageResponse sendError( MessageType type , String target , String title , String contents , + int errCode , ComposeMessageResponse response ) + { + switch ( errCode ) { + case 1: + response.setTargetError( true ); + break; + case 2: + response.setTimingError( true ); + break; + } + + response.setMessageType( type ); + response.setTarget( target ); + response.setTitle( title ); + response.setContents( contents ); + + return response; + } + + + @Override + public ComposeMessageResponse prepareReply( Administrator admin , boolean inbox , long id ) + { + Message message = this.readMessage( admin , inbox , id ); + if ( message == null || message.getType( ) == MessageType.INTERNAL ) { + return this.prepareBlankMessage( admin ); + } + + ComposeMessageResponse response; + response = new ComposeMessageResponse( admin , inbox , message ); + + response.setMessageType( message.getType( ) ); + response.setTarget( message.getSender( ) ); + + String title = message.getTitle( ); + if ( !title.startsWith( "Re: " ) ) { + title = "Re: " + title; + if ( title.length( ) > 64 ) { + title = title.substring( 0 , 64 ); + } + } + response.setTitle( title ); + + response.setContents( "" ); + return response; + } + + + @Override + public void sendSpam( Administrator admin , String title , String body ) + { + this.mboxDao.sendSpam( admin.getId( ) , title , body ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/EmpireMessagesBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/EmpireMessagesBean.java new file mode 100644 index 0000000..7885bc5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/EmpireMessagesBean.java @@ -0,0 +1,449 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.deepclone.lw.cmd.admin.adata.AdministratorBasics; +import com.deepclone.lw.cmd.admin.naming.Name; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageListEntry; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; +import com.deepclone.lw.cmd.player.msgs.ComposeMessageResponse; +import com.deepclone.lw.cmd.player.msgs.GetMessagesResponse; +import com.deepclone.lw.cmd.player.msgs.ListTargetsResponse; +import com.deepclone.lw.cmd.player.msgs.ReadMessageResponse; +import com.deepclone.lw.interfaces.acm.UsersDAO; +import com.deepclone.lw.interfaces.admin.AdminDAO; +import com.deepclone.lw.interfaces.game.AllianceDAO; +import com.deepclone.lw.interfaces.game.EmpireDAO; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.msg.MessageBoxDAO; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.naming.NamingDAO; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Transactional +public class EmpireMessagesBean + implements EmpireMessages +{ + + private EmpireManagement empireManager; + private MessageBoxDAO mboxDao; + private MessageContentCache contentCache; + private MessageFormatRegistry formats; + private EmpireDAO empireDao; + private AllianceDAO allianceDao; + private UsersDAO usersDao; + private AdminDAO adminDao; + private NamingDAO namingDao; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement empireManager ) + { + this.empireManager = empireManager; + } + + + @Autowired( required = true ) + public void setMboxDao( MessageBoxDAO mboxDao ) + { + this.mboxDao = mboxDao; + } + + + @Autowired( required = true ) + public void setContentCache( MessageContentCache contentCache ) + { + this.contentCache = contentCache; + } + + + @Autowired( required = true ) + public void setFormats( MessageFormatRegistry formats ) + { + this.formats = formats; + } + + + @Autowired( required = true ) + public void setEmpireDao( EmpireDAO empireDao ) + { + this.empireDao = empireDao; + } + + + @Autowired( required = true ) + public void setAllianceDao( AllianceDAO allianceDao ) + { + this.allianceDao = allianceDao; + } + + + @Autowired( required = true ) + public void setUsersDao( UsersDAO usersDao ) + { + this.usersDao = usersDao; + } + + + @Autowired( required = true ) + public void setAdminDao( AdminDAO adminDao ) + { + this.adminDao = adminDao; + } + + + @Autowired( required = true ) + public void setNamingDao( NamingDAO namingDao ) + { + this.namingDao = namingDao; + } + + + private Message readEmpireMessage( int empireId , boolean inbox , long id ) + { + int accountId = this.empireDao.getInformation( empireId ).getAccountId( ); + String lang = this.usersDao.getAccount( accountId ).getLanguage( ); + + // Get list of messages + List< InboxRecord > mbox = this.mboxDao.getList( false , empireId , inbox ); + Map< Long , MessageDataRecord > contents = this.contentCache.getContent( mbox ); + if ( !contents.containsKey( id ) ) { + return null; + } + + // Find next and previous messages + Long previous = null; + Long next = null; + InboxRecord record = null; + boolean found = false; + for ( InboxRecord message : mbox ) { + if ( !found ) { + if ( message.getId( ) == id ) { + found = true; + record = message; + } else { + previous = message.getId( ); + } + } else if ( next == null ) { + next = message.getId( ); + break; + } + } + + MessageDataRecord content = contents.get( record.getId( ) ); + MessageExtractor formatter = this.formats.getFormatter( content ).getExtractor( record , content , lang ); + + // Extract basic information + Message message = new Message( ); + message.setId( id ); + message.setNext( next ); + message.setPrevious( previous ); + message.setTime( record.getReceived( ) ); + message.setSender( inbox ? formatter.getSender( ) : record.getSenderName( ) ); + message.setReceiver( record.getReceiverName( ) ); + message.setTitle( formatter.getSubject( ) ); + message.setContents( formatter.getContents( ) ); + message.setUnread( !record.isRead( ) ); + message.setGameTime( content.getTick( ) ); + + // Handle message type + if ( record.isInternal( ) ) { + message.setType( MessageType.INTERNAL ); + } else { + String type = inbox ? record.getSenderType( ) : record.getReceiverType( ); + if ( "ALL".equals( record.getReceiverType( ) ) ) { + message.setType( MessageType.ALLIANCE ); + message.setReceiver( "[" + message.getReceiver( ) + "]" ); + } else if ( "EMP".equals( type ) ) { + message.setType( MessageType.EMPIRE ); + } else if ( "ADM".equals( type ) ) { + message.setType( MessageType.ADMINISTRATOR ); + } else { + throw new RuntimeException( "unknown message type " + type ); + } + } + + return message; + } + + + @Override + public GetMessagesResponse getMessages( int empireId , boolean inbox ) + { + int accountId = this.empireDao.getInformation( empireId ).getAccountId( ); + String lang = this.usersDao.getAccount( accountId ).getLanguage( ); + + // Get list of messages + List< InboxRecord > mbox = this.mboxDao.getList( false , empireId , inbox ); + Map< Long , MessageDataRecord > contents = this.contentCache.getContent( mbox ); + + // Format messages and create list of entries + List< MessageListEntry > results = new LinkedList< MessageListEntry >( ); + for ( InboxRecord mRecord : mbox ) { + MessageDataRecord content = contents.get( mRecord.getId( ) ); + MessageExtractor formatter = this.formats.getFormatter( content ).getExtractor( mRecord , content , lang ); + + MessageListEntry result = new MessageListEntry( ); + result.setId( mRecord.getId( ) ); + result.setTime( mRecord.getReceived( ) ); + result.setRead( mRecord.isRead( ) ); + result.setTitle( formatter.getSubject( ) ); + result.setSender( inbox ? formatter.getSender( ) : mRecord.getReceiverName( ) ); + if ( mRecord.isInternal( ) ) { + result.setType( MessageType.INTERNAL ); + } else { + String type = inbox ? mRecord.getSenderType( ) : mRecord.getReceiverType( ); + if ( "ADM".equals( type ) ) { + result.setType( MessageType.ADMINISTRATOR ); + } else if ( "ALL".equals( mRecord.getReceiverType( ) ) ) { + result.setType( MessageType.ALLIANCE ); + result.setSender( "[" + mRecord.getReceiverName( ) + "]" ); + } else if ( "EMP".equals( type ) ) { + result.setType( MessageType.EMPIRE ); + } else { + throw new RuntimeException( "unknown message type " + type ); + } + } + results.add( result ); + } + + return new GetMessagesResponse( this.empireManager.getGeneralInformation( empireId ) , results ); + } + + + @Override + public ReadMessageResponse getMessage( int empireId , boolean inbox , long id ) + { + // Get list of messages + Message message = this.readEmpireMessage( empireId , inbox , id ); + if ( message == null ) { + return new ReadMessageResponse( this.empireManager.getGeneralInformation( empireId ) , inbox ); + } + + // Mark message as read + if ( inbox && message.isUnread( ) ) { + this.mboxDao.markRead( false , empireId , new long[] { + id + } ); + } + + return new ReadMessageResponse( this.empireManager.getGeneralInformation( empireId ) , inbox , message ); + } + + + @Override + public void deleteMessages( int empireId , boolean inbox , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.delete( false , empireId , inbox ); + } else { + this.mboxDao.delete( false , empireId , inbox , selection ); + } + } + + + @Override + public void markRead( int empireId , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.markRead( false , empireId ); + } else { + this.mboxDao.markRead( false , empireId , selection ); + } + } + + + @Override + public void markUnread( int empireId , long[] selection ) + { + if ( selection == null ) { + this.mboxDao.markUnread( false , empireId ); + } else { + this.mboxDao.markUnread( false , empireId , selection ); + } + } + + + @Override + public ComposeMessageResponse prepareBlankMessage( int empireId ) + { + ComposeMessageResponse response = new ComposeMessageResponse( this.empireManager + .getGeneralInformation( empireId ) ); + response.setMessageType( MessageType.EMPIRE ); + response.setTarget( "" ); + response.setTitle( "" ); + response.setContents( "" ); + return response; + } + + + @Override + public ComposeMessageResponse prepareMessageTo( int empireId , MessageType type , int id ) + { + ComposeMessageResponse response = this.prepareBlankMessage( empireId ); + response.setMessageType( type ); + try { + switch ( type ) { + case EMPIRE: + response.setTarget( this.empireDao.getInformation( id ).getName( ) ); + break; + case ALLIANCE: + response.setTarget( this.allianceDao.getPublicInformation( id ).getTag( ) ); + break; + case ADMINISTRATOR: + response.setTarget( this.adminDao.getAdmin( id ).getName( ) ); + break; + default: + throw new RuntimeException( "unsupported target type " + type ); + } + } catch ( NullPointerException e ) { + response.setTargetError( true ); + } + return response; + } + + + @Override + public ComposeMessageResponse sendMessage( int empireId , MessageType type , String target , String title , + String contents , boolean simulate ) + { + int errCode = this.mboxDao.sendMessage( false , empireId , type , target , title , contents , simulate ); + if ( errCode == 0 && !simulate ) { + return this.prepareBlankMessage( empireId ); + } + + ComposeMessageResponse response = new ComposeMessageResponse( this.empireManager + .getGeneralInformation( empireId ) ); + return empireSendError( type , target , title , contents , errCode , response ); + } + + + @Override + public ComposeMessageResponse sendReply( int empireId , boolean inbox , long replyTo , MessageType type , + String target , String title , String contents , boolean simulate ) + { + int errCode = this.mboxDao.sendMessage( false , empireId , type , target , title , contents , simulate ); + if ( errCode == 0 && !simulate ) { + return this.prepareBlankMessage( empireId ); + } + + Message message = this.readEmpireMessage( empireId , inbox , replyTo ); + ComposeMessageResponse response; + if ( message == null || message.getType( ) == MessageType.INTERNAL ) { + response = new ComposeMessageResponse( this.empireManager.getGeneralInformation( empireId ) ); + } else { + response = new ComposeMessageResponse( this.empireManager.getGeneralInformation( empireId ) , inbox , + message ); + } + + return empireSendError( type , target , title , contents , errCode , response ); + } + + + private ComposeMessageResponse empireSendError( MessageType type , String target , String title , String contents , + int errCode , ComposeMessageResponse response ) + { + switch ( errCode ) { + case 1: + response.setTargetError( true ); + break; + case 2: + response.setTimingError( true ); + break; + } + + response.setMessageType( type ); + response.setTarget( target ); + response.setTitle( title ); + response.setContents( contents ); + + return response; + } + + + @Override + public ComposeMessageResponse prepareReply( int empireId , boolean inbox , long id ) + { + Message message = this.readEmpireMessage( empireId , inbox , id ); + if ( message == null || message.getType( ) == MessageType.INTERNAL ) { + return this.prepareBlankMessage( empireId ); + } + + ComposeMessageResponse response; + response = new ComposeMessageResponse( this.empireManager.getGeneralInformation( empireId ) , inbox , message ); + + response.setMessageType( message.getType( ) ); + if ( message.getType( ) == MessageType.ALLIANCE ) { + String allTag = message.getReceiver( ); + response.setTarget( allTag.substring( 1 , allTag.length( ) - 1 ) ); + } else { + response.setTarget( message.getSender( ) ); + } + + String title = message.getTitle( ); + if ( !title.startsWith( "Re: " ) ) { + title = "Re: " + title; + if ( title.length( ) > 64 ) { + title = title.substring( 0 , 64 ); + } + } + response.setTitle( title ); + + response.setContents( "" ); + return response; + } + + + @Override + public ListTargetsResponse getTargets( int empireId ) + { + // List all administrators + List< AdministratorBasics > admins = new LinkedList< AdministratorBasics >( ); + for ( AdminRecord record : this.adminDao.listAdministrators( ) ) { + if ( !record.isActive( ) ) { + continue; + } + AdministratorBasics admin = new AdministratorBasics( ); + admin.setId( record.getId( ) ); + admin.setName( record.getName( ) ); + admin.setPrivileges( record.getPrivileges( ) ); + admins.add( admin ); + } + + // List active empires + List< NameIdPair > empires = new LinkedList< NameIdPair >( ); + for ( Name n : this.namingDao.getNames( NameType.EMPIRE ) ) { + if ( n.getExtra( ) == null || n.getId( ) == empireId ) { + continue; + } + empires.add( new NameIdPair( n.getId( ) , n.getName( ) ) ); + } + + // List alliances + List< PublicAllianceInformation > alliances = new LinkedList< PublicAllianceInformation >( ); + for ( Name n : this.namingDao.getNames( NameType.ALLIANCE ) ) { + alliances.add( new PublicAllianceInformation( n.getId( ) , n.getName( ) , n.getExtra( ) , 0 , null , 0 ) ); + } + + return new ListTargetsResponse( this.empireManager.getGeneralInformation( empireId ) , empires , alliances , + admins ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MailTaskBase.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MailTaskBase.java new file mode 100644 index 0000000..c59099d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MailTaskBase.java @@ -0,0 +1,157 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.List; +import java.util.Map; + +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.NotificationsDAO; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.NotificationsRecord; + + + +abstract class MailTaskBase + implements Runnable +{ + + protected static class MessageData + { + public List< InboxRecord > messages; + public Map< Long , MessageDataRecord > data; + } + + protected final SystemLogger logger; + protected final TransactionTemplate tTemplate; + protected final NotificationsDAO notificationsDao; + protected final MessageContentCache contents; + protected final MessageFormatRegistry formats; + protected final Translator translator; + protected final Mailer mailer; + protected final MessageCleanerBean cleaner; + protected final boolean mode; + + + public MailTaskBase( Logger logger , PlatformTransactionManager tManager , NotificationsDAO notificationsDao , + MessageContentCache contents , MessageFormatRegistry formats , Translator translator , Mailer mailer , + MessageCleanerBean cleaner , boolean mode ) + { + this.logger = logger.getSystemLogger( this.getClass( ).getSimpleName( ) ); + this.tTemplate = new TransactionTemplate( tManager ); + this.notificationsDao = notificationsDao; + this.contents = contents; + this.formats = formats; + this.translator = translator; + this.mailer = mailer; + this.cleaner = cleaner; + this.mode = mode; + } + + + @Override + public void run( ) + { + List< NotificationsRecord > notifications = this.getNotifications( ); + for ( NotificationsRecord notification : notifications ) { + this.notify( notification ); + } + } + + + private List< NotificationsRecord > getNotifications( ) + { + return this.tTemplate.execute( new TransactionCallback< List< NotificationsRecord > >( ) { + @Override + public List< NotificationsRecord > doInTransaction( TransactionStatus status ) + { + return notificationsDao.getNotificationRecords( mode ); + } + } ); + } + + + protected abstract void notify( NotificationsRecord notification ); + + + protected final MessageData getMessagesToSend( final int id , final long maxId , final boolean nPrivate , + final boolean nInternal , final boolean nAlliance , final boolean nAdmin ) + { + return this.tTemplate.execute( new TransactionCallback< MessageData >( ) { + @Override + public MessageData doInTransaction( TransactionStatus status ) + { + MessageData md = new MessageData( ); + md.messages = notificationsDao.listMessages( id , maxId , mode , nPrivate , nInternal , nAlliance , + nAdmin ); + if ( !md.messages.isEmpty( ) ) { + md.data = contents.getContent( md.messages ); + } + return md; + } + } ); + } + + + protected final String translate( String string , String lang ) + { + try { + return this.translator.translate( lang , string ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + } + + + protected final Message readMessage( int empireId , String lang , InboxRecord record , MessageDataRecord content , + boolean needBody ) + { + MessageExtractor formatter = this.formats.getFormatter( content ).getExtractor( record , content , lang ); + + // Extract basic information + Message message = new Message( ); + message.setTime( record.getReceived( ) ); + message.setSender( formatter.getSender( ) ); + message.setReceiver( record.getReceiverName( ) ); + message.setTitle( formatter.getSubject( ) ); + if ( needBody ) { + message.setContents( formatter.getContents( ) ); + } + message.setUnread( !record.isRead( ) ); + message.setGameTime( content.getTick( ) ); + + // Handle message type + if ( record.isInternal( ) ) { + message.setType( MessageType.INTERNAL ); + } else { + String type = record.getSenderType( ); + if ( "ALL".equals( record.getReceiverType( ) ) ) { + message.setType( MessageType.ALLIANCE ); + message.setReceiver( "[" + message.getReceiver( ) + "]" ); + } else if ( "EMP".equals( type ) ) { + message.setType( MessageType.EMPIRE ); + } else if ( "ADM".equals( type ) ) { + message.setType( MessageType.ADMINISTRATOR ); + } else { + throw new RuntimeException( "unknown message type " + type ); + } + } + + return message; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageBoxDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageBoxDAOBean.java new file mode 100644 index 0000000..3933d8d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageBoxDAOBean.java @@ -0,0 +1,420 @@ +package com.deepclone.lw.beans.msgs; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.msgs.MessageBoxAction; +import com.deepclone.lw.interfaces.msg.MessageBoxDAO; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.utils.StoredProc; + + + +public class MessageBoxDAOBean + implements MessageBoxDAO +{ + private static final int cacheTime = 6; + + private static class CacheKey + { + private final boolean admin; + private final int id; + private final boolean inbox; + + + public CacheKey( boolean admin , int id , boolean inbox ) + { + this.admin = admin; + this.id = id; + this.inbox = inbox; + } + + + @Override + public int hashCode( ) + { + final int prime = 31; + int result = 1; + result = prime * result + ( admin ? 1231 : 1237 ); + result = prime * result + id; + result = prime * result + ( inbox ? 1231 : 1237 ); + return result; + } + + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + if ( getClass( ) != obj.getClass( ) ) + return false; + CacheKey other = (CacheKey) obj; + if ( admin != other.admin ) + return false; + if ( id != other.id ) + return false; + if ( inbox != other.inbox ) + return false; + return true; + } + + } + + private static class CacheData + { + public int timeLeft = MessageBoxDAOBean.cacheTime; + public long maxId = Long.MIN_VALUE; + public List< InboxRecord > records = new LinkedList< InboxRecord >( ); + public Map< Long , MessageBoxAction > updates = new HashMap< Long , MessageBoxAction >( ); + } + + private final Map< CacheKey , CacheData > cache = new HashMap< CacheKey , CacheData >( ); + + private SimpleJdbcTemplate dTemplate; + private final RowMapper< InboxRecord > listMapper; + + private StoredProc fSendSpam; + private StoredProc fEmpireSend; + private StoredProc fEmpireMarkRead; + private StoredProc fEmpireMarkReadAll; + private StoredProc fEmpireDelete; + private StoredProc fEmpireDeleteAll; + private StoredProc fEmpireMarkUnread; + private StoredProc fEmpireMarkUnreadAll; + private StoredProc fAdminSend; + private StoredProc fAdminMarkRead; + private StoredProc fAdminMarkReadAll; + private StoredProc fAdminDelete; + private StoredProc fAdminDeleteAll; + private StoredProc fAdminMarkUnread; + private StoredProc fAdminMarkUnreadAll; + + + public MessageBoxDAOBean( ) + { + this.listMapper = new RowMapper< InboxRecord >( ) { + @Override + public InboxRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + InboxRecord iRec = new InboxRecord( ); + iRec.setId( rs.getLong( "id" ) ); + iRec.setRead( rs.getBoolean( "read" ) ); + iRec.setSenderType( rs.getString( "sender_type" ) ); + iRec.setSenderId( (Integer) rs.getObject( "sender_id" ) ); + iRec.setSenderName( rs.getString( "sender_name" ) ); + iRec.setReceiverType( rs.getString( "receiver_type" ) ); + iRec.setReceiverId( rs.getInt( "receiver_id" ) ); + iRec.setReceiverName( rs.getString( "receiver_name" ) ); + iRec.setInternal( rs.getBoolean( "internal_message" ) ); + iRec.setReceived( rs.getTimestamp( "r_time" ) ); + iRec.setContentId( rs.getLong( "content_id" ) ); + return iRec; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fSendSpam = new StoredProc( dataSource , "msgs" , "deliver_admin_spam" ); + this.fSendSpam.addParameter( "admin_id" , Types.INTEGER ); + this.fSendSpam.addParameter( "subject" , Types.VARCHAR ); + this.fSendSpam.addParameter( "contents" , "TEXT" ); + + this.fEmpireSend = new StoredProc( dataSource , "msgs" , "send_message" ); + this.fEmpireSend.addParameter( "empire_id" , Types.INTEGER ); + this.fEmpireSend.addParameter( "to_type" , "receiver_type" ); + this.fEmpireSend.addParameter( "target" , Types.VARCHAR ); + this.fEmpireSend.addParameter( "subject" , Types.VARCHAR ); + this.fEmpireSend.addParameter( "contents" , "TEXT" ); + this.fEmpireSend.addParameter( "really_send" , Types.BOOLEAN ); + this.fEmpireSend.addOutput( "err_code" , Types.INTEGER ); + + this.fEmpireMarkRead = new StoredProc( dataSource , "msgs" , "empire_mark_read" ); + this.fEmpireMarkRead.addParameter( "empire_id" , Types.INTEGER ); + this.fEmpireMarkRead.addParameter( "messages" , "BIGINT[]" ); + + this.fEmpireMarkReadAll = new StoredProc( dataSource , "msgs" , "empire_mark_read" ); + this.fEmpireMarkReadAll.addParameter( "empire_id" , Types.INTEGER ); + + this.fEmpireMarkUnread = new StoredProc( dataSource , "msgs" , "empire_mark_unread" ); + this.fEmpireMarkUnread.addParameter( "empire_id" , Types.INTEGER ); + this.fEmpireMarkUnread.addParameter( "messages" , "BIGINT[]" ); + + this.fEmpireMarkUnreadAll = new StoredProc( dataSource , "msgs" , "empire_mark_unread" ); + this.fEmpireMarkUnreadAll.addParameter( "empire_id" , Types.INTEGER ); + + this.fEmpireDelete = new StoredProc( dataSource , "msgs" , "empire_delete" ); + this.fEmpireDelete.addParameter( "empire_id" , Types.INTEGER ); + this.fEmpireDelete.addParameter( "in_inbox" , Types.BOOLEAN ); + this.fEmpireDelete.addParameter( "messages" , "BIGINT[]" ); + + this.fEmpireDeleteAll = new StoredProc( dataSource , "msgs" , "empire_delete" ); + this.fEmpireDeleteAll.addParameter( "empire_id" , Types.INTEGER ); + this.fEmpireDeleteAll.addParameter( "in_inbox" , Types.BOOLEAN ); + + this.fAdminSend = new StoredProc( dataSource , "msgs" , "send_admin_message" ); + this.fAdminSend.addParameter( "admin_id" , Types.INTEGER ); + this.fAdminSend.addParameter( "to_type" , "receiver_type" ); + this.fAdminSend.addParameter( "target" , Types.VARCHAR ); + this.fAdminSend.addParameter( "subject" , Types.VARCHAR ); + this.fAdminSend.addParameter( "contents" , "TEXT" ); + this.fAdminSend.addParameter( "really_send" , Types.BOOLEAN ); + this.fAdminSend.addOutput( "err_code" , Types.INTEGER ); + + this.fAdminMarkRead = new StoredProc( dataSource , "msgs" , "admin_mark_read" ); + this.fAdminMarkRead.addParameter( "admin_id" , Types.INTEGER ); + this.fAdminMarkRead.addParameter( "messages" , "BIGINT[]" ); + + this.fAdminMarkReadAll = new StoredProc( dataSource , "msgs" , "admin_mark_read" ); + this.fAdminMarkReadAll.addParameter( "admin_id" , Types.INTEGER ); + + this.fAdminMarkUnread = new StoredProc( dataSource , "msgs" , "admin_mark_unread" ); + this.fAdminMarkUnread.addParameter( "admin_id" , Types.INTEGER ); + this.fAdminMarkUnread.addParameter( "messages" , "BIGINT[]" ); + + this.fAdminMarkUnreadAll = new StoredProc( dataSource , "msgs" , "admin_mark_unread" ); + this.fAdminMarkUnreadAll.addParameter( "admin_id" , Types.INTEGER ); + + this.fAdminDelete = new StoredProc( dataSource , "msgs" , "admin_delete" ); + this.fAdminDelete.addParameter( "admin_id" , Types.INTEGER ); + this.fAdminDelete.addParameter( "in_inbox" , Types.BOOLEAN ); + this.fAdminDelete.addParameter( "messages" , "BIGINT[]" ); + + this.fAdminDeleteAll = new StoredProc( dataSource , "msgs" , "admin_delete" ); + this.fAdminDeleteAll.addParameter( "admin_id" , Types.INTEGER ); + this.fAdminDeleteAll.addParameter( "in_inbox" , Types.BOOLEAN ); + } + + + private String getIdArray( long[] ids ) + { + StringBuilder iArray = new StringBuilder( ).append( "{" ); + int i = 0; + int s = ids.length; + for ( Long id : ids ) { + iArray.append( id ); + if ( i != s - 1 ) { + iArray.append( "," ); + } + i++; + } + iArray.append( "}" ); + return iArray.toString( ); + } + + + @Override + public int sendMessage( boolean admin , int empireId , MessageType type , String target , String title , + String contents , boolean simulate ) + { + StoredProc send = admin ? this.fAdminSend : this.fEmpireSend; + Map< String , Object > result; + result = send.execute( empireId , type.toString( ).substring( 0 , 3 ) , target , title , contents , !simulate ); + return (Integer) result.get( "err_code" ); + } + + + @Override + public List< InboxRecord > getList( boolean admin , int id , boolean inbox ) + { + CacheKey key = new CacheKey( admin , id , inbox ); + CacheData data; + + synchronized ( this.cache ) { + data = this.cache.get( key ); + if ( data == null ) { + data = new CacheData( ); + this.cache.put( key , data ); + } else if ( !data.updates.isEmpty( ) ) { + this.applyUpdates( data ); + } + this.getNewRecords( admin , id , inbox , data ); + data.timeLeft = MessageBoxDAOBean.cacheTime; + } + + return data.records; + } + + + private void applyUpdates( CacheData data ) + { + Iterator< InboxRecord > iterator = data.records.iterator( ); + while ( iterator.hasNext( ) ) { + InboxRecord record = iterator.next( ); + MessageBoxAction update = data.updates.get( record.getId( ) ); + if ( update == null ) { + continue; + } + + switch ( update ) { + case DELETE: + iterator.remove( ); + break; + case MARK_READ: + record.setRead( true ); + break; + case MARK_UNREAD: + record.setRead( false ); + break; + } + } + data.updates.clear( ); + } + + + private void getNewRecords( boolean admin , int id , boolean inbox , CacheData data ) + { + String tString = ( admin ? "admin" : "empire" ); + String bString = ( inbox ? "in" : "out" ); + String sql = "SELECT * FROM msgs." + tString + "_" + bString + "box WHERE " + tString + "_id = ? AND id > ?"; + List< InboxRecord > newRecords = this.dTemplate.query( sql , this.listMapper , id , data.maxId ); + if ( newRecords.isEmpty( ) ) { + return; + } + + data.records.addAll( 0 , newRecords ); + data.maxId = newRecords.get( 0 ).getId( ); + } + + + @Override + public void markRead( boolean admin , int userId , long[] ids ) + { + synchronized ( this.cache ) { + CacheData data = this.cache.get( new CacheKey( admin , userId , true ) ); + if ( data != null ) { + for ( long id : ids ) { + if ( data.updates.containsKey( id ) ) { + continue; + } + data.updates.put( id , MessageBoxAction.MARK_READ ); + } + } + + StoredProc dbMark = admin ? this.fAdminMarkRead : this.fEmpireMarkRead; + dbMark.execute( userId , this.getIdArray( ids ) ); + } + } + + + @Override + public void markRead( boolean admin , int userId ) + { + synchronized ( this.cache ) { + this.cache.remove( new CacheKey( admin , userId , true ) ); + + StoredProc dbMark = admin ? this.fAdminMarkReadAll : this.fEmpireMarkReadAll; + dbMark.execute( userId ); + } + } + + + @Override + public void markUnread( boolean admin , int userId , long[] ids ) + { + synchronized ( this.cache ) { + CacheData data = this.cache.get( new CacheKey( admin , userId , true ) ); + if ( data != null ) { + for ( long id : ids ) { + if ( data.updates.containsKey( id ) ) { + continue; + } + data.updates.put( id , MessageBoxAction.MARK_UNREAD ); + } + } + + StoredProc dbMark = admin ? this.fAdminMarkUnread : this.fEmpireMarkUnread; + dbMark.execute( userId , this.getIdArray( ids ) ); + } + } + + + @Override + public void markUnread( boolean admin , int userId ) + { + synchronized ( this.cache ) { + this.cache.remove( new CacheKey( admin , userId , true ) ); + StoredProc dbMark = admin ? this.fAdminMarkUnreadAll : this.fEmpireMarkUnreadAll; + dbMark.execute( userId ); + } + } + + + @Override + public void delete( boolean admin , int userId , boolean inbox , long[] ids ) + { + synchronized ( this.cache ) { + CacheData data = this.cache.get( new CacheKey( admin , userId , inbox ) ); + if ( data != null ) { + for ( long id : ids ) { + data.updates.put( id , MessageBoxAction.DELETE ); + } + } + + StoredProc dbDelete = admin ? this.fAdminDelete : this.fEmpireDelete; + dbDelete.execute( userId , inbox , this.getIdArray( ids ) ); + } + } + + + @Override + public void delete( boolean admin , int userId , boolean inbox ) + { + synchronized ( this.cache ) { + this.cache.remove( new CacheKey( admin , userId , inbox ) ); + + StoredProc dbDelete = admin ? this.fAdminDeleteAll : this.fEmpireDeleteAll; + dbDelete.execute( userId , inbox ); + } + } + + + @Override + public void clearCache( ) + { + List< CacheKey > toRemove = new LinkedList< CacheKey >( ); + + synchronized ( this.cache ) { + for ( Map.Entry< CacheKey , CacheData > entry : this.cache.entrySet( ) ) { + CacheData data = entry.getValue( ); + data.timeLeft--; + if ( data.timeLeft == 0 ) { + toRemove.add( entry.getKey( ) ); + } + } + + for ( CacheKey key : toRemove ) { + this.cache.remove( key ); + } + } + } + + + @Override + public void sendSpam( int adminId , String title , String body ) + { + this.fSendSpam.execute( adminId , title , body ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageCleanerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageCleanerBean.java new file mode 100644 index 0000000..9fc4c5c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageCleanerBean.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.regex.Pattern; + + + +public class MessageCleanerBean +{ + private final Pattern planet = Pattern.compile( "\\{\\{planet:\\d+ ([^\\}]+)\\}\\}" ); + private final Pattern empire = Pattern.compile( "\\{\\{empire:\\d+ ([^\\}]+)\\}\\}" ); + private final Pattern battle = Pattern.compile( "\\{\\{battle:\\d+ ([^\\}]+)\\}\\}" ); + private final Pattern bug = Pattern.compile( "\\{\\{bug:(\\d+)\\}\\}" ); + + + public String cleanMessage( String message ) + { + message = message.trim( ); + + StringBuilder repLine = new StringBuilder( ); + for ( Character c : message.toCharArray( ) ) { + int nVal = Character.codePointAt( new char[] { + c + } , 0 ); + if ( c != '\n' && Character.isISOControl( nVal ) ) { + continue; + } + repLine.append( c ); + } + message = repLine.toString( ); + return message; + } + + + public String removeInternals( String message ) + { + message = planet.matcher( message ).replaceAll( "$1" ); + message = empire.matcher( message ).replaceAll( "$1" ); + message = battle.matcher( message ).replaceAll( "$1" ); + message = bug.matcher( message ).replaceAll( "#$1" ); + return message; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageContentCacheBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageContentCacheBean.java new file mode 100644 index 0000000..26ad674 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageContentCacheBean.java @@ -0,0 +1,194 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageRecordsDAO; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.EventTypeRecord; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +public class MessageContentCacheBean + implements MessageContentCache +{ + private static final int cacheTime = 24; + + private static class CacheKey + { + private final boolean internal; + private final long id; + + + public CacheKey( boolean internal , long id ) + { + this.internal = internal; + this.id = id; + } + + + @Override + public int hashCode( ) + { + final int prime = 31; + int result = 1; + result = prime * result + (int) ( id ^ ( id >>> 32 ) ); + result = prime * result + ( internal ? 1231 : 1237 ); + return result; + } + + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + if ( getClass( ) != obj.getClass( ) ) + return false; + CacheKey other = (CacheKey) obj; + if ( id != other.id ) + return false; + if ( internal != other.internal ) + return false; + return true; + } + + } + + private static class CacheData + { + public int timeLeft = MessageContentCacheBean.cacheTime; + public MessageDataRecord dataRecord; + } + + private final Map< CacheKey , CacheData > cache = new HashMap< CacheKey , CacheData >( ); + private MessageRecordsDAO recordsDao; + + + @Autowired( required = true ) + public void setRecordsDao( MessageRecordsDAO recordsDao ) + { + this.recordsDao = recordsDao; + } + + + @Override + public Map< Long , MessageDataRecord > getContent( List< InboxRecord > messages ) + { + // Creates cache keys for all records + Map< Long , CacheKey > mKeys = this.extractKeys( messages ); + + // Generate lists of uncached messages + List< Long > uncachedText = new LinkedList< Long >( ); + List< Long > uncachedEvents = new LinkedList< Long >( ); + synchronized ( this.cache ) { + this.getCachedRecords( mKeys , uncachedText , uncachedEvents ); + } + + // Fetch missing data + List< MessageDataRecord > nRecords = new LinkedList< MessageDataRecord >( ); + if ( !uncachedText.isEmpty( ) ) { + nRecords.addAll( this.recordsDao.getTextMessages( uncachedText ) ); + } + if ( !uncachedEvents.isEmpty( ) ) { + this.getMissingEvents( uncachedEvents , nRecords ); + } + + Map< Long , MessageDataRecord > result = new HashMap< Long , MessageDataRecord >( ); + synchronized ( this.cache ) { + // Add new records to the cache + for ( MessageDataRecord record : nRecords ) { + CacheKey key = new CacheKey( record.isInternal( ) , record.getId( ) ); + CacheData data = new CacheData( ); + data.dataRecord = record; + this.cache.put( key , data ); + } + + // Extract all required data + for ( Map.Entry< Long , CacheKey > entry : mKeys.entrySet( ) ) { + CacheKey key = entry.getValue( ); + result.put( entry.getKey( ) , this.cache.get( key ).dataRecord ); + } + } + + return result; + } + + + private Map< Long , CacheKey > extractKeys( List< InboxRecord > messages ) + { + Map< Long , CacheKey > mKeys = new HashMap< Long , CacheKey >( ); + for ( InboxRecord record : messages ) { + CacheKey key = new CacheKey( record.isInternal( ) , record.getContentId( ) ); + mKeys.put( record.getId( ) , key ); + } + return mKeys; + } + + + private void getCachedRecords( Map< Long , CacheKey > mKeys , List< Long > uncachedText , + List< Long > uncachedEvents ) + { + for ( Map.Entry< Long , CacheKey > entry : mKeys.entrySet( ) ) { + CacheKey key = entry.getValue( ); + CacheData data = this.cache.get( key ); + if ( data == null ) { + ( key.internal ? uncachedEvents : uncachedText ).add( key.id ); + } else { + data.timeLeft = MessageContentCacheBean.cacheTime; + } + } + } + + + private void getMissingEvents( List< Long > uncachedEvents , List< MessageDataRecord > nRecords ) + { + // Determine event types + Map< EventType , List< Long >> eventsByType = new HashMap< EventType , List< Long > >( ); + for ( EventTypeRecord eType : this.recordsDao.getEventTypes( uncachedEvents ) ) { + List< Long > typeIds = eventsByType.get( eType.getType( ) ); + if ( typeIds == null ) { + typeIds = new LinkedList< Long >( ); + eventsByType.put( eType.getType( ) , typeIds ); + } + typeIds.add( eType.getId( ) ); + } + + // Fetch data + for ( Map.Entry< EventType , List< Long > > entry : eventsByType.entrySet( ) ) { + nRecords.addAll( this.recordsDao.getEvents( entry.getKey( ) , entry.getValue( ) ) ); + } + } + + + @Override + public void clearCache( ) + { + synchronized ( this.cache ) { + List< CacheKey > toRemove = new LinkedList< CacheKey >( ); + for ( Map.Entry< CacheKey , CacheData > entry : this.cache.entrySet( ) ) { + CacheData data = entry.getValue( ); + data.timeLeft--; + if ( data.timeLeft < 0 ) { + toRemove.add( entry.getKey( ) ); + } + } + + for ( CacheKey key : toRemove ) { + this.cache.remove( key ); + } + } + + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatRegistryBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatRegistryBean.java new file mode 100644 index 0000000..1e0be12 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatRegistryBean.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventRecord; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +public class MessageFormatRegistryBean + implements MessageFormatRegistry +{ + + private final Map< FormatType , MessageFormatter > formatters = new HashMap< FormatType , MessageFormatter >( ); + + + @Override + public void addFormatter( MessageFormatter formatter ) + { + for ( FormatType fmt : formatter.getFormats( ) ) { + if ( this.formatters.containsKey( fmt ) ) { + throw new IllegalArgumentException( "message formatter " + formatter.getClass( ) + " redefines format " + + fmt.toString( ) ); + } + this.formatters.put( fmt , formatter ); + } + } + + + @Override + public MessageFormatter getFormatter( MessageDataRecord contents ) + { + FormatType fmt; + if ( contents.isInternal( ) ) { + EventRecord evt = (EventRecord) contents; + fmt = new FormatType( evt.getType( ) , evt.getSubType( ) ); + } else { + fmt = new FormatType( ); + } + return this.formatters.get( fmt ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatWiringBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatWiringBean.java new file mode 100644 index 0000000..b2abdec --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageFormatWiringBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.msgs; + + +import java.util.Collection; + +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.MessageFormatter; + + + +public class MessageFormatWiringBean + implements BeanPostProcessor , ApplicationContextAware +{ + private final Logger logger = Logger.getLogger( MessageFormatWiringBean.class ); + private ApplicationContext context; + + + @Override + public void setApplicationContext( ApplicationContext applicationContext ) + throws BeansException + { + this.context = applicationContext; + } + + + @Override + public Object postProcessAfterInitialization( Object bean , String beanName ) + throws BeansException + { + if ( bean instanceof MessageFormatRegistry ) { + this.logger.debug( "Wiring message format registry" ); + this.autowire( (MessageFormatRegistry) bean ); + } + return bean; + } + + + @Override + public Object postProcessBeforeInitialization( Object bean , String beanName ) + throws BeansException + { + return bean; + } + + + private void autowire( MessageFormatRegistry bean ) + { + Collection< MessageFormatter > formatters; + formatters = this.context.getBeansOfType( MessageFormatter.class ).values( ); + + for ( MessageFormatter formatter : formatters ) { + this.logger.debug( "Adding formats " + formatter.getFormats( ) ); + bean.addFormatter( formatter ); + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageRecordsDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageRecordsDAOBean.java new file mode 100644 index 0000000..261d44a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageRecordsDAOBean.java @@ -0,0 +1,328 @@ +package com.deepclone.lw.beans.msgs; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.interfaces.msg.MessageRecordsDAO; +import com.deepclone.lw.sqld.msgs.*; + + + +public class MessageRecordsDAOBean + implements MessageRecordsDAO +{ + private static abstract class EventMapperBase< T extends EventRecord > + implements RowMapper< T > + { + protected void mapEvent( ResultSet rs , T event ) + throws SQLException + { + event.setId( rs.getLong( "id" ) ); + event.setType( EventType.valueOf( rs.getString( "evt_type" ) ) ); + event.setSubType( rs.getInt( "evt_subtype" ) ); + event.setTick( rs.getLong( "tick" ) ); + event.setTimestamp( rs.getTimestamp( "real_time" ) ); + } + } + + private static final String sGetTextMessages = "SELECT * FROM msgs.text_messages WHERE id = ANY( ? ::BIGINT[] )"; + private static final String sGetEventTypes = "SELECT event_id , evt_type FROM events.events WHERE event_id = ANY( ? ::BIGINT[] )"; + private static final String sGetEventParts[] = { + "SELECT * FROM events." , "_events_view WHERE id = ANY( ? ::BIGINT[] )" + }; + private static final String sGetQueueLocations = "SELECT * FROM events.queue_locations_view WHERE event_id = ANY( ? ::BIGINT[] )"; + private static final String sGetEventFleets = "SELECT * FROM events.fleet_lists WHERE event_id = ANY( ? ::BIGINT[] )"; + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< TextMessageRecord > mTextMessage; + private final RowMapper< EventTypeRecord > mEventTypes; + private final EventMapperBase< AdminEventRecord > mAdminEvent; + private final EventMapperBase< AllianceEventRecord > mAllianceEvent; + private final EventMapperBase< EmpireEventRecord > mEmpireEvent; + private final EventMapperBase< FleetEventRecord > mFleetEvent; + private final EventMapperBase< PlanetEventRecord > mPlanetEvent; + private final EventMapperBase< QueueEventRecord > mQueueEvent; + private final EventMapperBase< BugEventRecord > mBugEvent; + private final RowMapper< QueueEventLocation > mQueueLocation; + private final RowMapper< FleetEventFleet > mFleetList; + + + public MessageRecordsDAOBean( ) + { + this.mTextMessage = new RowMapper< TextMessageRecord >( ) { + @Override + public TextMessageRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + TextMessageRecord tmr = new TextMessageRecord( ); + tmr.setId( rs.getLong( "id" ) ); + tmr.setTimestamp( rs.getTimestamp( "t" ) ); + tmr.setTick( rs.getLong( "tick" ) ); + tmr.setSubject( rs.getString( "title" ) ); + tmr.setText( rs.getString( "contents" ) ); + return tmr; + } + }; + this.mEventTypes = new RowMapper< EventTypeRecord >( ) { + @Override + public EventTypeRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EventTypeRecord etr = new EventTypeRecord( ); + etr.setId( rs.getLong( "event_id" ) ); + etr.setType( EventType.valueOf( rs.getString( "evt_type" ) ) ); + return etr; + } + }; + this.mAdminEvent = new EventMapperBase< AdminEventRecord >( ) { + @Override + public AdminEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AdminEventRecord event = new AdminEventRecord( ); + this.mapEvent( rs , event ); + event.setWarnings( (Integer) rs.getObject( "n_warnings" ) ); + event.setLocationId( (Integer) rs.getObject( "location_id" ) ); + event.setOldName( rs.getString( "old_name" ) ); + event.setNewName( rs.getString( "new_name" ) ); + return event; + } + }; + this.mAllianceEvent = new EventMapperBase< AllianceEventRecord >( ) { + @Override + public AllianceEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + AllianceEventRecord event = new AllianceEventRecord( ); + this.mapEvent( rs , event ); + event.setAllianceId( (Integer) rs.getObject( "alliance_id" ) ); + event.setAllianceTag( rs.getString( "alliance_tag" ) ); + event.setEmpireId( (Integer) rs.getObject( "empire_id" ) ); + event.setEmpireName( rs.getString( "empire_name" ) ); + event.setReqResult( (Boolean) rs.getObject( "req_result" ) ); + return event; + } + }; + this.mEmpireEvent = new EventMapperBase< EmpireEventRecord >( ) { + @Override + public EmpireEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + EmpireEventRecord event = new EmpireEventRecord( ); + this.mapEvent( rs , event ); + event.setTech( rs.getString( "technology" ) ); + return event; + } + }; + this.mFleetEvent = new EventMapperBase< FleetEventRecord >( ) { + @Override + public FleetEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + FleetEventRecord event = new FleetEventRecord( ); + this.mapEvent( rs , event ); + event.setLocationId( rs.getInt( "location_id" ) ); + event.setLocationName( rs.getString( "location_name" ) ); + event.setX( rs.getInt( "x" ) ); + event.setY( rs.getInt( "y" ) ); + event.setOrbit( rs.getInt( "orbit" ) ); + return event; + } + }; + this.mPlanetEvent = new EventMapperBase< PlanetEventRecord >( ) { + @Override + public PlanetEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + PlanetEventRecord event = new PlanetEventRecord( ); + this.mapEvent( rs , event ); + event.setLocationId( rs.getInt( "location_id" ) ); + event.setLocationName( rs.getString( "location_name" ) ); + event.setX( rs.getInt( "x" ) ); + event.setY( rs.getInt( "y" ) ); + event.setOrbit( rs.getInt( "orbit" ) ); + event.setEmpireId( (Integer) rs.getObject( "empire_id" ) ); + event.setEmpireName( rs.getString( "empire_name" ) ); + event.setBattleId( (Long) rs.getObject( "battle_id" ) ); + return event; + } + }; + this.mQueueEvent = new EventMapperBase< QueueEventRecord >( ) { + @Override + public QueueEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + QueueEventRecord event = new QueueEventRecord( ); + this.mapEvent( rs , event ); + return event; + } + }; + this.mBugEvent = new EventMapperBase< BugEventRecord >( ) { + @Override + public BugEventRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BugEventRecord event = new BugEventRecord( ); + this.mapEvent( rs , event ); + event.setReportId( rs.getLong( "bug_id" ) ); + event.setAdmin( rs.getBoolean( "submitter_admin" ) ); + event.setSubmitter( rs.getString( "submitter_name" ) ); + return event; + } + }; + this.mQueueLocation = new RowMapper< QueueEventLocation >( ) { + @Override + public QueueEventLocation mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + QueueEventLocation loc = new QueueEventLocation( ); + loc.setEventId( rs.getLong( "event_id" ) ); + loc.setLocationId( rs.getInt( "location_id" ) ); + loc.setLocationName( rs.getString( "location_name" ) ); + loc.setX( rs.getInt( "x" ) ); + loc.setY( rs.getInt( "y" ) ); + loc.setOrbit( rs.getInt( "orbit" ) ); + return loc; + } + }; + this.mFleetList = new RowMapper< FleetEventFleet >( ) { + @Override + public FleetEventFleet mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + FleetEventFleet fleet = new FleetEventFleet( ); + fleet.setEventId( rs.getLong( "event_id" ) ); + fleet.setOwnerId( (Integer) rs.getObject( "owner_id" ) ); + fleet.setOwnerName( rs.getString( "owner_name" ) ); + fleet.setFleetName( rs.getString( "fleet_name" ) ); + fleet.setFleetPower( rs.getLong( "fleet_power" ) ); + fleet.setStatus( (Boolean) rs.getObject( "status" ) ); + fleet.setSourceId( (Integer) rs.getObject( "source_id" ) ); + fleet.setSourceName( rs.getString( "source_name" ) ); + return fleet; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + } + + + private String getIdArray( List< Long > ids ) + { + StringBuilder iArray = new StringBuilder( ).append( "{" ); + int i = 0; + int s = ids.size( ); + for ( Long id : ids ) { + iArray.append( id ); + if ( i != s - 1 ) { + iArray.append( "," ); + } + i++; + } + iArray.append( "}" ); + return iArray.toString( ); + } + + + @Override + public List< TextMessageRecord > getTextMessages( List< Long > ids ) + { + return this.dTemplate.query( sGetTextMessages , mTextMessage , this.getIdArray( ids ) ); + } + + + @Override + public List< EventTypeRecord > getEventTypes( List< Long > ids ) + { + return this.dTemplate.query( sGetEventTypes , mEventTypes , this.getIdArray( ids ) ); + } + + + @Override + @SuppressWarnings( "unchecked" ) + public List< EventRecord > getEvents( EventType type , List< Long > ids ) + { + String query = sGetEventParts[ 0 ] + type.toString( ).toLowerCase( ) + sGetEventParts[ 1 ]; + EventMapperBase< ? > mapper; + switch ( type ) { + case ADMIN: + mapper = this.mAdminEvent; + break; + case ALLIANCE: + mapper = this.mAllianceEvent; + break; + case EMPIRE: + mapper = this.mEmpireEvent; + break; + case FLEETS: + mapper = this.mFleetEvent; + break; + case PLANET: + mapper = this.mPlanetEvent; + break; + case QUEUE: + mapper = this.mQueueEvent; + break; + case BUGS: + mapper = this.mBugEvent; + break; + default: + throw new RuntimeException( "unsupported event type " + type ); + } + + String idArray = this.getIdArray( ids ); + List< EventRecord > result = (List< EventRecord >) this.dTemplate.query( query , mapper , idArray ); + + if ( type == EventType.FLEETS ) { + this.getFleetDetails( idArray , result ); + } else if ( type == EventType.QUEUE ) { + this.getQueueDetails( idArray , result ); + } + + return result; + } + + + private void getFleetDetails( String idArray , List< EventRecord > result ) + { + Map< Long , FleetEventRecord > records = new HashMap< Long , FleetEventRecord >( ); + for ( EventRecord e : result ) { + records.put( e.getId( ) , (FleetEventRecord) e ); + } + + List< FleetEventFleet > fleets = this.dTemplate.query( sGetEventFleets , mFleetList , idArray ); + for ( FleetEventFleet fleet : fleets ) { + records.get( fleet.getEventId( ) ).addFleet( fleet ); + } + } + + + private void getQueueDetails( String idArray , List< EventRecord > result ) + { + Map< Long , QueueEventRecord > records = new HashMap< Long , QueueEventRecord >( ); + for ( EventRecord e : result ) { + records.put( e.getId( ) , (QueueEventRecord) e ); + } + + List< QueueEventLocation > locations = this.dTemplate.query( sGetQueueLocations , mQueueLocation , idArray ); + for ( QueueEventLocation l : locations ) { + records.get( l.getEventId( ) ).addLocation( l ); + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageTasksBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageTasksBean.java new file mode 100644 index 0000000..5c07a2a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/MessageTasksBean.java @@ -0,0 +1,130 @@ +package com.deepclone.lw.beans.msgs; + + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; + +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.msg.MessageBoxDAO; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.NotificationsDAO; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class MessageTasksBean + implements InitializingBean , DisposableBean +{ + + private Ticker ticker; + private Logger logger; + private PlatformTransactionManager tManager; + private NotificationsDAO notificationsDao; + private MessageContentCache contents; + private MessageFormatRegistry formats; + private Translator translator; + private Mailer mailer; + private MessageCleanerBean cleaner; + private MessageBoxDAO mboxDao; + + private Runnable notificationsTask; + private Runnable recapsTask; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger; + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager tManager ) + { + this.tManager = tManager; + } + + + @Autowired( required = true ) + public void setNotificationsDao( NotificationsDAO notificationsDao ) + { + this.notificationsDao = notificationsDao; + } + + + @Autowired( required = true ) + public void setContents( MessageContentCache contents ) + { + this.contents = contents; + } + + + @Autowired( required = true ) + public void setFormats( MessageFormatRegistry formats ) + { + this.formats = formats; + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Autowired( required = true ) + public void setMailer( Mailer mailer ) + { + this.mailer = mailer; + } + + + @Autowired( required = true ) + public void setCleaner( MessageCleanerBean cleaner ) + { + this.cleaner = cleaner; + } + + + @Autowired( required = true ) + public void setMboxDao( MessageBoxDAO mboxDao ) + { + this.mboxDao = mboxDao; + } + + + @Override + public void afterPropertiesSet( ) + { + this.notificationsTask = new NotificationsTask( this.logger , this.tManager , this.notificationsDao , + this.contents , this.formats , this.translator , this.mailer , this.cleaner ); + this.ticker.registerTask( Frequency.MEDIUM , "Instant notifications" , this.notificationsTask ); + + this.recapsTask = new RecapitulationTask( this.logger , this.tManager , this.notificationsDao , this.contents , + this.formats , this.translator , this.mailer , this.cleaner , this.mboxDao ); + this.ticker.registerTask( Frequency.LOW , "Message recaps/clean-up" , this.recapsTask ); + } + + + @Override + public void destroy( ) + { + this.notificationsTask = null; + this.recapsTask = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsDAOBean.java new file mode 100644 index 0000000..9665362 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsDAOBean.java @@ -0,0 +1,168 @@ +package com.deepclone.lw.beans.msgs; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.LinkedList; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +import com.deepclone.lw.interfaces.msg.NotificationsDAO; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.NotificationsRecord; +import com.deepclone.lw.utils.StoredProc; + + + +public class NotificationsDAOBean + implements NotificationsDAO +{ + private static final String sGetInstantNotifications = "SELECT * FROM msgs.get_mail_data() WHERE last_unmailed IS NOT NULL"; + private static final String sGetRecapNotifications = "SELECT * FROM msgs.get_mail_data() WHERE last_unrecaped IS NOT NULL"; + + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< NotificationsRecord > mNotifications; + private RowMapper< InboxRecord > mList; + private StoredProc fMarkInstantMessages; + private StoredProc fMarkRecap; + + + public NotificationsDAOBean( ) + { + this.mNotifications = new RowMapper< NotificationsRecord >( ) { + @Override + public NotificationsRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + NotificationsRecord nr = new NotificationsRecord( ); + nr.setId( rs.getInt( "empire" ) ); + nr.setName( rs.getString( "empire_name" ) ); + nr.setLanguage( rs.getString( "language" ) ); + nr.setAddress( rs.getString( "address" ) ); + nr.setOnPrivate( rs.getString( "on_private" ) ); + nr.setOnInternal( rs.getString( "on_internal" ) ); + nr.setOnAlliance( rs.getString( "on_alliance" ) ); + nr.setOnAdmin( rs.getString( "on_admin" ) ); + nr.setLastUnmailed( (Long) rs.getObject( "last_unmailed" ) ); + nr.setLastUnrecaped( (Long) rs.getObject( "last_unrecaped" ) ); + nr.setCanNotify( rs.getBoolean( "can_notify" ) ); + return nr; + } + }; + this.mList = new RowMapper< InboxRecord >( ) { + @Override + public InboxRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + InboxRecord iRec = new InboxRecord( ); + iRec.setId( rs.getLong( "id" ) ); + iRec.setSenderType( rs.getString( "sender_type" ) ); + iRec.setSenderId( (Integer) rs.getObject( "sender_id" ) ); + iRec.setSenderName( rs.getString( "sender_name" ) ); + iRec.setReceiverType( rs.getString( "receiver_type" ) ); + iRec.setReceiverId( rs.getInt( "receiver_id" ) ); + iRec.setReceiverName( rs.getString( "receiver_name" ) ); + iRec.setInternal( rs.getBoolean( "internal_message" ) ); + iRec.setReceived( rs.getTimestamp( "r_time" ) ); + iRec.setContentId( rs.getLong( "content_id" ) ); + return iRec; + } + }; + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fMarkInstantMessages = new StoredProc( dataSource , "msgs" , "mark_instant_notifications" ); + this.fMarkInstantMessages.addParameter( "empire_id" , Types.INTEGER ); + this.fMarkInstantMessages.addParameter( "message_id" , Types.BIGINT ); + this.fMarkInstantMessages.addParameter( "sending" , Types.BOOLEAN ); + + this.fMarkRecap = new StoredProc( dataSource , "msgs" , "mark_recaps" ); + this.fMarkRecap.addParameter( "empire_id" , Types.INTEGER ); + this.fMarkRecap.addParameter( "message_id" , Types.BIGINT ); + } + + + @Override + public boolean isRecapTime( ) + { + String sql = "SELECT msgs.is_recap_time() AS recap"; + return (Boolean) this.dTemplate.queryForMap( sql ).get( "recap" ); + } + + + @Override + public List< NotificationsRecord > getNotificationRecords( boolean instant ) + { + String sql = instant ? sGetInstantNotifications : sGetRecapNotifications; + return this.dTemplate.query( sql , this.mNotifications ); + } + + + @Override + public List< InboxRecord > listMessages( int empireId , long maxId , boolean instant , boolean nPrivate , + boolean nInternal , boolean nAlliance , boolean nAdmin ) + { + List< InboxRecord > result; + if ( nPrivate || nInternal || nAlliance || nAdmin ) { + String sql = "SELECT * FROM msgs.empire_" + ( instant ? "instant" : "recap" ); + sql += " WHERE empire_id = ? AND id <= ?"; + + if ( ! ( nPrivate && nInternal && nAlliance && nAdmin ) ) { + sql += " AND ("; + if ( nPrivate ) { + sql += "( sender_type = 'EMP' AND receiver_type='EMP' )"; + } + if ( nInternal ) { + if ( nPrivate ) { + sql += " OR "; + } + sql += "sender_type = 'INT'"; + } + if ( nAlliance ) { + if ( nPrivate || nInternal ) { + sql += " OR "; + } + sql += "receiver_type = 'ALL'"; + } + if ( nAdmin ) { + if ( nPrivate || nInternal || nAlliance ) { + sql += " OR "; + } + sql += "sender_type = 'ADM'"; + } + sql += ")"; + } + + result = this.dTemplate.query( sql , this.mList , empireId , maxId ); + } else { + result = new LinkedList< InboxRecord >( ); + } + + if ( instant ) { + this.fMarkInstantMessages.execute( empireId , maxId , !result.isEmpty( ) ); + } else { + this.fMarkRecap.execute( empireId , maxId ); + } + + return result; + } + + + @Override + public void cleanupMessages( ) + { + this.dTemplate.getJdbcOperations( ).execute( "SELECT msgs.cleanup( )" ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsTask.java new file mode 100644 index 0000000..59a75e6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/NotificationsTask.java @@ -0,0 +1,97 @@ +package com.deepclone.lw.beans.msgs; + + +import org.springframework.transaction.PlatformTransactionManager; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.NotificationsDAO; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.NotificationsRecord; + + + +class NotificationsTask + extends MailTaskBase +{ + + public NotificationsTask( Logger logger , PlatformTransactionManager tManager , NotificationsDAO notificationsDao , + MessageContentCache contents , MessageFormatRegistry formats , Translator translator , Mailer mailer , + MessageCleanerBean cleaner ) + { + super( logger , tManager , notificationsDao , contents , formats , translator , mailer , cleaner , true ); + } + + + protected void notify( NotificationsRecord notification ) + { + boolean nPrivate = "INSTANT".equals( notification.getOnPrivate( ) ) && notification.isCanNotify( ); + boolean nInternal = "INSTANT".equals( notification.getOnInternal( ) ) && notification.isCanNotify( ); + boolean nAlliance = "INSTANT".equals( notification.getOnAlliance( ) ) && notification.isCanNotify( ); + boolean nAdmin = "INSTANT".equals( notification.getOnAdmin( ) ) && notification.isCanNotify( ); + + MessageData toSend = this.getMessagesToSend( notification.getId( ) , notification.getLastUnmailed( ) , + nPrivate , nInternal , nAlliance , nAdmin ); + if ( toSend.messages.isEmpty( ) ) { + return; + } + + this.logger.log( LogLevel.DEBUG , "Processing messages for empire " + notification.getName( ) ); + this.processMessages( notification , toSend ); + } + + + private void processMessages( NotificationsRecord notification , MessageData toSend ) + { + StringBuilder buffer = new StringBuilder( ); + String lang = notification.getLanguage( ); + + String template = this.translate( "instantNotification" , lang ); + int empireId = notification.getId( ); + for ( InboxRecord record : toSend.messages ) { + Message message = this.readMessage( empireId , lang , record , toSend.data.get( record.getId( ) ) , true ); + this.outputMessage( buffer , template , message ); + } + + MailData mailData; + try { + mailData = this.mailer.createMail( lang , "messageMail" , notification.getAddress( ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + + mailData.setData( "empire" , notification.getName( ) ); + mailData.setData( "messages" , buffer.toString( ) ); + + try { + mailData.queue( ); + } catch ( MailerException e ) { + throw new RuntimeException( e ); + } + } + + + private void outputMessage( StringBuilder buffer , String template , Message message ) + { + String data = template.replace( "${from}" , message.getSender( ) ); + data = data.replace( "${to}" , message.getReceiver( ) ); + if ( message.getType( ) == MessageType.INTERNAL ) { + data = data.replace( "${subject}" , message.getTitle( ) ); + data = data.replace( "${text}" , this.cleaner.removeInternals( message.getContents( ) ) ); + } else { + data = data.replace( "${subject}" , this.cleaner.cleanMessage( message.getTitle( ) ) ); + data = data.replace( "${text}" , this.cleaner.cleanMessage( message.getContents( ) ) ); + } + buffer.append( data ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/RecapitulationTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/RecapitulationTask.java new file mode 100644 index 0000000..fd25a92 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/RecapitulationTask.java @@ -0,0 +1,173 @@ +package com.deepclone.lw.beans.msgs; + + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.mailer.MailData; +import com.deepclone.lw.interfaces.mailer.Mailer; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.msg.MessageBoxDAO; +import com.deepclone.lw.interfaces.msg.MessageContentCache; +import com.deepclone.lw.interfaces.msg.MessageFormatRegistry; +import com.deepclone.lw.interfaces.msg.NotificationsDAO; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.NotificationsRecord; + + + +class RecapitulationTask + extends MailTaskBase +{ + + private MessageBoxDAO mboxDao; + + + public RecapitulationTask( Logger logger , PlatformTransactionManager tManager , NotificationsDAO notificationsDao , + MessageContentCache contents , MessageFormatRegistry formats , Translator translator , Mailer mailer , + MessageCleanerBean cleaner , MessageBoxDAO mbox ) + { + super( logger , tManager , notificationsDao , contents , formats , translator , mailer , cleaner , false ); + this.mboxDao = mbox; + } + + + @Override + public void run( ) + { + if ( this.isTime( ) ) { + super.run( ); + } + + this.cleanup( ); + this.contents.clearCache( ); + this.mboxDao.clearCache( ); + } + + + private void cleanup( ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + notificationsDao.cleanupMessages( ); + } + } ); + } + + + private boolean isTime( ) + { + return this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + return notificationsDao.isRecapTime( ); + } + } ); + } + + + protected void notify( NotificationsRecord notification ) + { + boolean nPrivate = "DAILY_RECAP".equals( notification.getOnPrivate( ) ); + boolean nInternal = "DAILY_RECAP".equals( notification.getOnInternal( ) ); + boolean nAlliance = "DAILY_RECAP".equals( notification.getOnAlliance( ) ); + boolean nAdmin = "DAILY_RECAP".equals( notification.getOnAdmin( ) ); + + MessageData toSend = this.getMessagesToSend( notification.getId( ) , notification.getLastUnrecaped( ) , + nPrivate , nInternal , nAlliance , nAdmin ); + if ( toSend.messages.isEmpty( ) ) { + return; + } + + this.logger.log( LogLevel.DEBUG , "Processing messages for empire " + notification.getName( ) ); + this.processMessages( notification , toSend ); + } + + + private void processMessages( NotificationsRecord notification , MessageData toSend ) + { + String lang = notification.getLanguage( ); + + Map< MessageType , List< Message > > messages = new HashMap< MessageType , List< Message > >( ); + for ( MessageType type : MessageType.values( ) ) { + messages.put( type , new LinkedList< Message >( ) ); + } + + int empireId = notification.getId( ); + for ( InboxRecord record : toSend.messages ) { + Message message = this.readMessage( empireId , lang , record , toSend.data.get( record.getId( ) ) , false ); + messages.get( message.getType( ) ).add( message ); + } + + StringBuilder body = new StringBuilder( ); + String template = this.translate( "recapsMessage" , lang ); + for ( MessageType type : MessageType.values( ) ) { + List< Message > tMessages = messages.get( type ); + if ( tMessages.isEmpty( ) ) { + continue; + } + + StringBuilder typeList = new StringBuilder( ); + typeList.append( this.getTypeTitle( type , lang ) ).append( "\n\n" ); + for ( Message message : tMessages ) { + typeList.append( this.outputMessage( template , message ) ).append( "\n" ); + } + body.append( typeList ).append( "\n" ); + } + + MailData mailData; + try { + mailData = this.mailer.createMail( lang , "recapMail" , notification.getAddress( ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + + mailData.setData( "empire" , notification.getName( ) ); + mailData.setData( "messages" , body.toString( ) ); + + try { + mailData.queue( ); + } catch ( MailerException e ) { + throw new RuntimeException( e ); + } + } + + + private String getTypeTitle( MessageType type , String lang ) + { + String tString = type.toString( ); + return this.translate( "recaps" + tString.substring( 0 , 1 ) + tString.substring( 1 ).toLowerCase( ) , lang ); + } + + + private String outputMessage( String template , Message message ) + { + String data = template.replace( "${from}" , message.getSender( ) ); + if ( message.getType( ) == MessageType.INTERNAL ) { + data = data.replace( "${subject}" , message.getTitle( ) ); + } else { + data = data.replace( "${subject}" , this.cleaner.cleanMessage( message.getTitle( ) ) ); + } + SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss Z" ); + data = data.replace( "${time}" , dateFormat.format( message.getTime( ) ) ); + return data; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AbandonMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AbandonMessageFormatterBean.java new file mode 100644 index 0000000..0e074f9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AbandonMessageFormatterBean.java @@ -0,0 +1,100 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +@Component +public class AbandonMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class AbandonMessageExtractor + extends PlanetMessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public AbandonMessageExtractor( PlanetEventRecord event , String mTitle , String mBody , String mSource ) + { + super(event); + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + return this.mBody.replace( "${location}" , this.getLocation( ) ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${location}" , this.event.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.PLANET , 5 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + PlanetEventRecord event = (PlanetEventRecord) contents; + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtAbandonPlanet" ); + mBody = this.translator.translate( language , "imAbandonPlanet" ); + mSource = this.translator.translate( language , "imSenderEco" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new AbandonMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageExtractor.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageExtractor.java new file mode 100644 index 0000000..69b7bb6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageExtractor.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.sqld.msgs.AdminEventRecord; + + + +public class AdminMessageExtractor + implements MessageExtractor +{ + + private Translator translator; + private String language; + private AdminEventRecord event; + private String eType; + + + private String translate( String what ) + { + try { + return this.translator.translate( this.language , what ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + } + + + public AdminMessageExtractor( AdminEventRecord event , Translator translator , String language ) + { + this.event = event; + this.translator = translator; + this.language = language; + switch ( this.event.getSubType( ) ) { + case 0: + this.eType = "Planet"; + break; + case 1: + this.eType = "Empire"; + break; + case 2: + this.eType = "Alliance"; + break; + default: + throw new RuntimeException( "unsupported event sub-type " + this.event.getSubType( ) ); + } + } + + + @Override + public String getSender( ) + { + return this.translate( "imSenderAdmin" ); + } + + + @Override + public String getSubject( ) + { + String s = this.translate( "imtAdmin" + this.eType ).replace( "${oldName}" , this.event.getOldName( ) ); + if ( this.event.getNewName( ) != null ) { + s = s.replace( "${newName}" , this.event.getNewName( ) ); + } + return s; + } + + + @Override + public String getContents( ) + { + String s = this.translate( "imAdmin" + this.eType ).replace( "${oldName}" , this.event.getOldName( ) ); + if ( this.event.getNewName( ) != null ) { + s = s.replace( "${newName}" , this.event.getNewName( ) ); + } + if ( this.event.getLocationId( ) != null ) { + s = s.replace( "${locationId}" , this.event.getLocationId( ).toString( ) ); + } + if ( this.event.getWarnings( ) != null ) { + s += "\n\n"; + s += this.translate( "imAdminWarning" ).replace( "${warnings}" , this.event.getWarnings( ).toString( ) ); + } + return s; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageFormatterBean.java new file mode 100644 index 0000000..a7be657 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AdminMessageFormatterBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AdminEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class AdminMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ADMIN , 0 ) ); + fmts.add( new FormatType( EventType.ADMIN , 1 ) ); + fmts.add( new FormatType( EventType.ADMIN , 2 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + return new AdminMessageExtractor( (AdminEventRecord) contents , this.translator , language ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceDisbandedMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceDisbandedMessageFormatterBean.java new file mode 100644 index 0000000..33df2ff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceDisbandedMessageFormatterBean.java @@ -0,0 +1,85 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class AllianceDisbandedMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class AllianceDisbandedMessageExtractor + extends AllianceMessageExtractor + { + + public AllianceDisbandedMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + + @Override + public String getContents( ) + { + return this.mBody; + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 5 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtAllianceDisbanded" ); + mBody = this.translator.translate( language , "imAllianceDisbanded" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new AllianceDisbandedMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceMessageExtractor.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceMessageExtractor.java new file mode 100644 index 0000000..e17369b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/AllianceMessageExtractor.java @@ -0,0 +1,32 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; + + + +abstract class AllianceMessageExtractor + implements MessageExtractor +{ + + protected AllianceEventRecord event; + protected String mTitle; + protected String mBody; + + + protected AllianceMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + this.event = event; + this.mTitle = mTitle; + this.mBody = mBody; + } + + + @Override + public String getSender( ) + { + return "[" + event.getAllianceTag( ) + "]"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BattleMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BattleMessageFormatterBean.java new file mode 100644 index 0000000..6d3ed2f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BattleMessageFormatterBean.java @@ -0,0 +1,104 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +@Component +public class BattleMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class BattleMessageExtractor + extends PlanetMessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public BattleMessageExtractor( PlanetEventRecord event , String mTitle , String mBody , String mSource ) + { + super( event ); + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + String locLink = this.getLocation( ); + return this.mBody.replace( "${battleId}" , this.event.getBattleId( ).toString( ) ).replace( "${location}" , + locLink ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${location}" , this.event.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.PLANET , 0 ) ); + fmts.add( new FormatType( EventType.PLANET , 1 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + PlanetEventRecord event = (PlanetEventRecord) contents; + boolean isEnd = ( event.getSubType( ) == 1 ); + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtBattle" + ( isEnd ? "End" : "Start" ) ); + mBody = this.translator.translate( language , "imBattle" + ( isEnd ? "End" : "Start" ) ); + mSource = this.translator.translate( language , "imSenderWar" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new BattleMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BugMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BugMessageFormatterBean.java new file mode 100644 index 0000000..418241b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/BugMessageFormatterBean.java @@ -0,0 +1,103 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.BugEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class BugMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class BugMessageExtractor + implements MessageExtractor + { + private BugEventRecord event; + private String mTitle; + private String mBody; + private String mSource; + + + public BugMessageExtractor( BugEventRecord event , String mTitle , String mBody , String mSource ) + { + this.event = event; + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + String bug = "{{bug:" + this.event.getReportId( ) + "}}"; + return this.mBody.replace( "${bug}" , bug ).replace( "${submitter}" , this.event.getSubmitter( ) ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${id}" , ( (Long) this.event.getReportId( ) ).toString( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.BUGS , 0 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + BugEventRecord event = (BugEventRecord) contents; + String suffix = event.isAdmin( ) ? "Admin" : "Empire"; + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtBugReportUpdate" ); + mBody = this.translator.translate( language , "imBugReportUpdate" + suffix ); + mSource = this.translator.translate( language , "imSenderBugtracker" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new BugMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/DebtMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/DebtMessageFormatterBean.java new file mode 100644 index 0000000..eba3f2e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/DebtMessageFormatterBean.java @@ -0,0 +1,101 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EmpireEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class DebtMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class DebtMessageExtractor + implements MessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public DebtMessageExtractor( String mTitle , String mBody , String mSource ) + { + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + return this.mBody; + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.EMPIRE , 1 ) ); + fmts.add( new FormatType( EventType.EMPIRE , 2 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + EmpireEventRecord event = (EmpireEventRecord) contents; + String type = ( event.getSubType( ) == 1) ? "Start" : "End"; + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtDebt" + type ); + mBody = this.translator.translate( language , "imDebt" + type ); + mSource = this.translator.translate( language , "imSenderEco" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new DebtMessageExtractor( mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/ExternalMessageFormatBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/ExternalMessageFormatBean.java new file mode 100644 index 0000000..ffa9635 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/ExternalMessageFormatBean.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.TextMessageRecord; + + + +@Component +public class ExternalMessageFormatBean + implements MessageFormatter +{ + + static private class ExternalMessageExtractor + implements MessageExtractor + { + private InboxRecord inbox; + private TextMessageRecord message; + + + public ExternalMessageExtractor( InboxRecord inbox , TextMessageRecord message ) + { + this.inbox = inbox; + this.message = message; + } + + + @Override + public String getContents( ) + { + return message.getText( ); + } + + + @Override + public String getSender( ) + { + return inbox.getSenderName( ); + } + + + @Override + public String getSubject( ) + { + return message.getSubject( ); + } + + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + return new ExternalMessageExtractor( envelope , (TextMessageRecord) contents ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageExtractor.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageExtractor.java new file mode 100644 index 0000000..e4f2326 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageExtractor.java @@ -0,0 +1,190 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.sqld.msgs.FleetEventFleet; +import com.deepclone.lw.sqld.msgs.FleetEventRecord; + + + +public class FleetMessageExtractor + implements MessageExtractor +{ + private FleetEventRecord event; + private Translator translator; + private String language; + private String eType; + private int empireId; + + + private String translate( String what ) + { + try { + return this.translator.translate( this.language , what ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + } + + + public FleetMessageExtractor( int empireId , FleetEventRecord event , Translator translator , String language ) + { + this.empireId = empireId; + this.event = event; + this.translator = translator; + this.language = language; + switch ( this.event.getSubType( ) ) { + case 0: + this.eType = "Arrival"; + break; + case 1: + this.eType = "Departure"; + break; + case 2: + this.eType = "Switch"; + break; + case 3: + this.eType = "ELSwitch"; + break; + default: + throw new RuntimeException( "unsupported event sub-type " + this.event.getSubType( ) ); + } + } + + + @Override + public String getSender( ) + { + return this.translate( "imSenderWar" ); + } + + + @Override + public String getSubject( ) + { + return this.translate( "imtFleet" + this.eType ).replace( "${location}" , this.event.getLocationName( ) ); + } + + + @Override + public String getContents( ) + { + String body = this.translate( "imFleet" + this.eType ); + String fList; + if ( this.event.getSubType( ) == 2 ) { + fList = this.makeSwitchList( ); + } else if ( this.event.getSubType( ) == 0 ) { + fList = this.makeArrivalList( ); + } else { + fList = this.makeStandardList( ); + } + String locLink = "{{planet:" + this.event.getLocationId( ) + " " + this.event.getLocationName( ) + "}} ("; + locLink += this.event.getX( ) + "," + this.event.getY( ) + ";" + this.event.getOrbit( ) + ")"; + return body.replace( "${location}" , locLink ) + fList; + } + + + private String makeStandardList( ) + { + String namedOwn = this.translate( "imfOwnNamed" ); + String unnamedOwn = this.translate( "imfOwnUnnamed" ); + String namedFriendly = this.translate( "imfFriendlyNamed" ); + String unnamedFriendly = this.translate( "imfFriendlyUnnamed" ); + String namedHostile = this.translate( "imfHostileNamed" ); + String unnamedHostile = this.translate( "imfHostileUnnamed" ); + StringBuilder sBuilder = new StringBuilder( ); + + for ( FleetEventFleet fleet : this.event.getFleets( ) ) { + sBuilder.append( "\n* " ); + String named , unnamed; + if ( fleet.getOwnerId( ) != null && fleet.getOwnerId( ) == this.empireId ) { + named = namedOwn; + unnamed = unnamedOwn; + } else if ( fleet.getStatus( ) == true ) { + named = namedHostile; + unnamed = unnamedHostile; + } else { + named = namedFriendly; + unnamed = unnamedFriendly; + } + sBuilder.append( this.fleetLine( fleet , named , unnamed ) ); + } + + return sBuilder.toString( ); + } + + + private String makeArrivalList( ) + { + String namedOwn = this.translate( "imfOwnNamed" ); + String unnamedOwn = this.translate( "imfOwnUnnamed" ); + String namedFriendly = this.translate( "imfFriendlyNamed" ); + String unnamedFriendly = this.translate( "imfFriendlyUnnamed" ); + String namedHostile = this.translate( "imfHostileNamed" ); + String unnamedHostile = this.translate( "imfHostileUnnamed" ); + String arrival = this.translate( "imfSource" ); + StringBuilder sBuilder = new StringBuilder( ); + + for ( FleetEventFleet fleet : this.event.getFleets( ) ) { + sBuilder.append( "\n* " ); + String named , unnamed; + if ( fleet.getOwnerId( ) != null && fleet.getOwnerId( ) == this.empireId ) { + named = namedOwn; + unnamed = unnamedOwn; + } else if ( fleet.getStatus( ) == true ) { + named = namedHostile; + unnamed = unnamedHostile; + } else { + named = namedFriendly; + unnamed = unnamedFriendly; + } + sBuilder.append( this.fleetLine( fleet , named , unnamed ) ); + + String source = "{{planet:" + fleet.getSourceId( ) + " " + fleet.getSourceName( ) + "}}"; + sBuilder.append( arrival.replace( "${source}" , source ) ); + } + + return sBuilder.toString( ); + } + + + private String makeSwitchList( ) + { + String named = this.translate( "imfNamed" ); + String unnamed = this.translate( "imfUnnamed" ); + String toAttack = this.translate( "imfSwitchAttack" ); + String toDefence = this.translate( "imfSwitchDefence" ); + StringBuilder sBuilder = new StringBuilder( ); + + for ( FleetEventFleet fleet : this.event.getFleets( ) ) { + sBuilder.append( "\n* " ); + sBuilder.append( this.fleetLine( fleet , named , unnamed ) ); + sBuilder.append( fleet.getStatus( ) ? toAttack : toDefence ); + } + + return sBuilder.toString( ); + } + + + private String fleetLine( FleetEventFleet fleet , String named , String unnamed ) + { + String tmpl; + if ( fleet.getFleetName( ) == null ) { + tmpl = unnamed; + } else { + tmpl = named.replace( "${fleet}" , fleet.getFleetName( ) ); + } + tmpl = tmpl.replace( "${power}" , ( (Long) fleet.getFleetPower( ) ).toString( ) ); + + String empLink; + if ( fleet.getOwnerId( ) == null ) { + empLink = fleet.getOwnerName( ); + } else { + empLink = "{{empire:" + fleet.getOwnerId( ) + " " + fleet.getOwnerName( ) + "}}"; + } + return tmpl.replace( "${owner}" , empLink ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageFormatterBean.java new file mode 100644 index 0000000..ac3fe78 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/FleetMessageFormatterBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FleetEventRecord; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class FleetMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.FLEETS , 0 ) ); + fmts.add( new FormatType( EventType.FLEETS , 1 ) ); + fmts.add( new FormatType( EventType.FLEETS , 2 ) ); + fmts.add( new FormatType( EventType.FLEETS , 3 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + FleetEventRecord event = (FleetEventRecord) contents; + return new FleetMessageExtractor( envelope.getReceiverId( ) , event , this.translator , language ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/KickedMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/KickedMessageFormatterBean.java new file mode 100644 index 0000000..f0bd84a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/KickedMessageFormatterBean.java @@ -0,0 +1,93 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class KickedMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class KickedMessageExtractor + extends AllianceMessageExtractor + { + + public KickedMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${empire}" , this.event.getEmpireName( ) ); + } + + + @Override + public String getContents( ) + { + String empLink; + if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${empire}" , empLink ).replace( "${alliance}" , + "[" + this.event.getAllianceTag( ) + "]" ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 3 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + boolean self = ( event.getEmpireId( ) != null && event.getEmpireId( ) == envelope.getReceiverId( ) ); + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtKicked" + ( self ? "Self" : "" ) ); + mBody = this.translator.translate( language , "imKicked" + ( self ? "Self" : "" ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new KickedMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeadershipMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeadershipMessageFormatterBean.java new file mode 100644 index 0000000..8396b5e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeadershipMessageFormatterBean.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class LeadershipMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class LeadershipMessageExtractor + extends AllianceMessageExtractor + { + + public LeadershipMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + + @Override + public String getContents( ) + { + String empLink; + if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${prevLeader}" , empLink ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 2 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtLeaderChange" ); + mBody = this.translator.translate( language , "imLeaderChange" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new LeadershipMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeftAllianceMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeftAllianceMessageFormatterBean.java new file mode 100644 index 0000000..ae861bf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LeftAllianceMessageFormatterBean.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class LeftAllianceMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class LeftAllianceMessageExtractor + extends AllianceMessageExtractor + { + + public LeftAllianceMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${empire}" , this.event.getEmpireName( ) ); + } + + + @Override + public String getContents( ) + { + String empLink; + if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${empire}" , empLink ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 4 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtLeftAlliance" ); + mBody = this.translator.translate( language , "imLeftAlliance" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new LeftAllianceMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LostPlanetMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LostPlanetMessageFormatterBean.java new file mode 100644 index 0000000..8e63601 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/LostPlanetMessageFormatterBean.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +@Component +public class LostPlanetMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class LostPlanetMessageExtractor + extends PlanetMessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public LostPlanetMessageExtractor( PlanetEventRecord event , String mTitle , String mBody , String mSource ) + { + super( event ); + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + String locLink = this.getLocation( ); + String empLink; + if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${location}" , locLink ).replace( "${taker}" , empLink ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${location}" , this.event.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.PLANET , 4 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + PlanetEventRecord event = (PlanetEventRecord) contents; + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtLostPlanet" ); + mBody = this.translator.translate( language , "imLostPlanet" ); + mSource = this.translator.translate( language , "imSenderWar" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new LostPlanetMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PendingRequestMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PendingRequestMessageFormatterBean.java new file mode 100644 index 0000000..4667d54 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PendingRequestMessageFormatterBean.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class PendingRequestMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class PendingRequestMessageExtractor + extends AllianceMessageExtractor + { + + public PendingRequestMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + + @Override + public String getContents( ) + { + String empLink; + if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${empire}" , empLink ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 0 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtPendingRequest" ); + mBody = this.translator.translate( language , "imPendingRequest" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new PendingRequestMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PlanetMessageExtractor.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PlanetMessageExtractor.java new file mode 100644 index 0000000..eed22fc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/PlanetMessageExtractor.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +abstract class PlanetMessageExtractor + implements MessageExtractor +{ + + protected PlanetEventRecord event; + + + public PlanetMessageExtractor( PlanetEventRecord event ) + { + this.event = event; + } + + + protected String getLocation( ) + { + return "{{planet:" + this.event.getLocationId( ) + " " + this.event.getLocationName( ) + "}} (" + + this.event.getX( ) + "," + this.event.getY( ) + ";" + this.event.getOrbit( ) + ")"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/QueueMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/QueueMessageFormatterBean.java new file mode 100644 index 0000000..2e7a165 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/QueueMessageFormatterBean.java @@ -0,0 +1,168 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.QueueEventLocation; +import com.deepclone.lw.sqld.msgs.QueueEventRecord; + + + +@Component +public class QueueMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static abstract class QMEBase + implements MessageExtractor + { + + public String formatLocation( QueueEventLocation location ) + { + return "{{planet:" + location.getLocationId( ) + " " + location.getLocationName( ) + "}} (" + + location.getX( ) + "," + location.getY( ) + ";" + location.getOrbit( ) + ")"; + } + } + + private static class QueuesMessageExtractor + extends QMEBase + { + private QueueEventRecord event; + private String mTitle; + private String mBody; + private String mSource; + + + public QueuesMessageExtractor( QueueEventRecord event , String mTitle , String mBody , String mSource ) + { + this.event = event; + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + StringBuilder sb = new StringBuilder( ).append( this.mBody ); + for ( QueueEventLocation location : this.event.getLocations( ) ) { + sb.append( "\n* " ).append( this.formatLocation( location ) ); + } + return sb.toString( ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + } + + private static class QueueMessageExtractor + extends QMEBase + { + private QueueEventRecord event; + private String mTitle; + private String mBody; + private String mSource; + + + public QueueMessageExtractor( QueueEventRecord event , String mTitle , String mBody , String mSource ) + { + this.event = event; + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + QueueEventLocation location = this.event.getLocations( ).get( 0 ); + return this.mBody.replace( "${location}" , this.formatLocation( location ) ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + QueueEventLocation location = this.event.getLocations( ).get( 0 ); + return this.mTitle.replace( "${location}" , location.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.QUEUE , 0 ) ); + fmts.add( new FormatType( EventType.QUEUE , 1 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + QueueEventRecord event = (QueueEventRecord) contents; + boolean isCiv = ( event.getSubType( ) == 0 ); + boolean multi = ( event.getLocations( ).size( ) > 1 ); + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtEmpty" + ( isCiv ? "Civ" : "Mil" ) + "Queue" + + ( multi ? "s" : "" ) ); + mBody = this.translator.translate( language , "imEmpty" + ( isCiv ? "Civ" : "Mil" ) + "Queue" + + ( multi ? "s" : "" ) ); + mSource = this.translator.translate( language , "imSender" + ( isCiv ? "Eco" : "War" ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + + if ( multi ) { + return new QueuesMessageExtractor( event , mTitle , mBody , mSource ); + } + return new QueueMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/RequestResultMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/RequestResultMessageFormatterBean.java new file mode 100644 index 0000000..960ae2e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/RequestResultMessageFormatterBean.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.AllianceEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class RequestResultMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class PendingRequestMessageExtractor + extends AllianceMessageExtractor + { + + public PendingRequestMessageExtractor( AllianceEventRecord event , String mTitle , String mBody ) + { + super( event , mTitle , mBody ); + } + + + @Override + public String getSubject( ) + { + return this.mTitle; + } + + + @Override + public String getContents( ) + { + return this.mBody.replace( "${alliance}" , "[" + this.event.getAllianceTag( ) + "]" ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.ALLIANCE , 1 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + AllianceEventRecord event = (AllianceEventRecord) contents; + String type = event.getReqResult( ) ? "Accepted" : "Rejected"; + String mTitle , mBody; + try { + mTitle = this.translator.translate( language , "imtRequest" + type ); + mBody = this.translator.translate( language , "imRequest" + type ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new PendingRequestMessageExtractor( event , mTitle , mBody ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/StrikeMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/StrikeMessageFormatterBean.java new file mode 100644 index 0000000..8b74e96 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/StrikeMessageFormatterBean.java @@ -0,0 +1,102 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +@Component +public class StrikeMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class StrikeMessageExtractor + extends PlanetMessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public StrikeMessageExtractor( PlanetEventRecord event , String mTitle , String mBody , String mSource ) + { + super( event ); + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + return this.mBody.replace( "${location}" , this.getLocation( ) ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${location}" , this.event.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.PLANET , 2 ) ); + fmts.add( new FormatType( EventType.PLANET , 3 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + PlanetEventRecord event = (PlanetEventRecord) contents; + boolean isEnd = ( event.getSubType( ) == 3 ); + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtStrike" + ( isEnd ? "End" : "Start" ) ); + mBody = this.translator.translate( language , "imStrike" + ( isEnd ? "End" : "Start" ) ); + mSource = this.translator.translate( language , "imSenderSec" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new StrikeMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TakenPlanetMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TakenPlanetMessageFormatterBean.java new file mode 100644 index 0000000..58c3845 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TakenPlanetMessageFormatterBean.java @@ -0,0 +1,110 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; +import com.deepclone.lw.sqld.msgs.PlanetEventRecord; + + + +@Component +public class TakenPlanetMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class TakenPlanetMessageExtractor + extends PlanetMessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + + + public TakenPlanetMessageExtractor( PlanetEventRecord event , String mTitle , String mBody , String mSource ) + { + super( event ); + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + } + + + @Override + public String getContents( ) + { + String locLink = this.getLocation( ); + String empLink; + if ( this.event.getEmpireName( ) == null ) { + empLink = ""; + } else if ( this.event.getEmpireId( ) == null ) { + empLink = this.event.getEmpireName( ); + } else { + empLink = "{{empire:" + this.event.getEmpireId( ) + " " + this.event.getEmpireName( ) + "}}"; + } + return this.mBody.replace( "${location}" , locLink ).replace( "${owner}" , empLink ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${location}" , this.event.getLocationName( ) ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.PLANET , 6 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + PlanetEventRecord event = (PlanetEventRecord) contents; + boolean neutral = ( event.getEmpireName( ) == null ); + String mTitle , mBody , mSource; + try { + mTitle = this.translator.translate( language , "imtTakePlanet" ); + mBody = this.translator.translate( language , "imTakePlanet" + ( neutral ? "Neutral" : "" ) ); + mSource = this.translator.translate( language , "imSenderWar" ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new TakenPlanetMessageExtractor( event , mTitle , mBody , mSource ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TechMessageFormatterBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TechMessageFormatterBean.java new file mode 100644 index 0000000..d670026 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/msgs/fmt/TechMessageFormatterBean.java @@ -0,0 +1,103 @@ +package com.deepclone.lw.beans.msgs.fmt; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.msg.MessageExtractor; +import com.deepclone.lw.interfaces.msg.MessageFormatter; +import com.deepclone.lw.sqld.msgs.EmpireEventRecord; +import com.deepclone.lw.sqld.msgs.EventType; +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +@Component +public class TechMessageFormatterBean + implements MessageFormatter +{ + + private Translator translator; + + private static class TechMessageExtractor + implements MessageExtractor + { + private String mTitle; + private String mBody; + private String mSource; + private String techName; + + + public TechMessageExtractor( String mTitle , String mBody , String mSource , + String techName ) + { + this.mTitle = mTitle; + this.mBody = mBody; + this.mSource = mSource; + this.techName = techName; + } + + + @Override + public String getContents( ) + { + return this.mBody.replace( "${tech}" , this.techName ); + } + + + @Override + public String getSender( ) + { + return this.mSource; + } + + + @Override + public String getSubject( ) + { + return this.mTitle.replace( "${tech}" , this.techName ); + } + + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Set< FormatType > getFormats( ) + { + Set< FormatType > fmts = new HashSet< FormatType >( ); + fmts.add( new FormatType( EventType.EMPIRE , 0 ) ); + return fmts; + } + + + @Override + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ) + { + EmpireEventRecord event = (EmpireEventRecord) contents; + String mTitle , mBody , mSource , techName; + try { + mTitle = this.translator.translate( language , "imtTechAvailable" ); + mBody = this.translator.translate( language , "imTechAvailable" ); + mSource = this.translator.translate( language , "imSenderSci" ); + techName = this.translator.translate( language , event.getTech( ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return new TechMessageExtractor( mTitle , mBody , mSource , techName ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/GameUpdateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/GameUpdateBean.java new file mode 100644 index 0000000..3973457 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/GameUpdateBean.java @@ -0,0 +1,138 @@ +package com.deepclone.lw.beans.updates; + + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.game.UpdatesDAO; +import com.deepclone.lw.interfaces.sys.MaintenanceStatusException; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.interfaces.sys.TickStatusException; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class GameUpdateBean + implements InitializingBean , Runnable +{ + private Ticker ticker; + private SystemStatus systemStatus; + private SystemLogger logger; + + private TransactionTemplate tTemplate; + private UpdatesDAO updatesDao; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "GameUpdate" ); + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + } + + + @Autowired( required = true ) + public void setUpdatesDAO( UpdatesDAO updatesDao ) + { + this.updatesDao = updatesDao; + } + + + @Override + public void afterPropertiesSet( ) + { + try { + this.endPreviousTick( ); + } catch ( MaintenanceStatusException e ) { + // Do nothing + } + this.ticker.registerTask( Frequency.MINUTE , "Game update" , this ); + } + + + @Override + public void run( ) + { + // Attempt to end the previous tick, if e.g. maintenance mode was initiated while it was + // being processed + try { + this.endPreviousTick( ); + } catch ( MaintenanceStatusException e1 ) { + return; + } + + // Initiate next tick + long tickId; + try { + tickId = this.systemStatus.startTick( ); + } catch ( TickStatusException e ) { + throw new RuntimeException( "tick initiated while previous tick still being processed" , e ); + } catch ( MaintenanceStatusException e ) { + return; + } + + // Execute tick + this.logger.log( LogLevel.DEBUG , "Tick " + tickId + " started" ).flush( ); + this.executeTick( tickId ); + } + + + private void endPreviousTick( ) + throws MaintenanceStatusException + { + Long currentTick = this.systemStatus.checkStuckTick( ); + if ( currentTick == null ) { + return; + } + + this.logger.log( LogLevel.WARNING , "Tick " + currentTick + " restarted" ).flush( ); + this.executeTick( currentTick.longValue( ) ); + } + + + private void executeTick( final long tickId ) + { + boolean hasMore; + do { + hasMore = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + return updatesDao.processUpdates( tickId ); + } + + } ); + } while ( hasMore ); + this.logger.log( LogLevel.TRACE , "Tick " + tickId + " completed" ).flush( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/UpdatesDAOBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/UpdatesDAOBean.java new file mode 100644 index 0000000..77a1bbd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/java/com/deepclone/lw/beans/updates/UpdatesDAOBean.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.beans.updates; + + +import java.sql.Types; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.SqlOutParameter; +import org.springframework.jdbc.core.SqlParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; + +import com.deepclone.lw.interfaces.game.UpdatesDAO; + + + +public class UpdatesDAOBean + implements UpdatesDAO +{ + + private SimpleJdbcCall process; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.process = new SimpleJdbcCall( dataSource ); + this.process.withCatalogName( "sys" ).withFunctionName( "process_updates" ); + this.process.withoutProcedureColumnMetaDataAccess( ); + this.process.addDeclaredParameter( new SqlParameter( "tick_id" , Types.BIGINT ) ); + this.process.addDeclaredParameter( new SqlOutParameter( "has_more" , Types.BOOLEAN ) ); + } + + + @Override + public boolean processUpdates( long tickId ) + { + Map< String , Object > m = this.process.execute( tickId ); + return (Boolean) m.get( "has_more" ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple-beans.xml new file mode 100644 index 0000000..ffd1068 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple-beans.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-dao-bean.xml new file mode 100644 index 0000000..3fbfa96 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-dao-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-management-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-management-bean.xml new file mode 100644 index 0000000..8e094be --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/alliance-management-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/battle-data-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/battle-data-beans.xml new file mode 100644 index 0000000..fcbb99c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/battle-data-beans.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-dao-bean.xml new file mode 100644 index 0000000..e3c77db --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-management-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-management-bean.xml new file mode 100644 index 0000000..db80a8e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/empire-management-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleet-management-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleet-management-bean.xml new file mode 100644 index 0000000..6d821bf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleet-management-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleets-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleets-dao-bean.xml new file mode 100644 index 0000000..42dbbc8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/fleets-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/game-update-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/game-update-bean.xml new file mode 100644 index 0000000..54534ff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/game-update-bean.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/map-viewer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/map-viewer-bean.xml new file mode 100644 index 0000000..189fb3d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/map-viewer-bean.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/message-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/message-beans.xml new file mode 100644 index 0000000..7381a9a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/message-beans.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planet-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planet-dao-bean.xml new file mode 100644 index 0000000..c2054b8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planet-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planets-management-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planets-management-bean.xml new file mode 100644 index 0000000..893f8fd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/planets-management-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-dao-bean.xml new file mode 100644 index 0000000..18928ba --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-generator-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-generator-bean.xml new file mode 100644 index 0000000..759061f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/universe-generator-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/updates-dao-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/updates-dao-bean.xml new file mode 100644 index 0000000..eb24044 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-simple/src/main/resources/configuration/simple/updates-dao-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.project new file mode 100644 index 0000000..8351fb8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-system + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..35c2ee3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Tue Feb 23 12:51:19 CET 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..b7fd985 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Tue Feb 23 12:51:19 CET 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/pom.xml new file mode 100644 index 0000000..47dfd4f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-system + 5.99.1 + Legacy Worlds system management + This module regroups system management beans such as the constants manager. + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsAdministrationImpl.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsAdministrationImpl.java new file mode 100644 index 0000000..0529a12 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsAdministrationImpl.java @@ -0,0 +1,106 @@ +package com.deepclone.lw.beans.sys; + + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsAdministration; +import com.deepclone.lw.interfaces.sys.InvalidConstantValue; +import com.deepclone.lw.interfaces.sys.UnknownConstantError; +import com.deepclone.lw.sqld.sys.Constant; + + + +/** + * The constants administration implementation mostly serves as a session-specific proxy for the + * share {@link ConstantsData} instance. + * + * @author tseeker + */ +class ConstantsAdministrationImpl + implements ConstantsAdministration +{ + /** Shared data storage instance */ + private ConstantsData data; + + private int admin; + + + /** + * Copies the required references. + * + * @param data + * shared data storage instance + * @param logger + * session-specific logger + */ + ConstantsAdministrationImpl( ConstantsData data , int admin ) + { + this.data = data; + this.admin = admin; + } + + + /* Documented in ConstantsAdministration interface */ + @Override + public Set< String > getCategories( ) + { + return this.data.getCategories( ); + } + + + /* Documented in ConstantsAdministration interface */ + @Override + public Collection< ConstantDefinition > getConstants( String category ) + { + List< Constant > constants = this.data.getCategory( category ); + List< ConstantDefinition > defs = new LinkedList< ConstantDefinition >( ); + if ( constants == null ) { + return defs; + } + + // Convert data to immutable records + for ( Constant constant : constants ) { + ConstantDefinition def; + if ( constant.getMaxValue( ) == null && constant.getMinValue( ) == null ) { + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , constant + .getValue( ) ); + } else if ( constant.getMaxValue( ) == null || constant.getMinValue( ) == null ) { + boolean isMin = ( constant.getMaxValue( ) == null ); + Double val = isMin ? constant.getMinValue( ) : constant.getMaxValue( ); + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , constant + .getValue( ) , val , isMin ); + } else { + if ( constant.getMaxValue( ) == null && constant.getMinValue( ) == null ) { + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , + constant.getValue( ) ); + } else if ( constant.getMaxValue( ) == null ) { + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , + constant.getValue( ) , constant.getMinValue( ) , true ); + } else if ( constant.getMinValue( ) == null ) { + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , + constant.getValue( ) , constant.getMaxValue( ) , false ); + } else { + def = new ConstantDefinition( constant.getName( ) , category , constant.getDescription( ) , constant + .getValue( ) , constant.getMinValue( ) , constant.getMaxValue( ) ); + } + } + defs.add( def ); + } + + return defs; + } + + + /* Documented in ConstantsAdministration interface */ + @Override + public void setConstant( String name , Double value ) + throws UnknownConstantError , InvalidConstantValue + { + this.data.setValue( name , value , this.admin ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsData.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsData.java new file mode 100644 index 0000000..4096acd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsData.java @@ -0,0 +1,630 @@ +package com.deepclone.lw.beans.sys; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.SqlParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsUser; +import com.deepclone.lw.interfaces.sys.InvalidConstantValue; +import com.deepclone.lw.interfaces.sys.UnknownConstantError; +import com.deepclone.lw.sqld.sys.Constant; +import com.deepclone.lw.utils.StoredProc; + + + +/** + * This class defines the shared data structures used by both the constants manager bean and its + * administrative session instances. It also encapsulates all of the code used by both. + * + * @author tseeker + */ +class ConstantsData +{ + /** Database interface */ + private SimpleJdbcTemplate dTemplate; + + /** Transaction manager interface */ + private TransactionTemplate tTemplate; + + /** System logger instance for the ConstantsManager component */ + private SystemLogger sysLog; + + /** All registered constants, by name */ + private Map< String , Constant > registeredConstants; + + /** Constants users that have received their initial notification */ + private Set< ConstantsUser > notifiedUsers = new HashSet< ConstantsUser >( ); + + /** Constants needed by each user */ + private Map< ConstantsUser , Set< String >> userConstants = new HashMap< ConstantsUser , Set< String > >( ); + + /** Users listening to each constant */ + private Map< String , Set< ConstantsUser >> constantUsers = new HashMap< String , Set< ConstantsUser > >( ); + + /** Constants by category */ + private Map< String , List< Constant >> categories; + + private SimpleJdbcCall uocConstantNoBounds; + private SimpleJdbcCall uocConstantSingleBound; + private SimpleJdbcCall uocConstantTwoBounds; + private StoredProc fSetConstant; + + + /** + * Initialises the various references, creates the system logger used by the instance, then + * loads all existing constants. + * + * @param dataSource + * database interface + * @param tTemplate + * transaction manager interface + * @param logger + * logger bean interface + */ + ConstantsData( DataSource dataSource , TransactionTemplate tTemplate , Logger logger ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.uocConstantNoBounds = new SimpleJdbcCall( dataSource ); + this.uocConstantNoBounds.withCatalogName( "sys" ).withFunctionName( "uoc_constant" ); + this.uocConstantNoBounds.withoutProcedureColumnMetaDataAccess( ); + this.uocConstantNoBounds.addDeclaredParameter( new SqlParameter( "cname" , Types.VARCHAR ) ); + this.uocConstantNoBounds.addDeclaredParameter( new SqlParameter( "cdesc" , Types.VARCHAR ) ); + this.uocConstantNoBounds.addDeclaredParameter( new SqlParameter( "catname" , Types.VARCHAR ) ); + this.uocConstantNoBounds.addDeclaredParameter( new SqlParameter( "value" , Types.REAL ) ); + + this.uocConstantSingleBound = new SimpleJdbcCall( dataSource ); + this.uocConstantSingleBound.withCatalogName( "sys" ).withFunctionName( "uoc_constant" ); + this.uocConstantSingleBound.withoutProcedureColumnMetaDataAccess( ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "cname" , Types.VARCHAR ) ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "cdesc" , Types.VARCHAR ) ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "catname" , Types.VARCHAR ) ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "value" , Types.REAL ) ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "boundary" , Types.REAL ) ); + this.uocConstantSingleBound.addDeclaredParameter( new SqlParameter( "is_min" , Types.BOOLEAN ) ); + + this.uocConstantTwoBounds = new SimpleJdbcCall( dataSource ); + this.uocConstantTwoBounds.withCatalogName( "sys" ).withFunctionName( "uoc_constant" ); + this.uocConstantTwoBounds.withoutProcedureColumnMetaDataAccess( ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "cname" , Types.VARCHAR ) ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "cdesc" , Types.VARCHAR ) ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "catname" , Types.VARCHAR ) ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "value" , Types.REAL ) ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "min" , Types.REAL ) ); + this.uocConstantTwoBounds.addDeclaredParameter( new SqlParameter( "max" , Types.REAL ) ); + + this.fSetConstant = new StoredProc( dataSource , "sys" , "set_constant" ); + this.fSetConstant.addParameter( "cname" , Types.VARCHAR ); + this.fSetConstant.addParameter( "value" , Types.REAL ); + this.fSetConstant.addParameter( "admin" , Types.INTEGER ); + + this.tTemplate = tTemplate; + this.sysLog = logger.getSystemLogger( "ConstantsManager" ); + + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + loadConstants( ); + } + + } ); + } + + + private void loadConstants( ) + { + String sql = "SELECT category , name , description , value , min , max FROM sys.constants_view"; + RowMapper< Constant > mapper = new RowMapper< Constant >( ) { + + @Override + public Constant mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Constant c = new Constant( ); + c.setCategory( rs.getString( "category" ) ); + c.setName( rs.getString( "name" ) ); + c.setDescription( rs.getString( "description" ) ); + c.setValue( rs.getDouble( "value" ) ); + c.setMinValue( (Float) rs.getObject( "min" ) ); + c.setMaxValue( (Float) rs.getObject( "max" ) ); + return c; + } + + }; + + this.registeredConstants = new HashMap< String , Constant >( ); + this.categories = new HashMap< String , List< Constant > >( ); + for ( Constant cnst : this.dTemplate.query( sql , mapper ) ) { + this.registeredConstants.put( cnst.getName( ) , cnst ); + + List< Constant > category = this.categories.get( cnst.getCategory( ) ); + if ( category == null ) { + category = new LinkedList< Constant >( ); + this.categories.put( cnst.getCategory( ) , category ); + } + category.add( cnst ); + } + } + + + private void updateConstants( List< ConstantDefinition > toUpdate ) + { + for ( ConstantDefinition cDef : toUpdate ) { + if ( cDef.maxValue == null && cDef.minValue == null ) { + this.uocConstantNoBounds.execute( cDef.name , cDef.description , cDef.category , cDef.defaultValue ); + } else if ( cDef.maxValue == null ) { + this.uocConstantSingleBound.execute( cDef.name , cDef.description , cDef.category , cDef.defaultValue , + cDef.minValue , true ); + } else if ( cDef.minValue == null ) { + this.uocConstantSingleBound.execute( cDef.name , cDef.description , cDef.category , cDef.defaultValue , + cDef.maxValue , false ); + } else { + this.uocConstantTwoBounds.execute( cDef.name , cDef.description , cDef.category , cDef.defaultValue , + cDef.minValue , cDef.maxValue ); + } + } + } + + + /** + * Checks that the descriptive parts of a constant data instance match the corresponding fields + * in a constant definition instance. + * + * @param constant + * the constant data instance + * @param def + * the definition + * @return true if the descriptive parts are a match + */ + private boolean compareConstantDescription( Constant constant , ConstantDefinition def ) + { + return constant.getCategory( ).equals( def.category ) && constant.getDescription( ).equals( def.description ); + } + + + /** + * Checks that the bounds defined in a constant data instance are identical to the bounds from a + * constant definition. + * + * @param constant + * the constant data instance + * @param def + * the definition + * @return true if the bounds match + */ + private boolean compareConstantBounds( Constant constant , ConstantDefinition def ) + { + return constant.getMinValue( ) == def.minValue && constant.getMaxValue( ) == def.maxValue; + } + + + /** + * Updates a constant's value after bounds changed. + * + * This method, called when a constant data instance's bounds have been changed, verifies that + * the constant's current value matches the new bounds and modifies it if that is required. + * + * @param constant + * the constant data instance + * @param def + * the definition + * @return true if the value was updated + */ + private boolean updateValue( Constant constant , ConstantDefinition def ) + { + if ( def.minValue != null && def.minValue > constant.getValue( ) ) { + constant.setValue( def.minValue ); + return true; + } else if ( def.maxValue != null && def.maxValue < constant.getValue( ) ) { + constant.setValue( def.maxValue ); + return true; + } + return false; + } + + + /** + * Notifies constant users that a specific constant value has been modified. + * + * @param changed + * the constant's name + * + * @see #notify(Set) + */ + private void notify( String changed ) + { + Set< String > temp = new HashSet< String >( ); + temp.add( changed ); + this.notify( temp ); + } + + + /** + * Notifies constant users that a set of constants has changed. + * + * Users of each specified constant are identified, and separated in two groups: users that have + * not received their initial notification and for which initial notification must be attempted, + * and already initialised users which will only receive updates on constants that actually + * changed. + * + * @param changed + * the names of the constants that have been changed. + * + * @see #notifyUpdate(ConstantsUser, Set) + * @see #attemptFirstNotification(ConstantsUser) + */ + private void notify( Set< String > changed ) + { + Map< ConstantsUser , Set< String >> notifyChange = new HashMap< ConstantsUser , Set< String > >( ); + Set< ConstantsUser > firstNotification = new HashSet< ConstantsUser >( ); + + // Build a map of users <-> notifications and a set of first notifications to attempt + for ( String ccn : changed ) { + Set< ConstantsUser > users = this.constantUsers.get( ccn ); + if ( users == null ) { + continue; + } + + for ( ConstantsUser user : users ) { + if ( this.notifiedUsers.contains( user ) ) { + Set< String > userChange = notifyChange.get( user ); + if ( userChange == null ) { + userChange = new HashSet< String >( ); + notifyChange.put( user , userChange ); + } + userChange.add( ccn ); + } else { + firstNotification.add( user ); + } + } + } + + // Attempt first notifications + for ( ConstantsUser user : firstNotification ) { + this.attemptFirstNotification( user ); + } + + // Send updates to the others + for ( ConstantsUser user : notifyChange.keySet( ) ) { + this.notifyUpdate( user , notifyChange.get( user ) ); + } + } + + + /** + * Notifies a constant user of changes. + * + * This method retrieves the values of the listed constants, then notifies the specified user + * that they have changed. If an exception occurs in the user's notification method, an error is + * written to the server's log. + * + * @param user + * the constants user instance. + * @param changed + * the names of the constants for which a notification is to be sent. + */ + private void notifyUpdate( ConstantsUser user , Set< String > changed ) + { + Map< String , Double > values = new HashMap< String , Double >( ); + + // Find updated values + for ( String cn : changed ) { + values.put( cn , this.registeredConstants.get( cn ).getValue( ) ); + } + + // Send notification + try { + user.setConstants( false , values ); + } catch ( Throwable t ) { + this.sysLog.log( LogLevel.ERROR , "updating constant values caused an exception" , t ).flush( ); + } + } + + + /** + * Attempts initial notification of constants values to a constants user. + * + * This method is called when constants registered to a not-yet-initialised constants user + * change. It attempts to retrieve the required values, returning directly if a constant is + * missing. If all values exist, the initial notification is sent. Should an exception occur, it + * is logged as an error and the method ends; otherwise the user is added to the set of + * initialised users. + * + * @param user + * the constants user to notify + */ + private void attemptFirstNotification( ConstantsUser user ) + { + Map< String , Double > values = new HashMap< String , Double >( ); + + // Try to find all required values + for ( String cn : this.userConstants.get( user ) ) { + Constant cst = this.registeredConstants.get( cn ); + if ( cst == null ) { + return; + } + values.put( cn , cst.getValue( ) ); + } + + // Send initial notification + try { + user.setConstants( true , values ); + } catch ( Throwable t ) { + this.sysLog.log( LogLevel.ERROR , "registering initial constant values caused an exception" , t ).flush( ); + return; + } + this.notifiedUsers.add( user ); + } + + + /** + * Updates the list of categories from the list of constants. + * + * This method updates the list of categories by going through all known constants, creating an + * entry in the categories map for each category and associating it with the list of constants + * it contains. + */ + private void updateCategories( ) + { + if ( this.categories != null ) { + return; + } + this.categories = new HashMap< String , List< Constant > >( ); + for ( Constant c : this.registeredConstants.values( ) ) { + String cat = c.getCategory( ); + List< Constant > cContents; + cContents = this.categories.get( cat ); + if ( cContents == null ) { + cContents = new LinkedList< Constant >( ); + this.categories.put( cat , cContents ); + } + cContents.add( c ); + } + } + + + /** + * Constants registration method. + * + * This method is responsible for updating the in-base constants data when new definitions are + * registered. It will add new constants or update existing one. Finally, if some of the updated + * constants are used by any constants user instance, it will send update notifications. + * + * @param definitions + * the constants to register + */ + synchronized void registerConstants( Collection< ConstantDefinition > definitions ) + { + Set< String > toNotify = new HashSet< String >( ); + final List< ConstantDefinition > toUpdate = new LinkedList< ConstantDefinition >( ); + + for ( ConstantDefinition def : definitions ) { + // Handle new definitions + Constant constant = this.registeredConstants.get( def.name ); + if ( constant == null ) { + toUpdate.add( def ); + toNotify.add( def.name ); + this.sysLog.log( LogLevel.DEBUG , "registering constant " + def.name ); + continue; + } + + boolean sameDescription = this.compareConstantDescription( constant , def ); + boolean sameBounds = this.compareConstantBounds( constant , def ); + if ( sameDescription && sameBounds ) { + continue; + } + + // Make sure the value is correct if the bounds have been changed + if ( !sameBounds && this.updateValue( constant , def ) ) { + toNotify.add( def.name ); + } + + toUpdate.add( def ); + this.sysLog.log( LogLevel.DEBUG , "updating definition of constant " + def.name ); + } + + // Apply updates and notify users + if ( !toUpdate.isEmpty( ) ) { + this.sysLog.flush( ); + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + updateConstants( toUpdate ); + loadConstants( ); + } + + } ); + + if ( !toNotify.isEmpty( ) ) { + this.notify( toNotify ); + } + } + } + + + /** + * Constants user registration + * + * This method registers (or re-registers) a constants user, indicating the constants used by + * the instance and for which update notifications should be sent. Once the user has been + * registered, an attempt at sending the initial notification is made. + * + * @param user + * the constants user to register + * @param constants + * the names of the constants for which notifications are required + */ + synchronized void registerUser( ConstantsUser user , Set< String > constants ) + { + // If this user was already registered, unregister it + if ( this.userConstants.containsKey( user ) ) { + this.unregisterUser( user ); + } + + // Add user <-> constant maps + this.userConstants.put( user , new HashSet< String >( constants ) ); + for ( String cn : constants ) { + Set< ConstantsUser > users; + users = this.constantUsers.get( cn ); + if ( users == null ) { + users = new HashSet< ConstantsUser >( ); + this.constantUsers.put( cn , users ); + } + users.add( user ); + } + + // Try sending the user its initial notification + this.attemptFirstNotification( user ); + } + + + /** + * Unregisters a constants user. + * + * This method removes a constants user from the manager, preventing further notifications to be + * sent. + * + * @param user + * the constants user to unregister + */ + synchronized void unregisterUser( ConstantsUser user ) + { + Set< String > constants = this.userConstants.get( user ); + if ( constants == null ) { + return; + } + + this.userConstants.remove( user ); + this.notifiedUsers.remove( user ); + for ( String constant : constants ) { + Set< ConstantsUser > users = this.constantUsers.get( constant ); + users.remove( user ); + if ( users.isEmpty( ) ) { + this.constantUsers.remove( constant ); + } + } + } + + + /** + * Gets the names of the constant categories. + * + * This method will make sure the constant categories map is up-to-date, then return a copy of + * its keys. + * + * @return the names of all constant categories + */ + synchronized Set< String > getCategories( ) + { + this.updateCategories( ); + return new HashSet< String >( this.categories.keySet( ) ); + } + + + /** + * Accesses the constant data instances from a category. + * + * This method will make sure the constant categories map is up-to-date, then return a copy of + * the list corresponding to the specified category. If the category is not present in the map, + * null will be returned. + * + * @param cat + * the category's name + * @return the list of constant data instances, or null if the category is + * undefined + */ + synchronized List< Constant > getCategory( String cat ) + { + this.updateCategories( ); + List< Constant > listCst = this.categories.get( cat ); + if ( listCst != null ) { + return new LinkedList< Constant >( listCst ); + } + return null; + } + + + /** + * Modifies the value of a single constant. + * + * This method is called by administrative sessions in order to modify a single constant. It + * checks that the constant exists and that its new value is valid, then updates the database + * entry. Once this is done, it notifies the constant's users and returns the previous value. + * + * @param name + * the name of the constant to modify + * @param value + * the constant's new value + * @return the constant's previous value + * @throws UnknownConstantError + * if the specified constant does not exist + * @throws InvalidConstantValue + * if the specified value is out of bounds + */ + synchronized Double setValue( final String name , final Double value , final int admin ) + throws UnknownConstantError , InvalidConstantValue + { + // Check name + Constant c = this.registeredConstants.get( name ); + if ( c == null ) { + throw new UnknownConstantError( name ); + } + + // Check value + if ( c.getMinValue( ) != null && value < c.getMinValue( ) || c.getMaxValue( ) != null + && value > c.getMaxValue( ) ) { + throw new InvalidConstantValue( ); + } + + // Store constant + try { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + fSetConstant.execute( name , value.floatValue( ) , admin ); + } + + } ); + } catch ( RuntimeException t ) { + this.sysLog.log( LogLevel.ERROR , "could not update constant " + c.getName( ) , t ).flush( ); + throw t; + } + + // Update in-memory copy + Double old = c.getValue( ); + c.setValue( value ); + + // Notify constant users + this.notify( c.getName( ) ); + + return old; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsManagerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsManagerBean.java new file mode 100644 index 0000000..04064d3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsManagerBean.java @@ -0,0 +1,115 @@ +package com.deepclone.lw.beans.sys; + + +import java.util.Collection; +import java.util.Set; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsAdministration; +import com.deepclone.lw.interfaces.sys.ConstantsManager; +import com.deepclone.lw.interfaces.sys.ConstantsUser; + + + +/** + * The constants manager bean initialises a {@link ConstantsData} instance, to which it delegates + * all operations. + * + * @author tseeker + */ +public class ConstantsManagerBean + implements ConstantsManager , InitializingBean +{ + + /** Transaction manager interface */ + private TransactionTemplate tTemplate; + + /** Logger bean */ + private Logger logger; + + /** Shared constants data instance */ + private ConstantsData data; + + private DataSource dataSource; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dataSource = dataSource; + } + + + /** + * Sets the transaction manager interface (DI) + * + * @param transactionManager + * the transaction manager + */ + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + } + + + /** + * Sets the logger bean interface (DI) + * + * @param logger + * the logger bean + */ + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger; + } + + + /** Creates the data storage and manipulation instance once the bean is ready */ + @Override + public void afterPropertiesSet( ) + { + this.data = new ConstantsData( this.dataSource , this.tTemplate , this.logger ); + } + + + /* Documented in ConstantsManager interface */ + @Override + public void registerConstants( Collection< ConstantDefinition > definitions ) + { + this.data.registerConstants( definitions ); + } + + + /* Documented in ConstantsManager interface */ + @Override + public void registerUser( ConstantsUser user , Set< String > constants ) + { + this.data.registerUser( user , constants ); + } + + + /* Documented in ConstantsManager interface */ + @Override + public void unregisterUser( ConstantsUser user ) + { + this.data.unregisterUser( user ); + } + + + /* Documented in ConstantsManager interface */ + @Override + public ConstantsAdministration getAdminSession( int admin ) + { + return new ConstantsAdministrationImpl( this.data , admin ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsRegistrarBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsRegistrarBean.java new file mode 100644 index 0000000..59743d9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ConstantsRegistrarBean.java @@ -0,0 +1,202 @@ +package com.deepclone.lw.beans.sys; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsManager; + + + +public class ConstantsRegistrarBean +{ + + @Autowired( required = true ) + public void setConstantsManager( ConstantsManager cm ) + { + List< ConstantDefinition > defs = new LinkedList< ConstantDefinition >( ); + String cDesc; + + // Default maximal age for log entries = 1 week + double oneWeek = 60 * 60 * 24 * 7; + + // Initial values + cDesc = "Initial cash for new empires."; + defs.add( new ConstantDefinition( "game.initialCash" , "Initial values" , cDesc , 2000.0 , 0.0 , true ) ); + cDesc = "Initial credits for new accounts."; + defs.add( new ConstantDefinition( "game.initialCredits" , "Initial values" , cDesc , 0.0 , 0.0 , true ) ); + + // Misc. game-related values + cDesc = "Game updates - batch size."; + defs.add( new ConstantDefinition( "game.batchSize" , "Game (misc)" , cDesc , 20.0 , 1.0 , true ) ); + cDesc = "Population growth factor."; + defs.add( new ConstantDefinition( "game.growthFactor" , "Game (misc)" , cDesc , 50.0 , 1.0 , true ) ); + cDesc = "Increase to the population growth factor caused by reanimation centres."; + defs.add( new ConstantDefinition( "game.growthFactor.rCentre" , "Game (misc)" , cDesc , 10.0 , 1.0 , true ) ); + cDesc = "Time to abandon a planet (in ticks)."; + defs.add( new ConstantDefinition( "game.timeToAbandon" , "Game (misc)" , cDesc , 1440.0 , 1.0 , true ) ); + cDesc = "Fleet damage ratio per day when debt and upkeep are equal."; + defs.add( new ConstantDefinition( "game.debt.fleet" , "Game (misc)" , cDesc , 0.3 , 0.001 , 0.999 ) ); + cDesc = "Buildings damage ratio per day when debt and upkeep are equal."; + defs.add( new ConstantDefinition( "game.debt.buildings" , "Game (misc)" , cDesc , 0.1 , 0.001 , 0.999 ) ); + + // Universe + cDesc = "Ratio of free planets below which universe expansion is triggered."; + defs.add( new ConstantDefinition( "game.universe.minFreeRatio" , "Universe" , cDesc , 0.1 , 0.02 , 0.98 ) ); + cDesc = "Amount of pictures available to generate planets."; + defs.add( new ConstantDefinition( "game.universe.pictures" , "Universe" , cDesc , 200.0 , 1.0 , true ) ); + cDesc = "Initial population on first-generation planets."; + defs.add( new ConstantDefinition( "game.universe.initialPopulation" , "Universe" , cDesc , 2000.0 , 1000.0 , + true ) ); + cDesc = "Initial universe size (offset relative to the centre)."; + defs.add( new ConstantDefinition( "game.universe.initialSize" , "Universe" , cDesc , 1.0 , 1.0 , true ) ); + + // Happiness + String[] hcNames = { + "noEmployment" , "employmentLimit" , "noDefence" , "defenceLimit" , "popPerDefencePoint" , + "idealEmpireSize" , "smallEmpire" , "eSizeLimit" , "strike" , "relativeChange" , "maxAbsoluteChange" + }; + for ( int i = 0 ; i < hcNames.length ; i++ ) { + hcNames[ i ] = "game.happiness." + hcNames[ i ]; + } + String cat = "Happiness"; + cDesc = "Employment happiness level when there is no employment."; + defs.add( new ConstantDefinition( hcNames[ 0 ] , cat , cDesc , 0.7 , 0.05 , 0.99 ) ); + cDesc = "Employment ratio beyond which things get tough."; + defs.add( new ConstantDefinition( hcNames[ 1 ] , cat , cDesc , 2.0 , 1.1 , true ) ); + cDesc = "Defence happiness level when there is no defence."; + defs.add( new ConstantDefinition( hcNames[ 2 ] , cat , cDesc , 0.5 , 0.05 , 0.99 ) ); + cDesc = "Defence ratio beyond which things get tough."; + defs.add( new ConstantDefinition( hcNames[ 3 ] , cat , cDesc , 4.0 , 1.1 , true ) ); + cDesc = "Population covered by a single defence power point."; + defs.add( new ConstantDefinition( hcNames[ 4 ] , cat , cDesc , 5.0 , 1.0 , true ) ); + cDesc = "Ideal empire size."; + defs.add( new ConstantDefinition( hcNames[ 5 ] , cat , cDesc , 10.0 , 2.0 , true ) ); + cDesc = "Happiness level for 1-planet empires."; + defs.add( new ConstantDefinition( hcNames[ 6 ] , cat , cDesc , 0.9 , 0.5 , true ) ); + cDesc = "Empire size limit (relative to the ideal size) beyond which things get tough."; + defs.add( new ConstantDefinition( hcNames[ 7 ] , cat , cDesc , 2.0 , 1.1 , true ) ); + cDesc = "Happiness level below which strikes begin."; + defs.add( new ConstantDefinition( hcNames[ 8 ] , cat , cDesc , 0.25 , 0.0 , 1.0 ) ); + cDesc = "Happiness change at each update, relative to the size of the population."; + defs.add( new ConstantDefinition( hcNames[ 9 ] , cat , cDesc , 0.001 , 0.00001 , 0.99999 ) ); + cDesc = "Maximal population units for which happiness will change."; + defs.add( new ConstantDefinition( hcNames[ 10 ] , cat , cDesc , 1000.0 , 1.0 , true ) ); + + // Work and income + String[] wcNames = { + "population" , "factory" , "strikeEffect" , "wuPerPopUnit" , "destructionRecovery" , "destructionWork" , + "rpPerPopUnit" , "cancelRecovery" + }; + for ( int i = 0 ; i < wcNames.length ; i++ ) { + wcNames[ i ] = "game.work." + wcNames[ i ]; + } + cat = "Work & income"; + cDesc = "Daily income per population unit."; + defs.add( new ConstantDefinition( wcNames[ 0 ] , cat , cDesc , 0.2 , 0.01 , true ) ); + cDesc = "Daily income per factory production unit."; + defs.add( new ConstantDefinition( wcNames[ 1 ] , cat , cDesc , 250.0 , 0.01 , true ) ); + cDesc = "Proportion of the base income that disappears if the whole population is on strike."; + defs.add( new ConstantDefinition( wcNames[ 2 ] , cat , cDesc , 1.0 , 0.0 , 1.0 ) ); + cDesc = "Work units generated by each population unit."; + defs.add( new ConstantDefinition( wcNames[ 3 ] , cat , cDesc , 0.01 , 0.001 , true ) ); + cDesc = "Proportion of a building's cost that is recovered when it is destroyed."; + defs.add( new ConstantDefinition( wcNames[ 4 ] , cat , cDesc , 0.1 , 0.01 , 0.99 ) ); + cDesc = "Proportion of a building's construction work units required to destroy it"; + defs.add( new ConstantDefinition( wcNames[ 5 ] , cat , cDesc , 0.25 , 0.01 , 1.0 ) ); + cDesc = "Research points per population unit."; + defs.add( new ConstantDefinition( wcNames[ 6 ] , cat , cDesc , 0.50 , 0.01 , true ) ); + cDesc = "Proportion of queue investments that is recovered when flushing the queue."; + defs.add( new ConstantDefinition( wcNames[ 7 ] , cat , cDesc , 0.1 , 0.01 , 1.0 ) ); + + // Vacation mode + cDesc = "Initial vacation credits."; + defs.add( new ConstantDefinition( "vacation.initial" , "Vacation mode" , cDesc , 4320.0 , 0.0 , true ) ); + cDesc = "Delay before vacation mode is activated (seconds)."; + defs.add( new ConstantDefinition( "vacation.delay" , "Vacation mode" , cDesc , 21600.0 , 3600.0 , true ) ); + cDesc = "Maximal vacation credits."; + defs.add( new ConstantDefinition( "vacation.max" , "Vacation mode" , cDesc , 259200.0 , 10000.0 , true ) ); + cDesc = "Vacation cost (credits / minute)."; + defs.add( new ConstantDefinition( "vacation.cost" , "Vacation mode" , cDesc , 3.0 , 2.0 , 20.0 ) ); + cDesc = "Income/upkeep divider used when vacation mode is active."; + defs.add( new ConstantDefinition( "vacation.cashDivider" , "Vacation mode" , cDesc , 3.0 , 1.1 , 10.0 ) ); + cDesc = "Research points divider used when vacation mode is active."; + defs.add( new ConstantDefinition( "vacation.researchDivider" , "Vacation mode" , cDesc , 10.0 , 1.1 , 50.0 ) ); + + // Map names + cDesc = "Minimal delay between map object renaming."; + defs.add( new ConstantDefinition( "map.names.minDelay" , "Map names" , cDesc , 15.0 , 1.0 , true ) ); + cDesc = "Units for the minimal delay between map object renaming (seconds)."; + defs.add( new ConstantDefinition( "map.names.minDelay.units" , "Map names" , cDesc , 86400.0 , 1.0 , true ) ); + + // Log clean-up + cDesc = "Maximal age of administration log entries, in seconds."; + defs.add( new ConstantDefinition( "log.maxAge.admin" , "Logs" , cDesc , oneWeek , 1.0 , true ) ); + cDesc = "Maximal age of account log entries, in seconds."; + defs.add( new ConstantDefinition( "log.maxAge.users" , "Logs" , cDesc , oneWeek , 1.0 , true ) ); + cDesc = "Maximal age of system log entries, in seconds."; + defs.add( new ConstantDefinition( "log.maxAge.sys" , "Logs" , cDesc , oneWeek , 1.0 , true ) ); + + // Battles + cDesc = "Amount of ticks before a battle reaches full intensity."; + defs.add( new ConstantDefinition( "game.battle.timeToFullIntensity" , "Battles" , cDesc , 30.0 , 0.0 , true ) ); + cDesc = "Initial intensity of a battle."; + defs.add( new ConstantDefinition( "game.battle.initialIntensity" , "Battles" , cDesc , 0.25 , 0.0 , 1.0 ) ); + cDesc = "Defence bonus."; + defs.add( new ConstantDefinition( "game.battle.defenceBonus" , "Battles" , cDesc , 0.1 , 0.0 , true ) ); + cDesc = "Damage / power unit / minute"; + defs.add( new ConstantDefinition( "game.battle.damage" , "Battles" , cDesc , 0.01 , 0.001 , true ) ); + cDesc = "Proportion of random damage variation."; + defs.add( new ConstantDefinition( "game.battle.randomDamage" , "Battles" , cDesc , 0.05 , 0.0 , 0.9 ) ); + + // Ticker + cDesc = "Interval between ticks with the highest frequency, in milliseconds."; + defs.add( new ConstantDefinition( "ticker.interval" , "Ticker" , cDesc , 5000.0 , 1000.0 , true ) ); + + // Accounts + cDesc = "Minimal interval between address change requests (seconds)"; + defs.add( new ConstantDefinition( "accounts.acrDelay" , "Accounts" , cDesc , 14400.0 , 1.0 , true ) ); + cDesc = "Minimal interval between password recovery requests (seconds)"; + defs.add( new ConstantDefinition( "accounts.prrDelay" , "Accounts" , cDesc , 8800.0 , 1.0 , true ) ); + cDesc = "Time before a new or reactivated account is deleted / disabled (seconds)"; + defs.add( new ConstantDefinition( "accounts.cacDelay" , "Accounts" , cDesc , 86400.0 , 3600.0 , true ) ); + cDesc = "Delay between clicking the 'Quit' button and account de-activation (seconds)"; + defs.add( new ConstantDefinition( "accounts.quitDelay" , "Accounts" , cDesc , 86400.0 , 3600.0 , true ) ); + cDesc = "Delay between a ban and the deletion of the player's empire (seconds)"; + defs.add( new ConstantDefinition( "accounts.banDelay" , "Accounts" , cDesc , 178000.0 , 3600.0 , true ) ); + cDesc = "Delay before a ban request expires (seconds)"; + defs.add( new ConstantDefinition( "accounts.banExpiration" , "Accounts" , cDesc , oneWeek , 3600.0 , true ) ); + + // Accounts - warnings + cDesc = "Amount of warnings that triggers an automatic ban request."; + defs.add( new ConstantDefinition( "accounts.warnings.autoBan" , "Accounts - Warnings" , cDesc , 3.0 , 1.0 , true ) ); + cDesc = "Period after a warning is received during which additional warnings will be ignored (seconds)."; + defs.add( new ConstantDefinition( "accounts.warnings.grace" , "Accounts - Warnings" , cDesc , 7200.0 , 60.0 , true ) ); + cDesc = "Time after which warnings are decreased (expressed in units as defined by a.w.expiration.units)."; + defs.add( new ConstantDefinition( "accounts.warnings.expiration" , "Accounts - Warnings" , cDesc , 60.0 , 1.0 , true ) ); + cDesc = "Units used to express warning expiration time (seconds)."; + defs.add( new ConstantDefinition( "accounts.warnings.expiration.units" , "Accounts - Warnings" , cDesc , 86400.0 , 1.0 , true ) ); + + // Account inactivity + cDesc = "Time units (seconds)"; + defs.add( new ConstantDefinition( "accounts.inactivity.units" , "Accounts - Inactivity" , cDesc , oneWeek , 3600.0 , true ) ); + cDesc = "Time after which the inactivity warning e-mail is to be sent, expressed using units defined by a.i.units."; + defs.add( new ConstantDefinition( "accounts.inactivity.warningMail" , "Accounts - Inactivity" , cDesc , 3.0 , 1.0 , true ) ); + cDesc = "Time between the inactivity warning e-mail and actual account deletion, expressed using units defined by a.i.units."; + defs.add( new ConstantDefinition( "accounts.inactivity.deletion" , "Accounts - Inactivity" , cDesc , 1.0 , 1.0 , true ) ); + + // Bug reports + cDesc = "Amount of credits granted for low priority bug reports."; + defs.add( new ConstantDefinition( "bugtracker.lowCredits" , "Bug tracking system" , cDesc , 1.0 , 1.0 , true ) ); + cDesc = "Amount of credits granted for normal bug reports."; + defs.add( new ConstantDefinition( "bugtracker.mediumCredits" , "Bug tracking system" , cDesc , 2.0 , 1.0 , true ) ); + cDesc = "Amount of credits granted for critical bug reports."; + defs.add( new ConstantDefinition( "bugtracker.highCredits" , "Bug tracking system" , cDesc , 3.0 , 1.0 , true ) ); + + cm.registerConstants( defs ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ServerSessionData.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ServerSessionData.java new file mode 100644 index 0000000..22765fe --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/ServerSessionData.java @@ -0,0 +1,251 @@ +package com.deepclone.lw.beans.sys; + + +import java.net.InetAddress; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.session.SessionTypeDefiner; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionIdentifierException; +import com.deepclone.lw.session.SessionReference; +import com.deepclone.lw.session.SessionStateException; +import com.deepclone.lw.utils.RandomStringGenerator; + + + +/** + * Session data. + * + * @author tseeker + */ +class ServerSessionData + implements ServerSession +{ + + /** Data store */ + private Map< String , Object > storage = new HashMap< String , Object >( ); + + /** Session identifier */ + private String identifier; + + /** Definer for the session's type */ + private SessionTypeDefiner definer; + + /** Authentication challenge generator */ + private RandomStringGenerator challengeGenerator; + + /** Last authentication challenge */ + private String lastChallenge; + + /** Session expiration date */ + private Date expire; + + /** Termination reason */ + SessionTerminationType termination = null; + + /** IPv4 address of the client */ + private InetAddress address; + + /** Client type identifier */ + private String client; + + + /** + * Initialises a new session. + * + * @param generator + * authentication challenge generator + * @param definer + * session type definer + * @param client + * type of the client interface initiating the session + * @param address + * IP address the session is being initiated from + */ + public ServerSessionData( RandomStringGenerator generator , SessionTypeDefiner definer , String client , + InetAddress address ) + { + this.challengeGenerator = generator; + this.definer = definer; + this.expire = new Date( new Date( ).getTime( ) + 5000L ); + this.definer.initialise( this ); + this.client = client; + this.address = address; + } + + + /** + * Sets the session's identifier + * + * @param id + * the session's identifier + */ + public void setIdentifier( String id ) + { + this.identifier = id; + } + + + /* Documented in ServerSession interface */ + @Override + public String getIdentifier( ) + { + return this.identifier; + } + + + /* Documented in ServerSession interface */ + @Override + public String getClient( ) + { + return this.client; + } + + + /* Documented in ServerSession interface */ + @Override + public InetAddress getAddress( ) + { + return this.address; + } + + + /* Documented in ServerSession interface */ + @Override + public String getChallenge( ) + { + return this.lastChallenge; + } + + + /* Documented in ServerSession interface */ + @Override + public void setExpirationDate( Date date ) + { + this.expire = date; + } + + + /** @return the session's expiration date */ + public Date getExpirationDate( ) + { + return this.expire; + } + + + /** + * Sets the termination type and handles termination + * + * @param termination + * type of session termination + */ + synchronized public void handleTermination( SessionTerminationType termination ) + { + if ( this.termination == null ) { + this.termination = termination; + this.definer.terminate( this , termination ); + } + } + + + /* Documented in ServerSession interface */ + @Override + public SessionTerminationType getTerminationType( ) + { + return this.termination; + } + + + /* Documented in ServerSession interface */ + @Override + public void terminate( ) + { + this.handleTermination( SessionTerminationType.MANUAL ); + } + + + @Override + public void terminate( SessionTerminationType reason ) + { + this.handleTermination( reason ); + } + + + /* Documented in ServerSession interface */ + @Override + public void put( String key , Object value ) + { + if ( value == null ) { + this.storage.remove( key ); + } else { + this.storage.put( key , value ); + } + } + + + /* Documented in ServerSession interface */ + @Override + public < T > T get( String key , Class< T > type ) + { + Object obj = this.storage.get( key ); + try { + return ( obj == null ) ? null : type.cast( obj ); + } catch ( ClassCastException e ) { + return null; + } + } + + + /** + * Generates a {@link SessionReference} from the session's current state. + * + * @return the new session reference + */ + synchronized public SessionReference toSessionReference( ) + { + if ( this.termination != null ) { + return null; + } + + boolean auth = this.definer.isAuthenticated( this ); + String extra; + if ( auth ) { + extra = this.definer.getState( this ); + } else { + extra = this.challengeGenerator.generate( ); + this.lastChallenge = extra; + } + + return new SessionReference( this.identifier , this.definer.getName( ) , auth , extra ); + } + + + /** Attempts to authenticate the session */ + synchronized public void authenticate( String identifier , String sha1Hash , String md5Hash ) + throws SessionStateException , SessionIdentifierException + { + if ( this.termination != null ) { + throw new SessionIdentifierException( this.identifier ); + } + this.definer.authenticate( this , identifier , sha1Hash , md5Hash ); + } + + + /** + * Attempts to execute a command on the session + */ + synchronized public CommandResponse execute( Command command ) + throws SessionStateException , SessionCommandException , SessionIdentifierException + { + if ( this.termination != null ) { + throw new SessionIdentifierException( this.identifier ); + } + return this.definer.execute( this , command ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SessionManagerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SessionManagerBean.java new file mode 100644 index 0000000..dc0295a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SessionManagerBean.java @@ -0,0 +1,396 @@ +package com.deepclone.lw.beans.sys; + + +import java.lang.ref.WeakReference; +import java.net.InetAddress; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.session.*; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.session.*; +import com.deepclone.lw.utils.RandomStringGenerator; + + + +/** + * Session management bean implementation. + * + *

+ * This class is the implementation of the session management bean. It is responsible for creating + * sessions, using its collection of type definers, for accessing the sessions, and for making them + * expire as required. + * + * @author tseeker + */ +public class SessionManagerBean + implements SessionManager , DisposableBean +{ + + /** Session type definers, by name */ + private final Map< String , WeakReference< SessionTypeDefiner > > types = new HashMap< String , WeakReference< SessionTypeDefiner > >( ); + + /** Sessions, by identifier */ + private final Map< String , ServerSessionData > sessions = new HashMap< String , ServerSessionData >( ); + + /** Random string generator for session identifiers */ + private RandomStringGenerator sessionIDGenerator; + + /** Random string generator for authentication challenges */ + private RandomStringGenerator challengeGenerator; + + /** Session clean-up task, registered to the {@link Ticker} */ + private Runnable cleanupTask; + + /** System logger for the session manager */ + private SystemLogger logger; + + + /** + * Sets the generator for session identifiers (DI) + * + * @param rsg + * reference to the random string generator to use for session identifiers + */ + @Autowired( required = true ) + @Qualifier( "sessionIdentifiers" ) + public void setSessionIDGenerator( RandomStringGenerator rsg ) + { + this.sessionIDGenerator = rsg; + } + + + /** + * Sets the generator for authentication challenges (DI) + * + * @param rsg + * reference to the random string generator to use for authentication challenges + */ + @Autowired( required = true ) + @Qualifier( "authChallenges" ) + public void setChallangeGenerator( RandomStringGenerator rsg ) + { + this.challengeGenerator = rsg; + } + + + /** + * Initialises the session clean-up task (DI) + * + * @param ticker + * reference to the ticker bean + */ + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.cleanupTask = new Runnable( ) { + + @Override + public void run( ) + { + purgeSessions( ); + } + + }; + ticker.registerTask( Ticker.Frequency.HIGH , "Sessions clean-up" , this.cleanupTask ); + } + + + /** + * Initialises the system logger (DI) + * + * @param logger + * reference to the logger bean + */ + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "SessionManager" ); + } + + + /** + * Removes the reference to the clean-up task. + */ + @Override + public void destroy( ) + { + this.cleanupTask = null; + synchronized ( this.sessions ) { + for ( ServerSessionData data : this.sessions.values( ) ) { + try { + this.logger.log( LogLevel.DEBUG , "expiring '" + data.getIdentifier( ) + "'" ).flush( ); + data.handleTermination( SessionTerminationType.EXPIRED ); + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while terminating '" + data.getIdentifier( ) + "'" , e ) + .flush( ); + } + } + } + } + + + /** + * Finds the session type definer corresponding to a type name. + * + * @param type + * the name of the session type + * @return the session type definer, or null if it doesn't exist + */ + private SessionTypeDefiner getTypeDefiner( String type ) + { + SessionTypeDefiner definer = null; + + synchronized ( this.types ) { + WeakReference< SessionTypeDefiner > ref = this.types.get( type ); + if ( ref != null ) { + definer = ref.get( ); + if ( definer == null ) { + this.types.remove( type ); + } + } + } + + return definer; + } + + + /** + * Allocates a session identifier. + * + *

+ * This method generates an unique session identifier for the specified session, setting the + * session's identifier and storing it in the {@link #sessions} map. + * + * @param data + * the session that needs to be initialised + */ + private void allocateSessionIdentifier( ServerSessionData data ) + { + synchronized ( this.sessions ) { + String id; + do { + id = this.sessionIDGenerator.generate( ); + } while ( this.sessions.containsKey( id ) ); + data.setIdentifier( id ); + this.sessions.put( id , data ); + } + } + + + /** + * Retrieves a session from an identifier. + * + *

+ * This method attempts to retrieve a session from the {@link #sessions} map. If the session + * exists but is expired, it will be removed and the method will behave as if it didn't exist. + * + * @param id + * the session's identifier + * @return the session's data + * @throws SessionIdentifierException + * if the session doesn't exist or has expired. + */ + private ServerSessionData getSession( String id ) + throws SessionIdentifierException + { + ServerSessionData data; + synchronized ( this.sessions ) { + data = this.sessions.get( id ); + if ( data == null ) { + this.logger.log( LogLevel.INFO , "session '" + id + "' not found" ).flush( ); + throw new SessionIdentifierException( id ); + } + if ( data.getExpirationDate( ).before( new Date( ) ) ) { + this.logger.log( LogLevel.INFO , "session '" + id + "' found but expired" ).flush( ); + ServerSessionData session = this.sessions.remove( id ); + session.handleTermination( SessionTerminationType.EXPIRED ); + throw new SessionIdentifierException( id ); + } + } + return data; + } + + + /** + * Removes expired sessions. + * + *

+ * This method goes through all registered sessions, removing them from the {@link #sessions} + * map if they have expired. + */ + private void purgeSessions( ) + { + Date now = new Date( ); + List< ServerSessionData > toRemove = new LinkedList< ServerSessionData >( ); + synchronized ( this.sessions ) { + for ( ServerSessionData session : this.sessions.values( ) ) { + if ( session.getExpirationDate( ).before( now ) ) { + toRemove.add( session ); + } + } + + for ( ServerSessionData session : toRemove ) { + this.sessions.remove( session.getIdentifier( ) ); + } + } + + for ( ServerSessionData session : toRemove ) { + this.handleTermination( session , SessionTerminationType.EXPIRED ); + } + + if ( !toRemove.isEmpty( ) ) { + this.logger.log( LogLevel.TRACE , toRemove.size( ) + " session(s) removed" ).flush( ); + } + } + + + private void handleTermination( ServerSessionData session , SessionTerminationType reason ) + { + try { + session.handleTermination( reason ); + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while terminating '" + session.getIdentifier( ) + "'" , e ) + .flush( ); + } + } + + + /* Documented in SessionManager interface */ + @Override + public void registerSessionType( SessionTypeDefiner definer ) + { + synchronized ( this.types ) { + this.types.put( definer.getName( ) , new WeakReference< SessionTypeDefiner >( definer ) ); + } + this.logger.log( LogLevel.INFO , "registered session type definer '" + definer.getName( ) + "'" ).flush( ); + } + + + /* Documented in SessionAccessor interface */ + @Override + public SessionReference create( String type , String client , InetAddress address ) + throws SessionInternalException + { + SessionTypeDefiner definer = this.getTypeDefiner( type ); + if ( definer == null ) { + this.logger.log( LogLevel.WARNING , "no such session type '" + type + "'" ).flush( ); + return null; + } + + ServerSessionData data; + try { + data = new ServerSessionData( this.challengeGenerator , definer , client , address ); + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while creating session with type '" + type + "'" , e ).flush( ); + throw new SessionInternalException( false , e ); + } + + this.allocateSessionIdentifier( data ); + this.logger.log( LogLevel.INFO , "session " + data.getIdentifier( ) + " created (type " + type + ")" ).flush( ); + + return data.toSessionReference( ); + } + + + /* Documented in SessionAccessor interface */ + @Override + public SessionReference authenticate( String session , String identifier , String sha1Hash , String md5Hash ) + throws SessionIdentifierException , SessionStateException , SessionInternalException + { + ServerSessionData data = this.getSession( session ); + this.logger.log( LogLevel.TRACE , "attempting to authenticate session '" + session + "'" ).flush( ); + + try { + data.authenticate( identifier , sha1Hash , md5Hash ); + } catch ( SessionIdentifierException e ) { + synchronized ( this.sessions ) { + this.sessions.remove( session ); + } + throw e; + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while authenticating session '" + session + "'" , e ).flush( ); + throw new SessionInternalException( false , e ); + } + + if ( data.getTerminationType( ) != null ) { + synchronized ( this.sessions ) { + this.logger.log( LogLevel.INFO , "terminated '" + session + "' during authentication" ).flush( ); + this.sessions.remove( session ); + } + } + + return data.toSessionReference( ); + } + + + /* Documented in SessionAccessor interface */ + @Override + public SessionResponse executeCommand( String session , Command command ) + throws SessionIdentifierException , SessionStateException , SessionCommandException , + SessionInternalException + { + ServerSessionData data = this.getSession( session ); + this.logger.log( LogLevel.DEBUG , "executing command " + command.getClass( ) + " on '" + session + "'" ) + .flush( ); + + CommandResponse response; + try { + response = data.execute( command ); + } catch ( SessionIdentifierException e ) { + synchronized ( this.sessions ) { + this.sessions.remove( session ); + } + throw e; + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while executing command on '" + session + "'" , e ).flush( ); + throw new SessionInternalException( false , e ); + } + + if ( data.getTerminationType( ) != null ) { + this.logger.log( LogLevel.INFO , "terminated '" + session + "' during command execution" ).flush( ); + synchronized ( this.sessions ) { + this.sessions.remove( session ); + } + } + + return new SessionResponse( data.toSessionReference( ) , response ); + } + + + /* Documented in SessionAccessor interface */ + @Override + public void terminate( String session ) + throws SessionIdentifierException , SessionInternalException + { + ServerSessionData data; + synchronized ( this.sessions ) { + data = this.sessions.remove( session ); + } + if ( data == null ) { + throw new SessionIdentifierException( session ); + } else if ( data.getExpirationDate( ).before( new Date( ) ) ) { + data.handleTermination( SessionTerminationType.EXPIRED ); + throw new SessionIdentifierException( session ); + } + + try { + data.handleTermination( SessionTerminationType.MANUAL ); + this.logger.log( LogLevel.INFO , "terminated '" + session + "'" ).flush( ); + } catch ( RuntimeException e ) { + this.logger.log( LogLevel.ERROR , "error while terminating '" + session + "'" , e ).flush( ); + throw new SessionInternalException( false , e ); + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SystemStatusBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SystemStatusBean.java new file mode 100644 index 0000000..18db00f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/SystemStatusBean.java @@ -0,0 +1,302 @@ +package com.deepclone.lw.beans.sys; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.SqlOutParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.MaintenanceStatusException; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.interfaces.sys.TickStatusException; +import com.deepclone.lw.sqld.sys.Status; +import com.deepclone.lw.utils.StoredProc; + + + +public class SystemStatusBean + implements SystemStatus +{ + + /** Database interface */ + private SimpleJdbcTemplate dTemplate; + + /** Transaction template */ + private TransactionTemplate tTemplate; + + /** System status record */ + private Status status = null; + + /** Current maintenance mode record */ + private MaintenanceData maintenance = null; + + private SimpleJdbcCall doStartTick; + private SimpleJdbcCall doCheckTick; + + private StoredProc fEnterMaintenanceMode; + private StoredProc fExtendMaintenanceMode; + private StoredProc fExitMaintenanceMode; + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fEnterMaintenanceMode = new StoredProc( dataSource , "sys" , "enter_maintenance_mode" ); + this.fEnterMaintenanceMode.addParameter( "admin_id" , Types.INTEGER ); + this.fEnterMaintenanceMode.addParameter( "reason" , Types.VARCHAR ); + this.fEnterMaintenanceMode.addParameter( "duration" , Types.INTEGER ); + this.fEnterMaintenanceMode.addOutput( "success" , Types.BOOLEAN ); + + this.fExtendMaintenanceMode = new StoredProc( dataSource , "sys" , "extend_maintenance_mode" ); + this.fExtendMaintenanceMode.addParameter( "admin_id" , Types.INTEGER ); + this.fExtendMaintenanceMode.addParameter( "duration" , Types.INTEGER ); + this.fExtendMaintenanceMode.addOutput( "success" , Types.BOOLEAN ); + + this.fExitMaintenanceMode = new StoredProc( dataSource , "sys" , "exit_maintenance_mode" ); + this.fExitMaintenanceMode.addParameter( "admin_id" , Types.INTEGER ); + this.fExitMaintenanceMode.addOutput( "success" , Types.BOOLEAN ); + + this.doStartTick = new SimpleJdbcCall( dataSource ); + this.doStartTick.withCatalogName( "sys" ).withFunctionName( "start_tick" ); + this.doStartTick.withoutProcedureColumnMetaDataAccess( ); + this.doStartTick.addDeclaredParameter( new SqlOutParameter( "tick_id" , Types.BIGINT ) ); + + this.doCheckTick = new SimpleJdbcCall( dataSource ); + this.doCheckTick.withCatalogName( "sys" ).withFunctionName( "check_stuck_tick" ); + this.doCheckTick.withoutProcedureColumnMetaDataAccess( ); + this.doCheckTick.addDeclaredParameter( new SqlOutParameter( "tick_id" , Types.BIGINT ) ); + + } + + + /** + * Sets the transaction manager interface (DI) + * + * @param transactionManager + * the transaction manager + */ + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager transactionManager ) + { + this.tTemplate = new TransactionTemplate( transactionManager ); + } + + + private void loadStatus( ) + { + String sql = "SELECT * FROM sys.status"; + RowMapper< Status > mapper = new RowMapper< Status >( ) { + + @Override + public Status mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + Status s = new Status( ); + s.setNextTickIdentifier( rs.getLong( "next_tick" ) ); + s.setCurrentTick( rs.getLong( "current_tick" ) ); + s.setLastMsgRecap( rs.getTimestamp( "last_msg_recap" ) ); + s.setLastAdminRecap( rs.getTimestamp( "last_admin_recap" ) ); + s.setLastErrorCheck( rs.getTimestamp( "last_error_recap" ) ); + s.setMaintenanceStart( rs.getTimestamp( "maintenance_start" ) ); + s.setMaintenanceEnd( rs.getTimestamp( "maintenance_end" ) ); + s.setMaintenanceReason( rs.getString( "maintenance_text" ) ); + return s; + } + + }; + + this.status = this.dTemplate.queryForObject( sql , mapper ); + + // Update maintenance status + if ( this.status.getMaintenanceReason( ) != null ) { + this.maintenance = new MaintenanceData( this.status.getMaintenanceStart( ) , this.status + .getMaintenanceEnd( ) , this.status.getMaintenanceReason( ) ); + } else { + this.maintenance = null; + } + } + + + /** + * Initialises the system's status. + * + *

+ * This method attempts to read the system's previous status from the database. If the entry + * doesn't exist, it is created. Some of the record's data is then stored locally and the bean + * is marked as initialised. + */ + private void initialise( ) + { + if ( this.status != null ) { + return; + } + + // Load status + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + loadStatus( ); + } + + } ); + } + + + /* Documented in interface */ + @Override + synchronized public MaintenanceData checkMaintenance( ) + { + this.initialise( ); + return this.maintenance; + } + + + /* Documented in interface */ + @Override + synchronized public void startMaintenance( final int adminId , final String reason , final int duration ) + throws MaintenanceStatusException + { + if ( duration <= 0 || reason == null ) { + throw new IllegalArgumentException( ); + } + + boolean s = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + Map< String , Object > m = fEnterMaintenanceMode.execute( adminId , reason , duration ); + loadStatus( ); + return (Boolean) m.get( "success" ); + } + + } ); + + if ( !s ) { + throw new MaintenanceStatusException( this.maintenance ); + } + } + + + /* Documented in interface */ + @Override + synchronized public void updateMaintenance( final int adminId , final int durationFromNow ) + throws MaintenanceStatusException + { + if ( durationFromNow <= 0 ) { + throw new IllegalArgumentException( ); + } + + boolean s = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + Map< String , Object > m = fExtendMaintenanceMode.execute( adminId , durationFromNow ); + loadStatus( ); + return (Boolean) m.get( "success" ); + } + + } ); + + if ( !s ) { + throw new MaintenanceStatusException( ); + } + } + + + /* Documented in interface */ + @Override + synchronized public void endMaintenance( final int adminId ) + throws MaintenanceStatusException + { + boolean s = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + Map< String , Object > m = fExitMaintenanceMode.execute( adminId ); + loadStatus( ); + return (Boolean) m.get( "success" ); + } + + } ); + + if ( !s ) { + throw new MaintenanceStatusException( ); + } + } + + + /* Documented in interface */ + @Override + synchronized public long startTick( ) + throws TickStatusException , MaintenanceStatusException + { + Long tid = this.tTemplate.execute( new TransactionCallback< Long >( ) { + + @Override + public Long doInTransaction( TransactionStatus status ) + { + Map< String , Object > m = doStartTick.execute( ); + loadStatus( ); + return (Long) m.get( "tick_id" ); + } + + } ); + + if ( tid == null ) { + if ( this.maintenance != null ) { + throw new MaintenanceStatusException( this.maintenance ); + } else { + throw new TickStatusException( this.status.getCurrentTick( ) ); + } + } + + return tid; + } + + + /* Documented in interface */ + @Override + public Long checkStuckTick( ) + throws MaintenanceStatusException + { + Long tid = this.tTemplate.execute( new TransactionCallback< Long >( ) { + + @Override + public Long doInTransaction( TransactionStatus status ) + { + Map< String , Object > m = doCheckTick.execute( ); + loadStatus( ); + return (Long) m.get( "tick_id" ); + } + + } ); + + if ( tid == null && this.maintenance != null ) { + throw new MaintenanceStatusException( this.maintenance ); + } + + return tid; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerBean.java new file mode 100644 index 0000000..b39d795 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerBean.java @@ -0,0 +1,160 @@ +package com.deepclone.lw.beans.sys; + + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.Logger; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.sys.ConstantsManager; +import com.deepclone.lw.interfaces.sys.Ticker; + + + +/** + * Task scheduler bean. + * + *

+ * This class implements Legacy Worlds' task scheduler, used for most repetitive actions such as + * updating the game's state, cleaning logs or de-activating accounts. + * + *

+ * + *

+ * ticker.interval defaults to 5 seconds. + * + * @author tseeker + */ +public class TickerBean + implements Ticker , InitializingBean , DisposableBean +{ + + /** System logger for the bean */ + private SystemLogger logger; + + /** Constants manager bean */ + private ConstantsManager constantsManager; + + /** Main thread for ticker control */ + private TickerThread mainThread; + + private TickerTaskStatusHandler tickerManager; + + + /** + * Sets the system logger (DI) + * + * @param logger + * reference to the logger bean + */ + @Autowired( required = true ) + public void setLogger( Logger logger ) + { + this.logger = logger.getSystemLogger( "Ticker" ); + } + + + /** + * Sets the constants manager (DI) + * + * @param manager + * reference to the constants manager bean + */ + @Autowired( required = true ) + public void setConstantsManager( ConstantsManager manager ) + { + this.constantsManager = manager; + } + + + @Autowired( required = true ) + public void setManager( TickerTaskStatusHandler manager ) + { + this.tickerManager = manager; + } + + + /** + * Initialises the bean. + * + *

+ * When all dependencies have been set, the bean will register the ticker.interval + * system constant. The main control thread will then be created and registered as an user of + * the constant (which causes the control thread to schedule itself using the timer). + */ + @Override + public void afterPropertiesSet( ) + { + this.logger.log( LogLevel.INFO , "Initialisation" ).flush( ); + + // Create thread + this.mainThread = new TickerThread( this.logger , this.tickerManager ); + + // Register thread as a constants user + Set< String > use = new HashSet< String >( ); + use.add( "ticker.interval" ); + this.constantsManager.registerUser( this.mainThread , use ); + } + + + /** + * Destroys the bean. + * + * This method will abort the main control thread's execution, and unregister it from the + * constants manager. + */ + @Override + public void destroy( ) + { + this.logger.log( LogLevel.INFO , "Destruction" ).flush( ); + this.mainThread.terminate( ); + this.constantsManager.unregisterUser( this.mainThread ); + this.constantsManager = null; + } + + + /* Documented in Ticker interface */ + @Override + public void registerTask( Ticker.Frequency frequency , String name , Runnable task ) + { + this.logger.log( LogLevel.DEBUG , "Registering task " + name + " at frequency " + frequency ).flush( ); + int id = this.tickerManager.registerTask( name ); + this.mainThread.registerTask( id , frequency , name , task ); + } + + + /* Documented in Ticker interface */ + @Override + public void pause( ) + throws IllegalStateException + { + this.mainThread.pause( ); + } + + + /* Documented in Ticker interface */ + @Override + public void unpause( ) + throws IllegalStateException + { + this.mainThread.unpause( ); + } + + + /* Documented in Ticker interface */ + @Override + public boolean isActive( ) + { + return this.mainThread.isActive( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerManagerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerManagerBean.java new file mode 100644 index 0000000..87a93ca --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerManagerBean.java @@ -0,0 +1,269 @@ +package com.deepclone.lw.beans.sys; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.sql.Types; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.tick.TickerTaskInfo; +import com.deepclone.lw.cmd.admin.tick.TickerTaskStatus; +import com.deepclone.lw.interfaces.sys.TickerManager; +import com.deepclone.lw.sqld.sys.TickerTaskRecord; +import com.deepclone.lw.utils.StoredProc; + + + +public class TickerManagerBean + implements TickerManager , TickerTaskStatusHandler , InitializingBean +{ + + private final Map< Integer , TickerTaskRecord > tasks = new HashMap< Integer , TickerTaskRecord >( ); + private final Map< String , Integer > taskIds = new HashMap< String , Integer >( ); + private final Set< Integer > registered = new HashSet< Integer >( ); + + private TransactionTemplate tTemplate; + private SimpleJdbcTemplate dTemplate; + + private final RowMapper< TickerTaskRecord > mTask; + + private StoredProc fRegisterTask; + private StoredProc fSetTaskStarted; + private StoredProc fSetTaskRunning; + private StoredProc fScheduleTask; + + + public TickerManagerBean( ) + { + this.mTask = new RowMapper< TickerTaskRecord >( ) { + @Override + public TickerTaskRecord mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + TickerTaskRecord task = new TickerTaskRecord( ); + task.setId( rs.getInt( "id" ) ); + task.setName( rs.getString( "task_name" ) ); + task.setStatus( rs.getString( "status" ) ); + task.setTimestamp( rs.getTimestamp( "auto_start" ) ); + return task; + } + }; + } + + + @Autowired( required = true ) + public void setTransactionManager( PlatformTransactionManager manager ) + { + this.tTemplate = new TransactionTemplate( manager ); + } + + + @Autowired( required = true ) + public void setDataSource( DataSource dataSource ) + { + this.dTemplate = new SimpleJdbcTemplate( dataSource ); + + this.fRegisterTask = new StoredProc( dataSource , "sys" , "register_ticker_task" ); + this.fRegisterTask.addParameter( "task_name" , Types.VARCHAR ); + this.fRegisterTask.addOutput( "id" , Types.INTEGER ); + + this.fSetTaskStarted = new StoredProc( dataSource , "sys" , "set_task_started" ); + this.fSetTaskStarted.addParameter( "id" , Types.INTEGER ); + + this.fSetTaskRunning = new StoredProc( dataSource , "sys" , "set_task_running" ); + this.fSetTaskRunning.addParameter( "admin_id" , Types.INTEGER ); + this.fSetTaskRunning.addParameter( "task_id" , Types.INTEGER ); + this.fSetTaskRunning.addParameter( "running" , Types.BOOLEAN ); + + this.fScheduleTask = new StoredProc( dataSource , "sys" , "schedule_task" ); + this.fScheduleTask.addParameter( "admin_id" , Types.INTEGER ); + this.fScheduleTask.addParameter( "task_id" , Types.INTEGER ); + this.fScheduleTask.addParameter( "time_to_start" , Types.BIGINT ); + this.fScheduleTask.addOutput( "start_at" , Types.TIMESTAMP ); + } + + + private List< TickerTaskRecord > getDBTasks( ) + { + return this.tTemplate.execute( new TransactionCallback< List< TickerTaskRecord > >( ) { + @Override + public List< TickerTaskRecord > doInTransaction( TransactionStatus status ) + { + return dTemplate.query( "SELECT * FROM sys.ticker" , mTask ); + } + } ); + } + + + private void checkAutoStart( final TickerTaskRecord record ) + { + if ( record.getStatus( ).equals( "AUTO" ) ) { + Timestamp start = record.getTimestamp( ); + if ( start.before( new Date( ) ) ) { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + fSetTaskStarted.execute( record.getId( ) ); + } + } ); + record.setStatus( "RUNNING" ); + record.setTimestamp( null ); + } + } + } + + + private void setTaskRunning( final int administrator , final TickerTaskRecord record , final boolean running ) + { + this.tTemplate.execute( new TransactionCallbackWithoutResult( ) { + @Override + protected void doInTransactionWithoutResult( TransactionStatus status ) + { + fSetTaskRunning.execute( administrator , record.getId( ) , running ); + } + } ); + record.setStatus( running ? "RUNNING" : "STOPPED" ); + record.setTimestamp( null ); + } + + + @Override + public void afterPropertiesSet( ) + { + List< TickerTaskRecord > rTasks = this.getDBTasks( ); + for ( TickerTaskRecord task : rTasks ) { + this.tasks.put( task.getId( ) , task ); + this.taskIds.put( task.getName( ) , task.getId( ) ); + } + } + + + @Override + synchronized public List< TickerTaskInfo > getTasks( ) + { + List< TickerTaskInfo > result = new LinkedList< TickerTaskInfo >( ); + long now = new Date( ).getTime( ); + for ( Integer id : this.registered ) { + TickerTaskRecord record = this.tasks.get( id ); + this.checkAutoStart( record ); + + TickerTaskInfo info = new TickerTaskInfo( ); + info.setId( record.getId( ) ); + info.setName( record.getName( ) ); + info.setStatus( TickerTaskStatus.valueOf( record.getStatus( ) ) ); + if ( info.getStatus( ) == TickerTaskStatus.AUTO ) { + info.setStart( record.getTimestamp( ) ); + info.setTimeToStart( ( record.getTimestamp( ).getTime( ) - now ) / 1000 ); + } + result.add( info ); + } + return result; + } + + + @Override + synchronized public void startTask( int administrator , int id ) + { + TickerTaskRecord record = this.tasks.get( id ); + if ( record == null || record.getStatus( ).equals( "RUNNING" ) ) { + return; + } + this.setTaskRunning( administrator , record , true ); + } + + + @Override + synchronized public void stopTask( int administrator , int id ) + { + TickerTaskRecord record = this.tasks.get( id ); + if ( record == null || record.getStatus( ).equals( "STOPPED" ) ) { + return; + } + this.setTaskRunning( administrator , record , false ); + } + + + @Override + synchronized public void setTaskStart( final int administrator , final int id , final long time ) + { + if ( time <= 0 ) { + this.startTask( administrator , id ); + return; + } + + TickerTaskRecord record = this.tasks.get( id ); + if ( record == null ) { + return; + } + + Timestamp startAt = this.tTemplate.execute( new TransactionCallback< Timestamp >( ) { + @Override + public Timestamp doInTransaction( TransactionStatus status ) + { + return (Timestamp) fScheduleTask.execute( administrator , id , time ).get( "start_at" ); + } + } ); + record.setStatus( "AUTO" ); + record.setTimestamp( startAt ); + } + + + @Override + synchronized public int registerTask( final String name ) + { + Integer eId = this.taskIds.get( name ); + if ( eId != null ) { + this.registered.add( eId ); + return eId; + } + + // Register new task + eId = this.tTemplate.execute( new TransactionCallback< Integer >( ) { + @Override + public Integer doInTransaction( TransactionStatus status ) + { + return (Integer) fRegisterTask.execute( name ).get( "id" ); + } + } ); + + TickerTaskRecord record = new TickerTaskRecord( ); + record.setId( eId ); + record.setName( name ); + record.setStatus( "RUNNING" ); + record.setTimestamp( null ); + this.tasks.put( eId , record ); + this.taskIds.put( name , eId ); + + return eId; + } + + + @Override + synchronized public boolean isTaskRunning( int id ) + { + TickerTaskRecord record = this.tasks.get( id ); + this.checkAutoStart( record ); + return ( record.getStatus( ).equals( "RUNNING" ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTask.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTask.java new file mode 100644 index 0000000..2e33c6e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTask.java @@ -0,0 +1,312 @@ +package com.deepclone.lw.beans.sys; + + +import java.lang.ref.WeakReference; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.interfaces.eventlog.SystemLogger; + + + +/** + * Ticker task execution class. + * + *

+ * This class is responsible for both the execution and the control of ticker tasks. + * + * @author tseeker + */ +class TickerTask + extends Thread +{ + /** Possible states of a task execution thread. */ + private static enum State { + + /** The task thread is being initialised. */ + STARTING , + + /** The task thread is waiting for instructions */ + WAITING , + + /** The task is currently being executed */ + RUNNING , + + /** The task thread is exiting. */ + EXITING , + + /** The task thread is finished. */ + FINISHED + } + + /** Reference to the system logger */ + private final SystemLogger logger; + + /** Name of the task */ + private final String name; + + /** Weak reference to the task's code */ + private final WeakReference< Runnable > task; + + /** Lock used to protect the task thread's state */ + private final Lock lock = new ReentrantLock( ); + + /** Condition triggered whenever the thread's state changes */ + private final Condition stateChanged = this.lock.newCondition( ); + + /** The thread's current state */ + private State state = State.STARTING; + + + /** + * @param name + * the task's name + * @param task + * reference to the task's code + * @param logger + * system logger instance + */ + TickerTask( String name , Runnable task , SystemLogger logger ) + { + super( "Ticker thread for '" + name + "'" ); + this.name = name; + this.task = new WeakReference< Runnable >( task ); + this.logger = logger; + } + + + /** + * Starts the task execution thread. + * + *

+ * Starts the thread itself, then waits for the thread's state to change from its default + * {@link State#STARTING} value. + */ + @Override + public void start( ) + { + super.start( ); + this.lock.lock( ); + try { + State state = this.getTaskState( ); + while ( state == State.STARTING ) { + state = this.waitTaskState( ); + } + } finally { + this.lock.unlock( ); + } + } + + + /** + * Retrieves the task execution thread's state. + * + *

+ * This method retrieves the task execution thread's state, locking {@link #lock} to prevent + * concurrent access. + * + * @return the task execution thread's current state. + */ + private State getTaskState( ) + { + this.lock.lock( ); + try { + return this.state; + } finally { + this.lock.unlock( ); + } + } + + + /** + * Changes the task execution thread's state. + * + *

+ * This method modifies the thread's state, locking {@link #lock} to prevent concurrent access + * and triggering {@link #stateChanged} once it's done. + * + * @param newState + * the thread's new state. + */ + private void setTaskState( State newState ) + { + this.lock.lock( ); + try { + this.state = newState; + this.stateChanged.signal( ); + } finally { + this.lock.unlock( ); + } + } + + + /** + * Waits for a change of state. + * + *

+ * This method waits for the task's state to change using {@link #stateChanged}, then returns + * the new state. + * + * @return the task execution thread's new state. + */ + private State waitTaskState( ) + { + this.lock.lock( ); + try { + this.stateChanged.await( ); + return this.state; + } catch ( InterruptedException e ) { + return this.state; + } finally { + this.lock.unlock( ); + } + } + + + /** + * Task execution loop. + * + *

+ * This method makes sure that the task is executed every time the state is set to + * {@link State#RUNNING}, setting it to {@link State#WAITING} when it is inactive. + * + *

+ * If the thread's state is set to {@link State#EXITING}, or if the task code is no longer + * referenced, the method will exit, setting the state to {@link State#FINISHED}. + */ + @Override + public void run( ) + { + while ( true ) { + State state; + + this.lock.lock( ); + try { + if ( this.getTaskState( ) == State.EXITING ) { + break; + } + this.setTaskState( State.WAITING ); + state = this.waitTaskState( ); + } finally { + this.lock.unlock( ); + } + + if ( state == State.EXITING || !this.runTask( ) ) { + break; + } + } + this.setTaskState( State.FINISHED ); + } + + + /** + * Runs the task's code. + * + *

+ * This method runs the task's code, if it is still referenced. All exceptions will be caught + * and logged, but they will not affect the main loop. + * + * @return true if the task was still referenced, false if it wasn't. + */ + private boolean runTask( ) + { + Runnable task = this.task.get( ); + if ( task == null ) { + this.logger.log( LogLevel.INFO , "task '" + this.name + "' is no longer referenced, exiting" ) + .flush( ); + return false; + } + + try { + this.logger.log( LogLevel.TRACE , "task '" + this.name + "' started" ).flush( ); + task.run( ); + this.logger.log( LogLevel.TRACE , "task '" + this.name + "' ended" ).flush( ); + } catch ( Throwable t ) { + this.logger.log( LogLevel.ERROR , "task '" + this.name + "' failed due to exception" , t ).flush( ); + } + + return true; + } + + + /** + * Triggers the task's execution. + * + *

+ * This method attempts to trigger the task's execution. It will not do anything if the task + * thread is exiting or finished, but if the task is still running, a warning will be added to + * the log. + */ + void startTask( ) + { + this.lock.lock( ); + try { + State state = this.getTaskState( ); + if ( state == State.EXITING || state == State.FINISHED ) { + return; + } else if ( state == State.RUNNING ) { + this.logger.log( LogLevel.WARNING , "task '" + this.name + "' didn't manage to run in time" ) + .flush( ); + return; + } + this.setTaskState( State.RUNNING ); + } finally { + this.lock.unlock( ); + } + } + + + /** + * Terminates the task execution thread. + * + *

+ * This method shuts down the task execution thread, waiting until it has completed to return. + */ + void terminate( ) + { + this.lock.lock( ); + try { + State state = this.getTaskState( ); + while ( state != State.FINISHED ) { + this.setTaskState( State.EXITING ); + state = this.waitTaskState( ); + } + } finally { + this.lock.unlock( ); + } + this.logger.log( LogLevel.DEBUG , "task '" + this.name + "' terminated" ).flush( ); + } + + + /** + * Waits until the task is done running. + * + *

+ * This method waits until the task is no longer running. If the task is not running when the + * method is called, it will return immediately. + */ + void waitForTask( ) + { + this.lock.lock( ); + try { + State state = this.getTaskState( ); + while ( state == State.RUNNING ) { + state = this.waitTaskState( ); + } + } finally { + this.lock.unlock( ); + } + } + + + /** + * @return true if the task execution thread is no longer running, + * false otherwise. + */ + boolean isFinished( ) + { + return ( this.getTaskState( ) == State.FINISHED ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTaskStatusHandler.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTaskStatusHandler.java new file mode 100644 index 0000000..19774e4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerTaskStatusHandler.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.beans.sys; + + +public interface TickerTaskStatusHandler +{ + + public int registerTask( String name ); + + + public boolean isTaskRunning( int id ); + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerThread.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerThread.java new file mode 100644 index 0000000..db5d273 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/java/com/deepclone/lw/beans/sys/TickerThread.java @@ -0,0 +1,251 @@ +package com.deepclone.lw.beans.sys; + + +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import com.deepclone.lw.interfaces.eventlog.SystemLogger; +import com.deepclone.lw.interfaces.sys.ConstantsUser; +import com.deepclone.lw.interfaces.sys.Ticker; + + + +/** + * Main ticker control thread. + * + *

+ * This class implements the ticker bean's main control thread, executed through a Java + * {@link Timer} instance. It supports changing the timer's period when the ticker.interval + * constant is modified, and includes the code that pauses or reactivates the ticker. + * + * @author tseeker + */ +class TickerThread + implements ConstantsUser +{ + private static class TaskStat + { + public final int id; + public final TickerTask task; + public final int modulo; + public int counter = 0; + + + public TaskStat( int id , TickerTask task , int modulo ) + { + this.id = id; + this.task = task; + this.task.start( ); + this.modulo = modulo; + } + + } + + private Timer timer; + + private long interval = 0; + + private boolean paused = false; + + private int taskIndex = 0; + + private int nTasks = 0; + + private TaskStat[] tasks; + + private TickerTaskStatusHandler handler; + + private SystemLogger logger; + + + TickerThread( SystemLogger logger , TickerTaskStatusHandler handler ) + { + this.timer = null; + this.tasks = new TaskStat[ 5 ]; + this.handler = handler; + this.logger = logger; + } + + + synchronized private void runTasks( ) + { + if ( this.paused ) { + return; + } + this.taskIndex = ( this.taskIndex + 1 ) % this.tasks.length; + + TaskStat toExecute = this.tasks[ this.taskIndex ]; + if ( toExecute == null || !this.handler.isTaskRunning( toExecute.id ) ) { + return; + } + + toExecute.counter = ( toExecute.counter + 1 ) % toExecute.modulo; + if ( toExecute.counter != 0 ) { + return; + } + + if ( toExecute.task.isFinished( ) ) { + this.tasks[ this.taskIndex ] = null; + this.nTasks--; + return; + } + + toExecute.task.startTask( ); + } + + + /** + * Updates the ticker's frequency. + * + *

+ * When the ticker.interval constant is changed, this method will cancel the current + * scheduling and re-start it using the new interval. + */ + @Override + synchronized public void setConstants( boolean initial , Map< String , Double > values ) + { + this.interval = Math.round( values.get( "ticker.interval" ) ); + this.reschedule( ); + } + + + private void reschedule( ) + { + if ( this.interval == 0 ) { + return; + } + + if ( this.timer != null ) { + this.timer.cancel( ); + } + + TimerTask task = new TimerTask( ) { + @Override + public void run( ) + { + runTasks( ); + } + }; + + this.timer = new Timer( "Main ticker thread" ); + this.timer.scheduleAtFixedRate( task , 1 , this.interval / this.tasks.length ); + } + + + synchronized void registerTask( int id , Ticker.Frequency frequency , String name , Runnable task ) + { + if ( this.nTasks == this.tasks.length ) { + TaskStat[] nState = new TaskStat[ this.tasks.length * 2 ]; + for ( int i = 0 ; i < this.tasks.length ; i++ ) { + nState[ i * 2 ] = this.tasks[ i ]; + } + this.taskIndex *= 2; + this.tasks = nState; + this.reschedule( ); + } + + int modulo; + switch ( frequency ) { + case HIGH: + modulo = 1; + break; + case LOW: + modulo = 30; + break; + case MEDIUM: + modulo = 6; + break; + case MINUTE: + modulo = 12; + break; + default: + throw new RuntimeException( "Invalid timer frequency " + frequency ); + } + + for ( int i = 0 ; i < this.tasks.length ; i++ ) { + if ( this.tasks[ i ] == null ) { + this.tasks[ i ] = new TaskStat( id , new TickerTask( name , task , this.logger ) , modulo ); + break; + } + } + this.nTasks ++; + } + + + /** + * Pauses the ticker. + * + *

+ * This method implements the bean's pause method. If the ticker is not already paused, it will + * set the {@link #paused} flag, then wait for all running tasks to complete. + * + * @throws IllegalStateException + * if the ticker is already paused. + */ + synchronized void pause( ) + throws IllegalStateException + { + if ( this.paused ) { + throw new IllegalStateException( "already paused" ); + } + this.paused = true; + for ( int i = 0 ; i < this.tasks.length ; i++ ) { + TaskStat ts = this.tasks[ i ]; + if ( ts == null ) { + continue; + } + if ( ts.task.isFinished( ) ) { + this.tasks[ i ] = null; + this.nTasks--; + continue; + } + ts.task.waitForTask( ); + } + } + + + /** + * Restarts the ticker after it's been paused. + * + * @throws IllegalStateException + * if the ticker was not paused. + */ + synchronized void unpause( ) + throws IllegalStateException + { + if ( !this.paused ) { + throw new IllegalStateException( "not paused" ); + } + this.paused = false; + } + + + /** + * Terminates all tasks in all task sets, then stops the timer. + */ + synchronized void terminate( ) + { + for ( TaskStat ts : this.tasks ) { + if ( ts == null ) { + continue; + } + ts.task.terminate( ); + } + this.nTasks = 0; + this.tasks = new TaskStat[ 5 ]; + if ( this.timer != null ) { + this.timer.cancel( ); + } + } + + + /** + * @return true the ticker is currently running or false if it has + * been paused. + */ + synchronized boolean isActive( ) + { + return !this.paused; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system-beans.xml new file mode 100644 index 0000000..7d0a16e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system-beans.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-manager-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-manager-bean.xml new file mode 100644 index 0000000..3603ae6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-manager-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-registrar-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-registrar-bean.xml new file mode 100644 index 0000000..3fa577d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/constants-registrar-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/session-manager-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/session-manager-bean.xml new file mode 100644 index 0000000..dcddd03 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/session-manager-bean.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/system-status-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/system-status-bean.xml new file mode 100644 index 0000000..f8b97f4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/system-status-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/ticker-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/ticker-bean.xml new file mode 100644 index 0000000..894c846 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-system/src/main/resources/configuration/system/ticker-bean.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.classpath b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.project b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.project new file mode 100644 index 0000000..b2adbb1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-beans-user + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..ce751ed --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Wed Apr 14 12:43:45 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..6b7d8f9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Wed Apr 14 12:43:44 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/pom.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/pom.xml new file mode 100644 index 0000000..0de863a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + legacyworlds-server-beans + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans-user + 5.99.1 + Legacy Worlds server - user actions + This module defines beans and classes that handle user actions. + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ObjectNameValidatorBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ObjectNameValidatorBean.java new file mode 100644 index 0000000..cd3bcff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ObjectNameValidatorBean.java @@ -0,0 +1,77 @@ +package com.deepclone.lw.beans.user; + + +import java.util.regex.Pattern; + +import com.deepclone.lw.cmd.ObjectNameError; + + + +public class ObjectNameValidatorBean +{ + + private int minLength = 2; + private int maxLength = 20; + + private static Pattern fail[] = { + Pattern.compile( "\\s\\s+" ) , + Pattern.compile( "[^A-Za-z0-9 _\\'\\!\\:\\,\\-\\.\\*@\\[\\]\\{\\}]" ) + }; + + private static Pattern needed[] = { + Pattern.compile( "[A-Za-z]" ) + }; + + + public void setMinLength( Integer v ) + { + this.minLength = v; + } + + + public void setMaxLength( Integer v ) + { + this.maxLength = v; + } + + + public ObjectNameError validate( String name ) + { + return this.customValidate( name , this.minLength , this.maxLength ); + } + + + public ObjectNameError customValidate( String name , int minLength , int maxLength ) + { + if ( "".equals( name.trim( ) ) ) { + return ObjectNameError.EMPTY; + } + + // No leading or trailing spaces + if ( !name.equals( name.trim( ) ) ) { + return ObjectNameError.INVALID; + } + + // Check length + int length = name.length( ); + if ( length < minLength || length > maxLength ) { + return ObjectNameError.INVALID; + } + + // Check bad patterns + for ( Pattern p : ObjectNameValidatorBean.fail ) { + if ( p.matcher( name ).find( ) ) { + return ObjectNameError.INVALID; + } + } + + // Check good patterns + for ( Pattern p : ObjectNameValidatorBean.needed ) { + if ( !p.matcher( name ).find( ) ) { + return ObjectNameError.INVALID; + } + } + + return null; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredCommandDelegate.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredCommandDelegate.java new file mode 100644 index 0000000..f412cb9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredCommandDelegate.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.beans.user.abst; + + +public interface AutowiredCommandDelegate + extends SessionCommandDelegate +{ + + public Class< ? extends SessionCommandHandler > getCommandHandler( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredSubTypeDelegate.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredSubTypeDelegate.java new file mode 100644 index 0000000..fdb4455 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/AutowiredSubTypeDelegate.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.beans.user.abst; + + +public interface AutowiredSubTypeDelegate + extends SessionSubTypeDelegate +{ + + public Class< ? extends StatefulSessionTypeDefiner > getSessionType( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandDelegate.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandDelegate.java new file mode 100644 index 0000000..67f4e40 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandDelegate.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.beans.user.abst; + + +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public interface SessionCommandDelegate +{ + + public Class< ? extends Command > getType( ); + + + public CommandResponse execute( ServerSession session , Command command ); + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandHandler.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandHandler.java new file mode 100644 index 0000000..7be021d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandHandler.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.beans.user.abst; + + +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; + + + +public abstract class SessionCommandHandler +{ + + private Map< Class< ? extends Command > , SessionCommandDelegate > commands = new HashMap< Class< ? extends Command > , SessionCommandDelegate >( ); + + + public final void registerCommandDelegate( SessionCommandDelegate delegate ) + { + synchronized ( this.commands ) { + this.commands.put( delegate.getType( ) , delegate ); + } + } + + + protected final CommandResponse executeDelegate( ServerSession session , Command command ) + throws SessionCommandException + { + SessionCommandDelegate delegate; + synchronized ( this.commands ) { + delegate = this.commands.get( command.getClass( ) ); + } + if ( delegate == null ) { + throw new SessionCommandException( command.getClass( ).getCanonicalName( ) ); + } + return delegate.execute( session , command ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandWiringBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandWiringBean.java new file mode 100644 index 0000000..2d4013e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionCommandWiringBean.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.beans.user.abst; + + +import java.util.Collection; + +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + + + +public class SessionCommandWiringBean + implements BeanPostProcessor , ApplicationContextAware +{ + private final Logger logger = Logger.getLogger( SessionCommandWiringBean.class ); + private ApplicationContext context; + + + @Override + public void setApplicationContext( ApplicationContext applicationContext ) + throws BeansException + { + this.context = applicationContext; + } + + + @Override + public Object postProcessAfterInitialization( Object bean , String beanName ) + throws BeansException + { + return bean; + } + + + @Override + public Object postProcessBeforeInitialization( Object bean , String beanName ) + throws BeansException + { + if ( bean instanceof SessionCommandHandler ) { + this.logger.debug( "Wiring command handler " + beanName ); + this.autowire( (SessionCommandHandler) bean ); + } + return bean; + } + + + private void autowire( SessionCommandHandler bean ) + { + Class< ? extends SessionCommandHandler > beanType = bean.getClass( ); + + Collection< AutowiredCommandDelegate > delegates; + delegates = this.context.getBeansOfType( AutowiredCommandDelegate.class ).values( ); + + for ( AutowiredCommandDelegate delegate : delegates ) { + if ( delegate.getCommandHandler( ) != beanType ) { + continue; + } + this.logger.debug( "Adding delegate from " + delegate.getClass( ) ); + bean.registerCommandDelegate( delegate ); + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeDelegate.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeDelegate.java new file mode 100644 index 0000000..2d62372 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeDelegate.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.beans.user.abst; + + +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; + + + +public interface SessionSubTypeDelegate +{ + + public String getName( ); + + + public CommandResponse execute( ServerSession session , Command command ) + throws SessionCommandException; + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeWiringBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeWiringBean.java new file mode 100644 index 0000000..d4b88e2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/SessionSubTypeWiringBean.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.beans.user.abst; + + +import java.util.Collection; + +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + + + +public class SessionSubTypeWiringBean + implements BeanPostProcessor , ApplicationContextAware +{ + private final Logger logger = Logger.getLogger( SessionSubTypeWiringBean.class ); + private ApplicationContext context; + + + @Override + public void setApplicationContext( ApplicationContext applicationContext ) + throws BeansException + { + this.context = applicationContext; + } + + + @Override + public Object postProcessAfterInitialization( Object bean , String beanName ) + throws BeansException + { + return bean; + } + + + @Override + public Object postProcessBeforeInitialization( Object bean , String beanName ) + throws BeansException + { + if ( bean instanceof StatefulSessionTypeDefiner ) { + this.logger.debug( "Wiring session type definer " + beanName ); + this.autowire( (StatefulSessionTypeDefiner) bean ); + } + return bean; + } + + + private void autowire( StatefulSessionTypeDefiner bean ) + { + Class< ? extends StatefulSessionTypeDefiner > beanType = bean.getClass( ); + + Collection< AutowiredSubTypeDelegate > delegates; + delegates = this.context.getBeansOfType( AutowiredSubTypeDelegate.class ).values( ); + + for ( AutowiredSubTypeDelegate delegate : delegates ) { + if ( delegate.getSessionType( ) != beanType ) { + continue; + } + this.logger.debug( "Adding delegate from " + delegate.getClass( ) ); + bean.registerSubType( delegate ); + } + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/StatefulSessionTypeDefiner.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/StatefulSessionTypeDefiner.java new file mode 100644 index 0000000..f544884 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/abst/StatefulSessionTypeDefiner.java @@ -0,0 +1,129 @@ +package com.deepclone.lw.beans.user.abst; + + +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.session.SessionTypeDefiner; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionStateException; + + + +public abstract class StatefulSessionTypeDefiner + implements SessionTypeDefiner +{ + + private SessionSubTypeDelegate commonDelegate = null; + + private Map< String , SessionSubTypeDelegate > subTypes = new HashMap< String , SessionSubTypeDelegate >( ); + + + protected abstract String initAuthToken( ServerSession session , String identifier , String sha1Hash , + String md5Hash ); + + + protected abstract String getSessionType( ServerSession session ); + + + protected final String getAuthToken( ServerSession session ) + { + return session.get( "authenticationToken" , String.class ); + } + + + public final void registerSubType( SessionSubTypeDelegate delegate ) + { + String name = delegate.getName( ); + synchronized ( this.subTypes ) { + if ( name == null ) { + this.commonDelegate = delegate; + } else { + this.subTypes.put( delegate.getName( ) , delegate ); + } + } + } + + + private String updateSessionType( ServerSession session ) + { + String type = this.getSessionType( session ); + session.put( "sessionState" , type ); + return type; + } + + + @Override + public final String getState( ServerSession session ) + { + return session.get( "sessionState" , String.class ); + } + + + @Override + public final void authenticate( ServerSession session , String identifier , String sha1Hash , String md5Hash ) + throws SessionStateException + { + if ( this.isAuthenticated( session ) ) { + throw new SessionStateException( ); + } + + String token = this.initAuthToken( session , identifier , sha1Hash , md5Hash ); + if ( token == null ) { + return; + } + session.put( "authenticationToken" , token ); + this.updateSessionType( session ); + } + + + @Override + public final boolean isAuthenticated( ServerSession session ) + { + return ( this.getAuthToken( session ) != null ); + } + + + @Override + public final CommandResponse execute( ServerSession session , Command command ) + throws SessionStateException , SessionCommandException + { + if ( !this.isAuthenticated( session ) ) { + throw new SessionStateException( ); + } + + String type = this.updateSessionType( session ); + SessionSubTypeDelegate delegate; + SessionSubTypeDelegate fallback; + synchronized ( this.subTypes ) { + delegate = this.subTypes.get( type ); + fallback = this.commonDelegate; + } + if ( delegate == null ) { + if ( fallback == null ) { + throw new SessionStateException( ); + } else { + delegate = fallback; + fallback = null; + } + } + + CommandResponse response; + try { + response = delegate.execute( session , command ); + } catch ( SessionCommandException e ) { + if ( fallback != null ) { + response = fallback.execute( session , command ); + } else { + throw e; + } + } + + this.updateSessionType( session ); + return response; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionDefinerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionDefinerBean.java new file mode 100644 index 0000000..ee3df68 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionDefinerBean.java @@ -0,0 +1,98 @@ +package com.deepclone.lw.beans.user.admin; + + +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.StatefulSessionTypeDefiner; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.session.SessionManager; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.utils.EmailAddress; + + + +public class AdminSessionDefinerBean + extends StatefulSessionTypeDefiner +{ + private Administration administration; + + + @Autowired( required = true ) + public void setSessionManager( SessionManager manager ) + { + manager.registerSessionType( this ); + } + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public String getName( ) + { + return "admin"; + } + + + @Override + public void initialise( ServerSession session ) + { + // EMPTY + } + + + @Override + protected String initAuthToken( ServerSession session , String identifier , String sha1Hash , String md5Hash ) + { + EmailAddress address = new EmailAddress( identifier ); + if ( !address.isValid( ) ) { + return null; + } + + AdminRecord admin = this.administration.login( address , session.getChallenge( ) , sha1Hash , md5Hash , session + .getAddress( ) ); + if ( admin == null ) { + return null; + } + + session.setExpirationDate( new Date( new Date( ).getTime( ) + 600000L ) ); + return ( (Integer) admin.getId( ) ).toString( ); + } + + + @Override + protected String getSessionType( ServerSession session ) + { + int adminId = Integer.parseInt( session.get( "authenticationToken" , String.class ) ); + AdminRecord admin = this.administration.getAdmin( adminId ); + session.put( "admin" , admin ); + + // Administrator has been disabled + if ( !admin.isActive( ) ) { + session.terminate( SessionTerminationType.GONE ); + return null; + } + + return ( admin.getPassChangeRequired( ) ? "pass" : "main" ); + } + + + @Override + public void terminate( ServerSession session , SessionTerminationType reason ) + { + String authToken = session.get( "authenticationToken" , String.class ); + if ( authToken != null ) { + int adminId = Integer.parseInt( session.get( "authenticationToken" , String.class ) ); + this.administration.logout( adminId ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionSubType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionSubType.java new file mode 100644 index 0000000..95f9a7f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/AdminSessionSubType.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.beans.user.admin; + + +import java.util.Date; + +import com.deepclone.lw.beans.user.abst.AutowiredSubTypeDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.abst.StatefulSessionTypeDefiner; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; + + + +public abstract class AdminSessionSubType + extends SessionCommandHandler + implements AutowiredSubTypeDelegate +{ + + @Override + public Class< ? extends StatefulSessionTypeDefiner > getSessionType( ) + { + return AdminSessionDefinerBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + throws SessionCommandException + { + session.setExpirationDate( new Date( new Date( ).getTime( ) + 1800000L ) ); + return this.executeDelegate( session , command ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/AdminOperation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/AdminOperation.java new file mode 100644 index 0000000..75f3790 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/AdminOperation.java @@ -0,0 +1,29 @@ +package com.deepclone.lw.beans.user.admin.common; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public abstract class AdminOperation +{ + + protected Administrator getAdministrator( ServerSession session ) + { + return this.convertAdministrator( session.get( "admin" , AdminRecord.class ) ); + } + + + protected Administrator convertAdministrator( AdminRecord record ) + { + Administrator admin = new Administrator( ); + admin.setId( record.getId( ) ); + admin.setAddress( record.getAddress( ) ); + admin.setName( record.getName( ) ); + admin.setPrivileges( record.getPrivileges( ) ); + admin.setPasswordChange( record.getPassChangeRequired( ) ); + return admin; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CommonCommandsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CommonCommandsBean.java new file mode 100644 index 0000000..834735e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CommonCommandsBean.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.beans.user.admin.common; + + +import com.deepclone.lw.beans.user.admin.AdminSessionSubType; + + + +public class CommonCommandsBean + extends AdminSessionSubType +{ + + @Override + public String getName( ) + { + return null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CreateAuthChallengeCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CreateAuthChallengeCommandDelegateBean.java new file mode 100644 index 0000000..4141e01 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/CreateAuthChallengeCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.admin.common; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.CreateAuthChallengeCommand; +import com.deepclone.lw.cmd.CreateAuthChallengeResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.RandomStringGenerator; + + + +public class CreateAuthChallengeCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private RandomStringGenerator challengeGenerator; + + + @Autowired( required = true ) + @Qualifier( "authChallenges" ) + public void setChallangeGenerator( RandomStringGenerator rsg ) + { + this.challengeGenerator = rsg; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return CommonCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CreateAuthChallengeCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + String challenge = this.challengeGenerator.generate( ); + session.put( "tempChallenge" , challenge ); + return new CreateAuthChallengeResponse( challenge ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/NoOperationCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/NoOperationCommandDelegateBean.java new file mode 100644 index 0000000..200f846 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/NoOperationCommandDelegateBean.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.beans.user.admin.common; + + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.NoOperationCommand; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class NoOperationCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return CommonCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return NoOperationCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + NoOperationCommand command = (NoOperationCommand) cParam; + Administrator admin = this.getAdministrator( session ); + + Privileges priv = command.getRequirePrivilege( ); + AdminResponse response; + if ( priv == null ) { + response = new AdminResponse( admin ); + } else { + response = new AdminResponse( admin , admin.hasPrivilege( priv ) ); + } + + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/SetPasswordCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/SetPasswordCommandDelegateBean.java new file mode 100644 index 0000000..d85a0a1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/common/SetPasswordCommandDelegateBean.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.user.admin.common; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.admin.SetPasswordCommand; +import com.deepclone.lw.cmd.admin.SetPasswordResponse; +import com.deepclone.lw.cmd.admin.SetPasswordResponse.PasswordChangeStatus; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.interfaces.acm.PasswordProhibitedException; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.Password; + + + +public class SetPasswordCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private Administration administration; + private int minPasswordStrength = 20; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + public void setMinPasswordStrength( int strength ) + { + this.minPasswordStrength = strength; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return CommonCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetPasswordCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + SetPasswordCommand command = (SetPasswordCommand) cParam; + + String challenge = session.get( "tempChallenge" , String.class ); + session.put( "tempChallenge" , null ); + + PasswordChangeStatus status = PasswordChangeStatus.OK; + Password pwd = null; + if ( "".equals( command.getPassword( ) ) ) { + status = PasswordChangeStatus.EMPTY; + } else if ( !command.getPassword( ).equals( command.getPasswordConfirm( ) ) ) { + status = PasswordChangeStatus.MISMATCH; + } else { + pwd = new Password( command.getPassword( ) ); + if ( pwd.getStrength( ) < this.minPasswordStrength ) { + status = PasswordChangeStatus.TOO_WEAK; + } + } + + boolean authError; + if ( status == PasswordChangeStatus.OK ) { + try { + authError = !this.administration.setPassword( admin.getId( ) , challenge , command.getSha1Auth( ) , + command.getMd5Auth( ) , pwd ); + } catch ( PasswordProhibitedException e ) { + authError = false; + status = PasswordChangeStatus.PROHIBITED; + } + } else { + authError = false; + } + + if ( !authError && status == PasswordChangeStatus.OK ) { + return new SetPasswordResponse( ); + } + return new SetPasswordResponse( admin , authError , status ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminCommandsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminCommandsBean.java new file mode 100644 index 0000000..ea3eaff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminCommandsBean.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.beans.user.admin.main; + + +import com.deepclone.lw.beans.user.admin.AdminSessionSubType; + + + +public class AdminCommandsBean + extends AdminSessionSubType +{ + + @Override + public String getName( ) + { + return "main"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminOverviewCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminOverviewCommandDelegateBean.java new file mode 100644 index 0000000..098b55a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/AdminOverviewCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.admin.main; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.cmd.admin.AdminOverviewCommand; +import com.deepclone.lw.cmd.admin.AdminOverviewResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class AdminOverviewCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AdminOverviewCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + AdminOverviewResponse response = this.administration.getOverview( admin ); + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/BansSummaryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/BansSummaryCommandDelegateBean.java new file mode 100644 index 0000000..481f45b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/BansSummaryCommandDelegateBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.BansSummaryCommand; +import com.deepclone.lw.cmd.admin.bans.BansSummaryResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class BansSummaryCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return BansSummaryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new BansSummaryResponse( admin ); + } + return this.administration.getBansSummary( admin ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ConfirmBanCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ConfirmBanCommandDelegateBean.java new file mode 100644 index 0000000..541ad4e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ConfirmBanCommandDelegateBean.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.ConfirmBanCommand; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ConfirmBanCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ConfirmBanCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new NullResponse( ); + } + + this.administration.confirmBan( admin , ( (ConfirmBanCommand) command ).getId( ) ); + + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/LiftBanCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/LiftBanCommandDelegateBean.java new file mode 100644 index 0000000..dff587b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/LiftBanCommandDelegateBean.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.LiftBanCommand; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class LiftBanCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return LiftBanCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new NullResponse( ); + } + + this.administration.liftBan( admin , ( (LiftBanCommand) command ).getId( ) ); + + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ListBansCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ListBansCommandDelegateBean.java new file mode 100644 index 0000000..a326981 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/ListBansCommandDelegateBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.ListBansCommand; +import com.deepclone.lw.cmd.admin.bans.ListBansResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListBansCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListBansCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new ListBansResponse( admin ); + } + return this.administration.getBans( admin , ( (ListBansCommand) command ).getType( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RejectBanCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RejectBanCommandDelegateBean.java new file mode 100644 index 0000000..6048211 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RejectBanCommandDelegateBean.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.RejectBanCommand; +import com.deepclone.lw.cmd.admin.bans.RejectBanResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class RejectBanCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RejectBanCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new RejectBanResponse( admin , true ); + } + + RejectBanCommand command = (RejectBanCommand) cParam; + int id = command.getId( ); + String reason = command.getReason( ).trim( ); + + if ( "".equals( reason ) ) { + return new RejectBanResponse( admin , id ); + } + + this.administration.rejectBan( admin , id , reason ); + return new RejectBanResponse( admin , false ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RequestBanCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RequestBanCommandDelegateBean.java new file mode 100644 index 0000000..0b6c1a5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bans/RequestBanCommandDelegateBean.java @@ -0,0 +1,72 @@ +package com.deepclone.lw.beans.user.admin.main.bans; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.RequestBanCommand; +import com.deepclone.lw.cmd.admin.bans.RequestBanResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class RequestBanCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RequestBanCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BANH ) ) { + return new RequestBanResponse( admin , true ); + } + + RequestBanCommand command = (RequestBanCommand) cParam; + String user = command.getUser( ).trim( ); + boolean empire = command.isEmpire( ); + String reason = command.getReason( ).trim( ); + + if ( "".equals( reason ) ) { + return new RequestBanResponse( admin , RequestBanResponse.Error.NO_REASON , user , empire , reason ); + } else if ( "".equals( user ) ) { + return new RequestBanResponse( admin , RequestBanResponse.Error.NOT_FOUND , user , empire , reason ); + } + + return this.administration.requestBan( admin , user , empire , reason ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/BugsSummaryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/BugsSummaryCommandDelegateBean.java new file mode 100644 index 0000000..3549c80 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/BugsSummaryCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.BugsSummaryCommand; +import com.deepclone.lw.cmd.admin.bt.BugsSummaryResponse; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class BugsSummaryCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return BugsSummaryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new BugsSummaryResponse( admin ); + } + return this.bugs.getSummary( admin ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/GetSnapshotCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/GetSnapshotCommandDelegateBean.java new file mode 100644 index 0000000..cc8eb91 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/GetSnapshotCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.GetSnapshotCommand; +import com.deepclone.lw.cmd.admin.bt.GetSnapshotResponse; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetSnapshotCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetSnapshotCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new GetSnapshotResponse( admin , true ); + } + long id = ( (GetSnapshotCommand) cParam ).getBugId( ); + return this.bugs.getSnapshot( admin , id ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ListBugsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ListBugsCommandDelegateBean.java new file mode 100644 index 0000000..4afcb43 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ListBugsCommandDelegateBean.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ListBugsResponse; +import com.deepclone.lw.cmd.bt.ListBugsCommand; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListBugsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListBugsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new ListBugsResponse( admin ); + } + + ListBugsCommand command = (ListBugsCommand) cParam; + long first = command.getFirst( ); + int count = command.getCount( ); + BugStatus status = command.getStatus( ); + boolean own = command.isOwnOnly( ); + + return this.bugs.getBugs( admin , status , own , first , count ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/MergeReportsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/MergeReportsCommandDelegateBean.java new file mode 100644 index 0000000..a81ccbc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/MergeReportsCommandDelegateBean.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.MergeReportsCommand; +import com.deepclone.lw.cmd.admin.bt.MergeReportsResponse; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class MergeReportsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MergeReportsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new MergeReportsResponse( admin , true ); + } + + long id = ( (MergeReportsCommand) command ).getId1( ); + long mergeId = ( (MergeReportsCommand) command ).getId2( ); + + return this.bugs.mergeReports( admin , id , mergeId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ModerateCommentCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ModerateCommentCommandDelegateBean.java new file mode 100644 index 0000000..21abb94 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ModerateCommentCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ModerateCommentCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ModerateCommentCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ModerateCommentCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.BUGT ) ) { + ModerateCommentCommand mc = (ModerateCommentCommand) command; + this.bugs.moderateComment( admin , mc.getId( ) , mc.isValidation( ) ); + } + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/PostCommentCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/PostCommentCommandDelegateBean.java new file mode 100644 index 0000000..e58f6ea --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/PostCommentCommandDelegateBean.java @@ -0,0 +1,85 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.bt.PostCommentCommand; +import com.deepclone.lw.cmd.admin.bt.PostCommentResponse; +import com.deepclone.lw.cmd.admin.bt.ViewBugResponse; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class PostCommentCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return PostCommentCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new PostCommentResponse( admin , true ); + } + + long id = ( (PostCommentCommand) command ).getId( ); + String comment = ( (PostCommentCommand) command ).getComment( ).trim( ); + boolean pComment = ( (PostCommentCommand) command ).isPublicComment( ); + + ObjectNameError error; + if ( "".equals( comment ) ) { + error = ObjectNameError.EMPTY; + } else if ( comment.length( ) < 30 ) { + error = ObjectNameError.INVALID; + } else { + error = null; + } + + if ( error != null ) { + ViewBugResponse response = this.bugs.getReport( admin , id ); + if ( response.getReport( ) == null ) { + return new PostCommentResponse( admin , false ); + } + return new PostCommentResponse( admin , response.getReport( ) , response.getEvents( ) , error , comment , + pComment ); + } + + PostCommentResponse response = this.bugs.postComment( admin , id , comment , pComment ); + return response; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportBugCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportBugCommandDelegateBean.java new file mode 100644 index 0000000..af6a0be --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportBugCommandDelegateBean.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ReportBugResponse; +import com.deepclone.lw.cmd.bt.ReportBugCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ReportBugCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReportBugCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new ReportBugResponse( admin ); + } + + ReportBugCommand command = (ReportBugCommand) cParam; + String title = command.getTitle( ).trim( ); + String desc = command.getDescription( ).trim( ); + boolean isPublic = command.isPublicReport( ); + + ObjectNameError titleError; + if ( "".equals( title ) ) { + titleError = ObjectNameError.EMPTY; + } else if ( title.length( ) < 10 || title.length( ) > 127 ) { + titleError = ObjectNameError.INVALID; + } else { + titleError = null; + } + + ObjectNameError descError; + if ( "".equals( desc ) ) { + descError = ObjectNameError.EMPTY; + } else if ( desc.length( ) < 30 ) { + descError = ObjectNameError.INVALID; + } else { + descError = null; + } + + if ( descError != null || titleError != null ) { + return new ReportBugResponse( admin , titleError , title , descError , desc , isPublic ); + } + + return this.bugs.postReport( admin , title , desc , isPublic ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportStatusCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportStatusCommandDelegateBean.java new file mode 100644 index 0000000..c543668 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportStatusCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ReportStatusCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ReportStatusCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReportStatusCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.BUGT ) ) { + ReportStatusCommand rs = (ReportStatusCommand) command; + this.bugs.setStatus( admin , rs.getId( ) , rs.getStatus( ) ); + } + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportVisibilityCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportVisibilityCommandDelegateBean.java new file mode 100644 index 0000000..b3c191a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ReportVisibilityCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ReportVisibilityCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ReportVisibilityCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReportVisibilityCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.BUGT ) ) { + ReportVisibilityCommand rs = (ReportVisibilityCommand) command; + this.bugs.toggleVisibility( admin , rs.getId( ) ); + } + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ValidateReportCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ValidateReportCommandDelegateBean.java new file mode 100644 index 0000000..13c646b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ValidateReportCommandDelegateBean.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ValidateReportCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ValidateReportCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ValidateReportCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.BUGT ) ) { + ValidateReportCommand vr = (ValidateReportCommand) command; + int creds = vr.getGrantCredits( ); + if ( creds < 0 ) { + creds = 0; + } else if ( creds > 3 ) { + creds = 3; + } + this.bugs.validateReport( admin , vr.getId( ) , vr.getStatus( ) , vr.isPublicReport( ) , creds , vr + .isSnapshot( ) ); + } + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ViewBugCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ViewBugCommandDelegateBean.java new file mode 100644 index 0000000..ee536dd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/bt/ViewBugCommandDelegateBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.user.admin.main.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.ViewBugResponse; +import com.deepclone.lw.cmd.bt.ViewBugCommand; +import com.deepclone.lw.interfaces.bt.AdminBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewBugCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminBugs bugs; + + + @Autowired( required = true ) + public void setBugs( AdminBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewBugCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.BUGT ) ) { + return new ViewBugResponse( admin , true ); + } + + long id = ( (ViewBugCommand) command ).getId( ); + return this.bugs.getReport( admin , id ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/GetConstantsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/GetConstantsCommandDelegateBean.java new file mode 100644 index 0000000..a210352 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/GetConstantsCommandDelegateBean.java @@ -0,0 +1,84 @@ +package com.deepclone.lw.beans.user.admin.main.cnst; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.constants.Category; +import com.deepclone.lw.cmd.admin.constants.Definition; +import com.deepclone.lw.cmd.admin.constants.GetConstantsCommand; +import com.deepclone.lw.cmd.admin.constants.GetConstantsResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsAdministration; +import com.deepclone.lw.interfaces.sys.ConstantsManager; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetConstantsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private ConstantsManager constants; + + + @Autowired( required = true ) + public void setConstants( ConstantsManager constants ) + { + this.constants = constants; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetConstantsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.CNST ) ) { + return new GetConstantsResponse( admin ); + } + + ConstantsAdministration cAdmin = this.constants.getAdminSession( admin.getId( ) ); + List< Category > cats = new LinkedList< Category >( ); + for ( String cName : cAdmin.getCategories( ) ) { + List< Definition > defs = new LinkedList< Definition >( ); + for ( ConstantDefinition cnst : cAdmin.getConstants( cName ) ) { + Definition def = new Definition( ); + def.setName( cnst.name ); + def.setDescription( cnst.description ); + def.setValue( cnst.defaultValue ); + def.setMinValue( cnst.minValue ); + def.setMaxValue( cnst.maxValue ); + defs.add( def ); + } + + cats.add( new Category( cName , defs ) ); + } + + return new GetConstantsResponse( admin , cats ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/SetConstantCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/SetConstantCommandDelegateBean.java new file mode 100644 index 0000000..e5f27fd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/cnst/SetConstantCommandDelegateBean.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.user.admin.main.cnst; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.constants.Category; +import com.deepclone.lw.cmd.admin.constants.Definition; +import com.deepclone.lw.cmd.admin.constants.SetConstantCommand; +import com.deepclone.lw.cmd.admin.constants.SetConstantResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.ConstantDefinition; +import com.deepclone.lw.interfaces.sys.ConstantsAdministration; +import com.deepclone.lw.interfaces.sys.ConstantsManager; +import com.deepclone.lw.interfaces.sys.InvalidConstantValue; +import com.deepclone.lw.interfaces.sys.UnknownConstantError; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class SetConstantCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private ConstantsManager constants; + + + @Autowired( required = true ) + public void setConstants( ConstantsManager constants ) + { + this.constants = constants; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetConstantCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.CNST ) ) { + return new SetConstantResponse( admin , true ); + } + + ConstantsAdministration cAdmin = this.constants.getAdminSession( admin.getId( ) ); + SetConstantCommand command = (SetConstantCommand) cParam; + try { + cAdmin.setConstant( command.getName( ) , command.getValue( ) ); + return new SetConstantResponse( admin , false ); + } catch ( UnknownConstantError e ) { + return new SetConstantResponse( admin , false ); + } catch ( InvalidConstantValue e ) { + // EMPTY + } + + List< Category > cats = new LinkedList< Category >( ); + for ( String cName : cAdmin.getCategories( ) ) { + List< Definition > defs = new LinkedList< Definition >( ); + for ( ConstantDefinition cnst : cAdmin.getConstants( cName ) ) { + Definition def = new Definition( ); + def.setName( cnst.name ); + def.setDescription( cnst.description ); + def.setValue( cnst.defaultValue ); + def.setMinValue( cnst.minValue ); + def.setMaxValue( cnst.maxValue ); + defs.add( def ); + } + + cats.add( new Category( cName , defs ) ); + } + + return new SetConstantResponse( admin , cats , command.getName( ) , command.getValue( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ChangeLanguageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ChangeLanguageCommandDelegateBean.java new file mode 100644 index 0000000..16bf25d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ChangeLanguageCommandDelegateBean.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.beans.user.admin.main.i18n; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.i18n.ChangeLanguageCommand; +import com.deepclone.lw.cmd.admin.i18n.ChangeLanguageResponse; +import com.deepclone.lw.cmd.admin.i18n.I18NString; +import com.deepclone.lw.cmd.admin.i18n.Language; +import com.deepclone.lw.interfaces.i18n.I18NAdministration; +import com.deepclone.lw.interfaces.i18n.I18NManager; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ChangeLanguageCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private I18NManager i18n; + + + @Autowired( required = true ) + public void setI18n( I18NManager i18n ) + { + this.i18n = i18n; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ChangeLanguageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.I18N ) ) { + return new ChangeLanguageResponse( admin ); + } + + ChangeLanguageCommand command = (ChangeLanguageCommand) cParam; + String lId = command.getId( ); + String newName = command.getName( ).trim( ); + + I18NAdministration i18n = this.i18n.getAdminSession( admin.getId( ) ); + if ( !i18n.getLanguages( ).contains( lId ) ) { + return new ChangeLanguageResponse( admin , null ); + } + + Language language = new Language( ); + List< I18NString > strings = new LinkedList< I18NString >( ); + boolean error = ( newName.length( ) < 2 || newName.length( ) > 48 ); + language.setId( lId ); + language.setName( newName ); + try { + if ( error ) { + for ( String sId : i18n.getStrings( ) ) { + strings.add( new I18NString( sId , i18n.getTranslation( lId , sId ) ) ); + } + } else { + i18n.setLanguageName( lId , newName ); + } + language.setCompletion( (int) Math.floor( i18n.getLanguageSupport( lId ) * 100 ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + + return error ? new ChangeLanguageResponse( admin , language , strings ) : new ChangeLanguageResponse( admin , + language ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/GetLanguageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/GetLanguageCommandDelegateBean.java new file mode 100644 index 0000000..886a5a8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/GetLanguageCommandDelegateBean.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.beans.user.admin.main.i18n; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.i18n.GetLanguageCommand; +import com.deepclone.lw.cmd.admin.i18n.GetLanguageResponse; +import com.deepclone.lw.cmd.admin.i18n.I18NString; +import com.deepclone.lw.cmd.admin.i18n.Language; +import com.deepclone.lw.interfaces.i18n.I18NAdministration; +import com.deepclone.lw.interfaces.i18n.I18NManager; +import com.deepclone.lw.interfaces.i18n.UnknownLanguageException; +import com.deepclone.lw.interfaces.i18n.UnknownStringException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetLanguageCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private I18NManager i18n; + + + @Autowired( required = true ) + public void setI18n( I18NManager i18n ) + { + this.i18n = i18n; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetLanguageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.I18N ) ) { + return new GetLanguageResponse( admin ); + } + + String lId = ( (GetLanguageCommand) cParam ).getLanguage( ); + I18NAdministration i18n = this.i18n.getAdminSession( admin.getId( ) ); + + Language language = new Language( ); + List< I18NString > strings = new LinkedList< I18NString >( ); + language.setId( lId ); + try { + language.setName( i18n.getLanguageName( lId ) ); + language.setCompletion( (int) Math.floor( i18n.getLanguageSupport( lId ) * 100 ) ); + for ( String sId : i18n.getStrings( ) ) { + strings.add( new I18NString( sId , i18n.getTranslation( lId , sId ) ) ); + } + } catch ( UnknownLanguageException e ) { + return new GetLanguageResponse( admin , null , null ); + } catch ( UnknownStringException e ) { + throw new RuntimeException( e ); + } + + return new GetLanguageResponse( admin , language , strings ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/SetStringCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/SetStringCommandDelegateBean.java new file mode 100644 index 0000000..83920b5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/SetStringCommandDelegateBean.java @@ -0,0 +1,110 @@ +package com.deepclone.lw.beans.user.admin.main.i18n; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.i18n.ChangeLanguageResponse; +import com.deepclone.lw.cmd.admin.i18n.I18NString; +import com.deepclone.lw.cmd.admin.i18n.Language; +import com.deepclone.lw.cmd.admin.i18n.SetStringCommand; +import com.deepclone.lw.cmd.admin.i18n.SetStringResponse; +import com.deepclone.lw.interfaces.i18n.I18NAdministration; +import com.deepclone.lw.interfaces.i18n.I18NManager; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.UnknownLanguageException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class SetStringCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private I18NManager i18n; + + + @Autowired( required = true ) + public void setI18n( I18NManager i18n ) + { + this.i18n = i18n; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetStringCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.I18N ) ) { + return new ChangeLanguageResponse( admin ); + } + + SetStringCommand command = (SetStringCommand) cParam; + String lId = command.getLanguage( ); + String sId = command.getId( ); + String text = command.getText( ).trim( ); + + I18NAdministration i18n = this.i18n.getAdminSession( admin.getId( ) ); + if ( !i18n.getLanguages( ).contains( lId ) ) { + return new SetStringResponse( admin , null ); + } + + Language language = new Language( ); + language.setId( lId ); + + if ( !i18n.getStrings( ).contains( sId ) ) { + try { + language.setName( i18n.getLanguageName( lId ) ); + language.setCompletion( (int) Math.floor( i18n.getLanguageSupport( lId ) * 100 ) ); + } catch ( UnknownLanguageException e ) { + throw new RuntimeException( e ); + } + return new SetStringResponse( admin , language ); + } + + boolean error = "".equals( text ); + List< I18NString > strings = new LinkedList< I18NString >( ); + try { + if ( error ) { + for ( String s : i18n.getStrings( ) ) { + strings.add( new I18NString( s , i18n.getTranslation( lId , s ) ) ); + } + } else { + i18n.updateTranslation( lId , sId , text ); + } + language.setName( i18n.getLanguageName( lId ) ); + language.setCompletion( (int) Math.floor( i18n.getLanguageSupport( lId ) * 100 ) ); + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + + return error ? new SetStringResponse( admin , language , strings , sId ) : new SetStringResponse( admin , + language ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ViewLanguagesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ViewLanguagesCommandDelegateBean.java new file mode 100644 index 0000000..f6cfbae --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/i18n/ViewLanguagesCommandDelegateBean.java @@ -0,0 +1,81 @@ +package com.deepclone.lw.beans.user.admin.main.i18n; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.i18n.Language; +import com.deepclone.lw.cmd.admin.i18n.ViewLanguagesCommand; +import com.deepclone.lw.cmd.admin.i18n.ViewLanguagesResponse; +import com.deepclone.lw.interfaces.i18n.I18NAdministration; +import com.deepclone.lw.interfaces.i18n.I18NManager; +import com.deepclone.lw.interfaces.i18n.UnknownLanguageException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewLanguagesCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private I18NManager i18n; + + + @Autowired( required = true ) + public void setI18n( I18NManager i18n ) + { + this.i18n = i18n; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewLanguagesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.I18N ) ) { + return new ViewLanguagesResponse( admin ); + } + + I18NAdministration i18n = this.i18n.getAdminSession( admin.getId( ) ); + List< Language > languages = new LinkedList< Language >( ); + for ( String lang : i18n.getLanguages( ) ) { + Language language = new Language( ); + language.setId( lang ); + try { + language.setName( i18n.getLanguageName( lang ) ); + language.setCompletion( (int) Math.floor( i18n.getLanguageSupport( lang ) * 100 ) ); + } catch ( UnknownLanguageException e ) { + throw new RuntimeException( e ); + } + languages.add( language ); + } + + return new ViewLanguagesResponse( admin , languages ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/GetEntryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/GetEntryCommandDelegateBean.java new file mode 100644 index 0000000..a424309 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/GetEntryCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.logs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.logs.GetEntryCommand; +import com.deepclone.lw.cmd.admin.logs.GetEntryResponse; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetEntryCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private LogReader logReader; + + + @Autowired( required = true ) + public void setLogReader( LogReader logReader ) + { + this.logReader = logReader; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetEntryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.LOGS ) ) { + return new GetEntryResponse( admin , true ); + } + GetEntryCommand command = (GetEntryCommand) cParam; + return this.logReader.getEntry( admin , command.getId( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/ViewLogsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/ViewLogsCommandDelegateBean.java new file mode 100644 index 0000000..3bd464d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/logs/ViewLogsCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.logs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.logs.ViewLogCommand; +import com.deepclone.lw.cmd.admin.logs.ViewLogResponse; +import com.deepclone.lw.interfaces.eventlog.LogReader; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewLogsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private LogReader logReader; + + + @Autowired( required = true ) + public void setLogReader( LogReader logReader ) + { + this.logReader = logReader; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewLogCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.LOGS ) ) { + return new ViewLogResponse( admin ); + } + ViewLogCommand command = (ViewLogCommand) cParam; + return this.logReader.getLog( admin , command.getType( ) , command.getFirstEntry( ) , command.getCount( ) , + command.getMinLogLevel( ) , command.getComponent( ) , command.isExceptionOnly( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EnableMaintenanceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EnableMaintenanceCommandDelegateBean.java new file mode 100644 index 0000000..8e06851 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EnableMaintenanceCommandDelegateBean.java @@ -0,0 +1,88 @@ +package com.deepclone.lw.beans.user.admin.main.mntm; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.mntm.EnableMaintenanceCommand; +import com.deepclone.lw.cmd.admin.mntm.MaintenanceChangeResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.MaintenanceStatusException; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class EnableMaintenanceCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private SystemStatus systemStatus; + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return EnableMaintenanceCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.MNTM ) ) { + return new MaintenanceChangeResponse( admin , true ); + } + + String reason = ( (EnableMaintenanceCommand) command ).getReason( ); + ObjectNameError one; + if ( "".equals( reason ) ) { + one = ObjectNameError.EMPTY; + } else if ( reason.length( ) < 10 ) { + one = ObjectNameError.INVALID; + } else { + one = null; + } + + int duration = ( (EnableMaintenanceCommand) command ).getDuration( ); + if ( duration < 1 || one != null ) { + MaintenanceData data = this.systemStatus.checkMaintenance( ); + if ( data == null ) { + data = new MaintenanceData( null , null , null ); + } + return new MaintenanceChangeResponse( admin , data.reason , data.start , data.end , reason , one , duration ); + } + + try { + this.systemStatus.startMaintenance( admin.getId( ) , reason , duration ); + } catch ( MaintenanceStatusException e ) { + // Do nothing + } + return new MaintenanceChangeResponse( admin , false ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EndMaintenanceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EndMaintenanceCommandDelegateBean.java new file mode 100644 index 0000000..98ea752 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/EndMaintenanceCommandDelegateBean.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.beans.user.admin.main.mntm; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.mntm.EndMaintenanceCommand; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.MaintenanceStatusException; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class EndMaintenanceCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private SystemStatus systemStatus; + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return EndMaintenanceCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.MNTM ) ) { + try { + this.systemStatus.endMaintenance( admin.getId( ) ); + } catch ( MaintenanceStatusException e ) { + // Do nothing + } + } + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/ExtendMaintenanceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/ExtendMaintenanceCommandDelegateBean.java new file mode 100644 index 0000000..2f720ed --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/ExtendMaintenanceCommandDelegateBean.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.beans.user.admin.main.mntm; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.mntm.ExtendMaintenanceCommand; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.MaintenanceStatusException; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ExtendMaintenanceCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private SystemStatus systemStatus; + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ExtendMaintenanceCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + int duration = ( (ExtendMaintenanceCommand) command ).getDuration( ); + if ( duration >= 1 ) { + try { + this.systemStatus.updateMaintenance( admin.getId( ) , duration ); + } catch ( MaintenanceStatusException e ) { + // Do nothing + } + } + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/MaintenanceStatusCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/MaintenanceStatusCommandDelegateBean.java new file mode 100644 index 0000000..df78d15 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/mntm/MaintenanceStatusCommandDelegateBean.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.beans.user.admin.main.mntm; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.mntm.MaintenanceStatusCommand; +import com.deepclone.lw.cmd.admin.mntm.MaintenanceStatusResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class MaintenanceStatusCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private SystemStatus systemStatus; + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MaintenanceStatusCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.MNTM ) ) { + return new MaintenanceStatusResponse( admin , true ); + } + + MaintenanceData m = this.systemStatus.checkMaintenance( ); + if ( m == null ) { + return new MaintenanceStatusResponse( admin , false ); + } + return new MaintenanceStatusResponse( admin , m.reason , m.start , m.end ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ComposeMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ComposeMessageCommandDelegateBean.java new file mode 100644 index 0000000..8805113 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ComposeMessageCommandDelegateBean.java @@ -0,0 +1,79 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.msg.ComposeMessageCommand; +import com.deepclone.lw.cmd.admin.msg.ComposeMessageResponse; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ComposeMessageCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ComposeMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + ComposeMessageCommand command = (ComposeMessageCommand) cParam; + + MessageType type = command.getType( ); + if ( type == MessageType.INTERNAL ) { + type = MessageType.EMPIRE; + } + String target = command.getTarget( ); + String title = command.getSubject( ).trim( ); + String contents = command.getContents( ).trim( ); + + boolean titleError = ( title.length( ) < 2 || title.length( ) > 64 ); + boolean contentsError = ( contents.length( ) < 2 ); + + ComposeMessageResponse response; + if ( command.getReplyTo( ) != null && command.getInbox( ) != null ) { + response = this.messages.sendReply( admin , command.getInbox( ) , command.getReplyTo( ) , type , target , + title , contents , titleError || contentsError ); + } else { + response = this.messages.sendMessage( admin , type , target , title , contents , titleError + || contentsError ); + } + response.setTitleError( titleError ); + response.setContentsError( contentsError ); + + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/GetMessagesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/GetMessagesCommandDelegateBean.java new file mode 100644 index 0000000..bcac6a4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/GetMessagesCommandDelegateBean.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.msg.GetMessagesCommand; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetMessagesCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetMessagesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + GetMessagesCommand command = (GetMessagesCommand) cParam; + return this.messages.getMessages( this.getAdministrator( session ) , command.isInbox( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/MessageBoxCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/MessageBoxCommandDelegateBean.java new file mode 100644 index 0000000..16963b9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/MessageBoxCommandDelegateBean.java @@ -0,0 +1,74 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.msg.MessageBoxCommand; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class MessageBoxCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MessageBoxCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + MessageBoxCommand command = (MessageBoxCommand) cParam; + Administrator admin = this.getAdministrator( session ); + + long[] selection = command.getSelection( ); + if ( selection != null && selection.length == 0 ) { + return new NullResponse( ); + } + + switch ( command.getAction( ) ) { + case DELETE: + this.messages.deleteMessages( admin , command.isInbox( ) , selection ); + break; + case MARK_READ: + this.messages.markRead( admin , selection ); + break; + case MARK_UNREAD: + this.messages.markUnread( admin , selection ); + break; + } + + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/PrepareMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/PrepareMessageCommandDelegateBean.java new file mode 100644 index 0000000..0324a60 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/PrepareMessageCommandDelegateBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.admin.msg.PrepareMessageCommand; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class PrepareMessageCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return PrepareMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + PrepareMessageCommand command = (PrepareMessageCommand) cParam; + Administrator admin = this.getAdministrator( session ); + MessageType type = command.getType( ); + + if ( type == null ) { + return this.messages.prepareBlankMessage( admin ); + } else if ( type == MessageType.INTERNAL ) { + return this.messages.prepareReply( admin , command.getInbox( ) , command.getId( ) ); + } + return this.messages.prepareMessageTo( admin , type , command.getId( ).intValue( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ReadMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ReadMessageCommandDelegateBean.java new file mode 100644 index 0000000..37dc669 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/ReadMessageCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.msg.ReadMessageCommand; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ReadMessageCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReadMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ReadMessageCommand command = (ReadMessageCommand) cParam; + Administrator admin = this.getAdministrator( session ); + return this.messages.getMessage( admin , command.isInbox( ) , command.getId( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/SendSpamCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/SendSpamCommandDelegateBean.java new file mode 100644 index 0000000..b91b7dc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/msgs/SendSpamCommandDelegateBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.user.admin.main.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.msg.SendSpamCommand; +import com.deepclone.lw.interfaces.msg.AdminMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class SendSpamCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AdminMessages messages; + + + @Autowired( required = true ) + public void setMessages( AdminMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SendSpamCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.SPAM ) ) { + return new AdminResponse( admin , false ); + } + + SendSpamCommand command = (SendSpamCommand) cParam; + this.messages.sendSpam( admin , command.getTitle( ) , command.getBody( ) ); + return new AdminResponse( admin ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/GetNamesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/GetNamesCommandDelegateBean.java new file mode 100644 index 0000000..7afefb9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/GetNamesCommandDelegateBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.user.admin.main.names; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.naming.GetNamesCommand; +import com.deepclone.lw.cmd.admin.naming.GetNamesResponse; +import com.deepclone.lw.interfaces.naming.NamesManager; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetNamesCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private NamesManager namesManager; + + + @Autowired( required = true ) + public void setNamesManager( NamesManager namesManager ) + { + this.namesManager = namesManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetNamesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.NAME ) ) { + return new GetNamesResponse( admin ); + } + return this.namesManager.getNames( admin , ( (GetNamesCommand) command ).getType( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesActionCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesActionCommandDelegateBean.java new file mode 100644 index 0000000..d28758a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesActionCommandDelegateBean.java @@ -0,0 +1,92 @@ +package com.deepclone.lw.beans.user.admin.main.names; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.naming.NameAction; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.cmd.admin.naming.NamesActionCommand; +import com.deepclone.lw.interfaces.naming.NamesManager; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class NamesActionCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private NamesManager namesManager; + + + @Autowired( required = true ) + public void setNamesManager( NamesManager namesManager ) + { + this.namesManager = namesManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return NamesActionCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.NAME ) ) { + return new NullResponse( ); + } + + NamesActionCommand command = (NamesActionCommand) cParam; + NameType type = command.getType( ); + NameAction action = command.getAction( ); + int[] ids = command.getIdentifiers( ); + if ( ids.length == 0 ) { + return new NullResponse( ); + } + + switch ( action ) { + case VALIDATE: + if ( type != NameType.ALLIANCE && type != NameType.EMPIRE ) { + this.namesManager.validateMapNames( admin , ids ); + } + break; + case REJECT: + case REJECT_BAN: + if ( type != NameType.ALLIANCE && type != NameType.EMPIRE ) { + this.namesManager.rejectMapNames( admin , ids , action == NameAction.REJECT_BAN ); + } else if ( type == NameType.ALLIANCE ) { + this.namesManager.rejectAllianceNames( admin , ids ); + } else if ( type == NameType.EMPIRE ) { + this.namesManager.rejectEmpireNames( admin , ids , action == NameAction.REJECT_BAN ); + } + break; + case RESET: + if ( type == NameType.MAP_CHANGED || type == NameType.MAP_VALIDATED ) { + this.namesManager.allowMapNameChanges( admin , ids ); + } + break; + } + + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesSummaryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesSummaryCommandDelegateBean.java new file mode 100644 index 0000000..b0109d1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/names/NamesSummaryCommandDelegateBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.user.admin.main.names; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.naming.NamesSummaryCommand; +import com.deepclone.lw.cmd.admin.naming.NamesSummaryResponse; +import com.deepclone.lw.interfaces.naming.NamesManager; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class NamesSummaryCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private NamesManager namesManager; + + + @Autowired( required = true ) + public void setNamesManager( NamesManager namesManager ) + { + this.namesManager = namesManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return NamesSummaryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.NAME ) ) { + return new NamesSummaryResponse( admin ); + } + return this.namesManager.getSummary( admin ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/GetPrefDefaultsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/GetPrefDefaultsCommandDelegateBean.java new file mode 100644 index 0000000..55c0fed --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/GetPrefDefaultsCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.admin.main.prefs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.prefs.GetPrefDefaultsCommand; +import com.deepclone.lw.cmd.admin.prefs.PrefDefaultsResponse; +import com.deepclone.lw.interfaces.prefs.PreferenceDefinitions; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetPrefDefaultsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private PreferenceDefinitions preferences; + + + @Autowired( required = true ) + public void setPreferences( PreferenceDefinitions preferences ) + { + this.preferences = preferences; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetPrefDefaultsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.PREF ) ) { + return new PrefDefaultsResponse( admin ); + } + + return new PrefDefaultsResponse( admin , this.preferences.getDefaults( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/SetPrefDefaultCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/SetPrefDefaultCommandDelegateBean.java new file mode 100644 index 0000000..c1b7f99 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/prefs/SetPrefDefaultCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.admin.main.prefs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.prefs.SetPrefDefaultCommand; +import com.deepclone.lw.interfaces.prefs.PreferenceDefinitions; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class SetPrefDefaultCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private PreferenceDefinitions preferences; + + + @Autowired( required = true ) + public void setPreferences( PreferenceDefinitions preferences ) + { + this.preferences = preferences; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetPrefDefaultCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( admin.hasPrivilege( Privileges.PREF ) ) { + SetPrefDefaultCommand command = (SetPrefDefaultCommand) cParam; + this.preferences.setDefault( admin , command.getPreference( ) , command.getValue( ) ); + } + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/AddAdministratorCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/AddAdministratorCommandDelegateBean.java new file mode 100644 index 0000000..8be8246 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/AddAdministratorCommandDelegateBean.java @@ -0,0 +1,100 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.su.AddAdministratorCommand; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse.AddressError; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class AddAdministratorCommandDelegateBean + extends SuperUserOperation +{ + + private Administration administration; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Autowired( required = true ) + public void setValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AddAdministratorCommand.class; + } + + + @Override + protected CommandResponse handleCommand( Administrator admin , Command cParam ) + { + AddAdministratorCommand command = (AddAdministratorCommand) cParam; + + // Check name + String name = command.getAppearAs( ); + ObjectNameError nameError; + if ( "".equals( name ) ) { + nameError = ObjectNameError.EMPTY; + } else { + nameError = this.validator.customValidate( name , 2 , 64 ); + } + + // Check address + String aStr = command.getAddress( ); + AddressError addrError; + if ( "".equals( aStr ) ) { + addrError = AddressError.EMPTY; + } else { + EmailAddress address = new EmailAddress( aStr ); + if ( address.isValid( ) ) { + addrError = null; + } else { + addrError = AddressError.INVALID; + } + aStr = address.getAddress( ); + } + + // Check privileges + int privileges = 0; + for ( Privileges priv : command.getPrivileges( )) { + privileges = priv.grant( privileges ); + } + boolean privError = ( privileges == 0 ); + + // If we already have errors, return + if ( addrError != null || nameError != null || privError ) { + return new AddAdministratorResponse( admin , addrError , aStr , nameError , name , privError , privileges ); + } + + return this.administration.createAdmin( admin , aStr , name , privileges ); + } + + + @Override + protected CommandResponse insufficientPrivileges( Administrator admin ) + { + return new AddAdministratorResponse( admin , true ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ListAdministratorsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ListAdministratorsCommandDelegateBean.java new file mode 100644 index 0000000..7f868b0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ListAdministratorsCommandDelegateBean.java @@ -0,0 +1,57 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.su.ListAdministratorsCommand; +import com.deepclone.lw.cmd.admin.su.ListAdministratorsResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public class ListAdministratorsCommandDelegateBean + extends SuperUserOperation +{ + + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListAdministratorsCommand.class; + } + + + @Override + protected CommandResponse handleCommand( Administrator admin , Command command ) + { + List< Administrator > result = new LinkedList< Administrator >( ); + for ( AdminRecord record : this.administration.listAdministrators( ) ) { + result.add( this.convertAdministrator( record ) ); + } + return new ListAdministratorsResponse( admin , result ); + } + + + @Override + protected CommandResponse insufficientPrivileges( Administrator admin ) + { + return new ListAdministratorsResponse( admin ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ResetAdminPasswordCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ResetAdminPasswordCommandDelegateBean.java new file mode 100644 index 0000000..6f468e8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ResetAdminPasswordCommandDelegateBean.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.su.ResetAdminPasswordCommand; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public class ResetAdminPasswordCommandDelegateBean + extends SUExistingOperation +{ + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ResetAdminPasswordCommand.class; + } + + + @Override + protected CommandResponse handleCommand( Administrator admin , Command cParam ) + { + ResetAdminPasswordCommand command = (ResetAdminPasswordCommand) cParam; + if ( admin.getId( ) == command.getIdentifier( ) ) { + return new ViewAdministratorResponse( admin , admin ); + } + + AdminRecord record = this.administration.resetPassword( admin , command.getIdentifier( ) ); + if ( record == null ) { + return this.adminNotFound( admin ); + } + return new ViewAdministratorResponse( admin , this.convertAdministrator( record ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SUExistingOperation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SUExistingOperation.java new file mode 100644 index 0000000..8fd2238 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SUExistingOperation.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorResponse; +import com.deepclone.lw.session.CommandResponse; + + + +abstract class SUExistingOperation + extends SuperUserOperation +{ + + protected final CommandResponse adminNotFound( Administrator admin ) + { + return new ViewAdministratorResponse( admin , false ); + } + + + @Override + protected CommandResponse insufficientPrivileges( Administrator admin ) + { + return new ViewAdministratorResponse( admin , true ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SetPrivilegesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SetPrivilegesCommandDelegateBean.java new file mode 100644 index 0000000..aae2e2d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SetPrivilegesCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.su.SetPrivilegesCommand; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public class SetPrivilegesCommandDelegateBean + extends SUExistingOperation +{ + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetPrivilegesCommand.class; + } + + + @Override + protected CommandResponse handleCommand( Administrator admin , Command cParam ) + { + SetPrivilegesCommand command = (SetPrivilegesCommand) cParam; + if ( command.getIdentifier( ) == admin.getId( ) ) { + return new ViewAdministratorResponse( admin , admin ); + } + + AdminRecord record = this.administration.setPrivileges( admin , command.getIdentifier( ) , command + .getPrivileges( ) ); + if ( record == null ) { + return this.adminNotFound( admin ); + } + return new ViewAdministratorResponse( admin , this.convertAdministrator( record ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SuperUserOperation.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SuperUserOperation.java new file mode 100644 index 0000000..4bf74d5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/SuperUserOperation.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +abstract class SuperUserOperation + extends AdminOperation + implements AutowiredCommandDelegate +{ + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.SUPER ) ) { + return this.insufficientPrivileges( admin ); + } + return this.handleCommand( admin , command ); + } + + + protected abstract CommandResponse handleCommand( Administrator admin , Command command ); + + + protected abstract CommandResponse insufficientPrivileges( Administrator admin ); + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ViewAdministratorCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ViewAdministratorCommandDelegateBean.java new file mode 100644 index 0000000..c593a66 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/su/ViewAdministratorCommandDelegateBean.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.beans.user.admin.main.su; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorCommand; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorResponse; +import com.deepclone.lw.interfaces.admin.Administration; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.admin.AdminRecord; + + + +public class ViewAdministratorCommandDelegateBean + extends SUExistingOperation +{ + private Administration administration; + + + @Autowired( required = true ) + public void setAdministration( Administration administration ) + { + this.administration = administration; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewAdministratorCommand.class; + } + + + @Override + protected CommandResponse handleCommand( Administrator admin , Command cParam ) + { + ViewAdministratorCommand command = (ViewAdministratorCommand) cParam; + AdminRecord record = this.administration.getAdmin( command.getIdentifier( ) ); + if ( record == null ) { + return this.adminNotFound( admin ); + } + return new ViewAdministratorResponse( admin , this.convertAdministrator( record ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/SetTaskStatusCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/SetTaskStatusCommandDelegateBean.java new file mode 100644 index 0000000..b687457 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/SetTaskStatusCommandDelegateBean.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.beans.user.admin.main.tick; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.tick.SetTaskStatusCommand; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.TickerManager; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class SetTaskStatusCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private TickerManager manager; + + + @Autowired( required = true ) + public void setManager( TickerManager manager ) + { + this.manager = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetTaskStatusCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.TICK ) ) { + return new NullResponse( ); + } + + SetTaskStatusCommand command = (SetTaskStatusCommand) cParam; + switch ( command.getNewStatus( ) ) { + case RUNNING: + this.manager.startTask( admin.getId( ) , command.getTask( ) ); + break; + case STOPPED: + this.manager.stopTask( admin.getId( ) , command.getTask( ) ); + break; + case AUTO: + this.manager.setTaskStart( admin.getId( ) , command.getTask( ) , command.getDelay( ) ); + break; + } + + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/TickerStatusCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/TickerStatusCommandDelegateBean.java new file mode 100644 index 0000000..07c370d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/TickerStatusCommandDelegateBean.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.beans.user.admin.main.tick; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.tick.TickerStatusCommand; +import com.deepclone.lw.cmd.admin.tick.TickerStatusResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.TickerManager; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class TickerStatusCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private Ticker ticker; + private TickerManager manager; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Autowired( required = true ) + public void setManager( TickerManager manager ) + { + this.manager = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return TickerStatusCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.TICK ) ) { + return new TickerStatusResponse( admin ); + } + return new TickerStatusResponse( admin , !this.ticker.isActive( ) , this.manager.getTasks( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/ToggleTickerCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/ToggleTickerCommandDelegateBean.java new file mode 100644 index 0000000..7a6bd7e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/tick/ToggleTickerCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.admin.main.tick; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.tick.ToggleTickerCommand; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class ToggleTickerCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private Ticker ticker; + + + @Autowired( required = true ) + public void setTicker( Ticker ticker ) + { + this.ticker = ticker; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ToggleTickerCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + if ( this.getAdministrator( session ).hasPrivilege( Privileges.TICK ) ) { + if ( this.ticker.isActive( ) ) { + this.ticker.pause( ); + } else { + this.ticker.unpause( ); + } + } + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/GiveCreditsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/GiveCreditsCommandDelegateBean.java new file mode 100644 index 0000000..b430461 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/GiveCreditsCommandDelegateBean.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.beans.user.admin.main.users; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.users.GiveCreditsCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class GiveCreditsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AccountManagement accounts; + + + @Autowired( required = true ) + public void setAccounts( AccountManagement accounts ) + { + this.accounts = accounts; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GiveCreditsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.USER ) ) { + return new NullResponse( ); + } + + int credits = ( (GiveCreditsCommand) command ).getCredits( ); + if ( credits > 0 ) { + int id = ( (GiveCreditsCommand) command ).getId( ); + this.accounts.giveCredits( admin , id , credits ); + } + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListAccountsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListAccountsCommandDelegateBean.java new file mode 100644 index 0000000..e8491f3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListAccountsCommandDelegateBean.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.beans.user.admin.main.users; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.ListAccountsCommand; +import com.deepclone.lw.cmd.admin.users.ListAccountsResponse; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListAccountsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AccountManagement accounts; + + + @Autowired( required = true ) + public void setAccounts( AccountManagement accounts ) + { + this.accounts = accounts; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListAccountsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.USER ) ) { + return new ListAccountsResponse( admin ); + } + + AccountStatus status = ( (ListAccountsCommand) cParam ).getStatus( ); + boolean online = ( (ListAccountsCommand) cParam ).isOnline( ); + return new ListAccountsResponse( admin , status , online , this.accounts.listAccounts( status , online ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListSessionsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListSessionsCommandDelegateBean.java new file mode 100644 index 0000000..fc47fcd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ListSessionsCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.admin.main.users; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.users.ListSessionsCommand; +import com.deepclone.lw.cmd.admin.users.ListSessionsResponse; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListSessionsCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + private AccountManagement accounts; + + + @Autowired( required = true ) + public void setAccounts( AccountManagement accounts ) + { + this.accounts = accounts; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListSessionsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.USER ) ) { + return new ListSessionsResponse( admin ); + } + + return new ListSessionsResponse( admin , this.accounts + .viewSessions( ( (ListSessionsCommand) command ).getId( ) ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ViewAccountCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ViewAccountCommandDelegateBean.java new file mode 100644 index 0000000..e56883e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/admin/main/users/ViewAccountCommandDelegateBean.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.beans.user.admin.main.users; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.admin.common.AdminOperation; +import com.deepclone.lw.beans.user.admin.main.AdminCommandsBean; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.users.AccountViewEntry; +import com.deepclone.lw.cmd.admin.users.ViewAccountCommand; +import com.deepclone.lw.cmd.admin.users.ViewAccountResponse; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewAccountCommandDelegateBean + extends AdminOperation + implements AutowiredCommandDelegate +{ + + private AccountManagement accounts; + + + @Autowired( required = true ) + public void setAccounts( AccountManagement accounts ) + { + this.accounts = accounts; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return AdminCommandsBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewAccountCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + Administrator admin = this.getAdministrator( session ); + if ( !admin.hasPrivilege( Privileges.USER ) ) { + return new ViewAccountResponse( admin ); + } + + AccountViewEntry account = this.accounts.getAccountView( ( (ViewAccountCommand) command ).getId( ) ); + return new ViewAccountResponse( admin , account ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/AccountCreationCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/AccountCreationCommandDelegateBean.java new file mode 100644 index 0000000..e13c5d7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/AccountCreationCommandDelegateBean.java @@ -0,0 +1,142 @@ +package com.deepclone.lw.beans.user.ext; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.MailError; +import com.deepclone.lw.cmd.PasswordError; +import com.deepclone.lw.cmd.ext.CreateAccountCommand; +import com.deepclone.lw.cmd.ext.CreateAccountResponse; +import com.deepclone.lw.interfaces.acm.AccountMailException; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public class AccountCreationCommandDelegateBean + extends LanguageListRequired + implements AutowiredCommandDelegate +{ + private int minPasswordStrength = 10; + private AccountManagement accountManagement; + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Autowired( required = true ) + public void setAccountManagement( AccountManagement accountManagement ) + { + this.accountManagement = accountManagement; + } + + + public void setMinPasswordStrength( int strength ) + { + this.minPasswordStrength = strength; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return ExternalSessionDefinerBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CreateAccountCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + CreateAccountCommand command = (CreateAccountCommand) cParam; + String temp , tempConf; + + // Check mail addresses + EmailAddress address = null; + MailError mailError = null; + temp = command.getMail( ); + tempConf = command.getMailConfirm( ); + if ( temp == null || temp.trim( ).equals( "" ) ) { + mailError = MailError.EMPTY; + } else if ( !temp.equals( tempConf ) ) { + mailError = MailError.MISMATCH; + } else { + address = new EmailAddress( temp ); + if ( !address.isValid( ) ) { + mailError = MailError.INVALID; + } + } + + // Check passwords + Password password = null; + PasswordError passError = null; + temp = command.getPassword( ); + tempConf = command.getPasswordConfirm( ); + if ( temp == null || temp.trim( ).equals( "" ) ) { + passError = PasswordError.EMPTY; + } else if ( !temp.equals( tempConf ) ) { + passError = PasswordError.MISMATCH; + } else { + password = new Password( temp ); + if ( password.getStrength( ) < this.minPasswordStrength ) { + passError = PasswordError.TOO_WEAK; + } + } + + // Return error response if necessary at this point + if ( passError != null || mailError != null ) { + return this.accountValidationError( command , passError , mailError ); + } + + return this.createAccount( address , password , command.getLanguage( ) ); + } + + + private CreateAccountResponse createAccount( EmailAddress address , Password password , String language ) + { + try { + this.accountManagement.createAccount( address , password , language ); + } catch ( TranslationException e ) { + return this.accountCreationError( address.getAddress( ) , null , null ); + } catch ( AccountMailException e ) { + return this.accountCreationError( address.getAddress( ) , MailError.IN_USE , language ); + } catch ( MailerException e ) { + return this.accountCreationError( address.getAddress( ) , MailError.SEND_FAIL , language ); + } + return new CreateAccountResponse( address.getAddress( ) , language ); + } + + + private CreateAccountResponse accountValidationError( CreateAccountCommand command , PasswordError pError , + MailError mError ) + { + return new CreateAccountResponse( command.getMail( ) , command.getMailConfirm( ) , pError , mError , command + .getLanguage( ) , this.getSupportedLanguages( ) ); + } + + + private CreateAccountResponse accountCreationError( String address , MailError mError , String language ) + { + return new CreateAccountResponse( address , address , null , mError , language , this.getSupportedLanguages( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ConfPwdRecoveryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ConfPwdRecoveryCommandDelegateBean.java new file mode 100644 index 0000000..ca87956 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ConfPwdRecoveryCommandDelegateBean.java @@ -0,0 +1,94 @@ +package com.deepclone.lw.beans.user.ext; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.ext.ConfirmPasswordRecoveryCommand; +import com.deepclone.lw.cmd.ext.ConfirmPasswordRecoveryResponse; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse; +import com.deepclone.lw.cmd.ext.ConfirmPasswordRecoveryResponse.PasswordRecoveryStatus; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse.PasswordRecoveryRequestStatus; +import com.deepclone.lw.interfaces.acm.AccountMailException; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.acm.PasswordProhibitedException; +import com.deepclone.lw.interfaces.acm.PasswordRecoveryException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public class ConfPwdRecoveryCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManagement; + private int minPasswordStrength = 10; + + + @Autowired( required = true ) + public void setAccountManagement( AccountManagement accountManagement ) + { + this.accountManagement = accountManagement; + } + + + public void setMinPasswordStrength( int strength ) + { + this.minPasswordStrength = strength; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return ExternalSessionDefinerBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ConfirmPasswordRecoveryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ConfirmPasswordRecoveryCommand command = (ConfirmPasswordRecoveryCommand) cParam; + EmailAddress address = new EmailAddress( command.getMailAddress( ) ); + if ( !address.isValid( ) ) { + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.INVALID_MAIL ); + } + if ( !command.getPassword( ).equals( command.getPasswordConfirm( ) ) ) { + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.MISMATCH_PASSWORD ); + } + + Password pwd = new Password( command.getPassword( ) ); + if ( pwd.getStrength( ) < this.minPasswordStrength ) { + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.WEAK_PASSWORD ); + } + + String token = command.getToken( ); + try { + this.accountManagement.recoverPassword( address , token , pwd ); + } catch ( AccountMailException e ) { + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.NOT_FOUND ); + } catch ( PasswordRecoveryException e ) { + if ( e.statusProblem ) { + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.ACCOUNT_STATUS ); + } + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.NOT_FOUND ); + } catch ( PasswordProhibitedException e ) { + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.PROHIBITED ); + } + + return new ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus.OK ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ExternalSessionDefinerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ExternalSessionDefinerBean.java new file mode 100644 index 0000000..9deade5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ExternalSessionDefinerBean.java @@ -0,0 +1,103 @@ +package com.deepclone.lw.beans.user.ext; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.MaintenanceResponse; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.session.SessionManager; +import com.deepclone.lw.interfaces.session.SessionTypeDefiner; +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionStateException; + + + +public class ExternalSessionDefinerBean + extends SessionCommandHandler + implements SessionTypeDefiner +{ + + private SystemStatus systemStatus; + + + @Autowired( required = true ) + public void setSessionManager( SessionManager manager ) + { + manager.registerSessionType( this ); + } + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public String getName( ) + { + return "ext"; + } + + + @Override + public boolean isAuthenticated( ServerSession session ) + { + return true; + } + + + @Override + public String getState( ServerSession session ) + { + return null; + } + + + @Override + public void initialise( ServerSession session ) + { + // EMPTY + } + + + @Override + public void authenticate( ServerSession session , String identifier , String sha1Hash , String md5Hash ) + throws SessionStateException + { + throw new SessionStateException( ); + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + throws SessionStateException , SessionCommandException + { + try { + // Check maintenance + MaintenanceData mData = this.systemStatus.checkMaintenance( ); + if ( mData != null ) { + return new MaintenanceResponse( mData.start , mData.end , mData.reason ); + } + + return this.executeDelegate( session , command ); + } finally { + session.terminate( ); + } + } + + + @Override + public void terminate( ServerSession session , SessionTerminationType reason ) + { + // EMPTY + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/LanguageListRequired.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/LanguageListRequired.java new file mode 100644 index 0000000..b60f11d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/LanguageListRequired.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.beans.user.ext; + + +import java.util.HashMap; +import java.util.Map; + +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.i18n.UnknownLanguageException; + + + +abstract class LanguageListRequired +{ + protected Translator translator; + + + protected Map< String , String > getSupportedLanguages( ) + { + Map< String , String > result = new HashMap< String , String >( ); + for ( String lId : this.translator.getSupportedLanguages( ) ) { + try { + result.put( lId , this.translator.getLanguageName( lId ) ); + } catch ( UnknownLanguageException e ) { + // EMPTY + } + } + return result; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ListLanguagesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ListLanguagesCommandDelegateBean.java new file mode 100644 index 0000000..256fae2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ListLanguagesCommandDelegateBean.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.beans.user.ext; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.ext.ListLanguagesCommand; +import com.deepclone.lw.cmd.ext.ListLanguagesResponse; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListLanguagesCommandDelegateBean + extends LanguageListRequired + implements AutowiredCommandDelegate +{ + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return ExternalSessionDefinerBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListLanguagesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + return new ListLanguagesResponse( this.getSupportedLanguages( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ReqPwdRecoveryCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ReqPwdRecoveryCommandDelegateBean.java new file mode 100644 index 0000000..bcd48dd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/ext/ReqPwdRecoveryCommandDelegateBean.java @@ -0,0 +1,74 @@ +package com.deepclone.lw.beans.user.ext; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryCommand; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse.PasswordRecoveryRequestStatus; +import com.deepclone.lw.interfaces.acm.AccountMailException; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.acm.PasswordRecoveryException; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ReqPwdRecoveryCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManagement; + + + @Autowired( required = true ) + public void setAccountManagement( AccountManagement accountManagement ) + { + this.accountManagement = accountManagement; + } + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return ExternalSessionDefinerBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RequestPasswordRecoveryCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + RequestPasswordRecoveryCommand command = (RequestPasswordRecoveryCommand) cParam; + EmailAddress address = new EmailAddress( command.getMailAddress( ) ); + if ( !address.isValid( ) ) { + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.INVALID_INPUT ); + } + + try { + this.accountManagement.requestPasswordRecovery( address ); + } catch ( AccountMailException e ) { + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.ACCOUNT_NOT_FOUND ); + } catch ( MailerException e ) { + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.MAIL_ERROR ); + } catch ( PasswordRecoveryException e ) { + if ( e.statusProblem ) { + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.ACCOUNT_STATUS ); + } + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.RECOVERY_IN_PROGRESS ); + } + + return new RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus.OK ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BanDetailsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BanDetailsCommandDelegateBean.java new file mode 100644 index 0000000..40fecce --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BanDetailsCommandDelegateBean.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.beans.user.player; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.player.account.BanDetailsCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class BanDetailsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private AccountManagement manager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement manager ) + { + this.manager = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return BannedSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return BanDetailsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + return this.manager.getBanDetails( address ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BannedSubTypeBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BannedSubTypeBean.java new file mode 100644 index 0000000..65e4a57 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/BannedSubTypeBean.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.beans.user.player; + + +public class BannedSubTypeBean + extends PlayerSessionSubType +{ + + @Override + public String getName( ) + { + return "banned"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/DisabledSubTypeBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/DisabledSubTypeBean.java new file mode 100644 index 0000000..3d4c243 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/DisabledSubTypeBean.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.beans.user.player; + + +public class DisabledSubTypeBean + extends PlayerSessionSubType +{ + + @Override + public String getName( ) + { + return "disabled"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GameSubTypeBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GameSubTypeBean.java new file mode 100644 index 0000000..45a031a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GameSubTypeBean.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.beans.user.player; + + +public class GameSubTypeBean + extends PlayerSessionSubType +{ + + @Override + public String getName( ) + { + return "game"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GetLanguageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GetLanguageCommandDelegateBean.java new file mode 100644 index 0000000..8e7cb38 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/GetLanguageCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.player.account.GetLanguageCommand; +import com.deepclone.lw.cmd.player.account.GetLanguageResponse; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.utils.EmailAddress; + + + +public class GetLanguageCommandDelegateBean + implements AutowiredCommandDelegate + +{ + private AccountManagement manager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement manager ) + { + this.manager = manager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetLanguageCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return PlayerCommonCommandsBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress addr = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + Account accnt = this.manager.getAccount( addr ); + return new GetLanguageResponse( accnt.getLanguage( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerCommonCommandsBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerCommonCommandsBean.java new file mode 100644 index 0000000..8efb566 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerCommonCommandsBean.java @@ -0,0 +1,15 @@ +package com.deepclone.lw.beans.user.player; + + +public class PlayerCommonCommandsBean + extends PlayerSessionSubType + +{ + + @Override + public String getName( ) + { + return null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionDefinerBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionDefinerBean.java new file mode 100644 index 0000000..d392014 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionDefinerBean.java @@ -0,0 +1,167 @@ +package com.deepclone.lw.beans.user.player; + + +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.StatefulSessionTypeDefiner; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.acm.AccountSession; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.session.SessionManager; +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.utils.EmailAddress; + + + +public class PlayerSessionDefinerBean + extends StatefulSessionTypeDefiner +{ + private SystemStatus systemStatus; + private AccountManagement accountManagement; + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Autowired( required = true ) + public void setAccountManagement( AccountManagement accountManagement ) + { + this.accountManagement = accountManagement; + } + + + @Autowired( required = true ) + public void setEmpireManagement( EmpireManagement empireManagement ) + { + this.empireManagement = empireManagement; + } + + + @Autowired( required = true ) + public void setSessionManager( SessionManager manager ) + { + manager.registerSessionType( this ); + } + + + @Override + public String getName( ) + { + return "player"; + } + + + @Override + public void initialise( ServerSession session ) + { + // EMPTY + } + + + @Override + protected String getSessionType( ServerSession session ) + { + // If the system is under maintenance, do not check + MaintenanceData mData = this.systemStatus.checkMaintenance( ); + if ( mData != null ) { + return this.getState( session ); + } + + // Get account status + Account account = this.accountManagement.restoreSession( session.get( "sessionId" , Long.class ) ); + if ( account == null ) { + session.terminate( SessionTerminationType.GONE ); + return null; + } + AccountStatus status = account.getStatus( ); + + switch ( status ) { + case ACTIVE: + case QUITTING: + case START_VACATION: + case VACATION: + session.put( "vacation" , (Boolean) ( status == AccountStatus.VACATION ) ); + this.updateEmpireId( session ); + return "game"; + } + + session.put( "empireId" , null ); + switch ( status ) { + case UNCONFIRMED: + case REACTIVATING: + return "validation"; + case BANNED: + return "banned"; + case DISABLED: + return "disabled"; + } + + return null; + } + + + private void updateEmpireId( ServerSession session ) + { + if ( session.get( "empireId" , Integer.class ) != null ) { + return; + } + session.put( "empireId" , this.empireManagement.getEmpireId( this.getPlayer( session ) ) ); + } + + + @Override + protected String initAuthToken( ServerSession session , String identifier , String sha1Hash , String md5Hash ) + { + // If the system is under maintenance, do not check + MaintenanceData mData = this.systemStatus.checkMaintenance( ); + if ( mData != null ) { + return null; + } + + EmailAddress address = new EmailAddress( identifier ); + if ( !address.isValid( ) ) { + return null; + } + + AccountSession lResult; + lResult = this.accountManagement.login( address , session.getChallenge( ) , sha1Hash , md5Hash , session + .getAddress( ) , session.getClient( ) , session.getIdentifier( ) ); + if ( lResult == null ) { + return null; + } + + // FIXME: that should not be hardcoded + session.setExpirationDate( new Date( new Date( ).getTime( ) + 1800000L ) ); + session.put( "sessionId" , (Long) lResult.session ); + return address.getAddress( ); + } + + + @Override + public void terminate( ServerSession session , SessionTerminationType reason ) + { + if ( !this.isAuthenticated( session ) ) { + return; + } + + this.accountManagement.logout( session.get( "sessionId" , Long.class ) , reason ); + } + + + private EmailAddress getPlayer( ServerSession session ) + { + return new EmailAddress( this.getAuthToken( session ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionSubType.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionSubType.java new file mode 100644 index 0000000..f2adad6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/PlayerSessionSubType.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.beans.user.player; + + +import java.util.Date; + +import com.deepclone.lw.beans.user.abst.AutowiredSubTypeDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.abst.StatefulSessionTypeDefiner; +import com.deepclone.lw.cmd.MaintenanceResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.interfaces.sys.MaintenanceData; +import com.deepclone.lw.interfaces.sys.SystemStatus; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; + + + +abstract class PlayerSessionSubType + extends SessionCommandHandler + implements AutowiredSubTypeDelegate +{ + + private SystemStatus systemStatus; + + + public void setSystemStatus( SystemStatus systemStatus ) + { + this.systemStatus = systemStatus; + } + + + @Override + public final Class< ? extends StatefulSessionTypeDefiner > getSessionType( ) + { + return PlayerSessionDefinerBean.class; + } + + + @Override + public final CommandResponse execute( ServerSession session , Command command ) + throws SessionCommandException + { + MaintenanceData mData = this.systemStatus.checkMaintenance( ); + if ( mData != null ) { + return new MaintenanceResponse( mData.start , mData.end , mData.reason ); + } + //FIXME: that should not be hardcoded + session.setExpirationDate( new Date( new Date( ).getTime( ) + 1800000L ) ); + return this.executeDelegate( session , command ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ReactivateCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ReactivateCommandDelegateBean.java new file mode 100644 index 0000000..cba702e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ReactivateCommandDelegateBean.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.beans.user.player; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.player.account.AccountReactivationCommand; +import com.deepclone.lw.cmd.player.account.AccountReactivationResponse; +import com.deepclone.lw.interfaces.acm.AccountMailException; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ReactivateCommandDelegateBean + implements AutowiredCommandDelegate + +{ + private AccountManagement manager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement manager ) + { + this.manager = manager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AccountReactivationCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return DisabledSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + String address = session.get( "authenticationToken" , String.class ); + boolean rv; + try { + this.manager.reactivateAccount( new EmailAddress( address ) ); + rv = true; + } catch ( AccountMailException e ) { + rv = false; + } catch ( MailerException e ) { + rv = false; + } + return new AccountReactivationResponse( address , rv ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationCommandDelegateBean.java new file mode 100644 index 0000000..6633bb8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationCommandDelegateBean.java @@ -0,0 +1,132 @@ +package com.deepclone.lw.beans.user.player; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.account.AccountValidationCommand; +import com.deepclone.lw.cmd.player.account.AccountValidationResponse; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.sqld.accounts.ValidationResult; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ValidationCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement manager; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement manager ) + { + this.manager = manager; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return ValidationSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AccountValidationCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + AccountValidationCommand command = (AccountValidationCommand) cParam; + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + + if ( command.isInitialisation( ) ) { + return new AccountValidationResponse( this.manager.getEmpireNames( address ) ); + } + + AccountValidationResponse vResponse; + + // Validate empire / planet names + vResponse = this.validateNames( command , address ); + if ( vResponse != null ) { + return vResponse; + } + + // Actual validation / game registration + ValidationResult result; + result = this.manager.validateAccount( address , command.getToken( ) , command.getEmpire( ) , command + .getPlanet( ) ); + + if ( result.isError( ) ) { + return this.makeError( command , address , result ); + } + + return new AccountValidationResponse( ); + } + + + private AccountValidationResponse validateNames( AccountValidationCommand command , EmailAddress address ) + { + ObjectNameError eOne = this.validator.validate( command.getEmpire( ) ); + ObjectNameError pOne = this.validator.validate( command.getPlanet( ) ); + if ( eOne == null && pOne == null ) { + return null; + } + return this.makeError( command , address , false , eOne , pOne ); + } + + + private CommandResponse makeError( AccountValidationCommand command , EmailAddress address , ValidationResult result ) + { + ObjectNameError eOne = null , pOne = null; + + switch ( result.getEmpireError( ) ) { + case 1: + eOne = ObjectNameError.BANNED; + break; + case 2: + eOne = ObjectNameError.UNAVAILABLE; + break; + } + + switch ( result.getPlanetError( ) ) { + case 1: + pOne = ObjectNameError.BANNED; + break; + case 2: + pOne = ObjectNameError.UNAVAILABLE; + break; + } + + return this.makeError( command , address , ( result.getAccountError( ) != 0 ) , eOne , pOne ); + } + + + private AccountValidationResponse makeError( AccountValidationCommand command , EmailAddress address , + boolean wrongToken , ObjectNameError empireError , ObjectNameError planetError ) + { + return new AccountValidationResponse( this.manager.getEmpireNames( address ) , command.getToken( ) , command + .getEmpire( ) , command.getPlanet( ) , wrongToken , empireError , planetError ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationSubTypeBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationSubTypeBean.java new file mode 100644 index 0000000..65d0ae0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/ValidationSubTypeBean.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.beans.user.player; + + +public class ValidationSubTypeBean + extends PlayerSessionSubType +{ + + @Override + public String getName( ) + { + return "validation"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CancelQuitCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CancelQuitCommandDelegateBean.java new file mode 100644 index 0000000..c1d40aa --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CancelQuitCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.CancelQuitCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class CancelQuitCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CancelQuitCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + this.accountManager.cancelQuit( address ); + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CreateAuthChallengeCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CreateAuthChallengeCommandDelegateBean.java new file mode 100644 index 0000000..46f6559 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/CreateAuthChallengeCommandDelegateBean.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.CreateAuthChallengeCommand; +import com.deepclone.lw.cmd.CreateAuthChallengeResponse; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.RandomStringGenerator; + + + +public class CreateAuthChallengeCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private RandomStringGenerator challengeGenerator; + + + @Autowired( required = true ) + @Qualifier( "authChallenges" ) + public void setChallangeGenerator( RandomStringGenerator rsg ) + { + this.challengeGenerator = rsg; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CreateAuthChallengeCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + String challenge = this.challengeGenerator.generate( ); + session.put( "tempChallenge" , challenge ); + return new CreateAuthChallengeResponse( challenge ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/GetAccountCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/GetAccountCommandDelegateBean.java new file mode 100644 index 0000000..f08ebbb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/GetAccountCommandDelegateBean.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.GetAccountCommand; +import com.deepclone.lw.cmd.player.account.GetAccountResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class GetAccountCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + private EmpireManagement empireManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement empireManager ) + { + this.empireManager = empireManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetAccountCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress addr = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + AccountData accnt = this.accountManager.getAccountPage( addr ); + GamePageData gPage = this.empireManager.getGeneralInformation( session.get( "empireId" , Integer.class ) ); + return new GetAccountResponse( gPage , accnt ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/QuitGameCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/QuitGameCommandDelegateBean.java new file mode 100644 index 0000000..969da2a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/QuitGameCommandDelegateBean.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.QuitGameCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class QuitGameCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return QuitGameCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + QuitGameCommand command = (QuitGameCommand) cParam; + this.accountManager.setQuit( address , command.getReason( ) ); + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetAddressCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetAddressCommandDelegateBean.java new file mode 100644 index 0000000..8964d65 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetAddressCommandDelegateBean.java @@ -0,0 +1,104 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.SetAddressCommand; +import com.deepclone.lw.cmd.player.account.SetAddressResponse; +import com.deepclone.lw.cmd.player.account.SetAddressResponse.AddressChangeStatus; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.interfaces.acm.AccountMailException; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class SetAddressCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + private EmpireManagement empireManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement empireManager ) + { + this.empireManager = empireManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetAddressCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + SetAddressCommand command = (SetAddressCommand) cParam; + String challenge = session.get( "tempChallenge" , String.class ); + session.put( "tempChallenge" , null ); + + EmailAddress nAddress = null; + AddressChangeStatus mailStatus = AddressChangeStatus.OK; + String temp = command.getMail( ); + String tempConf = command.getMailConfirm( ); + if ( temp == null || temp.trim( ).equals( "" ) ) { + mailStatus = AddressChangeStatus.EMPTY; + } else if ( !temp.equals( tempConf ) ) { + mailStatus = AddressChangeStatus.MISMATCH; + } else { + nAddress = new EmailAddress( temp ); + if ( !address.isValid( ) ) { + mailStatus = AddressChangeStatus.INVALID; + } + } + + boolean authError = false; + if ( mailStatus == AddressChangeStatus.OK ) { + try { + authError = !this.accountManager.setAddress( address , challenge , command.getSha1Auth( ) , command + .getMd5Auth( ) , nAddress ); + } catch ( AccountMailException e ) { + mailStatus = AddressChangeStatus.IN_USE; + } catch ( MailerException e ) { + mailStatus = AddressChangeStatus.SEND_FAIL; + } + } + + if ( !authError && mailStatus == AddressChangeStatus.OK ) { + return new SetAddressResponse( ); + } + + AccountData accnt = this.accountManager.getAccountPage( address ); + GamePageData gPage = this.empireManager.getGeneralInformation( session.get( "empireId" , Integer.class ) ); + return new SetAddressResponse( gPage , accnt , authError , mailStatus , command.getMail( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetLanguageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetLanguageCommandDelegateBean.java new file mode 100644 index 0000000..f1b4e60 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetLanguageCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.SetLanguageCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class SetLanguageCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetLanguageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + SetLanguageCommand command = (SetLanguageCommand) cParam; + EmailAddress addr = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + this.accountManager.setLanguage( addr , command.getLanguage( ) ); + return null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPasswordCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPasswordCommandDelegateBean.java new file mode 100644 index 0000000..8ba8abc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPasswordCommandDelegateBean.java @@ -0,0 +1,110 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.SetPasswordCommand; +import com.deepclone.lw.cmd.player.account.SetPasswordResponse; +import com.deepclone.lw.cmd.player.account.SetPasswordResponse.PasswordChangeStatus; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.acm.PasswordProhibitedException; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public class SetPasswordCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + private EmpireManagement empireManager; + private int minPasswordStrength = 10; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement empireManager ) + { + this.empireManager = empireManager; + } + + + public void setMinPasswordStrength( int strength ) + { + this.minPasswordStrength = strength; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetPasswordCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + SetPasswordCommand command = (SetPasswordCommand) cParam; + String challenge = session.get( "tempChallenge" , String.class ); + session.put( "tempChallenge" , null ); + + PasswordChangeStatus status = PasswordChangeStatus.OK; + Password pwd = null; + if ( "".equals( command.getPassword( ) ) ) { + status = PasswordChangeStatus.EMPTY; + } else if ( !command.getPassword( ).equals( command.getPasswordConfirm( ) ) ) { + status = PasswordChangeStatus.MISMATCH; + } else { + pwd = new Password( command.getPassword( ) ); + if ( pwd.getStrength( ) < this.minPasswordStrength ) { + status = PasswordChangeStatus.TOO_WEAK; + } + } + + boolean authError; + if ( status == PasswordChangeStatus.OK ) { + try { + authError = !this.accountManager.setPassword( address , challenge , command.getSha1Auth( ) , command + .getMd5Auth( ) , pwd ); + } catch ( PasswordProhibitedException e ) { + authError = false; + status = PasswordChangeStatus.PROHIBITED; + } + } else { + authError = false; + } + + if ( !authError && status == PasswordChangeStatus.OK ) { + return new SetPasswordResponse( ); + } + + AccountData accnt = this.accountManager.getAccountPage( address ); + GamePageData gPage = this.empireManager.getGeneralInformation( session.get( "empireId" , Integer.class ) ); + return new SetPasswordResponse( gPage , accnt , authError , status ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPreferencesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPreferencesCommandDelegateBean.java new file mode 100644 index 0000000..7c8e9fa --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/SetPreferencesCommandDelegateBean.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.SetPreferencesCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class SetPreferencesCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private AccountManagement accountManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetPreferencesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + SetPreferencesCommand command = (SetPreferencesCommand) cParam; + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + + if ( command.isReset( ) ) { + this.accountManager.resetPreferences( address ); + } else { + this.accountManager.setPreferences( address , command.getValues( ) ); + } + + return new NullResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ToggleVacationCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ToggleVacationCommandDelegateBean.java new file mode 100644 index 0000000..c97768d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ToggleVacationCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.ToggleVacationCommand; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ToggleVacationCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ToggleVacationCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + this.accountManager.toggleVacation( address ); + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ValidateSetAddressCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ValidateSetAddressCommandDelegateBean.java new file mode 100644 index 0000000..9dbf8e8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/account/ValidateSetAddressCommandDelegateBean.java @@ -0,0 +1,79 @@ +package com.deepclone.lw.beans.user.player.account; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.account.ValidateSetAddressCommand; +import com.deepclone.lw.cmd.player.account.ValidateSetAddressResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ValidateSetAddressCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AccountManagement accountManager; + private EmpireManagement empireManager; + + + @Autowired( required = true ) + public void setAccountManager( AccountManagement accountManager ) + { + this.accountManager = accountManager; + } + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement empireManager ) + { + this.empireManager = empireManager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ValidateSetAddressCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ValidateSetAddressCommand command = (ValidateSetAddressCommand) cParam; + EmailAddress cAddress = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + + if ( command.isCancel( ) ) { + this.accountManager.cancelAddressChange( cAddress ); + } else { + String code = command.getCode( ); + AccountData data = this.accountManager.confirmAddressChange( cAddress , code ); + if ( data.getAddress( ).equals( cAddress.getAddress( ) ) ) { + GamePageData gPage = this.empireManager + .getGeneralInformation( session.get( "empireId" , Integer.class ) ); + return new ValidateSetAddressResponse( gPage , data , code ); + } + session.put( "authenticationToken" , data.getAddress( ) ); + } + + return new ValidateSetAddressResponse( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ListBugsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ListBugsCommandDelegateBean.java new file mode 100644 index 0000000..a1c6b8a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ListBugsCommandDelegateBean.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.beans.user.player.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.bt.ListBugsCommand; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.interfaces.bt.PlayerBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListBugsCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private PlayerBugs bugs; + + + @Autowired( required = true ) + public void setBugs( PlayerBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListBugsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + + ListBugsCommand command = (ListBugsCommand) cParam; + long first = command.getFirst( ); + int count = command.getCount( ); + BugStatus status = command.getStatus( ); + boolean own = command.isOwnOnly( ); + + return this.bugs.getBugs( empireId , status , own , first , count ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/PostCommentCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/PostCommentCommandDelegateBean.java new file mode 100644 index 0000000..361e3c8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/PostCommentCommandDelegateBean.java @@ -0,0 +1,76 @@ +package com.deepclone.lw.beans.user.player.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.bt.PostCommentCommand; +import com.deepclone.lw.cmd.player.bt.PostCommentResponse; +import com.deepclone.lw.cmd.player.bt.ViewBugResponse; +import com.deepclone.lw.interfaces.bt.PlayerBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class PostCommentCommandDelegateBean + implements AutowiredCommandDelegate +{ + private PlayerBugs bugs; + + + @Autowired( required = true ) + public void setBugs( PlayerBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return PostCommentCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + int empireId = session.get( "empireId" , Integer.class ); + long id = ( (PostCommentCommand) command ).getId( ); + String comment = ( (PostCommentCommand) command ).getComment( ).trim( ); + + ObjectNameError error; + if ( "".equals( comment ) ) { + error = ObjectNameError.EMPTY; + } else if ( comment.length( ) < 30 ) { + error = ObjectNameError.INVALID; + } else { + error = null; + } + + if ( error != null ) { + ViewBugResponse response = this.bugs.getReport( empireId , id ); + if ( response.getReport( ) == null ) { + return new PostCommentResponse( response.getPage( ) , false ); + } + return new PostCommentResponse( response.getPage( ) , response.getReport( ) , response.getEvents( ) , + error , comment ); + } + + PostCommentResponse response = this.bugs.postComment( empireId , id , comment ); + return response; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ReportBugCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ReportBugCommandDelegateBean.java new file mode 100644 index 0000000..e0eaa21 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ReportBugCommandDelegateBean.java @@ -0,0 +1,89 @@ +package com.deepclone.lw.beans.user.player.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.bt.ReportBugCommand; +import com.deepclone.lw.cmd.player.bt.ReportBugResponse; +import com.deepclone.lw.interfaces.bt.PlayerBugs; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ReportBugCommandDelegateBean + implements AutowiredCommandDelegate +{ + private PlayerBugs bugs; + private EmpireManagement empires; + + + @Autowired( required = true ) + public void setBugs( PlayerBugs bugs ) + { + this.bugs = bugs; + } + + + @Autowired( required = true ) + public void setEmpires( EmpireManagement empires ) + { + this.empires = empires; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReportBugCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + + ReportBugCommand command = (ReportBugCommand) cParam; + String title = command.getTitle( ).trim( ); + String desc = command.getDescription( ).trim( ); + + ObjectNameError titleError; + if ( "".equals( title ) ) { + titleError = ObjectNameError.EMPTY; + } else if ( title.length( ) < 10 || title.length( ) > 127 ) { + titleError = ObjectNameError.INVALID; + } else { + titleError = null; + } + + ObjectNameError descError; + if ( "".equals( desc ) ) { + descError = ObjectNameError.EMPTY; + } else if ( desc.length( ) < 30 ) { + descError = ObjectNameError.INVALID; + } else { + descError = null; + } + + if ( descError != null || titleError != null ) { + return new ReportBugResponse( this.empires.getGeneralInformation( empireId ) , titleError , title , + descError , desc ); + } + + return this.bugs.postReport( empireId , title , desc ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ViewBugCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ViewBugCommandDelegateBean.java new file mode 100644 index 0000000..67f9bb6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/bt/ViewBugCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.bt; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.bt.ViewBugCommand; +import com.deepclone.lw.interfaces.bt.PlayerBugs; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewBugCommandDelegateBean + implements AutowiredCommandDelegate +{ + private PlayerBugs bugs; + + + @Autowired( required = true ) + public void setBugs( PlayerBugs bugs ) + { + this.bugs = bugs; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewBugCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + int empireId = session.get( "empireId" , Integer.class ); + long id = ( (ViewBugCommand) command ).getId( ); + return this.bugs.getReport( empireId , id ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetBattleCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetBattleCommandDelegateBean.java new file mode 100644 index 0000000..4b63387 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetBattleCommandDelegateBean.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.battles.GetBattleCommand; +import com.deepclone.lw.interfaces.game.BattleViewer; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetBattleCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private BattleViewer battleViewer; + + + @Autowired( required = true ) + public void setBattleViewer( BattleViewer battleViewer ) + { + this.battleViewer = battleViewer; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetBattleCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + GetBattleCommand command = (GetBattleCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + long battle = command.getBattle( ); + Long tick = command.getTick( ); + if ( tick == null ) { + return this.battleViewer.getBattle( empireId , battle ); + } + return this.battleViewer.getBattle( empireId , battle , tick ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetNewPlanetCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetNewPlanetCommandDelegateBean.java new file mode 100644 index 0000000..e59bb96 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/GetNewPlanetCommandDelegateBean.java @@ -0,0 +1,74 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.GetNewPlanetCommand; +import com.deepclone.lw.cmd.player.GetNewPlanetResponse; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetNewPlanetCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private EmpireManagement empireManagement; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetNewPlanetCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + GetNewPlanetCommand command = (GetNewPlanetCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return new GetNewPlanetResponse( this.empireManagement.getGeneralInformation( empireId ) , null , null ); + } + + String name = command.getName( ); + ObjectNameError one = this.validator.validate( name ); + if ( one != null ) { + return new GetNewPlanetResponse( this.empireManagement.getGeneralInformation( empireId ) , name , one ); + } + + return this.empireManagement.getNewPlanet( empireId , name ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ImplementTechCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ImplementTechCommandDelegateBean.java new file mode 100644 index 0000000..d6d7165 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ImplementTechCommandDelegateBean.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.ImplementTechCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ImplementTechCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ImplementTechCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ImplementTechCommand command = (ImplementTechCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.empireManagement.getOverview( empireId ); + } + return this.empireManagement.implementTechnology( empireId , command.getTech( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListBattlesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListBattlesCommandDelegateBean.java new file mode 100644 index 0000000..92fbe08 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListBattlesCommandDelegateBean.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.battles.ListBattlesCommand; +import com.deepclone.lw.interfaces.game.BattleViewer; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListBattlesCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private BattleViewer battleViewer; + + + @Autowired( required = true ) + public void setBattleViewer( BattleViewer battleViewer ) + { + this.battleViewer = battleViewer; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListBattlesCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ListBattlesCommand command = (ListBattlesCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + return this.battleViewer.getBattles( empireId , command.getPage( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListPlanetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListPlanetsCommandDelegateBean.java new file mode 100644 index 0000000..00978f8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ListPlanetsCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.ListPlanetsCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListPlanetsCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListPlanetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + return this.empireManagement.getPlanetList( empireId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/OverviewCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/OverviewCommandDelegateBean.java new file mode 100644 index 0000000..7deb80c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/OverviewCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.game; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.OverviewCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class OverviewCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return OverviewCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + return this.empireManagement.getOverview( empireId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ViewMapCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ViewMapCommandDelegateBean.java new file mode 100644 index 0000000..6a569f5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/ViewMapCommandDelegateBean.java @@ -0,0 +1,125 @@ +package com.deepclone.lw.beans.user.player.game; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.ViewMapCommand; +import com.deepclone.lw.cmd.player.ViewMapResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.cmd.player.gdata.map.MapSystemData; +import com.deepclone.lw.interfaces.acm.AccountManagement; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.game.MapViewParameters; +import com.deepclone.lw.interfaces.game.MapViewer; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.i18n.Translator; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.utils.EmailAddress; + + + +public class ViewMapCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private AccountManagement accountManagement; + private EmpireManagement empireManagement; + private MapViewer mapViewer; + private Translator translator; + + + @Autowired( required = true ) + public void setAccountManagement( AccountManagement accountManagement ) + { + this.accountManagement = accountManagement; + } + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Autowired( required = true ) + public void setMapViewer( MapViewer mapViewer ) + { + this.mapViewer = mapViewer; + } + + + @Autowired( required = true ) + public void setTranslator( Translator translator ) + { + this.translator = translator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewMapCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ViewMapCommand command = (ViewMapCommand) cParam; + EmailAddress address = new EmailAddress( session.get( "authenticationToken" , String.class ) ); + int empireId = session.get( "empireId" , Integer.class ); + + boolean useDefaults = command.isDefaults( ); + if ( !useDefaults ) { + useDefaults = ( command.getX( ) == null || command.getY( ) == null || command.getSize( ) == null ); + } + + MapViewParameters params; + if ( useDefaults ) { + params = this.mapViewer.getDefaults( address ); + } else { + params = new MapViewParameters( command.getX( ) , command.getY( ) , command.getSize( ) ); + } + + GamePageData page = this.empireManagement.getGeneralInformation( empireId ); + List< String > sizeText = this.getSizeText( address ); + MapSystemData[][] systems = this.mapViewer.getMapView( empireId , params ); + return new ViewMapResponse( page , params.x , params.y , params.size , sizeText , systems ); + } + + + private List< String > getSizeText( EmailAddress address ) + { + String language = this.accountManagement.getAccount( address ).getLanguage( ); + Map< MapSize , String > sizes = MapSize.getValues( ); + + List< String > rv = new ArrayList< String >( sizes.size( ) ); + try { + for ( MapSize sz : MapSize.values( ) ) { + rv.add( sz.ordinal( ) , this.translator.translate( language , sizes.get( sz ) ) ); + } + } catch ( TranslationException e ) { + throw new RuntimeException( e ); + } + return rv; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/AllianceStatusCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/AllianceStatusCommandDelegateBean.java new file mode 100644 index 0000000..778be01 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/AllianceStatusCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.AllianceStatusCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class AllianceStatusCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AllianceStatusCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + return this.allianceManagement.getView( empireId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CancelJoinCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CancelJoinCommandDelegateBean.java new file mode 100644 index 0000000..90130ef --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CancelJoinCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.CancelJoinCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class CancelJoinCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CancelJoinCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.cancelJoin( empireId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CreateAllianceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CreateAllianceCommandDelegateBean.java new file mode 100644 index 0000000..607054a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/CreateAllianceCommandDelegateBean.java @@ -0,0 +1,82 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.alliances.AllianceStatusResponse; +import com.deepclone.lw.cmd.player.alliances.CreateAllianceCommand; +import com.deepclone.lw.cmd.player.alliances.CreateAllianceResponse; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceCreationStatus; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class CreateAllianceCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return CreateAllianceCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + CreateAllianceCommand command = (CreateAllianceCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + + String tag = command.getTag( ); + ObjectNameError tagError = this.validator.customValidate( tag , 2 , 5 ); + + String name = command.getName( ); + ObjectNameError nameError = this.validator.customValidate( name , 5 , 64 ); + + if ( tagError != null || nameError != null ) { + AllianceStatusResponse r = this.allianceManagement.getView( empireId ); + AllianceCreationStatus status = new AllianceCreationStatus( tag , tagError , name , nameError ); + return new CreateAllianceResponse( r.getPage( ) , r.getAlliance( ) , status ); + } + + return this.allianceManagement.create( empireId , tag , name ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/JoinAllianceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/JoinAllianceCommandDelegateBean.java new file mode 100644 index 0000000..8799897 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/JoinAllianceCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.JoinAllianceCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class JoinAllianceCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return JoinAllianceCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + JoinAllianceCommand command = (JoinAllianceCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.requestJoin( empireId , command.getTag( ).trim( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/KickMembersCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/KickMembersCommandDelegateBean.java new file mode 100644 index 0000000..e1643f5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/KickMembersCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.KickMembersCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class KickMembersCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return KickMembersCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + KickMembersCommand command = (KickMembersCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.kick( empireId , command.getMembers( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/LeaveAllianceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/LeaveAllianceCommandDelegateBean.java new file mode 100644 index 0000000..2f8d6f2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/LeaveAllianceCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.LeaveAllianceCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class LeaveAllianceCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return LeaveAllianceCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.leave( empireId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ManageRequestsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ManageRequestsCommandDelegateBean.java new file mode 100644 index 0000000..a5c5b23 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ManageRequestsCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.ManageRequestsCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ManageRequestsCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ManageRequestsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ManageRequestsCommand command = (ManageRequestsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.manageRequests( empireId , command.isAccept( ) , command.getMembers( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/TransferLeadershipCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/TransferLeadershipCommandDelegateBean.java new file mode 100644 index 0000000..6b3221b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/TransferLeadershipCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.TransferLeadershipCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class TransferLeadershipCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return TransferLeadershipCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + TransferLeadershipCommand command = (TransferLeadershipCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.allianceManagement.getView( empireId ); + } + return this.allianceManagement.transferLeadership( empireId , command.getToMember( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ViewAllianceCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ViewAllianceCommandDelegateBean.java new file mode 100644 index 0000000..bfa0de1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/alliances/ViewAllianceCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.game.alliances; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.alliances.ViewAllianceCommand; +import com.deepclone.lw.interfaces.game.AllianceManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewAllianceCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private AllianceManagement allianceManagement; + + + @Autowired( required = true ) + public void setAllianceManagement( AllianceManagement allianceManagement ) + { + this.allianceManagement = allianceManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewAllianceCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ViewAllianceCommand command = (ViewAllianceCommand) cParam; + Integer empireId = session.get( "empireId" , Integer.class ); + return this.allianceManagement.getInformation( empireId , command.getTag( ).trim( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/AddEnemyCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/AddEnemyCommandDelegateBean.java new file mode 100644 index 0000000..a1aa300 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/AddEnemyCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.elist; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.elist.AddEnemyCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class AddEnemyCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AddEnemyCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + AddEnemyCommand command = (AddEnemyCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.empireManagement.getEnemyLists( empireId ); + } + return this.empireManagement.addEnemy( empireId , command.isAlliance( ) , command.getName( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/EnemyListCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/EnemyListCommandDelegateBean.java new file mode 100644 index 0000000..0960e16 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/EnemyListCommandDelegateBean.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.beans.user.player.game.elist; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.elist.EnemyListCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class EnemyListCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return EnemyListCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + return this.empireManagement.getEnemyLists( session.get( "empireId" , Integer.class ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/RemoveEnemiesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/RemoveEnemiesCommandDelegateBean.java new file mode 100644 index 0000000..c940d42 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/elist/RemoveEnemiesCommandDelegateBean.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.beans.user.player.game.elist; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.elist.RemoveEnemiesCommand; +import com.deepclone.lw.interfaces.game.EmpireManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class RemoveEnemiesCommandDelegateBean + implements AutowiredCommandDelegate +{ + + private EmpireManagement empireManagement; + + + @Autowired( required = true ) + public void setEmpireManager( EmpireManagement manager ) + { + this.empireManagement = manager; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RemoveEnemiesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + RemoveEnemiesCommand command = (RemoveEnemiesCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.empireManagement.getEnemyLists( empireId ); + } + return this.empireManagement.removeEnemies( empireId , command.isAlliance( ) , command.getIdentifiers( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/DisbandFleetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/DisbandFleetsCommandDelegateBean.java new file mode 100644 index 0000000..535ffc0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/DisbandFleetsCommandDelegateBean.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.DisbandFleetsCommand; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class DisbandFleetsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return DisbandFleetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + DisbandFleetsCommand command = (DisbandFleetsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.disband( empireId , new long[] { } , false ); + } + return this.fleetManager.disband( empireId , command.getFleets( ) , command.isConfirm( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MergeFleetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MergeFleetsCommandDelegateBean.java new file mode 100644 index 0000000..c4769a5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MergeFleetsCommandDelegateBean.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.MergeFleetsCommand; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class MergeFleetsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MergeFleetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + MergeFleetsCommand command = (MergeFleetsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.disband( empireId , new long[] { } , false ); + } + return this.fleetManager.merge( empireId , command.getFleets( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MoveFleetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MoveFleetsCommandDelegateBean.java new file mode 100644 index 0000000..e40f64a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/MoveFleetsCommandDelegateBean.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.MoveFleetsCommand; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class MoveFleetsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MoveFleetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + MoveFleetsCommand command = (MoveFleetsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.disband( empireId , new long[] { } , false ); + } + + String destination = command.getDestination( ); + if ( destination != null ) { + destination = destination.trim( ); + if ( "".equals( destination ) ) { + destination = null; + } + } + boolean attack = ( destination == null ) ? false : command.getMode( ); + + return this.fleetManager.move( empireId , command.getFleets( ) , destination , attack ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/RenameFleetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/RenameFleetsCommandDelegateBean.java new file mode 100644 index 0000000..240c345 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/RenameFleetsCommandDelegateBean.java @@ -0,0 +1,88 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.RenameFleetsCommand; +import com.deepclone.lw.cmd.player.fleets.RenameFleetsResponse; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class RenameFleetsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RenameFleetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + RenameFleetsCommand command = (RenameFleetsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.disband( empireId , new long[] { } , false ); + } + + String name; + boolean error; + if ( command.isRename( ) ) { + name = command.getName( ).trim( ); + if ( !"".equals( name ) && this.validator.customValidate( name , 1 , 40 ) != null ) { + error = true; + name = null; + } else { + error = false; + } + } else { + name = null; + error = false; + } + + RenameFleetsResponse response; + response = (RenameFleetsResponse) this.fleetManager.rename( empireId , command.getFleets( ) , name ); + + response.setError( error ); + if ( error ) { + response.setName( command.getName( ).trim( ) ); + } + + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SetFleetsModeCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SetFleetsModeCommandDelegateBean.java new file mode 100644 index 0000000..18c2281 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SetFleetsModeCommandDelegateBean.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.SetFleetsModeCommand; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class SetFleetsModeCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SetFleetsModeCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + SetFleetsModeCommand command = (SetFleetsModeCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.disband( empireId , new long[] { } , false ); + } + return this.fleetManager.setMode( empireId , command.getFleets( ) , command.isAttack( ) , command.isConfirm( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SplitFleetCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SplitFleetCommandDelegateBean.java new file mode 100644 index 0000000..3d77684 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/SplitFleetCommandDelegateBean.java @@ -0,0 +1,88 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.SplitFleetCommand; +import com.deepclone.lw.cmd.player.fleets.SplitFleetResponse; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class SplitFleetCommandDelegateBean + implements AutowiredCommandDelegate +{ + private FleetManagement fleetManager; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return SplitFleetCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + SplitFleetCommand command = (SplitFleetCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.fleetManager.split( empireId , -1 , null , 0 , null , false ); + } + + String name = command.getName( ); + boolean error; + if ( name != null ) { + name = command.getName( ).trim( ); + if ( !"".equals( name ) && this.validator.customValidate( name , 1 , 40 ) != null ) { + error = true; + name = ""; + } else { + error = false; + } + } else { + error = false; + } + + int nFleets = ( command.getnFleets( ) == null ) ? 0 : command.getnFleets( ).intValue( ); + SplitFleetResponse response = this.fleetManager.split( empireId , command.getFleet( ) , command.getShips( ) , + nFleets , name , error ); + + response.setNameError( error ); + if ( error ) { + response.setName( command.getName( ).trim( ) ); + } + + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/ViewFleetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/ViewFleetsCommandDelegateBean.java new file mode 100644 index 0000000..96f6dde --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/fleets/ViewFleetsCommandDelegateBean.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.beans.user.player.game.fleets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.fleets.ViewFleetsCommand; +import com.deepclone.lw.interfaces.game.FleetManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewFleetsCommandDelegateBean + implements AutowiredCommandDelegate + +{ + private FleetManagement fleetManager; + + + @Autowired( required = true ) + public void setFleetManager( FleetManagement fleetManager ) + { + this.fleetManager = fleetManager; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewFleetsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + int empireId = session.get( "empireId" , Integer.class ); + return this.fleetManager.getFleets( empireId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/AbandonPlanetCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/AbandonPlanetCommandDelegateBean.java new file mode 100644 index 0000000..ba7155c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/AbandonPlanetCommandDelegateBean.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.planets.AbandonPlanetCommand; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class AbandonPlanetCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return AbandonPlanetCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + AbandonPlanetCommand command = (AbandonPlanetCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.planetsManagement.viewPlanet( empireId , planetId ); + } + + if ( command.isCancel( ) ) { + return this.planetsManagement.cancelAbandon( empireId , planetId ); + } + return this.planetsManagement.abandon( empireId , planetId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/BuildingActionCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/BuildingActionCommandDelegateBean.java new file mode 100644 index 0000000..25050a3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/BuildingActionCommandDelegateBean.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.planets.BuildingActionCommand; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class BuildingActionCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return BuildingActionCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + BuildingActionCommand command = (BuildingActionCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.planetsManagement.viewPlanet( empireId , planetId ); + } + return this.planetsManagement.addToCivilianQueue( empireId , planetId , command.getbType( ) , command + .isDestroy( ) , command.getAmount( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/FlushQueueCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/FlushQueueCommandDelegateBean.java new file mode 100644 index 0000000..c43095e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/FlushQueueCommandDelegateBean.java @@ -0,0 +1,57 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.planets.FlushQueueCommand; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class FlushQueueCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return FlushQueueCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + FlushQueueCommand command = (FlushQueueCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.planetsManagement.viewPlanet( empireId , planetId ); + } + return this.planetsManagement.flushQueue( empireId , planetId , command.isMilitary( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/RenamePlanetCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/RenamePlanetCommandDelegateBean.java new file mode 100644 index 0000000..f006bee --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/RenamePlanetCommandDelegateBean.java @@ -0,0 +1,78 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.ObjectNameValidatorBean; +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.planets.RenamePlanetCommand; +import com.deepclone.lw.cmd.player.planets.RenamePlanetResponse; +import com.deepclone.lw.cmd.player.planets.ViewPlanetResponse; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class RenamePlanetCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + private ObjectNameValidatorBean validator; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Autowired( required = true ) + public void setObjectNameValidator( ObjectNameValidatorBean validator ) + { + this.validator = validator; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return RenamePlanetCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + RenamePlanetCommand command = (RenamePlanetCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.planetsManagement.viewPlanet( empireId , planetId ); + } + + String name = command.getName( ); + ObjectNameError one = this.validator.validate( name ); + if ( one != null ) { + ViewPlanetResponse r = this.planetsManagement.viewPlanet( empireId , planetId ); + return new RenamePlanetResponse( planetId , r.getPage( ) , r.getBasic( ) , r.getOrbit( ) , r.getOwn( ) , + name , one.toString( ) ); + } + + return this.planetsManagement.renamePlanet( empireId , planetId , name ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ShipBuildingCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ShipBuildingCommandDelegateBean.java new file mode 100644 index 0000000..07fa618 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ShipBuildingCommandDelegateBean.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.planets.BuildShipsCommand; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ShipBuildingCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return BuildShipsCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + BuildShipsCommand command = (BuildShipsCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + if ( session.get( "vacation" , Boolean.class ) ) { + return this.planetsManagement.viewPlanet( empireId , planetId ); + } + return this.planetsManagement.addToMilitaryQueue( empireId , planetId , command.getsType( ) , command + .getAmount( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ViewPlanetCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ViewPlanetCommandDelegateBean.java new file mode 100644 index 0000000..d3668f3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/game/planets/ViewPlanetCommandDelegateBean.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.beans.user.player.game.planets; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.planets.ViewPlanetCommand; +import com.deepclone.lw.interfaces.game.PlanetsManagement; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ViewPlanetCommandDelegateBean + implements AutowiredCommandDelegate + +{ + + private PlanetsManagement planetsManagement; + + + @Autowired( required = true ) + public void setPlanetsManagement( PlanetsManagement planetsManagement ) + { + this.planetsManagement = planetsManagement; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ViewPlanetCommand.class; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ViewPlanetCommand command = (ViewPlanetCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + int planetId = command.getId( ); + return this.planetsManagement.viewPlanet( empireId , planetId ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ComposeMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ComposeMessageCommandDelegateBean.java new file mode 100644 index 0000000..4fa1eb5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ComposeMessageCommandDelegateBean.java @@ -0,0 +1,76 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.msgs.ComposeMessageCommand; +import com.deepclone.lw.cmd.player.msgs.ComposeMessageResponse; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ComposeMessageCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ComposeMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ComposeMessageCommand command = (ComposeMessageCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + + MessageType type = command.getType( ); + if ( type == MessageType.INTERNAL ) { + type = MessageType.EMPIRE; + } + String target = command.getTarget( ); + String title = command.getSubject( ).trim( ); + String contents = command.getContents( ).trim( ); + + boolean titleError = ( title.length( ) < 2 || title.length( ) > 64 ); + boolean contentsError = ( contents.length( ) < 2 ); + + ComposeMessageResponse response; + if ( command.getReplyTo( ) != null && command.getInbox( ) != null ) { + response = this.messages.sendReply( empireId , command.getInbox( ) , command.getReplyTo( ) , type , + target , title , contents , titleError || contentsError ); + } else { + response = this.messages.sendMessage( empireId , type , target , title , contents , titleError + || contentsError ); + } + response.setTitleError( titleError ); + response.setContentsError( contentsError ); + + return response; + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/GetMessagesCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/GetMessagesCommandDelegateBean.java new file mode 100644 index 0000000..87bd199 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/GetMessagesCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.msgs.GetMessagesCommand; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class GetMessagesCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return GetMessagesCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + GetMessagesCommand command = (GetMessagesCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + return this.messages.getMessages( empireId , command.isInbox( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ListTargetsCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ListTargetsCommandDelegateBean.java new file mode 100644 index 0000000..66ff2a1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ListTargetsCommandDelegateBean.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.msgs.ListTargetsCommand; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ListTargetsCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ListTargetsCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command command ) + { + int empireId = session.get( "empireId" , Integer.class ); + return this.messages.getTargets( empireId ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/MessageBoxCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/MessageBoxCommandDelegateBean.java new file mode 100644 index 0000000..245f149 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/MessageBoxCommandDelegateBean.java @@ -0,0 +1,71 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.msgs.MessageBoxCommand; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.NullResponse; + + + +public class MessageBoxCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return MessageBoxCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + MessageBoxCommand command = (MessageBoxCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + + long[] selection = command.getSelection( ); + if ( selection != null && selection.length == 0 ) { + return new NullResponse( ); + } + + switch ( command.getAction( ) ) { + case DELETE: + this.messages.deleteMessages( empireId , command.isInbox( ) , selection ); + break; + case MARK_READ: + this.messages.markRead( empireId , selection ); + break; + case MARK_UNREAD: + this.messages.markUnread( empireId , selection ); + break; + } + + return new NullResponse( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/PrepareMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/PrepareMessageCommandDelegateBean.java new file mode 100644 index 0000000..f0e08de --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/PrepareMessageCommandDelegateBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.msgs.PrepareMessageCommand; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class PrepareMessageCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return PrepareMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + PrepareMessageCommand command = (PrepareMessageCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + MessageType type = command.getType( ); + + if ( type == null ) { + return this.messages.prepareBlankMessage( empireId ); + } else if ( type == MessageType.INTERNAL ) { + return this.messages.prepareReply( empireId , command.getInbox( ) , command.getId( ) ); + } + return this.messages.prepareMessageTo( empireId , type , command.getId( ).intValue( ) ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ReadMessageCommandDelegateBean.java b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ReadMessageCommandDelegateBean.java new file mode 100644 index 0000000..64183dd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/java/com/deepclone/lw/beans/user/player/msgs/ReadMessageCommandDelegateBean.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.beans.user.player.msgs; + + +import org.springframework.beans.factory.annotation.Autowired; + +import com.deepclone.lw.beans.user.abst.AutowiredCommandDelegate; +import com.deepclone.lw.beans.user.abst.SessionCommandHandler; +import com.deepclone.lw.beans.user.player.GameSubTypeBean; +import com.deepclone.lw.cmd.player.msgs.ReadMessageCommand; +import com.deepclone.lw.interfaces.msg.EmpireMessages; +import com.deepclone.lw.interfaces.session.ServerSession; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; + + + +public class ReadMessageCommandDelegateBean + implements AutowiredCommandDelegate +{ + private EmpireMessages messages; + + + @Autowired( required = true ) + public void setMessages( EmpireMessages messages ) + { + this.messages = messages; + } + + + @Override + public Class< ? extends SessionCommandHandler > getCommandHandler( ) + { + return GameSubTypeBean.class; + } + + + @Override + public Class< ? extends Command > getType( ) + { + return ReadMessageCommand.class; + } + + + @Override + public CommandResponse execute( ServerSession session , Command cParam ) + { + ReadMessageCommand command = (ReadMessageCommand) cParam; + int empireId = session.get( "empireId" , Integer.class ); + return this.messages.getMessage( empireId , command.isInbox( ) , command.getId( ) ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user-beans.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user-beans.xml new file mode 100644 index 0000000..3c1c824 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user-beans.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/admin-session-definer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/admin-session-definer-bean.xml new file mode 100644 index 0000000..deab9c8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/admin-session-definer-bean.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/external-session-definer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/external-session-definer-bean.xml new file mode 100644 index 0000000..e0ffd6f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/external-session-definer-bean.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/object-name-validator-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/object-name-validator-bean.xml new file mode 100644 index 0000000..7d06f66 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/object-name-validator-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/player-session-definer-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/player-session-definer-bean.xml new file mode 100644 index 0000000..37a91ea --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/player-session-definer-bean.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-command-wiring-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-command-wiring-bean.xml new file mode 100644 index 0000000..da9ba6d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-command-wiring-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-subtype-wiring-bean.xml b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-subtype-wiring-bean.xml new file mode 100644 index 0000000..5713773 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/legacyworlds-server-beans-user/src/main/resources/configuration/user/session-subtype-wiring-bean.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-beans/pom.xml b/legacyworlds-server/legacyworlds-server-beans/pom.xml new file mode 100644 index 0000000..9d74460 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-beans/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-beans + Legacy Worlds server beans + 5.99.1 + pom + This metapackage regroups all packages which define beans for the Legacy Worlds server. + + + + com.deepclone.lw + legacyworlds-server-interfaces + ${project.version} + + + + + legacyworlds-server-beans-i18n + legacyworlds-server-beans-eventlog + legacyworlds-server-beans-accounts + legacyworlds-server-beans-mailer + legacyworlds-server-beans-system + legacyworlds-server-beans-naming + legacyworlds-server-beans-bt + legacyworlds-server-beans-user + legacyworlds-server-beans-simple + + diff --git a/legacyworlds-server/legacyworlds-server-data/.classpath b/legacyworlds-server/legacyworlds-server-data/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-data/.project b/legacyworlds-server/legacyworlds-server-data/.project new file mode 100644 index 0000000..e0c56e5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-data + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-data/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-data/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b66e1f0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:19:59 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/database.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/database.sql new file mode 100644 index 0000000..675eeb6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/database.sql @@ -0,0 +1,54 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Main database script +-- +-- Initialises the various roles and the database itself, +-- then processes scripts from the "parts" directory. +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- Read configuration from file +\set pgadmin `grep ^admin= db-config.txt | sed -e s/.*=//` +\set dbname `grep ^db= db-config.txt | sed -e s/.*=//` +\set dbuser `grep ^user= db-config.txt | sed -e s/.*=//` +\set dbupass ''''`grep ^password= db-config.txt | sed -e s/.*=// -e "s/'/''/g"`'''' + + +-- Connect to the main system database +\c postgres :pgadmin + +-- Drop the database and users if they exist +DROP DATABASE IF EXISTS :dbname; +DROP ROLE IF EXISTS :dbuser; + +-- Create the LW users +CREATE ROLE :dbuser WITH LOGIN ENCRYPTED PASSWORD :dbupass; + +-- Create the database +CREATE DATABASE :dbname ENCODING='UTF8' TEMPLATE=template0; +GRANT CONNECT ON DATABASE :dbname TO :dbuser; + + +-- Connect to the LW database with the PostgreSQL admin user +\c :dbname :pgadmin + +-- Register PL/PgSQL +CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql; + +BEGIN; + +-- Create database schemas +\i parts/000-schemas.sql + +-- Process structure definition scripts +\i parts/010-data.sql + +-- Process functions and views definition scripts +\i parts/020-functions.sql + +-- Process game update functions +\i parts/030-updates.sql + +COMMIT; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/db-config.txt b/legacyworlds-server/legacyworlds-server-data/db-structure/db-config.txt new file mode 100644 index 0000000..c8cc851 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/db-config.txt @@ -0,0 +1,4 @@ +admin=tseeker +db=lwb6 +user=lwb6 +password=test diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/000-schemas.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/000-schemas.sql new file mode 100644 index 0000000..20284d2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/000-schemas.sql @@ -0,0 +1,46 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Creates schemas +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +CREATE SCHEMA admin; +GRANT USAGE ON SCHEMA admin TO :dbuser; + +CREATE SCHEMA battles; +GRANT USAGE ON SCHEMA battles TO :dbuser; + +CREATE SCHEMA bugs; +GRANT USAGE ON SCHEMA bugs TO :dbuser; + +CREATE SCHEMA defs; +GRANT USAGE ON SCHEMA defs TO :dbuser; + +CREATE SCHEMA events; +GRANT USAGE ON SCHEMA events TO :dbuser; + +CREATE SCHEMA emp; +GRANT USAGE ON SCHEMA emp TO :dbuser; + +CREATE SCHEMA fleets; +GRANT USAGE ON SCHEMA fleets TO :dbuser; + +CREATE SCHEMA msgs; +GRANT USAGE ON SCHEMA msgs TO :dbuser; + +CREATE SCHEMA naming; +GRANT USAGE ON SCHEMA naming TO :dbuser; + +CREATE SCHEMA sys; +GRANT USAGE ON SCHEMA sys TO :dbuser; + +CREATE SCHEMA tech; +GRANT USAGE ON SCHEMA tech TO :dbuser; + +CREATE SCHEMA users; +GRANT USAGE ON SCHEMA users TO :dbuser; + +CREATE SCHEMA verse; +GRANT USAGE ON SCHEMA verse TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/010-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/010-data.sql new file mode 100644 index 0000000..add939b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/010-data.sql @@ -0,0 +1,29 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Structures creation +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +\i parts/data/000-typedefs.sql +\i parts/data/010-i18n-data.sql +\i parts/data/020-prefs-data.sql +\i parts/data/030-users-data.sql +\i parts/data/035-session-data.sql +\i parts/data/040-admin-data.sql +\i parts/data/050-accounts-data.sql +\i parts/data/055-bugs-data.sql +\i parts/data/060-naming-data.sql +\i parts/data/070-constants-data.sql +\i parts/data/080-techs-data.sql +\i parts/data/090-buildables-data.sql +\i parts/data/100-universe-data.sql +\i parts/data/110-empires-data.sql +\i parts/data/120-construction-data.sql +\i parts/data/130-fleets-data.sql +\i parts/data/140-status-data.sql +\i parts/data/150-logs-data.sql +\i parts/data/160-battle-data.sql +\i parts/data/170-events-data.sql +\i parts/data/180-messages-data.sql \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/020-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/020-functions.sql new file mode 100644 index 0000000..5a55389 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/020-functions.sql @@ -0,0 +1,36 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions and views +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +\i parts/functions/000-defs-functions.sql +\i parts/functions/002-sys-functions.sql +\i parts/functions/005-logs-functions.sql +\i parts/functions/010-constants-functions.sql +\i parts/functions/020-naming-functions.sql +\i parts/functions/030-tech-functions.sql +\i parts/functions/035-users-view.sql +\i parts/functions/040-empire-functions.sql +\i parts/functions/050-computation-functions.sql +\i parts/functions/060-universe-functions.sql +\i parts/functions/070-users-functions.sql +\i parts/functions/075-session-functions.sql +\i parts/functions/080-buildings-functions.sql +\i parts/functions/100-status-functions.sql +\i parts/functions/110-prefs-functions.sql +\i parts/functions/120-map-functions.sql +\i parts/functions/140-planets-functions.sql +\i parts/functions/150-battle-functions.sql +\i parts/functions/160-battle-views.sql +\i parts/functions/163-alliance-functions.sql +\i parts/functions/165-fleets-functions.sql +\i parts/functions/167-planet-list.sql +\i parts/functions/170-event-functions.sql +\i parts/functions/180-messages-functions.sql +\i parts/functions/190-admin-functions.sql +\i parts/functions/200-bugs-functions.sql +\i parts/functions/210-admin-overview.sql + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/030-updates.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/030-updates.sql new file mode 100644 index 0000000..47862f5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/030-updates.sql @@ -0,0 +1,22 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +\i parts/updates/000-updates-ctrl.sql +\i parts/updates/010-empire-money.sql +\i parts/updates/020-empire-research.sql +\i parts/updates/025-empire-debt.sql +\i parts/updates/030-fleet-arrivals.sql +\i parts/updates/040-fleet-movements.sql +\i parts/updates/050-fleet-status.sql +\i parts/updates/060-planet-battle.sql +\i parts/updates/070-planet-abandon.sql +\i parts/updates/080-planet-construction.sql +\i parts/updates/090-planet-military.sql +\i parts/updates/100-planet-population.sql +\i parts/updates/110-planet-money.sql diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/000-typedefs.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/000-typedefs.sql new file mode 100644 index 0000000..4ba3baa --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/000-typedefs.sql @@ -0,0 +1,53 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Type definitions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- Processing status +CREATE TYPE processing_status + AS ENUM ( 'FUTURE', 'PROCESSING', 'PROCESSED' ); + +-- Building output types +CREATE TYPE building_output_type + AS ENUM ( 'CASH', 'POP', 'DEF', 'WORK' ); + +-- Fleet status +CREATE TYPE fleet_status + AS ENUM ( 'AVAILABLE', 'DEPLOYING' , 'REDEPLOYING' , 'REDIRECTING' ); + +-- Log levels +CREATE TYPE log_level + AS ENUM ( 'TRACE' , 'DEBUG' , 'INFO' , 'WARNING' , 'ERROR' ); + +-- Log types +CREATE TYPE log_type + AS ENUM ( 'SYS' , 'USERS' , 'ADMIN' ); + +-- Update types +CREATE TYPE update_type AS ENUM ( + 'EMPIRE_MONEY' , + 'EMPIRE_RESEARCH' , + 'EMPIRE_DEBT' , + 'PLANET_FLEET_ARRIVALS' , + 'PLANET_FLEET_MOVEMENTS' , + 'PLANET_FLEET_STATUS' , + 'PLANET_BATTLE_START' , + 'PLANET_BATTLE_MAIN' , + 'PLANET_BATTLE_END' , + 'PLANET_ABANDON' , + 'PLANET_CONSTRUCTION' , + 'PLANET_MILITARY' , + 'PLANET_POPULATION' , + 'PLANET_MONEY' +); + +-- Types of recapitulative e-mail messages +CREATE TYPE recap_type + AS ENUM ( 'ADMIN' , 'MSG', 'ERROR' ); + +-- Empire relations +CREATE TYPE empire_relation_type + AS ENUM ('OWN' , 'ALLIED' , 'ENEMY'); diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/010-i18n-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/010-i18n-data.sql new file mode 100644 index 0000000..15ba3d3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/010-i18n-data.sql @@ -0,0 +1,53 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Translations +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Languages +-- +CREATE TABLE defs.languages( + id SERIAL PRIMARY KEY , + language VARCHAR(5) NOT NULL , + name VARCHAR(48) NOT NULL +); + +CREATE UNIQUE INDEX idx_languages_lid + ON defs.languages (language); + + + +-- +-- Internationalised strings +-- +CREATE TABLE defs.strings( + id SERIAL PRIMARY KEY , + name VARCHAR(64) NOT NULL +); + +CREATE UNIQUE INDEX idx_strings_id + ON defs.strings (name); + + + +-- +-- Translations +-- +CREATE TABLE defs.translations( + lang_id INT NOT NULL , + string_id INT NOT NULL , + translated_string TEXT NOT NULL , + PRIMARY KEY (lang_id, string_id) +); + +CREATE INDEX idx_translations_string + ON defs.translations (string_id); + +ALTER TABLE defs.translations + ADD CONSTRAINT fk_translation_language + FOREIGN KEY (lang_id) REFERENCES defs.languages , + ADD CONSTRAINT fk_translation_string + FOREIGN KEY (string_id) REFERENCES defs.strings; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/020-prefs-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/020-prefs-data.sql new file mode 100644 index 0000000..ab2e7c3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/020-prefs-data.sql @@ -0,0 +1,57 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Preference definitions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Preference groups +-- +CREATE TABLE defs.preference_groups( + id SERIAL PRIMARY KEY , + name VARCHAR(32) NOT NULL , + display_id INT NOT NULL +); + +CREATE UNIQUE INDEX idx_prefgroups_name + ON defs.preference_groups (name); +CREATE INDEX idx_prefgroups_dispname + ON defs.preference_groups (display_id); + +ALTER TABLE defs.preference_groups + ADD CONSTRAINT fk_prefgroups_display + FOREIGN KEY (display_id) REFERENCES defs.strings; + + +-- +-- Preference definitions +-- +CREATE TABLE defs.preference_definitions( + id SERIAL PRIMARY KEY , + group_id INT NOT NULL , + name VARCHAR(32) NOT NULL , + disp_name_id INT NOT NULL , + disp_desc_id INT NOT NULL , + java_type VARCHAR( 255 ) NOT NULL , + default_value TEXT NOT NULL +); + +CREATE INDEX idx_prefdefs_group + ON defs.preference_definitions (group_id); +CREATE UNIQUE INDEX idx_prefdefs_name + ON defs.preference_definitions (name); +CREATE INDEX idx_prefdefs_dispname + ON defs.preference_definitions (disp_name_id); +CREATE INDEX idx_prefdefs_dispdesc + ON defs.preference_definitions (disp_desc_id); + +ALTER TABLE defs.preference_definitions + ADD CONSTRAINT fk_prefdefs_group + FOREIGN KEY (group_id) REFERENCES defs.preference_groups , + ADD CONSTRAINT fk_prefdefs_dispname + FOREIGN KEY (disp_name_id) REFERENCES defs.strings , + ADD CONSTRAINT fk_prefdefs_dispdesc + FOREIGN KEY (disp_desc_id) REFERENCES defs.strings; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/030-users-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/030-users-data.sql new file mode 100644 index 0000000..97f0988 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/030-users-data.sql @@ -0,0 +1,111 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- User management tables +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Identifiers sequence for users +-- +CREATE SEQUENCE users.identifiers_seq; + + +-- +-- E-mail addresses +-- +CREATE TABLE users.addresses( + id INT DEFAULT nextval('users.identifiers_seq') NOT NULL PRIMARY KEY , + address VARCHAR(255) NOT NULL +); + +CREATE UNIQUE INDEX idx_addresses_address + ON users.addresses (lower(address)); + + +-- +-- User credentials +-- +CREATE TABLE users.credentials( + address_id INT NOT NULL PRIMARY KEY, + pass_md5 CHAR(32) NOT NULL , + pass_sha1 CHAR(40) NOT NULL , + credits INT NOT NULL CHECK (credits >= 0) , + language_id INT NOT NULL +); + +ALTER TABLE users.credentials + ADD CONSTRAINT fk_credentials_id + FOREIGN KEY (address_id) REFERENCES users.addresses + ON DELETE CASCADE , + ADD CONSTRAINT fk_credentials_language + FOREIGN KEY (language_id) REFERENCES defs.languages; + + +-- +-- Validation keys +-- +CREATE TABLE users.validation_keys( + credentials_id INT NOT NULL PRIMARY KEY , + token CHAR( 64 ) NOT NULL , + created TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT NOW() +); + +CREATE INDEX idx_validationkeys_created + ON users.validation_keys (created); + +ALTER TABLE users.validation_keys + ADD CONSTRAINT fk_validationkeys_id + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Password recovery +-- +CREATE TABLE users.pwd_recovery_requests( + credentials_id INT NOT NULL PRIMARY KEY , + token CHAR( 64 ) NOT NULL , + used BOOLEAN NOT NULL + DEFAULT FALSE , + created TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT NOW() +); + +CREATE INDEX idx_pwdrecovery_created + ON users.pwd_recovery_requests (created); + +ALTER TABLE users.pwd_recovery_requests + ADD CONSTRAINT fk_pwdrecovery_id + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Mail address change requests +-- +CREATE TABLE users.address_change_requests( + credentials_id INT NOT NULL PRIMARY KEY , + address_id INT NOT NULL , + token CHAR( 64 ) NOT NULL , + used BOOLEAN NOT NULL + DEFAULT FALSE , + created TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT NOW() +); + +CREATE UNIQUE INDEX idx_addrchangereq_address + ON users.address_change_requests (address_id); +CREATE INDEX idx_addrchangereq_created + ON users.address_change_requests (created); + +ALTER TABLE users.address_change_requests + ADD CONSTRAINT fk_addrchangereq_id + FOREIGN KEY (credentials_id) REFERENCES users.credentials ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT fk_addrchangereq_address + FOREIGN KEY (address_id) REFERENCES users.addresses ON DELETE CASCADE; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/035-session-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/035-session-data.sql new file mode 100644 index 0000000..7d88e09 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/035-session-data.sql @@ -0,0 +1,92 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- User sessions tables +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Session client type definitions +-- + +CREATE TABLE defs.session_clients( + id SERIAL PRIMARY KEY , + name VARCHAR( 16 ) NOT NULL UNIQUE , + exclusive BOOLEAN NOT NULL +); + +-- +-- Default session client types +-- + +INSERT INTO defs.session_clients ( name , exclusive ) + VALUES( 'web' , TRUE ); +INSERT INTO defs.session_clients ( name , exclusive ) + VALUES( 'vac_end' , FALSE ); + + + +-- +-- Types of session termination +-- + +CREATE TYPE session_termination_type + AS ENUM( 'MANUAL' , 'GONE' , 'EXPIRED' , 'EXCLUSIVE' , 'SERVER' ); + + + +-- +-- User sessions start +-- + +CREATE TABLE users.session_starts( + id BIGSERIAL PRIMARY KEY , + credentials_id INT NOT NULL , + client_id INT NOT NULL , + session VARCHAR( 64 ) NOT NULL , + started TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + from_address VARCHAR( 64 ) NOT NULL +); + +CREATE INDEX idx_sessstart_credentials + ON users.session_starts ( credentials_id ); + +CREATE INDEX idx_sessstart_client + ON users.session_starts ( client_id ); + +CREATE INDEX idx_sessstart_started + ON users.session_starts ( started ); + +ALTER TABLE users.session_starts + ADD CONSTRAINT fk_sessstart_credentials + FOREIGN KEY ( credentials_id ) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE , + ADD CONSTRAINT fk_sessstart_client + FOREIGN KEY ( client_id ) REFERENCES defs.session_clients; + + + +-- +-- User sessions end +-- + +CREATE TABLE users.session_ends( + id BIGINT NOT NULL PRIMARY KEY , + ended TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + end_type session_termination_type NOT NULL +); + +CREATE INDEX idx_sessend_ended + ON users.session_ends ( ended ); + +ALTER TABLE users.session_ends + ADD CONSTRAINT fk_sessend_id + FOREIGN KEY ( id ) REFERENCES users.session_starts + ON DELETE CASCADE; + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/040-admin-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/040-admin-data.sql new file mode 100644 index 0000000..928ae81 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/040-admin-data.sql @@ -0,0 +1,169 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Administrative tables +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Administrators +-- +CREATE TABLE admin.administrators( + id SERIAL NOT NULL PRIMARY KEY , + appear_as VARCHAR( 48 ) NOT NULL , + pass_md5 CHAR(32) NOT NULL , + pass_sha1 CHAR(40) NOT NULL , + privileges INT NOT NULL +); + +CREATE UNIQUE INDEX idx_administrators_appearas + ON admin.administrators( lower(appear_as) ); + + +-- +-- Administrators <-> credentials +-- +CREATE TABLE admin.admin_credentials( + administrator_id INT NOT NULL , + credentials_id INT NOT NULL , + PRIMARY KEY(administrator_id) +); + +CREATE UNIQUE INDEX idx_admincreds_creds + ON admin.admin_credentials( credentials_id ); + +ALTER TABLE admin.admin_credentials + ADD CONSTRAINT fk_admincreds_admin + FOREIGN KEY (administrator_id) REFERENCES admin.administrators , + ADD CONSTRAINT fk_admincreds_creds + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON UPDATE CASCADE; + + +-- +-- Ban requests +-- +CREATE TABLE admin.ban_requests( + id SERIAL NOT NULL PRIMARY KEY , + requested_by INT NOT NULL , + reason TEXT NOT NULL , + requested TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now() +); + +CREATE INDEX idx_banrequests_requestedby + ON admin.ban_requests( requested_by ); + +ALTER TABLE admin.ban_requests + ADD CONSTRAINT fk_banrequests_requestedby + FOREIGN KEY (requested_by) REFERENCES admin.administrators; + + +-- +-- Active ban requests +-- +CREATE TABLE admin.active_ban_requests( + request_id INT NOT NULL PRIMARY KEY , + credentials_id INT NOT NULL , + validated BOOLEAN NOT NULL + DEFAULT FALSE +); + +CREATE UNIQUE INDEX idx_activebanrequests_creds + ON admin.active_ban_requests (credentials_id); + +ALTER TABLE admin.active_ban_requests + ADD CONSTRAINT fk_activebanrequests_request + FOREIGN KEY (request_id) REFERENCES admin.ban_requests , + ADD CONSTRAINT fk_activebanrequests_creds + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Archived ban requests +-- +CREATE TABLE admin.archived_ban_requests( + request_id INT NOT NULL PRIMARY KEY , + credentials_id INT NOT NULL , + updated TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now() +); + +CREATE INDEX idx_archivedbanrequests_creds + ON admin.archived_ban_requests (credentials_id); + +ALTER TABLE admin.archived_ban_requests + ADD CONSTRAINT fk_archivedbanrequests_request + FOREIGN KEY (request_id) REFERENCES admin.ban_requests , + ADD CONSTRAINT fk_archivedbanrequests_creds + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Rejected ban requests +-- +CREATE TABLE admin.rejected_ban_requests( + request_id INT NOT NULL PRIMARY KEY , + rejected_by INT NOT NULL , + reason TEXT NOT NULL +); + +CREATE INDEX idx_rejectedbanrequests_rejected + ON admin.rejected_ban_requests (rejected_by); + +ALTER TABLE admin.rejected_ban_requests + ADD CONSTRAINT fk_rejectedbanrequests_request + FOREIGN KEY (request_id) REFERENCES admin.ban_requests , + ADD CONSTRAINT fk_rejectedbanrequests_rejected + FOREIGN KEY (rejected_by) REFERENCES admin.administrators; + + +-- +-- Validated ban requests +-- +CREATE TABLE admin.validated_ban_requests( + request_id INT NOT NULL PRIMARY KEY , + validated_by INT NOT NULL , + validated TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) +); + +CREATE INDEX idx_validatedbanrequests_validated + ON admin.validated_ban_requests (validated_by); + +ALTER TABLE admin.validated_ban_requests + ADD CONSTRAINT fk_validatedbanrequests_request + FOREIGN KEY (request_id) REFERENCES admin.ban_requests , + ADD CONSTRAINT fk_validatedbanrequests_rejected + FOREIGN KEY (validated_by) REFERENCES admin.administrators; + + + +-- +-- Warnings to users +-- + +CREATE TABLE admin.warnings ( + credentials_id INT NOT NULL PRIMARY KEY , + warnings INT NOT NULL + DEFAULT 1 + CHECK( warnings >= 0 ) , + last_received TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) +); + +CREATE INDEX idx_warnings_received + ON admin.warnings( last_received ) + WHERE warnings > 0; + +ALTER TABLE admin.warnings + ADD CONSTRAINT fk_warnings_credentials + FOREIGN KEY ( credentials_id ) REFERENCES users.credentials + ON UPDATE CASCADE ON DELETE CASCADE; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/050-accounts-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/050-accounts-data.sql new file mode 100644 index 0000000..2ffee8b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/050-accounts-data.sql @@ -0,0 +1,137 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Account tables +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Active account +-- +CREATE TABLE users.active_accounts( + credentials_id INT NOT NULL PRIMARY KEY , + vacation_credits INT NOT NULL CHECK( vacation_credits >= 0 ) +); + +ALTER TABLE users.active_accounts + ADD CONSTRAINT fk_activeaccounts_creds + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Vacation credits +-- +CREATE TABLE users.vacations( + account_id INT NOT NULL PRIMARY KEY , + since TIMESTAMP WITHOUT TIME ZONE + NOT NULL , + status processing_status NOT NULL +); + +CREATE INDEX idx_vacations_status + ON users.vacations (since, status); + +ALTER TABLE users.vacations + ADD CONSTRAINT fk_vacations_accounts + FOREIGN KEY (account_id) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Preferences +-- + +CREATE TABLE users.preferences( + account_id INT NOT NULL , + definition_id INT NOT NULL , + pref_value TEXT NOT NULL , + PRIMARY KEY (account_id,definition_id) +); + +CREATE INDEX idx_preferences_definition + ON users.preferences( definition_id ); + +ALTER TABLE users.preferences + ADD CONSTRAINT fk_preferences_accounts + FOREIGN KEY (account_id) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE , + ADD CONSTRAINT fk_preferences_definition + FOREIGN KEY (definition_id) REFERENCES defs.preference_definitions + ON DELETE CASCADE; + + +-- +-- Inactive accounts +-- + +CREATE TABLE users.inactive_accounts( + credentials_id INT NOT NULL PRIMARY KEY , + since TIMESTAMP WITHOUT TIME ZONE + NOT NULL , + status processing_status NOT NULL +); + +CREATE INDEX idx_inactiveaccounts_status + ON users.vacations (since, status); + +ALTER TABLE users.inactive_accounts + ADD CONSTRAINT fk_inactiveaccounts_creds + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Account de-activation reasons +-- +CREATE TABLE users.reasons( + account_id INT NOT NULL PRIMARY KEY , + reason TEXT NOT NULL +); + +ALTER TABLE users.reasons + ADD CONSTRAINT fk_reasons_account + FOREIGN KEY (account_id) REFERENCES users.inactive_accounts + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Bans +-- +CREATE TABLE users.bans( + account_id INT NOT NULL PRIMARY KEY , + ban_id INT NOT NULL +); + +CREATE UNIQUE INDEX idx_bans_banrequest + ON users.bans (ban_id); + +ALTER TABLE users.bans + ADD CONSTRAINT fk_bans_account + FOREIGN KEY (account_id) REFERENCES users.inactive_accounts + ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT fk_bans_ban + FOREIGN KEY (ban_id) REFERENCES admin.validated_ban_requests; + + + +-- +-- Table that stores inactivity warning e-mail status +-- + +CREATE TABLE users.inactivity_emails( + account_id INT NOT NULL PRIMARY KEY , + mail_sent TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) +); + +CREATE INDEX idx_inactivitymails_sent + ON users.inactivity_emails ( mail_sent ); + +ALTER TABLE users.inactivity_emails + ADD CONSTRAINT fk_inactivitymails_account + FOREIGN KEY ( account_id ) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/055-bugs-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/055-bugs-data.sql new file mode 100644 index 0000000..721c9e9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/055-bugs-data.sql @@ -0,0 +1,273 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Tables that support the bug tracking system +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Bug event types +-- + +CREATE TYPE bug_event_type + AS ENUM( 'INIT' , 'MERGE' , 'STATUS' , 'COMMENT' , 'VISIBILITY' ); + + + +-- +-- Bug statuses +-- + +CREATE TYPE bug_status_type + AS ENUM( 'OPEN' , 'NOT_A_BUG' , 'WONT_FIX' , 'RESOLVED' ); + + + +-- +-- Bug submitters +-- + +CREATE TABLE bugs.submitters ( + submitter_id BIGSERIAL PRIMARY KEY , + is_admin BOOLEAN NOT NULL , + name VARCHAR( 64 ) NOT NULL +); + +CREATE INDEX idx_submitters_isadmin + ON bugs.submitters ( is_admin ); + + + +-- +-- Bug submitters - administrators +-- + +CREATE TABLE bugs.admin_submitters( + submitter_id BIGINT PRIMARY KEY , + admin_id INT NOT NULL UNIQUE +); + +ALTER TABLE bugs.admin_submitters + ADD CONSTRAINT fk_adminsubs_submitter + FOREIGN KEY ( submitter_id ) REFERENCES bugs.submitters , + ADD CONSTRAINT fk_adminsubs_admin + FOREIGN KEY ( admin_id ) REFERENCES admin.administrators + ON DELETE CASCADE; + + + +-- +-- Bug submitters - users +-- + +CREATE TABLE bugs.user_submitters( + submitter_id BIGINT PRIMARY KEY , + account_id INT NOT NULL UNIQUE +); + +ALTER TABLE bugs.user_submitters + ADD CONSTRAINT fk_usersubs_submitter + FOREIGN KEY ( submitter_id ) REFERENCES bugs.submitters , + ADD CONSTRAINT fk_usersubs_account + FOREIGN KEY ( account_id ) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE; + + + +-- +-- Report groups +-- + +CREATE TABLE bugs.groups( + group_id BIGSERIAL PRIMARY KEY +); + + + +-- +-- Report events - main table +-- + +CREATE TABLE bugs.events( + event_id BIGSERIAL PRIMARY KEY , + group_id BIGINT NOT NULL , + submitter_id BIGINT NOT NULL , + e_type bug_event_type NOT NULL , + t TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) +); + +CREATE INDEX idx_events_group + ON bugs.events( group_id ); + +CREATE INDEX idx_events_submitter + ON bugs.events( submitter_id ); + +CREATE INDEX idx_events_time + ON bugs.events( t ); + +ALTER TABLE bugs.events + ADD CONSTRAINT fk_events_group + FOREIGN KEY ( group_id ) REFERENCES bugs.groups , + ADD CONSTRAINT fk_events_submitter + FOREIGN KEY ( submitter_id ) REFERENCES bugs.submitters; + +GRANT SELECT ON bugs.events TO :dbuser; + + + +-- +-- Report events - initial reports +-- + +CREATE TABLE bugs.initial_report_events( + event_id BIGINT PRIMARY KEY , + title VARCHAR( 128 ) NOT NULL , + description TEXT NOT NULL +); + +ALTER TABLE bugs.initial_report_events + ADD CONSTRAINT fk_initialreports_event + FOREIGN KEY ( event_id ) REFERENCES bugs.events; + + + +-- +-- Report events - mergers +-- + +CREATE TABLE bugs.merge_events( + event_id BIGINT PRIMARY KEY , + initial_post_id BIGINT NOT NULL +); + +CREATE INDEX idx_mergers_initialpost + ON bugs.merge_events( initial_post_id ); + +ALTER TABLE bugs.merge_events + ADD CONSTRAINT fk_mergers_event + FOREIGN KEY ( event_id ) REFERENCES bugs.events , + ADD CONSTRAINT fk_mergers_initial + FOREIGN KEY ( initial_post_id ) REFERENCES bugs.initial_report_events; + + + +-- +-- Report events - status change +-- + +CREATE TABLE bugs.status_change_events( + event_id BIGINT PRIMARY KEY , + status bug_status_type NOT NULL +); + +ALTER TABLE bugs.status_change_events + ADD CONSTRAINT fk_statuschanges_event + FOREIGN KEY ( event_id ) REFERENCES bugs.events; + + + +-- +-- Report events - comments +-- + +CREATE TABLE bugs.comment_events( + event_id BIGINT PRIMARY KEY , + comment TEXT NOT NULL , + visible BOOLEAN NOT NULL +); + +ALTER TABLE bugs.comment_events + ADD CONSTRAINT fk_comments_event + FOREIGN KEY ( event_id ) REFERENCES bugs.events; + + + +-- +-- Report events - visibility changes +-- + +CREATE TABLE bugs.visibility_events( + event_id BIGINT PRIMARY KEY , + visible BOOLEAN NOT NULL +); + + +ALTER TABLE bugs.visibility_events + ADD CONSTRAINT fk_visibility_event + FOREIGN KEY ( event_id ) REFERENCES bugs.events; + + + +-- +-- Account status information submitted along with bug reports by players +-- + +CREATE TABLE bugs.account_status_data( + event_id BIGINT PRIMARY KEY , + account_status TEXT +); + +ALTER TABLE bugs.account_status_data + ADD CONSTRAINT fk_accountstatus_event + FOREIGN KEY ( event_id ) REFERENCES bugs.initial_report_events; + +GRANT SELECT ON bugs.account_status_data TO :dbuser; + + + +-- +-- View status - administrators +-- + +CREATE TABLE bugs.admin_view_status( + group_id BIGINT NOT NULL , + admin_id INT NOT NULL , + last_view TIMESTAMP WITHOUT TIME ZONE + NOT NULL DEFAULT now( ) , + PRIMARY KEY( group_id , admin_id ) +); + +CREATE INDEX idx_adminview_admin + ON bugs.admin_view_status ( admin_id ); + +CREATE INDEX idx_adminview_lastview + ON bugs.admin_view_status ( last_view ); + +ALTER TABLE bugs.admin_view_status + ADD CONSTRAINT fk_adminview_group + FOREIGN KEY ( group_id ) REFERENCES bugs.groups + ON DELETE CASCADE , + ADD CONSTRAINT fk_adminview_admin + FOREIGN KEY ( admin_id ) REFERENCES admin.administrators; + + + +-- +-- View status - players +-- + +CREATE TABLE bugs.user_view_status( + group_id BIGINT NOT NULL , + user_id INT NOT NULL , + last_view TIMESTAMP WITHOUT TIME ZONE + NOT NULL DEFAULT now( ) , + PRIMARY KEY( group_id , user_id ) +); + +CREATE INDEX idx_userview_user + ON bugs.user_view_status ( user_id ); + +CREATE INDEX idx_userview_lastview + ON bugs.user_view_status ( last_view ); + +ALTER TABLE bugs.user_view_status + ADD CONSTRAINT fk_userview_group + FOREIGN KEY ( group_id ) REFERENCES bugs.groups + ON DELETE CASCADE , + ADD CONSTRAINT fk_userview_user + FOREIGN KEY ( user_id ) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/060-naming-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/060-naming-data.sql new file mode 100644 index 0000000..b9e0115 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/060-naming-data.sql @@ -0,0 +1,109 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Empire/map object names +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Banned names +-- + +CREATE TABLE naming.banned_names( + name VARCHAR(20) NOT NULL , + added_by INT NOT NULL +); + +CREATE UNIQUE INDEX idx_bannednames_name + ON naming.banned_names( lower(name) ); +CREATE INDEX idx_bannednames_addedby + ON naming.banned_names (added_by); + +ALTER TABLE naming.banned_names + ADD CONSTRAINT fk_bannednames_addedby + FOREIGN KEY (added_by) REFERENCES admin.administrators; + + +-- +-- Empire names +-- + +CREATE TABLE naming.empire_names ( + id SERIAL NOT NULL PRIMARY KEY , + owner_id INT NOT NULL , + name VARCHAR(20) NOT NULL +); + +CREATE UNIQUE INDEX idx_empirenames_name + ON naming.empire_names( lower(name) ); +CREATE INDEX idx_empirenames_owner + ON naming.empire_names( owner_id ); + +ALTER TABLE naming.empire_names + ADD CONSTRAINT fk_empirenames_owner + FOREIGN KEY (owner_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + +GRANT SELECT ON naming.empire_names TO :dbuser; + + + +-- +-- Map names +-- +CREATE TABLE naming.map_names( + id SERIAL NOT NULL PRIMARY KEY , + name VARCHAR(20) NOT NULL +); + +CREATE UNIQUE INDEX idx_mapnames_name + ON naming.map_names( lower(name) ); + + +-- +-- Changed map names +-- + +CREATE TABLE naming.changed_map_names( + name_id INT NOT NULL PRIMARY KEY , + named_by INT NOT NULL , + named_at TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now() +); + +CREATE INDEX idx_changedmapnames_namedby + ON naming.changed_map_names (named_by); + +ALTER TABLE naming.changed_map_names + ADD CONSTRAINT fk_changedmapnames_name + FOREIGN KEY (name_id) REFERENCES naming.map_names , + ADD CONSTRAINT fk_changedmapnames_namedby + FOREIGN KEY (named_by) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + + +-- +-- Validated map names +-- + +CREATE TABLE naming.validated_map_names( + name_id INT NOT NULL PRIMARY KEY , + validated_by INT NOT NULL , + validated_at TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now() +); + +CREATE INDEX idx_validatedmapnames_namedby + ON naming.validated_map_names (validated_by); + + +ALTER TABLE naming.validated_map_names + ADD CONSTRAINT fk_validatedmapnames_name + FOREIGN KEY (name_id) REFERENCES naming.changed_map_names + ON DELETE CASCADE , + ADD CONSTRAINT fk_validatedmapnames_validatedby + FOREIGN KEY (validated_by) REFERENCES admin.administrators; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/070-constants-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/070-constants-data.sql new file mode 100644 index 0000000..82bca01 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/070-constants-data.sql @@ -0,0 +1,44 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- System "constants" +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Constant categories +-- +CREATE TABLE sys.constant_categories( + id SERIAL NOT NULL PRIMARY KEY , + name VARCHAR(64) NOT NULL +); + +CREATE UNIQUE INDEX idx_constantcategories_name + ON sys.constant_categories (name); + + +-- +-- Constant definitions and values +-- +CREATE TABLE sys.constant_definitions( + name VARCHAR(64) NOT NULL PRIMARY KEY, + category_id INT NOT NULL , + description TEXT NOT NULL , + min_value REAL , + max_value REAL , + c_value REAL NOT NULL , + CHECK( + ( min_value IS NULL OR ( + min_value IS NOT NULL AND c_value >= min_value ) ) + AND ( max_value IS NULL OR ( + max_value IS NOT NULL AND max_value >= c_value ) ) + ) +); + +CREATE INDEX idx_constantdefinitions_category + ON sys.constant_definitions (category_id); + +ALTER TABLE sys.constant_definitions + ADD CONSTRAINT fk_constraintdefinitions_category + FOREIGN KEY (category_id) REFERENCES sys.constant_categories; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/080-techs-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/080-techs-data.sql new file mode 100644 index 0000000..c539ac2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/080-techs-data.sql @@ -0,0 +1,56 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Technology definitions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Technology lines +-- + +CREATE TABLE tech.lines( + name_id INT NOT NULL PRIMARY KEY , + description_id INT NOT NULL +); + +CREATE INDEX idx_lines_description + ON tech.lines (description_id); + +ALTER TABLE tech.lines + ADD CONSTRAINT fk_lines_name + FOREIGN KEY (name_id) REFERENCES defs.strings , + ADD CONSTRAINT fk_lines_description + FOREIGN KEY (description_id) REFERENCES defs.strings; + + +-- +-- Technology levels +-- + +CREATE TABLE tech.levels( + id SERIAL NOT NULL PRIMARY KEY , + line_id INT NOT NULL , + level INT NOT NULL CHECK( level > 0 ) , + name_id INT NOT NULL , + description_id INT NOT NULL , + points INT NOT NULL CHECK( points > 0 ) , + cost INT NOT NULL CHECK( cost > 0 ) +); + +CREATE UNIQUE INDEX idx_levels_linelevel + ON tech.levels (line_id, level); +CREATE INDEX idx_levels_name + ON tech.levels (name_id); +CREATE INDEX idx_levels_description + ON tech.levels (description_id); + +ALTER TABLE tech.levels + ADD CONSTRAINT fk_levels_line + FOREIGN KEY (line_id) REFERENCES tech.lines , + ADD CONSTRAINT fk_levels_name + FOREIGN KEY (name_id) REFERENCES defs.strings , + ADD CONSTRAINT fk_levels_description + FOREIGN KEY (description_id) REFERENCES defs.strings; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/090-buildables-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/090-buildables-data.sql new file mode 100644 index 0000000..3a80b4d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/090-buildables-data.sql @@ -0,0 +1,75 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Buildings/ships definitions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- "Buildables" +-- +CREATE TABLE tech.buildables( + name_id INT NOT NULL PRIMARY KEY , + description_id INT NOT NULL , + cost INT NOT NULL CHECK( cost > 0 ) , + work INT NOT NULL CHECK( work > 0 ) , + upkeep INT NOT NULL CHECK( upkeep >= 0 ) +); + +CREATE INDEX idx_buildables_description + ON tech.buildables (description_id); + +ALTER TABLE tech.buildables + ADD CONSTRAINT fk_buildables_name + FOREIGN KEY (name_id) REFERENCES defs.strings , + ADD CONSTRAINT fk_buildables_description + FOREIGN KEY (description_id) REFERENCES defs.strings; + + +-- +-- Requirements +-- +CREATE TABLE tech.buildable_requirements( + buildable_id INT NOT NULL , + level_id INT NOT NULL , + PRIMARY KEY( buildable_id , level_id ) +); + +CREATE INDEX idx_buildablereqs_level + ON tech.buildable_requirements( level_id ); + +ALTER TABLE tech.buildable_requirements + ADD CONSTRAINT fk_buildablereqs_buildable + FOREIGN KEY (buildable_id) REFERENCES tech.buildables , + ADD CONSTRAINT fk_buildablereqs_level + FOREIGN KEY (level_id) REFERENCES tech.levels; + + +-- +-- Buildings +-- +CREATE TABLE tech.buildings( + buildable_id INT NOT NULL PRIMARY KEY , + workers INT NOT NULL CHECK( workers >= 0 ) , + output_type building_output_type , + output INT NOT NULL CHECK( output > 0 ) +); + +ALTER TABLE tech.buildings + ADD CONSTRAINT fk_buildings_buildable + FOREIGN KEY (buildable_id) REFERENCES tech.buildables; + +-- +-- Ships +-- +CREATE TABLE tech.ships( + buildable_id INT NOT NULL PRIMARY KEY , + flight_time INT NOT NULL CHECK( flight_time > 0 ) , + power INT NOT NULL CHECK( power > 0 ) +); + + +ALTER TABLE tech.ships + ADD CONSTRAINT fk_buildings_buildable + FOREIGN KEY (buildable_id) REFERENCES tech.buildables; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/100-universe-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/100-universe-data.sql new file mode 100644 index 0000000..fb8f379 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/100-universe-data.sql @@ -0,0 +1,95 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Stellar systems and planets +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Stellar systems +-- +CREATE TABLE verse.systems( + id SERIAL NOT NULL PRIMARY KEY , + x INT NOT NULL , + y INT NOT NULL +); + +CREATE UNIQUE INDEX idx_systems_coordinates + ON verse.systems( x , y ); + +-- +-- Planets +-- +CREATE TABLE verse.planets( + name_id INT NOT NULL PRIMARY KEY , + system_id INT NOT NULL , + orbit INT NOT NULL + CHECK( orbit BETWEEN 1 AND 5 ) , + picture INT NOT NULL , + population REAL NOT NULL + CHECK( population >= 0 ) +); + +CREATE UNIQUE INDEX idx_planets_coordinates + ON verse.planets( system_id , orbit ); + +ALTER TABLE verse.planets + ADD CONSTRAINT fk_planets_name + FOREIGN KEY (name_id) REFERENCES naming.map_names , + ADD CONSTRAINT fk_planets_system + FOREIGN KEY (system_id) REFERENCES verse.systems; + + +-- +-- Happiness +-- +CREATE TABLE verse.planet_happiness( + planet_id INT NOT NULL PRIMARY KEY , + target REAL NOT NULL + CHECK( target BETWEEN 0.0 AND 1.0 ) , + current REAL NOT NULL + CHECK( current > 0 ) +); + +ALTER TABLE verse.planet_happiness + ADD CONSTRAINT fk_planethappiness_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets; + + +-- +-- Money +-- +CREATE TABLE verse.planet_money( + planet_id INT NOT NULL PRIMARY KEY , + income REAL NOT NULL + CHECK( income >= 0 ) , + upkeep REAL NOT NULL + CHECK( upkeep >= 0 ) +); + +ALTER TABLE verse.planet_money + ADD CONSTRAINT fk_planetmoney_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets; + + +-- +-- Buildings +-- +CREATE TABLE verse.planet_buildings( + planet_id INT NOT NULL , + building_id INT NOT NULL , + amount INT NOT NULL CHECK( amount >= 0 ) , + damage REAL NOT NULL CHECK( damage >= 0 ) , + PRIMARY KEY( planet_id , building_id ) +); + +CREATE INDEX idx_planetbuildings_building + ON verse.planet_buildings (building_id); + +ALTER TABLE verse.planet_buildings + ADD CONSTRAINT fk_planetbuildings_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets , + ADD CONSTRAINT fk_planetbuildings_building + FOREIGN KEY (building_id) REFERENCES tech.buildings; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/110-empires-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/110-empires-data.sql new file mode 100644 index 0000000..5a3d00a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/110-empires-data.sql @@ -0,0 +1,176 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Empires and alliances +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Empires +-- + +CREATE TABLE emp.empires( + name_id INT NOT NULL PRIMARY KEY , + cash REAL NOT NULL + CHECK( cash >= 0 ), + debt REAL NOT NULL DEFAULT 0 + CHECK( debt >= 0) +); + +ALTER TABLE emp.empires + ADD CONSTRAINT fk_empires_name + FOREIGN KEY (name_id) REFERENCES naming.empire_names; + + +-- +-- Empire technologies +-- + +CREATE TABLE emp.technologies( + empire_id INT NOT NULL , + line_id INT NOT NULL , + level INT NOT NULL DEFAULT 1 + CHECK( level > 0 ) , + accumulated REAL NOT NULL DEFAULT 0 + CHECK( accumulated >= 0 ), + PRIMARY KEY( empire_id , line_id ) +); + +CREATE INDEX idx_technologies_line + ON emp.technologies (line_id); + +ALTER TABLE emp.technologies + ADD CONSTRAINT fk_technologies_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_technologies_line + FOREIGN KEY (line_id) REFERENCES tech.lines; + + +-- +-- Empire planets +-- + +CREATE TABLE emp.planets( + planet_id INT NOT NULL PRIMARY KEY , + empire_id INT NOT NULL +); + +CREATE INDEX idx_planets_empire + ON emp.planets (empire_id); + +ALTER TABLE emp.planets + ADD CONSTRAINT fk_eplanets_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets , + ADD CONSTRAINT fk_eplanets_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE CASCADE; + + +-- +-- Planets being abandonned +-- + +CREATE TABLE emp.abandon( + planet_id INT NOT NULL PRIMARY KEY , + time_left INT NOT NULL CHECK ( time_left > 0 ) +); + +CREATE INDEX idx_abandon_ready + ON emp.abandon ( ( time_left = 1 ) ); + +ALTER TABLE emp.abandon + ADD CONSTRAINT fk_abandon_planet + FOREIGN KEY (planet_id) REFERENCES emp.planets + ON DELETE CASCADE; + + +-- +-- Alliances +-- + +CREATE TABLE emp.alliances( + id SERIAL NOT NULL PRIMARY KEY , + tag VARCHAR(5) NOT NULL , + name VARCHAR(128) NOT NULL , + leader_id INT NOT NULL +); + +CREATE UNIQUE INDEX idx_alliances_tag + ON emp.alliances ( lower(tag) ); +CREATE UNIQUE INDEX idx_alliances_leader + ON emp.alliances (leader_id); + +ALTER TABLE emp.alliances + ADD CONSTRAINT fk_alliances_leader + FOREIGN KEY (leader_id) REFERENCES emp.empires + ON DELETE CASCADE; + + +-- +-- Alliance membership +-- + +CREATE TABLE emp.alliance_members( + empire_id INT NOT NULL PRIMARY KEY , + alliance_id INT NOT NULL , + is_pending BOOLEAN NOT NULL + DEFAULT TRUE +); + +CREATE INDEX idx_alliancemembers_alliance + ON emp.alliance_members( alliance_id ); + +ALTER TABLE emp.alliance_members + ADD CONSTRAINT fk_alliancemembers_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_alliancemembers_alliance + FOREIGN KEY (alliance_id) REFERENCES emp.alliances + ON DELETE CASCADE; + + +-- +-- Enemy lists, alliances +-- + +CREATE TABLE emp.enemy_alliances( + empire_id INT NOT NULL , + alliance_id INT NOT NULL , + PRIMARY KEY (empire_id,alliance_id) +); + +CREATE INDEX idx_enemyalliances_alliance + ON emp.enemy_alliances (alliance_id); + +ALTER TABLE emp.enemy_alliances + ADD CONSTRAINT fk_enemyalliances_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_enemyalliances_alliance + FOREIGN KEY (alliance_id) REFERENCES emp.alliances + ON DELETE CASCADE; + + +-- +-- Enemy lists, empires +-- + +CREATE TABLE emp.enemy_empires( + empire_id INT NOT NULL , + enemy_id INT NOT NULL , + PRIMARY KEY (empire_id,enemy_id) +); + +CREATE INDEX idx_enemyempires_enemy + ON emp.enemy_empires (enemy_id); + +ALTER TABLE emp.enemy_empires + ADD CONSTRAINT fk_enemyempires_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_enemyempires_enemy + FOREIGN KEY (enemy_id) REFERENCES emp.empires + ON DELETE CASCADE; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/120-construction-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/120-construction-data.sql new file mode 100644 index 0000000..9ae9fcd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/120-construction-data.sql @@ -0,0 +1,82 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Construction queues +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Buildings queues +-- + +CREATE TABLE verse.bld_queues( + planet_id INT NOT NULL PRIMARY KEY , + money REAL NOT NULL CHECK( money >= 0 ), + work REAL NOT NULL CHECK( work >= 0 ) +); + +ALTER TABLE verse.bld_queues + ADD CONSTRAINT fk_bldqueues_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets; + + +-- +-- Buildings queue items +-- + +CREATE TABLE verse.bld_items( + queue_id INT NOT NULL , + queue_order INT NOT NULL CHECK( queue_order >= 0 ) , + building_id INT NOT NULL , + destroy BOOLEAN NOT NULL , + amount INT NOT NULL CHECK( amount > 0 ) , + PRIMARY KEY( queue_id , queue_order ) +); + +CREATE INDEX idx_blditems_building + ON verse.bld_items (building_id); + +ALTER TABLE verse.bld_items + ADD CONSTRAINT fk_blditems_queue + FOREIGN KEY (queue_id) REFERENCES verse.bld_queues , + ADD CONSTRAINT fk_blditems_building + FOREIGN KEY (building_id) REFERENCES tech.buildings; + + +-- +-- Military queues +-- + +CREATE TABLE verse.mil_queues( + planet_id INT NOT NULL PRIMARY KEY , + money REAL NOT NULL CHECK( money >= 0 ), + work REAL NOT NULL CHECK( work >= 0 ) +); + +ALTER TABLE verse.mil_queues + ADD CONSTRAINT fk_milqueues_planet + FOREIGN KEY (planet_id) REFERENCES verse.planets; + + +-- +-- Military queue items +-- + +CREATE TABLE verse.mil_items( + queue_id INT NOT NULL , + queue_order INT NOT NULL CHECK( queue_order >= 0 ) , + ship_id INT NOT NULL , + amount INT NOT NULL CHECK( amount > 0 ) , + PRIMARY KEY( queue_id , queue_order ) +); + +CREATE INDEX idx_militems_ship + ON verse.mil_items (ship_id); + +ALTER TABLE verse.mil_items + ADD CONSTRAINT fk_militems_queue + FOREIGN KEY (queue_id) REFERENCES verse.mil_queues , + ADD CONSTRAINT fk_militems_ship + FOREIGN KEY (ship_id) REFERENCES tech.ships; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/130-fleets-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/130-fleets-data.sql new file mode 100644 index 0000000..7d7bb0f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/130-fleets-data.sql @@ -0,0 +1,118 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Fleets +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Fleets +-- + +CREATE TABLE fleets.fleets( + id BIGSERIAL NOT NULL PRIMARY KEY , + owner_id INT NOT NULL , + location_id INT NOT NULL , + name VARCHAR(64) , + attacking BOOLEAN NOT NULL , + status fleet_status NOT NULL , + penalty INT NOT NULL , + CHECK( ( status = 'AVAILABLE' AND penalty = 0 ) + OR ( status <> 'AVAILABLE' AND penalty > 0) ) +); + +CREATE INDEX idx_fleets_owner + ON fleets.fleets ( owner_id ); +CREATE INDEX idx_fleets_location + ON fleets.fleets ( location_id ); +CREATE INDEX idx_fleets_status + ON fleets.fleets ( status , penalty ); + +ALTER TABLE fleets.fleets + ADD CONSTRAINT fk_fleets_owner + FOREIGN KEY ( owner_id ) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_fleets_location + FOREIGN KEY ( location_id ) REFERENCES verse.planets; + + +-- +-- Ships +-- + +CREATE TABLE fleets.ships( + fleet_id BIGINT NOT NULL , + ship_id INT NOT NULL , + amount INT NOT NULL CHECK( amount >= 0 ) , + damage REAL NOT NULL , + PRIMARY KEY( fleet_id , ship_id ) +); + +CREATE INDEX idx_ships_ship + ON fleets.ships( ship_id ); + +ALTER TABLE fleets.ships + ADD CONSTRAINT fk_ships_fleet + FOREIGN KEY ( fleet_id ) REFERENCES fleets.fleets + ON DELETE CASCADE , + ADD CONSTRAINT fk_ships_ship + FOREIGN KEY ( ship_id ) REFERENCES tech.ships; + + +-- +-- Fleet movements +-- + +CREATE TABLE fleets.movements( + fleet_id BIGINT NOT NULL PRIMARY KEY , + source_id INT NOT NULL , + time_left INT NOT NULL CHECK( time_left > 0 ) , + state_time_left INT NOT NULL CHECK( state_time_left > 0 ) +); + +CREATE INDEX idx_movements_source + ON fleets.movements( source_id ); + +ALTER TABLE fleets.movements + ADD CONSTRAINT fk_movements_fleet + FOREIGN KEY ( fleet_id ) REFERENCES fleets.fleets + ON DELETE CASCADE , + ADD CONSTRAINT fk_movements_source + FOREIGN KEY ( source_id ) REFERENCES verse.planets; + + +-- +-- Movement states, outer space +-- + +CREATE TABLE fleets.ms_space( + movement_id BIGINT NOT NULL PRIMARY KEY , + start_x REAL NOT NULL , + start_y REAL NOT NULL +); + +ALTER TABLE fleets.ms_space + ADD CONSTRAINT fk_msspace_movement + FOREIGN KEY ( movement_id ) REFERENCES fleets.movements + ON DELETE CASCADE; + + +-- +-- Movement states, in system +-- + +CREATE TABLE fleets.ms_system( + movement_id BIGINT NOT NULL PRIMARY KEY , + ref_point_id INT NOT NULL , + outwards BOOLEAN NOT NULL , + past_ref_point BOOLEAN NOT NULL +); + +ALTER TABLE fleets.ms_system + ADD CONSTRAINT fk_mssystem_movement + FOREIGN KEY ( movement_id ) REFERENCES fleets.movements + ON DELETE CASCADE , + ADD CONSTRAINT fk_mssystem_refpoint + FOREIGN KEY ( ref_point_id ) REFERENCES verse.planets; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/140-status-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/140-status-data.sql new file mode 100644 index 0000000..a3c76bb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/140-status-data.sql @@ -0,0 +1,107 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- System & game updates status +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- System status +-- +CREATE TABLE sys.status( + next_tick BIGINT NOT NULL + DEFAULT 0 , + current_tick BIGINT , + + last_msg_recap TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + last_admin_recap TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + last_error_recap TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + + maintenance_start TIMESTAMP WITHOUT TIME ZONE , + maintenance_end TIMESTAMP WITHOUT TIME ZONE , + maintenance_text TEXT +); + +INSERT INTO sys.status DEFAULT VALUES; + +GRANT SELECT ON sys.status TO :dbuser; + + + +-- +-- Ticker status +-- + +CREATE TYPE ticker_task_status + AS ENUM( 'RUNNING' , 'STOPPED' , 'AUTO' ); + +CREATE TABLE sys.ticker( + id SERIAL PRIMARY KEY , + task_name VARCHAR(64) NOT NULL UNIQUE , + status ticker_task_status NOT NULL , + auto_start TIMESTAMP WITHOUT TIME ZONE +); + +INSERT INTO sys.ticker( task_name , status ) + VALUES ( 'Game update' , 'STOPPED' ); + +GRANT SELECT ON sys.ticker TO :dbuser; + + + +-- +-- Updates +-- +CREATE TABLE sys.updates( + id BIGSERIAL NOT NULL PRIMARY KEY , + gu_type update_type NOT NULL , + status processing_status NOT NULL DEFAULT 'FUTURE' , + last_tick BIGINT NOT NULL DEFAULT -1 +); + +CREATE INDEX idx_updates_finder + ON sys.updates (gu_type, status, last_tick); + + +-- +-- Planet updates +-- +CREATE TABLE verse.updates( + update_id BIGINT NOT NULL PRIMARY KEY , + planet_id INT NOT NULL +); + +CREATE INDEX idx_planetupdates_planet + ON verse.updates (planet_id); + +ALTER TABLE verse.updates + ADD CONSTRAINT fk_planetupdates_update + FOREIGN KEY ( update_id ) REFERENCES sys.updates , + ADD CONSTRAINT fk_planetupdates_planet + FOREIGN KEY ( planet_id ) REFERENCES verse.planets; + + +-- +-- Empire updates +-- +CREATE TABLE emp.updates( + update_id BIGINT NOT NULL PRIMARY KEY , + empire_id INT NOT NULL +); + +CREATE INDEX idx_empireupdates_empire + ON emp.updates( empire_id ); + +ALTER TABLE emp.updates + ADD CONSTRAINT fk_empireupdates_update + FOREIGN KEY ( update_id ) REFERENCES sys.updates , + ADD CONSTRAINT fk_empireupdates_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE CASCADE; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/150-logs-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/150-logs-data.sql new file mode 100644 index 0000000..273827b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/150-logs-data.sql @@ -0,0 +1,126 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- System, user and administrative logs +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- System logs +-- +CREATE TABLE sys.logs( + id BIGSERIAL NOT NULL PRIMARY KEY , + t TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + component VARCHAR( 64 ) , + level log_level NOT NULL , + message TEXT NOT NULL +); + +CREATE INDEX idx_syslogs_time + ON sys.logs( t ); +CREATE INDEX idx_syslogs_component + ON sys.logs( component ); +CREATE INDEX idx_syslogs_level + ON sys.logs( level ); + +GRANT SELECT ON sys.logs TO :dbuser; + + +-- +-- System logs, exceptions +-- +CREATE TABLE sys.exceptions( + id BIGSERIAL NOT NULL PRIMARY KEY , + log_id BIGINT NOT NULL , + depth INT NOT NULL CHECK( depth>= 0 ) , + exc_class VARCHAR( 255 ) NOT NULL , + message TEXT +); + +CREATE UNIQUE INDEX idx_exceptions_logdepth + ON sys.exceptions (log_id , depth ); + +ALTER TABLE sys.exceptions + ADD CONSTRAINT fk_exceptions_log + FOREIGN KEY ( log_id ) REFERENCES sys.logs + ON DELETE CASCADE; + +GRANT SELECT ON sys.exceptions TO :dbuser; + + +-- +-- System logs, stack traces +-- +CREATE TABLE sys.stack_traces( + exception_id BIGSERIAL NOT NULL , + depth INT NOT NULL , + location TEXT , + file_name TEXT , + line_number INT , + PRIMARY KEY( exception_id , depth ) +); + +ALTER TABLE sys.stack_traces + ADD CONSTRAINT fk_stacktraces_exception + FOREIGN KEY ( exception_id ) REFERENCES sys.exceptions + ON DELETE CASCADE; + +GRANT SELECT ON sys.stack_traces TO :dbuser; + + +-- +-- User logs +-- +CREATE TABLE users.logs( + t TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + credentials_id INT NOT NULL , + level log_level NOT NULL , + message TEXT NOT NULL +); + +CREATE INDEX idx_userlogs_time + ON users.logs( t ); +CREATE INDEX idx_userlogs_level + ON users.logs( level ); +CREATE INDEX idx_userlogs_account + ON users.logs( credentials_id ); + +ALTER TABLE users.logs + ADD CONSTRAINT fk_userlogs_credentials + FOREIGN KEY (credentials_id) REFERENCES users.credentials + ON DELETE CASCADE ON UPDATE CASCADE; + +GRANT SELECT ON users.logs TO :dbuser; + + +-- +-- Administrative logs +-- +CREATE TABLE admin.logs( + t TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now( ) , + admin_id INT NOT NULL , + level log_level NOT NULL , + message TEXT NOT NULL +); + +CREATE INDEX idx_adminlogs_time + ON admin.logs( t ); +CREATE INDEX idx_adminlogs_level + ON admin.logs( level ); +CREATE INDEX idx_adminlogs_admin + ON admin.logs( admin_id ); + +ALTER TABLE admin.logs + ADD CONSTRAINT fk_userlogs_admin + FOREIGN KEY (admin_id) REFERENCES admin.administrators; + + +GRANT SELECT ON admin.logs TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/160-battle-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/160-battle-data.sql new file mode 100644 index 0000000..2672b0d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/160-battle-data.sql @@ -0,0 +1,230 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Battles +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Status change types +-- + +CREATE TYPE battle_planet_change + AS ENUM( 'INIT' , 'RENAME', 'BUILD' , 'DESTROY' , 'BATTLE' ); +CREATE TYPE battle_fleet_change + AS ENUM( 'INIT' , 'BUILD', 'ARRIVE' , 'DEPART' , 'DISBAND' , 'BATTLE' ); + + + +-- +-- Main battle table +-- + +CREATE TABLE battles.battles( + id BIGSERIAL PRIMARY KEY , + location_id INT NOT NULL , + first_tick BIGINT NOT NULL , + last_tick BIGINT +); + +CREATE UNIQUE INDEX idx_battles_uniqueness + ON battles.battles( location_id , last_tick ); + +ALTER TABLE battles.battles + ADD CONSTRAINT fk_battles_location + FOREIGN KEY ( location_id ) REFERENCES verse.planets; + + + +-- +-- Battle planet status +-- + +CREATE TABLE battles.planets( + id BIGSERIAL PRIMARY KEY , + battle_id BIGINT NOT NULL , + tick_identifier BIGINT NOT NULL , + change_type battle_planet_change NOT NULL , + name VARCHAR(20) +); + +CREATE INDEX idx_planets_tick + ON battles.planets( tick_identifier ); + +CREATE UNIQUE INDEX idx_planets_uniquenes + ON battles.planets( battle_id , tick_identifier , change_type ); + +ALTER TABLE battles.planets + ADD CONSTRAINT fk_planets_battle + FOREIGN KEY ( battle_id ) REFERENCES battles.battles + ON DELETE CASCADE; + + + +-- +-- Battle buildings +-- + +CREATE TABLE battles.buildings( + planet_id BIGINT NOT NULL , + building_id INT NOT NULL , + change INT NOT NULL CHECK( change <> 0 ) , + PRIMARY KEY( planet_id , building_id ) +); + +CREATE INDEX idx_buildings_building + ON battles.buildings ( building_id ); + +ALTER TABLE battles.buildings + ADD CONSTRAINT fk_buildings_planet + FOREIGN KEY ( planet_id ) REFERENCES battles.planets + ON DELETE CASCADE , + ADD CONSTRAINT fk_buildings_building + FOREIGN KEY ( building_id ) REFERENCES tech.buildings; + + + +-- +-- Battle - planetary defence power +-- + +CREATE TABLE battles.defences( + battle_id BIGINT NOT NULL , + tick_identifier BIGINT NOT NULL , + power BIGINT NOT NULL , + PRIMARY KEY( battle_id , tick_identifier ) +); + +ALTER TABLE battles.defences + ADD CONSTRAINT fk_defences_battle + FOREIGN KEY ( battle_id ) REFERENCES battles.battles + ON DELETE CASCADE; + + + +-- +-- Empires involved in a battle +-- + +CREATE TABLE battles.empires( + id BIGSERIAL PRIMARY KEY , + name VARCHAR(20) NOT NULL , + empire_id INT +); + +CREATE INDEX idx_empires_name + ON battles.empires( name ); + +CREATE INDEX idx_empires_empire + ON battles.empires( empire_id ); + +ALTER TABLE battles.empires + ADD CONSTRAINT fk_empires_empire + FOREIGN KEY (empire_id) REFERENCES emp.empires + ON DELETE SET NULL; + + + +-- +-- Protagonists +-- + +CREATE TABLE battles.protagonists( + id BIGSERIAL PRIMARY KEY , + battle_id BIGINT NOT NULL , + empire_id BIGINT NOT NULL +); + +CREATE UNIQUE INDEX idx_protagonists_uniqueness + ON battles.protagonists( battle_id , empire_id ); + +CREATE INDEX idx_protagonists_empire + ON battles.protagonists( empire_id ); + +ALTER TABLE battles.protagonists + ADD CONSTRAINT fk_protagonists_battle + FOREIGN KEY (battle_id) REFERENCES battles.battles + ON DELETE CASCADE , + ADD CONSTRAINT fk_protagonists_empire + FOREIGN KEY (empire_id) REFERENCES battles.empires; + + + +-- +-- Planet ownership +-- + +CREATE TABLE battles.planet_ownership( + protagonist_id BIGINT NOT NULL PRIMARY KEY , + abandoned_at BIGINT +); + +ALTER TABLE battles.planet_ownership + ADD CONSTRAINT fk_ownership_protagonist + FOREIGN KEY (protagonist_id) REFERENCES battles.protagonists + ON DELETE CASCADE; + + + +-- +-- Battle status changes +-- + +CREATE TABLE battles.status_changes( + protagonist_id BIGINT NOT NULL , + tick_identifier BIGINT NOT NULL , + attacking BOOLEAN NOT NULL , + PRIMARY KEY( protagonist_id , tick_identifier ) +); + +CREATE INDEX idx_statuschanges_tick + ON battles.status_changes( tick_identifier ); + +ALTER TABLE battles.status_changes + ADD CONSTRAINT fk_statuschanges_protagonist + FOREIGN KEY (protagonist_id) REFERENCES battles.protagonists + ON DELETE CASCADE; + + + +-- +-- Fleets involved in battles +-- + +CREATE TABLE battles.fleets( + id BIGSERIAL PRIMARY KEY , + protagonist_id BIGINT NOT NULL , + tick_identifier BIGINT NOT NULL , + change_type battle_fleet_change NOT NULL +); + +CREATE UNIQUE INDEX idx_fleets_uniqueness + ON battles.fleets( protagonist_id , tick_identifier , change_type ); +CREATE INDEX idx_fleets_tick + ON battles.fleets( tick_identifier ); + +ALTER TABLE battles.fleets + ADD CONSTRAINT fk_fleets_protagonist + FOREIGN KEY (protagonist_id) REFERENCES battles.protagonists + ON DELETE CASCADE; + + + +-- +-- Ships in battle fleets +-- + +CREATE TABLE battles.ships( + fleet_id BIGINT NOT NULL , + ship_id INT NOT NULL , + change INT NOT NULL CHECK( change <> 0 ) +); + +ALTER TABLE battles.ships + ADD CONSTRAINT fk_ships_fleet + FOREIGN KEY ( fleet_id ) REFERENCES battles.fleets + ON DELETE CASCADE , + ADD CONSTRAINT fk_ships_ship + FOREIGN KEY ( ship_id ) REFERENCES tech.ships; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/170-events-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/170-events-data.sql new file mode 100644 index 0000000..186a032 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/170-events-data.sql @@ -0,0 +1,311 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Storage of events (internal messages) +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE TYPE event_type + AS ENUM ( 'QUEUE' , 'EMPIRE' , 'FLEETS' , 'PLANET', 'ALLIANCE', 'ADMIN' , 'BUGS' ); + +CREATE TYPE event_status + AS ENUM( 'TICK' , 'ACTION' , 'READY' , 'SENT' ); + + + +-- +-- Events table +-- + +CREATE TABLE events.events( + event_id BIGSERIAL PRIMARY KEY , + empire_id INT NOT NULL , + tick BIGINT NOT NULL , + real_time TIMESTAMP WITHOUT TIME ZONE + NOT NULL + DEFAULT now() , + evt_type event_type NOT NULL , + evt_subtype INT NOT NULL , + status event_status NOT NULL +); + +CREATE INDEX idx_events_empire + ON events.events (empire_id); + +CREATE INDEX idx_events_time + ON events.events (real_time); + +CREATE INDEX idx_events_lookup + ON events.events( empire_id , tick , evt_type , evt_subtype , status ) + WHERE status IN ( 'TICK' , 'ACTION' ); + +ALTER TABLE events.events + ADD CONSTRAINT fk_events_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE CASCADE; + +GRANT SELECT ON events.events TO :dbuser; + + +-- +-- Build queue events +-- + +CREATE TABLE events.queue_events ( + event_id BIGINT NOT NULL PRIMARY KEY +); + +ALTER TABLE events.queue_events + ADD CONSTRAINT fk_bqevents_event + FOREIGN KEY (event_id) REFERENCES events.events + ON DELETE CASCADE; + + + +-- +-- Build queue event locations +-- + +CREATE TABLE events.bqe_locations( + event_id BIGINT NOT NULL , + location_id INT NOT NULL , + location_name VARCHAR(20) NOT NULL , + PRIMARY KEY( event_id , location_id ) +); + +ALTER TABLE events.bqe_locations + ADD CONSTRAINT fk_bqelocations_event + FOREIGN KEY (event_id) REFERENCES events.queue_events + ON DELETE CASCADE , + ADD CONSTRAINT fk_bqelocations_location + FOREIGN KEY (location_id) REFERENCES verse.planets; + + + +-- +-- Empire events +-- + +CREATE TABLE events.empire_events( + event_id BIGINT NOT NULL PRIMARY KEY , + technology_id INT NOT NULL +); + +CREATE INDEX idx_empevents_tech + ON events.empire_events (technology_id); + +ALTER TABLE events.empire_events + ADD CONSTRAINT fk_empevents_event + FOREIGN KEY (event_id) REFERENCES events.events + ON DELETE CASCADE, + ADD CONSTRAINT fk_empevents_tech + FOREIGN KEY (technology_id) REFERENCES tech.levels; + + + +-- +-- Fleet events +-- + +CREATE TABLE events.fleets_events( + event_id BIGINT NOT NULL PRIMARY KEY , + location_id INT NOT NULL , + location_name VARCHAR(20) NOT NULL +); + +CREATE INDEX idx_flevents_location + ON events.fleets_events( location_id ); + +ALTER TABLE events.fleets_events + ADD CONSTRAINT fk_flevents_event + FOREIGN KEY (event_id) REFERENCES events.events + ON DELETE CASCADE , + ADD CONSTRAINT fk_flevents_location + FOREIGN KEY (location_id) REFERENCES verse.planets; + + + +-- +-- Fleets for fleet events +-- + +CREATE TABLE events.fleet_lists( + id BIGSERIAL PRIMARY KEY , + event_id BIGINT NOT NULL , + owner_id INT , + owner_name VARCHAR(20) NOT NULL , + fleet_name VARCHAR(64) , + fleet_power BIGINT NOT NULL CHECK( fleet_power > 0 ) , + status BOOLEAN , + source_id INT , + source_name VARCHAR(20) , + CHECK( source_id IS NULL AND source_name IS NULL OR source_id IS NOT NULL AND source_name IS NOT NULL ) +); + +CREATE INDEX idx_flelists_event + ON events.fleet_lists( event_id ); + +CREATE INDEX idx_flelists_owner + ON events.fleet_lists( owner_id ) + WHERE owner_id IS NOT NULL; + +CREATE INDEX idx_flelists_source + ON events.fleet_lists( source_id ) + WHERE source_id IS NOT NULL; + +ALTER TABLE events.fleet_lists + ADD CONSTRAINT fk_flelist_event + FOREIGN KEY ( event_id ) REFERENCES events.fleets_events + ON DELETE CASCADE , + ADD CONSTRAINT fk_flelist_owner + FOREIGN KEY ( owner_id ) REFERENCES emp.empires + ON DELETE SET NULL , + ADD CONSTRAINT fk_flelist_source + FOREIGN KEY ( source_id ) REFERENCES verse.planets; + +GRANT SELECT ON events.fleet_lists TO :dbuser; + + + +-- +-- Planet events +-- + +CREATE TABLE events.planet_events( + event_id BIGINT PRIMARY KEY, + location_id INT NOT NULL , + location_name VARCHAR(20) NOT NULL , + empire_id INT , + empire_name VARCHAR(20) , + battle_id BIGINT , + CHECK( battle_id IS NULL AND empire_id IS NULL AND empire_name IS NULL + OR battle_id IS NOT NULL AND empire_id IS NULL AND empire_name IS NULL + OR battle_id IS NULL AND empire_name IS NOT NULL ) +); + +CREATE INDEX idx_pevents_event + ON events.planet_events ( event_id ); + +CREATE INDEX idx_pevents_location + ON events.planet_events ( location_id ); + +CREATE INDEX idx_pevents_empire + ON events.planet_events ( empire_id ) + WHERE empire_id IS NOT NULL; + +CREATE INDEX idx_pevents_battle + ON events.planet_events ( battle_id ) + WHERE battle_id IS NOT NULL; + +ALTER TABLE events.planet_events + ADD CONSTRAINT fk_pevents_event + FOREIGN KEY ( event_id ) REFERENCES events.events + ON DELETE CASCADE , + ADD CONSTRAINT fk_pevents_location + FOREIGN KEY ( location_id ) REFERENCES verse.planets , + ADD CONSTRAINT fk_pevents_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE SET NULL , + ADD CONSTRAINT fk_pevents_battle + FOREIGN KEY ( battle_id ) REFERENCES battles.battles; + + + +-- +-- Alliance events +-- + +CREATE TABLE events.alliance_events( + event_id BIGINT PRIMARY KEY , + alliance_id INT , + alliance_tag VARCHAR( 5 ) NOT NULL , + empire_id INT , + empire_name VARCHAR( 20 ) , + req_result BOOLEAN , + CHECK( req_result IS NULL AND empire_id IS NULL AND empire_name IS NULL + OR req_result IS NOT NULL AND empire_id IS NULL AND empire_name IS NULL + OR req_result IS NULL AND empire_name IS NOT NULL ) +); + +CREATE INDEX idx_aevents_event + ON events.alliance_events ( event_id ); + +CREATE INDEX idx_aevents_alliance + ON events.alliance_events ( alliance_id ) + WHERE alliance_id IS NOT NULL; + +CREATE INDEX idx_aevents_empire + ON events.alliance_events ( empire_id ) + WHERE empire_id IS NOT NULL; + +ALTER TABLE events.alliance_events + ADD CONSTRAINT fk_aevents_event + FOREIGN KEY ( event_id ) REFERENCES events.events + ON DELETE CASCADE , + ADD CONSTRAINT fk_aevents_allliance + FOREIGN KEY ( alliance_id ) REFERENCES emp.alliances + ON DELETE SET NULL , + ADD CONSTRAINT fk_aevents_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE SET NULL; + + + +-- +-- Admin events +-- + +CREATE TABLE events.admin_events( + event_id BIGINT PRIMARY KEY , + n_warnings INT , + location_id INT , + old_name VARCHAR( 20 ) NOT NULL , + new_name VARCHAR( 20 ) +); + +CREATE INDEX idx_adevents_event + ON events.admin_events ( event_id ); + +CREATE INDEX idx_adevents_location + ON events.admin_events ( location_id ) + WHERE location_id IS NOT NULL; + +ALTER TABLE events.admin_events + ADD CONSTRAINT fk_adevents_event + FOREIGN KEY ( event_id ) REFERENCES events.events + ON DELETE CASCADE , + ADD CONSTRAINT fk_adevents_location + FOREIGN KEY ( location_id ) REFERENCES verse.planets; + + + +-- +-- Bug tracking events +-- + +CREATE TABLE events.bug_events( + event_id BIGINT PRIMARY KEY , + bug_id BIGINT NOT NULL , + submitter_id BIGINT NOT NULL +); + +CREATE INDEX idx_btevents_event + ON events.bug_events ( event_id ); + +CREATE INDEX idx_btevents_bug + ON events.bug_events ( bug_id ); + +CREATE INDEX idx_btevents_submitter + ON events.bug_events ( submitter_id ); + + +ALTER TABLE events.bug_events + ADD CONSTRAINT fk_btevents_event + FOREIGN KEY ( event_id ) REFERENCES events.events + ON DELETE CASCADE , + ADD CONSTRAINT fk_btevents_bug + FOREIGN KEY ( bug_id ) REFERENCES bugs.initial_report_events , + ADD CONSTRAINT fk_btevents_submitter + FOREIGN KEY ( submitter_id ) REFERENCES bugs.submitters; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/180-messages-data.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/180-messages-data.sql new file mode 100644 index 0000000..57c26dc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/data/180-messages-data.sql @@ -0,0 +1,235 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Storage of messages +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE TYPE sender_type + AS ENUM( 'ADM', 'EMP' ); + +CREATE TYPE receiver_type + AS ENUM( 'ADM' , 'EMP' , 'ALL' ); + +CREATE TYPE message_status + AS ENUM( 'UNREAD' , 'READ' , 'DELETED' ); + + +-- +-- Message senders +-- + +CREATE TABLE msgs.senders( + id BIGSERIAL PRIMARY KEY , + sender_type sender_type NOT NULL , + name VARCHAR(48) NOT NULL , + empire_id INT , + admin_id INT , + CHECK ( empire_id IS NULL AND admin_id IS NULL + OR sender_type = 'ADM' AND empire_id IS NULL AND admin_id IS NOT NULL + OR sender_type = 'EMP' AND empire_id IS NOT NULL AND admin_id IS NULL ) +); + +CREATE UNIQUE INDEX idx_senders_empires + ON msgs.senders ( empire_id ) + WHERE empire_id IS NOT NULL; + +CREATE UNIQUE INDEX idx_senders_admins + ON msgs.senders ( admin_id ) + WHERE admin_id IS NOT NULL; + +ALTER TABLE msgs.senders + ADD CONSTRAINT fk_senders_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE SET NULL , + ADD CONSTRAINT fk_senders_admin + FOREIGN KEY ( admin_id ) REFERENCES admin.administrators + ON DELETE SET NULL; + + + +-- +-- Message receivers +-- + +CREATE TABLE msgs.receivers( + id BIGSERIAL PRIMARY KEY , + receiver_type receiver_type NOT NULL , + name VARCHAR(48) NOT NULL , + empire_id INT , + admin_id INT , + alliance_id INT , + CHECK ( empire_id IS NULL AND admin_id IS NULL AND alliance_id IS NULL + OR receiver_type = 'ADM' AND empire_id IS NULL AND admin_id IS NOT NULL AND alliance_id IS NULL + OR receiver_type = 'EMP' AND empire_id IS NOT NULL AND admin_id IS NULL AND alliance_id IS NULL + OR receiver_type = 'ALL' AND empire_id IS NULL AND admin_id IS NULL AND alliance_id IS NOT NULL ) +); + +CREATE UNIQUE INDEX idx_receivers_empires + ON msgs.receivers ( empire_id ) + WHERE empire_id IS NOT NULL; + +CREATE UNIQUE INDEX idx_receivers_admins + ON msgs.receivers ( admin_id ) + WHERE admin_id IS NOT NULL; + +CREATE UNIQUE INDEX idx_receivers_alliances + ON msgs.receivers ( alliance_id ) + WHERE alliance_id IS NOT NULL; + +ALTER TABLE msgs.receivers + ADD CONSTRAINT fk_receivers_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE SET NULL , + ADD CONSTRAINT fk_receivers_alliance + FOREIGN KEY ( alliance_id ) REFERENCES emp.alliances + ON DELETE SET NULL , + ADD CONSTRAINT fk_receivers_admin + FOREIGN KEY ( admin_id ) REFERENCES admin.administrators + ON DELETE SET NULL; + + + +-- +-- Text messages +-- + +CREATE TABLE msgs.text_messages( + id BIGSERIAL PRIMARY KEY , + tick BIGINT NOT NULL , + t TIMESTAMP WITHOUT TIME ZONE + NOT NULL DEFAULT now( ) , + title VARCHAR( 64 ) NOT NULL , + contents TEXT NOT NULL +); + +GRANT SELECT ON msgs.text_messages TO :dbuser; + + + +-- +-- Actual messages +-- + +CREATE TABLE msgs.messages( + id BIGSERIAL PRIMARY KEY , + receiver_id BIGINT NOT NULL , + sender_id BIGINT , + text_content_id BIGINT , + event_content_id BIGINT , + CHECK( + sender_id IS NULL AND text_content_id IS NULL AND event_content_id IS NOT NULL + OR sender_id IS NOT NULL AND text_content_id IS NOT NULL AND event_content_id IS NULL ) +); + +CREATE INDEX idx_messages_receiver + ON msgs.messages( receiver_id ); + +CREATE UNIQUE INDEX idx_messages_e_event + ON msgs.messages( event_content_id ) + WHERE event_content_id IS NOT NULL; + +CREATE INDEX idx_messages_sender + ON msgs.messages( sender_id ) + WHERE sender_id IS NOT NULL; + +CREATE INDEX idx_messages_t_text + ON msgs.messages( text_content_id ) + WHERE text_content_id IS NOT NULL; + +ALTER TABLE msgs.messages + ADD CONSTRAINT fk_messages_receiver + FOREIGN KEY ( receiver_id ) REFERENCES msgs.receivers , + ADD CONSTRAINT fk_messages_sender + FOREIGN KEY ( sender_id ) REFERENCES msgs.senders , + ADD CONSTRAINT fk_messages_text + FOREIGN KEY ( text_content_id ) REFERENCES msgs.text_messages , + ADD CONSTRAINT fk_messages_event + FOREIGN KEY ( event_content_id ) REFERENCES events.events + ON DELETE CASCADE; + + + +-- +-- Empire message delivery +-- + +CREATE TABLE msgs.empire_delivery( + id BIGSERIAL PRIMARY KEY , + empire_id INT NOT NULL , + message_id BIGINT NOT NULL , + in_inbox BOOLEAN NOT NULL , + status message_status NOT NULL , + emailed BOOLEAN NOT NULL , + recaped BOOLEAN NOT NULL +); + +CREATE INDEX idx_edelivery_empire + ON msgs.empire_delivery ( empire_id ); + +CREATE UNIQUE INDEX idx_edelivery_message + ON msgs.empire_delivery ( message_id , empire_id , in_inbox ); + +CREATE INDEX idx_edelivery_access + ON msgs.empire_delivery ( empire_id , in_inbox , status ); + +CREATE INDEX idx_edelivery_status + ON msgs.empire_delivery ( status , emailed , recaped ); + +ALTER TABLE msgs.empire_delivery + ADD CONSTRAINT fk_edelivery_empire + FOREIGN KEY ( empire_id ) REFERENCES emp.empires + ON DELETE CASCADE , + ADD CONSTRAINT fk_edelivery_message + FOREIGN KEY ( message_id ) REFERENCES msgs.messages + ON DELETE CASCADE; + + + +-- +-- Admin message delivery +-- + +CREATE TABLE msgs.admin_delivery( + id BIGSERIAL PRIMARY KEY , + admin_id INT NOT NULL , + message_id BIGINT NOT NULL , + in_inbox BOOLEAN NOT NULL , + status message_status NOT NULL , + emailed BOOLEAN NOT NULL +); + +CREATE INDEX idx_adelivery_admin + ON msgs.admin_delivery ( admin_id ); + +CREATE INDEX idx_adelivery_message + ON msgs.admin_delivery ( message_id ); + +CREATE INDEX idx_adelivery_status + ON msgs.admin_delivery ( status , emailed ); + +ALTER TABLE msgs.admin_delivery + ADD CONSTRAINT fk_adelivery_admin + FOREIGN KEY ( admin_id ) REFERENCES admin.administrators + ON DELETE CASCADE , + ADD CONSTRAINT fk_adelivery_message + FOREIGN KEY ( message_id ) REFERENCES msgs.messages; + + + +-- +-- E-mail notification status +-- + +CREATE TABLE msgs.email_notifications( + account_id INT PRIMARY KEY , + last_sent TIMESTAMP WITHOUT TIME ZONE + NOT NULL DEFAULT now() +); + +ALTER TABLE msgs.email_notifications + ADD CONSTRAINT fk_emailnotifications_account + FOREIGN KEY ( account_id ) REFERENCES users.active_accounts + ON DELETE CASCADE ON UPDATE CASCADE; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/000-defs-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/000-defs-functions.sql new file mode 100644 index 0000000..59ba77a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/000-defs-functions.sql @@ -0,0 +1,128 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Definitions management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- Creates or updates a language definition +-- +-- Parameters: +-- lid Language identifier +-- lnm Language name +-- + +CREATE OR REPLACE FUNCTION defs.uoc_language( lid TEXT , lnm TEXT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO defs.languages ( language , name ) + VALUES ( lower( lid ) , lnm ); +EXCEPTION + WHEN unique_violation THEN + UPDATE defs.languages SET name = lnm + WHERE language = lower( lid ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_language( TEXT , TEXT ) TO :dbuser; + + +CREATE OR REPLACE FUNCTION defs.uoc_language( lid TEXT , lnm TEXT , a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Updating language ' || lid ); + PERFORM defs.uoc_language( lid , lnm ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_language( TEXT, TEXT , INT ) TO :dbuser; + + +-- +-- Creates or updates a translation +-- +-- Parameters: +-- lid Language identifier +-- sid String identifier +-- txt Translation +-- + +CREATE OR REPLACE FUNCTION defs.uoc_translation( lid TEXT , sid TEXT , txt TEXT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + isid INT; + ilid INT; +BEGIN + -- Get language + SELECT INTO ilid id FROM defs.languages + WHERE language = lid; + + -- Create string, if needed + BEGIN + INSERT INTO defs.strings (name) VALUES ( sid ) + RETURNING id INTO isid; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO isid id FROM defs.strings + WHERE name = sid; + END; + + -- Create or update translation + BEGIN + INSERT INTO defs.translations ( string_id , lang_id , translated_string ) + VALUES ( isid , ilid , txt ); + EXCEPTION + WHEN unique_violation THEN + UPDATE defs.translations SET translated_string = txt + WHERE string_id = isid AND lang_id = ilid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_translation( TEXT , TEXT , TEXT ) TO :dbuser; + + +CREATE OR REPLACE FUNCTION defs.uoc_translation( lid TEXT , sid TEXT , txt TEXT , a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Updating string ' || sid || ' in language ' || lid ); + PERFORM defs.uoc_translation( lid , sid , txt ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_translation( TEXT, TEXT , TEXT , INT ) TO :dbuser; + + + +-- +-- Translations view (used to load all translations) +-- + +CREATE VIEW defs.translations_view + AS SELECT l.language AS language_id , l.name AS language_name , + s.name AS string_id , t.translated_string AS translation + FROM defs.translations t + INNER JOIN defs.strings s + ON s.id = t.string_id + INNER JOIN defs.languages l + ON l.id = t.lang_id; + +GRANT SELECT ON defs.translations_view TO :dbuser; + + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/002-sys-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/002-sys-functions.sql new file mode 100644 index 0000000..79a3271 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/002-sys-functions.sql @@ -0,0 +1,158 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- System management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- +-- Gets the next tick's identifier +-- + +CREATE OR REPLACE FUNCTION sys.get_tick( ) + RETURNS BIGINT + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT next_tick FROM sys.status; +$$ LANGUAGE SQL; + + + +-- +-- Registers a new ticker task +-- + +CREATE OR REPLACE FUNCTION sys.register_ticker_task( t_name TEXT ) + RETURNS INT + STRICT VOLATILE + SECURITY DEFINER +AS $$ + INSERT INTO sys.ticker ( task_name , status ) + VALUES ( $1 , 'RUNNING' ) + RETURNING id; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION sys.register_ticker_task( TEXT ) TO :dbuser; + + + +-- +-- Indicates that a ticker task was started automatically +-- +-- Parameters: +-- task_id Task identifier +-- + +CREATE OR REPLACE FUNCTION sys.set_task_started( task_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + t_name TEXT; +BEGIN + SELECT INTO t_name task_name FROM sys.ticker + WHERE id = task_id AND status = 'AUTO' FOR UPDATE; + IF FOUND + THEN + UPDATE sys.ticker SET status = 'RUNNING' , auto_start = NULL + WHERE id = task_id; + PERFORM sys.write_log( 'Ticker' , 'INFO'::log_level , 'Scheduled task ''' || t_name + || ''' has been enabled' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.set_task_started( INT ) TO :dbuser; + + + +-- +-- Starts or stops a task +-- +-- Parameters: +-- admin_id Administrator identifier +-- task_id Task identifier +-- running Whether the task should be started or stopped +-- + +CREATE OR REPLACE FUNCTION sys.set_task_running( admin_id INT , task_id INT , running BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + n_stat ticker_task_status; + t_name TEXT; +BEGIN + n_stat := ( CASE WHEN running THEN 'RUNNING' ELSE 'STOPPED' END ); + SELECT INTO t_name task_name FROM sys.ticker + WHERE id = task_id AND status <> n_stat FOR UPDATE; + IF FOUND + THEN + UPDATE sys.ticker SET status = n_stat , auto_start = NULL + WHERE id = task_id; + PERFORM admin.write_log( admin_id , 'INFO'::log_level , 'Ticker task ''' || t_name + || ''' changed to status ' || n_stat ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.set_task_running( INT , INT , BOOLEAN ) TO :dbuser; + + + +-- +-- Schedules a task to start automatically at a later date +-- +-- Parameters: +-- admin_id Administrator identifier +-- task_id Task identifier +-- delay Delay, in seconds, before the task starts +-- +-- Returns: +-- start_at Time and date at which the task will start +-- + +CREATE OR REPLACE FUNCTION sys.schedule_task( admin_id INT , task_id INT , delay BIGINT , OUT start_at TIMESTAMP WITHOUT TIME ZONE ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + t_name TEXT; +BEGIN + start_at := now() + ( delay || 's' )::INTERVAL; + + SELECT INTO t_name task_name FROM sys.ticker + WHERE id = task_id FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + + UPDATE sys.ticker SET status = 'AUTO' , auto_start = start_at WHERE id = task_id; + PERFORM admin.write_log( admin_id , 'INFO'::log_level , 'Ticker task ''' || t_name + || ''' scheduled to start ' || start_at ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.schedule_task( INT , INT , BIGINT ) TO :dbuser; + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/005-logs-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/005-logs-functions.sql new file mode 100644 index 0000000..f7a7c0c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/005-logs-functions.sql @@ -0,0 +1,250 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Logging functions and triggers +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- LOG CLEANUP -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Remove expired entries from a log table +-- +-- Parameters: +-- l_type Log table to clean up +-- + +CREATE OR REPLACE FUNCTION sys.clean_log_table( l_type log_type ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + expiry INT; + expiry_int INTERVAL; +BEGIN + expiry := floor( sys.get_constant( 'log.maxAge.' || lower( l_type::TEXT ) ) ); + expiry_int := ( expiry || 's' )::INTERVAL; + EXECUTE 'DELETE FROM ' || l_type::TEXT || '.logs WHERE t <= $1' + USING now() - expiry_int; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Clean all log tables +-- + +CREATE OR REPLACE FUNCTION sys.clean_logs( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + lt log_type; +BEGIN + FOR lt IN SELECT x FROM unnest( enum_range( NULL::log_type ) ) AS x + LOOP + PERFORM sys.clean_log_table( lt ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.clean_logs( ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- LOG APPENDERS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Write an user log entry +-- + +CREATE OR REPLACE FUNCTION users.write_log( account_id INT , lv log_level , msg TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + INSERT INTO users.logs (credentials_id , level , message) + VALUES ( account_id , lv , msg ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Write an administrative log entry +-- + +CREATE OR REPLACE FUNCTION admin.write_log( adm_id INT , lv log_level , msg TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + INSERT INTO admin.logs ( admin_id , level , message ) + VALUES ( adm_id , lv , msg ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Write a system log entry +-- + +CREATE OR REPLACE FUNCTION sys.write_log( cmp TEXT , lv log_level , msg TEXT , OUT entry_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO sys.logs( component , level , message ) + VALUES ( cmp , lv , msg ) + RETURNING id INTO entry_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.write_log( TEXT , log_level , TEXT ) TO :dbuser; + + + +-- +-- Append an exception log entry +-- + +CREATE OR REPLACE FUNCTION sys.append_exception( l_id BIGINT , cname TEXT , msg TEXT , OUT entry_id BIGINT ) + CALLED ON NULL INPUT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + d INT; +BEGIN + SELECT INTO d max( depth ) FROM sys.exceptions + WHERE log_id = l_id; + IF d IS NULL THEN + d := 0; + END IF; + d := d + 1; + + INSERT INTO sys.exceptions ( log_id , depth , exc_class , message ) + VALUES ( l_id , d , cname , msg ) + RETURNING id INTO entry_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.append_exception( BIGINT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Append a stack trace entry +-- + +CREATE OR REPLACE FUNCTION sys.append_trace( e_id BIGINT , loc TEXT , f_name TEXT , lnb INT ) + RETURNS VOID + CALLED ON NULL INPUT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + d INT; +BEGIN + SELECT INTO d max( depth ) FROM sys.stack_traces + WHERE exception_id = e_id; + IF d IS NULL THEN + d := 0; + END IF; + d := d + 1; + + INSERT INTO sys.stack_traces ( exception_id , depth , location , file_name , line_number ) + VALUES ( e_id , d , loc , f_name , lnb ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.append_trace( BIGINT , TEXT , TEXT , INT ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- LOGS VIEW FOR EASY SELECTION -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +CREATE VIEW sys.system_logs_view + AS SELECT l.id , l.t , l.component , l.level , l.message , + ( CASE WHEN e.id IS NOT NULL THEN l.id ELSE NULL END )::BIGINT AS exception_id + FROM sys.logs l + LEFT OUTER JOIN sys.exceptions e ON e.log_id = l.id AND e.depth = 1; + +GRANT SELECT ON sys.system_logs_view TO :dbuser; + + +CREATE VIEW sys.admin_logs_view + AS SELECT NULL::BIGINT AS id , l.t , a.appear_as AS component , l.level , + l.message , NULL::BIGINT AS exception_id + FROM admin.logs l + INNER JOIN admin.administrators a ON a.id = l.admin_id; + +GRANT SELECT ON sys.admin_logs_view TO :dbuser; + + +CREATE VIEW sys.player_logs_view + AS SELECT NULL::BIGINT AS id , l.t , a.address AS component , l.level , + l.message , NULL::BIGINT AS exception_id + FROM users.logs l + INNER JOIN users.addresses a ON a.id = l.credentials_id; + +GRANT SELECT ON sys.player_logs_view TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- ADMIN ERROR REPORT FUNCTION -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +CREATE OR REPLACE FUNCTION admin.get_error_entries( ) + RETURNS SETOF BIGINT + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + last_report TIMESTAMP WITHOUT TIME ZONE; + new_report TIMESTAMP WITHOUT TIME ZONE; + e_id BIGINT; +BEGIN + new_report := now( ); + SELECT INTO last_report last_error_recap FROM sys.status FOR UPDATE; + UPDATE sys.status SET last_error_recap = new_report; + + RETURN QUERY SELECT id FROM sys.system_logs_view + WHERE t >= last_report AND t < new_report AND exception_id IS NOT NULL + ORDER BY t DESC; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.get_error_entries( ) TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/010-constants-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/010-constants-functions.sql new file mode 100644 index 0000000..f0c78ed --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/010-constants-functions.sql @@ -0,0 +1,318 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions that access system constants +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- +-- Creates or gets a constant category +-- +-- Parameters: +-- ccnm Constant category name +-- +-- Returns: +-- the category's identifier +-- + +CREATE OR REPLACE FUNCTION sys.cog_constant_category( ccnm TEXT ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + ccid INT; +BEGIN + BEGIN + INSERT INTO sys.constant_categories (name) + VALUES (ccnm) + RETURNING id INTO ccid; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO ccid id FROM sys.constant_categories + WHERE name = ccnm + FOR UPDATE; + END; + + RETURN ccid; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates or updates a constant with no boundaries +-- +-- Parameters: +-- cnm Constant name +-- cdesc Constant description +-- ccnm Constant category name +-- dval Default value +-- +-- Returns: +-- the constant's actual value +-- + +CREATE OR REPLACE FUNCTION sys.uoc_constant( cnm TEXT , cdesc TEXT , ccnm TEXT , dval REAL ) + RETURNS REAL + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + ccid INT; + occid INT; + cval REAL; +BEGIN + ccid := sys.cog_constant_category( ccnm ); + + BEGIN + INSERT INTO sys.constant_definitions( name , category_id , description , c_value ) + VALUES ( cnm , ccid , cdesc , dval ); + cval := dval; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO occid , cval category_id , c_value FROM sys.constant_definitions + WHERE name = cnm + FOR UPDATE; + + UPDATE sys.constant_definitions SET category_id = ccid , description = cdesc , + min_value = NULL , max_value = NULL + WHERE name = cnm; + + IF occid <> ccid THEN + BEGIN + DELETE FROM sys.constant_categories WHERE id = occid; + EXCEPTION + WHEN foreign_key_violation THEN + -- Do nothing + END; END IF; + END; + + RETURN cval; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.uoc_constant( TEXT , TEXT , TEXT , REAL ) TO :dbuser; + + + +-- +-- Creates or updates a constant with a single boundary +-- +-- Parameters: +-- cnm Constant name +-- cdesc Constant description +-- ccnm Constant category name +-- dval Default value +-- bval Bound value +-- ismin Whether the bound value is the minimal or maximal value for the constant +-- +-- Returns: +-- the constant's actual value +-- + +CREATE OR REPLACE FUNCTION sys.uoc_constant( cnm TEXT , cdesc TEXT , ccnm TEXT , dval REAL , bval REAL , ismin BOOLEAN ) + RETURNS REAL + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + ccid INT; + occid INT; + cval REAL; + mival REAL; + maval REAL; +BEGIN + IF ismin THEN + mival := bval; + maval := NULL; + ELSE + maval := bval; + mival := NULL; + END IF; + + ccid := sys.cog_constant_category( ccnm ); + + BEGIN + INSERT INTO sys.constant_definitions( name , category_id , description , c_value , min_value , max_value ) + VALUES ( cnm , ccid , cdesc , dval , mival , maval ); + cval := dval; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO occid , cval category_id , c_value FROM sys.constant_definitions + WHERE name = cnm + FOR UPDATE; + + BEGIN + UPDATE sys.constant_definitions SET category_id = ccid , description = cdesc , + min_value = mival , max_value = maval + WHERE name = cnm; + EXCEPTION + WHEN check_violation THEN + UPDATE sys.constant_definitions SET category_id = ccid , description = cdesc , + min_value = mival , max_value = maval , c_value = dval + WHERE name = cnm; + cval := dval; + END; + + + IF occid <> ccid THEN + BEGIN + DELETE FROM sys.constant_categories WHERE id = occid; + EXCEPTION + WHEN foreign_key_violation THEN + -- Do nothing + END; END IF; + END; + + RETURN cval; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.uoc_constant( TEXT , TEXT , TEXT , REAL , REAL , BOOLEAN ) TO :dbuser; + + + +-- +-- Creates or updates a constant with both boundaries +-- +-- Parameters: +-- cnm Constant name +-- cdesc Constant description +-- ccnm Constant category name +-- dval Default value +-- mival Minimal value +-- maval Maximal value +-- +-- Returns: +-- the constant's actual value +-- + +CREATE OR REPLACE FUNCTION sys.uoc_constant( cnm TEXT , cdesc TEXT , ccnm TEXT , dval REAL , mival REAL , maval REAL ) + RETURNS REAL + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + ccid INT; + occid INT; + cval REAL; +BEGIN + ccid := sys.cog_constant_category( ccnm ); + + BEGIN + INSERT INTO sys.constant_definitions( name , category_id , description , c_value , min_value , max_value ) + VALUES ( cnm , ccid , cdesc , dval , mival , maval ); + cval := dval; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO occid , cval category_id , c_value FROM sys.constant_definitions + WHERE name = cnm + FOR UPDATE; + + BEGIN + UPDATE sys.constant_definitions SET category_id = ccid , description = cdesc , + min_value = mival , max_value = maval + WHERE name = cnm; + EXCEPTION + WHEN check_violation THEN + UPDATE sys.constant_definitions SET category_id = ccid , description = cdesc , + min_value = mival , max_value = maval , c_value = dval + WHERE name = cnm; + cval := dval; + END; + + + IF occid <> ccid THEN + BEGIN + DELETE FROM sys.constant_categories WHERE id = occid; + EXCEPTION + WHEN foreign_key_violation THEN + -- Do nothing + END; END IF; + END; + + RETURN cval; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.uoc_constant( TEXT , TEXT , TEXT , REAL , REAL , REAL ) TO :dbuser; + + + +-- +-- Updates a constant's value +-- +-- Parameters: +-- cnm Constant name +-- nval New value +-- aid Administrator attempting to update the constant +-- +-- Returns: +-- TRUE on success, FALSE on failure +-- + +CREATE OR REPLACE FUNCTION sys.set_constant( cnm TEXT , nval REAL , aid INT ) + RETURNS BOOLEAN + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + success BOOLEAN; +BEGIN + BEGIN + UPDATE sys.constant_definitions SET c_value = nval + WHERE name = cnm; + success := FOUND; + EXCEPTION + WHEN check_violation THEN + success := FALSE; + END; + + PERFORM admin.write_log( aid , 'INFO'::log_level , 'Constant "' || cnm || '" changed to ' || nval ); + RETURN success; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.set_constant( TEXT , REAL , INT ) TO :dbuser; + + + +-- +-- Gets a constant's value +-- +-- Parameters: +-- cnm Constant name +-- + +CREATE OR REPLACE FUNCTION sys.get_constant( cnm TEXT ) + RETURNS REAL + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT c_value FROM sys.constant_definitions WHERE name = $1; +$$ LANGUAGE SQL; + + + +-- +-- Constants view +-- + +CREATE VIEW sys.constants_view + AS SELECT cat.name AS category , cns.name AS name , cns.description AS description , + cns.c_value AS value , cns.min_value AS min , cns.max_value AS max + FROM sys.constant_definitions cns + INNER JOIN sys.constant_categories cat + ON cat.id = cns.category_id + ORDER BY cat.name , cns.name; + +GRANT SELECT ON sys.constants_view TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/020-naming-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/020-naming-functions.sql new file mode 100644 index 0000000..bd69b39 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/020-naming-functions.sql @@ -0,0 +1,623 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Names management +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- +-- Creates or returns an empire name +-- +-- Parameters: +-- uid Credentials identifier +-- nnm Empire name to create or return +-- +-- Returns: +-- +X the new empire name's identifier; +-- -1 if the name is banned +-- -2 if the name already exists and is "owned" by another player +-- + +CREATE OR REPLACE FUNCTION naming.goc_empire_name( uid INT, nnm TEXT ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + nid INT; +BEGIN + PERFORM name FROM naming.banned_names WHERE name = lower( nnm ); + IF FOUND + THEN + RETURN -1; + END IF; + + BEGIN + INSERT INTO naming.empire_names ( owner_id , name ) + VALUES ( uid , nnm ) + RETURNING id INTO nid; + EXCEPTION + WHEN unique_violation THEN + SELECT INTO nid id , owner_id FROM naming.empire_names + WHERE lower( name ) = lower( nnm ) AND owner_id = uid; + IF NOT FOUND THEN + RETURN -2; + END IF; + END; + RETURN nid; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Generates a random name. +-- +-- Parameters: +-- len Length of the random name +-- +-- Returns: +-- the random name +-- + +CREATE OR REPLACE FUNCTION naming.randomize( len INT ) + RETURNS TEXT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + i INT; + result TEXT; + ok_chars CHAR ARRAY[16] := ARRAY['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; +BEGIN + result := ''; + FOR i IN 1 .. len + LOOP + result := result || ok_chars[1 + floor( random() * 16 )::int]; + END LOOP; + RETURN result; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Generates a new map name +-- +-- Parameters: +-- prefix Prefix of the map name +-- +-- Returns: +-- the new name's identifier +-- + +CREATE OR REPLACE FUNCTION naming.create_map_name( prefix TEXT ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + len INT; + nid INT; +BEGIN + len := 20 - ( length( prefix ) + 3 ); + LOOP + BEGIN + INSERT INTO naming.map_names( name ) + VALUES ( prefix || '-[' || naming.randomize( len ) || ']' ) + RETURNING id INTO nid; + RETURN nid; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Resets a map name to a random value +-- +-- Parameters: +-- nid Identifier of the name to reset +-- prefix Prefix of the new name +-- +CREATE OR REPLACE FUNCTION naming.reset_map_name( nid INT , prefix TEXT ) + RETURNS TEXT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + len INT; + n_name TEXT; +BEGIN + len := 20 - ( length( prefix ) + 3 ); + LOOP + BEGIN + n_name := prefix || '-[' || naming.randomize( len ) || ']'; + UPDATE naming.map_names SET name = n_name WHERE id = nid; + RETURN n_name; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Resets an empire name +-- +-- Parameters: +-- nid Identifier of the name to reset +-- prefix Prefix of the new name +-- + +CREATE OR REPLACE FUNCTION naming.reset_empire_name( nid INT , prefix TEXT ) + RETURNS TEXT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + len INT; + n_name TEXT; +BEGIN + len := 20 - length( prefix ); + LOOP + BEGIN + n_name := prefix || naming.randomize( len ); + UPDATE naming.empire_names SET name = n_name WHERE id = nid; + RETURN n_name; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Forcibly changes a map name +-- +-- Parameters: +-- nid Identifier of the name +-- uid Identifier of the user who's changing the name +-- nnm New name +-- +-- Returns: +-- 0 Success +-- -1 Banned name +-- -2 Unavailable name +-- +CREATE OR REPLACE FUNCTION naming.change_map_name( nid INT , uid INT , nnm TEXT ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + -- Is the name banned? + PERFORM name FROM naming.banned_names WHERE name = lower( nnm ); + IF FOUND + THEN + RETURN -1; + END IF; + + -- Are we *actually* changing it? + PERFORM id FROM naming.map_names + WHERE id = nid AND name <> nnm + FOR UPDATE; + IF NOT FOUND + THEN + RETURN 0; + END IF; + + -- Rename it + BEGIN + UPDATE naming.map_names SET name = nnm + WHERE id = nid; + EXCEPTION + WHEN unique_violation THEN + RETURN -2; + END; + + -- Update change record + BEGIN + INSERT INTO naming.changed_map_names (name_id,named_by) + VALUES (nid , uid); + EXCEPTION + WHEN unique_violation THEN + DELETE FROM naming.validated_map_names WHERE name_id = nid; + UPDATE naming.changed_map_names + SET named_at = now( ), named_by = uid + WHERE name_id = nid; + END; + + RETURN 0; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Changes a map name if enough time has elapsed +-- +-- Parameters: +-- nid Identifier of the name +-- uid Identifier of the user who's changing the name +-- nnm New name +-- mtime Minimal time between renames +-- +-- Returns: +-- 0 Success +-- 1 Banned name +-- 2 Unavailable name +-- 3 Too early +-- +CREATE OR REPLACE FUNCTION naming.change_map_name( nid INT , uid INT , nnm TEXT , mtime INTERVAL ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + lren TIMESTAMP WITHOUT TIME ZONE; +BEGIN + -- Is the name banned? + PERFORM name FROM naming.banned_names WHERE name = lower( nnm ); + IF FOUND + THEN + RETURN 1; + END IF; + + -- Are we *actually* changing it? + PERFORM id FROM naming.map_names + WHERE id = nid AND name <> nnm + FOR UPDATE; + IF NOT FOUND + THEN + RETURN 0; + END IF; + + -- Check/lock change record + SELECT INTO lren named_at FROM naming.changed_map_names + WHERE name_id = nid FOR UPDATE; + IF FOUND AND lren + mtime > now() + THEN + RETURN 3; + END IF; + + -- Rename it + BEGIN + UPDATE naming.map_names SET name = nnm + WHERE id = nid; + EXCEPTION + WHEN unique_violation THEN + RETURN 2; + END; + + -- Update change record + BEGIN + INSERT INTO naming.changed_map_names (name_id,named_by) + VALUES (nid , uid); + EXCEPTION + WHEN unique_violation THEN + DELETE FROM naming.validated_map_names WHERE name_id = nid; + UPDATE naming.changed_map_names + SET named_at = now( ), named_by = uid + WHERE name_id = nid; + END; + + RETURN 0; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Marks a map name as validated +-- +-- Paramaters: +-- a_id Administrator identifier +-- n_id Name identifier +-- + +CREATE OR REPLACE FUNCTION naming.validate_map_name( a_id INT , n_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + nm TEXT; +BEGIN + SELECT INTO nm name + FROM naming.map_names + WHERE id = n_id; + IF NOT FOUND + THEN + RETURN; + END IF; + + INSERT INTO naming.validated_map_names( name_id , validated_by ) + VALUES ( n_id , a_id ); + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Map name #' || n_id || ' (' || nm || ') validated' ); +EXCEPTION + WHEN unique_violation OR foreign_key_violation THEN + -- Do nothing +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION naming.validate_map_name( INT , INT ) TO :dbuser; + + + +-- +-- Rejects a map name +-- +-- Parameters: +-- a_id Administrator identifier +-- n_id Name identifier +-- ban_name Whether the old name should be banned +-- + +CREATE OR REPLACE FUNCTION naming.reject_map_name( a_id INT , n_id INT , ban_name BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + c_name TEXT; + n_name TEXT; + u_id INT; + warned BOOLEAN; + n_warnings INT; +BEGIN + -- Get current name and player ID + SELECT INTO c_name , u_id n.name , cn.named_by + FROM naming.map_names n + INNER JOIN naming.changed_map_names cn ON cn.name_id = n.id + WHERE n.id = n_id + FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Forcibly rename the planet + n_name := naming.reset_map_name( n_id , 'P' ); + + -- Update battle + PERFORM battles.rename_planet( n_id , n_name ); + + -- Send warning + SELECT INTO warned , n_warnings * FROM admin.give_player_warning( a_id , u_id ); + + -- Send internal message + PERFORM events.map_name_rejected_event( u_id , n_id , c_name , n_name , warned , n_warnings ); + PERFORM msgs.deliver_internal( ); + + -- Add validation and log entry + DELETE FROM naming.validated_map_names WHERE name_id = n_id; + INSERT INTO naming.validated_map_names( name_id , validated_by ) + VALUES ( n_id , a_id ); + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Map name #' || n_id || ' (' || c_name || ') rejected' ); + + -- Ban old name + IF ban_name + THEN + BEGIN + INSERT INTO naming.banned_names ( name , added_by ) + VALUES ( lower( c_name ) , a_id ); + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Name "' || lower( c_name ) || '" banned' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION naming.reject_map_name( INT , INT , BOOLEAN ) TO :dbuser; + + +-- +-- Rejects an empire's name +-- +-- a_id Administrator identifier +-- n_id Name identifier +-- ban_name Whether the old name should be banned +-- + +CREATE OR REPLACE FUNCTION naming.reject_empire_name( a_id INT , n_id INT , ban_name BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + c_name TEXT; + n_name TEXT; + u_id INT; + warned BOOLEAN; + n_warnings INT; +BEGIN + -- Get current name and player ID + SELECT INTO c_name , u_id n.name , n.owner_id + FROM naming.empire_names n WHERE n.id = n_id + FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Forcibly rename the empire + n_name := naming.reset_empire_name( n_id , 'Rude Empire ' ); + + -- Update battles + UPDATE battles.empires SET name = n_name WHERE empire_id = n_id; + UPDATE msgs.senders SET name = n_name WHERE sender_type = 'EMP' AND empire_id = n_id; + UPDATE msgs.receivers SET name = n_name WHERE receiver_type = 'EMP' AND empire_id = n_id; + + -- Send warning + SELECT INTO warned , n_warnings * FROM admin.give_player_warning( a_id , u_id ); + + -- Send internal message + PERFORM events.empire_name_rejected_event( n_id , c_name , n_name , warned , n_warnings ); + PERFORM msgs.deliver_internal( ); + + -- Add log entry + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Empire name #' || n_id || ' (' || c_name || ') forcibly renamed' ); + + -- Ban name if requested + IF ban_name + THEN + BEGIN + INSERT INTO naming.banned_names ( name , added_by ) + VALUES ( lower( c_name ) , a_id ); + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Name "' || lower( c_name ) || '" banned' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION naming.reject_empire_name( INT , INT , BOOLEAN ) TO :dbuser; + + + +-- +-- Forcibly disbands an alliance, sending a warning to its leader +-- +-- Parameters: +-- a_id Administrator identifier +-- al_id Alliance identifier +-- + +CREATE OR REPLACE FUNCTION naming.reject_alliance_name( a_id INT , al_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + u_id INT; + c_name TEXT; + warned BOOLEAN; + n_warnings INT; +BEGIN + -- Get current name, leader ID and player ID + SELECT INTO c_name , e_id , u_id a.tag , a.leader_id , n.owner_id + FROM emp.alliances a + INNER JOIN naming.empire_names n ON n.id = a.leader_id + WHERE a.id = al_id FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Disband the alliance + PERFORM emp.leave_alliance( e_id ); + + -- Send warning + SELECT INTO warned , n_warnings * FROM admin.give_player_warning( a_id , u_id ); + + -- Send internal message + PERFORM events.alliance_name_rejected_event( e_id , c_name , warned , n_warnings ); + PERFORM msgs.deliver_internal( ); + + -- Add log entry + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Alliance ' || c_name || ' disbanded' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION naming.reject_alliance_name( INT , INT ) TO :dbuser; + + + +-- +-- Allows a modified map name to be renamed earlier than it should +-- +-- Parameters: +-- a_id Administrator identifier +-- n_id Name identifier +-- + +CREATE OR REPLACE FUNCTION naming.allow_map_name_change( a_id INT , n_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + nm TEXT; + mdelay BIGINT; +BEGIN + SELECT INTO nm n.name + FROM naming.map_names n + INNER JOIN naming.changed_map_names c ON c.name_id = n.id + INNER JOIN naming.validated_map_names v ON v.name_id = n.id + WHERE id = n_id + FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + + mdelay := 1 + floor( sys.get_constant( 'map.names.minDelay' ) * sys.get_constant( 'map.names.minDelay.units' ) )::BIGINT; + UPDATE naming.changed_map_names + SET named_at = now() - ( mdelay::BIGINT || 's' )::INTERVAL + WHERE name_id = n_id; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Allowed early modification of map name #' || n_id || ' (' || nm || ')' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION naming.allow_map_name_change( INT , INT ) TO :dbuser; + + + +-- +-- Names and status +-- + +CREATE TYPE name_status + AS ENUM( 'MAP_PENDING' , 'MAP_VALIDATED' , 'EMPIRE' , 'ALLIANCE' ); + +CREATE VIEW naming.names_view + AS SELECT en.id , en.name , ( CASE WHEN e IS NULL THEN NULL ELSE '' END )::TEXT AS extra , + en.owner_id AS account , 'EMPIRE'::name_status AS status + FROM naming.empire_names en + LEFT OUTER JOIN emp.empires e ON en.id = e.name_id + UNION ALL SELECT n.id , n.name , NULL::TEXT AS extra , c.named_by AS account , + ( CASE + WHEN v.name_id IS NULL THEN 'MAP_PENDING' + ELSE 'MAP_VALIDATED' + END )::name_status AS status + FROM naming.map_names n + INNER JOIN naming.changed_map_names c ON c.name_id = n.id + LEFT OUTER JOIN naming.validated_map_names v ON v.name_id = c.name_id + UNION ALL SELECT a.id , a.tag AS name , a.name AS extra , l.owner_id AS account , + 'ALLIANCE'::name_status AS status + FROM emp.alliances a + INNER JOIN naming.empire_names l ON l.id = a.leader_id; + +GRANT SELECT ON naming.names_view TO :dbuser; + + +CREATE VIEW naming.names_status_view + AS SELECT status , count(*) AS count + FROM naming.names_view + GROUP BY status; + +GRANT SELECT ON naming.names_status_view TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/030-tech-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/030-tech-functions.sql new file mode 100644 index 0000000..eb2c74a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/030-tech-functions.sql @@ -0,0 +1,379 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions and views for technologies and buildables +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- "Basic" buildables view (buildables that do not depend on any technology) +-- + +CREATE VIEW tech.basic_buildables + AS SELECT b.* FROM tech.buildables b + LEFT OUTER JOIN tech.buildable_requirements r + ON r.buildable_id = b.name_id + WHERE r.buildable_id IS NULL; + + +-- +-- Buildings view +-- + +CREATE VIEW tech.buildings_view + AS SELECT b.name_id , b.description_id , b.cost , b.work , b.upkeep , + bld.workers , bld.output_type , bld.output + FROM tech.buildables b + INNER JOIN tech.buildings bld + ON b.name_id = bld.buildable_id; + + +-- +-- Ships view +-- + +CREATE VIEW tech.ships_view + AS SELECT b.name_id , b.description_id , b.cost , b.work , b.upkeep , + s.flight_time , s.power + FROM tech.buildables b + INNER JOIN tech.ships s + ON b.name_id = s.buildable_id; + + + +-- +-- Creates or updates a technology line +-- +-- Parameters: +-- tln Tech line name +-- tld Tech line description +-- + +CREATE OR REPLACE FUNCTION tech.uoc_line( tln TEXT , tld TEXT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + nid INT; + did INT; +BEGIN + -- Get string identifiers + SELECT INTO nid id FROM defs.strings WHERE name = tln; + SELECT INTO did id FROM defs.strings WHERE name = tld; + + -- Try creating / updating + BEGIN + INSERT INTO tech.lines ( name_id , description_id ) + VALUES ( nid , did ); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.lines SET description_id = did + WHERE name_id = nid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_line( TEXT , TEXT ) TO :dbuser; + + + +-- +-- Creates or updates a technology level +-- +-- Parameters: +-- tln Tech line name +-- lv Level +-- lvn Level name +-- lvd Level description +-- lvp Points +-- lvc Cost +-- + +CREATE OR REPLACE FUNCTION tech.uoc_level( tln TEXT , lv INT , lvn TEXT , lvd TEXT , lvp INT , lvc INT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + lid INT; + nid INT; + did INT; +BEGIN + -- Get tech line + SELECT INTO lid t.name_id + FROM tech.lines t + INNER JOIN defs.strings s + ON s.id = t.name_id + WHERE s.name = tln; + + -- Get name / description IDs + SELECT INTO nid id FROM defs.strings WHERE name = lvn; + SELECT INTO did id FROM defs.strings WHERE name = lvd; + + -- Create or update the level + BEGIN + INSERT INTO tech.levels ( line_id , level , name_id , description_id , points , cost ) + VALUES ( lid , lv , nid , did , lvp , lvc ); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.levels SET name_id = nid , description_id = did , points = lvp , cost = lvc + WHERE line_id = lid AND level = lv; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_level( TEXT , INT , TEXT , TEXT , INT , INT ) to :dbuser; + + + +-- +-- Creates or updates a buildable definition +-- +-- Parameters: +-- bdn Buildable name +-- bdd Buildable description +-- bdc Cost +-- bdw Work +-- bdu Upkeep +-- bdtn Dependency (name) +-- bdtl Dependency (level) +-- +-- Returns: +-- the buildable's identifier +-- + +CREATE OR REPLACE FUNCTION tech.uoc_buildable( bdn TEXT , bdd TEXT , bdc INT , bdw INT , bdu INT , bdtn TEXT , bdtl INT ) + RETURNS INT + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + nid INT; + did INT; + tdid INT; +BEGIN + -- Get the various translations + SELECT INTO nid id FROM defs.strings WHERE name = bdn; + SELECT INTO did id FROM defs.strings WHERE name = bdd; + IF bdtn <> '' THEN + SELECT INTO tdid tl.id FROM tech.levels tl + INNER JOIN defs.strings s + ON s.id = tl.line_id + WHERE s.name = bdtn AND tl.level = bdtl; + END IF; + + -- Create or update the definition + BEGIN + INSERT INTO tech.buildables ( name_id , description_id , cost , work , upkeep ) + VALUES ( nid , did , bdc , bdw , bdu ); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.buildables SET description_id = did , cost = bdc , work = bdw , upkeep = bdu + WHERE name_id = nid; + END; + + -- Set dependencies + DELETE FROM tech.buildable_requirements WHERE buildable_id = nid; + IF bdtn <> '' THEN + INSERT INTO tech.buildable_requirements ( buildable_id , level_id ) + VALUES ( nid , tdid ); + END IF; + + RETURN nid; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Update or create a building definition (no tech dependency) +-- +-- Parameters: +-- bdn Buildable name +-- bdd Buildable description +-- bdc Cost +-- bdw Work +-- bdu Upkeep +-- bdwk Workers +-- bdot Output type +-- bdo Output +-- + +CREATE OR REPLACE FUNCTION tech.uoc_building( bdn TEXT , bdd TEXT , bdc INT , bdw INT , + bdu INT , bdwk INT , bdot building_output_type , bdo INT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + bdid INT; +BEGIN + bdid := tech.uoc_buildable( bdn , bdd , bdc , bdw , bdu , '' , 0 ); + + PERFORM buildable_id FROM tech.ships WHERE buildable_id = bdid; + IF FOUND THEN + RAISE EXCEPTION 'Trying to transform a ship into a building'; + END IF; + + BEGIN + INSERT INTO tech.buildings (buildable_id, workers, output_type, output) + VALUES (bdid , bdwk , bdot , bdo); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.buildings SET workers = bdwk , output_type = bdot , output = bdo + WHERE buildable_id = bdid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_building( TEXT , TEXT , INT , INT , INT , INT , building_output_type , INT ) TO :dbuser; + + + +-- +-- Update or create a building definition (with tech dependency) +-- +-- Parameters: +-- bdn Buildable name +-- bdd Buildable description +-- bdc Cost +-- bdw Work +-- bdu Upkeep +-- bdwk Workers +-- bdot Output type +-- bdo Output +-- bdtn Dependency (name) +-- bdtl Dependency (level) +-- + +CREATE OR REPLACE FUNCTION tech.uoc_building( bdn TEXT , bdd TEXT , bdc INT , bdw INT , + bdu INT , bdwk INT , bdot building_output_type , bdo INT , + bdtn TEXT , bdtl INT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + bdid INT; +BEGIN + bdid := tech.uoc_buildable( bdn , bdd , bdc , bdw , bdu , bdtn , bdtl ); + + PERFORM buildable_id FROM tech.ships WHERE buildable_id = bdid; + IF FOUND THEN + RAISE EXCEPTION 'Trying to transform a ship into a building'; + END IF; + + BEGIN + INSERT INTO tech.buildings (buildable_id, workers, output_type, output) + VALUES (bdid , bdwk , bdot , bdo); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.buildings SET workers = bdwk , output_type = bdot , output = bdo + WHERE buildable_id = bdid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_building( TEXT , TEXT , INT , INT , INT , INT , building_output_type , INT , TEXT , INT ) TO :dbuser; + + + +-- +-- Update or create a ship definition (no tech dependency) +-- +-- Parameters: +-- sn Buildable name +-- sd Buildable description +-- sc Cost +-- sw Work +-- su Upkeep +-- sp Power +-- sft Orbital flight time +-- + +CREATE OR REPLACE FUNCTION tech.uoc_ship( sn TEXT , sd TEXT , sc INT , sw INT , + su INT , sp INT , sft INT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + bdid INT; +BEGIN + bdid := tech.uoc_buildable( sn , sd , sc , sw , su , '' , 0 ); + + PERFORM buildable_id FROM tech.buildings WHERE buildable_id = bdid; + IF FOUND THEN + RAISE EXCEPTION 'Trying to transform a building into a ship'; + END IF; + + BEGIN + INSERT INTO tech.ships (buildable_id, flight_time, power) + VALUES (bdid , sft , sp); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.ships SET flight_time = sft , power = sp + WHERE buildable_id = bdid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_ship( TEXT , TEXT , INT , INT , INT , INT , INT ) TO :dbuser; + + + +-- +-- Update or create a ship definition +-- +-- Parameters: +-- sn Buildable name +-- sd Buildable description +-- sc Cost +-- sw Work +-- su Upkeep +-- sp Power +-- sft Orbital flight time +-- stdn Tech line name +-- stdl Tech level +-- + +CREATE OR REPLACE FUNCTION tech.uoc_ship( sn TEXT , sd TEXT , sc INT , sw INT , + su INT , sp INT , sft INT , stdn TEXT , stdl INT ) + RETURNS VOID + STRICT + VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + bdid INT; +BEGIN + bdid := tech.uoc_buildable( sn , sd , sc , sw , su , stdn , stdl ); + + PERFORM buildable_id FROM tech.buildings WHERE buildable_id = bdid; + IF FOUND THEN + RAISE EXCEPTION 'Trying to transform a building into a ship'; + END IF; + + BEGIN + INSERT INTO tech.ships (buildable_id, flight_time, power) + VALUES (bdid , sft , sp); + EXCEPTION + WHEN unique_violation THEN + UPDATE tech.ships SET flight_time = sft , power = sp + WHERE buildable_id = bdid; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION tech.uoc_ship( TEXT , TEXT , INT , INT , INT , INT , INT , TEXT , INT ) TO :dbuser; + + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/035-users-view.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/035-users-view.sql new file mode 100644 index 0000000..7f1de9d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/035-users-view.sql @@ -0,0 +1,85 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- General account view +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + +-- +-- General account view +-- +-- Allows most account-related data to be loooked up, and computes account statuses. +-- + +CREATE VIEW users.accounts_view + AS SELECT addr.id AS id , addr.address AS address , lang.language AS language , + cred.pass_md5 AS pass_md5 , cred.pass_sha1 AS pass_sha1 , cred.credits AS game_credits , + ( CASE ( ban.account_id IS NULL ) + WHEN TRUE THEN + ( CASE ( iacc.credentials_id IS NULL ) + WHEN TRUE THEN + ( CASE ( aacc.credentials_id IS NULL ) + WHEN TRUE THEN + 'UNCONFIRMED' + ELSE + ( CASE ( vac.status IS NULL ) + WHEN TRUE THEN + 'ACTIVE' + ELSE + ( CASE vac.status + WHEN 'PROCESSED' THEN + 'VACATION' + ELSE + 'START_VACATION' + END ) + END ) + END ) + ELSE + ( CASE ( aacc.credentials_id IS NULL ) + WHEN TRUE THEN + ( CASE ( vkey.credentials_id IS NULL ) + WHEN TRUE THEN + 'DISABLED' + ELSE + 'REACTIVATING' + END ) + ELSE + 'QUITTING' + END ) + END ) + ELSE + 'BANNED' + END ) AS status , + vkey.token AS validation_token , prr.token AS pwd_recovery_token , + acr.token AS address_change_token , naddr.address AS new_address , + aacc.vacation_credits AS vacation_credits , + floor( aacc.vacation_credits / sys.get_constant( 'vacation.cost' ) ) AS vacation_time, + vac.since AS vacation_start , + iacc.since AS inactivity_begin , ires.reason AS inactivity_reason , + ban.ban_id AS ban_request_id + FROM users.addresses addr + INNER JOIN users.credentials cred + ON cred.address_id = addr.id + INNER JOIN defs.languages lang + ON lang.id = cred.language_id + LEFT OUTER JOIN users.validation_keys vkey + ON vkey.credentials_id = cred.address_id + LEFT OUTER JOIN users.pwd_recovery_requests prr + ON prr.credentials_id = cred.address_id AND NOT prr.used + LEFT OUTER JOIN users.address_change_requests acr + ON acr.credentials_id = cred.address_id AND NOT acr.used + LEFT OUTER JOIN users.addresses naddr + ON naddr.id = acr.address_id + LEFT OUTER JOIN users.active_accounts aacc + ON aacc.credentials_id = cred.address_id + LEFT OUTER JOIN users.vacations AS vac + ON vac.account_id = aacc.credentials_id + LEFT OUTER JOIN users.inactive_accounts AS iacc + ON iacc.credentials_id = cred.address_id + LEFT OUTER JOIN users.reasons AS ires + ON ires.account_id = iacc.credentials_id + LEFT OUTER JOIN users.bans AS ban + ON ban.account_id = iacc.credentials_id; + +GRANT SELECT ON users.accounts_view TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/040-empire-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/040-empire-functions.sql new file mode 100644 index 0000000..8c18e73 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/040-empire-functions.sql @@ -0,0 +1,662 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Empire management functions and views +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Empire creation +-- +-- Parameters: +-- nid Empire name identifier +-- pid Planet identifier +-- icash Initial cash +-- +CREATE OR REPLACE FUNCTION emp.create_empire( nid INT , pid INT , icash REAL ) + RETURNS VOID + STRICT + VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + uid BIGINT; + utp update_type; +BEGIN + -- Add empire and give initial planet + INSERT INTO emp.empires ( name_id , cash ) + VALUES ( nid , icash ); + INSERT INTO emp.planets ( planet_id , empire_id ) + VALUES ( pid , nid ); + + -- Add empire update records + FOR utp IN SELECT x FROM unnest( enum_range( NULL::update_type ) ) AS x + WHERE x::text LIKE 'EMPIRE_%' + LOOP + INSERT INTO sys.updates( gu_type ) + VALUES ( utp ) + RETURNING id INTO uid; + INSERT INTO emp.updates ( update_id , empire_id ) + VALUES ( uid , nid ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + +-- +-- Returns a planet owner's empire size +-- + +CREATE OR REPLACE FUNCTION emp.get_size( pid INT ) + RETURNS INT + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT count( aep.* )::INT + FROM emp.planets ep + INNER JOIN emp.planets aep + ON ep.empire_id = aep.empire_id + WHERE ep.planet_id = $1; +$$ LANGUAGE SQL; + + + +-- +-- Returns the empire associated with an account +-- + +CREATE OR REPLACE FUNCTION emp.get_current( a_id INT , OUT empire_id INT ) + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT e.name_id AS empire_id + FROM users.credentials c + INNER JOIN naming.empire_names en ON en.owner_id = c.address_id + INNER JOIN emp.empires e ON e.name_id = en.id + WHERE c.address_id = $1; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION emp.get_current( INT ) TO :dbuser; + + + +-- +-- Implements a technology +-- + +CREATE OR REPLACE FUNCTION emp.implement_tech( e_id INT , l_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_cash REAL; + lev INT; + cost REAL; +BEGIN + SELECT INTO e_cash , lev , cost e.cash , et.level , tl.cost + FROM emp.empires e + INNER JOIN emp.technologies et + ON et.line_id = l_id AND et.empire_id = e.name_id + INNER JOIN tech.levels tl + ON tl.line_id = l_id AND tl.level = et.level + AND tl.points = floor( et.accumulated ) + AND tl.cost <= e.cash + WHERE e.name_id = e_id + FOR UPDATE OF e , et; + + IF NOT FOUND THEN + RETURN; + END IF; + + UPDATE emp.empires + SET cash = e_cash - cost + WHERE name_id = e_id; + UPDATE emp.technologies + SET level = lev + 1 , accumulated = 0 + WHERE empire_id = e_id AND line_id = l_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.implement_tech( INT , INT ) TO :dbuser; + + + +-- +-- Add an enemy empire +-- +-- Parameters: +-- e_id Empire identifier +-- e_name New enemy name +-- +-- Returns: +-- err_code Error code: +-- 0 on success +-- 1 if the specified empire does not exist +-- 2 if the player is being schizophrenic +-- 3 if the enemy list already contains the specified empire +-- + +CREATE OR REPLACE FUNCTION emp.add_enemy_empire( e_id INT , e_name TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + en_id INT; +BEGIN + SELECT INTO en_id e.name_id + FROM emp.empires e + INNER JOIN naming.empire_names en ON e.name_id = en.id + WHERE lower( en.name ) = lower( e_name ); + IF NOT FOUND THEN + err_code := 1; + ELSEIF en_id = e_id THEN + err_code := 2; + ELSE + BEGIN + INSERT INTO emp.enemy_empires (empire_id , enemy_id) + VALUES (e_id , en_id); + err_code := 0; + EXCEPTION + WHEN unique_violation THEN + err_code := 3; + END; + END IF; + + IF err_code = 0 THEN + PERFORM emp.switch_enemies( e_id ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.add_enemy_empire( INT , TEXT ) TO :dbuser; + + + +-- +-- Add an enemy alliance +-- +-- Parameters: +-- e_id Empire identifier +-- e_name Alliance tag +-- +-- Returns: +-- err_code Error code: +-- 0 on success +-- 1 if the specified alliance does not exist +-- 2 if the player is adding his/her own alliance +-- 3 if the enemy list already contains the specified alliance +-- + +CREATE OR REPLACE FUNCTION emp.add_enemy_alliance( e_id INT , e_name TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + en_id INT; + e_ca_id INT; +BEGIN + SELECT INTO en_id a.id + FROM emp.alliances a + WHERE lower( a.tag ) = lower( e_name ); + IF NOT FOUND THEN + err_code := 1; + ELSE + SELECT INTO e_ca_id ea.alliance_id + FROM emp.alliance_members ea + WHERE ea.empire_id = e_id; + IF FOUND AND en_id = e_ca_id THEN + err_code := 2; + ELSE + BEGIN + INSERT INTO emp.enemy_alliances (empire_id , alliance_id) + VALUES (e_id , en_id); + err_code := 0; + EXCEPTION + WHEN unique_violation THEN + err_code := 3; + END; + END IF; + END IF; + + IF err_code = 0 THEN + PERFORM emp.switch_enemies( e_id ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.add_enemy_alliance( INT , TEXT ) TO :dbuser; + + + +-- +-- Remove enemy empires +-- +-- Parameters: +-- e_id Empire identifier +-- rem_ids Identifiers of enemy empires to remove +-- + +CREATE OR REPLACE FUNCTION emp.remove_enemy_empires( e_id INT , rem_ids INT[]) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + DELETE FROM emp.enemy_empires + WHERE empire_id = e_id AND enemy_id IN ( SELECT unnest( rem_ids ) AS id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.remove_enemy_empires( INT , INT[] ) TO :dbuser; + + + +-- +-- Remove enemy alliances +-- +-- Parameters: +-- e_id Empire identifier +-- rem_ids Identifiers of enemy alliances to remove +-- + +CREATE OR REPLACE FUNCTION emp.remove_enemy_alliances( e_id INT , rem_ids INT[]) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + DELETE FROM emp.enemy_alliances + WHERE empire_id = e_id AND alliance_id IN ( SELECT unnest( rem_ids ) AS id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.remove_enemy_alliances( INT , INT[] ) TO :dbuser; + + +-- +-- Switch enemies to attack +-- +-- Parameters: +-- e_id Empire identifier +-- + +CREATE OR REPLACE FUNCTION emp.switch_enemies( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; +BEGIN + CREATE TEMPORARY TABLE fleet_switches( + loc_id INT , + loc_name VARCHAR(20) , + own_id INT , + own_name VARCHAR(20) , + name VARCHAR(64) , + power BIGINT , + mode BOOLEAN + ) ON COMMIT DROP; + INSERT INTO fleet_switches + SELECT f.location_id , ln.name , f.owner_id , fon.name , + f.name , fs.power , TRUE + FROM fleets.fleets f + INNER JOIN emp.planets ep ON f.location_id = ep.planet_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN emp.enemies el ON el.enemy = f.owner_id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + INNER JOIN naming.map_names ln ON ln.id = f.location_id + INNER JOIN naming.empire_names fon ON fon.id = f.owner_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE ep.empire_id = e_id AND el.empire = e_id AND m.fleet_id IS NULL + AND NOT f.attacking; + PERFORM events.commit_fleet_switches( TRUE ); + + FOR rec IN SELECT DISTINCT f.location_id AS location , f.owner_id AS owner , b.id AS battle + FROM fleets.fleets f + INNER JOIN emp.planets ep ON f.location_id = ep.planet_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN emp.enemies el ON el.enemy = f.owner_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + LEFT OUTER JOIN battles.battles b + ON b.location_id = ep.planet_id AND b.last_tick IS NULL + WHERE ep.empire_id = e_id AND el.empire = e_id AND m.fleet_id IS NULL + AND NOT f.attacking + LOOP + -- Set fleets mode + UPDATE fleets.fleets f + SET attacking = TRUE , + status = 'REDEPLOYING' , + penalty = ( CASE + WHEN f2.penalty > ( 1 + fs.flight_time * 40 ) + THEN f2.penalty + ELSE ( 1 + fs.flight_time * 40 ) + END ) + FROM fleets.fleets f2 + INNER JOIN fleets.stats_view fs ON fs.id = f2.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f2.id + WHERE f2.owner_id = rec.owner AND f2.location_id = rec.location + AND m.fleet_id IS NULL AND f2.id = f.id; + + -- Update battle + PERFORM battles.set_mode( rec.battle , rec.owner , TRUE ); + END LOOP; + + PERFORM msgs.deliver_internal( ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Deletes an empire +-- + +CREATE OR REPLACE FUNCTION emp.delete_empire( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_id INT; + f_id BIGINT; + fleets BIGINT[]; +BEGIN + -- Lock empire + PERFORM * FROM emp.empires WHERE name_id = e_id FOR UPDATE; + + -- Disband fleets + fleets := '{}'::BIGINT[]; + FOR f_id IN SELECT id FROM fleets.fleets WHERE owner_id = e_id FOR UPDATE + LOOP + fleets := array_append( fleets , f_id ); + END LOOP; + PERFORM fleets.disband( e_id , fleets ); + + -- Abandon planets + FOR p_id IN SELECT planet_id FROM emp.planets WHERE empire_id = e_id + LOOP + PERFORM emp.leave_planet( p_id ); + END LOOP; + + -- Leave alliance + PERFORM emp.leave_alliance( e_id ); + + -- Delete empire + DELETE FROM emp.empires WHERE name_id = e_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Obtains a new planet +-- +-- Parameters: +-- e_id Empire identifier +-- p_name Planet name +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 banned name +-- 2 name unavailable +-- 3 empire has planets +-- +CREATE OR REPLACE FUNCTION emp.get_new_planet( e_id INT , p_name TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + plid INT; + accid INT; + ccash REAL; + f_id BIGINT; + fleets BIGINT[]; +BEGIN + -- Lock empire and check for existing planets + SELECT INTO ccash cash FROM emp.empires WHERE name_id = e_id FOR UPDATE; + PERFORM * FROM emp.planets WHERE empire_id = e_id LIMIT 1; + IF FOUND + THEN + err_code := 3; + RETURN; + END IF; + SELECT INTO accid owner_id FROM naming.empire_names WHERE id = e_id; + + -- Get random planet and rename it + plid := verse.get_random_planet( ); + IF plid IS NULL THEN + err_code := 2; + ELSE + err_code := - naming.change_map_name( plid , accid , p_name ); + END IF; + IF err_code <> 0 + THEN + RETURN; + END IF; + INSERT INTO emp.planets ( planet_id , empire_id ) + VALUES ( plid , e_id ); + + -- Disband fleets + fleets := '{}'::BIGINT[]; + FOR f_id IN SELECT id FROM fleets.fleets WHERE owner_id = e_id FOR UPDATE + LOOP + fleets := array_append( fleets , f_id ); + END LOOP; + PERFORM fleets.disband( e_id , fleets ); + + -- Reset to initial cash if below + IF ccash < sys.get_constant( 'game.initialCash' ) + THEN + UPDATE emp.empires + SET cash = sys.get_constant( 'game.initialCash' ) + WHERE name_id = e_id; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.get_new_planet( INT , TEXT ) TO :dbuser; + + + + +-- +-- Enemies view +-- + +CREATE VIEW emp.enemies + AS SELECT iq.empire AS empire , iq.enemy AS enemy FROM + ( SELECT ee.empire_id AS empire , ee.enemy_id AS enemy + FROM emp.enemy_empires ee + UNION SELECT ea.empire_id AS empire , am.empire_id AS enemy + FROM emp.enemy_alliances ea + INNER JOIN emp.alliance_members am + ON am.alliance_id = ea.alliance_id AND NOT am.is_pending ) AS iq + ORDER BY iq.empire , iq.enemy; + + +-- +-- General information view +-- + +CREATE VIEW emp.general_information + AS SELECT e.name_id AS id , en.name AS name , + ( CASE + WHEN av.status = 'QUITTING' THEN 'q' + WHEN av.status = 'VACATION' THEN 'v' + WHEN av.status = 'START_VACATION' THEN 's' + ELSE NULL + END ) AS status , + e.cash AS cash , a.tag AS alliance , + st.next_tick AS game_time , + av.id AS account_id + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.accounts_view av ON av.id = en.owner_id + LEFT OUTER JOIN emp.alliance_members am + ON am.empire_id = e.name_id AND NOT am.is_pending + LEFT OUTER JOIN emp.alliances a ON a.id = am.alliance_id + CROSS JOIN sys.status st; + +GRANT SELECT ON emp.general_information TO :dbuser; + + +-- +-- Empire planets view +-- + +CREATE VIEW emp.planets_view + AS SELECT e.empire_id AS empire , n.id AS id , n.name AS name + FROM emp.planets e + INNER JOIN verse.planets p ON p.name_id = e.planet_id + INNER JOIN verse.systems s ON s.id = p.system_id + INNER JOIN naming.map_names n ON n.id = e.planet_id + ORDER BY e.empire_id , s.x , s.y , p.orbit; + +GRANT SELECT ON emp.planets_view TO :dbuser; + + +-- +-- Empire overviews +-- + +CREATE VIEW emp.planets_overview + AS SELECT e.name_id AS empire , count( p.* ) AS planets , + sum( floor( p.population) ) AS population , + floor( avg( 100.0 * ph.current / p.population ) ) AS avg_happiness , + floor( sum( pm.income ) ) AS planet_income , + floor( sum( pm.upkeep ) ) AS planet_upkeep + FROM emp.empires e + LEFT OUTER JOIN emp.planets ep ON ep.empire_id = e.name_id + LEFT OUTER JOIN verse.planets p ON p.name_id = ep.planet_id + LEFT OUTER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + LEFT OUTER JOIN verse.planet_money pm ON pm.planet_id = p.name_id + GROUP BY e.name_id; + +CREATE VIEW emp.civ_invest_acc_totals + AS SELECT e.name_id AS empire , sum( cq.money ) AS acc_total + FROM emp.empires e + LEFT OUTER JOIN emp.planets ep ON ep.empire_id = e.name_id + LEFT OUTER JOIN verse.bld_queues cq ON cq.planet_id = ep.planet_id + GROUP BY e.name_id; + +CREATE VIEW emp.civ_investment_view + AS SELECT e.name_id AS empire , + ( sum( bqi.amount * bqid.cost ) - ( CASE WHEN ciat.acc_total IS NULL THEN 0 ELSE ciat.acc_total END ) )::BIGINT AS civ_investment + FROM emp.empires e + LEFT OUTER JOIN emp.planets ep ON ep.empire_id = e.name_id + LEFT OUTER JOIN emp.civ_invest_acc_totals ciat ON ciat.empire = e.name_id + LEFT OUTER JOIN verse.bld_items bqi ON bqi.queue_id = ep.planet_id AND NOT bqi.destroy + LEFT OUTER JOIN tech.buildables bqid ON bqid.name_id = bqi.building_id + GROUP BY e.name_id, ciat.acc_total; + +CREATE VIEW emp.mil_invest_acc_totals + AS SELECT e.name_id AS empire , sum( mq.money ) AS acc_total + FROM emp.empires e + LEFT OUTER JOIN emp.planets ep ON ep.empire_id = e.name_id + LEFT OUTER JOIN verse.mil_queues mq ON mq.planet_id = ep.planet_id + GROUP BY e.name_id; + +CREATE VIEW emp.mil_investment_view + AS SELECT e.name_id AS empire , + ( sum( mqi.amount * mqid.cost ) - ( CASE WHEN miat.acc_total IS NULL THEN 0 ELSE miat.acc_total END ) )::BIGINT AS mil_investment + FROM emp.empires e + LEFT OUTER JOIN emp.planets ep ON ep.empire_id = e.name_id + LEFT OUTER JOIN emp.mil_invest_acc_totals miat ON miat.empire = e.name_id + LEFT OUTER JOIN verse.mil_items mqi ON mqi.queue_id = ep.planet_id + LEFT OUTER JOIN tech.buildables mqid ON mqid.name_id = mqi.ship_id + GROUP BY e.name_id, miat.acc_total; + +CREATE VIEW emp.fleets_overview + AS SELECT e.name_id AS empire , + sum( sd.power * s.amount ) AS fleet_power , + sum( sbd.upkeep * s.amount ) AS fleet_upkeep + FROM emp.empires e + LEFT OUTER JOIN fleets.fleets f ON f.owner_id = e.name_id + LEFT OUTER JOIN fleets.ships s ON s.fleet_id = f.id + LEFT OUTER JOIN tech.ships sd ON sd.buildable_id = s.ship_id + LEFT OUTER JOIN tech.buildables sbd ON sbd.name_id = sd.buildable_id + GROUP BY e.name_id; + +CREATE VIEW emp.new_messages + AS SELECT e.name_id AS empire , count( m.* ) AS new_messages + FROM emp.empires e + LEFT OUTER JOIN msgs.empire_delivery m + ON m.empire_id = e.name_id AND m.in_inbox AND m.status = 'UNREAD' + GROUP BY e.name_id; + + +CREATE VIEW emp.overview + AS SELECT * FROM emp.planets_overview + INNER JOIN emp.fleets_overview USING (empire) + INNER JOIN emp.civ_investment_view USING (empire) + INNER JOIN emp.mil_investment_view USING (empire) + INNER JOIN emp.new_messages USING (empire); + +GRANT SELECT ON emp.overview TO :dbuser; + + +-- +-- Empire tech lines +-- + +CREATE VIEW emp.tech_lines_view + AS SELECT e.name_id AS empire , tl.name_id AS tech_line , + t1.translated_string AS name , + t2.translated_string AS description + FROM emp.empires e + INNER JOIN emp.technologies et ON et.empire_id = e.name_id + INNER JOIN tech.lines tl ON tl.name_id = et.line_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t1 ON t1.string_id = tl.name_id AND t1.lang_id = c.language_id + INNER JOIN defs.translations t2 ON t2.string_id = tl.description_id AND t2.lang_id = c.language_id + ORDER BY t1.translated_string; + +GRANT SELECT ON emp.tech_lines_view TO :dbuser; + + +-- +-- Empire technologies +-- + +CREATE VIEW emp.technologies_view + AS SELECT e.name_id AS empire , tl.name_id AS tech_line , + t1.translated_string AS name , + t2.translated_string AS description , + ( et.level > tlv.level ) AS implemented , + floor( 100 * et.accumulated / tlv.points ) AS progress , + tlv.cost AS cost + FROM emp.empires e + INNER JOIN emp.technologies et ON et.empire_id = e.name_id + INNER JOIN tech.lines tl ON tl.name_id = et.line_id + INNER JOIN tech.levels tlv ON tlv.line_id = tl.name_id AND tlv.level <= et.level + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t1 ON t1.string_id = tlv.name_id AND t1.lang_id = c.language_id + INNER JOIN defs.translations t2 ON t2.string_id = tlv.description_id AND t2.lang_id = c.language_id + ORDER BY tl.name_id , tlv.level; + +GRANT SELECT ON emp.technologies_view TO :dbuser; + + +-- +-- Enemy lists +-- + +CREATE VIEW emp.enemy_lists + AS SELECT x.empire AS empire , x.id AS id , x.name AS name , x.alliance AS alliance + FROM ( + SELECT el.empire_id AS empire , el.enemy_id AS id , n.name AS name , FALSE AS alliance + FROM emp.enemy_empires el + INNER JOIN naming.empire_names n ON n.id = el.enemy_id + UNION SELECT el.empire_id AS empire , el.alliance_id AS id , a.tag AS name , TRUE AS alliance + FROM emp.enemy_alliances el + INNER JOIN emp.alliances a ON a.id = el.alliance_id + ) AS x; + +GRANT SELECT ON emp.enemy_lists TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/050-computation-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/050-computation-functions.sql new file mode 100644 index 0000000..e5304c2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/050-computation-functions.sql @@ -0,0 +1,232 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Various functions for in-game computations +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- sigma( x ) = exp( x ) / ( 1 + exp( x ) ) +-- + +CREATE OR REPLACE FUNCTION verse.sigma( x REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT ( CASE + WHEN $1 < -100 THEN 0 + WHEN $1 > 100 THEN 1 + ELSE ( exp( $1 ) / ( 1 + exp( $1 ) ) )::REAL + END ); +$$ LANGUAGE SQL; + + + +-- +-- poly( x , a , b , c ) = ( a * x + b ) * x + c +-- + +CREATE OR REPLACE FUNCTION verse.poly( x REAL , a REAL , b REAL , c REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT ( $2 * $1 + $3 ) * $1 + $4; +$$ LANGUAGE SQL; + + + +-- +-- Happiness curve, K1 constant +-- + +CREATE OR REPLACE FUNCTION verse.hcc_const_k1( xmax REAL , ymax REAL , xlimit REAL , ylimit REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT ( ( $4 - $2 ) / ( ( $3 - $1 ) ^ 2 ) )::REAL; +$$ LANGUAGE SQL; + + + +-- +-- Happiness curve, K2 constant +-- + +CREATE OR REPLACE FUNCTION verse.hcc_const_k2( ylimit REAL , yasymptote REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT ( 2 * ( $1 - $2 ) )::REAL; +$$ LANGUAGE SQL; + + + +-- +-- Happiness curve, K3 constant +-- + +CREATE OR REPLACE FUNCTION verse.hcc_const_k3( xmax REAL , ymax REAL , xlimit REAL , ylimit REAL , yasymptote REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT ( verse.hcc_const_k1( $1 , $2 , $3 , $4 ) * 4 * ( $3 - $1 ) / ( $5 - $4 ) ) ::REAL; +$$ LANGUAGE SQL; + + + +-- +-- Happiness curve, first part +-- + +CREATE OR REPLACE FUNCTION verse.hcc_part_1( x REAL , ymin REAL , ymax REAL , xmax REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ +DECLARE + v REAL; +BEGIN + v := ( ymin - ymax ) / xmax; + RETURN verse.poly( x , ( v / xmax )::REAL , ( -2 * v )::REAL , ymin ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Happiness curve, second part +-- + +CREATE OR REPLACE FUNCTION verse.hcc_part_2( x REAL , xmax REAL , ymax REAL , xlimit REAL , ylimit REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ +DECLARE + k1 REAL; +BEGIN + k1 := verse.hcc_const_k1( xmax , ymax , xlimit , ylimit ); + RETURN verse.poly( x , k1 , ( -2 * xmax * k1 )::REAL , ( ymax + k1 * xmax * xmax )::REAL ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Happiness curve, third part +-- + +CREATE OR REPLACE FUNCTION verse.hcc_part_3( x REAL , xmax REAL , ymax REAL , xlimit REAL , ylimit REAL , yasymptote REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ +DECLARE + k2 REAL; + k3 REAL; +BEGIN + k2 := verse.hcc_const_k2( ylimit , yasymptote ); + k3 := verse.hcc_const_k3( xmax , ymax , xlimit , ylimit , yasymptote ); + RETURN yasymptote + k2 * ( 1 - verse.sigma( ( k3 * ( x - xlimit ) ) )::REAL ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Happiness curve +-- + +CREATE OR REPLACE FUNCTION verse.happiness_curve( x REAL , ymin REAL , xmax REAL , ymax REAL , xlimit REAL , ylimit REAL , yasymptote REAL ) + RETURNS REAL + STRICT IMMUTABLE SECURITY INVOKER +AS $$ + SELECT (CASE + WHEN $1 < $3 THEN + verse.hcc_part_1( $1 , $2 , $4 , $3 ) + WHEN $1 < $5 THEN + verse.hcc_part_2( $1 , $3 , $4 , $5 , $6 ) + ELSE + verse.hcc_part_3( $1 , $3 , $4 , $5 , $6 , $7 ) + END) +$$ LANGUAGE SQL; + + + +-- +-- Happiness computation +-- + +CREATE OR REPLACE FUNCTION verse.compute_happiness( population REAL , workers REAL , defence REAL , empsize INT ) + RETURNS REAL + STRICT STABLE SECURITY INVOKER + AS $$ +DECLARE + whappiness REAL; + dhappiness REAL; + shappiness REAL; +BEGIN + -- Work-related happiness + whappiness := verse.happiness_curve( + ( workers / population )::REAL , + sys.get_constant( 'game.happiness.noEmployment' ) , 1.0 , 1.0 , + sys.get_constant( 'game.happiness.employmentLimit' ) , 0.5 , 0 + ); + + -- Defence-related happiness + dhappiness := verse.happiness_curve( + ( sys.get_constant( 'game.happiness.popPerDefencePoint' ) * defence / population )::REAL , + sys.get_constant( 'game.happiness.noDefence' ) , 1.0 , 1.0 , + sys.get_constant( 'game.happiness.defenceLimit' ) , 0.5 , 0 + ); + + -- Influence of empire size + shappiness := verse.happiness_curve( + ( empsize::REAL / sys.get_constant( 'game.happiness.idealEmpireSize' ) )::REAL , + sys.get_constant( 'game.happiness.smallEmpire' ) , 1.0 , 1.0 , + sys.get_constant( 'game.happiness.eSizeLimit' ) , 0.5 , 0 + ); + + RETURN ( shappiness * ( whappiness + dhappiness ) / 2.0 )::REAL; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Production adjustment +-- +CREATE OR REPLACE FUNCTION verse.adjust_production( prod REAL , happiness REAL ) + RETURNS REAL + STRICT IMMUTABLE + SECURITY INVOKER +AS $$ + SELECT ( CASE + WHEN $2 < sys.get_constant( 'game.happiness.strike' ) THEN + ( $1 * ( 1 - ( $2 / sys.get_constant( 'game.happiness.strike' ) ) ) )::REAL + ELSE + $1 + END ); +$$ LANGUAGE SQL; + + +-- +-- Income computation +-- + +CREATE OR REPLACE FUNCTION verse.compute_income( population REAL , happiness REAL , cashprod REAL ) + RETURNS REAL + STRICT STABLE + SECURITY INVOKER + AS $$ +DECLARE + base REAL; + badj REAL; + cprod REAL; +BEGIN + badj := ( 1 - verse.adjust_production( 1.0 , happiness ) ) * sys.get_constant( 'game.work.strikeEffect' ); + base := floor( population ) * sys.get_constant( 'game.work.population' ) * ( 1 - badj ); + cprod := verse.adjust_production( cashprod , happiness ) * sys.get_constant( 'game.work.factory' ); + RETURN cprod + base; +END; +$$ LANGUAGE plpgsql; + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/060-universe-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/060-universe-functions.sql new file mode 100644 index 0000000..780986a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/060-universe-functions.sql @@ -0,0 +1,394 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Universe management functions and views +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Obtains a planet's raw production +-- +-- Parameters: +-- pid Planet identifier +-- pt Production type +-- +-- Returns: +-- the planet's raw production of the specified type +-- + +CREATE OR REPLACE FUNCTION verse.get_raw_production( pid INT , pt building_output_type ) + RETURNS REAL + STRICT STABLE + SECURITY DEFINER + AS $$ +DECLARE + rv REAL; +BEGIN + SELECT INTO rv SUM( b.amount * d.output )::REAL + FROM verse.planet_buildings b + INNER JOIN tech.buildings d + ON d.buildable_id = b.building_id AND d.output_type = pt + WHERE b.planet_id = pid; + IF rv IS NULL THEN + rv := 0; + END IF; + RETURN rv; +END; +$$ LANGUAGE plpgsql; + + +-- +-- Map view +-- + +CREATE VIEW verse.map_view + AS SELECT s.x AS x , s.y AS y , p.orbit AS orbit , + n.id AS id , p.picture AS picture , n.name AS name , + ep.empire_id AS owner , + a.id AS alliance_id , a.tag AS tag + FROM verse.planets p + INNER JOIN verse.systems s + ON s.id = p.system_id + INNER JOIN naming.map_names n + ON n.id = p.name_id + LEFT OUTER JOIN emp.planets ep + ON ep.planet_id = p.name_id + LEFT OUTER JOIN emp.alliance_members am + ON ep.empire_id = am.empire_id AND NOT am.is_pending + LEFT OUTER JOIN emp.alliances a + ON a.id = am.alliance_id + ORDER BY s.x , s.y , p.orbit; + + + +-- +-- View of planets that can be assigned to players +-- + +CREATE VIEW verse.available_planets + AS SELECT p.name_id AS name_id + FROM verse.planets p + INNER JOIN verse.planet_happiness ph + ON ph.planet_id = p.name_id + LEFT OUTER JOIN emp.planets ep + ON ep.planet_id = p.name_id + LEFT OUTER JOIN fleets.fleets f + ON f.location_id = p.name_id + WHERE ep.empire_id IS NULL AND ph.target > 0.5 + AND verse.get_raw_production( p.name_id , 'DEF'::building_output_type ) > 0 + AND verse.get_raw_production( p.name_id , 'WORK'::building_output_type ) > 0 + AND ph.current / p.population > sys.get_constant( 'game.happiness.strike' ) + GROUP BY p.name_id HAVING count(f.*) = 0; + + +-- +-- Returns a random free planet, locked for update +-- + +CREATE OR REPLACE FUNCTION verse.get_random_planet( ) + RETURNS INT + STRICT VOLATILE + SECURITY INVOKER +AS $$ + SELECT name_id + FROM verse.planets p + INNER JOIN verse.available_planets + USING ( name_id ) + ORDER BY random() LIMIT 1 + FOR UPDATE OF p; +$$ LANGUAGE SQL; + + + + +-- +-- Obtains a planet's upkeep +-- +-- Parameters: +-- pid Planet identifier +-- +-- Returns: +-- the planet's current upkeep +-- + +CREATE OR REPLACE FUNCTION verse.get_planet_upkeep( pid INT ) + RETURNS REAL + STRICT STABLE + SECURITY INVOKER + AS $$ +DECLARE + rv REAL; +BEGIN + SELECT INTO rv SUM( b.amount * d.upkeep )::REAL + FROM verse.planet_buildings b + INNER JOIN tech.buildables d + ON d.name_id = b.building_id + WHERE b.planet_id = pid; + IF rv IS NULL THEN + rv := 0; + END IF; + RETURN rv; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a planet +-- +-- Parameters: +-- sid Stellar system ID +-- o Orbit number +-- ipop Initial population +-- npics Amount of planet pictures +-- + +CREATE OR REPLACE FUNCTION verse.create_planet( sid INT , o INT , ipop REAL , npics INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + pnid INT; + bworkers INT; + bpp INT; + uid BIGINT; + utp update_type; + happiness REAL; +BEGIN + -- Planet name and planet + pnid := naming.create_map_name( 'P' ); + INSERT INTO verse.planets ( name_id , system_id , orbit , picture , population ) + VALUES ( pnid , sid , o , 1 + floor( random() * npics ) , ipop ); + + -- Create build queues + INSERT INTO verse.bld_queues( planet_id , money , work ) + VALUES ( pnid , 0 , 0 ); + INSERT INTO verse.mil_queues( planet_id , money , work ) + VALUES ( pnid , 0 , 0 ); + + -- Insert initial buildings + SELECT INTO bworkers SUM( d.workers ) FROM tech.buildings_view d + INNER JOIN tech.basic_buildables b USING( name_id ); + bpp := floor( 0.5 * ipop / bworkers ); + INSERT INTO verse.planet_buildings ( planet_id , building_id , amount , damage ) + SELECT pnid , d.name_id , bpp , 0.0 FROM tech.buildings_view d + INNER JOIN tech.basic_buildables b USING( name_id ); + + -- Compute initial happiness + happiness := verse.compute_happiness( + ipop , bpp * bworkers , + verse.get_raw_production( pnid , 'DEF'::building_output_type ) , + 0 + ); + INSERT INTO verse.planet_happiness ( planet_id , current , target ) + VALUES ( pnid , ipop * happiness , happiness ); + + -- Compute initial income and upkeep + INSERT INTO verse.planet_money ( planet_id , income , upkeep ) + VALUES ( pnid , verse.compute_income( + ipop , happiness , + verse.get_raw_production( pnid , 'CASH'::building_output_type ) + ) , verse.get_planet_upkeep( pnid ) ); + + -- Add planet update records + FOR utp IN SELECT x FROM unnest( enum_range( NULL::update_type ) ) AS x + WHERE x::text LIKE 'PLANET_%' + LOOP + INSERT INTO sys.updates( gu_type ) + VALUES ( utp ) + RETURNING id INTO uid; + INSERT INTO verse.updates ( update_id , planet_id ) + VALUES ( uid , pnid ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a stellar system +-- +-- Parameters: +-- sx, sy Coordinates +-- ipop Initial population of planets +-- npics Amount of planet pictures +-- + +CREATE OR REPLACE FUNCTION verse.create_system( sx INT , sy INT , ipop REAL , npics INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + sid INT; + orbit INT; +BEGIN + -- Create system + INSERT INTO verse.systems ( x , y ) + VALUES ( sx , sy ) + RETURNING id INTO sid; + + -- Create planets + FOR orbit IN 1 .. 5 + LOOP + PERFORM verse.create_planet( sid , orbit , ipop , npics ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Generate multiple systems at the specified coordinates +-- +-- Parameters: +-- (x0,y0)-(x1,y1) Area to generate +-- ipop Initial population +-- + +CREATE OR REPLACE FUNCTION verse.create_systems( x0 INT , y0 INT , x1 INT , y1 INT , ipop REAL ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + x INT; + y INT; + npics INT; +BEGIN + npics := floor( sys.get_constant( 'game.universe.pictures' ) ); + FOR x IN x0 .. x1 + LOOP + FOR y IN y0 .. y1 + LOOP + PERFORM verse.create_system( x , y , ipop , npics ); + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Generate the initial universe +-- + +CREATE OR REPLACE FUNCTION verse.generate_initial_universe( ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + sz INT; + pop REAL; + npics INT; +BEGIN + sz := floor( sys.get_constant( 'game.universe.initialSize' ) ); + pop := sys.get_constant( 'game.universe.initialPopulation' ); + PERFORM verse.create_systems( -sz , -sz , sz , sz , pop ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Expand the universe +-- + +CREATE OR REPLACE FUNCTION verse.expand_universe( ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + min_x INT; + max_x INT; + min_y INT; + max_y INT; + x_size INT; + y_size INT; + x_axis BOOLEAN; + posit BOOLEAN; + x0 INT; + y0 INT; + x1 INT; + y1 INT; + pop REAL; +BEGIN + -- Get current bounds + SELECT INTO min_x , max_x , min_y , max_y + MIN(x) , MAX(x) , MIN(y) , MAX(y) + FROM verse.systems; + x_size := 1 + max_x - min_x; + y_size := 1 + max_y - min_y; + + -- Find out which axis/direction to use + x_axis := ( x_size = y_size ); + IF x_axis THEN + posit := ( max_x = -min_x ); + ELSE + posit := ( max_y = -min_y ); + END IF; + + -- Compute area coordinates + IF x_axis THEN + x0 := ( CASE posit WHEN TRUE THEN max_x + 1 ELSE min_x - 1 END ); + x1 := x0; + y0 := min_y; + y1 := max_y; + ELSE + y0 := ( CASE posit WHEN TRUE THEN max_y + 1 ELSE min_y - 1 END ); + y1 := y0; + x0 := min_x; + x1 := max_x; + END IF; + + -- Get average population and generate new systems + SELECT INTO pop AVG( population ) FROM verse.planets; + PERFORM verse.create_systems( x0 , y0 , x1 , y1 , pop ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Universe generator function +-- +-- Called by the game engine; generate the initial universe if it is empty, or expand it +-- if the ratio of available planets is too low. +-- + +CREATE OR REPLACE FUNCTION verse.generate( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + p_count INT; + f_ratio REAL; +BEGIN + -- Get total planet count + SELECT INTO p_count 5 * count(*) + FROM verse.systems; + + -- Empty universe -> initialise + IF p_count = 0 THEN + PERFORM verse.generate_initial_universe( ); + RETURN; + END IF; + + -- Get available planets ratio + SELECT INTO f_ratio count(*)::REAL / p_count::REAL + FROM verse.available_planets; + + -- Expand universe if required + IF f_ratio < sys.get_constant( 'game.universe.minFreeRatio' ) THEN + PERFORM verse.expand_universe( ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.generate() TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/070-users-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/070-users-functions.sql new file mode 100644 index 0000000..46bb65f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/070-users-functions.sql @@ -0,0 +1,1086 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- User management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- E-mail address creation +-- + +CREATE OR REPLACE FUNCTION users.create_address ( addr TEXT ) + RETURNS INT + STRICT VOLATILE SECURITY INVOKER + AS $$ +DECLARE + pk INT; +BEGIN + INSERT INTO users.addresses (address) VALUES (addr) + RETURNING id INTO pk; + RETURN pk; +EXCEPTION WHEN unique_violation THEN + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Generates a random token. +-- +-- Parameters: +-- len Length of the token +-- +-- Returns: +-- the token +-- + +CREATE OR REPLACE FUNCTION users.make_token( len INT ) + RETURNS TEXT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + i INT; + result TEXT; + ok_chars CHAR ARRAY[16] := ARRAY['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; +BEGIN + result := ''; + FOR i IN 1 .. len + LOOP + result := result || ok_chars[ 1 + floor( random() * 36 )::INT ]; + END LOOP; + RETURN result; +END; +$$ LANGUAGE plpgsql; + + + + +-- +-- Credentials creation +-- +-- Parameters: +-- addr mail address +-- lang selected language +-- pmd5 MD5 hash of password +-- psha1 SHA-1 hash of password +-- +-- Returns: +-- err_code error code: +-- 0 on success +-- -1 if the address exists +-- -2 if the language does not exist +-- a_id the account's identifier +-- + +CREATE OR REPLACE FUNCTION users.create_credentials ( addr TEXT , lang TEXT , pmd5 TEXT , psha1 TEXT , + OUT err_code INT , OUT a_id INT) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + vkey TEXT; + l_id INT; +BEGIN + -- Get language + SELECT INTO l_id l.id FROM defs.languages l + CROSS JOIN defs.strings s + LEFT OUTER JOIN defs.translations t + ON t.lang_id = l.id AND t.string_id = s.id + WHERE l.language = lang + GROUP BY l.id + HAVING count( s.* ) = count( t.* ); + IF NOT FOUND THEN + err_code := -2; + a_id := NULL; + RETURN; + END IF; + + -- Create address + a_id := users.create_address( addr ); + IF a_id IS NULL + THEN + err_code := -1; + RETURN; + END IF; + + -- Insert credentials + INSERT INTO users.credentials (address_id, pass_md5, pass_sha1, credits, language_id) + VALUES ( a_id , pmd5 , psha1 , floor( sys.get_constant( 'game.initialCredits' ) ) , l_id ); + vkey := users.make_token(64); + INSERT INTO users.validation_keys (credentials_id, token) + VALUES ( a_id , vkey ); + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Account created; validation key: ' || vkey ); + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.create_credentials(TEXT,TEXT,TEXT,TEXT) TO :dbuser; + + + +-- +-- Attempts to re-activate a disabled account +-- +-- Parameters: +-- addr Account e-mail address +-- +-- Returns: +-- success Whether the operation was successful +-- a_id Account identifier +-- + +CREATE OR REPLACE FUNCTION users.reactivate( IN addr TEXT , OUT success BOOLEAN , OUT a_id INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + vkey TEXT; +BEGIN + SELECT INTO a_id id FROM users.accounts_view + WHERE address = addr AND status = 'DISABLED'; + success := FOUND; + + IF success THEN + vkey := users.make_token( 64 ); + INSERT INTO users.validation_keys (credentials_id, token) + VALUES ( a_id , vkey ); + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Account re-activation requested; validation key: ' || vkey ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.reactivate(TEXT) TO :dbuser; + + + +-- +-- This function is called when an account's validation token cannot be sent. +-- +-- Parameters: +-- a_id Account identifier +-- + +CREATE OR REPLACE FUNCTION users.validation_mail_failure( IN a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + st TEXT; +BEGIN + SELECT INTO st status FROM users.accounts_view WHERE id = a_id; + IF st = 'UNCONFIRMED' THEN + DELETE FROM users.addresses WHERE id = a_id; + ELSEIF st = 'REACTIVATING' THEN + DELETE FROM users.validation_keys WHERE credentials_id = a_id; + ELSE + RAISE EXCEPTION 'Invalid account status % (account #%)' , st , a_id; + END IF; + PERFORM sys.write_log( 'AccountManagement' , 'ERROR'::log_level , 'Account re-activation mail could not be sent for account #' || a_id || ', deleting validation key' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.validation_mail_failure( INT ) TO :dbuser; + + + +-- +-- Request password recovery +-- +-- Parameters: +-- addr account mail address +-- +-- Returns: +-- err_code error code: +-- 0 on success, +-- 1 if there's already a password recovery request for the account +-- 2 if the account doesn't exist. +-- a_id account identifier +-- + +CREATE OR REPLACE FUNCTION users.request_password_recovery( IN addr TEXT , OUT err_code INT , OUT a_id INT) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + vkey TEXT; +BEGIN + SELECT INTO a_id ad.id FROM users.addresses ad + INNER JOIN users.credentials c ON c.address_id = ad.id + INNER JOIN users.accounts_view av ON av.id = ad.id + WHERE ad.address = addr AND av.status IN ( 'ACTIVE' , 'VACATION' , 'START_VACATION' , 'QUITTING' ) + FOR UPDATE OF ad , c; + IF NOT FOUND THEN + err_code := 2; + ELSE + vkey := users.make_token( 64 ); + BEGIN + INSERT INTO users.pwd_recovery_requests (credentials_id , token) + VALUES ( a_id , vkey ); + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Password recovery requested; validation key: ' || vkey ); + err_code := 0; + EXCEPTION + WHEN unique_violation THEN + err_code := 1; + a_id := NULL; + END; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.request_password_recovery( TEXT ) TO :dbuser; + + + +-- +-- Confirm password recovery +-- +-- Parameters: +-- umail account mail address +-- tok recovery token +-- pmd5 new password's MD5 hash +-- psha1 new password's SHA-1 hash +-- +-- Returns: +-- err_code error code: +-- 0 on success +-- 1 if the account doesn't exist, if the token is wrong or if the request is used +-- 2 if the new password is the same as the user's administrative access +-- a_id account identifier +-- + +CREATE OR REPLACE FUNCTION users.confirm_password_recovery( IN umail TEXT, IN tok TEXT, IN pmd5 TEXT, IN psha1 TEXT , + OUT err_code INT , OUT a_id INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + amd5 TEXT; + asha1 TEXT; +BEGIN + SELECT INTO a_id, amd5, asha1 addr.id, admin.pass_md5 , admin.pass_sha1 + FROM users.addresses addr + INNER JOIN users.credentials creds + ON creds.address_id = addr.id + INNER JOIN users.pwd_recovery_requests req + ON req.credentials_id = creds.address_id AND req.token = tok AND NOT req.used + LEFT OUTER JOIN admin.admin_credentials acreds + ON acreds.credentials_id = creds.address_id + LEFT OUTER JOIN admin.administrators admin + ON admin.id = acreds.administrator_id + WHERE addr.address = umail + FOR UPDATE OF creds , addr , req; + + IF NOT FOUND + THEN + err_code := 1; + RETURN; + ELSEIF amd5 IS NOT NULL AND amd5 = pmd5 AND asha1 = psha1 + THEN + err_code := 2; + RETURN; + END IF; + + UPDATE users.pwd_recovery_requests SET used = TRUE WHERE credentials_id = a_id; + UPDATE users.credentials SET pass_md5 = pmd5 , pass_sha1 = psha1 WHERE address_id = a_id; + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Password recovery successful' ); + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.confirm_password_recovery( TEXT , TEXT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Cancel password recovery request after a mail failure +-- +-- Parameters: +-- a_id account identifier +-- + +CREATE OR REPLACE FUNCTION users.cancel_password_recovery( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM users.write_log( a_id , 'ERROR'::log_level , 'Password recovery: could not send e-mail, aborting' ); + DELETE FROM users.pwd_recovery_requests WHERE credentials_id = a_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Request mail address change +-- +-- Parameters: +-- cid account identifier +-- nmail new address +-- +-- Returns: +-- err_code 0 on success +-- -1 if there's already such a request in the DB +-- -2 if the mail address exists +-- + +CREATE OR REPLACE FUNCTION users.request_address_change( cid INT , nmail TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + vkey TEXT; +BEGIN + vkey := users.make_token( 64 ); + INSERT INTO users.address_change_requests( credentials_id , address_id , token ) + VALUES ( cid , users.create_address( nmail ) , vkey ); + err_code := 0; + PERFORM users.write_log( cid , 'INFO'::log_level , 'E-mail address change requested; validation key: ' || vkey ); +EXCEPTION + WHEN unique_violation THEN + err_code := -1; + WHEN not_null_violation THEN + err_code := -2; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.request_address_change( INT , TEXT ) TO :dbuser; + + + +-- +-- Confirm mail address change +-- +-- Parameters: +-- cid account identifier +-- tok validation token +-- +-- Returns: +-- n_id The account's new identifier +-- + +CREATE OR REPLACE FUNCTION users.confirm_address_change( cid INT , tok TEXT , OUT n_id INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + pk INT; + npk INT; + oaddr TEXT; +BEGIN + SELECT INTO pk, npk, oaddr addr.id , acr.address_id , addr.address + FROM users.addresses addr, users.credentials creds, users.address_change_requests acr + WHERE addr.id = cid AND creds.address_id = cid AND acr.credentials_id = cid + AND acr.token = tok + AND NOT acr.used + FOR UPDATE; + + IF FOUND + THEN + UPDATE users.credentials SET address_id = npk WHERE address_id = pk; + UPDATE users.address_change_requests SET used = TRUE WHERE credentials_id = npk; + DELETE FROM users.addresses WHERE id = pk; + n_id := npk; + PERFORM users.write_log( npk , 'INFO'::log_level , 'E-mail address change confirmed (old address: ' + || oaddr || ')' ); + ELSE + n_id := 0; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.confirm_address_change( INT , TEXT ) TO :dbuser; + + + +-- +-- Cancels an address change request +-- +-- Parameters: +-- cid account identifier +-- + +CREATE OR REPLACE FUNCTION users.cancel_address_change( cid INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE users.address_change_requests + SET used = TRUE + WHERE credentials_id = cid; + PERFORM users.write_log( cid , 'INFO'::log_level , 'E-mail address change aborted' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.cancel_address_change( INT ) TO :dbuser; + + + +-- +-- Account validation +-- +-- /!\ Transaction rollback required if there is an error /!\ +-- +-- Parameters: +-- addr Account email address +-- vtoken Validation token +-- empname Empire name +-- plname Initial planet name +-- +-- Returns: +-- account_error 0 on success +-- 1 if the account's status is incorrect +-- 2 if the validation token doesn't match +-- empire_error 0 on success +-- 1 if the name is banned +-- 2 if the empire name is unavailable +-- planet_error 0 on success +-- 1 if the name is banned +-- 2 if the planet name is unavailable +-- + +CREATE OR REPLACE FUNCTION users.validate( addr TEXT , vtoken TEXT , empname TEXT , plname TEXT , + OUT account_error INT , OUT empire_error INT , OUT planet_error INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + accid INT; + astat TEXT; + empid INT; + plid INT; +BEGIN + -- Initialise return values + account_error := 0; + empire_error := 0; + planet_error := 0; + + -- Find account + SELECT INTO accid c.address_id + FROM users.credentials c + INNER JOIN users.addresses a + ON a.id = c.address_id + WHERE a.address = addr + FOR UPDATE; + IF NOT FOUND THEN + PERFORM sys.write_log( 'AccountManagement' , 'WARNING'::log_level , 'account for "' + || addr || '" not found' ); + account_error := 1; + RETURN; + END IF; + + -- Get account status + SELECT INTO astat status FROM users.accounts_view + WHERE id = accid; + IF astat NOT IN ('UNCONFIRMED' , 'REACTIVATING') THEN + PERFORM users.write_log( accid , 'WARNING'::log_level , 'incorrect account status: ' || astat ); + account_error := 1; + ELSE + -- Delete validation key + DELETE FROM users.validation_keys + WHERE credentials_id = accid AND token = vtoken; + IF NOT FOUND THEN + PERFORM users.write_log( accid , 'WARNING'::log_level , 'confirmation code "' + || vtoken || '" not found' ); + account_error := 2; + END IF; + END IF; + + -- Create / get empire + empid := naming.goc_empire_name( accid , empname ); + IF empid < 0 THEN + empire_error := -empid; + END IF; + + -- Get free planet, rename it + plid := verse.get_random_planet( ); + IF plid IS NULL THEN + PERFORM users.write_log( accid , 'WARNING'::log_level , 'no free planets found!' ); + planet_error := 2; + ELSE + planet_error := - naming.change_map_name( plid , accid , plname ); + END IF; + + -- Activate account and create empire + IF planet_error = 0 AND empire_error = 0 AND account_error = 0 THEN + IF astat = 'REACTIVATING' THEN + DELETE FROM users.inactive_accounts + WHERE credentials_id = accid; + END IF; + INSERT INTO users.active_accounts (credentials_id, vacation_credits) + VALUES ( accid , sys.get_constant( 'vacation.initial' ) ); + + PERFORM emp.create_empire( empid , plid , sys.get_constant( 'game.initialCash' ) ); + PERFORM users.write_log( accid , 'INFO'::log_level , 'created empire #' || empid + || ' ("' || empname || '") with initial planet #' || plid || ' ("' || plname || '")' ); + END IF; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an inactive account (used by command line tools) +-- +-- Parameters: +-- addr mail address +-- lang selected language +-- pmd5 MD5 hash of password +-- psha1 SHA-1 hash of password +-- +-- Returns: +-- err_code error code: +-- 0 on success +-- -1 if the address exists +-- -2 if the language does not exist +-- a_id the account's identifier +-- + +CREATE OR REPLACE FUNCTION users.create_inactive_account ( addr TEXT , lang TEXT , pmd5 TEXT , psha1 TEXT , + OUT err_code INT , OUT a_id INT) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + vkey TEXT; + l_id INT; +BEGIN + -- Get language + SELECT INTO l_id l.id FROM defs.languages l + CROSS JOIN defs.strings s + LEFT OUTER JOIN defs.translations t + ON t.lang_id = l.id AND t.string_id = s.id + WHERE l.language = lang + GROUP BY l.id + HAVING count( s.* ) = count( t.* ); + IF NOT FOUND THEN + err_code := -2; + a_id := NULL; + RETURN; + END IF; + + -- Create address + a_id := users.create_address( addr ); + IF a_id IS NULL + THEN + err_code := -1; + RETURN; + END IF; + + -- Insert credentials + INSERT INTO users.credentials (address_id, pass_md5, pass_sha1, credits, language_id) + VALUES ( a_id , pmd5 , psha1 , floor( sys.get_constant( 'game.initialCredits' ) ) , l_id ); + INSERT INTO users.inactive_accounts ( credentials_id , since , status ) + VALUES ( a_id , now() - '1s'::INTERVAL , 'PROCESSED' ); + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.create_inactive_account(TEXT,TEXT,TEXT,TEXT) TO :dbuser; + + +-- +-- Sets an account's language +-- +-- Parameters: +-- u_mail User address +-- l_tid Language identifier +-- + +CREATE OR REPLACE FUNCTION users.set_language( u_mail TEXT , l_tid TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + l_id INT; +BEGIN + SELECT INTO l_id l.id FROM defs.languages l + CROSS JOIN defs.strings s + LEFT OUTER JOIN defs.translations t + ON t.lang_id = l.id AND t.string_id = s.id + WHERE l.language = l_tid + GROUP BY l.id + HAVING count( s.* ) = count( t.* ); + IF NOT FOUND THEN + RETURN; + END IF; + + UPDATE users.credentials c SET language_id = l_id + FROM users.addresses a + WHERE c.address_id = a.id AND a.address = u_mail; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.set_language( TEXT , TEXT ) TO :dbuser; + + + +-- +-- Sets an account's password +-- +-- Parameters: +-- u_id Account identifier +-- p_sha1 SHA1 hash of the new password +-- p_md5 MD-5 hash of the new password +-- +-- Returns: +-- success Whether the operation was successful +-- + +CREATE OR REPLACE FUNCTION users.set_password( u_id INT , p_sha1 TEXT , p_md5 TEXT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + amd5 TEXT; + asha1 TEXT; +BEGIN + SELECT INTO amd5, asha1 admin.pass_md5 , admin.pass_sha1 + FROM users.credentials creds + LEFT OUTER JOIN admin.admin_credentials acreds + ON acreds.credentials_id = creds.address_id + LEFT OUTER JOIN admin.administrators admin + ON admin.id = acreds.administrator_id + WHERE creds.address_id = u_id + FOR UPDATE OF creds; + + IF amd5 IS NOT NULL AND amd5 = p_md5 AND asha1 = p_sha1 + THEN + success := FALSE; + ELSE + UPDATE users.credentials + SET pass_md5 = p_md5 , pass_sha1 = p_sha1 + WHERE address_id = u_id; + PERFORM users.write_log( u_id , 'INFO'::log_level , 'Password changed' ); + success := TRUE; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.set_password( INT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Causes old password recovery requests to expire +-- + +CREATE OR REPLACE FUNCTION users.expire_pwd_recovery_requests() + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER +AS $$ + DELETE FROM users.pwd_recovery_requests + WHERE created <= now() - ( floor( sys.get_constant('accounts.prrDelay') ) || 's' )::INTERVAL; +$$ LANGUAGE SQL; + + + +-- +-- Causes old address change requests to expire +-- + +CREATE OR REPLACE FUNCTION users.expire_addr_change_requests() + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; +BEGIN + FOR rec IN SELECT * FROM users.address_change_requests + WHERE created <= now() - ( floor( sys.get_constant('accounts.acrDelay') ) || 's' )::INTERVAL + FOR UPDATE + LOOP + IF rec.address_id = rec.credentials_id THEN + DELETE FROM users.address_change_requests + WHERE credentials_id = rec.credentials_id; + ELSE + DELETE FROM users.addresses + WHERE id = rec.address_id; + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Causes unconfirmed new accounts to be deleted and unconfirmed reactived accounts to be disabled +-- + +CREATE OR REPLACE FUNCTION users.expire_validation_keys() + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; +BEGIN + FOR rec IN SELECT v.credentials_id AS id , ( ia.credentials_id IS NULL ) AS was_new + FROM users.validation_keys v + INNER JOIN users.credentials c ON c.address_id = v.credentials_id + INNER JOIN users.addresses a ON c.address_id = a.id + LEFT OUTER JOIN users.inactive_accounts ia ON ia.credentials_id = c.address_id + WHERE v.created <= now() - ( floor( sys.get_constant('accounts.cacDelay') ) || 's' )::INTERVAL + FOR UPDATE OF v , c , a + LOOP + IF rec.was_new + THEN + DELETE FROM users.credentials WHERE address_id = rec.id; + DELETE FROM users.addresses WHERE id = rec.id; + ELSE + DELETE FROM users.validation_keys WHERE credentials_id = rec.id; + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Handle account requests expiry +-- + +CREATE OR REPLACE FUNCTION users.expire_requests( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM users.expire_pwd_recovery_requests(); + PERFORM users.expire_addr_change_requests(); + PERFORM users.expire_validation_keys(); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.expire_requests() TO :dbuser; + + + +-- +-- Disable quitting accounts +-- + +CREATE TYPE quitting_account AS ( + id INT , + address TEXT , + language TEXT +); + +CREATE OR REPLACE FUNCTION users.process_quit_requests( ) + RETURNS SETOF quitting_account + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + addr quitting_account; + rec RECORD; +BEGIN + UPDATE users.inactive_accounts + SET status = 'PROCESSING' + WHERE status = 'FUTURE' AND since <= now(); + + FOR rec IN SELECT ia.credentials_id AS account , e.name_id AS empire , + ma.address AS address , l.language AS language + FROM users.inactive_accounts ia + INNER JOIN users.credentials c ON c.address_id = ia.credentials_id + INNER JOIN defs.languages l ON l.id = c.language_id + INNER JOIN users.active_accounts aa ON aa.credentials_id = ia.credentials_id + INNER JOIN users.addresses ma ON ma.id = c.address_id + INNER JOIN naming.empire_names en ON en.owner_id = ia.credentials_id + INNER JOIN emp.empires e ON e.name_id = en.id + WHERE ia.status = 'PROCESSING' + FOR UPDATE OF ia , c , aa , ma , en , e + LOOP + PERFORM emp.delete_empire( rec.empire ); + DELETE FROM users.active_accounts WHERE credentials_id = rec.account; + UPDATE users.inactive_accounts + SET status = 'PROCESSED' + WHERE credentials_id = rec.account; + + addr.id = rec.account; + addr.address = rec.address; + addr.language := rec.language; + RETURN NEXT addr; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.process_quit_requests( ) TO :dbuser; + + + +-- +-- Sets an account in the QUITTING status +-- +-- Parameters: +-- a_id Account identifier +-- r_txt Reason +-- + +CREATE OR REPLACE FUNCTION users.set_account_quit( a_id INT , r_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + -- Verify and lock record + PERFORM aa.credentials_id FROM users.active_accounts aa + INNER JOIN users.credentials c ON aa.credentials_id = c.address_id + LEFT OUTER JOIN users.inactive_accounts ia ON ia.credentials_id = c.address_id + LEFT OUTER JOIN users.vacations v ON v.account_id = aa.credentials_id + WHERE aa.credentials_id = a_id AND ia.credentials_id IS NULL AND v.account_id IS NULL + FOR UPDATE OF aa , c; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Insert de-activation record + INSERT INTO users.inactive_accounts ( credentials_id , status , since ) + VALUES ( a_id , 'FUTURE' , now() + ( floor( sys.get_constant( 'accounts.quitDelay' ) ) || 's' )::INTERVAL ); + IF r_txt <> '' THEN + INSERT INTO users.reasons ( account_id , reason ) + VALUES ( a_id , r_txt ); + END IF; + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Quitting' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.set_account_quit( INT , TEXT ) TO :dbuser; + + + +-- +-- Prevents an account from being disabled +-- +-- Parameters: +-- a_id Account identifier +-- r_txt Reason +-- + +CREATE OR REPLACE FUNCTION users.cancel_account_quit( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + -- Verify and lock record + PERFORM aa.credentials_id FROM users.active_accounts aa + INNER JOIN users.credentials c ON aa.credentials_id = c.address_id + INNER JOIN users.inactive_accounts ia ON ia.credentials_id = c.address_id + LEFT OUTER JOIN users.bans b ON b.account_id = aa.credentials_id + WHERE aa.credentials_id = a_id AND b.account_id IS NULL AND ia.status = 'FUTURE' + FOR UPDATE OF aa , c , ia; + IF NOT FOUND + THEN + RETURN; + END IF; + DELETE FROM users.inactive_accounts WHERE credentials_id = a_id; + PERFORM users.write_log( a_id , 'INFO'::log_level , 'No longer quitting' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.cancel_account_quit( INT ) TO :dbuser; + + + +-- +-- Prepares an account for vacation mode +-- +-- Parameters: +-- a_id Account identifier +-- + +CREATE OR REPLACE FUNCTION users.set_vacation( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM aa.credentials_id FROM users.active_accounts aa + INNER JOIN users.credentials c ON aa.credentials_id = c.address_id + LEFT OUTER JOIN users.vacations v ON v.account_id = aa.credentials_id + LEFT OUTER JOIN users.inactive_accounts ia ON ia.credentials_id = aa.credentials_id + WHERE aa.credentials_id = a_id AND v.account_id IS NULL AND ia.credentials_id IS NULL + AND aa.vacation_credits > 0 + FOR UPDATE OF aa , c; + IF NOT FOUND + THEN + RETURN; + END IF; + + INSERT INTO users.vacations ( account_id , since , status ) + VALUES ( a_id , now() + ( floor( sys.get_constant( 'vacation.delay' ) ) || 's' )::INTERVAL , 'FUTURE' ); + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Preparing to enter vacation mode' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.set_vacation( INT ) TO :dbuser; + + + +-- +-- Causes an account to exit vacation mode, or to avoid entering it +-- +-- Parameters: +-- a_id Account identifier +-- + +CREATE OR REPLACE FUNCTION users.leave_vacation( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + active BOOLEAN; + e_id INT; +BEGIN + SELECT INTO active , e_id ( v.status = 'PROCESSED' ) , e.name_id + FROM users.active_accounts aa + INNER JOIN users.credentials c ON aa.credentials_id = c.address_id + INNER JOIN users.vacations v ON v.account_id = aa.credentials_id + INNER JOIN naming.empire_names en ON en.owner_id = v.account_id + INNER JOIN emp.empires e ON e.name_id = en.id + WHERE aa.credentials_id = a_id + FOR UPDATE OF v , aa , c; + IF NOT FOUND + THEN + RETURN; + END IF; + + IF active + THEN + PERFORM emp.switch_enemies( e_id ); + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Left vacation mode' ); + ELSE + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Cancelled vacation mode' ); + END IF; + + DELETE FROM users.vacations WHERE account_id = a_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.leave_vacation( INT ) TO :dbuser; + + + +-- +-- Manage vacation credits and activate / disable vacation mode +-- + +CREATE OR REPLACE FUNCTION users.process_vacations( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_id INT; + e_id INT; +BEGIN + -- Increase vacation credits for accounts that are not quitting or on/entering vacation + UPDATE users.active_accounts aa + SET vacation_credits = aa.vacation_credits + 1 + FROM users.credentials c + LEFT OUTER JOIN users.vacations v ON v.account_id = c.address_id + LEFT OUTER JOIN users.inactive_accounts ia ON ia.credentials_id = c.address_id + WHERE aa.credentials_id = c.address_id AND v.account_id IS NULL AND ia.credentials_id IS NULL + AND aa.vacation_credits < floor( sys.get_constant( 'vacation.max' ) ); + + -- Process accounts that should enter vacation mode + FOR a_id , e_id IN SELECT v.account_id , e.name_id + FROM users.vacations v + INNER JOIN users.active_accounts aa ON aa.credentials_id = v.account_id + INNER JOIN users.credentials c ON c.address_id = v.account_id + INNER JOIN naming.empire_names n ON n.owner_id = v.account_id + INNER JOIN emp.empires e ON e.name_id = n.id + WHERE v.status = 'FUTURE' AND v.since <= now( ) + FOR UPDATE OF v , aa , c , n , e + LOOP + UPDATE users.vacations SET status = 'PROCESSED' WHERE account_id = a_id; + END LOOP; + + -- Decrease vacation credits + UPDATE users.active_accounts aa + SET vacation_credits = ( CASE + WHEN aa.vacation_credits > floor( sys.get_constant( 'vacation.cost' ) ) THEN + aa.vacation_credits - floor( sys.get_constant( 'vacation.cost' ) ) + ELSE + 0 + END ) + FROM users.vacations v + WHERE aa.credentials_id = v.account_id AND v.status = 'PROCESSED'; + + -- Process accounts that should exit vacation mode + FOR a_id , e_id IN SELECT v.account_id , e.name_id + FROM users.vacations v + INNER JOIN users.active_accounts aa ON aa.credentials_id = v.account_id + INNER JOIN users.credentials c ON c.address_id = v.account_id + INNER JOIN naming.empire_names n ON n.owner_id = v.account_id + INNER JOIN emp.empires e ON e.name_id = n.id + WHERE v.status = 'PROCESSED' AND aa.vacation_credits = 0 + FOR UPDATE OF v , aa , c , n , e + LOOP + PERFORM users.write_log( a_id , 'INFO'::log_level , 'Out of vacation credits - leaving vacation mode' ); + PERFORM users.sessions_terminate( users.sessions_login( a_id , 'N/A' , 'vac_end' , 'N/A' ) , 'MANUAL' ); + DELETE FROM users.vacations WHERE account_id = a_id; + PERFORM emp.switch_enemies( e_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.process_vacations( ) TO :dbuser; + + + +-- +-- Grants credits to an account +-- +-- Parameters: +-- a_id Administrator identifier +-- c_id Account identifier +-- c_inc Credits to grant +-- + +CREATE OR REPLACE FUNCTION admin.grant_user_credits( a_id INT , c_id INT , c_inc INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE users.credentials SET credits = credits + c_inc + WHERE address_id = c_id; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Granted ' || c_inc || ' credit(s) to user #' || c_id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.grant_user_credits( INT , INT , INT ) TO :dbuser; + + + +-- +-- View for mail address change requests +-- + +CREATE VIEW users.mail_change_view + AS SELECT r.credentials_id AS id , r.used , + ( r.created + ( floor( sys.get_constant( 'accounts.acrDelay' ) ) || 's' )::INTERVAL ) AS expires , + ( CASE + WHEN r.used THEN + NULL + ELSE + a.address + END ) AS new_address + FROM users.address_change_requests r + INNER JOIN users.addresses a ON a.id = r.address_id; + +GRANT SELECT ON users.mail_change_view TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/075-session-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/075-session-functions.sql new file mode 100644 index 0000000..ad7785f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/075-session-functions.sql @@ -0,0 +1,313 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- User sessions functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- MAIN SESSION VIEW -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +CREATE VIEW users.sessions + AS SELECT s.* , e.ended , e.end_type , c.name AS client_name , c.exclusive + FROM users.session_starts s + INNER JOIN defs.session_clients c ON c.id = s.client_id + LEFT OUTER JOIN users.session_ends e ON s.id = e.id + ORDER BY e.ended DESC NULLS FIRST , s.started DESC; + +GRANT SELECT ON users.sessions TO :dbuser; + + +CREATE VIEW users.last_session + AS SELECT credentials_id , max( id ) AS session_id + FROM users.session_starts + GROUP BY credentials_id; + + +CREATE VIEW users.last_online + AS SELECT ls.credentials_id , ( CASE WHEN se.id IS NULL THEN now() ELSE se.ended END ) AS t + FROM users.last_session ls + LEFT OUTER JOIN users.session_ends se ON se.id = ls.session_id; + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- SESSION MANAGEMENT FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Marks all active sessions as terminated due to server restart +-- + +CREATE OR REPLACE FUNCTION users.sessions_server_restart( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + INSERT INTO users.session_ends( id , end_type ) + SELECT s.id , 'SERVER'::session_termination_type + FROM users.session_starts s + LEFT OUTER JOIN users.session_ends e USING ( id ) + WHERE e.id IS NULL; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION users.sessions_server_restart( ) TO :dbuser; + + + +-- +-- Registers a session's initialisation +-- +-- Parameters: +-- c_id Credentials identifier +-- s_name Session name +-- c_type Client type name +-- s_addr Session address +-- +-- Returns: +-- s_id Session identifier +-- + +CREATE OR REPLACE FUNCTION users.sessions_login( c_id INT , s_name TEXT , c_type TEXT , s_addr TEXT , OUT s_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + cl_id INT; + excl BOOLEAN; + as_id BIGINT; + as_nm TEXT; +BEGIN + -- Get client type parameters + SELECT INTO cl_id , excl id , exclusive + FROM defs.session_clients + WHERE name = c_type; + IF NOT FOUND + THEN + RAISE EXCEPTION 'Client session type "%" not found' , c_type; + END IF; + + -- Close all active, exclusive sessions from the same user if the new session is exclusive + IF excl + THEN + FOR as_id , as_nm IN SELECT s.id , s.session + FROM users.session_starts s + INNER JOIN defs.session_clients c + ON s.client_id = c.id AND c.exclusive + LEFT OUTER JOIN users.session_ends e ON s.id = e.id + WHERE s.credentials_id = c_id AND e.id IS NULL + FOR UPDATE OF s + LOOP + PERFORM users.write_log( c_id , 'WARNING'::log_level , 'Terminating exclusive session "' || as_nm + || '" due to new exlusive session' ); + INSERT INTO users.session_ends ( id , end_type ) + VALUES ( as_id , 'EXCLUSIVE'::session_termination_type ); + END LOOP; + END IF; + + -- Add new session + INSERT INTO users.session_starts ( credentials_id , client_id , session , from_address ) + VALUES ( c_id , cl_id , s_name , s_addr ) + RETURNING id INTO s_id; + PERFORM users.write_log( c_id , 'DEBUG'::log_level , 'Logged in from ' || s_addr + || ' with client ' || c_type || '; session #' || s_id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.sessions_login( INT , TEXT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Terminates a session +-- +-- Parameters: +-- s_id Session identifier +-- e_type Session end type +-- + +CREATE OR REPLACE FUNCTION users.sessions_terminate( s_id BIGINT , e_type session_termination_type ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + c_id INT; +BEGIN + -- Get user identifier + SELECT INTO c_id s.credentials_id + FROM users.session_starts s + LEFT OUTER JOIN users.session_ends e USING ( id ) + WHERE s.id = s_id AND e.id IS NULL + FOR UPDATE OF s; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Terminate session + INSERT INTO users.session_ends ( id , end_type ) + VALUES ( s_id , e_type ); + PERFORM users.write_log( c_id , 'DEBUG'::log_level , 'Session #' || s_id + || ' ended, termination type: ' || e_type ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.sessions_terminate( BIGINT , session_termination_type ) TO :dbuser; + + + + + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- INACTIVITY CHECKS AND SESSION CLEAN-UP -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +-- +-- User account record, used to send e-mails +-- + +CREATE TYPE inactive_account_record AS ( + id INT , + address TEXT , + language TEXT +); + + + +-- +-- Checks for accounts that should receive an inactivity warning e-mail +-- +-- Returns: +-- A set of user account records +-- + +CREATE OR REPLACE FUNCTION users.check_inactivity_emails() + RETURNS SETOF inactive_account_record + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + in_units BIGINT; + in_mail BIGINT; + in_time INTERVAL; + a_rec inactive_account_record; +BEGIN + in_units := floor( sys.get_constant( 'accounts.inactivity.units' ) ); + in_mail := floor( sys.get_constant( 'accounts.inactivity.warningMail' ) ); + in_time := ( (in_units * in_mail ) || 's' )::INTERVAL; + + FOR a_rec IN SELECT cr.address_id AS id , ad.address , lg.language + FROM users.last_online lo + INNER JOIN users.credentials cr ON lo.credentials_id = cr.address_id + INNER JOIN users.addresses ad ON ad.id = cr.address_id + INNER JOIN defs.languages lg ON lg.id = cr.language_id + INNER JOIN users.active_accounts aa ON aa.credentials_id = lo.credentials_id + LEFT OUTER JOIN users.vacations vac ON vac.account_id = lo.credentials_id + LEFT OUTER JOIN users.inactivity_emails im ON im.account_id = lo.credentials_id + WHERE vac IS NULL AND im IS NULL AND now() - lo.t > in_time + FOR UPDATE OF cr , aa , ad + LOOP + INSERT INTO users.inactivity_emails ( account_id ) VALUES ( a_rec.id ); + PERFORM users.write_log( a_rec.id , 'INFO'::log_level , 'Sending inactivity warning e-mail' ); + RETURN NEXT a_rec; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.check_inactivity_emails() TO :dbuser; + + + +-- +-- Removes inactivity e-mail records when users have logged on *after* the e-mail was sent +-- Disables inactive accounts, and lists them +-- + + +CREATE OR REPLACE FUNCTION users.check_inactivity( ) + RETURNS SETOF inactive_account_record + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + in_units BIGINT; + in_drop BIGINT; + in_time INTERVAL; + a_rec RECORD; + r_rec inactive_account_record; +BEGIN + in_units := floor( sys.get_constant( 'accounts.inactivity.units' ) ); + in_drop := floor( sys.get_constant( 'accounts.inactivity.deletion' ) ); + in_time := ( (in_units * in_drop ) || 's' )::INTERVAL; + + -- Delete inactivity email records for players who've logged in since the mail was sent + DELETE FROM users.inactivity_emails WHERE account_id IN ( + SELECT lo.credentials_id + FROM users.last_online lo + INNER JOIN users.inactivity_emails im + ON im.account_id = lo.credentials_id AND im.mail_sent <= lo.t + ); + + -- Disable inactive user accounts + FOR a_rec IN SELECT cr.address_id AS id , ad.address , lg.language , e.name_id AS e_id + FROM users.inactivity_emails im + INNER JOIN users.credentials cr ON im.account_id = cr.address_id + INNER JOIN users.active_accounts aa ON aa.credentials_id = im.account_id + INNER JOIN users.addresses ad ON ad.id = cr.address_id + INNER JOIN defs.languages lg ON lg.id = cr.language_id + INNER JOIN naming.empire_names en ON en.owner_id = cr.address_id + INNER JOIN emp.empires e ON e.name_id = en.id + WHERE now() - im.mail_sent > in_time + FOR UPDATE OF cr , aa , ad , lg , en , e + LOOP + PERFORM users.write_log( a_rec.id , 'INFO'::log_level , 'Disabling account due to inactivity' ); + PERFORM emp.delete_empire( a_rec.e_id ); + DELETE FROM users.active_accounts WHERE credentials_id = a_rec.id; + INSERT INTO users.inactive_accounts ( credentials_id , since , status ) + VALUES ( a_rec.id , now() - '1s'::INTERVAL , 'PROCESSED' ); + r_rec := ( a_rec.id , a_rec.address, a_rec.language ); + RETURN NEXT r_rec; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.check_inactivity() TO :dbuser; + + + +-- +-- Destroys old, inactive accounts +-- + +CREATE OR REPLACE FUNCTION users.delete_old_accounts( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + DELETE FROM users.addresses WHERE id IN ( + SELECT ia.credentials_id + FROM users.inactive_accounts ia + LEFT OUTER JOIN admin.admin_credentials ac USING ( credentials_id ) + LEFT OUTER JOIN admin.administrators ad ON ad.id = ac.administrator_id + WHERE now() - since >= '6 months'::INTERVAL AND ( ad IS NULL OR ad.privileges = 0 ) + ); +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION users.delete_old_accounts() TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/080-buildings-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/080-buildings-functions.sql new file mode 100644 index 0000000..f463129 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/080-buildings-functions.sql @@ -0,0 +1,84 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Buildings views and management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Construct buildings on a planet +-- +-- Parameters: +-- pid Planet identifier +-- bid Building type +-- bcnt Amount of buildings +-- + +CREATE OR REPLACE FUNCTION verse.do_construct_buildings( pid INT , bid INT , bcnt INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + LOOP + UPDATE verse.planet_buildings + SET amount = amount + bcnt + WHERE planet_id = pid AND building_id = bid; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO verse.planet_buildings( planet_id , building_id , amount , damage ) + VALUES( pid , bid , bcnt , 0 ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing, try updating again. + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Destroy buildings on a planet +-- +-- Parameters: +-- pid Planet identifier +-- bid Building type +-- bcnt Amount of buildings +-- +-- Returns: +-- amount of buildings that were destroyed +-- + +CREATE OR REPLACE FUNCTION verse.do_destroy_buildings( pid INT , bid INT , bcnt INT ) + RETURNS INT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + tmp INT; +BEGIN + UPDATE verse.planet_buildings + SET amount = amount - bcnt + WHERE planet_id = pid AND building_id = bid; + + IF FOUND THEN + RETURN bcnt; + END IF; + + RETURN 0; +EXCEPTION + WHEN check_violation THEN + SELECT INTO tmp amount FROM verse.planet_buildings + WHERE planet_id = pid AND building_id = bid + FOR UPDATE; + UPDATE verse.planet_buildings + SET amount = 0 + WHERE planet_id = pid AND building_id = bid; + RETURN tmp; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/100-status-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/100-status-functions.sql new file mode 100644 index 0000000..77ef113 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/100-status-functions.sql @@ -0,0 +1,107 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- System status functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Enter maintenance mode +-- +-- Parameters: +-- a_id Administrator identifier +-- reason_txt Maintenance reason +-- duration Expected duration (minutes) +-- +-- Returns: +-- success TRUE on success, FALSE if the system was already in maintenance mode +-- + +CREATE OR REPLACE FUNCTION sys.enter_maintenance_mode( IN a_id INT , IN reason_txt TEXT , IN duration INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE sys.status + SET maintenance_start = NOW( ) , + maintenance_end = NOW( ) + ( duration || 'm' )::INTERVAL , + maintenance_text = reason_txt + WHERE maintenance_start IS NULL; + success := FOUND; + IF success + THEN + PERFORM admin.write_log( a_id , 'WARNING'::log_level , 'enabled maintenance mode for ' || + duration || ' minutes; reason: ' || reason_txt ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.enter_maintenance_mode( INT , TEXT , INT ) TO :dbuser; + + + +-- +-- Extend maintenance mode duration +-- +-- Parameters: +-- a_id Administrator identifier +-- ext_duration Expected extended duration (minutes) +-- +-- Returns: +-- success TRUE on success, FALSE if the system was not in maintenance mode +-- + +CREATE OR REPLACE FUNCTION sys.extend_maintenance_mode( IN a_id INT , IN ext_duration INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE sys.status + SET maintenance_end = NOW( ) + ( ext_duration || 'm' )::INTERVAL + WHERE maintenance_start IS NOT NULL; + success := FOUND; + IF success + THEN + PERFORM admin.write_log( a_id , 'WARNING'::log_level , 'extended maintenance mode duration by ' || + ext_duration || ' minutes' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.extend_maintenance_mode( INT , INT ) TO :dbuser; + + + + +-- +-- Exit maintenance mode +-- +-- Parameters: +-- a_id Administrator identifier +-- +-- Returns: +-- success TRUE on success, FALSE if the system was not in maintenance mode +-- + +CREATE OR REPLACE FUNCTION sys.exit_maintenance_mode( IN a_id INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE sys.status + SET maintenance_start = NULL , + maintenance_end = NULL , + maintenance_text = NULL + WHERE maintenance_start IS NOT NULL; + success := FOUND; + IF success + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'terminated maintenance mode' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.exit_maintenance_mode( INT ) TO :dbuser; + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/110-prefs-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/110-prefs-functions.sql new file mode 100644 index 0000000..e294da9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/110-prefs-functions.sql @@ -0,0 +1,283 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Preference definitions and values functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Preferences view +-- + +CREATE VIEW users.preferences_view + AS SELECT acc.credentials_id AS account_id , + grp.name AS group_name , + grpn.translated_string AS group_i18n_name , + pref.name AS pref_name , + prefn.translated_string AS pref_i18n_name , + prefd.translated_string AS pref_i18n_description , + pref.java_type AS pref_type , + ( CASE ( upr.pref_value IS NULL ) + WHEN TRUE THEN pref.default_value + ELSE upr.pref_value + END ) AS value + FROM users.active_accounts acc + INNER JOIN users.credentials cred + ON cred.address_id = acc.credentials_id + CROSS JOIN defs.preference_definitions pref + INNER JOIN defs.preference_groups grp + ON grp.id = pref.group_id + INNER JOIN defs.translations grpn + ON grpn.lang_id = cred.language_id AND grpn.string_id = grp.display_id + INNER JOIN defs.translations prefn + ON prefn.lang_id = cred.language_id AND prefn.string_id = pref.disp_name_id + INNER JOIN defs.translations prefd + ON prefd.lang_id = cred.language_id AND prefd.string_id = pref.disp_desc_id + LEFT OUTER JOIN users.preferences upr + ON upr.definition_id = pref.id AND upr.account_id = acc.credentials_id + ORDER BY acc.credentials_id , grp.name , pref.name; + +GRANT SELECT ON users.preferences_view TO :dbuser; + + +-- +-- Definitions view +-- + +CREATE VIEW defs.preferences_view + AS SELECT grp.name AS group_name , gds.name AS group_display , pref.name AS name , + pns.name AS d_name , pds.name AS d_desc , + pref.java_type AS java_type , pref.default_value AS default_value + FROM defs.preference_definitions pref + INNER JOIN defs.preference_groups grp ON grp.id = pref.group_id + INNER JOIN defs.strings gds ON gds.id = grp.display_id + INNER JOIN defs.strings pns ON pns.id = pref.disp_name_id + INNER JOIN defs.strings pds ON pds.id = pref.disp_desc_id + ORDER BY grp.name , pref.name; + +GRANT SELECT ON defs.preferences_view TO :dbuser; + + +-- +-- Group registration +-- +-- Parameters: +-- g_name Group name +-- g_display Display name identifier +-- +-- Returns: +-- success Whether the operation was successful or not +-- + +CREATE OR REPLACE FUNCTION defs.uoc_preference_group( g_name TEXT , g_display TEXT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + did INT; +BEGIN + SELECT INTO did id FROM defs.strings WHERE name = g_display; + success := FOUND; + IF NOT success THEN + RETURN; + END IF; + + LOOP + UPDATE defs.preference_groups SET display_id = did + WHERE name = g_name; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO defs.preference_groups (name , display_id) + VALUES (g_name , did); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing. + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_preference_group( TEXT , TEXT ) TO :dbuser; + + +-- +-- Preference definition registration +-- +-- Parameters: +-- g_name Group name +-- p_name Preference name +-- d_name Display name identifier +-- d_desc Display description identifier +-- j_type Java type name +-- d_val Serialised default value +-- +-- Returns: +-- err_code Error code +-- 0 on success +-- 1 if the group is missing +-- 2 if one of the strings is missing +-- 3 if the definition exists but has a different type +-- + +CREATE OR REPLACE FUNCTION defs.uoc_preference( g_name TEXT , p_name TEXT , d_name TEXT , d_desc TEXT , j_type TEXT , d_val TEXT, + OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + g_id INT; + n_id INT; + d_id INT; + p_id INT; + o_type TEXT; +BEGIN + -- Get group identifier + SELECT INTO g_id id FROM defs.preference_groups WHERE name = g_name; + IF NOT FOUND THEN + err_code := 1; + RETURN; + END IF; + + -- Get strings + SELECT INTO n_id id FROM defs.strings WHERE name = d_name; + SELECT INTO d_id id FROM defs.strings WHERE name = d_desc; + IF n_id IS NULL OR d_id IS NULL THEN + err_code := 2; + RETURN; + END IF; + + LOOP + -- Try updating + SELECT INTO p_id , o_type id , java_type + FROM defs.preference_definitions + WHERE name = p_name + FOR UPDATE; + IF FOUND THEN + -- Make sure the type didn't change + IF o_type <> j_type THEN + err_code := 3; + ELSE + err_code := 0; + UPDATE defs.preference_definitions + SET disp_name_id = n_id , disp_desc_id = d_id , group_id = g_id + WHERE id = p_id; + END IF; + EXIT; + END IF; + + -- Try inserting + BEGIN + INSERT INTO defs.preference_definitions (group_id , name , disp_name_id , disp_desc_id , java_type , default_value ) + VALUES ( g_id , p_name , n_id , d_id , j_type , d_val ); + err_code := 0; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.uoc_preference( TEXT , TEXT , TEXT , TEXT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Set a preference's default value +-- +-- Parameters: +-- a_id Administrator identifier +-- p_name Preference name +-- p_val Preference default value +-- + +CREATE OR REPLACE FUNCTION defs.set_preference_default( a_id INT , p_name TEXT , p_val TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE defs.preference_definitions SET default_value = p_val WHERE name = p_name; + IF FOUND + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Changed default value of preference "' || p_name + || '" to "' || p_val || '"' ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION defs.set_preference_default( INT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Resets an account's preferences +-- +-- Parameters: +-- a_id Account identifier +-- + +CREATE OR REPLACE FUNCTION users.reset_preferences( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + DELETE FROM users.preferences WHERE account_id = a_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.reset_preferences( INT ) TO :dbuser; + + + +-- +-- Sets a preference +-- +-- Parameters: +-- a_id Account identifier +-- p_name Preference name +-- p_val New value +-- + +CREATE OR REPLACE FUNCTION users.set_preference( a_id INT , p_name TEXT , p_val TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + p_id INT; +BEGIN + -- Get preference identifier + SELECT INTO p_id id FROM defs.preference_definitions + WHERE name = p_name; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Update or add preference + LOOP + UPDATE users.preferences SET pref_value = p_val + WHERE account_id = a_id AND definition_id = p_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO users.preferences( account_id , definition_id , pref_value ) + VALUES( a_id , p_id , p_val ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION users.set_preference( INT , TEXT , TEXT ) TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/120-map-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/120-map-functions.sql new file mode 100644 index 0000000..ed0fcbd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/120-map-functions.sql @@ -0,0 +1,58 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Map display functions and related types +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- Map entry +CREATE TYPE map_entry_type AS ( + x INT , + y INT , + orbit INT , + id INT , + picture INT , + name TEXT , + tag TEXT , + display empire_relation_type +); + + +-- +-- Generates the map from an empire's point of view +-- +-- Parameters: +-- e_id the empire viewing the map +-- min_x minimal X coordinate +-- min_y minimal Y coordinate +-- max_x maximal X coordinate +-- max_y maximal Y coordinate +-- +-- Returns: +-- a set of map entries +-- + +CREATE OR REPLACE FUNCTION verse.get_map( e_id INT , min_x INT , min_y INT , max_x INT , max_y INT ) + RETURNS SETOF map_entry_type + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT mv.x AS x , mv.y AS y , mv.orbit AS orbit , mv.id AS id , mv.picture AS picture , + mv.name AS name , mv.tag AS tag , + (CASE + WHEN mv.owner = $1 THEN 'OWN' + WHEN mv.alliance_id IS NOT NULL AND mv.alliance_id = ea.alliance_id THEN 'ALLIED' + WHEN en.alliance_id IS NOT NULL THEN 'ENEMY' + ELSE NULL + END )::empire_relation_type AS display + FROM verse.map_view mv + LEFT OUTER JOIN emp.alliance_members ea + ON ea.empire_id = $1 AND NOT is_pending + LEFT OUTER JOIN emp.enemy_alliances en + ON en.empire_id = $1 AND en.alliance_id = mv.alliance_id + WHERE x BETWEEN $2 AND $4 AND y BETWEEN $3 AND $5; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_map( INT , INT , INT , INT , INT ) TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/140-planets-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/140-planets-functions.sql new file mode 100644 index 0000000..06247c1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/140-planets-functions.sql @@ -0,0 +1,1102 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Planet views and management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- Planet access +CREATE TYPE planet_access_type + AS ENUM( 'BASIC' , 'PRESENT' , 'OWNER' ); + + +-- Basic planet view +CREATE TYPE planet_basic_data AS ( + access planet_access_type , + x INT , + y INT , + orbit INT , + picture INT , + name TEXT , + tag TEXT +); + + +-- Planet orbital view +CREATE TYPE planet_orbital_data AS ( + population BIGINT , + defence BIGINT , + own_power BIGINT , + friendly_power BIGINT , + hostile_power BIGINT , + battle_id BIGINT +); + + +-- Planet owner view +CREATE TYPE planet_owner_data AS ( + happiness INT , + h_change INT , + income BIGINT , + upkeep BIGINT , + can_rename BOOLEAN , + can_abandon BOOLEAN , + abandon_time INT +); + + +-- Buildings view +CREATE TYPE planet_building_data AS ( + id INT , + name TEXT , + description TEXT , + amount INT , + jobs INT , + upkeep BIGINT , + p_type building_output_type , + p_value BIGINT +); + + +-- Build queue items +CREATE TYPE queue_item_data AS ( + name TEXT , + description TEXT , + amount INT , + destroy BOOLEAN , + investment BIGINT , + time_left BIGINT +); + + +-- Type for buildings available on a planet +CREATE TYPE buildable_building_data AS ( + id INT , + name TEXT , + description TEXT , + cost INT , + time_to_build BIGINT , + upkeep INT , + workers INT , + p_type building_output_type , + p_value INT +); + + +-- Type for ships available on a planet +CREATE TYPE buildable_ship_data AS ( + id INT , + name TEXT , + description TEXT , + cost INT , + time_to_build BIGINT , + upkeep INT , + flight_time INT , + power INT +); + + + +-- +-- Determines an empire's access on a planet +-- +-- Parameters: +-- e_id Empire identifier +-- p_id Planet identifier +-- +-- Returns: +-- a basic planet view entry +-- + +CREATE OR REPLACE FUNCTION verse.get_planet_basics( e_id INT , p_id INT ) + RETURNS planet_basic_data + STRICT STABLE + SECURITY DEFINER + AS $$ +DECLARE + o_id INT; + n_flt BIGINT; + rv planet_basic_data; +BEGIN + PERFORM name_id FROM verse.planets WHERE name_id = p_id; + IF NOT FOUND THEN + RETURN NULL; + END IF; + + SELECT INTO o_id ep.empire_id + FROM emp.planets ep + WHERE ep.planet_id = p_id; + + SELECT INTO n_flt count( f.* ) + FROM fleets.fleets f + LEFT OUTER JOIN fleets.movements fm + ON fm.fleet_id = f.id + WHERE f.location_id = p_id AND f.owner_id = e_id AND fm.fleet_id IS NULL; + + IF NOT FOUND THEN + RETURN NULL; + ELSEIF o_id = e_id THEN + rv.access := 'OWNER'; + ELSEIF n_flt > 0 THEN + rv.access := 'PRESENT'; + ELSE + rv.access := 'BASIC'; + END IF; + + SELECT INTO rv.x , rv.y , rv.orbit , rv.name , rv.tag , rv.picture + x , y , orbit , name , tag , picture + FROM verse.map_view + WHERE id = p_id; + RETURN rv; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.get_planet_basics( INT , INT ) TO :dbuser; + + + +-- +-- Gets a planet's orbital view from an empire's point of view +-- +-- Parameters: +-- e_id Empire identifier +-- p_id Planet identifier +-- +-- Returns: +-- an orbital planet view entry +-- + +CREATE OR REPLACE FUNCTION verse.get_orbital_view( e_id INT , p_id INT ) + RETURNS planet_orbital_data + STRICT STABLE + SECURITY DEFINER + AS $$ +DECLARE + rv planet_orbital_data; + happ REAL; + e_att BOOLEAN; + rec RECORD; +BEGIN + -- Get the planet's population and defence + SELECT INTO rv.population , happ + floor( p.population )::BIGINT , ( ph.current / p.population )::REAL + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + WHERE p.name_id = p_id; + rv.defence := round( verse.adjust_production( verse.get_raw_production( p_id , 'DEF' ) , happ ) ); + + -- Get the empire's fleet mode + SELECT INTO e_att f.attacking + FROM fleets.fleets f + LEFT OUTER JOIN fleets.movements fm + ON fm.fleet_id = f.id + WHERE fm.fleet_id IS NULL AND f.owner_id = p_id AND f.location_id = p_id + LIMIT 1; + IF NOT FOUND THEN + e_att := FALSE; + END IF; + + -- Get fleet powers + FOR rec IN SELECT (CASE + WHEN f.owner_id = e_id THEN 'O' + WHEN f.attacking = e_att THEN 'F' + ELSE 'H' + END) AS f_type , sum( fs.amount * fsd.power ) AS power + FROM fleets.fleets f + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + INNER JOIN fleets.ships fs ON fs.fleet_id = f.id + INNER JOIN tech.ships fsd ON fsd.buildable_id = fs.ship_id + WHERE f.location_id = p_id AND m.fleet_id IS NULL + GROUP BY f.attacking , ( f.owner_id = e_id ) + LOOP + IF rec.f_type = 'O' THEN + rv.own_power = rec.power; + ELSEIF rec.f_type = 'F' THEN + rv.friendly_power = rec.power; + ELSE + rv.hostile_power = rec.power; + END IF; + END LOOP; + + -- Battle ID + SELECT INTO rv.battle_id id FROM battles.battles + WHERE location_id = p_id AND last_tick IS NULL; + + RETURN rv; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.get_orbital_view( INT , INT ) TO :dbuser; + + + +-- +-- Gets a planet's view from its owner's point of view +-- +-- Parameters: +-- e_id Empire identifier +-- p_id Planet identifier +-- +-- Returns: +-- an owner planet view entry +-- + +CREATE OR REPLACE FUNCTION verse.get_owner_view( e_id INT , p_id INT ) + RETURNS planet_owner_data + STRICT STABLE + SECURITY DEFINER + AS $$ +DECLARE + rv planet_owner_data; + t_happ INT; + h_chg INT; + mdelay BIGINT; + r_time INTERVAL; +BEGIN + -- Get income, upkeep, current and target happiness + SELECT INTO rv.income , rv.upkeep , rv.happiness , t_happ + floor( pm.income )::INT , floor( pm.upkeep )::INT , + floor( 100 * ph.current / p.population )::INT , + floor( 100 * ph.target )::INT + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.planet_money pm ON pm.planet_id = p.name_id + WHERE p.name_id = p_id; + + -- Compute happiness change indicator + h_chg := t_happ - rv.happiness; + IF h_chg = 0 THEN + rv.h_change := 0; + ELSE + rv.h_change := ( CASE WHEN abs( h_chg ) > 10 THEN 2 ELSE 1 END ); + IF h_chg < 0 THEN + rv.h_change := -rv.h_change; + END IF; + END IF; + + -- Check whether the planet can be renamed + mdelay := floor( sys.get_constant( 'map.names.minDelay' ) * sys.get_constant( 'map.names.minDelay.units' ) )::BIGINT; + r_time := ( mdelay::BIGINT || 's' )::INTERVAL; + SELECT INTO rv.can_rename + ( cmn.name_id IS NULL ) + FROM naming.map_names n + LEFT OUTER JOIN naming.changed_map_names cmn + ON cmn.name_id = n.id AND cmn.named_at > now() - r_time + WHERE n.id = p_id; + + -- Get abandon time + SELECT INTO rv.abandon_time time_left + FROM emp.abandon + WHERE planet_id = p_id; + IF FOUND THEN + rv.can_abandon := FALSE; + ELSE + -- Check whether the planet can be abandoned + SELECT INTO rv.can_abandon + ( COUNT(ep.*) > 1 ) + FROM emp.planets ep + LEFT OUTER JOIN emp.abandon a + ON a.planet_id = ep.planet_id + WHERE ep.empire_id = e_id AND a.planet_id IS NULL; + END IF; + + RETURN rv; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.get_owner_view( INT , INT ) TO :dbuser; + + + +-- +-- Get a planet's buildings list using an empire's language settings +-- +-- Parameters: +-- e_id Empire identifier +-- p_id Planet identifier +-- +-- Returns: +-- a set of buildings data entries +-- + +CREATE OR REPLACE FUNCTION verse.get_buildings_view( e_id INT , p_id INT ) + RETURNS SETOF planet_building_data + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT b.building_id AS id , + t1.translated_string AS name , t2.translated_string AS description , + b.amount AS amount , + ( bd.workers * b.amount )::INT AS jobs , + ( bd.upkeep * b.amount )::BIGINT AS upkeep , + bd.output_type AS p_type , + floor( verse.adjust_production( ( bd.output * b.amount )::REAL , + ( ph.current / p.population )::REAL ) + )::BIGINT AS p_value + FROM verse.planet_buildings b + INNER JOIN verse.planets p ON p.name_id = b.planet_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = b.planet_id + INNER JOIN tech.buildings_view bd ON bd.name_id = b.building_id + INNER JOIN naming.empire_names en ON en.id = $1 + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t1 ON t1.string_id = bd.name_id AND t1.lang_id = c.language_id + INNER JOIN defs.translations t2 ON t2.string_id = bd.description_id AND t2.lang_id = c.language_id + WHERE b.planet_id = $2 AND b.amount > 0 + ORDER BY t1.translated_string; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_buildings_view( INT , INT ) TO :dbuser; + + + +-- +-- Get a planet's construction queue +-- +-- Parameters: +-- p_id Planet identifier +-- +-- Returns: +-- the queue's items +-- + +CREATE OR REPLACE FUNCTION verse.get_build_queue( p_id INT ) + RETURNS SETOF queue_item_data + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT t1.translated_string AS name , t2.translated_string AS description , + qi.amount AS amount , qi.destroy AS destroy , + ( CASE + WHEN qi.destroy THEN 0 + ELSE floor( qi.amount * bd.cost - ( CASE WHEN qi.queue_order = 0 THEN q.money ELSE 0 END ) ) + END )::BIGINT AS investment , + ( CASE + WHEN ceil( verse.adjust_production( ( p.population * sys.get_constant( 'game.work.wuPerPopUnit' ) )::REAL , ( ph.current / p.population )::REAL ) ) = 0 THEN NULL + ELSE ceil( ( qi.amount * bd.work * ( CASE WHEN qi.destroy THEN sys.get_constant( 'game.work.destructionWork' ) ELSE 1 END ) - ( CASE WHEN qi.queue_order = 0 THEN q.work ELSE 0 END ) ) + / verse.adjust_production( ( p.population * sys.get_constant( 'game.work.wuPerPopUnit' ) )::REAL , ( ph.current / p.population )::REAL ) ) + END )::BIGINT AS time_left + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.bld_queues q ON q.planet_id = p.name_id + INNER JOIN verse.bld_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables bd ON bd.name_id = qi.building_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t1 ON t1.string_id = bd.name_id AND t1.lang_id = c.language_id + INNER JOIN defs.translations t2 ON t2.string_id = bd.description_id AND t2.lang_id = c.language_id + WHERE p.name_id = $1 + ORDER BY qi.queue_order; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_build_queue( INT ) TO :dbuser; + + + +-- +-- Get a planet's military queue +-- +-- Parameters: +-- p_id Planet identifier +-- +-- Returns: +-- the queue's items +-- + +CREATE OR REPLACE FUNCTION verse.get_military_queue( p_id INT ) + RETURNS SETOF queue_item_data + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT t1.translated_string AS name , t2.translated_string AS description , + qi.amount AS amount , FALSE AS destroy , + floor( qi.amount * bd.cost - ( CASE WHEN qi.queue_order = 0 THEN q.money ELSE 0 END ) )::BIGINT AS investment , + ( CASE + WHEN ceil( verse.adjust_production( verse.get_raw_production( $1 , 'WORK' ) , ( ph.current / p.population )::REAL ) ) = 0 THEN NULL + ELSE ceil( ( qi.amount * bd.work - ( CASE WHEN qi.queue_order = 0 THEN q.work ELSE 0 END ) ) + / verse.adjust_production( verse.get_raw_production( $1 , 'WORK' ) , ( ph.current / p.population )::REAL ) ) + END )::BIGINT AS time_left + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.mil_queues q ON q.planet_id = p.name_id + INNER JOIN verse.mil_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables bd ON bd.name_id = qi.ship_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t1 ON t1.string_id = bd.name_id AND t1.lang_id = c.language_id + INNER JOIN defs.translations t2 ON t2.string_id = bd.description_id AND t2.lang_id = c.language_id + WHERE p.name_id = $1 + ORDER BY qi.queue_order; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_military_queue( INT ) TO :dbuser; + + + +-- +-- Get the list of which buildings an empire can build on a planet +-- +-- Parameters: +-- p_id Planet identifier +-- +-- Returns: +-- the list of buildings +-- + +CREATE OR REPLACE FUNCTION verse.get_available_buildings( p_id INT ) + RETURNS SETOF buildable_building_data + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT bv.name_id AS id , t1.translated_string AS name , t2.translated_string AS description , + bv.cost AS cost , + ( CASE + WHEN ceil( pdat.p_work ) = 0 THEN NULL + ELSE ceil( bv.work / pdat.p_work ) + END )::BIGINT AS time_to_build , + bv.upkeep AS upkeep , bv.workers AS workers , bv.output_type AS p_type , bv.output AS p_value + FROM ( + SELECT bv.* + FROM tech.buildings_view bv + INNER JOIN tech.basic_buildables bb USING( name_id ) + UNION SELECT bv.* + FROM tech.buildings_view bv + INNER JOIN tech.buildable_requirements r ON r.buildable_id = bv.name_id + INNER JOIN tech.levels l ON l.id = r.level_id + INNER JOIN emp.planets ep ON ep.planet_id = $1 + INNER JOIN emp.technologies t + ON t.empire_id = ep.empire_id AND t.line_id = l.line_id AND t.level > l.level + ) AS bv , ( + SELECT verse.adjust_production( ( p.population * sys.get_constant( 'game.work.wuPerPopUnit' ) )::REAL , ( ph.current / p.population )::REAL ) AS p_work , + c.language_id AS language + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + WHERE p.name_id = $1 + ) AS pdat , + defs.translations t1 , defs.translations t2 + WHERE t1.lang_id = pdat.language AND t1.string_id = bv.name_id AND t2.lang_id = pdat.language AND t2.string_id = bv.description_id + ORDER BY t1.translated_string; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_available_buildings( INT ) TO :dbuser; + + + +-- +-- Get the list of which ships an empire can build on a planet +-- +-- Parameters: +-- p_id Planet identifier +-- +-- Returns: +-- the list of ships +-- + +CREATE OR REPLACE FUNCTION verse.get_available_ships( p_id INT ) + RETURNS SETOF buildable_ship_data + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT bv.name_id AS id , t1.translated_string AS name , t2.translated_string AS description , + bv.cost AS cost , + ( CASE + WHEN ceil( pdat.p_work ) = 0 THEN NULL + ELSE ceil( bv.work / pdat.p_work ) + END )::BIGINT AS time_to_build , + bv.upkeep AS upkeep , bv.flight_time * 2 AS flight_time , bv.power AS power + FROM ( + SELECT bv.* + FROM tech.ships_view bv + INNER JOIN tech.basic_buildables bb USING( name_id ) + UNION SELECT bv.* + FROM tech.ships_view bv + INNER JOIN tech.buildable_requirements r ON r.buildable_id = bv.name_id + INNER JOIN tech.levels l ON l.id = r.level_id + INNER JOIN emp.planets ep ON ep.planet_id = $1 + INNER JOIN emp.technologies t + ON t.empire_id = ep.empire_id AND t.line_id = l.line_id AND t.level > l.level + ) AS bv , ( + SELECT verse.adjust_production( verse.get_raw_production( $1 , 'WORK' ) , ( ph.current / p.population )::REAL ) AS p_work , + c.language_id AS language + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + WHERE p.name_id = $1 + ) AS pdat , + defs.translations t1 , defs.translations t2 + WHERE t1.lang_id = pdat.language AND t1.string_id = bv.name_id AND t2.lang_id = pdat.language AND t2.string_id = bv.description_id + ORDER BY t1.translated_string; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.get_available_ships( INT ) TO :dbuser; + + + +-- +-- Rename a planet +-- +-- Parameters: +-- p_id Planet identifier +-- nnm New name +-- +-- Returns: +-- err_code Error code: +-- 0 Success +-- 1 Banned name +-- 2 Unavailable name +-- 3 Too early +-- + +CREATE OR REPLACE FUNCTION verse.rename_planet( p_id INT , nnm TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + c_id INT; + mdelay BIGINT; +BEGIN + SELECT INTO c_id n.owner_id + FROM emp.planets ep + INNER JOIN naming.empire_names n ON n.id = ep.empire_id + WHERE ep.planet_id = p_id; + mdelay := floor( sys.get_constant( 'map.names.minDelay' ) * sys.get_constant( 'map.names.minDelay.units' ) )::BIGINT; + err_code := naming.change_map_name( p_id , c_id , nnm , ( mdelay || 's' )::INTERVAL ); + + IF err_code = 0 THEN + PERFORM battles.rename_planet( p_id , nnm ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.rename_planet( INT , TEXT ) TO :dbuser; + + + +-- +-- Flush a planet's civilian construction queue +-- +-- Parameters: +-- p_id Planet identifier +-- + +CREATE OR REPLACE FUNCTION verse.flush_build_queue( p_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + q_cash REAL; +BEGIN + SELECT INTO e_id , q_cash e.name_id , q.money + FROM verse.planets p + INNER JOIN verse.bld_queues q ON q.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + WHERE p.name_id = p_id + FOR UPDATE; + IF NOT FOUND THEN + RETURN; + END IF; + + DELETE FROM verse.bld_items WHERE queue_id = p_id; + UPDATE verse.bld_queues SET money = 0 , work = 0 WHERE planet_id = p_id; + UPDATE emp.empires + SET cash = cash + q_cash * sys.get_constant('game.work.cancelRecovery') + WHERE name_id = e_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.flush_build_queue( INT ) TO :dbuser; + + + +-- +-- Flush a planet's military construction queue +-- +-- Parameters: +-- p_id Planet identifier +-- + +CREATE OR REPLACE FUNCTION verse.flush_military_queue( p_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + q_cash REAL; +BEGIN + SELECT INTO e_id , q_cash e.name_id , q.money + FROM verse.planets p + INNER JOIN verse.mil_queues q ON q.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + WHERE p.name_id = p_id + FOR UPDATE; + IF NOT FOUND THEN + RETURN; + END IF; + + DELETE FROM verse.mil_items WHERE queue_id = p_id; + UPDATE verse.mil_queues SET money = 0 , work = 0 WHERE planet_id = p_id; + UPDATE emp.empires + SET cash = cash + q_cash * sys.get_constant('game.work.cancelRecovery') + WHERE name_id = e_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.flush_military_queue( INT ) TO :dbuser; + + + +-- +-- Adds an item to a planet's military queue +-- +-- Parameters: +-- p_id Planet identifier +-- s_id Ship type identifier +-- s_cnt Amount of ships to build +-- + +CREATE OR REPLACE FUNCTION verse.add_military_item( p_id INT , s_id INT , s_cnt INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + qlen INT; + dep_level INT; + has_level INT; +BEGIN + IF s_cnt < 1 THEN + RETURN; + END IF; + + -- Lock empire and planet + SELECT INTO e_id e.name_id + FROM verse.planets p + INNER JOIN verse.mil_queues q ON q.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + WHERE p.name_id = p_id + FOR UPDATE OF p , q , ep , e; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Check technologies + SELECT INTO dep_level , has_level l.level , t.level + FROM tech.ships s + LEFT OUTER JOIN tech.buildable_requirements r + ON r.buildable_id = s.buildable_id + LEFT OUTER JOIN tech.levels l + ON l.id = r.level_id + LEFT OUTER JOIN emp.technologies t + ON t.empire_id = e_id AND t.line_id = l.line_id AND t.level > l.level + WHERE s.buildable_id = s_id; + IF NOT FOUND OR ( has_level IS NULL AND dep_level IS NOT NULL ) THEN + RETURN; + END IF; + + -- Check queue length + SELECT INTO qlen count( * ) FROM verse.mil_items WHERE queue_id = p_id; + IF qlen >= 5 THEN + RETURN; + END IF; + + -- Insert queue item + INSERT INTO verse.mil_items ( queue_id , queue_order , ship_id , amount ) + VALUES ( p_id , qlen , s_id , s_cnt ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.add_military_item( INT , INT , INT ) TO :dbuser; + + + +-- +-- Adds building constructions to a planet's civilian queue +-- +-- Parameters: +-- p_id Planet identifier +-- b_id Building type identifier +-- b_cnt Amount of ships to build +-- + +CREATE OR REPLACE FUNCTION verse.construct_buildings( p_id INT , b_id INT , b_cnt INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + qlen INT; + dep_level INT; + has_level INT; +BEGIN + IF b_cnt < 1 THEN + RETURN; + END IF; + + -- Lock empire and planet + SELECT INTO e_id e.name_id + FROM verse.planets p + INNER JOIN verse.bld_queues q ON q.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + WHERE p.name_id = p_id + FOR UPDATE OF p , q , ep , e; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Check technologies + SELECT INTO dep_level , has_level l.level , t.level + FROM tech.buildings b + LEFT OUTER JOIN tech.buildable_requirements r + ON r.buildable_id = b.buildable_id + LEFT OUTER JOIN tech.levels l + ON l.id = r.level_id + LEFT OUTER JOIN emp.technologies t + ON t.empire_id = e_id AND t.line_id = l.line_id AND t.level > l.level + WHERE b.buildable_id = b_id; + IF NOT FOUND OR ( has_level IS NULL AND dep_level IS NOT NULL ) THEN + RETURN; + END IF; + + -- Check queue length + SELECT INTO qlen count( * ) FROM verse.bld_items WHERE queue_id = p_id; + IF qlen >= 5 THEN + RETURN; + END IF; + + -- Insert queue item + INSERT INTO verse.bld_items ( queue_id , queue_order , building_id , amount , destroy ) + VALUES ( p_id , qlen , b_id , b_cnt , FALSE ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.construct_buildings( INT , INT , INT ) TO :dbuser; + + + +-- +-- Adds building destructions to a planet's civilian queue +-- +-- Parameters: +-- p_id Planet identifier +-- b_id Building type identifier +-- b_cnt Amount of ships to build +-- +-- Returns: +-- success Whether the orders could be added to the queue +-- (only failures related to the amount of buildings are reported) +-- + +CREATE OR REPLACE FUNCTION verse.destroy_buildings( p_id INT , b_id INT , b_cnt INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + qlen INT; + built INT; + in_queue INT; +BEGIN + IF b_cnt < 1 THEN + RETURN; + END IF; + + -- Lock empire and planet + SELECT INTO e_id e.name_id + FROM verse.planets p + INNER JOIN verse.bld_queues q ON q.planet_id = p.name_id + INNER JOIN verse.planet_buildings b ON b.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + WHERE p.name_id = p_id + FOR UPDATE OF p , q , ep , e , b; + IF NOT FOUND THEN + success := TRUE; + RETURN; + END IF; + + -- Check queue length + SELECT INTO qlen count( * ) FROM verse.bld_items WHERE queue_id = p_id; + IF qlen >= 5 THEN + success := TRUE; + RETURN; + END IF; + + -- Check existing buildings and build queue contents + SELECT INTO built amount + FROM verse.planet_buildings + WHERE planet_id = p_id AND building_id = b_id; + IF NOT FOUND THEN + built := 0; + END IF; + SELECT INTO in_queue sum( amount * ( CASE WHEN destroy THEN -1 ELSE 1 END ) ) + FROM verse.bld_items + WHERE queue_id = p_id AND building_id = b_id; + IF in_queue IS NULL THEN + in_queue := 0; + END IF; + + success := ( b_cnt <= in_queue + built ); + IF NOT success THEN + success := FALSE; + RETURN; + END IF; + + -- Insert queue item + INSERT INTO verse.bld_items ( queue_id , queue_order , building_id , amount , destroy ) + VALUES ( p_id , qlen , b_id , b_cnt , TRUE ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.destroy_buildings( INT , INT , INT ) TO :dbuser; + + + +-- +-- Start abandoning a planet +-- +-- Parameters: +-- p_id Planet to abandon +-- +-- Returns: +-- tta Time to abandon +-- + +CREATE OR REPLACE FUNCTION verse.abandon( p_id INT , OUT tta INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM ep.planet_id + FROM emp.planets ep + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN verse.planet_money pm ON pm.planet_id = p.name_id + WHERE ep.planet_id = p_id + FOR UPDATE; + IF NOT FOUND THEN + tta := 0; + RETURN; + END IF; + + tta := floor( sys.get_constant( 'game.timeToAbandon' ) ); + BEGIN + INSERT INTO emp.abandon ( planet_id , time_left ) + VALUES ( p_id , tta ); + UPDATE verse.planet_money SET income = 0 + WHERE planet_id = p_id; + EXCEPTION + WHEN unique_violation THEN + tta := 0; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION verse.abandon( INT ) TO :dbuser; + + + +-- +-- Cancels planet abandon +-- +-- Parameters: +-- p_id Planet not to abandon +-- + +CREATE OR REPLACE FUNCTION verse.cancel_abandon( p_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + DELETE FROM emp.abandon WHERE planet_id = $1; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION verse.cancel_abandon( INT ) TO :dbuser; + + + +-- +-- Prepares a planet for abandon or ownership transfer +-- +-- Parameters: +-- p_id Planet identifier +-- + +CREATE OR REPLACE FUNCTION emp.leave_planet( p_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + bp_id BIGINT; +BEGIN + PERFORM verse.flush_military_queue( p_id ); + PERFORM verse.flush_build_queue( p_id ); + DELETE FROM emp.abandon WHERE planet_id = p_id; + DELETE FROM emp.planets WHERE planet_id = p_id; + + -- Update battle records + SELECT INTO bp_id bpo.protagonist_id + FROM battles.battles b + INNER JOIN battles.protagonists bp ON bp.battle_id = b.id + INNER JOIN battles.planet_ownership bpo ON bpo.protagonist_id = bp.id + WHERE b.location_id = p_id AND b.last_tick IS NULL; + IF FOUND + THEN + UPDATE battles.planet_ownership + SET abandoned_at = sys.get_tick() - 1 + WHERE protagonist_id = bp_id; + END IF; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Inflicts battle damage to a planet's stationary defences +-- +-- Parameters: +-- p_id Planet identifier +-- t_power Total defences +-- dmg Damage to inflict +-- b_id Battle identifier +-- tick Current tick +-- + +CREATE OR REPLACE FUNCTION verse.inflict_battle_damage( p_id INT , t_power BIGINT , dmg REAL , b_id BIGINT , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + bp_id BIGINT; + st_dmg REAL; + n_dest INT; +BEGIN + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Inflicting ' || dmg + || ' damage to planet #' || p_id ); + + bp_id := NULL; + FOR rec IN SELECT b.building_id , b.amount , b.damage , ( b.amount * bd.output ) AS power , + bd.output AS s_power + FROM verse.planet_buildings b + INNER JOIN tech.buildings bd ON bd.buildable_id = b.building_id + WHERE b.planet_id = p_id AND b.amount > 0 AND bd.output_type = 'DEF' + LOOP + st_dmg := rec.damage + ( dmg * rec.power / t_power ) / rec.s_power; + n_dest := floor( st_dmg ); + st_dmg := st_dmg - n_dest; + IF n_dest >= rec.amount THEN + n_dest := rec.amount; + st_dmg := 0; + END IF; + + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Building type #' || rec.building_id + || ' - Damage ' || st_dmg || '; destruction: ' || n_dest ); + + -- Apply damage + UPDATE verse.planet_buildings + SET damage = st_dmg , amount = amount - n_dest + WHERE planet_id = p_id AND building_id = rec.building_id; + + -- Update battle record + CONTINUE WHEN n_dest = 0; + IF bp_id IS NULL THEN + bp_id := battles.goc_planet( b_id , 'BATTLE'::battle_planet_change , tick ); + END IF; + PERFORM battles.record_building_change( bp_id , rec.building_id , -n_dest ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Inflicts debt-related damage to all buildings of an empire +-- +-- Parameters: +-- e_id Empire identifer +-- t_upkeep Total building upkeep +-- debt Daily debt +-- d_ratio Debt damage ratio +-- + +CREATE OR REPLACE FUNCTION verse.handle_debt( e_id INT , t_upkeep REAL , debt REAL , d_ratio REAL ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + tick BIGINT; + tot_damage REAL; + p_rec RECORD; + b_rec RECORD; + bp_id BIGINT; + b_damage REAL; + n_destroy INT; +BEGIN + tick := sys.get_tick( ) - 1; + tot_damage := t_upkeep * d_ratio / debt; + PERFORM sys.write_log( 'EmpireDebt' , 'DEBUG'::log_level , 'Inflicting debt damage to buildings; total upkeep: ' + || t_upkeep || ', damage ratio: ' || d_ratio || ', total damage: ' || tot_damage ); + + FOR p_rec IN SELECT ep.planet_id AS planet , b.id AS battle + FROM emp.planets ep + LEFT OUTER JOIN battles.battles b + ON b.location_id = ep.planet_id AND b.last_tick IS NULL + WHERE ep.empire_id = e_id + LOOP + bp_id := NULL; + + FOR b_rec IN SELECT b.building_id AS building , b.amount AS amount , + ( b.amount * bb.upkeep )::REAL AS upkeep , + b.damage AS damage , ( bd.output_type = 'DEF' ) AS is_def + FROM verse.planet_buildings b + INNER JOIN tech.buildables bb ON bb.name_id = b.building_id + INNER JOIN tech.buildings bd ON bd.buildable_id = b.building_id + WHERE b.amount > 0 AND b.planet_id = p_rec.planet + LOOP + -- Compute damage and destruction + b_damage := b_rec.damage + tot_damage * b_rec.upkeep / t_upkeep; + n_destroy := floor( b_damage ); + IF n_destroy >= b_rec.amount + THEN + n_destroy := b_rec.amount; + b_damage := 0; + ELSE + b_damage := b_damage - n_destroy; + END IF; + + -- Update entry + UPDATE verse.planet_buildings + SET amount = amount - n_destroy , damage = b_damage + WHERE building_id = b_rec.building AND planet_id = p_rec.planet; + + -- Update battle + CONTINUE WHEN p_rec.battle IS NULL OR NOT b_rec.is_def OR n_destroy = 0; + IF bp_id IS NULL + THEN + bp_id := battles.goc_planet( p_rec.battle , 'DESTROY'::battle_planet_change , tick ); + END IF; + PERFORM battles.record_building_change( bp_id , b_rec.building , -n_destroy ); + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/150-battle-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/150-battle-functions.sql new file mode 100644 index 0000000..ef34b5e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/150-battle-functions.sql @@ -0,0 +1,839 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Battle functions and utility views +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Checks if a battle needs to start at a given location +-- +-- Parameters: +-- l_id Location to check +-- +-- Returns: +-- Whether or not a new battle is to be added +-- + +CREATE OR REPLACE FUNCTION battles.check_start( l_id INT ) + RETURNS BOOLEAN + STRICT STABLE + SECURITY INVOKER + AS $$ +BEGIN + PERFORM p.name_id + FROM verse.planets p + INNER JOIN fleets.fleets f ON f.location_id = p.name_id AND f.attacking + LEFT OUTER JOIN fleets.movements m + ON m.fleet_id = f.id + LEFT OUTER JOIN battles.battles b + ON b.location_id = p.name_id AND last_tick IS NULL + WHERE p.name_id = l_id AND m.fleet_id IS NULL and b.id IS NULL; + RETURN FOUND; +END; +$$ LANGUAGE plpgsql; + + +-- +-- Creates or returns an empire's battle record +-- +-- Parameters: +-- e_id Empire identifier +-- +-- Returns: +-- the empire battle record's identifier +-- + +CREATE OR REPLACE FUNCTION battles.goc_empire( e_id INT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + r_id BIGINT; +BEGIN + LOOP + SELECT INTO r_id id FROM battles.empires + WHERE empire_id = e_id; + EXIT WHEN FOUND; + + INSERT INTO battles.empires ( name , empire_id ) + SELECT name , id FROM naming.empire_names + WHERE id = e_id + RETURNING id INTO r_id; + + PERFORM * FROM battles.empires + WHERE empire_id = e_id AND id <> r_id; + EXIT WHEN NOT FOUND; + + DELETE FROM battles.empires WHERE id = r_id; + END LOOP; + RETURN r_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates or returns a protagonist's record +-- +-- Parameters: +-- b_id Battle identifier +-- e_id Empire identifier +-- mode Protagonist mode +-- tick Current tick +-- + +CREATE OR REPLACE FUNCTION battles.goc_protagonist( b_id BIGINT , e_id INT , mode BOOLEAN , tick BIGINT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + be_id BIGINT; + p_id BIGINT; + lmode BOOLEAN; +BEGIN + be_id := battles.goc_empire( e_id ); + + LOOP + SELECT INTO p_id id FROM battles.protagonists + WHERE battle_id = b_id AND empire_id = be_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.protagonists ( battle_id , empire_id ) + VALUES ( b_id , be_id ) + RETURNING id INTO p_id; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + + SELECT INTO lmode attacking + FROM battles.status_changes WHERE protagonist_id = p_id + ORDER BY tick_identifier DESC LIMIT 1; + IF NOT FOUND OR lmode <> mode + THEN + INSERT INTO battles.status_changes ( protagonist_id , tick_identifier , attacking ) + VALUES ( p_id , tick , mode ); + END IF; + + RETURN p_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Initialises a battle record +-- +-- Parameters: +-- l_id Location +-- tick The current tick's identifier +-- +-- Returns: +-- the battle's identifier +-- + +CREATE OR REPLACE FUNCTION battles.initialise( l_id INT , tick BIGINT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + -- Battle ID + b_id BIGINT; + -- Battle planet ID + bp_id BIGINT; + -- Record for list operations + rec RECORD; + -- Protagonist ID + prot_id BIGINT; + -- Fleet status record ID + bf_id BIGINT; + -- Planet owner + po_id INT; +BEGIN + -- Create main battle record + INSERT INTO battles.battles ( location_id , first_tick ) + VALUES ( l_id , tick ) + RETURNING id INTO b_id; + + -- Create planet record + INSERT INTO battles.planets( battle_id , tick_identifier , change_type , name ) + SELECT b_id , tick , 'INIT'::battle_planet_change , n.name + FROM naming.map_names n WHERE n.id = l_id + RETURNING id INTO bp_id; + + -- Insert list of initial buildings + INSERT INTO battles.buildings ( planet_id , building_id , change ) + SELECT bp_id , b.building_id , b.amount + FROM verse.planet_buildings b + INNER JOIN tech.buildings bd ON bd.buildable_id = b.building_id + WHERE b.planet_id = l_id AND bd.output_type = 'DEF' AND b.amount > 0; + + -- Insert defensive power + INSERT INTO battles.defences ( battle_id , tick_identifier , power ) + SELECT b_id , tick , floor( verse.adjust_production( + verse.get_raw_production( p.name_id , 'DEF' ) , ph.current / p.population ) ) + FROM verse.planets p + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + WHERE p.name_id = l_id; + + -- Add protagonists and initial status + SELECT INTO po_id empire_id FROM emp.planets ep WHERE ep.planet_id = l_id; + FOR rec IN SELECT f.owner_id AS id , f.attacking AS mode + FROM fleets.fleets f + INNER JOIN naming.empire_names n ON n.id = f.owner_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.location_id = l_id AND m.fleet_id IS NULL + UNION SELECT ep.empire_id AS id , FALSE AS mode + FROM emp.planets ep + WHERE ep.planet_id = l_id + LOOP + prot_id := battles.goc_protagonist( b_id , rec.id , rec.mode , tick ); + IF po_id = rec.id THEN + INSERT INTO battles.planet_ownership ( protagonist_id ) + VALUES ( prot_id ); + END IF; + + -- Insert fleets + INSERT INTO battles.fleets ( protagonist_id , tick_identifier , change_type ) + VALUES ( prot_id , tick , 'INIT'::battle_fleet_change ) + RETURNING id INTO bf_id; + INSERT INTO battles.ships ( fleet_id , ship_id , change ) + SELECT bf_id , s.ship_id , sum( s.amount ) + FROM fleets.fleets f + INNER JOIN fleets.ships s ON s.fleet_id = f.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.owner_id = rec.id AND f.location_id = l_id + AND m.fleet_id IS NULL AND f.status <> 'DEPLOYING' + GROUP BY s.ship_id; + END LOOP; + + RETURN b_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Adds fleet ship changes +-- + +CREATE OR REPLACE FUNCTION battles.add_fleet_change( f_id BIGINT , s_id INT , l_change INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + LOOP + UPDATE battles.ships SET change = change + l_change + WHERE fleet_id = f_id AND ship_id = s_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.ships ( fleet_id , ship_id , change ) + VALUES ( f_id , s_id , l_change ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Gets or create a planet's change record +-- +-- Parameters: +-- b_id Battle identifier +-- ctype Change type +-- tick Tick identifier +-- +-- Returns: +-- the planet's change record +-- + +CREATE OR REPLACE FUNCTION battles.goc_planet( b_id BIGINT , ctype battle_planet_change , tick BIGINT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + pr_id BIGINT; +BEGIN + LOOP + SELECT INTO pr_id id FROM battles.planets + WHERE battle_id = b_id AND change_type = ctype + AND tick_identifier = tick; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.planets( battle_id , tick_identifier , change_type ) + VALUES ( b_id , tick , ctype ) + RETURNING id INTO pr_id; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + + RETURN pr_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Records building changes +-- +-- Parameters: +-- pcr_id Planet change record +-- bt_id Building type +-- amount Amount +-- + +CREATE OR REPLACE FUNCTION battles.record_building_change( pcr_id BIGINT , bt_id INT , amount INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + LOOP + UPDATE battles.buildings + SET change = change + amount + WHERE planet_id = pcr_id AND building_id = bt_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.buildings ( planet_id , building_id , change ) + VALUES ( pcr_id , bt_id , amount ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Adds buildings to a planet's buildings list +-- +-- Parameters: +-- p_id Planet identifier +-- bt_id Building type +-- amount Amount of buildings to add +-- tick Current tick identifier +-- + +CREATE OR REPLACE FUNCTION battles.add_buildings( p_id INT , bt_id INT , amount INT , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + b_id BIGINT; + pcr_id BIGINT; +BEGIN + -- Check building type + PERFORM buildable_id FROM tech.buildings WHERE buildable_id = bt_id AND output_type = 'DEF'; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Get battle identifier + SELECT INTO b_id id FROM battles.battles + WHERE location_id = p_id AND last_tick IS NULL; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Record changes + pcr_id := battles.goc_planet( b_id , 'BUILD' , tick ); + PERFORM battles.record_building_change( pcr_id , bt_id , amount ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Removes buildings to a planet's buildings list +-- +-- Parameters: +-- p_id Planet identifier +-- bt_id Building type +-- amount Amount of buildings to remove +-- bdmg Whether the losses have been caused by battle damage +-- tick Current tick identifier +-- + +CREATE OR REPLACE FUNCTION battles.remove_buildings( p_id INT , bt_id INT , amount INT , bdmg BOOLEAN , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + b_id BIGINT; + pcr_id BIGINT; +BEGIN + -- Check building type + PERFORM buildable_id FROM tech.buildings WHERE buildable_id = bt_id AND output_type = 'DEF'; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Get battle identifier + SELECT INTO b_id id FROM battles.battles + WHERE location_id = p_id AND last_tick IS NULL; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Record changes + pcr_id := battles.goc_planet( b_id , ( CASE WHEN bdmg THEN 'BATTLE' ELSE 'DESTROY' END )::battle_planet_change , tick ); + PERFORM battles.record_building_change( pcr_id , bt_id , -amount ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Adds a record when the planet is renamed +-- +-- Parameters: +-- p_id Planet identifier +-- nnm New name +-- + +CREATE OR REPLACE FUNCTION battles.rename_planet( p_id INT , nnm TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + b_id BIGINT; + pcr_id BIGINT; +BEGIN + -- Get battle identifier + SELECT INTO b_id id FROM battles.battles + WHERE location_id = p_id AND last_tick IS NULL; + IF NOT FOUND THEN + RETURN; + END IF; + + -- Record change + pcr_id := battles.goc_planet( b_id , 'RENAME' , sys.get_tick() ); + UPDATE battles.planets + SET name = nnm + WHERE id = pcr_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Gets or creates a fleet change record +-- +-- Parameters: +-- bp_id Protagonist identifier +-- tick Tick identifier +-- ctype Change type +-- + +CREATE OR REPLACE FUNCTION battles.goc_fleet_change( bp_id BIGINT , tick BIGINT , ctype battle_fleet_change ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + bf_id BIGINT; +BEGIN + LOOP + SELECT INTO bf_id id FROM battles.fleets + WHERE protagonist_id = bp_id AND tick_identifier = tick AND change_type = ctype; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.fleets ( protagonist_id , tick_identifier , change_type ) + VALUES ( bp_id , tick , ctype ) + RETURNING id INTO bf_id; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + RETURN bf_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Adds a fleet to the battle +-- +-- Parameters: +-- b_id Battle identifier +-- f_id Fleet identifier +-- dep Whether the fleet was added at the end of its deployment phase +-- tick Current tick +-- + +CREATE OR REPLACE FUNCTION battles.add_fleet( b_id BIGINT , f_id BIGINT , dep BOOLEAN , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + e_id INT; + f_att BOOLEAN; + bp_id BIGINT; + bf_id BIGINT; + ctype battle_fleet_change; + rec RECORD; +BEGIN + -- Get owner's protagonist record + SELECT INTO e_id , f_att owner_id , attacking + FROM fleets.fleets + WHERE id = f_id; + bp_id := battles.goc_protagonist( b_id , e_id , f_att , tick ); + + -- Try getting or creating the fleet's record + ctype := ( CASE WHEN dep THEN 'BUILD' ELSE 'ARRIVE' END ); + bf_id := battles.goc_fleet_change( bp_id , tick , ctype ); + + -- Insert or update fleet ships + FOR rec IN SELECT ship_id , amount FROM fleets.ships WHERE fleet_id = f_id + LOOP + PERFORM battles.add_fleet_change( bf_id , rec.ship_id , rec.amount ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Removes a fleet from the battle +-- +-- Parameters: +-- b_id Battle identifier +-- f_id Fleet identifier +-- ctype Change type +-- tick Current tick +-- + +CREATE OR REPLACE FUNCTION battles.remove_fleet( b_id BIGINT , f_id BIGINT , ctype battle_fleet_change , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + e_id INT; + f_att BOOLEAN; + bp_id BIGINT; + bf_id BIGINT; + rec RECORD; +BEGIN + -- Get owner's protagonist record + SELECT INTO e_id , f_att owner_id , attacking + FROM fleets.fleets + WHERE id = f_id; + bp_id := battles.goc_protagonist( b_id , e_id , f_att , tick ); + + -- Try getting or creating the fleet's record + bf_id := battles.goc_fleet_change( bp_id , tick , ctype ); + + -- Insert or update fleet ships + FOR rec IN SELECT ship_id , amount FROM fleets.ships WHERE fleet_id = f_id + LOOP + PERFORM battles.add_fleet_change( bf_id , rec.ship_id , - rec.amount ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sets an empire's mode +-- +-- Parameters: +-- b_id Battle identifier +-- e_id Empire identifier +-- att Whether the empire is attacking or defending +-- + +CREATE OR REPLACE FUNCTION battles.set_mode( b_id BIGINT , e_id INT , att BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + tick BIGINT; + p_id BIGINT; +BEGIN + SELECT INTO p_id p.id + FROM battles.empires e + INNER JOIN battles.protagonists p ON p.empire_id = e.id + WHERE e.empire_id = e_id AND p.battle_id = b_id; + IF NOT FOUND THEN + RETURN; + END IF; + + tick := sys.get_tick( ); + LOOP + DELETE FROM battles.status_changes + WHERE protagonist_id = p_id AND tick_identifier = tick AND attacking = ( NOT att ); + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.status_changes ( protagonist_id , tick_identifier , attacking ) + VALUES ( p_id , tick , att ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + + PERFORM * FROM battles.status_changes + WHERE protagonist_id = p_id AND tick_identifier = tick AND attacking = att; + EXIT WHEN FOUND; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Inflicts damage to one side of the engagement +-- +-- Parameters: +-- b_id Battle identifer +-- dmg Amount of damage to inflict +-- att Whether damage is being inflicted to attacking fleets +-- tick Current tick identifier +-- + +CREATE OR REPLACE FUNCTION battles.inflict_damage( b_id BIGINT , dmg REAL , att BOOLEAN , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + planet INT; + tot_power BIGINT; + st_power BIGINT; + rec RECORD; +BEGIN + -- Get total power from fleets + SELECT INTO tot_power sum( fs.power ) + FROM battles.battles b + LEFT OUTER JOIN fleets.fleets f ON f.location_id = b.location_id AND f.attacking = att + LEFT OUTER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE b.id = b_id AND m.fleet_id IS NULL; + IF tot_power IS NULL THEN + tot_power := 0; + END IF; + SELECT INTO planet location_id FROM battles.battles WHERE id = b_id; + + -- If damage is being inflicted to defence forces, handle defence buildings + IF NOT att THEN + st_power := battles.get_defence_power( b_id , tick ); + tot_power := tot_power + st_power; + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'About to inflict planet damage; total power: ' || tot_power + || '; planet power: ' || st_power || '; computed damage: ' || ( dmg * st_power / tot_power )::REAL ); + IF st_power <> 0 THEN + PERFORM verse.inflict_battle_damage( planet , st_power , ( dmg * st_power / tot_power )::REAL , b_id , tick ); + END IF; + END IF; + + -- Inflict damage to fleets + FOR rec IN SELECT f.id , fs.power + FROM battles.battles b + INNER JOIN fleets.fleets f ON f.location_id = b.location_id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE b.id = b_id AND m.fleet_id IS NULL AND f.attacking = att + LOOP + PERFORM fleets.inflict_battle_damage( rec.id , ( dmg * rec.power / tot_power )::REAL , b_id , tick ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Computes the size/power of a planet's defences at a given tick +-- + +CREATE TYPE planet_defence_size AS ( + item_id INT , + amount INT +); + +CREATE OR REPLACE FUNCTION battles.get_defence_size( b_id BIGINT , tick BIGINT ) + RETURNS SETOF planet_defence_size + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT bb.building_id AS item_id , sum( bb.change )::INT AS amount + FROM battles.planets bp + INNER JOIN battles.buildings bb ON bb.planet_id = bp.id + WHERE bp.battle_id = $1 AND bp.tick_identifier <= $2 + GROUP BY bb.building_id; +$$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION battles.set_defence_power( b_id BIGINT , tick BIGINT , pw BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + IF battles.get_defence_power( b_id , tick ) <> pw + THEN + LOOP + UPDATE battles.defences SET power = pw + WHERE battle_id = b_id AND tick_identifier = tick; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO battles.defences ( battle_id , tick_identifier , power ) + VALUES ( b_id , tick , pw ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- EMPTY + END; + END LOOP; + END IF; +END; +$$ LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION battles.get_defence_power( b_id BIGINT , tick BIGINT ) + RETURNS BIGINT + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT power FROM battles.defences + WHERE battle_id = $1 AND tick_identifier = ( + SELECT max( tick_identifier ) FROM battles.defences + WHERE battle_id = $1 AND tick_identifier <= $2 + ); +$$ LANGUAGE SQL; + + + +-- +-- Lists battle protagonists in a specific mode at a given tick +-- + +CREATE OR REPLACE FUNCTION battles.get_protagonists_with_mode( b_id BIGINT , tick BIGINT , mode BOOLEAN ) + RETURNS SETOF BIGINT + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT protagonist_id + FROM battles.status_changes c + INNER JOIN ( + SELECT sc.protagonist_id , max( sc.tick_identifier ) AS tick_identifier + FROM battles.status_changes sc + INNER JOIN battles.protagonists p ON p.id = sc.protagonist_id + WHERE sc.tick_identifier <= $2 AND p.battle_id = $1 + GROUP BY protagonist_id + ) x USING ( protagonist_id , tick_identifier ) + WHERE c.attacking = $3; +$$ LANGUAGE SQL; + + + +-- +-- Computes the size/power of fleets in a specific mode at a given tick +-- + +CREATE TYPE battle_fleet_size AS ( + protagonist_id BIGINT , + ship_id INT , + amount INT +); + +CREATE OR REPLACE FUNCTION battles.get_fleets_composition( b_id BIGINT , tick BIGINT ) + RETURNS SETOF battle_fleet_size + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT bp.id AS protagonist_id , bs.ship_id AS item_id , sum( bs.change )::INT AS amount + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + INNER JOIN battles.ships bs ON bs.fleet_id = bf.id + WHERE bp.battle_id = $1 AND bf.tick_identifier <= $2 + GROUP BY bp.id , bs.ship_id; +$$ LANGUAGE SQL; + + +CREATE TYPE battle_fleet_power AS ( + protagonist_id BIGINT , + power BIGINT +); + + +CREATE OR REPLACE FUNCTION battles.get_fleets_power( b_id BIGINT , tick BIGINT ) + RETURNS SETOF battle_fleet_power + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT ds.protagonist_id , ( CASE + WHEN sum( ds.amount * s.power ) IS NULL THEN + 0 + ELSE + sum( ds.amount * s.power ) + END ) AS power + FROM battles.get_fleets_composition( $1 , $2 ) ds + INNER JOIN tech.ships s ON s.buildable_id = ds.ship_id + GROUP BY ds.protagonist_id; +$$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION battles.get_biggest_fleet_owner( b_id BIGINT , tick BIGINT ) + RETURNS INT + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT e.empire_id + FROM battles.get_fleets_power( $1 , $2 ) fp + INNER JOIN battles.protagonists bp ON bp.id = fp.protagonist_id + INNER JOIN battles.empires e ON e.id = bp.empire_id + ORDER BY fp.power DESC + LIMIT 1; +$$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION battles.get_fleets_power( b_id BIGINT , tick BIGINT , mode BOOLEAN ) + RETURNS BIGINT + STRICT STABLE + SECURITY DEFINER +AS $$ + SELECT ( CASE + WHEN sum( fp.power ) IS NULL THEN + 0 + ELSE + sum( fp.power ) + END )::BIGINT + FROM battles.get_fleets_power( $1 , $2 ) fp + INNER JOIN battles.get_protagonists_with_mode( $1 , $2 , $3 ) pm + ON fp.protagonist_id = pm; +$$ LANGUAGE SQL; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/160-battle-views.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/160-battle-views.sql new file mode 100644 index 0000000..c649e10 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/160-battle-views.sql @@ -0,0 +1,483 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Views that are used to display battles +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Battle status view +-- + +CREATE VIEW battles.current_status + AS SELECT location_id AS location , id , ( battles.get_defence_power( id , sys.get_tick() ) + battles.get_fleets_power( id , sys.get_tick() , FALSE ) ) AS defence , + battles.get_fleets_power( id , sys.get_tick() , TRUE ) AS attack + FROM battles.battles WHERE last_tick IS NULL; + +GRANT SELECT ON battles.current_status TO :dbuser; + + + +-- +-- Viewable battles, by empire +-- + +CREATE VIEW battles.empire_list_view + AS SELECT be.empire_id AS empire , b.id AS battle , + bpt.id AS protagonist , + b.first_tick , b.last_tick , + p.name_id AS planet , + s.x , s.y , p.orbit , + bpl.name + FROM battles.empires be + INNER JOIN battles.protagonists bpt ON bpt.empire_id = be.id + INNER JOIN battles.battles b ON b.id = bpt.battle_id + INNER JOIN verse.planets p ON p.name_id = b.location_id + INNER JOIN verse.systems s ON s.id = p.system_id + INNER JOIN battles.planets bpl ON bpl.battle_id = b.id AND bpl.change_type = 'INIT' + WHERE be.empire_id IS NOT NULL; + +GRANT SELECT ON battles.empire_list_view TO :dbuser; + + +-- +-- Ticks to include in a battle display +-- + +CREATE VIEW battles.battle_ticks_view + AS SELECT x.battle , x.tick FROM ( + SELECT battle_id AS battle , tick_identifier AS tick + FROM battles.planets + UNION SELECT battle_id AS battle , tick_identifier AS tick + FROM battles.defences + UNION SELECT bp.battle_id AS battle , bsc.tick_identifier AS tick + FROM battles.status_changes bsc + INNER JOIN battles.protagonists bp ON bp.id = bsc.protagonist_id + UNION SELECT bp.battle_id AS battle , bf.tick_identifier AS tick + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + UNION SELECT id AS battle , last_tick AS tick + FROM battles.battles + WHERE last_tick IS NOT NULL + ) x + ORDER BY x.tick; + +GRANT SELECT ON battles.battle_ticks_view TO :dbuser; + + + +-- +-- Mode history view +-- + +CREATE OR REPLACE FUNCTION battles.get_protagonist_status_at( bp_id BIGINT , tick_id BIGINT ) + RETURNS BOOLEAN + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT attacking FROM battles.status_changes + WHERE protagonist_id = $1 AND tick_identifier <= $2 + ORDER BY tick_identifier DESC LIMIT 1; +$$ LANGUAGE SQL; + +CREATE VIEW battles.mode_history_view + AS SELECT btv.battle , btv.tick , bp.id AS protagonist , + be.id AS empire_id , be.name AS empire_name , + battles.get_protagonist_status_at( bp.id , btv.tick ) AS attacking + FROM battles.battle_ticks_view btv + INNER JOIN battles.protagonists bp ON bp.battle_id = btv.battle + INNER JOIN battles.empires be ON be.id = bp.empire_id + ORDER BY btv.tick , be.name; + +GRANT SELECT ON battles.mode_history_view TO :dbuser; + + + +-- +-- Ships history +-- + +CREATE VIEW battles.protagonist_ships + AS SELECT DISTINCT bf.protagonist_id , bs.ship_id + FROM battles.fleets bf + INNER JOIN battles.ships bs ON bs.fleet_id = bf.id; + +CREATE OR REPLACE FUNCTION battles.get_lost_ships( bp_id BIGINT , tick_id BIGINT, ship_id INT ) + RETURNS BIGINT + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT -sum( fs.change ) + FROM battles.ships fs + INNER JOIN battles.fleets bf ON fs.fleet_id = bf.id + WHERE bf.protagonist_id = $1 AND bf.tick_identifier <= $2 + AND bf.change_type = 'BATTLE' AND fs.ship_id = $3 +$$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION battles.get_current_ships( bp_id BIGINT , tick_id BIGINT, ship_id INT ) + RETURNS BIGINT + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT sum( fs.change ) + FROM battles.ships fs + INNER JOIN battles.fleets bf ON fs.fleet_id = bf.id + WHERE bf.protagonist_id = $1 AND bf.tick_identifier <= $2 + AND fs.ship_id = $3 +$$ LANGUAGE SQL; + + +CREATE VIEW battles.fleets_history + AS SELECT elv.empire , elv.battle , btv.tick , + bpt.id AS protagonist , t.translated_string AS ship_type , + battles.get_current_ships( bpt.id , btv.tick , bps.ship_id ) AS current , + battles.get_lost_ships( bpt.id , btv.tick , bps.ship_id ) AS lost , + s.power AS ship_power + FROM battles.empire_list_view elv + INNER JOIN battles.battle_ticks_view btv USING (battle) + INNER JOIN battles.protagonists bpt ON bpt.battle_id = elv.battle + INNER JOIN battles.protagonist_ships bps ON bps.protagonist_id = bpt.id + INNER JOIN tech.ships s ON s.buildable_id = bps.ship_id + INNER JOIN naming.empire_names en ON en.id = elv.empire + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t + ON t.lang_id = c.language_id AND t.string_id = bps.ship_id + ORDER BY s.power; + +GRANT SELECT ON battles.fleets_history TO :dbuser; + + + +-- +-- Protagonist presence in a battle at any given tick +-- + +CREATE VIEW battles.protagonist_ship_types + AS SELECT DISTINCT bp.id AS protagonist , bs.ship_id AS ship_type + FROM battles.protagonists bp + INNER JOIN battles.fleets bf ON bf.protagonist_id = bp.id + INNER JOIN battles.ships bs ON bs.fleet_id = bf.id; + +CREATE VIEW battles.ships_at_tick + AS SELECT btv.battle , btv.tick , bp.id AS protagonist , + sum( battles.get_current_ships( bp.id , btv.tick, bs.ship_type ) ) AS ships + FROM battles.battle_ticks_view btv + INNER JOIN battles.protagonists bp ON bp.battle_id = btv.battle + INNER JOIN battles.protagonist_ship_types bs ON bs.protagonist = bp.id + GROUP BY btv.battle , btv.tick , bp.id; + +CREATE OR REPLACE FUNCTION battles.get_current_ships( bp_id BIGINT , tick_id BIGINT ) + RETURNS BIGINT + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT ( CASE WHEN sum( fs.change ) IS NULL THEN 0 ELSE sum( fs.change ) END ) + FROM battles.ships fs + INNER JOIN battles.fleets bf ON fs.fleet_id = bf.id + WHERE bf.protagonist_id = $1 AND bf.tick_identifier <= $2 +$$ LANGUAGE SQL; + + +CREATE VIEW battles.protagonist_presence + AS SELECT btv.battle , btv.tick , bp.id AS protagonist , + ( bpo.protagonist_id IS NOT NULL + OR battles.get_current_ships( bp.id , btv.tick ) > 0 ) AS present , + ( bpo.protagonist_id IS NOT NULL ) AS planet_owner + FROM battles.battle_ticks_view btv + INNER JOIN battles.protagonists bp ON bp.battle_id = btv.battle + LEFT OUTER JOIN battles.planet_ownership bpo + ON bpo.protagonist_id = bp.id AND ( bpo.abandoned_at IS NULL OR bpo.abandoned_at > btv.tick ); + +GRANT SELECT ON battles.protagonist_presence TO :dbuser; + + +-- +-- Buildings history +-- + + +CREATE VIEW battles.buildings_list + AS SELECT DISTINCT bp.battle_id AS battle , bb.building_id + FROM battles.planets bp + INNER JOIN battles.buildings bb ON bb.planet_id = bp.id; + + +CREATE OR REPLACE FUNCTION battles.get_current_buildings( b_id BIGINT , tick_id BIGINT , building_id INT ) + RETURNS BIGINT + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT sum( change ) + FROM battles.buildings b + INNER JOIN battles.planets bp ON bp.id = b.planet_id + WHERE bp.battle_id = $1 AND bp.tick_identifier <= $2 AND b.building_id = $3; +$$ LANGUAGE SQL; + + +CREATE OR REPLACE FUNCTION battles.get_lost_buildings( b_id BIGINT , tick_id BIGINT , building_id INT ) + RETURNS BIGINT + STRICT IMMUTABLE + SECURITY DEFINER +AS $$ + SELECT -sum( change ) + FROM battles.buildings b + INNER JOIN battles.planets bp ON bp.id = b.planet_id + WHERE bp.battle_id = $1 AND bp.tick_identifier <= $2 + AND b.building_id = $3 AND bp.change_type = 'BATTLE'; +$$ LANGUAGE SQL; + + +CREATE VIEW battles.raw_buildings_history + AS SELECT btv.battle , btv.tick , bbl.building_id , + battles.get_current_buildings( btv.battle , btv.tick , bbl.building_id ) AS current , + battles.get_lost_buildings( btv.battle , btv.tick , bbl.building_id ) AS lost , + b.output AS raw_power + FROM battles.battle_ticks_view btv + INNER JOIN battles.buildings_list bbl USING (battle) + INNER JOIN tech.buildings b ON b.buildable_id = bbl.building_id; + +CREATE VIEW battles.raw_buildings_power + AS SELECT rbh.battle , rbh.tick , + sum( rbh.current * rbh.raw_power ) AS raw_power , + battles.get_defence_power( rbh.battle , rbh.tick ) AS actual_power + FROM battles.raw_buildings_history rbh + GROUP BY rbh.battle , rbh.tick; + + +CREATE VIEW battles.buildings_history + AS SELECT elv.empire , rbh.battle , rbh.tick , + t.translated_string AS building , + ( CASE WHEN rbh.current IS NULL THEN 0 ELSE rbh.current END ) AS current , + ( CASE WHEN rbh.lost IS NULL THEN 0 ELSE rbh.lost END ) AS lost , + ( CASE + WHEN rbp.raw_power = 0 THEN + rbh.raw_power + ELSE + rbh.raw_power::REAL * rbp.actual_power::REAL / rbp.raw_power::REAL + END )::REAL AS power + FROM battles.empire_list_view elv + INNER JOIN battles.raw_buildings_history rbh USING (battle) + INNER JOIN battles.raw_buildings_power rbp USING (battle,tick) + INNER JOIN naming.empire_names en ON en.id = elv.empire + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t + ON t.string_id = rbh.building_id AND t.lang_id = c.language_id + ORDER BY rbp.raw_power; + +GRANT SELECT ON battles.buildings_history TO :dbuser; + + + +-- +-- Events +-- + +CREATE VIEW battles.rename_events + AS SELECT bp.battle_id AS battle , bp.tick_identifier AS tick , + 'RENAME'::TEXT AS event_type , TRUE AS is_planet , + NULL::BIGINT AS event_id , bp.name AS name , NULL::BOOLEAN AS attack + FROM battles.planets bp + WHERE bp.change_type = 'RENAME'; + +CREATE VIEW battles.switch_events + AS SELECT bp.battle_id AS battle , bsc.tick_identifier AS tick , + 'SWITCH'::TEXT AS event_type , FALSE AS is_planet , + NULL::BIGINT AS event_id , be.name AS name , bsc.attacking AS attack + FROM battles.status_changes bsc + INNER JOIN battles.protagonists bp ON bp.id = bsc.protagonist_id + INNER JOIN battles.empires be ON be.id = bp.empire_id + INNER JOIN battles.battles b + ON b.id = bp.battle_id AND bsc.tick_identifier > b.first_tick; + +CREATE VIEW battles.arrive_events + AS SELECT bp.battle_id AS battle , bf.tick_identifier AS tick , + 'ARRIVE'::TEXT AS event_type , FALSE AS is_planet , + bf.id AS event_id , be.name AS name , + battles.get_protagonist_status_at( bp.id , bf.tick_identifier ) AS attack + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + INNER JOIN battles.empires be ON be.id = bp.empire_id + WHERE bf.change_type = 'ARRIVE'; + +CREATE VIEW battles.depart_events + AS SELECT bp.battle_id AS battle , bf.tick_identifier AS tick , + 'DEPART'::TEXT AS event_type , FALSE AS is_planet , + bf.id AS event_id , be.name AS name , + battles.get_protagonist_status_at( bp.id , bf.tick_identifier ) AS attack + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + INNER JOIN battles.empires be ON be.id = bp.empire_id + WHERE bf.change_type = 'DEPART'; + +CREATE VIEW battles.fleet_destroy_events + AS SELECT bp.battle_id AS battle , bf.tick_identifier AS tick , + 'DESTROY'::TEXT AS event_type , FALSE AS is_planet , + bf.id AS event_id , be.name AS name , + battles.get_protagonist_status_at( bp.id , bf.tick_identifier ) AS attack + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + INNER JOIN battles.empires be ON be.id = bp.empire_id + WHERE bf.change_type = 'DISBAND'; + +CREATE VIEW battles.fleet_build_events + AS SELECT bp.battle_id AS battle , bf.tick_identifier AS tick , + 'BUILD'::TEXT AS event_type , FALSE AS is_planet , + bf.id AS event_id , be.name AS name , + battles.get_protagonist_status_at( bp.id , bf.tick_identifier ) AS attack + FROM battles.fleets bf + INNER JOIN battles.protagonists bp ON bp.id = bf.protagonist_id + INNER JOIN battles.empires be ON be.id = bp.empire_id + WHERE bf.change_type = 'BUILD'; + +CREATE VIEW battles.bld_destroy_events + AS SELECT bp.battle_id AS battle , bp.tick_identifier AS tick , + 'DESTROY'::TEXT AS event_type , TRUE AS is_planet , + bp.id AS event_id , NULL::TEXT AS name , FALSE AS attack + FROM battles.planets bp + WHERE bp.change_type = 'DESTROY'; + +CREATE VIEW battles.bld_build_events + AS SELECT bp.battle_id AS battle , bp.tick_identifier AS tick , + 'BUILD'::TEXT AS event_type , TRUE AS is_planet , + bp.id AS event_id , NULL::TEXT AS name , FALSE AS attack + FROM battles.planets bp + WHERE bp.change_type = 'BUILD'; + + +CREATE VIEW battles.events_history + AS SELECT x.* FROM ( + SELECT * FROM battles.rename_events + UNION ALL SELECT * FROM battles.switch_events + UNION ALL SELECT * FROM battles.arrive_events + UNION ALL SELECT * FROM battles.depart_events + UNION ALL SELECT * FROM battles.fleet_destroy_events + UNION ALL SELECT * FROM battles.fleet_build_events + UNION ALL SELECT * FROM battles.bld_destroy_events + UNION ALL SELECT * FROM battles.bld_build_events + ) x + ORDER BY x.tick DESC , x.is_planet DESC , x.event_type , x.attack , x.name; + +GRANT SELECT ON battles.events_history TO :dbuser; + + +-- +-- Ships/buildings for events +-- + +CREATE VIEW battles.planet_event_items + AS SELECT elv.empire AS empire , TRUE AS is_planet , bp.id AS event_id , + bp.battle_id AS battle , bp.tick_identifier AS tick , + t.translated_string AS nature , abs( bb.change ) AS amount , + b.output AS power + FROM battles.empire_list_view elv + INNER JOIN battles.planets bp ON bp.battle_id = elv.battle + INNER JOIN battles.buildings bb ON bb.planet_id = bp.id + INNER JOIN naming.empire_names en ON en.id = elv.empire + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t + ON t.lang_id = c.language_id AND t.string_id = bb.building_id + INNER JOIN tech.buildings b ON b.buildable_id = bb.building_id + WHERE bp.change_type NOT IN ( 'INIT', 'BATTLE' ); + +CREATE VIEW battles.fleet_event_items + AS SELECT elv.empire AS empire , FALSE AS is_planet , bf.id AS event_id , + bp.battle_id AS battle , bf.tick_identifier AS tick , + t.translated_string AS nature , abs( bs.change ) AS amount , + s.power AS power + FROM battles.empire_list_view elv + INNER JOIN battles.protagonists bp ON bp.battle_id = elv.battle + INNER JOIN battles.fleets bf ON bf.protagonist_id = bp.id + INNER JOIN battles.ships bs ON bs.fleet_id = bf.id + INNER JOIN naming.empire_names en ON en.id = elv.empire + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN defs.translations t + ON t.lang_id = c.language_id AND t.string_id = bs.ship_id + INNER JOIN tech.ships s ON s.buildable_id = bs.ship_id + WHERE bf.change_type NOT IN ( 'INIT', 'BATTLE' ); + +CREATE VIEW battles.event_items + AS SELECT x.* FROM ( + SELECT * FROM battles.planet_event_items + UNION ALL SELECT * FROM battles.fleet_event_items + ) x + ORDER BY x.power; + +GRANT SELECT ON battles.event_items TO :dbuser; + + + +-- +-- Battles list +-- + +CREATE VIEW battles.last_presence + AS SELECT protagonist , max( tick ) AS last_present + FROM battles.protagonist_presence + WHERE present + GROUP BY protagonist; + +CREATE VIEW battles.first_presence + AS SELECT protagonist , min( tick ) AS first_present + FROM battles.protagonist_presence + WHERE present + GROUP BY protagonist; + +CREATE VIEW battles.last_update + AS SELECT p.id AS protagonist , max( u.tick ) AS last_update + FROM battles.protagonists p + INNER JOIN battles.battle_ticks_view u ON u.battle = p.battle_id + GROUP BY p.id; + +CREATE VIEW battles.full_battles_list + AS SELECT elv.empire , elv.battle , elv.planet , elv.x , elv.y , elv.orbit , elv.name , + fp.first_present AS first_tick , ( CASE + WHEN elv.last_tick IS NOT NULL THEN + lp.last_present + WHEN lp.last_present = lu.last_update THEN + NULL + ELSE + lp.last_present + END )::BIGINT AS last_tick , lu.last_update , + ( elv.last_tick IS NOT NULL ) AS finished + FROM battles.empire_list_view elv + INNER JOIN battles.first_presence fp USING (protagonist) + INNER JOIN battles.last_presence lp USING (protagonist) + INNER JOIN battles.last_update lu USING (protagonist); + +CREATE TABLE battles.finished_battles_list( + empire INT NOT NULL , + battle BIGINT NOT NULL , + planet INT NOT NULL , + x INT NOT NULL , + y INT NOT NULL , + orbit INT NOT NULL , + name VARCHAR( 20 ) NOT NULL , + first_tick BIGINT , + last_tick BIGINT , + last_update BIGINT , + PRIMARY KEY( empire , battle ) +); + +CREATE VIEW battles.current_battles_list + AS SELECT elv.empire , elv.battle , elv.planet , elv.x , elv.y , elv.orbit , elv.name , + fp.first_present AS first_tick , ( CASE + WHEN lp.last_present = lu.last_update THEN + NULL + ELSE + lp.last_present + END )::BIGINT AS last_tick , lu.last_update + FROM battles.empire_list_view elv + INNER JOIN battles.first_presence fp USING (protagonist) + INNER JOIN battles.last_presence lp USING (protagonist) + INNER JOIN battles.last_update lu USING (protagonist) + WHERE elv.last_tick IS NULL; + + +CREATE VIEW battles.battles_list + AS SELECT fbl.* , TRUE AS finished FROM battles.finished_battles_list fbl + UNION ALL SELECT cbl.* , FALSE AS finished FROM battles.current_battles_list cbl; + +GRANT SELECT ON battles.battles_list TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/163-alliance-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/163-alliance-functions.sql new file mode 100644 index 0000000..dcb5245 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/163-alliance-functions.sql @@ -0,0 +1,354 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Alliance views and management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Alliances public information +-- + +CREATE VIEW emp.alliances_public + AS SELECT a.id AS id , a.tag AS tag , a.name AS name , + a.leader_id AS leader_id , n.name AS leader_name , + count( p.* ) AS planets + FROM emp.alliances a + INNER JOIN naming.empire_names n + ON n.id = a.leader_id + LEFT OUTER JOIN emp.alliance_members am + ON am.alliance_id = a.id AND NOT am.is_pending + LEFT OUTER JOIN emp.planets p + ON p.empire_id = am.empire_id + GROUP BY a.id , a.tag , a.name , a.leader_id , n.name; + +GRANT SELECT ON emp.alliances_public TO :dbuser; + + + +-- +-- Alliance members / pending requests +-- + +CREATE VIEW emp.alliance_membership + AS SELECT a.alliance_id AS alliance , a.empire_id AS id , + n.name AS name , a.is_pending AS pending + FROM emp.alliance_members a + INNER JOIN naming.empire_names n + ON n.id = a.empire_id + ORDER BY n.name; + +GRANT SELECT ON emp.alliance_membership TO :dbuser; + + + +-- +-- Alliance planets +-- + +CREATE VIEW emp.alliance_planets + AS SELECT a.alliance_id AS alliance , + a.empire_id AS owner_id , en.name AS owner_name , + s.x AS x , s.y AS y , p.orbit AS orbit , + ep.planet_id AS planet_id , pn.name AS planet_name , + ( bcs IS NOT NULL ) AS battle , bcs.defence , bcs.attack + FROM emp.alliance_members a + INNER JOIN naming.empire_names en ON en.id = a.empire_id + INNER JOIN emp.planets ep ON ep.empire_id = a.empire_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN verse.systems s ON s.id = p.system_id + INNER JOIN naming.map_names pn ON pn.id = ep.planet_id + LEFT OUTER JOIN battles.current_status bcs ON bcs.location = p.name_id + WHERE NOT a.is_pending + ORDER BY en.name , s.x , s.y , p.orbit; + +GRANT SELECT ON emp.alliance_planets TO :dbuser; + + +-- +-- Creates an alliance +-- +-- Parameters: +-- e_id Empire identifier +-- a_tag Alliance tag +-- a_name Alliance name +-- +-- Returns: +-- a_id Alliance identifier (NULL on failure) +-- + +CREATE OR REPLACE FUNCTION emp.create_alliance( e_id INT , a_tag TEXT , a_name TEXT , OUT a_id INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + BEGIN + INSERT INTO emp.alliances ( tag , name , leader_id ) + VALUES ( a_tag , a_name , e_id ) + RETURNING id INTO a_id; + EXCEPTION + WHEN unique_violation THEN + a_id := NULL; + RETURN; + END; + + BEGIN + INSERT INTO emp.alliance_members ( alliance_id , empire_id , is_pending ) + VALUES ( a_id , e_id , FALSE ); + EXCEPTION + WHEN unique_violation THEN + DELETE FROM emp.alliances WHERE id = a_id; + a_id := NULL; + RETURN; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.create_alliance( INT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Requests to join an alliance +-- +-- Parameters: +-- e_id Empire identifier +-- a_id Alliance identifier +-- +-- Returns: +-- success Whether the operation was successful or not +-- + +CREATE OR REPLACE FUNCTION emp.join_alliance( e_id INT , a_id INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO emp.alliance_members( empire_id , alliance_id ) + VALUES ( e_id , a_id ); + DELETE FROM emp.enemy_alliances + WHERE empire_id = e_id AND alliance_id = a_id; + PERFORM events.alliance_request_event( a_id , e_id ); + PERFORM msgs.deliver_internal( ); + success := TRUE; +EXCEPTION + WHEN unique_violation THEN + success := FALSE; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.join_alliance( INT , INT ) TO :dbuser; + + + +-- +-- Removes an empire's pending alliance membership +-- +-- Parameters: +-- e_id Empire identifier +-- + +CREATE OR REPLACE FUNCTION emp.cancel_join( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + DELETE FROM emp.alliance_members WHERE empire_id = $1 AND is_pending; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION emp.cancel_join( INT ) TO :dbuser; + + + +-- +-- Leave an alliance +-- +-- Parameters: +-- e_id Empire identifier +-- + +CREATE OR REPLACE FUNCTION emp.leave_alliance( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + l_id INT; + a_id INT; +BEGIN + SELECT INTO a_id , l_id a.id , a.leader_id + FROM emp.alliance_members m + INNER JOIN emp.alliances a ON a.id = m.alliance_id + WHERE m.empire_id = e_id AND NOT m.is_pending + FOR UPDATE; + + IF FOUND THEN + IF l_id = e_id THEN + PERFORM events.alliance_disband_event( a_id ); + DELETE FROM emp.alliances WHERE id = a_id; + ELSE + DELETE FROM emp.alliance_members WHERE empire_id = e_id; + PERFORM events.alliance_quit_event( a_id , e_id ); + END IF; + PERFORM msgs.deliver_internal( ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.leave_alliance( INT ) TO :dbuser; + + + +-- +-- Transfer alliance leadership +-- +-- Parameters: +-- e_id Empire identifier of an alliance's leader +-- to_id Empire identifier of the alliance member who is being made the new leader +-- + +CREATE OR REPLACE FUNCTION emp.transfer_leadership( e_id INT , to_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_id INT; +BEGIN + SELECT INTO a_id a.id + FROM emp.alliance_members m + INNER JOIN emp.alliances a ON a.id = m.alliance_id AND a.leader_id = e_id + WHERE m.empire_id = to_id AND NOT m.is_pending + FOR UPDATE; + + IF FOUND THEN + UPDATE emp.alliances SET leader_id = to_id WHERE id = a_id; + PERFORM events.alliance_lchange_event( a_id , e_id ); + PERFORM msgs.deliver_internal( ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.transfer_leadership( INT , INT ) TO :dbuser; + + + +-- +-- Accept new members into an alliance +-- +-- Parameters: +-- e_id Empire identifier +-- r_ids Requests to accept +-- + +CREATE OR REPLACE FUNCTION emp.accept_members( e_id INT , r_ids INT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_id INT; + re_id INT; +BEGIN + SELECT INTO a_id id FROM emp.alliances WHERE leader_id = e_id FOR UPDATE; + IF NOT FOUND THEN + RETURN; + END IF; + + FOR re_id IN SELECT m.empire_id FROM emp.alliance_members m + INNER JOIN unnest( r_ids ) rid ON m.empire_id = rid + WHERE m.is_pending + LOOP + PERFORM events.alliance_response_event( a_id , re_id , TRUE ); + END LOOP; + PERFORM msgs.deliver_internal( ); + + UPDATE emp.alliance_members SET is_pending = FALSE + WHERE alliance_id = a_id AND empire_id IN ( SELECT * FROM unnest( r_ids ) ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.accept_members( INT , INT[] ) TO :dbuser; + + + +-- +-- Reject membership requests +-- +-- Parameters: +-- e_id Empire identifier +-- r_ids Requests to reject +-- + +CREATE OR REPLACE FUNCTION emp.reject_members( e_id INT , r_ids INT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_id INT; + re_id INT; +BEGIN + SELECT INTO a_id id FROM emp.alliances WHERE leader_id = e_id FOR UPDATE; + IF NOT FOUND THEN + RETURN; + END IF; + + FOR re_id IN SELECT m.empire_id FROM emp.alliance_members m + INNER JOIN unnest( r_ids ) rid ON m.empire_id = rid + WHERE m.is_pending + LOOP + PERFORM events.alliance_response_event( a_id , re_id , FALSE ); + END LOOP; + PERFORM msgs.deliver_internal( ); + + DELETE FROM emp.alliance_members + WHERE alliance_id = a_id AND is_pending + AND empire_id IN ( SELECT * FROM unnest( r_ids ) ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.reject_members( INT , INT[] ) TO :dbuser; + + + +-- +-- Kick members from an alliance +-- +-- Parameters: +-- e_id Empire identifier +-- kick_ids Requests to reject +-- + +CREATE OR REPLACE FUNCTION emp.kick_members( e_id INT , kick_ids INT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_id INT; + k_id INT; +BEGIN + SELECT INTO a_id id FROM emp.alliances WHERE leader_id = e_id FOR UPDATE; + IF NOT FOUND THEN + RETURN; + END IF; + + FOR k_id IN SELECT m.empire_id FROM emp.alliance_members m + INNER JOIN unnest( kick_ids ) rid ON m.empire_id = rid + WHERE NOT m.is_pending + LOOP + PERFORM events.alliance_kick_event( a_id , k_id ); + END LOOP; + PERFORM msgs.deliver_internal( ); + + DELETE FROM emp.alliance_members + WHERE alliance_id = a_id AND NOT is_pending + AND empire_id IN ( SELECT * FROM unnest( kick_ids ) ) + AND empire_id <> e_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION emp.kick_members( INT , INT[] ) TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/165-fleets-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/165-fleets-functions.sql new file mode 100644 index 0000000..f7d802c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/165-fleets-functions.sql @@ -0,0 +1,1497 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Fleets views and management functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Merges two fleets' ships into the first fleet +-- /!\ The second fleet is *not* deleted. /!\ +-- +-- Parameters: +-- mt_id Merge target identifier +-- ms_id Merge source identifier +-- + +CREATE OR REPLACE FUNCTION fleets.merge_ships( mt_id BIGINT , ms_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + CREATE TEMPORARY TABLE flt_merge( LIKE fleets.ships ); + + INSERT INTO flt_merge (fleet_id , ship_id , amount , damage ) + SELECT mt_id , s.ship_id , sum( s.amount ) , sum( s.damage ) + FROM fleets.ships s + WHERE s.fleet_id IN ( mt_id , ms_id ) + GROUP BY s.ship_id; + + DELETE FROM fleets.ships WHERE fleet_id = mt_id; + INSERT INTO fleets.ships SELECT * FROM flt_merge; + + DROP TABLE flt_merge; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute duration of in-system movement +-- +-- Source and destination "orbits" are actually real numbers, which indicate a fleet's +-- current location. Orbit 5.5 is the system's outer limit, therefore the range for +-- these numbers is [1;5.5]. +-- +-- Parameters: +-- f_time Fleet flight time +-- s_orbit Source orbit +-- d_orbit Destination orbit +-- +-- Returns: +-- the in-system movement's duration +-- + +CREATE OR REPLACE FUNCTION fleets.compute_insystem_duration( f_time INT , s_orbit REAL , d_orbit REAL ) + RETURNS INT + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + tm INT; +BEGIN + tm := round( abs( s_orbit - d_orbit ) * 2.0 * f_time ); + RETURN ( CASE WHEN tm = 0 THEN 1 ELSE tm END ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute duration of outer space movement +-- +-- Parameters: +-- f_time Fleet flight time +-- s_x Source X coordinate +-- s_y Source Y coordinate +-- d_x Destination X coordinate +-- d_y Destination Y coordinate +-- +-- Returns: +-- the outer space movement's duration +-- + +CREATE OR REPLACE FUNCTION fleets.compute_outerspace_duration( f_time INT , s_x REAL , s_y REAL , d_x REAL , d_y REAL ) + RETURNS INT + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + tm INT; +BEGIN + tm := round( sqrt( ( s_x - d_x ) ^ 2 + ( s_y - d_y ) ^ 2 ) * f_time * 15.0 ); + RETURN ( CASE WHEN tm = 0 THEN 1 ELSE tm END ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute the current orbit of a fleet flying in a system +-- +-- Parameters: +-- f_time Fleet flight time +-- rp_orbit Orbit of the reference point +-- outwards Whether the fleet is moving outwards or inwards +-- past_rp Whether the fleet has passed the reference point or not +-- ft_left Remaining flight time +-- +-- Returns; +-- The real number indicating the fleet's position +-- + +CREATE OR REPLACE FUNCTION fleets.compute_current_orbit( + f_time INT , rp_orbit INT , outwards BOOLEAN , past_rp BOOLEAN , ft_left INT ) + RETURNS REAL + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + dist REAL; + dir REAL; + rloc REAL; +BEGIN + dist := 1.0 - ft_left::REAL / f_time::REAL; + dir := ( CASE WHEN outwards THEN 0.5 ELSE -0.5 END ); + IF past_rp THEN + rloc := rp_orbit; + ELSEIF outwards THEN + rloc := rp_orbit - 0.5; + ELSE + rloc := rp_orbit + 0.5; + END IF; + RETURN rloc + dir * dist; +END; +$$ LANGUAGE plpgsql; + + + + +-- +-- Compute the current coordinates of a fleet flying in outer space +-- +-- Parameters: +-- f_time Fleet flight time +-- s_x Source X coordinate +-- s_y Source Y coordinate +-- d_x Destination X coordinate +-- d_y Destination Y coordinate +-- r_time Remaining flight time +-- +-- Returns: +-- c_x Current X coordinate +-- c_y Current Y coordinate +-- + +CREATE OR REPLACE FUNCTION fleets.compute_current_location( + f_time INT , s_x REAL , s_y REAL , d_x REAL , d_y REAL , r_time INT , + OUT c_x REAL , OUT c_y REAL ) + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + tot_time REAL; +BEGIN + tot_time := fleets.compute_outerspace_duration( f_time , s_x , s_y , d_x , d_y ); + c_x := s_x + ( d_x - s_x ) * ( 1 - r_time / tot_time ); + c_y := s_y + ( d_y - s_y ) * ( 1 - r_time / tot_time ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute the duration and direction for a planet-to-planet flight +-- +-- /!\ Marked as immutable, but does in fact query the DB. Planets don't move around. +-- +-- Parameters: +-- f_time Fleet flight time +-- s_id Source planet identifier +-- d_id Destination planet identifier +-- +-- Returns: +-- duration Flight duration +-- direction Whether the fleet is moving inwards (FALSE) or outwards (TRUE) +-- + +CREATE OR REPLACE FUNCTION fleets.compute_flight_init( + f_time INT , s_id INT , d_id INT , + OUT duration INT , OUT direction BOOLEAN ) + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + s_rec RECORD; + d_rec RECORD; +BEGIN + IF s_id = d_id THEN + RETURN; + END IF; + + -- Get source planet coordinates, orbit and system ID + SELECT INTO s_rec s.x AS x , s.y AS y , p.orbit AS orbit , s.id AS sid + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = s_id; + + -- Get destination planet coordinates, orbit and system ID + SELECT INTO d_rec s.x AS x , s.y AS y , p.orbit AS orbit , s.id AS sid + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = d_id; + + IF s_rec.sid = d_rec.sid THEN + -- Movement in the same system + duration := fleets.compute_insystem_duration( f_time , s_rec.orbit , d_rec.orbit ); + direction := ( d_rec.orbit > s_rec.orbit ); + ELSE + -- Movement to another system + duration := fleets.compute_insystem_duration( f_time , s_rec.orbit , 5.5 ) + + fleets.compute_insystem_duration( f_time , d_rec.orbit , 5.5 ) + + fleets.compute_outerspace_duration( f_time , s_rec.x , s_rec.y , d_rec.x , d_rec.y ); + direction := TRUE; + END IF; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute a flight's duration from an in-system redirection +-- +-- /!\ Marked as immutable, but does in fact query the DB. Planets don't move around. +-- +-- Parameters: +-- f_time Fleet flight time +-- s_sys Source system +-- s_orbit Source "orbit" as a real number +-- d_id Destination planet +-- +-- Returns: +-- duration Flight duration +-- direction Whether the fleet is moving inwards (FALSE) or outwards (TRUE) +-- s_duration State duration +-- ref_point Reference point +-- past_rp Whether the fleet has passed the reference point or is moving +-- towards it +-- + +CREATE OR REPLACE FUNCTION fleets.compute_insystem_redirect( + f_time INT , s_sys INT , s_orbit REAL , d_id INT , + OUT duration INT , OUT direction BOOLEAN , OUT s_duration INT , + OUT ref_point INT , OUT past_rp BOOLEAN ) + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + s_rec RECORD; + d_rec RECORD; + torb REAL; + rporb INT; +BEGIN + -- Get destination planet coordinates, orbit and system ID + SELECT INTO d_rec s.x AS x , s.y AS y , p.orbit AS orbit , s.id AS sid + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = d_id; + + IF d_rec.sid = s_sys THEN + -- Movement in the same system + duration := fleets.compute_insystem_duration( f_time , s_orbit , d_rec.orbit ); + direction := ( d_rec.orbit > s_orbit ); + ELSE + -- Movement to another system + SELECT INTO s_rec x , y FROM verse.systems WHERE id = s_sys; + duration := fleets.compute_insystem_duration( f_time , s_orbit , 5.5 ) + + fleets.compute_insystem_duration( f_time , d_rec.orbit , 5.5 ) + + fleets.compute_outerspace_duration( f_time , s_rec.x , s_rec.y , d_rec.x , d_rec.y ); + direction := TRUE; + END IF; + + -- Compute state duration and reference point + IF s_orbit::NUMERIC % 0.5 = 0 THEN + s_duration := f_time; + past_rp := ( s_orbit::NUMERIC % 1 = 0); + rporb := ( CASE WHEN direction THEN ceil( s_orbit ) ELSE floor( s_orbit ) END ); + ELSE + torb := s_orbit * 2; + IF direction THEN + torb := ceil( torb ); + ELSE + torb := floor( torb ); + END IF; + s_duration := fleets.compute_insystem_duration( f_time , s_orbit , ( torb / 2 )::REAL ); + rporb := round( s_orbit ); + past_rp := ( CASE WHEN direction THEN ( rporb::REAL <= s_orbit ) ELSE ( rporb::REAL >= s_orbit ) END ); + END IF; + SELECT INTO ref_point name_id FROM verse.planets p + WHERE p.system_id = s_sys AND orbit = rporb; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Compute a flight's duration from an outer space redirection +-- +-- /!\ Marked as immutable, but does in fact query the DB. Planets don't move around. +-- +-- Parameters: +-- f_time Fleet flight time +-- s_x Source X coordinate +-- s_y Source Y coordinate +-- d_id Destination planet +-- +-- Returns: +-- duration Flight duration +-- s_duration State duration +-- + +CREATE OR REPLACE FUNCTION fleets.compute_outerspace_redirect( + f_time INT , s_x REAL , s_y REAL , d_id INT , + OUT duration INT , OUT s_duration INT ) + STRICT IMMUTABLE + SECURITY INVOKER + AS $$ +DECLARE + s_rec RECORD; + d_rec RECORD; +BEGIN + -- Get destination planet coordinates, orbit and system ID + SELECT INTO d_rec s.x AS x , s.y AS y , p.orbit AS orbit , s.id AS sid + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = d_id; + + s_duration := fleets.compute_outerspace_duration( f_time , s_x , s_y , d_rec.x , d_rec.y ); + duration := fleets.compute_insystem_duration( f_time , d_rec.orbit , 5.5 ) + s_duration; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Give movement orders to a set of fleets +-- +-- Parameters: +-- emp_id Expected owner identifier +-- fleet_ids Array of fleet identifiers +-- dest_id Destination planet +-- + +CREATE OR REPLACE FUNCTION fleets.set_movement_orders( emp_id INT , fleet_ids BIGINT[] , dest_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + dur INT; + s_dur INT; + dir BOOLEAN; + rpid INT; + prp BOOLEAN; + cx REAL; + cy REAL; +BEGIN + -- Lock fleets and planets + PERFORM * FROM fleets.fleets f + INNER JOIN emp.empires e ON e.name_id = f.owner_id + INNER JOIN verse.planets p ON f.location_id = p.name_id + WHERE f.id = ANY( fleet_ids ) AND f.status = 'AVAILABLE' + AND e.name_id = emp_id AND f.location_id <> dest_id + FOR UPDATE OF p , f; + + FOR rec IN SELECT f.id AS id , f.location_id AS location , + fs.flight_time AS flight_time , b.id AS battle , + p.orbit AS orbit , s.x AS x , s.y AS y , + m.time_left AS mv_time , m.state_time_left AS mv_state_time , + osms.start_x AS os_start_x , osms.start_y AS os_start_y , + isms.ref_point_id AS is_ref_point , isms.outwards AS is_outwards , + isms.past_ref_point AS is_past_ref_point , + rp.system_id AS is_ref_point_system , rp.orbit AS is_ref_point_orbit + FROM fleets.fleets f + INNER JOIN emp.empires e ON e.name_id = f.owner_id + INNER JOIN verse.planets p ON f.location_id = p.name_id + INNER JOIN verse.systems s ON s.id = p.system_id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN battles.battles b + ON b.location_id = f.location_id AND b.last_tick IS NULL + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + LEFT OUTER JOIN fleets.ms_space osms ON osms.movement_id = f.id + LEFT OUTER JOIN fleets.ms_system isms ON isms.movement_id = f.id + LEFT OUTER JOIN verse.planets rp ON isms.ref_point_id = rp.name_id + WHERE f.id = ANY( fleet_ids ) AND f.status = 'AVAILABLE' + AND e.name_id = emp_id AND f.location_id <> dest_id + LOOP + IF rec.mv_time IS NULL THEN + -- New fleet movement + SELECT INTO dur, dir duration , direction + FROM fleets.compute_flight_init( rec.flight_time , rec.location , dest_id ); + INSERT INTO fleets.movements ( fleet_id , source_id, time_left , state_time_left ) + VALUES ( rec.id , rec.location , dur , rec.flight_time ); + INSERT INTO fleets.ms_system( movement_id , ref_point_id , outwards , past_ref_point ) + VALUES ( rec.id , rec.location , dir , TRUE ); + UPDATE fleets.fleets SET location_id = dest_id + WHERE id = rec.id; + + -- Remove fleet from battle (if there is one) + PERFORM battles.remove_fleet( rec.battle , rec.id , 'DEPART'::battle_fleet_change , sys.get_tick() ); + ELSE + -- Fleet redirection + IF rec.is_ref_point IS NULL THEN + -- Fleet moving in outer space + PERFORM sys.write_log( 'Fleets' , 'TRACE'::log_level , 'About to perform outer space redirect; ' + || 'OOFT/2 = ' || rec.flight_time || '; start(x;y)= (' || rec.os_start_x || ';' || rec.os_start_y + || '); dest(x;y)= (' || rec.x || ';' || rec.y || '); time left: ' || rec.mv_state_time ); + SELECT INTO cx , cy c_x , c_y FROM fleets.compute_current_location( + rec.flight_time , rec.os_start_x , rec.os_start_y , rec.x , rec.y , + rec.mv_state_time ); + PERFORM sys.write_log( 'Fleets' , 'TRACE'::log_level , 'Computed current coordinates: (' || cx + || ';' || cy || ')' ); + SELECT INTO dur , s_dur duration , s_duration + FROM fleets.compute_outerspace_redirect( rec.flight_time , cx , cy , dest_id ); + PERFORM sys.write_log( 'Fleets' , 'TRACE'::log_level , 'Computed new total/state duration: ' + || dur || ' / ' || s_dur ); + UPDATE fleets.ms_space SET start_x = cx , start_y = cy + WHERE movement_id = rec.id; + ELSE + -- Fleet moving in a system + cx := fleets.compute_current_orbit( rec.flight_time , rec.is_ref_point_orbit , rec.is_outwards , + rec.is_past_ref_point , rec.mv_state_time ); + SELECT INTO dur, dir , s_dur , rpid , prp duration , direction , s_duration , ref_point , past_rp + FROM fleets.compute_insystem_redirect( rec.flight_time , rec.is_ref_point_system , cx , dest_id ); + UPDATE fleets.ms_system SET ref_point_id = rpid , outwards = dir , past_ref_point = prp + WHERE movement_id = rec.id; + END IF; + + UPDATE fleets.movements SET time_left = dur , state_time_left = s_dur + WHERE fleet_id = rec.id; + UPDATE fleets.fleets + SET status = 'REDIRECTING' , + penalty = rec.flight_time * 2 , + location_id = dest_id + WHERE id = rec.id; + END IF; + END LOOP; + + -- Prepare fleet departure events + CREATE TEMPORARY TABLE fleet_departures( + loc_id INT , + loc_name VARCHAR(20) , + own_id INT , + own_name VARCHAR(20) , + name VARCHAR(64) , + power BIGINT , + mode BOOLEAN + ) ON COMMIT DROP; + INSERT INTO fleet_departures + SELECT fm.source_id , sn.name , f.owner_id , fon.name , + f.name , fs.power , f.attacking + FROM fleets.fleets f + INNER JOIN fleets.stats_view fs ON fs.id = f.id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN naming.map_names sn ON sn.id = fm.source_id + INNER JOIN naming.empire_names fon ON fon.id = f.owner_id + WHERE f.id = ANY( fleet_ids ) AND f.owner_id = emp_id AND f.status = 'AVAILABLE'; + PERFORM events.commit_fleet_departures( ); + PERFORM msgs.deliver_internal( ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Fleet movement command +-- +-- Parameters: +-- emp_id Identifier of the empire who supposedly owns the fleets +-- fleet_ids List of fleets to order around +-- dest Name of the destination +-- +-- Returns: +-- success Whether the destination was found or not. +-- + +CREATE OR REPLACE FUNCTION fleets.move_fleets( emp_id INT , fleet_ids BIGINT[] , dest TEXT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + dest_id INT; +BEGIN + SELECT INTO dest_id id FROM naming.map_names + WHERE lower( name ) = lower(dest); + success := FOUND; + + IF success THEN + PERFORM fleets.set_movement_orders( emp_id , fleet_ids , dest_id ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.move_fleets( INT , BIGINT[] , TEXT ) TO :dbuser; + + + +-- +-- Renames a set of fleets +-- +-- Parameters: +-- emp_id Identifier of the empire who supposedly owns the fleets +-- fleet_ids List of fleets to rename +-- n_name New name +-- + +CREATE OR REPLACE FUNCTION fleets.rename_fleets( emp_id INT , fleet_ids BIGINT[] , n_name TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE fleets.fleets + SET name = ( CASE WHEN $3 = '' THEN NULL ELSE $3 END ) + WHERE owner_id = $1 + AND id IN ( SELECT unnest AS id FROM unnest( $2 ) ); +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION fleets.rename_fleets( INT , BIGINT[] , TEXT ) TO :dbuser; + + + +-- +-- Prepares a fleet splitting command +-- +-- Parameters: +-- f_id Fleet identifier +-- n_fleets Amount of fleets to create +-- nnm New name for the fleets +-- +-- Returns: +-- success Whether the operation was successful +-- + +CREATE OR REPLACE FUNCTION fleets.init_split( f_id BIGINT , n_fleets INT , nnm TEXT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + o_name TEXT; + ifm BOOLEAN; + att BOOLEAN; + loc INT; + own INT; +BEGIN + IF n_fleets < 1 THEN + success := FALSE; + RETURN; + END IF; + + SELECT INTO o_name , ifm , loc , att , own + f.name , ( m.fleet_id IS NOT NULL ) , f.location_id , f.attacking , f.owner_id + FROM fleets.fleets f + INNER JOIN emp.empires e ON e.name_id = f.owner_id + INNER JOIN verse.planets p ON p.name_id = f.location_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.id = f_id + FOR UPDATE OF f , e , p; + success := FOUND; + IF NOT success THEN + RETURN; + END IF; + + CREATE TEMPORARY TABLE fleet_split_main ( + fleet_id BIGINT , + fleets INT , + location INT , + owner INT , + attacking BOOLEAN , + new_name VARCHAR(40) , + moving BOOLEAN + ) ON COMMIT DROP; + INSERT INTO fleet_split_main + VALUES ( f_id , n_fleets , loc , own , att , (CASE WHEN nnm = '' THEN o_name ELSE nnm END ) , ifm ); + + CREATE TEMPORARY TABLE fleet_split_ships ( + ship_type INT , + initial_amount INT , + split_amount INT + ) ON COMMIT DROP; + INSERT INTO fleet_split_ships + SELECT ship_id , amount , 0::INT + FROM fleets.ships + WHERE fleet_id = f_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.init_split( BIGINT , INT , TEXT ) TO :dbuser; + + + +-- +-- Sets the amount of ships of a given type to split off. +-- +-- Parameters: +-- st_id Ship type identifier +-- n_ships Amount +-- + +CREATE OR REPLACE FUNCTION fleets.set_split_ships( st_id INT , n_ships INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE fleet_split_ships + SET split_amount = n_ships + WHERE ship_type = st_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.set_split_ships( INT , INT ) TO :dbuser; + + + +-- +-- Verifies a fleet split command information +-- + +CREATE OR REPLACE FUNCTION fleets.check_split() + RETURNS BOOLEAN + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + n_fleets INT; + ssum INT; + nsum INT; + rec RECORD; +BEGIN + SELECT INTO n_fleets fleets FROM fleet_split_main; + ssum := 0; + nsum := 0; + FOR rec IN SELECT initial_amount , split_amount FROM fleet_split_ships + LOOP + IF rec.split_amount < 0 OR rec.split_amount * n_fleets > rec.initial_amount THEN + RETURN FALSE; + END IF; + ssum := ssum + rec.initial_amount - rec.split_amount * n_fleets; + nsum := nsum + rec.split_amount; + END LOOP; + RETURN ( ssum > 0 AND nsum > 0 ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Executes a fleet split command information +-- + +CREATE OR REPLACE FUNCTION fleets.split_fleet( ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + main RECORD; + i INT; + nf_id BIGINT; + mv_rec fleets.movements%ROWTYPE; + ism_rec fleets.ms_system%ROWTYPE; + osm_rec fleets.ms_space%ROWTYPE; + old_ft INT; + new_ft INT; + sp_ft INT; + x REAL; + y REAL; + cx REAL; + cy REAL; + sid INT; +BEGIN + SELECT INTO main * FROM fleet_split_main; + + -- Cache trajectory + IF main.moving THEN + SELECT INTO mv_rec * FROM fleets.movements WHERE fleet_id = main.fleet_id; + SELECT INTO ism_rec * FROM fleets.ms_system WHERE movement_id = main.fleet_id; + SELECT INTO osm_rec * FROM fleets.ms_space WHERE movement_id = main.fleet_id; + SELECT INTO old_ft flight_time FROM fleets.stats_view WHERE id = main.fleet_id; + END IF; + + -- Update existing fleet + UPDATE fleets.ships s + SET amount = amount - fss.split_amount * main.fleets + FROM fleet_split_ships fss + WHERE fleet_id = main.fleet_id AND s.ship_id = fss.ship_type; + DELETE FROM fleets.ships WHERE fleet_id = main.fleet_id AND amount = 0; + + -- Did the speed change? + IF main.moving THEN + SELECT INTO new_ft flight_time FROM fleets.stats_view WHERE id = main.fleet_id; + IF new_ft <> old_ft THEN + IF ism_rec IS NULL THEN + -- Outer space movement + SELECT INTO x , y s.x::REAL , s.y::REAL + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = main.location; + SELECT INTO cx , cy c_x , c_y FROM fleets.compute_current_location( + old_ft , osm_rec.start_x , osm_rec.start_y , x , y , + mv_rec.state_time_left ); + UPDATE fleets.ms_space + SET start_x = cx , start_y = cy + WHERE movement_id = main.fleet_id; + UPDATE fleets.movements m + SET time_left = r.duration , state_time_left = r.s_duration + FROM fleets.compute_outerspace_redirect( new_ft , cx , cy , main.location ) r + WHERE m.fleet_id = main.fleet_id; + ELSE + -- System movement + SELECT INTO y , sid orbit , system_id + FROM verse.planets + WHERE name_id = ism_rec.ref_point_id; + x := fleets.compute_current_orbit( old_ft , y::INT , ism_rec.outwards , + ism_rec.past_ref_point , mv_rec.state_time_left ); + UPDATE fleets.movements m + SET time_left = r.duration , state_time_left = r.s_duration + FROM fleets.compute_insystem_redirect( new_ft , sid , x , main.location ) r + WHERE m.fleet_id = main.fleet_id; + END IF; + END IF; + END IF; + + sp_ft := NULL; + FOR i IN 1 .. main.fleets + LOOP + -- Main fleet record + INSERT INTO fleets.fleets ( owner_id , location_id , name , attacking , status , penalty ) + VALUES ( main.owner , main.location , main.new_name , main.attacking , 'AVAILABLE' , 0 ) + RETURNING id INTO nf_id; + + -- Fleet ships + INSERT INTO fleets.ships ( fleet_id , ship_id , amount , damage ) + SELECT nf_id , s.ship_type , s.split_amount , 0 + FROM fleet_split_ships s + WHERE s.split_amount > 0; + + IF main.moving THEN + IF sp_ft IS NULL THEN + SELECT INTO sp_ft flight_time FROM fleets.stats_view WHERE id = nf_id; + IF sp_ft <> old_ft THEN + IF ism_rec IS NULL THEN + -- Outer space movement + SELECT INTO x , y s.x::REAL , s.y::REAL + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = main.location; + SELECT INTO cx , cy c_x , c_y FROM fleets.compute_current_location( + old_ft , osm_rec.start_x , osm_rec.start_y , x , y , + mv_rec.state_time_left ); + osm_rec.start_x := cx; + osm_rec.start_y := cy; + SELECT INTO mv_rec.time_left , mv_rec.state_time_left + duration , s_duration + FROM fleets.compute_outerspace_redirect( sp_ft , cx , cy , main.location ); + ELSE + -- System movement + SELECT INTO y , sid orbit , system_id + FROM verse.planets + WHERE name_id = ism_rec.ref_point_id; + x := fleets.compute_current_orbit( old_ft , y::INT , ism_rec.outwards , + ism_rec.past_ref_point , mv_rec.state_time_left ); + SELECT INTO mv_rec.time_left , mv_rec.state_time_left + duration , s_duration + FROM fleets.compute_insystem_redirect( sp_ft , sid , x , main.location ); + END IF; + END IF; + END IF; + + -- Insert fleet movement records + INSERT INTO fleets.movements ( fleet_id , source_id , time_left , state_time_left ) + VALUES ( nf_id , mv_rec.source_id , mv_rec.time_left , mv_rec.state_time_left ); + IF ism_rec IS NULL THEN + INSERT INTO fleets.ms_space ( movement_id , start_x , start_y ) + VALUES ( nf_id , osm_rec.start_x , osm_rec.start_y ); + ELSE + INSERT INTO fleets.ms_system ( movement_id , ref_point_id , outwards , past_ref_point ) + VALUES ( nf_id , ism_rec.ref_point_id , ism_rec.outwards , ism_rec.past_ref_point ); + END IF; + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Finalises a fleet split command +-- +-- Parameters: +-- simulate Whether the split command was only being simulated +-- +-- Returns: +-- success Whether the operation was / would have been successful +-- + +CREATE OR REPLACE FUNCTION fleets.execute_split( simulate BOOLEAN , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + success := fleets.check_split(); + IF success AND NOT simulate THEN + PERFORM fleets.split_fleet(); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.execute_split( BOOLEAN ) TO :dbuser; + + + +-- +-- Set fleet mode +-- +-- Parameters: +-- e_id Empire who supposedly owns the fleets +-- f_ids Fleet identifiers +-- att Whether the fleets are to be set to attack +-- + +CREATE OR REPLACE FUNCTION fleets.set_mode( e_id INT , f_ids BIGINT[] , att BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + rec RECORD; +BEGIN + -- Prepare events table + CREATE TEMPORARY TABLE fleet_switches( + loc_id INT , + loc_name VARCHAR(20) , + own_id INT , + own_name VARCHAR(20) , + name VARCHAR(64) , + power BIGINT , + mode BOOLEAN + ) ON COMMIT DROP; + + -- Lock records + PERFORM f.id FROM fleets.fleets f + INNER JOIN verse.planets p ON p.name_id = f.location_id + INNER JOIN unnest( f_ids ) fid ON f.id = fid + WHERE f.owner_id = e_id AND f.attacking <> att + FOR UPDATE OF f , p; + + -- Handle moving fleets + UPDATE fleets.fleets f SET attacking = att + FROM fleets.movements m + WHERE f.owner_id = e_id AND f.id IN ( SELECT * FROM unnest( f_ids ) ) + AND m.fleet_id = f.id AND f.attacking <> att; + + -- Handle fleets on planets + FOR rec IN SELECT DISTINCT f.location_id AS location , ep.empire_id AS planet_owner , + b.id AS battle , ( el.enemy IS NOT NULL ) AS enemy , + ( v.status = 'PROCESSED' AND b.id IS NULL ) AS on_vacation + FROM fleets.fleets f + INNER JOIN unnest( f_ids ) fid ON f.id = fid + LEFT OUTER JOIN battles.battles b + ON b.location_id = f.location_id AND b.last_tick IS NULL + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + LEFT OUTER JOIN emp.planets ep ON ep.planet_id = f.location_id + LEFT OUTER JOIN emp.enemies el + ON el.empire = ep.empire_id AND el.enemy = e_id + LEFT OUTER JOIN naming.empire_names en ON en.id = ep.empire_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + WHERE f.owner_id = e_id AND m.fleet_id IS NULL AND f.attacking <> att + LOOP + -- Can't switch on own planets, on planets whose owner have the fleets' owner in their EL + -- or on planets which have entered vacation mode + CONTINUE WHEN e_id = rec.planet_owner OR rec.enemy OR rec.on_vacation; + + -- Prepare events + INSERT INTO fleet_switches + SELECT f.location_id , ln.name , f.owner_id , fon.name , + f.name , fs.power , att + FROM fleets.fleets f + INNER JOIN emp.planets ep ON f.location_id = ep.planet_id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + INNER JOIN naming.map_names ln ON ln.id = f.location_id + INNER JOIN naming.empire_names fon ON fon.id = f.owner_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.owner_id = e_id AND f.location_id = rec.location + AND m.fleet_id IS NULL; + + -- Set fleets mode + UPDATE fleets.fleets f + SET attacking = att , + status = 'REDEPLOYING' , + penalty = ( CASE + WHEN f2.penalty > ( 1 + fs.flight_time * ( CASE WHEN att THEN 40 ELSE 10 END ) ) + THEN f2.penalty + ELSE ( 1 + fs.flight_time * ( CASE WHEN att THEN 40 ELSE 10 END ) ) + END ) + FROM fleets.fleets f2 + INNER JOIN fleets.stats_view fs ON fs.id = f2.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f2.id + WHERE f2.owner_id = e_id AND f2.location_id = rec.location + AND m.fleet_id IS NULL AND f2.id = f.id; + + -- Update battle + PERFORM battles.set_mode( rec.battle , e_id , att ); + END LOOP; + + PERFORM events.commit_fleet_switches( FALSE ); + PERFORM msgs.deliver_internal( ); + + DROP TABLE fleet_switches; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.set_mode( INT , BIGINT[] , BOOLEAN ) TO :dbuser; + + + +-- +-- Disband fleets +-- +-- Parameters: +-- e_id Empire who supposedly owns the fleets +-- f_ids Fleet identifiers +-- + +CREATE OR REPLACE FUNCTION fleets.disband( e_id INT , f_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + rec RECORD; +BEGIN + -- Lock all fleets and, if necessary, remove them from battles + FOR rec IN SELECT f.id AS fleet , + ( CASE + WHEN m.fleet_id IS NULL AND f.status <> 'DEPLOYING' THEN + b.id + ELSE + NULL + END ) AS battle + FROM fleets.fleets f + INNER JOIN unnest( f_ids ) fid ON f.id = fid + INNER JOIN verse.planets p ON p.name_id = f.location_id + LEFT OUTER JOIN battles.battles b + ON b.location_id = f.location_id AND b.last_tick IS NULL + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.owner_id = e_id + FOR UPDATE OF p , f + LOOP + PERFORM battles.remove_fleet( rec.battle , rec.fleet , 'DISBAND'::battle_fleet_change , sys.get_tick( ) ); + END LOOP; + + -- Delete fleets + DELETE FROM fleets.fleets + WHERE id IN ( SELECT * FROM unnest( f_ids ) ) AND owner_id = e_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.disband( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Inflicts battle damage to a fleet +-- +-- Parameters: +-- f_id Fleet identifier +-- dmg Damage to inflict +-- b_id Battle identifier +-- tick Current tick +-- + +CREATE OR REPLACE FUNCTION fleets.inflict_battle_damage( f_id BIGINT , dmg REAL , b_id BIGINT , tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + f_power BIGINT; + f_att BOOLEAN; + e_id INT; + bp_id BIGINT; + bf_id BIGINT; + rec RECORD; + st_dmg REAL; + n_dest INT; + found INT; + deleted INT; +BEGIN + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Inflicting ' + || dmg || ' damage to fleet #' || f_id ); + + -- Get total fleet power and battle protagonist + SELECT INTO f_power , e_id , f_att fs.power , f.owner_id , f.attacking + FROM fleets.fleets f + INNER JOIN fleets.stats_view fs USING( id ) + WHERE id = f_id; + bp_id := battles.goc_protagonist( b_id , e_id , f_att , tick ); + bf_id := NULL; + + found := 0; + deleted := 0; + FOR rec IN SELECT s.ship_id , ( s.amount * sd.power ) AS t_power , + sd.power AS s_power , s.damage AS damage , + s.amount AS amount + FROM fleets.ships s + INNER JOIN tech.ships sd ON sd.buildable_id = s.ship_id + WHERE s.fleet_id = f_id + LOOP + -- Compute ships to destroy + found := found + 1; + st_dmg := rec.damage + ( dmg * rec.t_power / f_power ) / rec.s_power; + n_dest := floor( st_dmg ); + + IF n_dest >= rec.amount THEN + -- All ships destroyed + deleted := deleted + 1; + DELETE FROM fleets.ships WHERE fleet_id = f_id AND ship_id = rec.ship_id; + n_dest := rec.amount; + ELSE + -- Inflict damage + UPDATE fleets.ships + SET amount = amount - n_dest , + damage = st_dmg - n_dest + WHERE fleet_id = f_id AND ship_id = rec.ship_id; + END IF; + + IF n_dest > 0 THEN + -- Update fleet change record + IF bf_id IS NULL THEN + bf_id := battles.goc_fleet_change( bp_id , tick , 'BATTLE'::battle_fleet_change ); + END IF; + PERFORM battles.add_fleet_change( bf_id , rec.ship_id , - n_dest ); + END IF; + END LOOP; + + -- If all ships were destroyed, delete the fleet + IF found = deleted THEN + DELETE FROM fleets.fleets WHERE id = f_id; + END IF; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Inflicts debt-related damage to all fleets of an empire +-- +-- Parameters: +-- e_id Empire identifer +-- t_upkeep Total fleet upkeep +-- debt Daily debt +-- d_ratio Debt damage ratio +-- + +CREATE OR REPLACE FUNCTION fleets.handle_debt( e_id INT , t_upkeep REAL , debt REAL , d_ratio REAL ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + tot_damage REAL; + f_rec RECORD; + s_rec RECORD; + n_found INT; + n_killed INT; + s_killed INT; + s_damage REAL; + n_ships INT; + tick BIGINT; + bp_id BIGINT; + bf_id BIGINT; + mv_rec fleets.movements%ROWTYPE; + ism_rec fleets.ms_system%ROWTYPE; + osm_rec fleets.ms_space%ROWTYPE; + x REAL; + y REAL; + cx REAL; + cy REAL; + sid INT; +BEGIN + tick := sys.get_tick( ) - 1; + tot_damage := t_upkeep * d_ratio / debt; + PERFORM sys.write_log( 'EmpireDebt' , 'DEBUG'::log_level , 'Inflicting debt damage to fleets; total upkeep: ' + || t_upkeep || ', damage ratio: ' || d_ratio || ', total damage: ' || tot_damage ); + + FOR f_rec IN SELECT f.id AS fleet , f.status , f.location_id AS location , + ( m.fleet_id IS NOT NULL ) AS moving , b.id AS battle , + fs.flight_time , f.attacking + FROM fleets.fleets f + INNER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + LEFT OUTER JOIN battles.battles b + ON b.location_id = f.location_id AND b.last_tick IS NULL + WHERE f.owner_id = e_id + FOR UPDATE OF f + LOOP + -- Get battle information + IF f_rec.battle IS NOT NULL AND NOT f_rec.moving AND f_rec.status <> 'DEPLOYING' + THEN + bp_id := battles.goc_protagonist( f_rec.battle , e_id , f_rec.attacking , tick ); + bf_id := NULL; + END IF; + + -- Damage ships + n_found := 0; + n_killed := 0; + s_killed := 0; + FOR s_rec IN SELECT s.ship_id AS ship , s.amount AS amount , s.damage AS damage , + ( d.upkeep * s.amount )::REAL AS upkeep + FROM fleets.ships s + INNER JOIN tech.buildables d ON d.name_id = s.ship_id + WHERE s.fleet_id = f_rec.fleet + LOOP + n_found := n_found + 1; + s_damage := s_rec.damage + tot_damage * s_rec.upkeep / t_upkeep; + n_ships := floor( s_damage ); + IF n_ships >= s_rec.amount + THEN + -- All ships destroyed + DELETE FROM fleets.ships WHERE fleet_id = f_rec.fleet AND ship_id = s_rec.ship; + n_killed := n_killed + 1; + s_killed := s_killed + s_rec.amount; + n_ships := s_rec.amount; + ELSE + -- Simple damage + UPDATE fleets.ships + SET amount = s_rec.amount - n_ships , + damage = s_damage - n_ships + WHERE fleet_id = f_rec.fleet AND ship_id = s_rec.ship; + s_killed := s_killed + n_ships; + END IF; + + IF n_ships > 0 AND f_rec.battle IS NOT NULL AND NOT f_rec.moving AND f_rec.status <> 'DEPLOYING' + THEN + -- Update battle + IF bf_id IS NULL THEN + bf_id := battles.goc_fleet_change( bp_id , tick , 'DISBAND'::battle_fleet_change ); + END IF; + PERFORM battles.add_fleet_change( bf_id , s_rec.ship , - n_ships ); + END IF; + END LOOP; + + -- No ships destroyed + CONTINUE WHEN s_killed = 0; + + IF n_killed = n_found + THEN + -- Destroy fleet + DELETE FROM fleets.fleets WHERE id = f_rec.fleet; + ELSEIF f_rec.moving AND n_killed > 0 + THEN + -- Flight time may have changed, update fleet accordingly + SELECT INTO n_found flight_time FROM fleets.stats_view WHERE id = f_rec.fleet; + CONTINUE WHEN n_found = f_rec.flight_time; + + -- Get movement records + SELECT INTO mv_rec * FROM fleets.movements WHERE fleet_id = f_rec.fleet; + SELECT INTO ism_rec * FROM fleets.ms_system WHERE movement_id = f_rec.fleet; + SELECT INTO osm_rec * FROM fleets.ms_space WHERE movement_id = f_rec.fleet; + + IF ism_rec IS NULL THEN + -- Outer space movement + SELECT INTO x , y s.x::REAL , s.y::REAL + FROM verse.planets p + INNER JOIN verse.systems s ON s.id = p.system_id + WHERE p.name_id = f_rec.location; + SELECT INTO cx , cy c_x , c_y FROM fleets.compute_current_location( + f_rec.flight_time , osm_rec.start_x , osm_rec.start_y , x , y , + mv_rec.state_time_left ); + UPDATE fleets.ms_space + SET start_x = cx , start_y = cy + WHERE movement_id = f_rec.fleet; + UPDATE fleets.movements m + SET time_left = r.duration , state_time_left = r.s_duration + FROM fleets.compute_outerspace_redirect( n_found , cx , cy , f_rec.location ) r + WHERE m.fleet_id = f_rec.fleet; + ELSE + -- System movement + SELECT INTO y , sid orbit , system_id + FROM verse.planets + WHERE name_id = ism_rec.ref_point_id; + x := fleets.compute_current_orbit( f_rec.flight_time , y::INT , ism_rec.outwards , + ism_rec.past_ref_point , mv_rec.state_time_left ); + UPDATE fleets.movements m + SET time_left = r.duration , state_time_left = r.s_duration + FROM fleets.compute_insystem_redirect( n_found , sid , x , f_rec.location ) r + WHERE m.fleet_id = f_rec.fleet; + END IF; + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + + +-- +-- Merge fleets +-- +-- Parameters: +-- e_id Empire who supposedly owns the fleets +-- f_ids Fleet identifiers +-- + +CREATE OR REPLACE FUNCTION fleets.merge( e_id INT , f_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + rec RECORD; +BEGIN + -- Create temporary tables + CREATE TEMPORARY TABLE merged_fleets( + location INT , + fleet BIGINT , + n_merged INT DEFAULT 1 + ) ON COMMIT DROP; + CREATE TEMPORARY TABLE merged_ships( LIKE fleets.ships ) ON COMMIT DROP; + + -- Find all fleets + FOR rec IN SELECT f.id AS fleet , f.location_id AS location + FROM fleets.fleets f + INNER JOIN unnest( f_ids ) fid ON f.id = fid + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.status = 'AVAILABLE' AND f.owner_id = e_id AND m.fleet_id IS NULL + FOR UPDATE OF f + LOOP + UPDATE merged_fleets SET n_merged = n_merged + 1 WHERE location = rec.location; + + IF FOUND THEN + -- Update existing record + UPDATE merged_ships ms + SET amount = ms.amount + s.amount , + damage = ms.damage + s.damage + FROM merged_fleets f , fleets.ships s + WHERE f.location = rec.location AND ms.fleet_id = f.fleet + AND s.fleet_id = rec.fleet AND ms.ship_id = s.ship_id; + DELETE FROM fleets.fleets WHERE id = rec.fleet; + ELSE + -- Create new record + INSERT INTO merged_fleets ( location , fleet ) + VALUES ( rec.location , rec.fleet ); + INSERT INTO merged_ships (fleet_id , ship_id , amount , damage ) + SELECT rec.fleet , s.buildable_id , 0 , 0 + FROM tech.ships s; + UPDATE merged_ships ms + SET amount = ms.amount + s.amount , + damage = ms.damage + s.damage + FROM merged_fleets f , fleets.ships s + WHERE f.location = rec.location AND ms.fleet_id = f.fleet + AND s.fleet_id = rec.fleet AND ms.ship_id = s.ship_id; + DELETE FROM fleets.ships WHERE fleet_id = rec.fleet; + END IF; + END LOOP; + + INSERT INTO fleets.ships + SELECT * FROM merged_ships WHERE amount > 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION fleets.merge( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Fleet locations list +-- + +CREATE VIEW fleets.locations_list_view + AS SELECT ep.empire_id AS empire , ep.planet_id AS location , FALSE AS attacking + FROM emp.planets ep + UNION SELECT f.owner_id AS empire , f.location_id AS location , f.attacking AS attacking + FROM fleets.fleets f + LEFT OUTER JOIN fleets.movements m + ON m.fleet_id = f.id + WHERE m.fleet_id IS NULL; + + + +-- +-- Fleet stats +-- + +CREATE VIEW fleets.stats_view + AS SELECT f.id , + sum( fs.amount * fsd.power ) AS power , + max( fsd.flight_time ) AS flight_time + FROM fleets.fleets f + INNER JOIN fleets.ships fs + ON fs.fleet_id = f.id + INNER JOIN tech.ships fsd + ON fsd.buildable_id = fs.ship_id + GROUP BY f.id; + + +-- +-- Fleet locations view +-- + +CREATE VIEW fleets.locations_view + AS SELECT llv.* , mv.name , mv.x , mv.y , mv.orbit , mv.picture , mv.tag , + floor( p.population )::BIGINT AS population , + floor( verse.adjust_production( verse.get_raw_production( p.name_id , 'DEF' ) , ph.current / p.population ) )::BIGINT AS defence , + bcs.id AS battle , + ( CASE WHEN llv.attacking THEN bcs.attack ELSE bcs.defence END ) AS friendly_power , + ( CASE WHEN llv.attacking THEN bcs.defence ELSE bcs.attack END ) AS hostile_power , + ( ep.empire_id = llv.empire ) AS is_own , + ( v.account_id IS NOT NULL AND bcs.id IS NULL ) AS on_vacation + FROM fleets.locations_list_view llv + INNER JOIN verse.planets p ON p.name_id = llv.location + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.map_view mv ON mv.id = p.name_id + LEFT OUTER JOIN battles.current_status bcs ON bcs.location = llv.location + LEFT OUTER JOIN emp.planets ep ON ep.planet_id = p.name_id + LEFT OUTER JOIN naming.empire_names en ON en.id = ep.empire_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id AND v.status = 'PROCESSED' + ORDER BY mv.x , mv.y , mv.orbit; + +GRANT SELECT ON fleets.locations_view TO :dbuser; + + +-- +-- Fleet owners view +-- + + +CREATE VIEW fleets.owners_view + AS SELECT DISTINCT llv.empire , llv.location , f.owner_id AS id , n.name AS name , + ( CASE + WHEN f.owner_id = llv.empire THEN 'OWN' + WHEN f.attacking = llv.attacking THEN 'ALLIED' + ELSE 'ENEMY' + END )::empire_relation_type AS relation + FROM fleets.locations_list_view llv + INNER JOIN fleets.fleets f + ON f.location_id = llv.location + INNER JOIN naming.empire_names n + ON n.id = f.owner_id + LEFT OUTER JOIN fleets.movements m + ON m.fleet_id = f.id + WHERE m.fleet_id IS NULL; + +GRANT SELECT ON fleets.owners_view TO :dbuser; + + + +-- +-- Static fleets view +-- + +CREATE VIEW fleets.static_fleets + AS SELECT ov.empire , ov.location , ov.id AS owner , + f.id , f.name , f.status , f.penalty , + fs.power , fs.flight_time * 2 AS flight_time + FROM fleets.owners_view ov + INNER JOIN fleets.fleets f + ON f.location_id = ov.location AND f.owner_id = ov.id + INNER JOIN fleets.stats_view fs + ON fs.id = f.id + LEFT OUTER JOIN fleets.movements m + ON m.fleet_id = f.id + WHERE m.fleet_id IS NULL; + +GRANT SELECT ON fleets.static_fleets TO :dbuser; + + +-- +-- Location of fleets moving in outer space +-- + +CREATE VIEW fleets.outer_space_fleets + AS SELECT s.movement_id AS id , m.state_time_left AS time_left , + s.start_x AS x0 , s.start_y AS y0 , + ts.x::REAL AS x1 , ts.y::REAL AS y1 + FROM fleets.ms_space s + INNER JOIN fleets.movements m ON m.fleet_id = s.movement_id + INNER JOIN fleets.fleets f ON m.fleet_id = f.id + INNER JOIN verse.planets p ON p.name_id = f.location_id + INNER JOIN verse.systems ts ON ts.id = p.system_id; + + + +-- +-- Location of fleets moving inside systems +-- + +CREATE VIEW fleets.system_fleets + AS SELECT s.movement_id AS id , iss.x AS x , iss.y AS y , + n.id AS planet , n.name AS name + FROM fleets.ms_system s + INNER JOIN verse.planets isp ON isp.name_id = s.ref_point_id + INNER JOIN verse.systems iss ON iss.id = isp.system_id + INNER JOIN naming.map_names n ON n.id = isp.name_id; + + + +-- +-- Moving fleets view +-- + +CREATE VIEW fleets.moving_fleets + AS SELECT f.owner_id AS empire , f.id , f.name , + f.status , f.penalty , f.attacking , + fs.power , fs.flight_time * 2 AS flight_time , + m.time_left , + m.source_id AS from_id , sn.name AS from_name , + f.location_id AS to_id , dn.name AS to_name , + ( CASE + WHEN osf.id IS NULL THEN isf.x + ELSE ( osf.x1 - osf.time_left::REAL * ( osf.x1 - osf.x0 ) + / fleets.compute_outerspace_duration( fs.flight_time , osf.x0 , osf.y0 , osf.x1 , osf.y1 ) ) + END )::REAL AS cx , + ( CASE + WHEN osf.id IS NULL THEN isf.y + ELSE ( osf.y1 - osf.time_left::REAL * ( osf.y1 - osf.y0 ) + / fleets.compute_outerspace_duration( fs.flight_time , osf.x0 , osf.y0 , osf.x1 , osf.y1 ) ) + END )::REAL AS cy , + ( CASE + WHEN osf.id IS NULL THEN isf.planet + ELSE NULL + END )::INT AS nearest_id , + ( CASE + WHEN osf.id IS NULL THEN isf.name + ELSE NULL + END )::TEXT AS nearest_name + FROM fleets.fleets f + INNER JOIN fleets.movements m ON m.fleet_id = f.id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + INNER JOIN naming.map_names sn ON sn.id = m.source_id + INNER JOIN naming.map_names dn ON dn.id = f.location_id + LEFT OUTER JOIN fleets.system_fleets isf ON isf.id = m.fleet_id + LEFT OUTER JOIN fleets.outer_space_fleets osf ON osf.id = f.id; + +GRANT SELECT ON fleets.moving_fleets TO :dbuser; + + + +-- +-- List of fleets visible to an empire +-- + +CREATE VIEW fleets.visible_fleets_list + AS SELECT empire , id FROM fleets.static_fleets + UNION SELECT empire , id FROM fleets.moving_fleets; + + + +-- +-- List of fleets ships +-- + +CREATE VIEW fleets.ships_view + AS SELECT vfl.empire , vfl.id , fs.ship_id , fs.amount , + ( fs.amount * fsd.power ) AS power , + t.translated_string AS name + FROM fleets.visible_fleets_list vfl + INNER JOIN naming.empire_names en ON vfl.empire = en.id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN fleets.ships fs ON fs.fleet_id = vfl.id + INNER JOIN tech.ships fsd ON fsd.buildable_id = fs.ship_id + INNER JOIN defs.translations t ON t.lang_id = c.language_id AND t.string_id = fsd.buildable_id + ORDER BY fsd.power; + +GRANT SELECT ON fleets.ships_view TO :dbuser; + + + +-- +-- Short view for static fleets +-- + +CREATE VIEW fleets.short_static_fleets + AS SELECT sf.empire , sf.location AS location_id , + fl.name AS location_name , + fl.x::REAL AS x , fl.y::REAL AS y , + sf.id , sf.name , sf.status , sf.penalty , + fl.attacking , sf.power , sf.flight_time + FROM fleets.static_fleets sf + INNER JOIN fleets.locations_view fl USING( location , empire ) + WHERE sf.empire = sf.owner; + +GRANT SELECT ON fleets.short_static_fleets TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/167-planet-list.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/167-planet-list.sql new file mode 100644 index 0000000..ca6ed36 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/167-planet-list.sql @@ -0,0 +1,150 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Views for empires' planet lists +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- +-- Basic planet information +-- + +CREATE VIEW emp.planets_list_basic + AS SELECT e.name_id AS empire , + p.name_id AS id , n.name , + s.x , s.y , p.orbit , + p.population , ph.current / p.population::REAL AS happiness , + floor( pm.income )::BIGINT AS income , + floor( pm.upkeep )::BIGINT AS upkeep + FROM emp.empires e + INNER JOIN emp.planets ep ON ep.empire_id = e.name_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN naming.map_names n ON n.id = p.name_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.planet_money pm ON pm.planet_id = p.name_id + INNER JOIN verse.systems s ON s.id = p.system_id; + + +-- +-- Production +-- + +CREATE VIEW emp.planets_list_prod + AS SELECT id , + verse.adjust_production( verse.get_raw_production( id , 'WORK') , happiness ) AS military_production , + verse.adjust_production( verse.get_raw_production( id , 'CASH') , happiness ) AS industrial_production , + verse.adjust_production( verse.get_raw_production( id , 'POP') , happiness ) AS growth_production , + verse.adjust_production( verse.get_raw_production( id , 'DEF') , happiness ) AS static_defence + FROM emp.planets_list_basic; + + +-- +-- Civilian investment +-- + +CREATE VIEW emp.planets_list_civ_invest + AS SELECT q.planet_id AS id , sum( CASE WHEN qi.destroy THEN 0 ELSE qi.amount * qb.cost END ) - q.money AS civ_investment + FROM verse.bld_queues q + INNER JOIN verse.bld_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables qb ON qb.name_id = qi.building_id + GROUP BY q.planet_id , q.money; + + +-- +-- Military investment +-- + +CREATE VIEW emp.planets_list_mil_invest + AS SELECT q.planet_id AS id , sum( qi.amount * qb.cost ) - q.money AS mil_investment + FROM verse.mil_queues q + INNER JOIN verse.mil_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables qb ON qb.name_id = qi.ship_id + GROUP BY q.planet_id , q.money; + + +-- +-- First item on civilian queues +-- + +CREATE VIEW emp.planets_list_civ_top + AS SELECT qi.queue_id AS id , qi.amount AS civ_amount , qi.destroy AS civ_destroy , t.translated_string AS civ_name + FROM verse.bld_items qi + INNER JOIN emp.planets ep ON ep.planet_id = qi.queue_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials cred ON cred.address_id = en.owner_id + INNER JOIN defs.translations t ON t.lang_id = cred.language_id AND t.string_id = qi.building_id + WHERE qi.queue_order = 0; + + +-- +-- First item on military queues +-- + +CREATE VIEW emp.planets_list_mil_top + AS SELECT qi.queue_id AS id , qi.amount AS mil_amount , t.translated_string AS mil_name + FROM verse.mil_items qi + INNER JOIN emp.planets ep ON ep.planet_id = qi.queue_id + INNER JOIN naming.empire_names en ON en.id = ep.empire_id + INNER JOIN users.credentials cred ON cred.address_id = en.owner_id + INNER JOIN defs.translations t ON t.lang_id = cred.language_id AND t.string_id = qi.ship_id + WHERE qi.queue_order = 0; + + +-- +-- Fleets +-- + +CREATE VIEW emp.planets_list_fleets + AS SELECT f.location_id AS id , ( CASE + WHEN f.owner_id = ep.empire_id THEN 0 + WHEN f.attacking THEN 2 + ELSE 1 + END ) AS rel_type , sum( fs.power )::BIGINT AS power + FROM fleets.fleets f + INNER JOIN emp.planets ep ON f.location_id = ep.planet_id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN fleets.movements fm ON fm.fleet_id = f.id + WHERE fm IS NULL + GROUP BY f.location_id , ( CASE + WHEN f.owner_id = ep.empire_id THEN 0 + WHEN f.attacking THEN 2 + ELSE 1 + END ); + + +-- +-- Actual planet list +-- + +CREATE VIEW emp.planets_list + AS SELECT e.empire , e.id , e.name , e.x , e.y , e.orbit , + floor( e.population )::BIGINT AS population , + floor( 100 * e.happiness )::INT AS happiness , + e.income , e.upkeep , + floor( p.military_production )::BIGINT AS military_production , + floor( p.industrial_production )::BIGINT AS industrial_production , + floor( p.growth_production )::BIGINT AS growth_production , + ( CASE WHEN ci IS NULL THEN 0 ELSE floor( ci.civ_investment ) END )::BIGINT AS civ_investment , + ct.civ_amount , ct.civ_destroy , ct.civ_name , + ( CASE WHEN mi IS NULL THEN 0 ELSE floor( mi.mil_investment ) END )::BIGINT AS mil_investment , + mt.mil_amount , mt.mil_name , + floor( p.static_defence )::BIGINT AS static_defence , + ( CASE WHEN of IS NULL THEN 0 ELSE of.power END ) AS own_fleet , + ( CASE WHEN ff IS NULL THEN 0 ELSE ff.power END ) AS friendly_fleet , + ( CASE WHEN hf IS NULL THEN 0 ELSE hf.power END ) AS hostile_fleet , + b.id AS battle + FROM emp.planets_list_basic e + INNER JOIN emp.planets_list_prod p USING ( id ) + LEFT OUTER JOIN emp.planets_list_civ_invest ci USING ( id ) + LEFT OUTER JOIN emp.planets_list_civ_top ct USING ( id ) + LEFT OUTER JOIN emp.planets_list_mil_invest mi USING ( id ) + LEFT OUTER JOIN emp.planets_list_mil_top mt USING ( id ) + LEFT OUTER JOIN emp.planets_list_fleets of ON of.id = e.id AND of.rel_type = 0 + LEFT OUTER JOIN emp.planets_list_fleets ff ON ff.id = e.id AND ff.rel_type = 1 + LEFT OUTER JOIN emp.planets_list_fleets hf ON hf.id = e.id AND hf.rel_type = 2 + LEFT OUTER JOIN battles.battles b ON b.location_id = e.id AND b.last_tick IS NULL + ORDER BY e.x , e.y , e.orbit; + +GRANT SELECT ON emp.planets_list TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/170-event-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/170-event-functions.sql new file mode 100644 index 0000000..24f5e41 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/170-event-functions.sql @@ -0,0 +1,928 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions and views to create and manipulate events +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- EVENT CREATION FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +-- +-- Creates a battle start event +-- +-- Parameters: +-- b_id Battle identifier +-- + +CREATE OR REPLACE FUNCTION events.battle_start_event( b_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + l_id INT; + l_name TEXT; + pe_id INT; + c_tick BIGINT; + evt_id BIGINT; +BEGIN + -- Get location name and identifier + SELECT INTO l_id , l_name b.location_id , n.name + FROM battles.battles b + INNER JOIN naming.map_names n ON n.id = b.location_id + WHERE b.id = b_id; + + -- Create message for all protagonists + c_tick := sys.get_tick( ) - 1; + FOR pe_id IN SELECT be.empire_id + FROM battles.battles b + INNER JOIN battles.protagonists bp ON bp.battle_id = b.id + INNER JOIN battles.empires be ON be.id = bp.empire_id + WHERE b.id = b_id + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( pe_id , c_tick , 'PLANET' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name , battle_id) + VALUES ( evt_id , l_id , l_name , b_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a battle end event +-- +-- Parameters: +-- b_id Battle identifier +-- + +CREATE OR REPLACE FUNCTION events.battle_end_event( b_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + l_id INT; + l_name TEXT; + pe_id INT; + c_tick BIGINT; + evt_id BIGINT; +BEGIN + -- Get location name and identifier + SELECT INTO l_id , l_name b.location_id , n.name + FROM battles.battles b + INNER JOIN naming.map_names n ON n.id = b.location_id + WHERE b.id = b_id; + + -- Create message for all protagonists + c_tick := sys.get_tick( ) - 1; + FOR pe_id IN SELECT empire FROM battles.battles_list + WHERE battle = b_id AND last_update = last_tick + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( pe_id , c_tick , 'PLANET' , 1 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name , battle_id) + VALUES ( evt_id , l_id , l_name , b_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a strike start / end event +-- +-- Parameters: +-- p_id Planet identifier +-- sevt Whether to create a strike start or a strike end event +-- + +CREATE OR REPLACE FUNCTION events.strike_event( p_id INT , sevt BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_name TEXT; + po_id INT; + c_tick BIGINT; + evt_id BIGINT; +BEGIN + -- Get location name and owner identifier + SELECT INTO p_name , po_id n.name , ep.empire_id + FROM naming.map_names n + INNER JOIN emp.planets ep ON ep.planet_id = n.id + WHERE n.id = p_id; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Create message + c_tick := sys.get_tick( ) - 1; + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( po_id , c_tick , 'PLANET' , ( CASE WHEN sevt THEN 2 ELSE 3 END ) , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name ) + VALUES ( evt_id , p_id , p_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates events for a planet's ownership change +-- +-- Parameters: +-- p_id Planet identifier +-- no_id New owner's identifier +-- + +CREATE OR REPLACE FUNCTION events.planet_ochange_events( p_id INT , no_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_name VARCHAR(20); + no_name VARCHAR(20); + oo_id INT; + oo_name VARCHAR(20); + evt_id BIGINT; + c_tick BIGINT; +BEGIN + c_tick := sys.get_tick( ) - 1; + + -- Get new owner's name and the planet's name + SELECT INTO p_name name FROM naming.map_names WHERE id = p_id; + SELECT INTO no_name name FROM naming.empire_names WHERE id = no_id; + + -- Get previous owner's name and identifier + SELECT INTO oo_id , oo_name ep.empire_id , n.name + FROM emp.planets ep + INNER JOIN naming.empire_names n ON n.id = ep.empire_id + WHERE ep.planet_id = p_id; + + -- If there is a previous owner, add planet loss event + IF FOUND + THEN + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( oo_id , c_tick , 'PLANET' , 4 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name , empire_id , empire_name ) + VALUES ( evt_id , p_id , p_name , no_id , no_name ); + END IF; + + -- Add planet taking event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( no_id , c_tick , 'PLANET' , 6 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name , empire_id , empire_name ) + VALUES ( evt_id , p_id , p_name , oo_id , oo_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an event for planet abandon +-- +-- Parameters: +-- p_id Planet identifier +-- + +CREATE OR REPLACE FUNCTION events.planet_abandon_event( p_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_name VARCHAR(20); + po_id INT; + oo_name VARCHAR(20); + evt_id BIGINT; +BEGIN + -- Get owner's ID and planet's name + SELECT INTO p_name , po_id n.name , ep.empire_id + FROM naming.map_names n + INNER JOIN emp.planets ep ON ep.planet_id = n.id + WHERE n.id = p_id; + + -- Add abandon event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( po_id , sys.get_tick( ) - 1 , 'PLANET' , 5 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.planet_events ( event_id , location_id , location_name ) + VALUES ( evt_id , p_id , p_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an event for a technology's availability +-- +-- Parameters: +-- e_id Empire identifier +-- t_id Technology identifier +-- + +CREATE OR REPLACE FUNCTION events.tech_ready_event( e_id INT , t_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + evt_id BIGINT; +BEGIN + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( e_id , sys.get_tick( ) - 1 , 'EMPIRE' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.empire_events ( event_id , technology_id ) + VALUES ( evt_id , t_id ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an event for start/end of debt +-- +-- Parameters: +-- e_id Empire identifier +-- sevt Whether this is the start or the end +-- + +CREATE OR REPLACE FUNCTION events.debt_event( e_id INT , sevt BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER +AS $$ + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( $1 , sys.get_tick( ) - 1 , 'EMPIRE' , ( CASE WHEN $2 THEN 1 ELSE 2 END ) , 'READY' ); +$$ LANGUAGE SQL; + + + +-- +-- Creates a "pending request" event +-- +-- Parameters: +-- a_id Alliance identifier +-- e_id Empire identifier +-- + +CREATE OR REPLACE FUNCTION events.alliance_request_event( a_id INT , e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + al_id INT; + e_name TEXT; + evt_id BIGINT; +BEGIN + -- Get the alliance's name and leader ID + SELECT INTO a_tag , al_id tag , leader_id FROM emp.alliances WHERE id = a_id; + + -- Get the joining player's name + SELECT INTO e_name name FROM naming.empire_names WHERE id = e_id; + + -- Create the event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( al_id , sys.get_tick( ) , 'ALLIANCE' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag , empire_id , empire_name ) + VALUES ( evt_id , a_id , a_tag , e_id , e_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a request validation/rejection event +-- +-- Parameters: +-- a_id Alliance identifier +-- e_id Empire identifier +-- acc Whether the request was accepted or rejected +-- + +CREATE OR REPLACE FUNCTION events.alliance_response_event( a_id INT , e_id INT , acc BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + e_name TEXT; + evt_id BIGINT; +BEGIN + -- Get the alliance's name and leader ID + SELECT INTO a_tag tag FROM emp.alliances WHERE id = a_id; + + -- Get the requesting player's name + SELECT INTO e_name name FROM naming.empire_names WHERE id = e_id; + + -- Create the event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( e_id , sys.get_tick( ) , 'ALLIANCE' , 1 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag , req_result ) + VALUES ( evt_id , a_id , a_tag , acc ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a leadership change event +-- +-- Parameters: +-- a_id Alliance identifier +-- ol_id Previous leader's identifier +-- + +CREATE OR REPLACE FUNCTION events.alliance_lchange_event( a_id INT , ol_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + al_id INT; + al_name TEXT; + am_id INT; + evt_id BIGINT; +BEGIN + -- Get alliance tag, leader ID and leader name + SELECT INTO a_tag , al_id , al_name a.tag , a.leader_id , n.name + FROM emp.alliances a + INNER JOIN naming.empire_names n ON n.id = a.leader_id + WHERE a.id = a_id; + + -- Notify both members and pending members + FOR am_id IN SELECT empire_id FROM emp.alliance_members + WHERE alliance_id = a_id AND empire_id <> ol_id + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( am_id , sys.get_tick( ) , 'ALLIANCE' , 2 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag , empire_id , empire_name ) + VALUES ( evt_id , a_id , a_tag , al_id , al_name ); + END LOOP; + +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an alliance kick event +-- +-- Parameters: +-- a_id Alliance identifier +-- ol_id Member being kicked +-- + +CREATE OR REPLACE FUNCTION events.alliance_kick_event( a_id INT , k_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + al_id INT; + k_name TEXT; + am_id INT; + evt_id BIGINT; +BEGIN + -- Get alliance tag and leader ID + SELECT INTO a_tag , al_id a.tag , a.leader_id + FROM emp.alliances a + INNER JOIN naming.empire_names n ON n.id = a.leader_id + WHERE a.id = a_id; + SELECT INTO k_name name FROM naming.empire_names WHERE id = k_id; + + -- Notify members + FOR am_id IN SELECT empire_id FROM emp.alliance_members + WHERE alliance_id = a_id AND empire_id <> al_id AND NOT is_pending + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( am_id , sys.get_tick( ) , 'ALLIANCE' , 3 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag , empire_id , empire_name ) + VALUES ( evt_id , a_id , a_tag , k_id , k_name ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an alliance quit event +-- +-- Parameters: +-- a_id Alliance identifier +-- q_id Member quitting the alliance +-- + +CREATE OR REPLACE FUNCTION events.alliance_quit_event( a_id INT , q_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + q_name TEXT; + am_id INT; + evt_id BIGINT; +BEGIN + -- Get alliance tag and quitter name + SELECT INTO a_tag a.tag FROM emp.alliances a WHERE a.id = a_id; + SELECT INTO q_name name FROM naming.empire_names WHERE id = q_id; + + -- Notify members + FOR am_id IN SELECT empire_id FROM emp.alliance_members + WHERE alliance_id = a_id AND NOT is_pending + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( am_id , sys.get_tick( ) , 'ALLIANCE' , 4 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag , empire_id , empire_name ) + VALUES ( evt_id , a_id , a_tag , q_id , q_name ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an alliance disband event +-- +-- Parameters: +-- a_id Alliance identifier +-- q_id Member quitting the alliance +-- + +CREATE OR REPLACE FUNCTION events.alliance_disband_event( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_tag TEXT; + al_id INT; + am_id INT; + evt_id BIGINT; +BEGIN + -- Get alliance tag and quitter name + SELECT INTO a_tag , al_id a.tag , leader_id FROM emp.alliances a WHERE a.id = a_id; + + -- Notify members + FOR am_id IN SELECT empire_id FROM emp.alliance_members + WHERE alliance_id = a_id AND empire_id <> al_id + LOOP + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( am_id , sys.get_tick( ) , 'ALLIANCE' , 5 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.alliance_events ( event_id , alliance_id , alliance_tag ) + VALUES ( evt_id , a_id , a_tag ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates empty build queue events or updates existing ones +-- +-- Parameters: +-- e_id Empire identifier +-- p_id Planet identifier +-- mqueue Whether the empty queue is the military or civilian queue +-- c_tick Current tick +-- + +CREATE OR REPLACE FUNCTION events.empty_queue_events( e_id INT , p_id INT , mqueue BOOLEAN , c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + evt_st INT; + evt_id BIGINT; + p_name TEXT; +BEGIN + evt_st := ( CASE WHEN mqueue THEN 1 ELSE 0 END ); + SELECT INTO evt_id event_id FROM events.events + WHERE evt_type = 'QUEUE' AND evt_subtype = evt_st + AND empire_id = e_id AND tick = c_tick; + + IF NOT FOUND + THEN + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( e_id , c_tick , 'QUEUE' , evt_st , 'TICK' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.queue_events VALUES ( evt_id ); + END IF; + + SELECT INTO p_name name FROM naming.map_names WHERE id = p_id; + INSERT INTO events.bqe_locations VALUES ( evt_id , p_id , p_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Commits fleet arrival events from the "fleet_arrivals" temporary table +-- +-- Parameters: +-- c_tick Current tick identifier +-- + +CREATE OR REPLACE FUNCTION events.commit_fleet_arrivals( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + l_id INT; + l_name TEXT; + tg_id INT; + tg_mode BOOLEAN; + evt_id BIGINT; +BEGIN + FOR l_id , l_name , tg_id , tg_mode + IN SELECT DISTINCT a.loc_id , a.loc_name , l.empire , l.attacking + FROM fleet_arrivals a + INNER JOIN fleets.locations_list_view l ON l.location = a.loc_id + LOOP + -- Create event record + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( tg_id , c_tick , 'FLEETS' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.fleets_events( event_id , location_id , location_name ) + VALUES ( evt_id , l_id , l_name ); + + -- List fleets + INSERT INTO events.fleet_lists ( event_id , owner_id , owner_name , fleet_name , fleet_power , status , source_id , source_name ) + SELECT evt_id , a.own_id , a.own_name , a.name , a.power , ( CASE + WHEN tg_id = a.own_id + THEN tg_mode + ELSE + ( tg_mode <> a.mode ) + END ) , a.src_id , a.src_name + FROM fleet_arrivals a + WHERE loc_id = l_id + ORDER BY ( a.own_id = tg_id ) DESC , a.mode , own_name , name NULLS LAST; + END LOOP; + DROP TABLE fleet_arrivals; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Commits fleet departure events from the "fleet_departures" temporary table +-- + +CREATE OR REPLACE FUNCTION events.commit_fleet_departures( ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + l_id INT; + l_name TEXT; + tg_id INT; + tg_mode BOOLEAN; + evt_id BIGINT; + c_tick BIGINT; +BEGIN + c_tick := sys.get_tick( ); + FOR l_id , l_name , tg_id , tg_mode + IN SELECT DISTINCT a.loc_id , a.loc_name , l.empire , l.attacking + FROM fleet_departures a + INNER JOIN fleets.locations_list_view l + ON l.location = a.loc_id AND l.empire <> a.own_id + LOOP + -- Create event record + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( tg_id , c_tick , 'FLEETS' , 1 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.fleets_events( event_id , location_id , location_name ) + VALUES ( evt_id , l_id , l_name ); + + -- List fleets + INSERT INTO events.fleet_lists ( event_id , owner_id , owner_name , fleet_name , fleet_power , status ) + SELECT evt_id , a.own_id , a.own_name , a.name , a.power , ( tg_mode <> a.mode ) + FROM fleet_departures a + WHERE loc_id = l_id AND own_id <> tg_id + ORDER BY a.mode , own_name , name NULLS LAST; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Commits fleet mode change events from the "fleet_switches" temporary table +-- +-- Parameters: +-- els Whether the switch was caused through the enemy list +-- + +CREATE OR REPLACE FUNCTION events.commit_fleet_switches( els BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + l_id INT; + l_name TEXT; + tg_id INT; + tg_mode BOOLEAN; + evt_id BIGINT; + c_tick BIGINT; + own_c BIGINT; + other_c BIGINT; +BEGIN + c_tick := sys.get_tick( ); + FOR l_id , l_name , tg_id , tg_mode + IN SELECT DISTINCT a.loc_id , a.loc_name , l.empire , l.attacking + FROM fleet_switches a + INNER JOIN fleets.locations_list_view l + ON l.location = a.loc_id + LOOP + -- Handle other fleets + SELECT INTO other_c count(*) FROM fleet_switches WHERE loc_id = l_id AND own_id <> tg_id; + IF other_c > 0 + THEN + -- Create event record + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( tg_id , c_tick , 'FLEETS' , 2 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.fleets_events( event_id , location_id , location_name ) + VALUES ( evt_id , l_id , l_name ); + + -- List fleets + INSERT INTO events.fleet_lists ( event_id , owner_id , owner_name , fleet_name , fleet_power , status ) + SELECT evt_id , a.own_id , a.own_name , a.name , a.power , a.mode + FROM fleet_switches a + WHERE loc_id = l_id AND own_id <> tg_id + ORDER BY a.mode , own_name , name NULLS LAST; + END IF; + + -- Handle own fleets + CONTINUE WHEN NOT els; + SELECT INTO own_c count(*) FROM fleet_switches WHERE loc_id = l_id AND own_id = tg_id; + CONTINUE WHEN own_c = 0; + + -- Create event record + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( tg_id , c_tick , 'FLEETS' , 3 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.fleets_events( event_id , location_id , location_name ) + VALUES ( evt_id , l_id , l_name ); + + -- List fleets + INSERT INTO events.fleet_lists ( event_id , owner_id , owner_name , fleet_name , fleet_power , status ) + SELECT evt_id , a.own_id , a.own_name , a.name , a.power , a.mode + FROM fleet_switches a + WHERE loc_id = l_id AND own_id = tg_id + ORDER BY a.mode , own_name , name NULLS LAST; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates a map name rejection event +-- +-- Parameters: +-- u_id Account identifier +-- n_id Name identifier +-- o_name Old name +-- n_name New name +-- w_sent Whether a warning was sent +-- w_count Current warnings +-- + +CREATE OR REPLACE FUNCTION events.map_name_rejected_event( u_id INT , n_id INT , o_name TEXT , n_name TEXT , w_sent BOOLEAN , w_count INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + e_id INT; + evt_id BIGINT; +BEGIN + -- Get empire identifier + SELECT INTO e_id e.name_id + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + WHERE en.owner_id = u_id; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Add event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( e_id , sys.get_tick( ) - 1 , 'ADMIN' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.admin_events( event_id , n_warnings , location_id , old_name , new_name ) + VALUES( evt_id , ( CASE WHEN w_sent THEN w_count ELSE NULL END ) , n_id , o_name , n_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an empire name rejection event +-- +-- Parameters: +-- n_id Name identifier +-- o_name Old name +-- n_name New name +-- w_sent Whether a warning was sent +-- w_count Current warnings +-- + +CREATE OR REPLACE FUNCTION events.empire_name_rejected_event( n_id INT , o_name TEXT , n_name TEXT , w_sent BOOLEAN , w_count INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + evt_id BIGINT; +BEGIN + -- Add event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( n_id , sys.get_tick( ) - 1 , 'ADMIN' , 1 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.admin_events( event_id , n_warnings ,old_name , new_name ) + VALUES( evt_id , ( CASE WHEN w_sent THEN w_count ELSE NULL END ) , o_name , n_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates an alliance name rejection event +-- +-- Parameters: +-- n_id Empire identifier +-- o_name Alliance name +-- w_sent Whether a warning was sent +-- w_count Current warnings +-- + +CREATE OR REPLACE FUNCTION events.alliance_name_rejected_event( n_id INT , o_name TEXT , w_sent BOOLEAN , w_count INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + evt_id BIGINT; +BEGIN + -- Add event + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( n_id , sys.get_tick( ) - 1 , 'ADMIN' , 2 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.admin_events( event_id , n_warnings , old_name ) + VALUES( evt_id , ( CASE WHEN w_sent THEN w_count ELSE NULL END ) , o_name ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates events for updated bug reports +-- +-- Parameters: +-- e_id Empire identifier +-- br_id Bug report identifier +-- s_id Submitter identifier +-- + +CREATE OR REPLACE FUNCTION events.bug_report_updated_event( e_id INT , br_id BIGINT , s_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + evt_id BIGINT; +BEGIN + INSERT INTO events.events ( empire_id , tick , evt_type , evt_subtype , status ) + VALUES ( e_id , sys.get_tick( ) - 1 , 'BUGS' , 0 , 'READY' ) + RETURNING event_id INTO evt_id; + INSERT INTO events.bug_events( event_id , bug_id , submitter_id ) + VALUES ( evt_id , br_id , s_id ); +END; +$$ LANGUAGE plpgsql; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- EVENTS VIEWS, USED BY THE MESSAGE SYSTEM -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Main events lists +-- + +CREATE VIEW events.queue_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , ed.* + FROM events.events e + INNER JOIN events.queue_events ed USING (event_id); + +GRANT SELECT ON events.queue_events_view TO :dbuser; + + +CREATE VIEW events.empire_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , s.name AS technology + FROM events.events e + LEFT OUTER JOIN events.empire_events ed USING (event_id) + LEFT OUTER JOIN tech.levels tl ON tl.id = ed.technology_id + LEFT OUTER JOIN defs.strings s ON s.id = tl.name_id + WHERE e.evt_type = 'EMPIRE'; + +GRANT SELECT ON events.empire_events_view TO :dbuser; + + +CREATE VIEW events.fleets_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , + ed.* , s.x , s.y , p.orbit + FROM events.events e + INNER JOIN events.fleets_events ed USING (event_id) + INNER JOIN verse.planets p ON p.name_id = ed.location_id + INNER JOIN verse.systems s ON s.id = p.system_id; + +GRANT SELECT ON events.fleets_events_view TO :dbuser; + + +CREATE VIEW events.planet_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , + ed.* , s.x , s.y , p.orbit + FROM events.events e + INNER JOIN events.planet_events ed USING (event_id) + INNER JOIN verse.planets p ON p.name_id = ed.location_id + INNER JOIN verse.systems s ON s.id = p.system_id; + +GRANT SELECT ON events.planet_events_view TO :dbuser; + + +CREATE VIEW events.alliance_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , ed.* + FROM events.events e + INNER JOIN events.alliance_events ed USING (event_id); + +GRANT SELECT ON events.alliance_events_view TO :dbuser; + + +CREATE VIEW events.admin_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , ed.* + FROM events.events e + INNER JOIN events.admin_events ed USING ( event_id ); + +GRANT SELECT ON events.admin_events_view TO :dbuser; + + +CREATE VIEW events.bugs_events_view + AS SELECT e.event_id AS id , e.evt_type , e.evt_subtype , e.tick , e.real_time , ed.bug_id , + bs.is_admin AS submitter_admin , bs.name AS submitter_name + FROM events.events e + INNER JOIN events.bug_events ed USING ( event_id ) + INNER JOIN bugs.submitters bs USING ( submitter_id ); + +GRANT SELECT ON events.bugs_events_view TO :dbuser; + + +-- +-- Queue event locations +-- + +CREATE VIEW events.queue_locations_view + AS SELECT bqe.* , s.x , s.y , p.orbit + FROM events.bqe_locations bqe + INNER JOIN verse.planets p ON p.name_id = bqe.location_id + INNER JOIN verse.systems s ON s.id = p.system_id; + +GRANT SELECT ON events.queue_locations_view TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/180-messages-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/180-messages-functions.sql new file mode 100644 index 0000000..e7319b0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/180-messages-functions.sql @@ -0,0 +1,1277 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions and views to handle messages +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- INTERNAL FUNCTIONS THAT HANDLE SENDING MESSAGES -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +-- +-- Creates or retrieves a sender record +-- +-- Parameters: +-- r_type Sender type +-- r_id Sender identifier +-- + +CREATE OR REPLACE FUNCTION msgs.goc_sender( s_type sender_type , s_id INT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + snd_id BIGINT; + s_name TEXT; +BEGIN + LOOP + SELECT INTO snd_id id FROM msgs.senders + WHERE ( CASE s_type + WHEN 'EMP' THEN + empire_id = s_id + ELSE + admin_id = s_id + END ); + EXIT WHEN FOUND; + + BEGIN + IF s_type = 'EMP' + THEN + SELECT INTO s_name name FROM naming.empire_names + WHERE id = s_id; + INSERT INTO msgs.senders( sender_type , name , empire_id ) + VALUES ( s_type , s_name , s_id ) + RETURNING id INTO snd_id; + ELSE + SELECT INTO s_name appear_as FROM admin.administrators + WHERE id = s_id; + INSERT INTO msgs.senders( sender_type , name , admin_id ) + VALUES ( s_type , s_name , s_id ) + RETURNING id INTO snd_id; + END IF; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + RETURN snd_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Creates or retrieves a receiver record +-- +-- Parameters: +-- r_type Receiver type +-- r_id Receiver identifier +-- + +CREATE OR REPLACE FUNCTION msgs.goc_receiver( r_type receiver_type , r_id INT ) + RETURNS BIGINT + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec_id BIGINT; + r_name TEXT; +BEGIN + LOOP + SELECT INTO rec_id id FROM msgs.receivers + WHERE ( CASE r_type + WHEN 'EMP' THEN + empire_id = r_id + WHEN 'ADM' THEN + admin_id = r_id + ELSE + alliance_id = r_id + END ); + EXIT WHEN FOUND; + + BEGIN + IF r_type = 'EMP' + THEN + SELECT INTO r_name name FROM naming.empire_names + WHERE id = r_id; + INSERT INTO msgs.receivers( receiver_type , name , empire_id ) + VALUES ( r_type , r_name , r_id ) + RETURNING id INTO rec_id; + ELSEIF r_type = 'ADM' + THEN + SELECT INTO r_name appear_as FROM admin.administrators + WHERE id = r_id; + INSERT INTO msgs.receivers( receiver_type , name , admin_id ) + VALUES ( r_type , r_name , r_id ) + RETURNING id INTO rec_id; + ELSE + SELECT INTO r_name tag FROM emp.alliances + WHERE id = r_id; + INSERT INTO msgs.receivers( receiver_type , name , alliance_id ) + VALUES ( r_type , r_name , r_id ) + RETURNING id INTO rec_id; + END IF; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + RETURN rec_id; +END; +$$ LANGUAGE plpgsql; + + +-- +-- Stores a message in an empire's message box +-- +-- Parameters: +-- e_id Empire identifier +-- m_id Message identifier +-- received Whether the message is to be delivered in the inbox or in the outbox +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_to_empire( e_id INT , m_id BIGINT , received BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER +AS $$ + INSERT INTO msgs.empire_delivery ( empire_id , message_id , in_inbox , status , emailed , recaped ) + VALUES ( $1 , $2 , $3 , ( CASE WHEN $3 THEN 'UNREAD' ELSE 'READ' END )::message_status , NOT $3 , NOT $3 ); +$$ LANGUAGE SQL; + + + +-- +-- Stores a message in an administrator's message box +-- +-- Parameters: +-- a_id Administrator identifier +-- m_id Message identifier +-- received Whether the message is to be delivered in the inbox or in the outbox +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_to_admin( a_id INT , m_id BIGINT , received BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER +AS $$ + INSERT INTO msgs.admin_delivery ( admin_id , message_id , in_inbox , status , emailed ) + VALUES ( $1 , $2 , $3 , ( CASE WHEN $3 THEN 'UNREAD' ELSE 'READ' END )::message_status , NOT $3 ); +$$ LANGUAGE SQL; + + + +-- +-- Deliver new internal messages to an empire +-- +-- Parameters: +-- e_id Empire identifier +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_internal( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec_id BIGINT; + evt_id BIGINT; + msg_id BIGINT; + max_id BIGINT; +BEGIN + rec_id := msgs.goc_receiver( 'EMP'::receiver_type , e_id ); + max_id := 0; + FOR evt_id IN SELECT event_id FROM events.events + WHERE empire_id = e_id AND status = 'READY' + FOR UPDATE + LOOP + INSERT INTO msgs.messages ( receiver_id , event_content_id ) + VALUES ( rec_id , evt_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_empire( e_id , msg_id , TRUE ); + CONTINUE WHEN max_id > evt_id; + max_id := evt_id; + END LOOP; + UPDATE events.events SET status = 'SENT' + WHERE empire_id = e_id AND status = 'READY' AND event_id <= max_id; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Deliver pending internal messages +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_internal( ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + e_id INT; +BEGIN + FOR e_id IN SELECT DISTINCT empire_id FROM events.events + WHERE status = 'READY' + LOOP + PERFORM msgs.deliver_internal( e_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an empire to an empire +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_private( se_id INT , de_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + snd_id := msgs.goc_sender( 'EMP'::sender_type , se_id ); + rec_id := msgs.goc_receiver( 'EMP'::receiver_type , de_id ); + + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_empire( de_id , msg_id , TRUE ); + PERFORM msgs.deliver_to_empire( se_id , msg_id , FALSE ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an empire to an alliance +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_alliance( se_id INT , da_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + emp_id INT; + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + snd_id := msgs.goc_sender( 'EMP'::sender_type , se_id ); + rec_id := msgs.goc_receiver( 'ALL'::receiver_type , da_id ); + + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + + SELECT INTO emp_id alliance_id FROM emp.alliance_members WHERE empire_id = se_id AND NOT is_pending; + IF FOUND AND emp_id = da_id + THEN + FOR emp_id IN SELECT empire_id FROM emp.alliance_members + WHERE empire_id <> se_id AND NOT is_pending + AND alliance_id = da_id + LOOP + PERFORM msgs.deliver_to_empire( emp_id , msg_id , TRUE ); + END LOOP; + ELSE + SELECT INTO emp_id leader_id FROM emp.alliances WHERE id = da_id; + PERFORM msgs.deliver_to_empire( emp_id , msg_id , TRUE ); + END IF; + PERFORM msgs.deliver_to_empire( se_id , msg_id , FALSE ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an empire to an administrator +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_toadmin( se_id INT , da_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + snd_id := msgs.goc_sender( 'EMP'::sender_type , se_id ); + rec_id := msgs.goc_receiver( 'ADM'::receiver_type , da_id ); + + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_admin( da_id , msg_id , TRUE ); + PERFORM msgs.deliver_to_empire( se_id , msg_id , FALSE ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an administrator to an empire +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_admin_toempire( sa_id INT , de_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + snd_id := msgs.goc_sender( 'ADM'::sender_type , sa_id ); + rec_id := msgs.goc_receiver( 'EMP'::receiver_type , de_id ); + + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_empire( de_id , msg_id , TRUE ); + PERFORM msgs.deliver_to_admin( sa_id , msg_id , FALSE ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an administrator to an administrator +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_admin_toadmin( sa_id INT , da_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + snd_id := msgs.goc_sender( 'ADM'::sender_type , sa_id ); + rec_id := msgs.goc_receiver( 'ADM'::receiver_type , da_id ); + + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_admin( da_id , msg_id , TRUE ); + PERFORM msgs.deliver_to_admin( sa_id , msg_id , FALSE ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends a message from an administrator to all empires +-- + +CREATE OR REPLACE FUNCTION msgs.deliver_admin_spam( sa_id INT , ttl_txt TEXT , cnt_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + de_id INT; + snd_id BIGINT; + rec_id BIGINT; + tm_id BIGINT; + msg_id BIGINT; +BEGIN + PERFORM admin.write_log( sa_id , 'INFO'::log_level , 'Sending spam "' || ttl_txt || '"' ); + + snd_id := msgs.goc_sender( 'ADM'::sender_type , sa_id ); + INSERT INTO msgs.text_messages ( tick , title , contents ) + VALUES ( sys.get_tick() - 1 , ttl_txt , cnt_txt ) + RETURNING id INTO tm_id; + + FOR de_id IN SELECT name_id FROM emp.empires + LOOP + rec_id := msgs.goc_receiver( 'EMP'::receiver_type , de_id ); + INSERT INTO msgs.messages ( sender_id , receiver_id , text_content_id ) + VALUES ( snd_id , rec_id , tm_id ) + RETURNING id INTO msg_id; + PERFORM msgs.deliver_to_empire( de_id , msg_id , TRUE ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION msgs.deliver_admin_spam( INT , TEXT , TEXT ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- EMPIRE MESSAGE BOX AND MESSAGE SENDER -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +-- +-- Empire inbox +-- + +CREATE VIEW msgs.empire_inbox + AS SELECT db.id , db.empire_id , ( db.status = 'READ' ) AS read , + ( CASE + WHEN s.id IS NULL + THEN 'INT' + ELSE s.sender_type::TEXT + END ) AS sender_type , + ( CASE + WHEN s.id IS NULL + THEN NULL::INT + WHEN s.sender_type = 'EMP' + THEN s.empire_id + ELSE s.admin_id + END ) AS sender_id , + s.name AS sender_name , r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + WHEN r.receiver_type = 'ALL' + THEN r.alliance_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + ( tm.id IS NULL ) AS internal_message , + ( CASE + WHEN tm.id IS NULL + THEN evt.event_id + ELSE tm.id + END ) AS content_id , + ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) AS r_time + FROM msgs.empire_delivery db + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + LEFT OUTER JOIN msgs.senders s ON m.sender_id = s.id + LEFT OUTER JOIN events.events evt ON evt.event_id = m.event_content_id + LEFT OUTER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + WHERE db.in_inbox AND db.status <> 'DELETED' + ORDER BY ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) DESC; + +GRANT SELECT ON msgs.empire_inbox TO :dbuser; + + +-- +-- Empire outbox +-- + +CREATE VIEW msgs.empire_outbox + AS SELECT db.id , db.empire_id , TRUE AS read , + 'EMP'::TEXT AS sender_type , db.empire_id AS sender_id , en.name AS sender_name , + r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + WHEN r.receiver_type = 'ALL' + THEN r.alliance_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + FALSE AS internal_message , + tm.id AS content_id , tm.t AS r_time + FROM msgs.empire_delivery db + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + INNER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + INNER JOIN naming.empire_names en ON en.id = db.empire_id + WHERE NOT db.in_inbox AND db.status <> 'DELETED' + ORDER BY tm.t DESC; + +GRANT SELECT ON msgs.empire_outbox TO :dbuser; + + +-- +-- Sends a message from an empire to a target +-- +-- Parameters: +-- e_id Empire sending a message +-- to_type Type of message target (empire, alliance or admin) +-- to_name Name of the message target +-- ttl_txt Title of the message +-- cnt_txt Contents of the message +-- do_send Whether the message should actually be sent (used to verify target existence) +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 unknown target +-- 2 too soon +-- + +CREATE OR REPLACE FUNCTION msgs.send_message( e_id INT , to_type receiver_type , to_name TEXT , ttl_txt TEXT , + cnt_txt TEXT , do_send BOOLEAN , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + tg_id INT; + s_meth TEXT; +BEGIN + -- Find target and sending method + IF to_type = 'ADM' + THEN + s_meth := 'toadmin'; + SELECT INTO tg_id id FROM admin.administrators + WHERE lower( appear_as ) = lower( to_name ); + ELSEIF to_type = 'EMP' + THEN + s_meth := 'private'; + SELECT INTO tg_id id FROM naming.empire_names n + INNER JOIN emp.empires e ON e.name_id = n.id + WHERE lower( name ) = lower( to_name ); + ELSE + s_meth := 'alliance'; + SELECT INTO tg_id id FROM emp.alliances + WHERE lower( tag ) = lower( to_name ); + END IF; + IF NOT FOUND + THEN + err_code := 1; + RETURN; + END IF; + + -- Check last message sent by this empire + PERFORM r_time FROM msgs.empire_outbox WHERE empire_id = e_id AND r_time > now() - '20s'::INTERVAL; + IF FOUND + THEN + err_code := 2; + RETURN; + END IF; + + -- Send message (or not) + IF do_send + THEN + PERFORM sys.write_log( 'Messages' , 'DEBUG'::log_level , 'Delivering message from empire #' || e_id + || ' using method ' || s_meth || ' with target identifier ' || tg_id || ' (title text null? ' + || ( ttl_txt IS NULL ) || ' ; content text null? ' || (cnt_txt IS NULL) || ')' ); + EXECUTE 'SELECT msgs.deliver_' || s_meth || '( $1 , $2 , $3 , $4 )' + USING e_id , tg_id , ttl_txt , cnt_txt; + ELSE + PERFORM sys.write_log( 'Messages' , 'DEBUG'::log_level , 'Simulated message delivery from empire #' || e_id + || ' using method ' || s_meth || ' with target identifier ' || tg_id || ' (title text null? ' + || ( ttl_txt IS NULL ) || ' ; content text null? ' || (cnt_txt IS NULL) || ')' ); + END IF; + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION msgs.send_message( INT , receiver_type , TEXT , TEXT , TEXT , BOOLEAN ) TO :dbuser; + + + +-- +-- Marks specific messages as read in an empire's inbox +-- +-- Parameters: +-- e_id Empire identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_mark_read( e_id INT , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'READ' + WHERE empire_id = $1 AND status = 'UNREAD' AND id = ANY( $2 ) AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_mark_read( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as read in an empire's inbox +-- +-- Parameters: +-- e_id Empire identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_mark_read( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'READ' + WHERE empire_id = $1 AND status = 'UNREAD' AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_mark_read( INT ) TO :dbuser; + + + +-- +-- Marks specific messages as unread in an empire's inbox +-- +-- Parameters: +-- e_id Empire identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_mark_unread( e_id INT , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'UNREAD' + WHERE empire_id = $1 AND status = 'READ' AND id = ANY( $2 ) AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_mark_unread( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as unread in an empire's inbox +-- +-- Parameters: +-- e_id Empire identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_mark_unread( e_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'UNREAD' + WHERE empire_id = $1 AND status = 'READ' AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_mark_unread( INT ) TO :dbuser; + + + +-- +-- Marks specific messages as deleted in an empire's inbox or outbox +-- +-- Parameters: +-- e_id Empire identifier +-- inbox Whether the affected messages are in the empire's inbox or in its outbox +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_delete( e_id INT , inbox BOOLEAN , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'DELETED' + WHERE empire_id = $1 AND status <> 'DELETED' AND id = ANY( $3 ) AND in_inbox = $2 +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_delete( INT , BOOLEAN , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as deleted in an empire's inbox or outbox +-- +-- Parameters: +-- e_id Empire identifier +-- inbox Whether the affected messages are in the empire's inbox or in its outbox +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.empire_delete( e_id INT , inbox BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery + SET status = 'DELETED' + WHERE empire_id = $1 AND status <> 'DELETED' AND in_inbox = $2 +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.empire_delete( INT , BOOLEAN ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- ADMINISTRATOR MESSAGE BOX AND MESSAGE SENDER -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Admin inbox +-- + +CREATE VIEW msgs.admin_inbox + AS SELECT db.id , db.admin_id , ( db.status = 'READ' ) AS read , + s.sender_type::TEXT AS sender_type , + ( CASE + WHEN s.sender_type = 'EMP' + THEN s.empire_id + ELSE s.admin_id + END ) AS sender_id , + s.name AS sender_name , r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + FALSE AS internal_message , + tm.id AS content_id , + tm.t AS r_time + FROM msgs.admin_delivery db + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + INNER JOIN msgs.senders s ON m.sender_id = s.id + INNER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + WHERE db.in_inbox AND db.status <> 'DELETED' + ORDER BY tm.t DESC; + +GRANT SELECT ON msgs.admin_inbox TO :dbuser; + + +-- +-- Admin outbox +-- + +CREATE VIEW msgs.admin_outbox + AS SELECT db.id , db.admin_id , TRUE AS read , + 'ADM'::TEXT AS sender_type , db.admin_id AS sender_id , + a.appear_as AS sender_name , r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + FALSE AS internal_message , + tm.id AS content_id , + tm.t AS r_time + FROM msgs.admin_delivery db + INNER JOIN admin.administrators a ON a.id = db.admin_id + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + INNER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + WHERE NOT db.in_inbox AND db.status <> 'DELETED' + ORDER BY tm.t DESC; + +GRANT SELECT ON msgs.admin_outbox TO :dbuser; + + + +-- +-- Sends a message from an administrator to a target +-- +-- Parameters: +-- a_id Administrator sending a message +-- to_type Type of message target (empire or admin) +-- to_name Name of the message target +-- ttl_txt Title of the message +-- cnt_txt Contents of the message +-- do_send Whether the message should actually be sent (used to verify target existence) +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 unknown target +-- + +CREATE OR REPLACE FUNCTION msgs.send_admin_message( a_id INT , to_type receiver_type , to_name TEXT , ttl_txt TEXT , + cnt_txt TEXT , do_send BOOLEAN , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + tg_id INT; + s_meth TEXT; +BEGIN + -- Find target and sending method + IF to_type = 'ADM' + THEN + s_meth := 'toadmin'; + SELECT INTO tg_id id FROM admin.administrators + WHERE lower( appear_as ) = lower( to_name ); + ELSEIF to_type = 'EMP' + THEN + s_meth := 'toempire'; + SELECT INTO tg_id id FROM naming.empire_names n + INNER JOIN emp.empires e ON e.name_id = n.id + WHERE lower( name ) = lower( to_name ); + ELSE + err_code := 1; + RETURN; + END IF; + IF NOT FOUND + THEN + err_code := 1; + RETURN; + ELSEIF to_type = 'EMP' AND do_send + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Sending message "' || ttl_txt + || '" to empire #' || tg_id || ' ("' || to_name || '")' ); + END IF; + + -- Send message (or not) + IF do_send + THEN + PERFORM sys.write_log( 'Messages' , 'DEBUG'::log_level , 'Delivering message from admin #' || a_id + || ' using method ' || s_meth || ' with target identifier ' || tg_id || ' (title text null? ' + || ( ttl_txt IS NULL ) || ' ; content text null? ' || (cnt_txt IS NULL) || ')' ); + EXECUTE 'SELECT msgs.deliver_admin_' || s_meth || '( $1 , $2 , $3 , $4 )' + USING a_id , tg_id , ttl_txt , cnt_txt; + ELSE + PERFORM sys.write_log( 'Messages' , 'DEBUG'::log_level , 'Simulated message delivery from admin #' || a_id + || ' using method ' || s_meth || ' with target identifier ' || tg_id || ' (title text null? ' + || ( ttl_txt IS NULL ) || ' ; content text null? ' || (cnt_txt IS NULL) || ')' ); + END IF; + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION msgs.send_admin_message( INT , receiver_type , TEXT , TEXT , TEXT , BOOLEAN ) TO :dbuser; + + + +-- +-- Marks specific messages as read in an admin's inbox +-- +-- Parameters: +-- a_id Admin identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_mark_read( a_id INT , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'READ' + WHERE admin_id = $1 AND status = 'UNREAD' AND id = ANY( $2 ) AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_mark_read( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as read in an admin's inbox +-- +-- Parameters: +-- a_id Admin identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_mark_read( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'READ' + WHERE admin_id = $1 AND status = 'UNREAD' AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_mark_read( INT ) TO :dbuser; + + + +-- +-- Marks specific messages as unread in an admin's inbox +-- +-- Parameters: +-- a_id Admin identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_mark_unread( a_id INT , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'UNREAD' + WHERE admin_id = $1 AND status = 'READ' AND id = ANY( $2 ) AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_mark_unread( INT , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as unread in an admin's inbox +-- +-- Parameters: +-- a_id Admin identifier +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_mark_unread( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'UNREAD' + WHERE admin_id = $1 AND status = 'READ' AND in_inbox +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_mark_unread( INT ) TO :dbuser; + + + +-- +-- Marks specific messages as deleted in an admin's inbox or outbox +-- +-- Parameters: +-- a_id Admin identifier +-- inbox Whether the affected messages are in the admin's inbox or in its outbox +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_delete( a_id INT , inbox BOOLEAN , m_ids BIGINT[] ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'DELETED' + WHERE admin_id = $1 AND status <> 'DELETED' AND id = ANY( $3 ) AND in_inbox = $2 +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_delete( INT , BOOLEAN , BIGINT[] ) TO :dbuser; + + + +-- +-- Marks all messages as deleted in an admin's inbox or outbox +-- +-- Parameters: +-- e_id Admin identifier +-- inbox Whether the affected messages are in the admin's inbox or in its outbox +-- m_ids Message identifiers +-- + +CREATE OR REPLACE FUNCTION msgs.admin_delete( e_id INT , inbox BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.admin_delivery + SET status = 'DELETED' + WHERE admin_id = $1 AND status <> 'DELETED' AND in_inbox = $2 +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.admin_delete( INT , BOOLEAN ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- VIEWS/FUNCTIONS USED BY THE E-MAIL NOTIFICATIONS / RECAP SYSTEM -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- General mailing information +-- + +CREATE VIEW msgs.last_unmailed_view + AS SELECT empire_id AS empire , max( id ) AS message + FROM msgs.empire_delivery + WHERE NOT emailed + GROUP BY empire_id; + +CREATE VIEW msgs.last_unrecaped_view + AS SELECT empire_id AS empire , max( id ) AS message + FROM msgs.empire_delivery + WHERE NOT recaped + GROUP BY empire_id; + +CREATE VIEW msgs.mail_sender_view + AS SELECT e.name_id AS empire , en.name AS empire_name , + lang.language AS language , addr.address AS address , + pprv.value AS on_private , pall.value AS on_alliance , + pint.value AS on_internal , padm.value AS on_admin , + lum.message AS last_unmailed , lrm.message AS last_unrecaped , + ( emn.account_id IS NULL ) AS can_notify + FROM emp.empires e + LEFT OUTER JOIN msgs.last_unmailed_view lum + ON lum.empire = e.name_id + LEFT OUTER JOIN msgs.last_unrecaped_view lrm + ON lrm.empire = e.name_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.credentials cred ON cred.address_id = en.owner_id + INNER JOIN defs.languages lang ON lang.id = cred.language_id + INNER JOIN users.addresses addr ON addr.id = cred.address_id + INNER JOIN users.preferences_view pprv + ON pprv.account_id = addr.id AND pprv.pref_name = 'mailOnPM' + INNER JOIN users.preferences_view pall + ON pall.account_id = addr.id AND pall.pref_name = 'mailOnAlliance' + INNER JOIN users.preferences_view pint + ON pint.account_id = addr.id AND pint.pref_name = 'mailOnIM' + INNER JOIN users.preferences_view padm + ON padm.account_id = addr.id AND padm.pref_name = 'mailOnAdmin' + LEFT OUTER JOIN msgs.email_notifications emn + ON emn.account_id = addr.id; + + +CREATE OR REPLACE FUNCTION msgs.get_mail_data( ) + RETURNS SETOF msgs.mail_sender_view + STRICT VOLATILE + SECURITY DEFINER +AS $$ + DELETE FROM msgs.email_notifications + WHERE now() - last_sent >= '1h'::interval; + SELECT * FROM msgs.mail_sender_view; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.get_mail_data( ) TO :dbuser; + + +-- +-- Instant notifications view and update function +-- + +CREATE VIEW msgs.empire_instant + AS SELECT db.id , db.empire_id , + ( CASE + WHEN s.id IS NULL + THEN 'INT' + ELSE s.sender_type::TEXT + END ) AS sender_type , + ( CASE + WHEN s.id IS NULL + THEN NULL::INT + WHEN s.sender_type = 'EMP' + THEN s.empire_id + ELSE s.admin_id + END ) AS sender_id , + s.name AS sender_name , r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + WHEN r.receiver_type = 'ALL' + THEN r.alliance_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + ( tm.id IS NULL ) AS internal_message , + ( CASE + WHEN tm.id IS NULL + THEN evt.event_id + ELSE tm.id + END ) AS content_id , + ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) AS r_time + FROM msgs.empire_delivery db + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + LEFT OUTER JOIN msgs.senders s ON m.sender_id = s.id + LEFT OUTER JOIN events.events evt ON evt.event_id = m.event_content_id + LEFT OUTER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + WHERE db.in_inbox AND db.status = 'UNREAD' AND NOT db.emailed + ORDER BY ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) DESC; + +GRANT SELECT ON msgs.empire_instant TO :dbuser; + + +CREATE OR REPLACE FUNCTION msgs.mark_instant_notifications( e_id INT , m_id BIGINT , sending BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE msgs.empire_delivery SET emailed = TRUE + WHERE empire_id = e_id AND id <= m_id; + IF sending + THEN + INSERT INTO msgs.email_notifications ( account_id ) + SELECT owner_id FROM naming.empire_names WHERE id = e_id; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION msgs.mark_instant_notifications( INT , BIGINT , BOOLEAN ) TO :dbuser; + + + +-- +-- Recaps view, update function and check function +-- + +CREATE VIEW msgs.empire_recap + AS SELECT db.id , db.empire_id , + ( CASE + WHEN s.id IS NULL + THEN 'INT' + ELSE s.sender_type::TEXT + END ) AS sender_type , + ( CASE + WHEN s.id IS NULL + THEN NULL::INT + WHEN s.sender_type = 'EMP' + THEN s.empire_id + ELSE s.admin_id + END ) AS sender_id , + s.name AS sender_name , r.receiver_type , + ( CASE + WHEN r.receiver_type = 'EMP' + THEN r.empire_id + WHEN r.receiver_type = 'ALL' + THEN r.alliance_id + ELSE r.admin_id + END ) AS receiver_id , r.name AS receiver_name , + ( tm.id IS NULL ) AS internal_message , + ( CASE + WHEN tm.id IS NULL + THEN evt.event_id + ELSE tm.id + END ) AS content_id , + ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) AS r_time + FROM msgs.empire_delivery db + INNER JOIN msgs.messages m ON m.id = db.message_id + INNER JOIN msgs.receivers r ON r.id = m.receiver_id + LEFT OUTER JOIN msgs.senders s ON m.sender_id = s.id + LEFT OUTER JOIN events.events evt ON evt.event_id = m.event_content_id + LEFT OUTER JOIN msgs.text_messages tm ON tm.id = m.text_content_id + WHERE db.in_inbox AND NOT db.recaped + ORDER BY ( CASE + WHEN tm.id IS NULL + THEN evt.real_time + ELSE tm.t + END ) DESC; + +GRANT SELECT ON msgs.empire_recap TO :dbuser; + + +CREATE OR REPLACE FUNCTION msgs.mark_recaps( e_id INT , m_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + UPDATE msgs.empire_delivery SET recaped = TRUE + WHERE empire_id = $1 AND id <= $2; +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.mark_recaps( INT , BIGINT ) TO :dbuser; + + +CREATE OR REPLACE FUNCTION msgs.is_recap_time( ) + RETURNS BOOLEAN + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + UPDATE sys.status SET last_msg_recap = now() + WHERE now() - last_msg_recap > '1d'::INTERVAL; + RETURN FOUND; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION msgs.is_recap_time( ) TO :dbuser; + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- CLEANUP FUNCTION -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +CREATE OR REPLACE FUNCTION msgs.cleanup() + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER +AS $$ + DELETE FROM msgs.empire_delivery + WHERE emailed AND recaped AND status = 'DELETED'; + DELETE FROM msgs.admin_delivery + WHERE emailed AND status = 'DELETED'; + DELETE FROM msgs.messages WHERE id IN ( + SELECT m.id FROM msgs.messages m + LEFT OUTER JOIN msgs.empire_delivery ed ON m.id = ed.message_id + LEFT OUTER JOIN msgs.admin_delivery ad ON m.id = ad.message_id + WHERE ad.id IS NULL AND ed.id IS NULL + ); + DELETE FROM msgs.receivers WHERE id IN ( + SELECT r.id FROM msgs.receivers r + LEFT OUTER JOIN msgs.messages m ON m.receiver_id = r.id + WHERE m.id IS NULL + ); + DELETE FROM msgs.senders WHERE id IN ( + SELECT s.id FROM msgs.senders s + LEFT OUTER JOIN msgs.messages m ON m.sender_id = s.id + WHERE m.id IS NULL + ); + DELETE FROM msgs.text_messages WHERE id IN ( + SELECT t.id FROM msgs.text_messages t + LEFT OUTER JOIN msgs.messages m ON m.text_content_id = t.id + WHERE m.id IS NULL + ); + DELETE FROM events.events WHERE event_id IN ( + SELECT e.event_id FROM events.events e + LEFT OUTER JOIN msgs.messages m ON m.event_content_id = e.event_id + WHERE m.id IS NULL AND e.status = 'SENT' + ); +$$ LANGUAGE SQL; + +GRANT EXECUTE ON FUNCTION msgs.cleanup( ) TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/190-admin-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/190-admin-functions.sql new file mode 100644 index 0000000..fdf8c79 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/190-admin-functions.sql @@ -0,0 +1,937 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Functions and views to manage administrative accounts +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- ADMINISTRATOR MANAGEMENT FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Creates an administrative user +-- +-- Parameters: +-- u_addr User account address +-- a_name Administrative name +-- privs Administrative privileges +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 unknown user +-- 2 invalid user status +-- 3 name already in use +-- 4 user already has admin access +-- admin_id Administrator ID or NULL on failure +-- + +CREATE OR REPLACE FUNCTION admin.create_admin( IN u_addr TEXT , IN a_name TEXT , IN privs INT , + OUT err_code INT , OUT admin_id INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; + u_stat TEXT; + p_sha1 TEXT; + p_md5 TEXT; +BEGIN + -- Get user ID, status and password hashes + SELECT INTO u_id , u_stat , p_sha1 , p_md5 id , status , pass_sha1 , pass_md5 + FROM users.accounts_view + WHERE address = lower( u_addr ); + IF NOT FOUND + THEN + err_code := 1; + RETURN; + ELSEIF u_stat IN ( 'UNCONFIRMED' , 'BANNED' ) + THEN + err_code := 2; + RETURN; + END IF; + + -- Try adding the admin's record + BEGIN + INSERT INTO admin.administrators ( appear_as , pass_md5 , pass_sha1 , privileges ) + VALUES ( a_name , p_md5 , p_sha1 , privs ) + RETURNING id INTO admin_id; + EXCEPTION + WHEN unique_violation THEN + err_code := 3; + RETURN; + END; + + -- Add the admin <-> user relation + BEGIN + INSERT INTO admin.admin_credentials ( administrator_id , credentials_id ) + VALUES ( admin_id , u_id ); + err_code := 0; + PERFORM admin.write_log( admin_id , 'INFO'::log_level , 'Administrator ' || a_name || ' created' ); + EXCEPTION + WHEN unique_violation THEN + DELETE FROM admin.administrators WHERE id = admin_id; + err_code := 4; + admin_id := NULL; + END; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.create_admin( TEXT, TEXT , INT ) TO :dbuser; + + + +-- +-- Type indicating the result of a connection attempt +-- + +CREATE TYPE admin_connection_result + AS ENUM( 'SUCCESS' , 'PASSWORD' , 'INACTIVE' ); + + + +-- +-- Log a connection attempt +-- +-- Parameters: +-- a_id Administrator identifier +-- c_res Connection attempt result +-- addr IP address +-- + +CREATE OR REPLACE FUNCTION admin.log_connection( a_id INT , c_res admin_connection_result , addr TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + IF c_res = 'SUCCESS' + THEN + PERFORM admin.write_log( a_id , 'DEBUG'::log_level , 'Successful login attempt from ' || addr ); + ELSEIF c_res = 'PASSWORD' + THEN + PERFORM admin.write_log( a_id , 'WARNING'::log_level , 'Failed login attempt from ' || addr + || ' (incorrect password)' ); + ELSEIF c_res = 'INACTIVE' + THEN + PERFORM admin.write_log( a_id , 'WARNING'::log_level , 'Failed login attempt from ' || addr + || ' (inactive administrator)' ); + ELSE + RAISE EXCEPTION 'Unknown connection attempt result value: %' , c_res; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.log_connection( INT , admin_connection_result , TEXT ) TO :dbuser; + + + +-- +-- Log a disconnection +-- +-- Parameters: +-- a_id Administrator identifier +-- + +CREATE OR REPLACE FUNCTION admin.log_disconnection( a_id INT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + PERFORM admin.write_log( a_id , 'DEBUG'::log_level , 'Administrator disconnected' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.log_disconnection( INT ) TO :dbuser; + + + +-- +-- Modifies an administrator's password +-- +-- Parameters: +-- a_id Administrator identifier +-- p_sha1 SHA-1 hash of the new password +-- p_md5 MD5 hash of the new password +-- +-- Returns: +-- success Whether the operation was successful +-- + +CREATE OR REPLACE FUNCTION admin.set_password( a_id INT , p_sha1 TEXT , p_md5 TEXT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_sha1 TEXT; + u_md5 TEXT; +BEGIN + SELECT INTO u_sha1 , u_md5 c.pass_sha1 , c.pass_md5 + FROM admin.admins_view a + INNER JOIN users.credentials c ON c.address_id = a.account_id + WHERE a.administrator_id = a_id AND a.active; + success := ( FOUND AND u_sha1 <> p_sha1 AND u_md5 <> p_md5 ); + + IF success + THEN + UPDATE admin.administrators + SET pass_sha1 = p_sha1 , pass_md5 = p_md5 + WHERE id = a_id; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.set_password( INT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Resets an administrator's password to his/her player account password +-- +-- Parameters: +-- a_id Administrator identifier +-- su_id Superuser identifier +-- +-- Returns: +-- success Whether the operation was successful +-- + +CREATE OR REPLACE FUNCTION admin.reset_password( a_id INT , su_id INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_sha1 TEXT; + u_md5 TEXT; + a_name TEXT; +BEGIN + SELECT INTO u_sha1 , u_md5 , a_name c.pass_sha1 , c.pass_md5 , a.name + FROM admin.admins_view a + INNER JOIN users.credentials c ON c.address_id = a.account_id + WHERE a.administrator_id = a_id AND a.active; + success := FOUND; + + IF success + THEN + UPDATE admin.administrators SET pass_sha1 = u_sha1 , pass_md5 = u_md5 + WHERE id = a_id; + PERFORM admin.write_log( su_id , 'INFO'::log_level , 'Reset password of administrator ' || a_name ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.reset_password( INT , INT ) TO :dbuser; + + + +-- +-- Modifies an administrator's privileges +-- +-- Parameters: +-- a_id Administrator identifier +-- su_id Superuser identifier +-- n_privs New privileges +-- +-- Returns: +-- success Whether the operation was successful +-- + +CREATE OR REPLACE FUNCTION admin.set_privileges( a_id INT , su_id INT , n_privs INT , OUT success BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + a_name TEXT; + o_privs INT; +BEGIN + SELECT INTO a_name , o_privs a.name , a.privileges + FROM admin.admins_view a + WHERE a.administrator_id = a_id AND a.address IS NOT NULL; + success := FOUND; + + IF success AND n_privs <> o_privs + THEN + UPDATE admin.administrators SET privileges = n_privs + WHERE id = a_id; + PERFORM admin.write_log( su_id , 'INFO'::log_level , 'Set privileges of administrator ' || a_name + || ' from ' || o_privs || ' to ' || n_privs ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.set_privileges( INT , INT , INT ) TO :dbuser; + + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- ADMINISTRATOR VIEWS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Active administrators +-- + +CREATE VIEW admin.admins_view + AS SELECT adm.id AS administrator_id , adm.appear_as AS name , adm.privileges AS privileges , + adm.pass_sha1 , adm.pass_md5 , addr.id AS account_id , addr.address AS address , + ( addr.id IS NOT NULL AND privileges <> 0 ) AS active , + ( adm.pass_sha1 = cred.pass_sha1 AND adm.pass_md5 = cred.pass_md5 ) AS pass_change_required + FROM admin.administrators adm + LEFT OUTER JOIN admin.admin_credentials ac ON ac.administrator_id = adm.id + LEFT OUTER JOIN users.credentials cred ON cred.address_id = ac.credentials_id + LEFT OUTER JOIN users.addresses addr ON addr.id = ac.credentials_id; + +GRANT SELECT ON admin.admins_view TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- BANHAMMER FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Creates a ban request +-- +-- Parameters: +-- a_id Administrator identifier +-- u_id User identifier +-- r_txt Reason for the ban request +-- +-- Returns: +-- Whether the operation was successful or not +-- + +CREATE OR REPLACE FUNCTION admin.add_ban_request( a_id INT , u_id INT , r_txt TEXT ) + RETURNS BOOLEAN + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + ban_id INT; +BEGIN + INSERT INTO admin.ban_requests ( requested_by , reason ) + VALUES ( a_id , r_txt ) + RETURNING id INTO ban_id; + + BEGIN + INSERT INTO admin.active_ban_requests( request_id , credentials_id ) + VALUES( ban_id , u_id ); + RETURN TRUE; + EXCEPTION + WHEN unique_violation THEN + DELETE FROM admin.ban_requests WHERE id = ban_id; + RETURN FALSE; + END; +END; +$$ LANGUAGE plpgsql; + + + + +-- +-- Creates a ban request using an email address as the source +-- +-- Parameters: +-- a_id Administrator identifier +-- u_addr Target user's address +-- r_txt Reason for the ban request +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 user not found +-- 2 duplicate request +-- + +CREATE OR REPLACE FUNCTION admin.request_ban_on_address( a_id INT , u_addr TEXT , r_txt TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; +BEGIN + SELECT INTO u_id id FROM users.accounts_view + WHERE address = u_addr; + IF NOT FOUND + THEN + err_code := 1; + RETURN; + END IF; + + IF admin.add_ban_request( a_id , u_id , r_txt ) + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Requested ban of user #' || u_id || ' (address: ' || u_addr || ')' ); + err_code := 0; + ELSE + err_code := 2; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.request_ban_on_address( INT , TEXT, TEXT ) TO :dbuser; + + + +-- +-- Creates a ban request using an empire name as the source +-- +-- Parameters: +-- a_id Administrator identifier +-- u_emp Target user's empire name +-- r_txt Reason for the ban request +-- +-- Returns: +-- err_code Error code: +-- 0 success +-- 1 user not found +-- 2 duplicate request +-- + +CREATE OR REPLACE FUNCTION admin.request_ban_on_empire( a_id INT , u_emp TEXT , r_txt TEXT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; +BEGIN + SELECT INTO u_id owner_id FROM naming.empire_names + WHERE lower(name) = lower(u_emp); + IF NOT FOUND + THEN + err_code := 1; + RETURN; + END IF; + + IF admin.add_ban_request( a_id , u_id , r_txt ) + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Requested ban of user #' || u_id || ' (empire name: ' || u_emp || ')' ); + err_code := 0; + ELSE + err_code := 2; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.request_ban_on_empire( INT , TEXT, TEXT ) TO :dbuser; + + + +-- +-- Rejects a ban request +-- +-- Parameters: +-- a_id Administrator identifier +-- b_id Ban request identifier +-- r_txt Rejection reason +-- + +CREATE OR REPLACE FUNCTION admin.reject_ban_request( a_id INT , b_id INT , r_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; +BEGIN + -- Make sure the request exists and hasn't been validated + SELECT INTO u_id credentials_id FROM admin.active_ban_requests + WHERE request_id = b_id AND NOT validated + FOR UPDATE; + IF NOT FOUND + THEN + RETURN; + END IF; + PERFORM * FROM admin.ban_requests WHERE id = b_id FOR UPDATE; + + -- Insert archive entry + INSERT INTO admin.archived_ban_requests( request_id , credentials_id ) + VALUES ( b_id , u_id ); + INSERT INTO admin.rejected_ban_requests( request_id , rejected_by , reason ) + VALUES ( b_id , a_id , r_txt ); + DELETE FROM admin.active_ban_requests WHERE request_id = b_id; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Rejected ban of user #' || u_id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.reject_ban_request( INT , INT , TEXT ) TO :dbuser; + + + +-- +-- Confirms a ban request +-- +-- Parameters: +-- a_id Administrator identifier +-- b_id Ban request identifier +-- +-- Returns: +-- success Whether the operation was successful +-- addr User's email address +-- lang User's language +-- r_txt Reason for the ban +-- + +CREATE OR REPLACE FUNCTION admin.confirm_ban_request( a_id INT , b_id INT , OUT success BOOLEAN , OUT addr TEXT , OUT lang TEXT , OUT r_txt TEXT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; + br_id INT; +BEGIN + -- Make sure there is an active, unvalidated ban request + SELECT INTO u_id credentials_id FROM admin.active_ban_requests + WHERE request_id = b_id AND NOT validated FOR UPDATE; + IF NOT FOUND + THEN + success := FALSE; + RETURN; + END IF; + + -- Make sure the request was created by another admin + SELECT INTO br_id , r_txt requested_by , reason FROM admin.ban_requests + WHERE id = b_id AND requested_by <> a_id + FOR UPDATE; + IF NOT FOUND + THEN + success := FALSE; + RETURN; + END IF; + + -- Mark request as validated + INSERT INTO admin.validated_ban_requests ( request_id , validated_by ) + VALUES ( b_id , a_id ); + UPDATE admin.active_ban_requests SET validated = TRUE + WHERE request_id = b_id; + + -- Update account + PERFORM * FROM users.credentials WHERE address_id = u_id FOR UPDATE; + LOOP + UPDATE users.inactive_accounts SET since = now( ) , status = 'PROCESSED' + WHERE credentials_id = u_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO users.inactive_accounts ( credentials_id , since , status ) + VALUES ( u_id , now() , 'PROCESSED' ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + + -- Insert ban entry + INSERT INTO users.bans ( account_id , ban_id ) + VALUES( u_id , b_id ); + + -- Set ban reason + LOOP + UPDATE users.reasons SET reason = r_txt WHERE account_id = u_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO users.reasons( account_id , reason ) + VALUES ( u_id , r_txt ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + + success := TRUE; + SELECT INTO addr , lang a.address , l.language + FROM users.credentials c + INNER JOIN users.addresses a ON a.id = c.address_id + INNER JOIN defs.languages l ON l.id = c.language_id + WHERE c.address_id = u_id; + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Confirmed ban request on user #' || u_id ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.confirm_ban_request( INT , INT ) TO :dbuser; + + + +-- +-- Lifts an existing ban +-- +-- Parameters: +-- a_id Administrator identifier +-- b_id Ban identifier +-- +-- Returns: +-- success Whether the operation was successful +-- addr User's email address +-- lang User's language +-- + +CREATE OR REPLACE FUNCTION admin.lift_ban( a_id INT , b_id INT , OUT success BOOLEAN , OUT addr TEXT , OUT lang TEXT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + u_id INT; + redeem BOOLEAN; +BEGIN + -- Find / lock the ban and user records + SELECT INTO u_id , redeem ab.credentials_id , ( aa.credentials_id IS NOT NULL ) + FROM admin.active_ban_requests ab + INNER JOIN admin.ban_requests br ON br.id = ab.request_id + INNER JOIN users.credentials c ON c.address_id = ab.credentials_id + LEFT OUTER JOIN users.active_accounts aa ON aa.credentials_id = c.address_id + WHERE ab.request_id = b_id AND ab.validated + FOR UPDATE OF ab , br , c; + IF NOT FOUND + THEN + success := FALSE; + RETURN; + END IF; + + -- Delete the ban and reason records, and redeem the account if possible + DELETE FROM users.bans WHERE account_id = u_id; + DELETE FROM users.reasons WHERE account_id = u_id; + IF redeem + THEN + DELETE FROM users.inactive_accounts WHERE credentials_id = u_id; + END IF; + + -- Delete active and validated ban entries + DELETE FROM admin.validated_ban_requests WHERE request_id = b_id; + DELETE FROM admin.active_ban_requests WHERE request_id = b_id; + + -- Insert archive records + INSERT INTO admin.archived_ban_requests( request_id , credentials_id ) + VALUES ( b_id , u_id ); + INSERT INTO admin.rejected_ban_requests( request_id , rejected_by , reason ) + VALUES ( b_id , a_id , '(ban lifted)' ); + + success := TRUE; + SELECT INTO addr , lang a.address , l.language + FROM users.credentials c + INNER JOIN users.addresses a ON a.id = c.address_id + INNER JOIN defs.languages l ON l.id = c.language_id + WHERE c.address_id = u_id; + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Ban on user #' || u_id || ' has been lifted' + || (CASE WHEN redeem THEN ' (empire redeemed)' ELSE '' END) ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.lift_ban( INT , INT ) TO :dbuser; + + + +-- +-- Causes ban requests to expire +-- + +CREATE OR REPLACE FUNCTION admin.expire_ban_requests( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + b_id INT; + u_id INT; +BEGIN + FOR b_id , u_id IN SELECT br.id , ab.credentials_id FROM admin.ban_requests br + INNER JOIN admin.active_ban_requests ab + ON ab.request_id = br.id AND NOT validated + WHERE now() - br.requested >= ( floor( sys.get_constant( 'accounts.banExpiration') ) || 's' )::INTERVAL + FOR UPDATE + LOOP + INSERT INTO admin.archived_ban_requests ( request_id , credentials_id ) + VALUES ( b_id , u_id ); + DELETE FROM admin.active_ban_requests WHERE request_id = b_id; + PERFORM sys.write_log( 'Bans' , 'INFO'::log_level , 'Ban request #' || b_id + || ' (user account #' || u_id || ') expired' ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.expire_ban_requests( ) TO :dbuser; + + + +-- +-- Checks for banned players who still have empires past the expiration delay +-- and deletes the empires. +-- +-- Returns: +-- Whether an empire was deleted +-- + +CREATE OR REPLACE FUNCTION admin.delete_banned_empires( ) + RETURNS BOOLEAN + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_id INT; + a_id INT; +BEGIN + SELECT INTO e_id , a_id e.name_id , c.address_id + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.credentials c ON c.address_id = en.owner_id + INNER JOIN users.active_accounts aa ON aa.credentials_id = c.address_id + INNER JOIN users.inactive_accounts ia ON ia.credentials_id = c.address_id + INNER JOIN users.bans b ON b.account_id = ia.credentials_id + WHERE now() - ia.since >= ( floor( sys.get_constant( 'accounts.banDelay') ) || 's' )::INTERVAL + FOR UPDATE LIMIT 1; + IF NOT FOUND + THEN + RETURN FALSE; + END IF; + + -- Delete empire and active account record + PERFORM emp.delete_empire( e_id ); + DELETE FROM users.active_accounts WHERE credentials_id = a_id; + PERFORM sys.write_log( 'Bans' , 'INFO'::log_level , 'Deleted empire #' || e_id + || ' (user account #' || a_id || ')' ); + + RETURN TRUE; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.delete_banned_empires( ) TO :dbuser; + + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- VIEWS RELATED TO THE BANHAMMER -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Pending requests +-- + +CREATE VIEW admin.pending_bans + AS SELECT r.id , r.requested_by AS requested_by_id , a.appear_as AS requested_by_name , + r.reason , r.requested , ab.credentials_id AS account_id , ad.address AS account_mail + FROM admin.ban_requests r + INNER JOIN admin.active_ban_requests ab + ON ab.request_id = r.id AND NOT ab.validated + INNER JOIN admin.administrators a ON a.id = r.requested_by + INNER JOIN users.addresses ad ON ad.id = ab.credentials_id; + +GRANT SELECT ON admin.pending_bans TO :dbuser; + + +-- +-- Expired / rejected ban requests +-- + +CREATE VIEW admin.cancelled_bans + AS SELECT r.id , r.requested_by AS requested_by_id , a.appear_as AS requested_by_name , + r.reason , r.requested , ab.credentials_id AS account_id , ad.address AS account_mail , + ab.updated , ( rb.request_id IS NULL ) AS expired , + rb.rejected_by AS rejected_by_id , ra.appear_as AS rejected_by_name , + rb.reason AS rejection_reason + FROM admin.ban_requests r + INNER JOIN admin.administrators a ON a.id = r.requested_by + INNER JOIN admin.archived_ban_requests ab ON ab.request_id = r.id + INNER JOIN users.addresses ad ON ad.id = ab.credentials_id + LEFT OUTER JOIN admin.rejected_ban_requests rb ON rb.request_id = r.id + LEFT OUTER JOIN admin.administrators ra ON ra.id = rb.rejected_by; + +GRANT SELECT ON admin.cancelled_bans TO :dbuser; + + +-- +-- Active bans +-- + +CREATE VIEW admin.active_bans + AS SELECT r.id , r.requested_by AS requested_by_id , a.appear_as AS requested_by_name , + r.reason , r.requested , ab.credentials_id AS account_id , ad.address AS account_mail , + vr.validated AS updated , ( ua.credentials_id IS NOT NULL ) AS redeemable , + vr.validated_by AS validated_by_id , va.appear_as AS validated_by_name + FROM admin.ban_requests r + INNER JOIN admin.administrators a ON a.id = r.requested_by + INNER JOIN admin.active_ban_requests ab ON ab.request_id = r.id AND validated + INNER JOIN users.addresses ad ON ad.id = ab.credentials_id + INNER JOIN admin.validated_ban_requests vr ON vr.request_id = r.id + INNER JOIN admin.administrators va ON va.id = vr.validated_by + LEFT OUTER JOIN users.active_accounts ua ON ua.credentials_id = ab.credentials_id; + +GRANT SELECT ON admin.active_bans TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- WARNING SYSTEM FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Adds a warning to a player's account, triggering an automatic ban request if necessary +-- +-- Parameters: +-- a_id Administrator identifier +-- u_id Player identifier +-- +-- Returns: +-- given Whether a warning was issued or not +-- c_count Current amount of warnings for this player +-- + +CREATE OR REPLACE FUNCTION admin.give_player_warning( a_id INT , u_id INT , OUT given BOOLEAN , OUT c_count INT ) + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + last_rec TIMESTAMP WITHOUT TIME ZONE; +BEGIN + LOOP + SELECT INTO c_count , last_rec warnings, last_received + FROM admin.warnings WHERE credentials_id = u_id + FOR UPDATE; + IF FOUND + THEN + given := ( now() - last_rec >= ( floor(sys.get_constant('accounts.warnings.grace')) || 's' )::INTERVAL ); + IF given + THEN + c_count := c_count + 1; + UPDATE admin.warnings SET last_received = now( ) , warnings = c_count + WHERE credentials_id = u_id; + END IF; + EXIT; + END IF; + + BEGIN + INSERT INTO admin.warnings ( credentials_id ) VALUES ( u_id ); + given := TRUE; + c_count := 1; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + + IF given + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Warning given to user #' || u_id || ' (' + || c_count || ' warning(s) total)' ); + + IF c_count >= sys.get_constant( 'accounts.warnings.autoBan' ) + THEN + IF admin.add_ban_request( a_id , u_id , 'Automatic ban after ' || c_count || ' warnings' ) + THEN + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Added automatic ban for user ' || u_id ); + END IF; + END IF; + END IF; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Causes old warnings to expire +-- + +CREATE OR REPLACE FUNCTION admin.expire_warnings( ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + e_time INTERVAL; + g_time INTERVAL; +BEGIN + e_time := ( floor( sys.get_constant( 'accounts.warnings.expiration' ) + * sys.get_constant( 'accounts.warnings.expiration.units' ) ) + || 's' ) :: INTERVAL; + g_time := ( floor(sys.get_constant('accounts.warnings.grace')) || 's' )::INTERVAL; + UPDATE admin.warnings SET last_received = now( ) - g_time , warnings = warnings - 1 + WHERE now() - last_received >= e_time AND warnings > 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.expire_warnings( ) TO :dbuser; + + + +-- +-- Finds out if it is time to send the administrative recap e-mails +-- + +CREATE OR REPLACE FUNCTION admin.is_recap_time( OUT is_time TIMESTAMP WITHOUT TIME ZONE ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + SELECT INTO is_time last_admin_recap FROM sys.status + WHERE now() - last_admin_recap >= '12 hours'::INTERVAL + FOR UPDATE; + IF FOUND + THEN + UPDATE sys.status SET last_admin_recap = now( ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION admin.is_recap_time( ) TO :dbuser; + + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- USERS VIEW -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +CREATE VIEW admin.user_empires + AS SELECT en.* + FROM emp.empires e + INNER JOIN naming.empire_names en ON e.name_id = en.id; + +CREATE VIEW admin.users_list + AS SELECT av.* , ue.id AS current_empire_id , ue.name AS current_empire , + a1.id AS ban_req_id , a1.appear_as AS ban_req_name , + a2.id AS ban_val_id , a2.appear_as AS ban_val_name , + ( CASE WHEN w IS NULL THEN 0 ELSE w.warnings END ) AS warnings_count , + w.last_received AS warnings_last + FROM users.accounts_view av + LEFT OUTER JOIN admin.user_empires ue ON ue.owner_id = av.id + LEFT OUTER JOIN admin.ban_requests br ON br.id = av.ban_request_id + LEFT OUTER JOIN admin.validated_ban_requests vbr ON vbr.request_id = br.id + LEFT OUTER JOIN admin.administrators a1 ON a1.id = br.requested_by + LEFT OUTER JOIN admin.administrators a2 ON a2.id = vbr.validated_by + LEFT OUTER JOIN admin.warnings w ON w.credentials_id = av.id + ORDER BY av.address; + +GRANT SELECT ON admin.users_list TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/200-bugs-functions.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/200-bugs-functions.sql new file mode 100644 index 0000000..f8d7282 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/200-bugs-functions.sql @@ -0,0 +1,1277 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Bug tracking system functions and views +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- HELPER FUNCTIONS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Creates or gets a submitter from an administrator +-- +-- Parameters: +-- a_id Administrator identifier +-- +-- Returns: +-- s_id The submitter record's identifier +-- + +CREATE OR REPLACE FUNCTION bugs.goc_admin_submitter( a_id INT , OUT s_id BIGINT ) + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_name TEXT; +BEGIN + a_name := NULL; + LOOP + -- Try finding an existing record + SELECT INTO s_id s.submitter_id + FROM bugs.submitters s + INNER JOIN bugs.admin_submitters a USING ( submitter_id ) + WHERE a.admin_id = a_id; + EXIT WHEN FOUND; + + -- Try creating the admin submitter + IF a_name IS NULL + THEN + SELECT INTO a_name appear_as FROM admin.administrators WHERE id = a_id; + END IF; + INSERT INTO bugs.submitters ( is_admin , name ) + VALUES ( TRUE , a_name) + RETURNING submitter_id INTO s_id; + BEGIN + INSERT INTO bugs.admin_submitters ( submitter_id , admin_id ) + VALUES ( s_id , a_id ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + DELETE FROM bugs.submitters WHERE id = s_id; + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Gets a submitter from an empire identifier +-- +-- Parameters: +-- e_id Empire identifier +-- +-- Returns: +-- s_id The submitter record's identifier +-- + +CREATE OR REPLACE FUNCTION bugs.get_user_submitter( e_id INT ) + RETURNS BIGINT + STRICT STABLE + SECURITY INVOKER +AS $$ + SELECT s.submitter_id + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN bugs.user_submitters s ON s.account_id = en.owner_id + WHERE e.name_id = $1; +$$ LANGUAGE SQL; + + + +-- +-- Creates or gets a submitter from an empire identifier +-- +-- Parameters: +-- e_id Empire identifier +-- +-- Returns: +-- s_id The submitter record's identifier +-- + +CREATE OR REPLACE FUNCTION bugs.goc_user_submitter( e_id INT , OUT s_id BIGINT ) + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + a_id INT; + a_name TEXT; +BEGIN + SELECT INTO a_id , a_name ac.credentials_id , en.name + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + INNER JOIN users.active_accounts ac ON ac.credentials_id = en.owner_id + WHERE e.name_id = e_id; + LOOP + -- Try finding an existing record + SELECT INTO s_id s.submitter_id + FROM bugs.submitters s + INNER JOIN bugs.user_submitters a USING ( submitter_id ) + WHERE a.account_id = a_id; + EXIT WHEN FOUND; + + -- Try creating the submitter + INSERT INTO bugs.submitters ( is_admin , name ) + VALUES ( FALSE , a_name) + RETURNING submitter_id INTO s_id; + BEGIN + INSERT INTO bugs.user_submitters ( submitter_id , account_id ) + VALUES ( s_id , a_id ); + EXIT; + EXCEPTION + WHEN unique_violation THEN + DELETE FROM bugs.submitters WHERE id = s_id; + END; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Posts a new bug report +-- +-- Parameters: +-- is_admin Whether the specified identifier corresponds to an administrator or to an empire +-- u_id User identifier +-- r_ttl Bug report title +-- r_desc Bug description +-- +-- Returns: +-- br_id The bug report's identifier +-- bg_id The bug report's group identifier +-- + +CREATE OR REPLACE FUNCTION bugs.post_report( is_admin BOOLEAN , u_id INT , r_ttl TEXT , r_desc TEXT , OUT br_id BIGINT , OUT bg_id BIGINT ) + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + sub_id BIGINT; +BEGIN + -- Get the submitter's identifier + IF is_admin + THEN + sub_id := bugs.goc_admin_submitter( u_id ); + ELSE + sub_id := bugs.goc_user_submitter( u_id ); + END IF; + + -- Create the bug report's group + INSERT INTO bugs.groups DEFAULT VALUES + RETURNING group_id INTO bg_id; + + -- Post the initial report + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( bg_id , sub_id , 'INIT' ) + RETURNING event_id INTO br_id; + INSERT INTO bugs.initial_report_events ( event_id , title , description ) + VALUES ( br_id , r_ttl , r_desc ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends an internal message to all user submitters +-- + +CREATE OR REPLACE FUNCTION bugs.update_notification( br_id BIGINT , sub_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + grp_id BIGINT; + oe_id INT; + obr_id BIGINT; +BEGIN + -- Get the report's group id + SELECT INTO grp_id group_id FROM bugs.events WHERE event_id = br_id; + + -- Find user submitters and send them a message + FOR oe_id , obr_id IN SELECT DISTINCT mv.empire_id , mv.bug_report_id + FROM bugs.br_user_view mv + INNER JOIN naming.empire_names en ON en.id = mv.empire_id + INNER JOIN bugs.user_submitters us ON us.account_id = en.owner_id + INNER JOIN bugs.events evt + ON evt.submitter_id = us.submitter_id AND evt.group_id = mv.group_id + WHERE mv.group_id = grp_id AND NOT mv.updated AND us.submitter_id <> sub_id + LOOP + PERFORM events.bug_report_updated_event( oe_id , obr_id , sub_id ); + PERFORM msgs.deliver_internal( oe_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Sends an internal message to all user submitters for TWO bug reports (used when merging) +-- + +CREATE OR REPLACE FUNCTION bugs.update_notification( br1_id BIGINT , br2_id BIGINT , sub_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + grp1_id BIGINT; + grp2_id BIGINT; + oe_id INT; + obr_id BIGINT; +BEGIN + -- Get the report's group id + SELECT INTO grp1_id group_id FROM bugs.events WHERE event_id = br1_id; + SELECT INTO grp2_id group_id FROM bugs.events WHERE event_id = br2_id; + + -- Find user submitters and send them a message + FOR oe_id , obr_id IN SELECT DISTINCT mv.empire_id , mv.bug_report_id + FROM bugs.br_user_view mv + INNER JOIN naming.empire_names en ON en.id = mv.empire_id + INNER JOIN bugs.user_submitters us ON us.account_id = en.owner_id + INNER JOIN bugs.events evt + ON evt.submitter_id = us.submitter_id AND evt.group_id = mv.group_id + WHERE mv.group_id IN ( grp1_id , grp2_id ) AND NOT mv.updated AND us.submitter_id <> sub_id + LOOP + PERFORM events.bug_report_updated_event( oe_id , obr_id , sub_id ); + PERFORM msgs.deliver_internal( oe_id ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- VIEWS USED TO ACCESS BUG REPORTS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +CREATE VIEW bugs.br_groups + AS SELECT group_id , event_id AS bug_report_id , submitter_id AS initial_submitter_id + FROM bugs.events + INNER JOIN bugs.initial_report_events USING ( event_id ); + +CREATE VIEW bugs.br_first_report + AS SELECT group_id , min( bug_report_id ) AS bug_report_id + FROM bugs.br_groups + GROUP BY group_id; + +GRANT SELECT ON bugs.br_first_report TO :dbuser; + +CREATE VIEW bugs.br_first_submitter_report + AS SELECT group_id , initial_submitter_id , min( bug_report_id ) AS bug_report_id + FROM bugs.br_groups + GROUP BY group_id , initial_submitter_id; + +CREATE VIEW bugs.br_group_submitters + AS SELECT DISTINCT group_id , submitter_id FROM bugs.events; + +CREATE VIEW bugs.br_submitters + AS SELECT submitter_id , is_admin , name , + ( CASE + WHEN is_admin THEN admin_id + ELSE account_id + END ) AS user_id + FROM bugs.submitters + LEFT OUTER JOIN bugs.admin_submitters USING (submitter_id) + LEFT OUTER JOIN bugs.user_submitters USING (submitter_id); + +CREATE VIEW bugs.br_updates + AS SELECT group_id , max(event_id) AS last_update_id + FROM bugs.events + GROUP BY group_id; + +CREATE VIEW bugs.br_user_updates + AS SELECT group_id , max(event_id) AS last_update_id + FROM bugs.events + LEFT OUTER JOIN bugs.comment_events USING( event_id ) + WHERE visible IS NULL OR visible + GROUP BY group_id; + +CREATE VIEW bugs.br_update_types + AS SELECT group_id , e_type , max( event_id ) AS last_event_id + FROM bugs.events + GROUP BY group_id , e_type; + +CREATE VIEW bugs.br_status + AS SELECT g.group_id , + ( CASE + WHEN u.last_event_id IS NULL THEN 'PENDING'::TEXT + ELSE s.status::TEXT + END ) AS status + FROM bugs.groups g + LEFT OUTER JOIN bugs.br_update_types u + ON u.group_id = g.group_id AND u.e_type = 'STATUS' + LEFT OUTER JOIN bugs.status_change_events s ON s.event_id = u.last_event_id; + +GRANT SELECT ON bugs.br_status TO :dbuser; + + +CREATE VIEW bugs.br_visibility + AS SELECT g.group_id , + ( CASE + WHEN u.last_event_id IS NULL THEN FALSE + ELSE v.visible + END ) AS visible + FROM bugs.groups g + LEFT OUTER JOIN bugs.br_update_types u + ON u.group_id = g.group_id AND u.e_type = 'VISIBILITY' + LEFT OUTER JOIN bugs.visibility_events v ON v.event_id = u.last_event_id; + +CREATE VIEW bugs.br_main_view + AS SELECT fr.group_id , v.visible , s.status , lue.t AS last_update , + lus.is_admin AS last_submitter_admin , lus.name AS last_submitter_name , lus.user_id AS last_submitter_uid + FROM bugs.br_first_report fr + INNER JOIN bugs.br_visibility v ON v.group_id = fr.group_id + INNER JOIN bugs.br_status s ON s.group_id = fr.group_id + INNER JOIN bugs.br_updates lu ON lu.group_id = fr.group_id + INNER JOIN bugs.events lue ON lue.event_id = lu.last_update_id + INNER JOIN bugs.br_submitters lus ON lus.submitter_id = lue.submitter_id; + + +CREATE VIEW bugs.br_main_user_view + AS SELECT fr.group_id , v.visible , s.status , lue.t AS last_update , + lus.is_admin AS last_submitter_admin , lus.name AS last_submitter_name , lus.user_id AS last_submitter_uid + FROM bugs.br_first_report fr + INNER JOIN bugs.br_visibility v ON v.group_id = fr.group_id + INNER JOIN bugs.br_status s ON s.group_id = fr.group_id + INNER JOIN bugs.br_user_updates lu ON lu.group_id = fr.group_id + INNER JOIN bugs.events lue ON lue.event_id = lu.last_update_id + INNER JOIN bugs.br_submitters lus ON lus.submitter_id = lue.submitter_id; + + + + +-- +-- Main view for administrators +-- + +CREATE VIEW bugs.br_admin_view + AS SELECT a.id AS administrator_id , mv.group_id , + ire.event_id AS bug_report_id , mv.visible , mv.status , ire.t AS posted , ir.title AS title , + isb.is_admin AS initial_submitter_admin , isb.name AS initial_submitter_name , isb.user_id AS initial_submitter_uid , + mv.last_update , mv.last_submitter_admin , mv.last_submitter_name , mv.last_submitter_uid , + ( CASE + WHEN mv.status NOT IN ('PENDING','OPEN') THEN FALSE + WHEN avs.last_view IS NULL THEN TRUE + ELSE ( avs.last_view < mv.last_update ) + END ) AS updated , + ( bg.bug_report_id IS NOT NULL ) AS own_report + FROM admin.administrators a + CROSS JOIN bugs.br_main_view mv + LEFT OUTER JOIN bugs.admin_view_status avs + ON avs.admin_id = a.id AND avs.group_id = mv.group_id + INNER JOIN bugs.br_first_report fr ON fr.group_id = mv.group_id + LEFT OUTER JOIN bugs.admin_submitters asb ON asb.admin_id = a.id + LEFT OUTER JOIN bugs.br_first_submitter_report bg + ON bg.group_id = mv.group_id AND bg.initial_submitter_id = asb.submitter_id + INNER JOIN bugs.events ire ON ire.event_id = ( CASE + WHEN bg.bug_report_id IS NULL THEN fr.bug_report_id + ELSE bg.bug_report_id + END ) + INNER JOIN bugs.initial_report_events ir ON ir.event_id = ire.event_id + INNER JOIN bugs.br_submitters isb ON isb.submitter_id = ire.submitter_id; + +GRANT SELECT ON bugs.br_admin_view TO :dbuser; + + +-- +-- Main view for users +-- + +CREATE VIEW bugs.br_user_view + AS SELECT e.name_id AS empire_id , mv.group_id , + ire.event_id AS bug_report_id , mv.visible , mv.status , ire.t AS posted , ir.title AS title , + isb.is_admin AS initial_submitter_admin , isb.name AS initial_submitter_name , isb.user_id AS initial_submitter_uid , + mv.last_update , mv.last_submitter_admin , mv.last_submitter_name , mv.last_submitter_uid , + ( CASE + WHEN uvs.last_view IS NULL THEN FALSE + ELSE ( uvs.last_view < mv.last_update ) + END ) AS updated , + ( bg.bug_report_id IS NOT NULL ) AS own_report + FROM emp.empires e + INNER JOIN naming.empire_names en ON en.id = e.name_id + CROSS JOIN bugs.br_main_user_view mv + LEFT OUTER JOIN bugs.user_view_status uvs + ON uvs.user_id = en.owner_id AND uvs.group_id = mv.group_id + INNER JOIN bugs.br_first_report fr ON fr.group_id = mv.group_id + LEFT OUTER JOIN bugs.user_submitters usb ON usb.account_id = en.owner_id + LEFT OUTER JOIN bugs.br_first_submitter_report bg + ON bg.group_id = mv.group_id AND bg.initial_submitter_id = usb.submitter_id + INNER JOIN bugs.events ire ON ire.event_id = ( CASE + WHEN bg.bug_report_id IS NULL THEN fr.bug_report_id + ELSE bg.bug_report_id + END ) + INNER JOIN bugs.initial_report_events ir ON ir.event_id = ire.event_id + INNER JOIN bugs.br_submitters isb ON isb.submitter_id = ire.submitter_id + LEFT OUTER JOIN bugs.br_group_submitters gs + ON gs.submitter_id = usb.submitter_id AND gs.group_id = mv.group_id + WHERE gs.submitter_id IS NOT NULL OR ( mv.visible AND mv.status <> 'PENDING' ); + +GRANT SELECT ON bugs.br_user_view TO :dbuser; + + +-- +-- Bug events view +-- + +CREATE VIEW bugs.br_events + AS SELECT ir.event_id AS bug_report_id , + evt.event_id AS event_id , evt.e_type AS event_type , evt.t AS event_timestamp , + es.name AS submitter_name , es.is_admin AS submitter_admin , + ( CASE WHEN es.is_admin THEN asb.admin_id ELSE usb.account_id END ) AS submitter_uid , + tir.title AS title , + ( CASE WHEN evt.e_type = 'INIT' THEN tir.description ELSE tc.comment END ) AS contents , + tm.initial_post_id AS merged_report_id , + ts.status AS status , + ( CASE + WHEN evt.e_type = 'COMMENT' THEN tc.visible + WHEN evt.e_type = 'INIT' THEN ( asd IS NOT NULL ) + ELSE tv.visible + END ) AS visible + FROM bugs.initial_report_events ir + INNER JOIN bugs.events ire ON ire.event_id = ir.event_id + INNER JOIN bugs.events evt ON evt.group_id = ire.group_id + INNER JOIN bugs.submitters es ON es.submitter_id = evt.submitter_id + LEFT OUTER JOIN bugs.admin_submitters asb ON asb.submitter_id = es.submitter_id + LEFT OUTER JOIN bugs.user_submitters usb ON usb.submitter_id = es.submitter_id + LEFT OUTER JOIN bugs.initial_report_events tir ON tir.event_id = evt.event_id + LEFT OUTER JOIN bugs.account_status_data asd ON asd.event_id = tir.event_id + LEFT OUTER JOIN bugs.comment_events tc ON tc.event_id = evt.event_id + LEFT OUTER JOIN bugs.merge_events tm ON tm.event_id = evt.event_id + LEFT OUTER JOIN bugs.status_change_events ts ON ts.event_id = evt.event_id + LEFT OUTER JOIN bugs.visibility_events tv ON tv.event_id = evt.event_id + ORDER BY evt.t; + +GRANT SELECT ON bugs.br_events TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- FUNCTIONS THAT HANDLE PLAYER ACCESS TO BUG REPORTS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Posts a new bug report, including additional data +-- +-- Parameters: +-- e_id Empire identifier +-- r_ttl Report title +-- r_desc Bug description +-- e_data Extended data to associate with the post +-- +-- Returns: +-- br_id The bug report's identifier +-- bg_id The bug report's group +-- + +CREATE OR REPLACE FUNCTION bugs.post_player_report( e_id INT , r_ttl TEXT , r_desc TEXT , e_data TEXT , OUT br_id BIGINT , OUT bg_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +BEGIN + SELECT INTO br_id , bg_id * FROM bugs.post_report( FALSE , e_id , r_ttl , r_desc ); + IF e_data <> '' + THEN + INSERT INTO bugs.account_status_data( event_id , account_status ) + VALUES ( br_id , e_data ); + END IF; + INSERT INTO bugs.user_view_status ( group_id , user_id ) + SELECT bg_id , n.owner_id + FROM naming.empire_names n + WHERE n.id = e_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.post_player_report( INT , TEXT , TEXT , TEXT ) TO :dbuser; + + + +-- +-- Posts a comment on an existing bug report +-- +-- Parameters: +-- e_id Empire identifier +-- br_id Bug report identifier +-- c_txt Comment to post +-- + +CREATE OR REPLACE FUNCTION bugs.post_player_comment( e_id INT , br_id BIGINT , c_txt TEXT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + sub_id BIGINT; + grp_id BIGINT; + cmt_id BIGINT; + oe_id INT; + obr_id BIGINT; +BEGIN + -- Get submitter + sub_id := bugs.get_user_submitter( e_id ); + IF sub_id IS NULL + THEN + RETURN; + END IF; + + -- Is submitter associated with this bug report? + SELECT INTO grp_id group_id + FROM bugs.br_groups + INNER JOIN bugs.br_group_submitters USING (group_id) + INNER JOIN bugs.br_status USING (group_id) + WHERE bug_report_id = br_id + AND ( status = 'PENDING' AND initial_submitter_id = sub_id + OR status = 'OPEN' AND submitter_id = sub_id ); + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Insert comment + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'COMMENT' ) + RETURNING event_id INTO cmt_id; + INSERT INTO bugs.comment_events ( event_id , comment , visible ) + VALUES ( cmt_id , c_txt , FALSE ); + + -- Update view status + UPDATE bugs.user_view_status v SET last_view = now( ) + FROM naming.empire_names en + WHERE en.id = e_id AND v.user_id = en.owner_id AND v.group_id = grp_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.post_player_comment( INT , BIGINT , TEXT ) TO :dbuser; + + + +-- +-- Reads a bug report +-- +-- Parameters: +-- e_id Empire identifier +-- br_id Bug report to read +-- +-- Returns: +-- The bug report as descibed by bugs.br_user_view +-- + +CREATE OR REPLACE FUNCTION bugs.read_player_report( e_id INT , br_id BIGINT ) + RETURNS SETOF bugs.br_user_view + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + rec bugs.br_user_view; +BEGIN + SELECT INTO rec mv.* FROM bugs.br_user_view mv + INNER JOIN bugs.br_groups bg USING ( group_id ) + WHERE mv.empire_id = e_id AND bg.bug_report_id = br_id; + IF FOUND + THEN + LOOP + UPDATE bugs.user_view_status vs SET last_view = now( ) + FROM bugs.br_groups bg , naming.empire_names en + WHERE bg.bug_report_id = br_id AND en.id = e_id + AND vs.group_id = bg.group_id AND vs.user_id = en.owner_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO bugs.user_view_status ( group_id , user_id ) + SELECT bg.group_id , en.owner_id + FROM bugs.br_groups bg , naming.empire_names en + WHERE bug_report_id = br_id AND en.id = e_id; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + RETURN NEXT rec; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.read_player_report( INT , BIGINT ) TO :dbuser; + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- FUNCTIONS THAT HANDLE ADMIN ACCESS TO BUG REPORTS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + + +-- +-- Posts a new bug report +-- +-- Parameters: +-- a_id Admin identifier +-- r_ttl Report title +-- r_desc Bug description +-- pub Whether the bug report is to be made public +-- +-- Returns: +-- br_id The bug report's identifier +-- bg_id The bug report's group +-- + +CREATE OR REPLACE FUNCTION bugs.post_admin_report( a_id INT , r_ttl TEXT , r_desc TEXT , pub BOOLEAN , OUT br_id BIGINT , OUT bg_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + sub_id BIGINT; + e_id BIGINT; +BEGIN + -- Create the report + SELECT INTO br_id , bg_id * FROM bugs.post_report( TRUE , a_id , r_ttl , r_desc ); + SELECT INTO sub_id submitter_id FROM bugs.events WHERE event_id = br_id; + + -- Mark the report as "OPEN" + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( bg_id , sub_id , 'STATUS' ) + RETURNING event_id INTO e_id; + INSERT INTO bugs.status_change_events ( event_id , status ) + VALUES ( e_id , 'OPEN' ); + + -- Mark the report as visible if required + IF pub + THEN + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( bg_id , sub_id , 'VISIBILITY' ) + RETURNING event_id INTO e_id; + INSERT INTO bugs.visibility_events ( event_id , visible ) + VALUES ( e_id , TRUE ); + END IF; + + -- Mark the report as read by the reporter + INSERT INTO bugs.admin_view_status ( group_id , admin_id ) + VALUES ( bg_id , a_id ); + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Posted bug report #' || br_id || ': ' || r_ttl ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.post_admin_report( INT , TEXT , TEXT , BOOLEAN ) TO :dbuser; + + + +-- +-- Posts a comment on an existing bug report +-- +-- Parameters: +-- a_id Admin identifier +-- br_id Bug report identifier +-- c_txt Comment to post +-- pub Whether the comment should be made public or not +-- + +CREATE OR REPLACE FUNCTION bugs.post_admin_comment( a_id INT , br_id BIGINT , c_txt TEXT , pub BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + sub_id BIGINT; + grp_id BIGINT; + cmt_id BIGINT; +BEGIN + -- Get submitter and group + sub_id := bugs.goc_admin_submitter( a_id ); + SELECT INTO grp_id group_id FROM bugs.br_groups WHERE bug_report_id = br_id; + + -- If the message is public, notify users + IF pub + THEN + PERFORM bugs.update_notification( br_id , sub_id ); + END IF; + + -- Insert comment + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'COMMENT' ) + RETURNING event_id INTO cmt_id; + INSERT INTO bugs.comment_events ( event_id , comment , visible ) + VALUES ( cmt_id , c_txt , pub ); + + -- Update view status + UPDATE bugs.admin_view_status SET last_view = now( ) + WHERE admin_id = a_id AND group_id = grp_id; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.post_admin_comment( INT , BIGINT , TEXT , BOOLEAN ) TO :dbuser; + + + +-- +-- Reads a bug report +-- +-- Parameters: +-- a_id Admin identifier +-- br_id Bug report to read +-- +-- Returns: +-- The bug report as descibed by bugs.br_admin_view +-- + +CREATE OR REPLACE FUNCTION bugs.read_admin_report( a_id INT , br_id BIGINT ) + RETURNS SETOF bugs.br_admin_view + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + rec bugs.br_admin_view; +BEGIN + SELECT INTO rec mv.* FROM bugs.br_admin_view mv + INNER JOIN bugs.br_groups bg USING ( group_id ) + WHERE mv.administrator_id = a_id AND bg.bug_report_id = br_id; + IF FOUND + THEN + LOOP + UPDATE bugs.admin_view_status vs SET last_view = now( ) + FROM bugs.br_groups bg + WHERE bg.bug_report_id = br_id AND vs.group_id = bg.group_id + AND vs.admin_id = a_id; + EXIT WHEN FOUND; + + BEGIN + INSERT INTO bugs.admin_view_status ( group_id , admin_id ) + SELECT group_id , a_id FROM bugs.br_groups + WHERE bug_report_id = br_id; + EXIT; + EXCEPTION + WHEN unique_violation THEN + -- Do nothing + END; + END LOOP; + RETURN NEXT rec; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.read_admin_report( INT , BIGINT ) TO :dbuser; + + + +-- +-- Make a comment visible +-- +-- Parameters: +-- a_id Admin identifier +-- cmt_id Comment identifier +-- + +CREATE OR REPLACE FUNCTION bugs.show_comment( a_id INT , cmt_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + s_admin BOOLEAN; + s_name TEXT; + br_id BIGINT; + sub_id BIGINT; + c_text TEXT; + grp_id BIGINT; + evt_id BIGINT; +BEGIN + SELECT INTO s_admin , s_name , br_id , sub_id , c_text , grp_id + is_admin , name , bug_report_id , submitter_id , comment , group_id + FROM bugs.events e + INNER JOIN bugs.comment_events c USING ( event_id ) + INNER JOIN bugs.submitters s USING ( submitter_id ) + INNER JOIN bugs.br_first_report fr USING ( group_id ) + WHERE event_id = cmt_id AND NOT visible + FOR UPDATE OF e , c , s; + + IF FOUND + THEN + PERFORM bugs.update_notification( br_id , sub_id ); + + -- Delete old version + DELETE FROM bugs.comment_events WHERE event_id = cmt_id; + DELETE FROM bugs.events WHERE event_id = cmt_id; + + -- Re-insert comment + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'COMMENT' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.comment_events ( event_id , comment , visible ) + VALUES ( evt_id , c_text , TRUE ); + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Validated bug comment #' || cmt_id + || ' posted by ' || ( CASE WHEN s_admin THEN 'administrator' ELSE 'empire' END ) + || ' ' || s_name ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.show_comment( INT , BIGINT ) TO :dbuser; + + + +-- +-- Deletes a comment +-- +-- Parameters: +-- a_id Admin identifier +-- cmt_id Comment identifier +-- + +CREATE OR REPLACE FUNCTION bugs.delete_comment( a_id INT , cmt_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + s_admin BOOLEAN; + s_name TEXT; +BEGIN + SELECT INTO s_admin , s_name is_admin , name + FROM bugs.events + INNER JOIN bugs.comment_events USING ( event_id ) + INNER JOIN bugs.submitters USING ( submitter_id ) + WHERE event_id = cmt_id AND NOT visible + FOR UPDATE; + IF FOUND + THEN + DELETE FROM bugs.comment_events WHERE event_id = cmt_id; + DELETE FROM bugs.events WHERE event_id = cmt_id; + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Deleted bug comment #' || cmt_id + || ' posted by ' || ( CASE WHEN s_admin THEN 'administrator' ELSE 'empire' END ) + || ' ' || s_name ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.delete_comment( INT , BIGINT ) TO :dbuser; + + + +-- +-- Validates a bug report +-- +-- Parameters: +-- a_id Admin identifier +-- br_id Report identifier +-- n_stat New status +-- is_pub Whether the report is to be made public +-- g_creds Credits to grand (0: none, 1: small amount, 2: medium, 3: lots) +-- keep_snap Whether the snapshot of the empire should be kept +-- + +CREATE OR REPLACE FUNCTION bugs.validate_report( a_id INT , br_id BIGINT , n_stat bug_status_type , is_pub BOOLEAN , g_creds INT , keep_snap BOOLEAN ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + grp_id BIGINT; + evt_id BIGINT; + sub_id BIGINT; + u_id INT; + rgc INT := 0; +BEGIN + -- Find and lock the record + SELECT INTO grp_id evt.group_id + FROM bugs.initial_report_events ire + INNER JOIN bugs.events evt ON ire.event_id = evt.event_id + INNER JOIN bugs.groups bg ON bg.group_id = evt.group_id + LEFT OUTER JOIN bugs.events oe ON oe.group_id = evt.group_id AND oe.e_type = 'STATUS' + WHERE oe.group_id IS NULL AND ire.event_id = br_id + FOR UPDATE OF ire , evt , bg; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Send update notifications + sub_id := bugs.goc_admin_submitter( a_id ); + PERFORM bugs.update_notification( br_id , sub_id ); + + -- Set new status + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'STATUS' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.status_change_events ( event_id , status ) + VALUES ( evt_id , n_stat ); + + -- Set visibility + IF is_pub + THEN + INSERT INTO bugs.events( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'VISIBILITY' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.visibility_events ( event_id , visible ) + VALUES ( evt_id , is_pub ); + END IF; + + -- Grant credits, if requested and possible + IF g_creds > 0 + THEN + SELECT INTO u_id account_id + FROM bugs.events + INNER JOIN bugs.user_submitters USING (submitter_id) + WHERE event_id = br_id; + IF FOUND + THEN + rgc := floor( CASE g_creds + WHEN 1 THEN sys.get_constant( 'bugtracker.lowCredits') + WHEN 2 THEN sys.get_constant( 'bugtracker.mediumCredits') + ELSE sys.get_constant( 'bugtracker.highCredits') + END ); + UPDATE users.credentials + SET credits = credits + g_creds + WHERE address_id = u_id; + END IF; + END IF; + + -- Remove snapshot data + IF NOT keep_snap + THEN + DELETE FROM bugs.account_status_data WHERE event_id = br_id; + END IF; + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Validation of bug report #' || br_id + || ': status set to ' || n_stat || ', visibility ' || ( CASE WHEN is_pub THEN 'public' ELSE 'hidden' END ) + || ', ' || rgc || ' credit(s) granted, snapshot ' || (CASE WHEN keep_snap THEN 'kept' ELSE 'deleted' END ) || '.' ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.validate_report( INT , BIGINT , bug_status_type , BOOLEAN , INT , BOOLEAN ) TO :dbuser; + + + +-- +-- Sets a bug report's status +-- +-- Parameters: +-- a_id Admin identifier +-- br_id Report identifier +-- n_stat New status +-- + +CREATE OR REPLACE FUNCTION bugs.set_report_status( a_id INT , br_id BIGINT , n_stat bug_status_type ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + grp_id BIGINT; + evt_id BIGINT; + sub_id BIGINT; +BEGIN + -- Find and lock the record + SELECT INTO grp_id evt.group_id + FROM bugs.initial_report_events ire + INNER JOIN bugs.events evt ON ire.event_id = evt.event_id + INNER JOIN bugs.groups bg ON bg.group_id = evt.group_id + WHERE ire.event_id = br_id + FOR UPDATE OF ire , evt , bg; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Do not add status change events if the status is already the same + PERFORM status FROM bugs.br_main_view + WHERE group_id = grp_id AND status <> n_stat::TEXT; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Set new status + sub_id := bugs.goc_admin_submitter( a_id ); + PERFORM bugs.update_notification( br_id , sub_id ); + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'STATUS' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.status_change_events ( event_id , status ) + VALUES ( evt_id , n_stat ); + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Set status of bug report #' || br_id || ' to ' || n_stat ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.set_report_status( INT , BIGINT , bug_status_type ) TO :dbuser; + + + +-- +-- Changes a bug report's visibility +-- +-- Parameters: +-- a_id Admin identifier +-- br_id Report identifier +-- + +CREATE OR REPLACE FUNCTION bugs.toggle_report_visibility( a_id INT , br_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + grp_id BIGINT; + evt_id BIGINT; + sub_id BIGINT; + c_vis BOOLEAN; +BEGIN + -- Find and lock the record + SELECT INTO grp_id evt.group_id + FROM bugs.initial_report_events ire + INNER JOIN bugs.events evt ON ire.event_id = evt.event_id + INNER JOIN bugs.groups bg ON bg.group_id = evt.group_id + WHERE ire.event_id = br_id + FOR UPDATE OF ire , evt , bg; + IF NOT FOUND + THEN + RETURN; + END IF; + + -- Get the report's current visibility + SELECT INTO c_vis visible FROM bugs.br_main_view WHERE group_id = grp_id; + + -- Set new visibility + sub_id := bugs.goc_admin_submitter( a_id ); + PERFORM bugs.update_notification( br_id , sub_id ); + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp_id , sub_id , 'VISIBILITY' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.visibility_events ( event_id , visible ) + VALUES ( evt_id , NOT c_vis ); + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Bug report #' || br_id || ' is now ' + ||( CASE WHEN c_vis THEN 'hidden' ELSE 'public' END ) ); +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.toggle_report_visibility( INT , BIGINT ) TO :dbuser; + + + +-- +-- Merges two bug reports +-- +-- Parameters: +-- a_id Administrator identifier +-- br1_id First bug report +-- br2_id Second bug report +-- +-- Returns: +-- err_code Error code: +-- 0 no error +-- 1 bug report not found +-- 2 bug reports already merged +-- 3 incorrect status (both reports should be OPEN) +-- + +CREATE OR REPLACE FUNCTION bugs.merge_reports( a_id INT , br1_id BIGINT , br2_id BIGINT , OUT err_code INT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + grp1_id BIGINT; + grp2_id BIGINT; + grp1_s TEXT; + grp2_s TEXT; + evt_id BIGINT; + sub_id BIGINT; +BEGIN + -- Get group identifiers and statuses + SELECT INTO grp1_id , grp1_s g.group_id , sv.status + FROM bugs.initial_report_events ire + INNER JOIN bugs.events evt USING (event_id) + INNER JOIN bugs.groups g USING ( group_id ) + INNER JOIN bugs.br_status sv USING ( group_id ) + WHERE ire.event_id = br1_id + FOR UPDATE OF ire , evt , g; + IF NOT FOUND + THEN + err_code := 1; + RETURN; + END IF; + + SELECT INTO grp2_id , grp2_s g.group_id , sv.status + FROM bugs.initial_report_events ire + INNER JOIN bugs.events evt USING (event_id) + INNER JOIN bugs.groups g USING ( group_id ) + INNER JOIN bugs.br_status sv USING ( group_id ) + WHERE ire.event_id = br2_id + FOR UPDATE OF ire , evt , g; + IF NOT FOUND + THEN + err_code := 1; + RETURN; + ELSEIF grp1_id = grp2_id + THEN + err_code := 2; + RETURN; + ELSEIF grp1_s <> 'OPEN' OR grp2_s <> 'OPEN' + THEN + err_code := 3; + RETURN; + END IF; + + -- Send update notification + sub_id := bugs.goc_admin_submitter( a_id ); + PERFORM bugs.update_notification( br1_id , br2_id , sub_id ); + + -- Move events + UPDATE bugs.events SET group_id = grp2_id + WHERE group_id = grp1_id; + + -- Prepare update of user view status + CREATE TEMPORARY TABLE vs_move( + user_id INT , + last_view TIMESTAMP WITHOUT TIME ZONE + ) ON COMMIT DROP; + INSERT INTO vs_move + SELECT user_id , max( last_view ) FROM bugs.user_view_status + WHERE group_id = grp1_id OR group_id = grp2_id + GROUP BY user_id; + + -- Add merge event + INSERT INTO bugs.events ( group_id , submitter_id , e_type ) + VALUES ( grp2_id , sub_id , 'MERGE' ) + RETURNING event_id INTO evt_id; + INSERT INTO bugs.merge_events ( event_id , initial_post_id ) + VALUES ( evt_id , br1_id ); + + -- Update user view status, delete old group + DELETE FROM bugs.user_view_status WHERE group_id = grp1_id OR group_id = grp2_id; + INSERT INTO bugs.user_view_status( group_id , user_id , last_view ) + SELECT grp2_id , user_id , last_view FROM vs_move; + DELETE FROM bugs.groups WHERE group_id = grp1_id; + + PERFORM admin.write_log( a_id , 'INFO'::log_level , 'Merged bug report #' || br1_id + || ' into report #' || br2_id ); + err_code := 0; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION bugs.merge_reports( INT , BIGINT , BIGINT ) TO :dbuser; + + + + +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- VIEWS USED TO GENERATE XML DUMPS -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- +-- --------------------------------------------------------------------------------------------------------------------------------------------------------------- -- + +CREATE VIEW bugs.dump_main_view + AS SELECT ss.current_tick , ss.next_tick , + u.id AS account_id , u.address AS account_address , u.game_credits , + u.status AS account_status , u.language AS account_language , + e.name_id AS empire_id , u.current_empire AS empire_name , e.cash AS cash , + a.id AS alliance_id , a.tag AS alliance_tag , am.is_pending AS alliance_pending + FROM emp.empires e + INNER JOIN admin.users_list u ON u.current_empire_id = e.name_id + INNER JOIN sys.status ss ON TRUE + LEFT OUTER JOIN emp.alliance_members am ON am.empire_id = e.name_id + LEFT OUTER JOIN emp.alliances a ON a.id = am.alliance_id; + +GRANT SELECT ON bugs.dump_main_view TO :dbuser; + + +CREATE VIEW bugs.dump_research_view + AS SELECT et.empire_id , et.line_id AS line_id , et.level AS level , + tst.name AS name , et.accumulated AS accumulated + FROM emp.technologies et + LEFT OUTER JOIN tech.levels tlv ON tlv.line_id = et.line_id AND tlv.level = et.level + LEFT OUTER JOIN defs.strings tst ON tst.id = tlv.name_id; + +GRANT SELECT ON bugs.dump_research_view TO :dbuser; + + +CREATE VIEW bugs.dump_planets_view + AS SELECT ep.empire_id , ep.planet_id , p.population , + ( ph.current / p.population )::REAL AS current_happiness , ph.target AS target_happiness , + cq.money AS civ_money , cq.work AS civ_work , + mq.money AS mil_money , mq.work AS mil_work + FROM emp.planets ep + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.bld_queues cq ON cq.planet_id = p.name_id + INNER JOIN verse.mil_queues mq ON mq.planet_id = p.name_id + ORDER BY ep.planet_id; + +GRANT SELECT ON bugs.dump_planets_view TO :dbuser; + + +CREATE VIEW bugs.dump_queues_view + AS SELECT ep.empire_id , ep.planet_id , FALSE AS military , q.queue_order , + q.building_id AS item_id , qin.name AS item_name , + q.destroy , q.amount + FROM emp.planets ep + INNER JOIN verse.bld_items q ON q.queue_id = ep.planet_id + INNER JOIN defs.strings qin ON qin.id = q.building_id + UNION ALL SELECT ep.empire_id , ep.planet_id , TRUE AS military , q.queue_order , + q.ship_id AS item_id , qin.name AS item_name , FALSE AS destroy , q.amount + FROM emp.planets ep + INNER JOIN verse.mil_items q ON q.queue_id = ep.planet_id + INNER JOIN defs.strings qin ON qin.id = q.ship_id; + +GRANT SELECT ON bugs.dump_queues_view TO :dbuser; + + +CREATE VIEW bugs.dump_buildings_view + AS SELECT ep.empire_id , ep.planet_id , b.building_id , bn.name AS building_name , + b.amount , b.damage + FROM emp.planets ep + INNER JOIN verse.planet_buildings b USING( planet_id ) + INNER JOIN defs.strings bn ON bn.id = b.building_id + WHERE b.amount > 0 + ORDER BY building_id; + +GRANT SELECT ON bugs.dump_buildings_view TO :dbuser; + + +CREATE VIEW bugs.dump_fleets_view + AS SELECT f.owner_id AS empire_id , f.id AS fleet_id , f.name AS fleet_name , + f.status , f.attacking , f.location_id , fln.name AS location_name , + fm.source_id , fsn.name AS source_name , fm.time_left , fm.state_time_left , + fmis.ref_point_id , rpn.name AS ref_point_name , fmis.outwards , fmis.past_ref_point , + fmos.start_x , fmos.start_y + FROM fleets.fleets f + INNER JOIN naming.map_names fln ON fln.id = f.location_id + LEFT OUTER JOIN fleets.movements fm ON fm.fleet_id = f.id + LEFT OUTER JOIN naming.map_names fsn ON fsn.id = fm.source_id + LEFT OUTER JOIN fleets.ms_system fmis ON fmis.movement_id = f.id + LEFT OUTER JOIN naming.map_names rpn ON rpn.id = fmis.ref_point_id + LEFT OUTER JOIN fleets.ms_space fmos ON fmos.movement_id = f.id + ORDER BY f.location_id , f.id; + +GRANT SELECT ON bugs.dump_fleets_view TO :dbuser; + + +CREATE VIEW bugs.dump_ships_view + AS SELECT f.owner_id AS empire_id , s.fleet_id , s.ship_id , sn.name AS ship_name , + s.amount , s.damage + FROM fleets.fleets f + INNER JOIN fleets.ships s ON s.fleet_id = f.id + INNER JOIN defs.strings sn ON sn.id = s.ship_id + ORDER BY s.ship_id; + +GRANT SELECT ON bugs.dump_ships_view TO :dbuser; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/210-admin-overview.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/210-admin-overview.sql new file mode 100644 index 0000000..f62dcef --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/functions/210-admin-overview.sql @@ -0,0 +1,64 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Views used to generate the administration overview +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +CREATE VIEW admin.ov_new_messages + AS SELECT admin_id , count(*) AS new_messages + FROM msgs.admin_delivery + WHERE status = 'UNREAD' + GROUP BY admin_id; + + +CREATE VIEW admin.ov_pending_names + AS SELECT count(*) AS pending_names + FROM naming.changed_map_names + LEFT OUTER JOIN naming.validated_map_names USING (name_id) + WHERE validated_at IS NULL; + + +CREATE VIEW admin.ov_pending_bans + AS SELECT count(*) AS pending_bans + FROM admin.active_ban_requests + WHERE NOT validated; + + +CREATE VIEW admin.ov_pending_bugs + AS SELECT count(*) AS pending_bugs + FROM bugs.br_main_view + WHERE status = 'PENDING'; + + +CREATE VIEW admin.ov_open_bugs + AS SELECT count(*) AS open_bugs + FROM bugs.br_main_view + WHERE status = 'OPEN'; + + +CREATE VIEW admin.ov_updated_bugs + AS SELECT administrator_id , count(*) AS updated_bugs + FROM bugs.br_admin_view + WHERE updated + GROUP BY administrator_id; + + +CREATE VIEW admin.overview + AS SELECT a.id AS admin_id , + ( CASE WHEN nm IS NULL THEN 0 ELSE nm.new_messages END )::BIGINT AS new_messages , + pn.pending_names , pb.pending_bans , pbg.pending_bugs , ob.open_bugs , + ( CASE WHEN ub IS NULL THEN 0 ELSE ub.updated_bugs END )::BIGINT AS updated_bugs + FROM admin.administrators a + LEFT OUTER JOIN admin.ov_new_messages nm ON nm.admin_id = a.id + INNER JOIN admin.ov_pending_names pn ON TRUE + INNER JOIN admin.ov_pending_bans pb ON TRUE + INNER JOIN admin.ov_pending_bugs pbg ON TRUE + INNER JOIN admin.ov_open_bugs ob ON TRUE + LEFT OUTER JOIN admin.ov_updated_bugs ub ON ub.administrator_id = a.id + WHERE a.privileges <> 0; + +GRANT SELECT ON admin.overview TO :dbuser; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/000-updates-ctrl.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/000-updates-ctrl.sql new file mode 100644 index 0000000..9133bf8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/000-updates-ctrl.sql @@ -0,0 +1,172 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - control functions +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +-- +-- Start a tick +-- + +CREATE OR REPLACE FUNCTION sys.start_tick( OUT tick_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + n_tick BIGINT; + c_tick BIGINT; +BEGIN + -- Get next / current tick + SELECT INTO n_tick , c_tick next_tick , current_tick + FROM sys.status + WHERE maintenance_start IS NULL + FOR UPDATE; + IF NOT FOUND OR c_tick IS NOT NULL THEN + tick_id := NULL; + RETURN; + END IF; + + -- Prepare game updates + UPDATE sys.updates SET last_tick = n_tick , status = 'FUTURE' + WHERE last_tick < n_tick; + + -- Update system status + UPDATE sys.status SET current_tick = n_tick , next_tick = n_tick + 1; + + tick_id := n_tick; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.start_tick( ) TO :dbuser; + + + +-- +-- Marks a tick as completed +-- + +CREATE OR REPLACE FUNCTION sys.end_tick( IN tick_id BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +BEGIN + UPDATE events.events SET status = 'READY' + WHERE status = 'TICK' AND tick = tick_id; + UPDATE sys.status SET current_tick = NULL; + PERFORM msgs.deliver_internal( ); +END; +$$ LANGUAGE plpgsql; + + + +-- +-- Check if a tick got "stuck" +-- + +CREATE OR REPLACE FUNCTION sys.check_stuck_tick( OUT tick_id BIGINT ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + c_tick BIGINT; + u_count INT; +BEGIN + -- Get next / current tick + SELECT INTO c_tick current_tick + FROM sys.status + WHERE maintenance_start IS NULL + FOR UPDATE; + IF NOT FOUND OR c_tick IS NULL THEN + tick_id := NULL; + RETURN; + END IF; + + -- Are there any updates left? + SELECT INTO u_count count(*) FROM sys.updates + WHERE status = 'FUTURE' AND last_tick = c_tick; + IF u_count = 0 THEN + PERFORM sys.end_tick( c_tick ); + tick_id := NULL; + ELSE + tick_id := c_tick; + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.check_stuck_tick( ) TO :dbuser; + + + +-- +-- Process game updates +-- +-- Parameters: +-- c_tick Current tick +-- +-- Returns: +-- TRUE if the function must be called again, FALSE otherwise +-- + +CREATE OR REPLACE FUNCTION sys.process_updates( IN c_tick BIGINT , OUT has_more BOOLEAN ) + STRICT VOLATILE + SECURITY DEFINER + AS $$ +DECLARE + b_size INT; + p_utype update_type; + utype update_type; + uid BIGINT; +BEGIN + b_size := sys.get_constant( 'game.batchSize' ); + p_utype := NULL; + + -- Mark at most b_size entries as being updated + FOR uid , utype IN SELECT id , gu_type FROM sys.updates + WHERE last_tick = c_tick AND status = 'FUTURE' + ORDER BY gu_type LIMIT b_size + LOOP + IF p_utype IS NULL THEN + p_utype := utype; + END IF; + EXIT WHEN utype <> p_utype; + UPDATE sys.updates SET status = 'PROCESSING' WHERE id = uid; + END LOOP; + + has_more := p_utype IS NOT NULL; + IF has_more THEN + -- Execute actual updates + EXECUTE 'SELECT sys.process_' || lower( p_utype::TEXT ) || '_updates( $1 )' + USING c_tick; + UPDATE sys.updates SET status = 'PROCESSED' + WHERE status = 'PROCESSING' AND last_tick = c_tick; + ELSE + -- If nothing was found, we're done + PERFORM sys.end_tick( c_tick ); + END IF; +END; +$$ LANGUAGE plpgsql; + +GRANT EXECUTE ON FUNCTION sys.process_updates( BIGINT ) TO :dbuser; + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/010-empire-money.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/010-empire-money.sql new file mode 100644 index 0000000..a0bb8b1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/010-empire-money.sql @@ -0,0 +1,81 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - empire money +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_empire_money_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + c_cash REAL; + c_debt REAL; +BEGIN + -- Lock empires for update + PERFORM e.name_id FROM sys.updates su + INNER JOIN emp.updates eu + ON eu.update_id = su.id + INNER JOIN emp.empires e + ON eu.empire_id = e.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'EMPIRE_MONEY' + FOR UPDATE OF e; + + -- Select all money-related data from empires being updated + FOR rec IN SELECT e.name_id AS id , e.cash AS cash , e.debt AS debt , + ( pov.planet_income - pov.planet_upkeep ) AS p_money , + fov.fleet_upkeep AS f_money , ( v.status = 'PROCESSED' ) AS on_vacation + FROM sys.updates su + INNER JOIN emp.updates eu ON eu.update_id = su.id + INNER JOIN emp.empires e ON eu.empire_id = e.name_id + INNER JOIN emp.fleets_overview fov ON fov.empire = e.name_id + INNER JOIN emp.planets_overview pov ON pov.empire = e.name_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'EMPIRE_MONEY' + LOOP + -- Compute new cash reserve + c_cash := 0; + IF rec.p_money IS NOT NULL THEN + c_cash := c_cash + rec.p_money; + END IF; + IF rec.f_money IS NOT NULL THEN + c_cash := c_cash - rec.f_money; + END IF; + + -- Effects of vacation mode + IF rec.on_vacation + THEN + c_cash := c_cash / sys.get_constant( 'vacation.cashDivider' ); + END IF; + + -- Handle debt + c_cash := rec.cash + c_cash / 1440.0; + IF c_cash < 0 THEN + c_debt := -c_cash; + c_cash := 0; + ELSE + c_debt := 0; + END IF; + + IF rec.debt > 0 AND c_debt = 0 + THEN + PERFORM events.debt_event( rec.id , FALSE ); + ELSEIF rec.debt = 0 AND c_debt > 0 + THEN + PERFORM events.debt_event( rec.id , TRUE ); + END IF; + + -- Update empire + UPDATE emp.empires SET cash = c_cash , debt = c_debt + WHERE name_id = rec.id; + END LOOP; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/020-empire-research.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/020-empire-research.sql new file mode 100644 index 0000000..d9e3cfe --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/020-empire-research.sql @@ -0,0 +1,86 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - empire research +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_empire_research_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + r_points REAL; + tu_rec RECORD; +BEGIN + -- Lock empires for update and planets for share + PERFORM e.name_id FROM sys.updates su + INNER JOIN emp.updates eu ON eu.update_id = su.id + INNER JOIN emp.empires e ON eu.empire_id = e.name_id + INNER JOIN emp.planets ep ON ep.empire_id = e.name_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'EMPIRE_RESEARCH' + FOR UPDATE OF e + FOR SHARE OF ep , p; + + -- Process empires + FOR rec IN SELECT e.name_id AS id , ( v.status = 'PROCESSED' ) AS on_vacation , + sum( p.population ) AS population + FROM sys.updates su + INNER JOIN emp.updates eu ON eu.update_id = su.id + INNER JOIN emp.empires e ON eu.empire_id = e.name_id + INNER JOIN emp.planets ep ON ep.empire_id = e.name_id + INNER JOIN verse.planets p ON p.name_id = ep.planet_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'EMPIRE_RESEARCH' + GROUP BY e.name_id , v.status + LOOP + -- Insert any missing tech line + INSERT INTO emp.technologies ( empire_id , line_id ) + SELECT rec.id , l.name_id + FROM tech.lines l + LEFT OUTER JOIN emp.technologies t + ON t.line_id = l.name_id AND t.empire_id = rec.id + WHERE t.empire_id IS NULL; + + -- Compute research output + r_points := rec.population * sys.get_constant( 'game.work.rpPerPopUnit' ) / 1440.0; + IF rec.on_vacation + THEN + r_points := r_points / sys.get_constant( 'vacation.researchDivider' ); + END IF; + + -- Update technologies where: + -- 1) the level actually exists and + -- 2) accumulated points haven't reach the level's + FOR tu_rec IN SELECT t.line_id AS line_id , t.accumulated AS accumulated , + l.points AS points , ( l.points - t.accumulated ) AS diff , + l.id AS level_id + FROM emp.technologies t + INNER JOIN tech.levels l ON l.line_id = t.line_id + AND l.level = t.level AND t.accumulated < l.points + WHERE t.empire_id = rec.id + FOR UPDATE OF t + LOOP + UPDATE emp.technologies t SET accumulated = ( CASE + WHEN tu_rec.diff <= r_points THEN tu_rec.points + ELSE tu_rec.accumulated + r_points + END ) + WHERE t.line_id = tu_rec.line_id AND t.empire_id = rec.id; + + -- Send message + IF tu_rec.diff <= r_points + THEN + PERFORM events.tech_ready_event( rec.id , tu_rec.level_id ); + END IF; + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/025-empire-debt.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/025-empire-debt.sql new file mode 100644 index 0000000..7bcaa9f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/025-empire-debt.sql @@ -0,0 +1,62 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - damage fleets and buildings when an +-- empire is out of cash and has too much upkeep +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + + +CREATE OR REPLACE FUNCTION sys.process_empire_debt_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + fleet_dr REAL; + bld_dr REAL; + empire INT; + debt REAL; + upkeep REAL; +BEGIN + fleet_dr := sys.get_constant( 'game.debt.fleet'); + bld_dr := sys.get_constant( 'game.debt.buildings'); + + FOR empire, debt IN SELECT e.name_id AS id , e.debt + FROM sys.updates su + INNER JOIN emp.updates eu ON eu.update_id = su.id + INNER JOIN emp.empires e ON eu.empire_id = e.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'EMPIRE_DEBT' AND e.debt > 0 + FOR UPDATE + LOOP + PERFORM sys.write_log( 'EmpireDebt' , 'DEBUG'::log_level , 'Handling debt for empire #' + || empire || ' (at tick: ' || debt || '; daily: ' || ( debt * 1440 ) || ')' ); + debt := debt * 1440.0; + + -- Does the empire own fleets? + SELECT INTO upkeep sum( d.upkeep * s.amount ) + FROM fleets.fleets f + INNER JOIN fleets.ships s ON s.fleet_id = f.id + INNER JOIN tech.buildables d ON d.name_id = s.ship_id + WHERE f.owner_id = empire; + IF upkeep IS NOT NULL + THEN + PERFORM fleets.handle_debt( empire , upkeep , ( CASE WHEN debt > upkeep THEN upkeep ELSE debt END ) , fleet_dr ); + debt := debt - upkeep; + CONTINUE WHEN debt <= 0; + END IF; + + -- Does the empire have buildings? + SELECT INTO upkeep sum( d.upkeep * b.amount ) + FROM emp.planets ep + INNER JOIN verse.planet_buildings b ON b.planet_id = ep.planet_id + INNER JOIN tech.buildables d ON d.name_id = b.building_id + WHERE ep.empire_id = empire; + CONTINUE WHEN NOT FOUND OR upkeep = 0; + PERFORM verse.handle_debt( empire , upkeep , debt , bld_dr ); + END LOOP; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/030-fleet-arrivals.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/030-fleet-arrivals.sql new file mode 100644 index 0000000..c9dd59e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/030-fleet-arrivals.sql @@ -0,0 +1,148 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - fleet arrivals +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_fleet_arrivals_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + lstat BOOLEAN; + f_ids BIGINT[]; +BEGIN + -- Lock all records + PERFORM f.id FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN emp.empires e ON e.name_id = f.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_ARRIVALS' + AND f.status = 'AVAILABLE' AND fm.time_left = 1 + FOR UPDATE; + + -- Update attack status according to planet owners and enemy lists + FOR rec IN SELECT ep.empire_id AS planet_owner , p.name_id AS planet , + f.owner_id AS fleet_owner , ( v.status = 'PROCESSED' AND b.id IS NULL ) AS on_vacation , + bool_or( f.attacking ) AS attacking + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + LEFT OUTER JOIN emp.planets ep ON ep.planet_id = p.name_id + LEFT OUTER JOIN naming.empire_names en ON en.id = ep.empire_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + LEFT OUTER JOIN battles.battles b + ON b.location_id = p.name_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_ARRIVALS' + AND f.status = 'AVAILABLE' AND fm.time_left = 1 + GROUP BY p.name_id , ep.empire_id , f.owner_id , v.status , b.id + LOOP + -- Fleets owned by the planet's owner are never attacking, same for fleets arriving on + -- planets that are on vacation + IF rec.fleet_owner = rec.planet_owner OR rec.on_vacation THEN + UPDATE fleets.fleets f SET attacking = FALSE + FROM fleets.movements m + WHERE f.status = 'AVAILABLE' AND f.owner_id = rec.fleet_owner + AND f.location_id = rec.planet AND m.fleet_id = f.id AND m.time_left = 1; + CONTINUE; + END IF; + + -- Check enemy lists + PERFORM * FROM emp.enemies + WHERE empire = rec.planet_owner AND enemy = rec.fleet_owner; + IF FOUND + THEN + -- Fleet owner in the planet owner's EL + UPDATE fleets.fleets f SET attacking = TRUE + FROM fleets.movements m + WHERE f.status = 'AVAILABLE' AND f.owner_id = rec.fleet_owner + AND f.location_id = rec.planet AND m.fleet_id = f.id AND m.time_left = 1; + CONTINUE; + END IF; + + -- If one of the arriving fleets is attacking, or if the local fleets are already attacking, + -- then switch all local or arriving fleets to attack + SELECT INTO lstat f.attacking + FROM fleets.fleets f + LEFT OUTER JOIN fleets.movements fm ON fm.fleet_id = f.id + WHERE f.owner_id = rec.fleet_owner AND f.location_id = rec.planet AND fm IS NULL + GROUP BY f.attacking; + IF ( FOUND AND lstat ) OR rec.attacking + THEN + SELECT INTO f_ids array_agg( f.id ) FROM fleets.fleets f + WHERE f.owner_id = rec.fleet_owner AND f.location_id = rec.planet; + PERFORM fleets.set_mode( rec.fleet_owner , f_ids , TRUE ); + CONTINUE; + END IF; + END LOOP; + + -- Prepare fleet arrival events + CREATE TEMPORARY TABLE fleet_arrivals( + loc_id INT , + loc_name VARCHAR(20) , + own_id INT , + own_name VARCHAR(20) , + name VARCHAR(64) , + power BIGINT , + mode BOOLEAN , + src_id INT , + src_name VARCHAR(20) + ); + INSERT INTO fleet_arrivals + SELECT f.location_id , ln.name , f.owner_id , fon.name , + f.name , fs.power , f.attacking , fm.source_id , sn.name + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + INNER JOIN naming.empire_names fon ON fon.id = f.owner_id + INNER JOIN naming.map_names ln ON ln.id = f.location_id + INNER JOIN naming.map_names sn ON sn.id = fm.source_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_ARRIVALS' + AND f.status = 'AVAILABLE' AND fm.time_left = 1; + + -- Delete movement records, set redeployment penalties, update battles + FOR rec IN SELECT f.id AS fleet , fs.flight_time AS flight_time , + f.attacking AS attacking , b.id AS battle , + f.location_id AS location + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN fleets.stats_view fs ON fs.id = f.id + LEFT OUTER JOIN battles.battles b + ON b.location_id = p.name_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_ARRIVALS' + AND f.status = 'AVAILABLE' AND fm.time_left = 1 + LOOP + DELETE FROM fleets.movements + WHERE fleet_id = rec.fleet; + UPDATE fleets.fleets + SET status = 'REDEPLOYING' , + penalty = 1 + rec.flight_time * ( CASE WHEN rec.attacking THEN 40 ELSE 10 END ) + WHERE id = rec.fleet; + + -- Add fleets to battle (will not be executed if battle is NULL) + PERFORM battles.add_fleet( rec.battle , rec.fleet , FALSE , c_tick ); + END LOOP; + + -- Send fleet arrival events + PERFORM events.commit_fleet_arrivals( c_tick ); +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/040-fleet-movements.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/040-fleet-movements.sql new file mode 100644 index 0000000..184aa0a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/040-fleet-movements.sql @@ -0,0 +1,110 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - fleet movements +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_fleet_movements_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + rpid INT; +BEGIN + -- Lock all records + PERFORM f.id FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN emp.empires e ON e.name_id = f.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_MOVEMENTS' + AND f.status = 'AVAILABLE' + FOR UPDATE; + + -- Handle state transitions + FOR rec IN SELECT f.id AS id , max( fsd.flight_time ) AS flight_time , + s.x AS x , s.y AS y , s.id AS sys_id , + isms.ref_point_id AS is_ref_point , isms.outwards AS is_outwards , + isms.past_ref_point AS is_past_ref_point , + rp.system_id AS is_ref_point_system , rp.orbit AS is_ref_point_orbit , + rps.x AS is_ref_point_x , rps.y AS is_ref_point_y + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN verse.systems s ON s.id = p.system_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.ships fs ON fs.fleet_id = f.id + INNER JOIN tech.ships fsd ON fsd.buildable_id = fs.ship_id + INNER JOIN fleets.movements m ON m.fleet_id = f.id + LEFT OUTER JOIN fleets.ms_system isms ON isms.movement_id = f.id + LEFT OUTER JOIN verse.planets rp ON isms.ref_point_id = rp.name_id + LEFT OUTER JOIN verse.systems rps ON rps.id = rp.system_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_MOVEMENTS' + AND f.status = 'AVAILABLE' AND m.state_time_left = 1 + GROUP BY f.id , s.x , s.y , s.id , isms.ref_point_id , isms.outwards , + isms.past_ref_point , rp.system_id , rp.orbit , rps.x , rps.y + LOOP + IF rec.is_ref_point_orbit IS NOT NULL THEN + IF rec.is_ref_point_orbit = 5 AND rec.is_outwards AND rec.is_past_ref_point THEN + -- Fleet exiting system + INSERT INTO fleets.ms_space ( movement_id , start_x , start_y ) + VALUES ( rec.id , rec.is_ref_point_x , rec.is_ref_point_y ); + DELETE FROM fleets.ms_system WHERE movement_id = rec.id; + UPDATE fleets.movements + SET state_time_left = 1 + fleets.compute_outerspace_duration( + rec.flight_time , rec.is_ref_point_x , rec.is_ref_point_y , rec.x , rec.y ) + WHERE fleet_id = rec.id; + ELSE + -- In-system state change + IF rec.is_past_ref_point THEN + SELECT INTO rpid p.name_id FROM verse.planets p + WHERE p.system_id = rec.is_ref_point_system + AND p.orbit = rec.is_ref_point_orbit + ( CASE WHEN rec.is_outwards THEN 1 ELSE -1 END ); + UPDATE fleets.ms_system + SET past_ref_point = FALSE , ref_point_id = rpid + WHERE movement_id = rec.id; + ELSE + UPDATE fleets.ms_system SET past_ref_point = TRUE + WHERE movement_id = rec.id; + END IF; + UPDATE fleets.movements + SET state_time_left = rec.flight_time + 1 + WHERE fleet_id = rec.id; + END IF; + ELSE + -- Fleet entering system + SELECT INTO rpid p.name_id FROM verse.planets p + WHERE p.system_id = rec.sys_id AND p.orbit = 5; + INSERT INTO fleets.ms_system ( movement_id , ref_point_id , outwards , past_ref_point ) + VALUES ( rec.id , rpid , FALSE , FALSE ); + DELETE FROM fleets.ms_space WHERE movement_id = rec.id; + UPDATE fleets.movements + SET state_time_left = rec.flight_time + 1 + WHERE fleet_id = rec.id; + END IF; + END LOOP; + + -- Decrease movement and state time + UPDATE fleets.movements + SET state_time_left = state_time_left - 1 , + time_left = time_left - 1 + WHERE fleet_id IN ( + SELECT f.id FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN fleets.movements fm ON fm.fleet_id = f.id + INNER JOIN emp.empires e ON e.name_id = f.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_MOVEMENTS' + AND f.status = 'AVAILABLE' ); +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/050-fleet-status.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/050-fleet-status.sql new file mode 100644 index 0000000..7249954 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/050-fleet-status.sql @@ -0,0 +1,77 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - fleet status +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_fleet_status_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + mt_id BIGINT; +BEGIN + -- Lock all records + PERFORM f.id FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN fleets.fleets f ON f.location_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = f.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_STATUS' + FOR UPDATE; + + -- Fleet deployments + FOR rec IN SELECT f.id AS fleet , f.owner_id AS owner , f.location_id AS location , + b.id AS battle + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN fleets.fleets f ON f.location_id = vu.planet_id + AND f.status = 'DEPLOYING' AND f.penalty = 1 + INNER JOIN emp.empires e ON e.name_id = f.owner_id + LEFT OUTER JOIN battles.battles b + ON b.location_id = f.location_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_STATUS' + LOOP + -- Add fleet to battle (will be ignored if battle is NULL) + PERFORM battles.add_fleet( rec.battle , rec.fleet , TRUE , c_tick ); + + -- Find the biggest available fleet belonging to that owner + SELECT INTO mt_id f.id + FROM fleets.fleets f + INNER JOIN fleets.ships s ON s.fleet_id = f.id + INNER JOIN tech.ships sd ON sd.buildable_id = s.ship_id + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id + WHERE f.owner_id = rec.owner AND f.location_id = rec.location + AND m.fleet_id IS NULL AND f.status = 'AVAILABLE' + GROUP BY f.id + ORDER BY sum( sd.power * s.amount ) DESC + LIMIT 1; + CONTINUE WHEN NOT FOUND; + + -- Merge fleet + PERFORM fleets.merge_ships( mt_id , rec.fleet ); + DELETE FROM fleets.fleets WHERE id = rec.fleet; + END LOOP; + + -- Fleets that must become available + UPDATE fleets.fleets f SET status = 'AVAILABLE' , penalty = 0 + FROM sys.updates su , verse.updates vu + WHERE vu.update_id = su.id AND f.location_id = vu.planet_id + AND f.penalty = 1 AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_STATUS' AND su.last_tick = c_tick; + + -- Fleets that still have a penalty + UPDATE fleets.fleets f SET penalty = penalty - 1 + FROM sys.updates su , verse.updates vu + WHERE vu.update_id = su.id AND f.location_id = vu.planet_id + AND f.penalty > 1 AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_FLEET_STATUS' AND su.last_tick = c_tick; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/060-planet-battle.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/060-planet-battle.sql new file mode 100644 index 0000000..d944f65 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/060-planet-battle.sql @@ -0,0 +1,181 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - battles (start, main computation, end) +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_battle_start_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_id INT; +BEGIN + FOR p_id IN SELECT p.name_id + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + LEFT OUTER JOIN battles.battles b + ON b.location_id = p.name_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_BATTLE_START' AND b.location_id IS NULL + FOR UPDATE OF p + LOOP + IF battles.check_start( p_id ) THEN + PERFORM events.battle_start_event( battles.initialise( p_id , c_tick ) ); + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + + +CREATE OR REPLACE FUNCTION sys.process_planet_battle_main_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + ttfi INT; + initi REAL; + dbonus REAL; + dmg REAL; + rdmg REAL; + rec RECORD; + a_power BIGINT; + d_power BIGINT; + p_power BIGINT; + bmod REAL; + a_dmg REAL; + d_dmg REAL; +BEGIN + ttfi := floor( sys.get_constant( 'game.battle.timeToFullIntensity' ) )::INT; + initi := sys.get_constant( 'game.battle.initialIntensity' ); + dbonus := sys.get_constant( 'game.battle.defenceBonus'); + dmg := sys.get_constant( 'game.battle.damage' ); + rdmg := sys.get_constant( 'game.battle.randomDamage' ); + + FOR rec IN SELECT b.id AS battle , b.first_tick AS first_tick , + b.location_id AS location , ( ph.current / p.population )::REAL AS happiness + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN battles.battles b + ON b.location_id = p.name_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_BATTLE_MAIN' + FOR UPDATE OF p , b + LOOP + PERFORM sys.write_log( 'BattleUpdate' , 'DEBUG'::log_level , 'Handling battle #' || rec.battle + || ' at planet #' || rec.location ); + + -- Get stationary defence power + p_power := floor( verse.adjust_production( verse.get_raw_production( rec.location , 'DEF' ) , rec.happiness ) ); + + -- Get fleets power + a_power := battles.get_fleets_power( rec.battle , c_tick , TRUE ); + d_power := battles.get_fleets_power( rec.battle , c_tick , FALSE ); + IF a_power = 0 OR d_power + p_power = 0 + THEN + PERFORM battles.set_defence_power( rec.battle , c_tick , p_power ); + CONTINUE; + END IF; + + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Attack: ' || a_power + || '; planetary defences: ' || p_power || '; defence: ' || d_power ); + + -- Compute battle intensity + IF c_tick - rec.first_tick < ttfi THEN + bmod := initi + ( 1 - initi ) * ( c_tick - rec.first_tick ) / ttfi; + ELSE + bmod := 1.0; + END IF; + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Intensity modifier: ' || bmod ); + + -- Compute damage + d_dmg := bmod * ( d_power * ( 1 + dbonus ) + p_power ) * dmg * ( 1 - rdmg + 2.0 * rdmg * random() ); + a_dmg := bmod * a_power * dmg * ( 1 - rdmg + 2.0 * rdmg * random() ); + PERFORM sys.write_log( 'BattleUpdate' , 'TRACE'::log_level , 'Damage - to defence: ' || a_dmg + || '; to attack: ' || d_dmg ); + + -- Inflict damage + PERFORM battles.inflict_damage( rec.battle , a_dmg , FALSE , c_tick ); + PERFORM battles.inflict_damage( rec.battle , d_dmg , TRUE , c_tick ); + + -- Update defence power + p_power := floor( verse.adjust_production( verse.get_raw_production( rec.location , 'DEF' ) , rec.happiness ) ); + PERFORM battles.set_defence_power( rec.battle , c_tick , p_power ); + END LOOP; +END; +$$ LANGUAGE plpgsql; + + + + +CREATE OR REPLACE FUNCTION sys.process_planet_battle_end_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + n_owner INT; +BEGIN + FOR rec IN SELECT b.id AS battle , b.location_id AS location + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN battles.battles b + ON b.location_id = p.name_id AND b.last_tick IS NULL + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_BATTLE_END' + FOR UPDATE OF p , b + LOOP + IF battles.get_fleets_power( rec.battle , c_tick , TRUE ) = 0 THEN + -- Attack is dead/gone, end the battle + UPDATE battles.battles SET last_tick = c_tick + WHERE id = rec.battle; + PERFORM events.battle_end_event( rec.battle ); + ELSEIF battles.get_fleets_power( rec.battle , c_tick , FALSE ) + battles.get_defence_power( rec.battle , c_tick ) = 0 THEN + -- Defence is dead/gone, transfer planet ownership to biggest fleet owner + n_owner := battles.get_biggest_fleet_owner( rec.battle , c_tick ); + PERFORM events.planet_ochange_events( rec.location , n_owner ); + PERFORM emp.leave_planet( rec.location ); + INSERT INTO emp.planets( planet_id , empire_id ) + VALUES( rec.location , n_owner ); + + -- End the battle + UPDATE battles.battles SET last_tick = c_tick + WHERE id = rec.battle; + PERFORM events.battle_end_event( rec.battle ); + + -- Set fleets in orbit to defence if they're not on the new owner's enemy list + UPDATE fleets.fleets f SET attacking = ( ele.empire IS NOT NULL ) + FROM fleets.fleets f2 + LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f2.id + LEFT OUTER JOIN emp.enemies ele ON ele.enemy = f2.owner_id AND ele.empire = n_owner + WHERE f.id = f2.id AND f.location_id = rec.location AND m.fleet_id IS NULL; + + -- Check if the battle needs to be restarted + IF battles.check_start( rec.location ) THEN + PERFORM events.battle_start_event( battles.initialise( rec.location , c_tick ) ); + END IF; + ELSE + CONTINUE; + END IF; + + -- Mark the end of the battle + INSERT INTO battles.finished_battles_list + SELECT empire, battle, planet, x, y, orbit, name, first_tick, last_tick, last_update + FROM battles.full_battles_list + WHERE battle = rec.battle; + END LOOP; +END; +$$ LANGUAGE plpgsql; + diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/070-planet-abandon.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/070-planet-abandon.sql new file mode 100644 index 0000000..85128b7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/070-planet-abandon.sql @@ -0,0 +1,48 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - abandon +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_abandon_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + p_id INT; +BEGIN + -- Lock all records + PERFORM p.name_id FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN emp.planets ep ON p.name_id = vu.planet_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + INNER JOIN emp.abandon a ON a.planet_id = p.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_ABANDON' + FOR UPDATE; + + -- Handle planets where time has run out + FOR p_id IN SELECT p.name_id + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON p.name_id = vu.planet_id + INNER JOIN emp.abandon a ON a.planet_id = p.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_ABANDON' AND a.time_left = 1 + LOOP + PERFORM emp.leave_planet( p_id ); + END LOOP; + + -- Update all abandon records + UPDATE emp.abandon a SET time_left = a.time_left - 1 + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_ABANDON' AND a.planet_id = vu.planet_id; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/080-planet-construction.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/080-planet-construction.sql new file mode 100644 index 0000000..37470af --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/080-planet-construction.sql @@ -0,0 +1,217 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - buildings construction and destruction +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_construction_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + wu_per_pop REAL; + dest_work REAL; + dest_rec REAL; + cur_empire INT; + cur_cash REAL; + cur_planet INT; + p_finished BOOLEAN; + cur_wus REAL; + cur_acc_c REAL; + n_found INT; + n_removed INT; + i_work REAL; + i_cost REAL; + can_do REAL; + must_do INT; +BEGIN + -- Get constants + wu_per_pop := sys.get_constant( 'game.work.wuPerPopUnit' ); + dest_work := sys.get_constant( 'game.work.destructionWork' ); + dest_rec := - sys.get_constant( 'game.work.destructionRecovery' ); + + -- Enter update loop + cur_empire := NULL; + cur_planet := NULL; + FOR rec IN SELECT p.name_id AS id , p.population AS pop , + ( ph.current / p.population )::REAL AS happiness , + e.name_id AS owner , e.cash AS cash , + q.money AS acc_cash , q.work AS acc_work , + qi.queue_order AS qorder , qi.amount AS amount , + qi.destroy AS destroy , qi.building_id AS building , + b.work AS req_work , b.cost AS req_cost + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.bld_queues q ON q.planet_id = p.name_id + INNER JOIN verse.bld_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables b ON b.name_id = qi.building_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_CONSTRUCTION' + AND ( v.account_id IS NULL OR v.status <> 'PROCESSED' ) + ORDER BY e.name_id , p.name_id , qi.queue_order + FOR UPDATE OF p , e , q , qi + LOOP + -- Update accumulated work and money for the previous planet + IF cur_planet IS NOT NULL AND cur_planet <> rec.id THEN + IF n_found = n_removed THEN + cur_wus := 0; + cur_acc_c := 0; + PERFORM events.empty_queue_events( cur_empire , cur_planet , FALSE , c_tick ); + END IF; + + UPDATE verse.bld_queues + SET money = cur_acc_c , work = cur_wus + WHERE planet_id = cur_planet; + cur_cash := cur_cash - cur_acc_c; + + IF cur_cash < 0 THEN + cur_cash := 0; + END IF; + + cur_planet := NULL; + END IF; + + -- Update cash of the previous empire + IF cur_empire IS NOT NULL AND cur_empire <> rec.owner + THEN + UPDATE emp.empires SET cash = cur_cash + WHERE name_id = cur_empire; + cur_empire := NULL; + END IF; + + -- If this is the first record or if the empire changed... + IF cur_empire IS NULL THEN + cur_empire := rec.owner; + cur_cash := rec.cash; + END IF; + + -- If this is the first record or if the planet changed... + IF cur_planet IS NULL THEN + cur_planet := rec.id; + cur_cash := cur_cash + rec.acc_cash; + cur_wus := rec.acc_work + verse.adjust_production( + ( rec.pop * wu_per_pop )::REAL , + rec.happiness + ); + n_found := 1; + n_removed := 0; + cur_acc_c := 0; + p_finished := FALSE; + ELSE + n_found := n_found + 1; + END IF; + + -- If we're done updating this planet but there were more items... + IF p_finished THEN + IF n_removed > 0 THEN + UPDATE verse.bld_items + SET queue_order = rec.qorder - n_removed + WHERE queue_order = rec.qorder AND queue_id = rec.id; + END IF; + CONTINUE; + END IF; + + -- Compute the actual cost and required work of the item + i_cost := rec.req_cost * ( CASE WHEN rec.destroy THEN dest_rec ELSE 1.0 END ); + i_work := rec.req_work * ( CASE WHEN rec.destroy THEN dest_work ELSE 1.0 END ); + + -- Compute how many items can be completed + can_do := cur_wus / i_work; + IF i_cost > 0 AND cur_cash / i_cost < can_do THEN + can_do := cur_cash / i_cost; + cur_wus := i_work * can_do; + END IF; + + -- If we can't build anything at this point... + IF can_do < 1 THEN + -- Set accumulated cash + IF i_cost > 0 THEN + cur_acc_c := can_do * i_cost; + END IF; + + -- Still update queue item if some items were removed + IF n_removed > 0 THEN + UPDATE verse.bld_items + SET queue_order = rec.qorder - n_removed + WHERE queue_order = rec.qorder AND queue_id = rec.id; + END IF; + + -- Done with this planet + p_finished := TRUE; + CONTINUE; + END IF; + + -- Compute how many actual items can be built + must_do := floor( can_do ); + IF must_do >= rec.amount THEN + must_do := rec.amount; + can_do := 0; + n_removed := n_removed + 1; + END IF; + + -- Handle construction / destruction + IF rec.destroy THEN + must_do := verse.do_destroy_buildings( rec.id , rec.building , must_do ); + PERFORM battles.remove_buildings( rec.id , rec.building , must_do , FALSE , c_tick + 1 ); + ELSE + PERFORM verse.do_construct_buildings( rec.id , rec.building , must_do ); + PERFORM battles.add_buildings( rec.id , rec.building , must_do , c_tick + 1 ); + END IF; + cur_cash := cur_cash - must_do * i_cost; + cur_wus := cur_wus - must_do * i_work; + + -- Check whether we're done with this queue + IF rec.qorder < n_removed THEN + -- Delete queue item + DELETE FROM verse.bld_items + WHERE queue_order = rec.qorder AND queue_id = rec.id; + ELSE + -- Update queue item + UPDATE verse.bld_items + SET queue_order = queue_order - n_removed , + amount = amount - floor( can_do ) + WHERE queue_order = rec.qorder AND queue_id = rec.id; + + -- Set accumulated cash + IF i_cost > 0 THEN + cur_acc_c := ( can_do - floor( can_do ) ) * i_cost; + END IF; + + p_finished := TRUE; + END IF; + END LOOP; + + -- If a planet was being procesed, update it and the empire + IF cur_planet IS NOT NULL THEN + IF n_found = n_removed THEN + cur_wus := 0; + cur_acc_c := 0; + PERFORM events.empty_queue_events( cur_empire , cur_planet , FALSE , c_tick ); + END IF; + + UPDATE verse.bld_queues + SET money = cur_acc_c , work = cur_wus + WHERE planet_id = cur_planet; + cur_cash := cur_cash - cur_acc_c; + + IF cur_cash < 0 THEN + cur_cash := 0; + END IF; + + UPDATE emp.empires SET cash = cur_cash + WHERE name_id = cur_empire; + cur_empire := NULL; + END IF; +END; +$$ LANGUAGE plpgsql; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/090-planet-military.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/090-planet-military.sql new file mode 100644 index 0000000..f3c250a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/090-planet-military.sql @@ -0,0 +1,227 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - ship construction +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_military_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + cur_empire INT; + cur_cash REAL; + cur_planet INT; + p_finished BOOLEAN; + cur_wus REAL; + cur_acc_c REAL; + n_found INT; + n_removed INT; + can_do REAL; + must_do INT; + fl_id BIGINT; +BEGIN + -- Create temporary table for built ships + CREATE TEMPORARY TABLE blt_ships( + location INT , + owner INT , + ship INT , + amount INT + ); + + -- Enter update loop + cur_empire := NULL; + cur_planet := NULL; + FOR rec IN SELECT p.name_id AS id , + ( ph.current / p.population )::REAL AS happiness , + e.name_id AS owner , e.cash AS cash , + q.money AS acc_cash , q.work AS acc_work , + qi.queue_order AS qorder , qi.amount AS amount , + qi.ship_id AS ship , s.work AS req_work , s.cost AS req_cost + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN emp.planets ep ON ep.planet_id = p.name_id + INNER JOIN emp.empires e ON e.name_id = ep.empire_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.mil_queues q ON q.planet_id = p.name_id + INNER JOIN verse.mil_items qi ON qi.queue_id = q.planet_id + INNER JOIN tech.buildables s ON s.name_id = qi.ship_id + INNER JOIN naming.empire_names en ON en.id = e.name_id + LEFT OUTER JOIN users.vacations v ON v.account_id = en.owner_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_MILITARY' + AND ( v.account_id IS NULL OR v.status <> 'PROCESSED' ) + ORDER BY e.name_id , p.name_id , qi.queue_order + FOR UPDATE OF p , e , q , qi + LOOP + -- Update accumulated work and money for the previous planet + IF cur_planet IS NOT NULL AND cur_planet <> rec.id THEN + IF n_found = n_removed THEN + cur_wus := 0; + cur_acc_c := 0; + PERFORM events.empty_queue_events( cur_empire , cur_planet , TRUE , c_tick ); + END IF; + + UPDATE verse.mil_queues + SET money = cur_acc_c , work = cur_wus + WHERE planet_id = cur_planet; + cur_cash := cur_cash - cur_acc_c; + + IF cur_cash < 0 THEN + cur_cash := 0; + END IF; + + cur_planet := NULL; + END IF; + + -- Update cash of the previous empire + IF cur_empire IS NOT NULL AND cur_empire <> rec.owner + THEN + UPDATE emp.empires SET cash = cur_cash + WHERE name_id = cur_empire; + cur_empire := NULL; + END IF; + + -- If this is the first record or if the empire changed... + IF cur_empire IS NULL THEN + cur_empire := rec.owner; + cur_cash := rec.cash; + END IF; + + -- If this is the first record or if the planet changed... + IF cur_planet IS NULL THEN + cur_planet := rec.id; + cur_cash := cur_cash + rec.acc_cash; + cur_wus := rec.acc_work + verse.adjust_production( + verse.get_raw_production( rec.id , 'WORK' ) , + rec.happiness + ); + n_found := 1; + n_removed := 0; + cur_acc_c := 0; + p_finished := FALSE; + ELSE + n_found := n_found + 1; + END IF; + + -- If we're done updating this planet but there were more items... + IF p_finished THEN + IF n_removed > 0 THEN + UPDATE verse.mil_items + SET queue_order = rec.qorder - n_removed + WHERE queue_order = rec.qorder AND queue_id = rec.id; + END IF; + CONTINUE; + END IF; + + -- Compute how many items can be completed + can_do := cur_wus / rec.req_work; + IF cur_cash / rec.req_cost < can_do THEN + can_do := cur_cash / rec.req_cost; + cur_wus := rec.req_work * can_do; + END IF; + + -- If we can't build anything at this point... + IF can_do < 1 THEN + -- Set accumulated cash + cur_acc_c := can_do * rec.req_cost; + + -- Still update queue item if some items were removed + IF n_removed > 0 THEN + UPDATE verse.mil_items + SET queue_order = rec.qorder - n_removed + WHERE queue_order = rec.qorder AND queue_id = rec.id; + END IF; + + -- Done with this planet + p_finished := TRUE; + CONTINUE; + END IF; + + -- Compute how many actual items can be built + must_do := floor( can_do ); + IF must_do >= rec.amount THEN + must_do := rec.amount; + can_do := 0; + n_removed := n_removed + 1; + END IF; + + -- Handle construction + INSERT INTO blt_ships( location , owner , ship , amount) + VALUES ( rec.id , rec.owner , rec.ship , must_do ); + cur_cash := cur_cash - must_do * rec.req_cost; + cur_wus := cur_wus - must_do * rec.req_work; + + -- Check whether we're done with this queue + IF rec.qorder < n_removed THEN + -- Delete queue item + DELETE FROM verse.mil_items + WHERE queue_order = rec.qorder AND queue_id = rec.id; + ELSE + -- Update queue item + UPDATE verse.mil_items + SET queue_order = queue_order - n_removed , + amount = amount - must_do + WHERE queue_order = rec.qorder AND queue_id = rec.id; + + -- Set accumulated cash + cur_acc_c := ( can_do - floor( can_do ) ) * rec.req_cost; + + p_finished := TRUE; + END IF; + END LOOP; + + -- If a planet was being procesed, update it and the empire + IF cur_planet IS NOT NULL THEN + IF n_found = n_removed THEN + cur_wus := 0; + cur_acc_c := 0; + PERFORM events.empty_queue_events( cur_empire , cur_planet , TRUE , c_tick ); + END IF; + + UPDATE verse.mil_queues + SET money = cur_acc_c , work = cur_wus + WHERE planet_id = cur_planet; + cur_cash := cur_cash - cur_acc_c; + + IF cur_cash < 0 THEN + cur_cash := 0; + END IF; + + UPDATE emp.empires SET cash = cur_cash + WHERE name_id = cur_empire; + cur_empire := NULL; + END IF; + + -- Spawn fleets + FOR cur_planet , cur_empire IN SELECT DISTINCT location , owner FROM blt_ships + LOOP + -- Get fleet's flight time + SELECT INTO must_do MAX( s.flight_time ) + FROM blt_ships b + INNER JOIN tech.ships s ON s.buildable_id = b.ship + WHERE b.location = cur_planet AND b.owner = cur_empire; + + -- Insert the fleet + INSERT INTO fleets.fleets (owner_id, location_id , attacking , status , penalty ) + VALUES ( cur_empire , cur_planet , FALSE , 'DEPLOYING' , must_do * 2 ) + RETURNING id INTO fl_id; + + -- Insert ships + INSERT INTO fleets.ships ( fleet_id , ship_id , amount , damage ) + SELECT fl_id , b.ship , sum( b.amount ) , 0 + FROM blt_ships b + WHERE b.location = cur_planet AND b.owner = cur_empire + GROUP BY b.ship; + END LOOP; + + -- Destroy temporary table + DROP TABLE blt_ships; +END; +$$ LANGUAGE plpgsql; diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/100-planet-population.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/100-planet-population.sql new file mode 100644 index 0000000..2a805f8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/100-planet-population.sql @@ -0,0 +1,104 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - population growth and happiness +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_population_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + rel_ch REAL; + abs_ch REAL; + g_fact REAL; + gf_inc REAL; + n_happ REAL; + t_happ REAL; + temp REAL; + growth REAL; + workers REAL; + str_thr REAL; +BEGIN + -- Get constants + rel_ch := sys.get_constant( 'game.happiness.relativeChange' ); + abs_ch := sys.get_constant( 'game.happiness.maxAbsoluteChange' ); + g_fact := sys.get_constant( 'game.growthFactor' ); + gf_inc := sys.get_constant( 'game.growthFactor.rCentre' ); + str_thr := sys.get_constant( 'game.happiness.strike' ); + + -- Process planets + FOR rec IN SELECT p.name_id AS id , p.population AS pop , + ph.target AS target , ph.current AS happy_pop , + ( ph.current / p.population )::REAL AS current + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_POPULATION' + FOR UPDATE OF p, ph + LOOP + IF round( rec.target / rel_ch ) = round( rec.current / rel_ch ) THEN + -- Happiness does not change + n_happ := rec.current; + ELSE + -- Compute new happiness + temp := rec.pop * rel_ch; + IF temp > abs_ch THEN + temp := abs_ch; + ELSEIF temp < 1 THEN + temp := 1; + END IF; + + IF rec.target < rec.current THEN + temp := - temp; + END IF; + + n_happ := ( rec.happy_pop + temp ) / rec.pop; + END IF; + + -- Compute population growth + temp := verse.adjust_production( verse.get_raw_production( rec.id , 'POP' ) , n_happ ); + growth := ( g_fact + temp * gf_inc ) * n_happ / 1440.0; + + -- Get workers + SELECT INTO workers SUM( b.amount * d.workers ) + FROM verse.planet_buildings b + INNER JOIN tech.buildings d + ON d.buildable_id = b.building_id + WHERE b.planet_id = rec.id; + IF workers IS NULL THEN + workers := 0; + END IF; + + -- Compute new target happiness + t_happ := verse.compute_happiness( rec.pop + growth , workers , + verse.adjust_production( verse.get_raw_production( rec.id , 'DEF' ) , n_happ ) , + emp.get_size( rec.id ) + ); + + -- Update planet and happiness records + UPDATE verse.planet_happiness + SET current = ( rec.pop + growth ) * n_happ , target = t_happ + WHERE planet_id = rec.id; + UPDATE verse.planets + SET population = rec.pop + growth + WHERE name_id = rec.id; + + -- Send strike begin/end messages + IF n_happ < str_thr AND rec.current >= str_thr + THEN + PERFORM events.strike_event( rec.id , TRUE ); + ELSEIF n_happ >= str_thr AND rec.current < str_thr + THEN + PERFORM events.strike_event( rec.id , FALSE ); + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/110-planet-money.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/110-planet-money.sql new file mode 100644 index 0000000..cbcc432 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/parts/updates/110-planet-money.sql @@ -0,0 +1,45 @@ +-- LegacyWorlds Beta 6 +-- PostgreSQL database scripts +-- +-- Game updates - planet income and upkeep +-- +-- Copyright(C) 2004-2010, DeepClone Development +-- -------------------------------------------------------- + + +CREATE OR REPLACE FUNCTION sys.process_planet_money_updates( c_tick BIGINT ) + RETURNS VOID + STRICT VOLATILE + SECURITY INVOKER + AS $$ +DECLARE + rec RECORD; + incme REAL; +BEGIN + FOR rec IN SELECT p.name_id AS id , p.population AS pop , + ( ph.current / p.population )::REAL AS happiness , + ( ea.planet_id IS NULL ) AS produces_income + FROM sys.updates su + INNER JOIN verse.updates vu ON vu.update_id = su.id + INNER JOIN verse.planets p ON vu.planet_id = p.name_id + INNER JOIN verse.planet_happiness ph ON ph.planet_id = p.name_id + INNER JOIN verse.planet_money pm ON pm.planet_id = p.name_id + LEFT OUTER JOIN emp.abandon ea ON ea.planet_id = p.name_id + WHERE su.last_tick = c_tick AND su.status = 'PROCESSING' + AND su.gu_type = 'PLANET_MONEY' + FOR UPDATE OF p, pm + LOOP + IF rec.produces_income THEN + incme := verse.compute_income( rec.pop , rec.happiness , + verse.get_raw_production( rec.id , 'CASH' ) + ); + ELSE + incme := 0; + END IF; + UPDATE verse.planet_money + SET income = incme , + upkeep = verse.get_planet_upkeep( rec.id ) + WHERE planet_id = rec.id; + END LOOP; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/db-structure/test-mode.sql b/legacyworlds-server/legacyworlds-server-data/db-structure/test-mode.sql new file mode 100644 index 0000000..777b268 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/db-structure/test-mode.sql @@ -0,0 +1,7 @@ +INSERT INTO admin.administrators (appear_as, pass_md5 , pass_sha1, privileges) + VALUES ( 'Test' , '...' , '...' , 0 ); +SELECT sys.set_constant( 'game.growthFactor' , 200 , 1 ); +SELECT sys.set_constant( 'game.battle.damage' , 0.05 , 1 ); +SELECT sys.set_constant( 'game.battle.timeToFullIntensity' , 5 , 1 ); +SELECT sys.set_constant( 'map.names.minDelay' , 1 , 1 ); +SELECT sys.set_constant( 'game.work.wuPerPopUnit' , 0.5 , 1 ); diff --git a/legacyworlds-server/legacyworlds-server-data/pom.xml b/legacyworlds-server/legacyworlds-server-data/pom.xml new file mode 100644 index 0000000..a84f721 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-data + Legacy Worlds server data + 5.99.1 + This package contains all data access classes for the Legacy Worlds server. + + + + com.deepclone.lw + legacyworlds-session + ${project.version} + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/Account.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/Account.java new file mode 100644 index 0000000..dfb1648 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/Account.java @@ -0,0 +1,251 @@ +package com.deepclone.lw.sqld.accounts; + + +import java.sql.Timestamp; + +import com.deepclone.lw.cmd.admin.users.AccountStatus; + + + +public class Account +{ + + private int id; + + private String address; + + private String language; + + private String passMd5; + + private String passSha1; + + private int gameCredits; + + private AccountStatus status; + + private String validationToken; + + private String pwdRecoveryToken; + + private String addressChangeToken; + + private String newAddress; + + private Integer vacationCredits; + + private Integer vacationTime; + + private Timestamp vacationStart; + + private Timestamp inactivityStart; + + private String inactivityReason; + + private Integer banRequestId; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + + + public String getPassMd5( ) + { + return passMd5; + } + + + public void setPassMd5( String passMd5 ) + { + this.passMd5 = passMd5; + } + + + public String getPassSha1( ) + { + return passSha1; + } + + + public void setPassSha1( String passSha1 ) + { + this.passSha1 = passSha1; + } + + + public int getGameCredits( ) + { + return gameCredits; + } + + + public void setGameCredits( int gameCredits ) + { + this.gameCredits = gameCredits; + } + + + public AccountStatus getStatus( ) + { + return status; + } + + + public void setStatus( AccountStatus status ) + { + this.status = status; + } + + + public String getValidationToken( ) + { + return validationToken; + } + + + public void setValidationToken( String validationToken ) + { + this.validationToken = validationToken; + } + + + public String getPwdRecoveryToken( ) + { + return pwdRecoveryToken; + } + + + public void setPwdRecoveryToken( String pwdRecoveryToken ) + { + this.pwdRecoveryToken = pwdRecoveryToken; + } + + + public String getAddressChangeToken( ) + { + return addressChangeToken; + } + + + public void setAddressChangeToken( String addressChangeToken ) + { + this.addressChangeToken = addressChangeToken; + } + + + public String getNewAddress( ) + { + return newAddress; + } + + + public void setNewAddress( String newAddress ) + { + this.newAddress = newAddress; + } + + + public Integer getVacationCredits( ) + { + return vacationCredits; + } + + + public void setVacationCredits( Integer vacationCredits ) + { + this.vacationCredits = vacationCredits; + } + + + public Integer getVacationTime( ) + { + return vacationTime; + } + + + public void setVacationTime( Integer vacationTime ) + { + this.vacationTime = vacationTime; + } + + + public Timestamp getVacationStart( ) + { + return vacationStart; + } + + + public void setVacationStart( Timestamp vacationStart ) + { + this.vacationStart = vacationStart; + } + + + public Timestamp getInactivityStart( ) + { + return inactivityStart; + } + + + public void setInactivityStart( Timestamp inactivityStart ) + { + this.inactivityStart = inactivityStart; + } + + + public String getInactivityReason( ) + { + return inactivityReason; + } + + + public void setInactivityReason( String inactivityReason ) + { + this.inactivityReason = inactivityReason; + } + + + public Integer getBanRequestId( ) + { + return banRequestId; + } + + + public void setBanRequestId( Integer banRequestId ) + { + this.banRequestId = banRequestId; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/AccountOperationResult.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/AccountOperationResult.java new file mode 100644 index 0000000..8300024 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/AccountOperationResult.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.sqld.accounts; + + +public class AccountOperationResult +{ + + private Account account; + + private int errorCode; + + + public Account getAccount( ) + { + return account; + } + + + public void setAccount( Account account ) + { + this.account = account; + } + + + public int getErrorCode( ) + { + return errorCode; + } + + + public void setErrorCode( int errorCode ) + { + this.errorCode = errorCode; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/QuittingAccount.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/QuittingAccount.java new file mode 100644 index 0000000..b179c6b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/QuittingAccount.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.sqld.accounts; + + +public class QuittingAccount +{ + + private int id; + private String address; + private String language; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/ValidationResult.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/ValidationResult.java new file mode 100644 index 0000000..25e63b3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/accounts/ValidationResult.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.sqld.accounts; + + +public class ValidationResult +{ + private int accountError; + private int empireError; + private int planetError; + + + public int getAccountError( ) + { + return accountError; + } + + + public void setAccountError( int accountError ) + { + this.accountError = accountError; + } + + + public int getEmpireError( ) + { + return empireError; + } + + + public void setEmpireError( int empireError ) + { + this.empireError = empireError; + } + + + public int getPlanetError( ) + { + return planetError; + } + + + public void setPlanetError( int planetError ) + { + this.planetError = planetError; + } + + + public boolean isError( ) + { + return ( this.planetError != 0 || this.empireError != 0 || this.accountError != 0 ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminConnection.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminConnection.java new file mode 100644 index 0000000..17690cd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminConnection.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.sqld.admin; + + +public enum AdminConnection { + + SUCCESS , + PASSWORD , + INACTIVE + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminRecord.java new file mode 100644 index 0000000..b21e7c9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/admin/AdminRecord.java @@ -0,0 +1,126 @@ +package com.deepclone.lw.sqld.admin; + + +public class AdminRecord +{ + + private int id; + private String name; + private int privileges; + private boolean active; + + private Integer account; + private String address; + private String pSha1; + private String pMd5; + private Boolean passChangeRequired; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public int getPrivileges( ) + { + return privileges; + } + + + public void setPrivileges( int privileges ) + { + this.privileges = privileges; + } + + + public boolean isActive( ) + { + return active; + } + + + public void setActive( boolean active ) + { + this.active = active; + } + + + public Integer getAccount( ) + { + return account; + } + + + public void setAccount( Integer account ) + { + this.account = account; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public String getpSha1( ) + { + return pSha1; + } + + + public void setpSha1( String pSha1 ) + { + this.pSha1 = pSha1; + } + + + public String getpMd5( ) + { + return pMd5; + } + + + public void setpMd5( String pMd5 ) + { + this.pMd5 = pMd5; + } + + + public Boolean getPassChangeRequired( ) + { + return passChangeRequired; + } + + + public void setPassChangeRequired( Boolean passChangeRequired ) + { + this.passChangeRequired = passChangeRequired; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/AllianceMembership.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/AllianceMembership.java new file mode 100644 index 0000000..164831c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/AllianceMembership.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.sqld.game; + + +public class AllianceMembership +{ + + private int allianceId; + + private boolean pending; + + + public int getAllianceId( ) + { + return allianceId; + } + + + public void setAllianceId( int allianceId ) + { + this.allianceId = allianceId; + } + + + public boolean isPending( ) + { + return pending; + } + + + public void setPending( boolean pending ) + { + this.pending = pending; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/BuildingOutputType.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/BuildingOutputType.java new file mode 100644 index 0000000..1301ef0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/BuildingOutputType.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.sqld.game; + + +public enum BuildingOutputType { + + WORK , + CASH , + DEF , + POP + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechLine.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechLine.java new file mode 100644 index 0000000..7ab9d68 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechLine.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.sqld.game; + + +import java.util.LinkedList; +import java.util.List; + + + +public class EmpireTechLine +{ + private int id; + + private String name; + + private String description; + + private List< EmpireTechnology > technologies = new LinkedList< EmpireTechnology >( ); + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public List< EmpireTechnology > getTechnologies( ) + { + return technologies; + } + + + public void addTechnology( EmpireTechnology eTech ) + { + this.technologies.add( eTech ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechnology.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechnology.java new file mode 100644 index 0000000..b36d4dd --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/EmpireTechnology.java @@ -0,0 +1,90 @@ +package com.deepclone.lw.sqld.game; + + +public class EmpireTechnology +{ + private int line; + + private String name; + + private String description; + + private boolean implemented; + + private int progress; + + private int cost; + + + public int getLine( ) + { + return line; + } + + + public void setLine( int line ) + { + this.line = line; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public boolean isImplemented( ) + { + return implemented; + } + + + public void setImplemented( boolean implemented ) + { + this.implemented = implemented; + } + + + public int getProgress( ) + { + return progress; + } + + + public void setProgress( int progress ) + { + this.progress = progress; + } + + + public int getCost( ) + { + return cost; + } + + + public void setCost( int cost ) + { + this.cost = cost; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/GeneralInformation.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/GeneralInformation.java new file mode 100644 index 0000000..82b7270 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/GeneralInformation.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.sqld.game; + + +public class GeneralInformation +{ + + private Character status; + + private String name; + + private String tag; + + private long cash; + + private long nextTick; + + private int accountId; + + + public GeneralInformation( Character status , String name , String tag , long cash , long nextTick , int accountId ) + { + this.status = status; + this.name = name; + this.tag = tag; + this.cash = cash; + this.nextTick = nextTick; + this.accountId = accountId; + } + + + public Character getStatus( ) + { + return status; + } + + + public String getName( ) + { + return name; + } + + + public String getTag( ) + { + return tag; + } + + + public long getCash( ) + { + return cash; + } + + + public long getNextTick( ) + { + return nextTick; + } + + + public int getAccountId( ) + { + return accountId; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/MapData.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/MapData.java new file mode 100644 index 0000000..49bbf48 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/MapData.java @@ -0,0 +1,119 @@ +package com.deepclone.lw.sqld.game; + + +public class MapData +{ + + private int x; + + private int y; + + private int orbit; + + private int id; + + private int picture; + + private String name; + + private String tag; + + private String display; + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public int getPicture( ) + { + return picture; + } + + + public void setPicture( int picture ) + { + this.picture = picture; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getTag( ) + { + return tag; + } + + + public void setTag( String tag ) + { + this.tag = tag; + } + + + public String getDisplay( ) + { + return display; + } + + + public void setDisplay( String display ) + { + this.display = display; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/PlanetData.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/PlanetData.java new file mode 100644 index 0000000..1b47231 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/PlanetData.java @@ -0,0 +1,293 @@ +package com.deepclone.lw.sqld.game; + + +public final class PlanetData +{ + public static enum AccessType { + BASIC , + PRESENT , + OWNER + } + + public static class Basic + { + private AccessType access; + private int x; + private int y; + private int orbit; + private int picture; + private String name; + private String tag; + + + public AccessType getAccess( ) + { + return access; + } + + + public void setAccess( AccessType access ) + { + this.access = access; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public int getPicture( ) + { + return picture; + } + + + public void setPicture( int picture ) + { + this.picture = picture; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getTag( ) + { + return tag; + } + + + public void setTag( String tag ) + { + this.tag = tag; + } + + } + + public static class Orbital + { + private long population; + private long defence; + private long ownPower; + private long friendlyPower; + private long hostilePower; + private Long battle; + + + public long getPopulation( ) + { + return population; + } + + + public void setPopulation( long population ) + { + this.population = population; + } + + + public long getDefence( ) + { + return defence; + } + + + public void setDefence( long defence ) + { + this.defence = defence; + } + + + public long getOwnPower( ) + { + return ownPower; + } + + + public void setOwnPower( Long ownPower ) + { + this.ownPower = ( ownPower == null ) ? 0 : ownPower.longValue( ); + } + + + public long getFriendlyPower( ) + { + return friendlyPower; + } + + + public void setFriendlyPower( Long friendlyPower ) + { + this.friendlyPower = ( friendlyPower == null ) ? 0 : friendlyPower.longValue( ); + } + + + public long getHostilePower( ) + { + return hostilePower; + } + + + public void setHostilePower( Long hostilePower ) + { + this.hostilePower = ( hostilePower == null ) ? 0 : hostilePower.longValue( ); + } + + + public Long getBattle( ) + { + return battle; + } + + + public void setBattle( Long battle ) + { + this.battle = battle; + } + + } + + public static class Owner + { + private int happiness; + private int hChange; + private long income; + private long upkeep; + private boolean renamePossible; + private boolean abandonPossible; + private Integer abandonTime; + + + public int getHappiness( ) + { + return happiness; + } + + + public void setHappiness( int happiness ) + { + this.happiness = happiness; + } + + + public int gethChange( ) + { + return hChange; + } + + + public void sethChange( int hChange ) + { + this.hChange = hChange; + } + + + public long getIncome( ) + { + return income; + } + + + public void setIncome( long income ) + { + this.income = income; + } + + + public long getUpkeep( ) + { + return upkeep; + } + + + public void setUpkeep( long upkeep ) + { + this.upkeep = upkeep; + } + + + public boolean isRenamePossible( ) + { + return renamePossible; + } + + + public void setRenamePossible( boolean renamePossible ) + { + this.renamePossible = renamePossible; + } + + + public boolean isAbandonPossible( ) + { + return abandonPossible; + } + + + public void setAbandonPossible( boolean abandonPossible ) + { + this.abandonPossible = abandonPossible; + } + + + public Integer getAbandonTime( ) + { + return abandonTime; + } + + + public void setAbandonTime( Integer abandonTime ) + { + this.abandonTime = abandonTime; + } + + } + + + private PlanetData( ) + { + // EMPTY + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetOwner.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetOwner.java new file mode 100644 index 0000000..1c35cb6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetOwner.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.sqld.game; + + +public class RawFleetOwner +{ + + private int location; + private int id; + private String name; + private String relation; + + + public int getLocation( ) + { + return location; + } + + + public void setLocation( int location ) + { + this.location = location; + } + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getRelation( ) + { + return relation; + } + + + public void setRelation( String relation ) + { + this.relation = relation; + } +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetShip.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetShip.java new file mode 100644 index 0000000..d9acbf2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawFleetShip.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.sqld.game; + + +public class RawFleetShip +{ + + private long fleet; + private int shipType; + private int amount; + private int power; + private String name; + + + public long getFleet( ) + { + return fleet; + } + + + public void setFleet( long fleet ) + { + this.fleet = fleet; + } + + + public int getShipType( ) + { + return shipType; + } + + + public void setShipType( int shipType ) + { + this.shipType = shipType; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + + + public int getPower( ) + { + return power; + } + + + public void setPower( int power ) + { + this.power = power; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawStaticFleet.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawStaticFleet.java new file mode 100644 index 0000000..552ea22 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/RawStaticFleet.java @@ -0,0 +1,111 @@ +package com.deepclone.lw.sqld.game; + + +public class RawStaticFleet +{ + private int owner; + private int location; + private long id; + private String name; + private String status; + private int penalty; + private long power; + private int flightTime; + + + public int getOwner( ) + { + return owner; + } + + + public void setOwner( int owner ) + { + this.owner = owner; + } + + + public int getLocation( ) + { + return location; + } + + + public void setLocation( int location ) + { + this.location = location; + } + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getStatus( ) + { + return status; + } + + + public void setStatus( String status ) + { + this.status = status; + } + + + public int getPenalty( ) + { + return penalty; + } + + + public void setPenalty( int penalty ) + { + this.penalty = penalty; + } + + + public long getPower( ) + { + return power; + } + + + public void setPower( long power ) + { + this.power = power; + } + + + public int getFlightTime( ) + { + return flightTime; + } + + + public void setFlightTime( int flightTime ) + { + this.flightTime = flightTime; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BattleListRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BattleListRecord.java new file mode 100644 index 0000000..f17049a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BattleListRecord.java @@ -0,0 +1,137 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class BattleListRecord +{ + private long battle; + private int planetId; + private int x; + private int y; + private int orbit; + private String name; + private long firstTick; + private Long lastTick; + private boolean finished; + private long lastUpdate; + + + public long getBattle( ) + { + return battle; + } + + + public void setBattle( long battle ) + { + this.battle = battle; + } + + + public int getPlanetId( ) + { + return planetId; + } + + + public void setPlanetId( int planetId ) + { + this.planetId = planetId; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public long getFirstTick( ) + { + return firstTick; + } + + + public void setFirstTick( long firstTick ) + { + this.firstTick = firstTick; + } + + + public Long getLastTick( ) + { + return lastTick; + } + + + public void setLastTick( Long lastTick ) + { + this.lastTick = lastTick; + } + + + public boolean isFinished( ) + { + return finished; + } + + + public void setFinished( boolean finished ) + { + this.finished = finished; + } + + + public long getLastUpdate( ) + { + return lastUpdate; + } + + + public void setLastUpdate( long lastUpdate ) + { + this.lastUpdate = lastUpdate; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BuildingHistoryRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BuildingHistoryRecord.java new file mode 100644 index 0000000..dae7ba4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/BuildingHistoryRecord.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class BuildingHistoryRecord +{ + + private long tick; + private String nature; + private long current; + private long lost; + private long power; + + + public long getTick( ) + { + return tick; + } + + + public void setTick( long tick ) + { + this.tick = tick; + } + + + public String getNature( ) + { + return nature; + } + + + public void setNature( String nature ) + { + this.nature = nature; + } + + + public long getCurrent( ) + { + return current; + } + + + public void setCurrent( long current ) + { + this.current = current; + } + + + public long getLost( ) + { + return lost; + } + + + public void setLost( long lost ) + { + this.lost = lost; + } + + + public long getPower( ) + { + return power; + } + + + public void setPower( long power ) + { + this.power = power; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EmpireBattleRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EmpireBattleRecord.java new file mode 100644 index 0000000..57e5730 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EmpireBattleRecord.java @@ -0,0 +1,138 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class EmpireBattleRecord +{ + + private long battleId; + private int empireId; + private long protagonistId; + private long firstTick; + private Long lastTick; + private String planetName; + private int planetId; + private int x; + private int y; + private int orbit; + + + public long getBattleId( ) + { + return battleId; + } + + + public void setBattleId( long battleId ) + { + this.battleId = battleId; + } + + + public int getEmpireId( ) + { + return empireId; + } + + + public void setEmpireId( int empireId ) + { + this.empireId = empireId; + } + + + public long getProtagonistId( ) + { + return protagonistId; + } + + + public void setProtagonistId( long protagonistId ) + { + this.protagonistId = protagonistId; + } + + + public long getFirstTick( ) + { + return firstTick; + } + + + public void setFirstTick( long firstTick ) + { + this.firstTick = firstTick; + } + + + public Long getLastTick( ) + { + return lastTick; + } + + + public void setLastTick( Long lastTick ) + { + this.lastTick = lastTick; + } + + + public String getPlanetName( ) + { + return planetName; + } + + + public void setPlanetName( String planetName ) + { + this.planetName = planetName; + } + + + public int getPlanetId( ) + { + return planetId; + } + + + public void setPlanetId( int planetId ) + { + this.planetId = planetId; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventItemRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventItemRecord.java new file mode 100644 index 0000000..913d0e3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventItemRecord.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class EventItemRecord +{ + private boolean planetEvent; + private long eventId; + private String nature; + private int amount; + + + public boolean isPlanetEvent( ) + { + return planetEvent; + } + + + public void setPlanetEvent( boolean planetEvent ) + { + this.planetEvent = planetEvent; + } + + + public long getEventId( ) + { + return eventId; + } + + + public void setEventId( long eventId ) + { + this.eventId = eventId; + } + + + public String getNature( ) + { + return nature; + } + + + public void setNature( String nature ) + { + this.nature = nature; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventRecord.java new file mode 100644 index 0000000..a6fe677 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/EventRecord.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class EventRecord +{ + + private long tick; + private String eventType; + private boolean planet; + private Long eventId; + private String name; + private Boolean attack; + + + public long getTick( ) + { + return tick; + } + + + public void setTick( long tick ) + { + this.tick = tick; + } + + + public String getEventType( ) + { + return eventType; + } + + + public void setEventType( String eventType ) + { + this.eventType = eventType; + } + + + public boolean isPlanet( ) + { + return planet; + } + + + public void setPlanet( boolean planet ) + { + this.planet = planet; + } + + + public Long getEventId( ) + { + return eventId; + } + + + public void setEventId( Long eventId ) + { + this.eventId = eventId; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public Boolean getAttack( ) + { + return attack; + } + + + public void setAttack( Boolean attack ) + { + this.attack = attack; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/PresenceRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/PresenceRecord.java new file mode 100644 index 0000000..863864e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/PresenceRecord.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class PresenceRecord +{ + private long tick; + private boolean present; + private boolean isPlanetOwner; + + + public long getTick( ) + { + return tick; + } + + + public void setTick( long tick ) + { + this.tick = tick; + } + + + public boolean isPresent( ) + { + return present; + } + + + public void setPresent( boolean present ) + { + this.present = present; + } + + + public boolean isPlanetOwner( ) + { + return isPlanetOwner; + } + + + public void setPlanetOwner( boolean isPlanetOwner ) + { + this.isPlanetOwner = isPlanetOwner; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ProtagonistRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ProtagonistRecord.java new file mode 100644 index 0000000..b9656db --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ProtagonistRecord.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class ProtagonistRecord +{ + + private long tick; + private long protagonistId; + private Long empireId; + private String name; + private boolean attacking; + + + public long getTick( ) + { + return tick; + } + + + public void setTick( long tick ) + { + this.tick = tick; + } + + + public long getProtagonistId( ) + { + return protagonistId; + } + + + public void setProtagonistId( long protagonistId ) + { + this.protagonistId = protagonistId; + } + + + public Long getEmpireId( ) + { + return empireId; + } + + + public void setEmpireId( Long empireId ) + { + this.empireId = empireId; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public boolean isAttacking( ) + { + return attacking; + } + + + public void setAttacking( boolean status ) + { + this.attacking = status; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ShipHistoryRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ShipHistoryRecord.java new file mode 100644 index 0000000..f66d11f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/game/battle/ShipHistoryRecord.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.sqld.game.battle; + + +public class ShipHistoryRecord + extends BuildingHistoryRecord +{ + private long protagonist; + + + public long getProtagonist( ) + { + return protagonist; + } + + + public void setProtagonist( long protagonist ) + { + this.protagonist = protagonist; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/i18n/Translation.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/i18n/Translation.java new file mode 100644 index 0000000..f063d78 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/i18n/Translation.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.sqld.i18n; + + +public class Translation +{ + + private String languageId; + private String languageName; + private String stringId; + private String translation; + + + public String getLanguageId( ) + { + return languageId; + } + + + public void setLanguageId( String languageId ) + { + this.languageId = languageId; + } + + + public String getLanguageName( ) + { + return languageName; + } + + + public void setLanguageName( String languageName ) + { + this.languageName = languageName; + } + + + public String getStringId( ) + { + return stringId; + } + + + public void setStringId( String stringId ) + { + this.stringId = stringId; + } + + + public String getTranslation( ) + { + return translation; + } + + + public void setTranslation( String translation ) + { + this.translation = translation; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AdminEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AdminEventRecord.java new file mode 100644 index 0000000..d22ecbf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AdminEventRecord.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.sqld.msgs; + + +public class AdminEventRecord + extends EventRecord +{ + + private Integer warnings; + private Integer locationId; + private String oldName; + private String newName; + + + public Integer getWarnings( ) + { + return warnings; + } + + + public void setWarnings( Integer warnings ) + { + this.warnings = warnings; + } + + + public Integer getLocationId( ) + { + return locationId; + } + + + public void setLocationId( Integer locationId ) + { + this.locationId = locationId; + } + + + public String getOldName( ) + { + return oldName; + } + + + public void setOldName( String oldName ) + { + this.oldName = oldName; + } + + + public String getNewName( ) + { + return newName; + } + + + public void setNewName( String newName ) + { + this.newName = newName; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AllianceEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AllianceEventRecord.java new file mode 100644 index 0000000..f811077 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/AllianceEventRecord.java @@ -0,0 +1,74 @@ +package com.deepclone.lw.sqld.msgs; + + +public class AllianceEventRecord + extends EventRecord +{ + + private Integer allianceId; + private String allianceTag; + private Integer empireId; + private String empireName; + private Boolean reqResult; + + + public Integer getAllianceId( ) + { + return allianceId; + } + + + public void setAllianceId( Integer allianceId ) + { + this.allianceId = allianceId; + } + + + public String getAllianceTag( ) + { + return allianceTag; + } + + + public void setAllianceTag( String allianceTag ) + { + this.allianceTag = allianceTag; + } + + + public Integer getEmpireId( ) + { + return empireId; + } + + + public void setEmpireId( Integer empireId ) + { + this.empireId = empireId; + } + + + public String getEmpireName( ) + { + return empireName; + } + + + public void setEmpireName( String empireName ) + { + this.empireName = empireName; + } + + + public Boolean getReqResult( ) + { + return reqResult; + } + + + public void setReqResult( Boolean reqResult ) + { + this.reqResult = reqResult; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/BugEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/BugEventRecord.java new file mode 100644 index 0000000..d990cf5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/BugEventRecord.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.sqld.msgs; + + +public class BugEventRecord + extends EventRecord +{ + + private long reportId; + private String submitter; + private boolean admin; + + + public long getReportId( ) + { + return reportId; + } + + + public void setReportId( long reportId ) + { + this.reportId = reportId; + } + + + public String getSubmitter( ) + { + return submitter; + } + + + public void setSubmitter( String submitter ) + { + this.submitter = submitter; + } + + + public boolean isAdmin( ) + { + return admin; + } + + + public void setAdmin( boolean admin ) + { + this.admin = admin; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EmpireEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EmpireEventRecord.java new file mode 100644 index 0000000..793074e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EmpireEventRecord.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.sqld.msgs; + + +public class EmpireEventRecord + extends EventRecord +{ + private String tech; + + + public String getTech( ) + { + return tech; + } + + + public void setTech( String tech ) + { + this.tech = tech; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventRecord.java new file mode 100644 index 0000000..0fdd891 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventRecord.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.sqld.msgs; + + +public abstract class EventRecord + extends MessageDataRecord +{ + private EventType type; + private int subType; + + + public EventRecord( ) + { + super( true ); + } + + + public EventType getType( ) + { + return type; + } + + + public void setType( EventType type ) + { + this.type = type; + } + + + public int getSubType( ) + { + return subType; + } + + + public void setSubType( int subType ) + { + this.subType = subType; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventType.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventType.java new file mode 100644 index 0000000..e8f14f8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventType.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.sqld.msgs; + + +public enum EventType { + QUEUE , + EMPIRE , + FLEETS , + ALLIANCE , + PLANET , + ADMIN , + BUGS +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventTypeRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventTypeRecord.java new file mode 100644 index 0000000..f9f6a45 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/EventTypeRecord.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.sqld.msgs; + + +public class EventTypeRecord +{ + private long id; + private EventType type; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public EventType getType( ) + { + return type; + } + + + public void setType( EventType type ) + { + this.type = type; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventFleet.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventFleet.java new file mode 100644 index 0000000..823ee42 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventFleet.java @@ -0,0 +1,112 @@ +package com.deepclone.lw.sqld.msgs; + + +public class FleetEventFleet +{ + + private long eventId; + private Integer ownerId; + private String ownerName; + private String fleetName; + private long fleetPower; + private Boolean status; + private Integer sourceId; + private String sourceName; + + + public long getEventId( ) + { + return eventId; + } + + + public void setEventId( long eventId ) + { + this.eventId = eventId; + } + + + public Integer getOwnerId( ) + { + return ownerId; + } + + + public void setOwnerId( Integer ownerId ) + { + this.ownerId = ownerId; + } + + + public String getOwnerName( ) + { + return ownerName; + } + + + public void setOwnerName( String ownerName ) + { + this.ownerName = ownerName; + } + + + public String getFleetName( ) + { + return fleetName; + } + + + public void setFleetName( String fleetName ) + { + this.fleetName = fleetName; + } + + + public long getFleetPower( ) + { + return fleetPower; + } + + + public void setFleetPower( long fleetPower ) + { + this.fleetPower = fleetPower; + } + + + public Boolean getStatus( ) + { + return status; + } + + + public void setStatus( Boolean status ) + { + this.status = status; + } + + + public Integer getSourceId( ) + { + return sourceId; + } + + + public void setSourceId( Integer sourceId ) + { + this.sourceId = sourceId; + } + + + public String getSourceName( ) + { + return sourceName; + } + + + public void setSourceName( String sourceName ) + { + this.sourceName = sourceName; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventRecord.java new file mode 100644 index 0000000..1dbf0ab --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FleetEventRecord.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.sqld.msgs; + + +import java.util.LinkedList; +import java.util.List; + + + +public class FleetEventRecord + extends EventRecord +{ + private int locationId; + private String locationName; + private int x; + private int y; + private int orbit; + private final List< FleetEventFleet > fleets = new LinkedList< FleetEventFleet >( ); + + + public int getLocationId( ) + { + return locationId; + } + + + public void setLocationId( int locationId ) + { + this.locationId = locationId; + } + + + public String getLocationName( ) + { + return locationName; + } + + + public void setLocationName( String locationName ) + { + this.locationName = locationName; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public List< FleetEventFleet > getFleets( ) + { + return fleets; + } + + + public void addFleet( FleetEventFleet fleet ) + { + this.fleets.add( fleet ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FormatType.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FormatType.java new file mode 100644 index 0000000..0611500 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/FormatType.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.sqld.msgs; + + +public class FormatType +{ + private final boolean internal; + private final EventType eType; + private final int eSubType; + + + public FormatType( ) + { + this.internal = false; + this.eType = null; + this.eSubType = 0; + } + + + public FormatType( EventType eType , int eSubType ) + { + this.internal = true; + this.eType = eType; + this.eSubType = eSubType; + } + + + public boolean isInternal( ) + { + return internal; + } + + + public EventType getType( ) + { + return eType; + } + + + public int getSubType( ) + { + return eSubType; + } + + + @Override + public int hashCode( ) + { + final int prime = 31; + int result = 1; + result = prime * result + eSubType; + result = prime * result + ( ( eType == null ) ? 0 : eType.hashCode( ) ); + result = prime * result + ( internal ? 1231 : 1237 ); + return result; + } + + + @Override + public boolean equals( Object obj ) + { + if ( this == obj ) + return true; + if ( obj == null ) + return false; + if ( getClass( ) != obj.getClass( ) ) + return false; + FormatType other = (FormatType) obj; + if ( eSubType != other.eSubType ) + return false; + if ( eType == null ) { + if ( other.eType != null ) + return false; + } else if ( !eType.equals( other.eType ) ) + return false; + if ( internal != other.internal ) + return false; + return true; + } + + + @Override + public String toString( ) + { + return "[internal=" + internal + ", eType=" + eType + ", eSubType=" + eSubType + "]"; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/InboxRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/InboxRecord.java new file mode 100644 index 0000000..1356702 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/InboxRecord.java @@ -0,0 +1,157 @@ +package com.deepclone.lw.sqld.msgs; + + +import java.sql.Timestamp; + + + +public class InboxRecord +{ + private long id; + private boolean read; + private boolean internal; + private Timestamp received; + + private String senderType; + private Integer senderId; + private String senderName; + + private String receiverType; + private int receiverId; + private String receiverName; + + private long contentId; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public boolean isRead( ) + { + return read; + } + + + public void setRead( boolean read ) + { + this.read = read; + } + + + public boolean isInternal( ) + { + return internal; + } + + + public void setInternal( boolean internal ) + { + this.internal = internal; + } + + + public Timestamp getReceived( ) + { + return received; + } + + + public void setReceived( Timestamp received ) + { + this.received = received; + } + + + public String getSenderType( ) + { + return senderType; + } + + + public void setSenderType( String senderType ) + { + this.senderType = senderType; + } + + + public Integer getSenderId( ) + { + return senderId; + } + + + public void setSenderId( Integer senderId ) + { + this.senderId = senderId; + } + + + public String getSenderName( ) + { + return senderName; + } + + + public void setSenderName( String senderName ) + { + this.senderName = senderName; + } + + + public String getReceiverType( ) + { + return receiverType; + } + + + public void setReceiverType( String receiverType ) + { + this.receiverType = receiverType; + } + + + public int getReceiverId( ) + { + return receiverId; + } + + + public void setReceiverId( int receiverId ) + { + this.receiverId = receiverId; + } + + + public String getReceiverName( ) + { + return receiverName; + } + + + public void setReceiverName( String receiverName ) + { + this.receiverName = receiverName; + } + + + public long getContentId( ) + { + return contentId; + } + + + public void setContentId( long contentId ) + { + this.contentId = contentId; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/MessageDataRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/MessageDataRecord.java new file mode 100644 index 0000000..ccfd86e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/MessageDataRecord.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.sqld.msgs; + + +import java.sql.Timestamp; + + + +public abstract class MessageDataRecord +{ + private final boolean internal; + private long id; + private Timestamp timestamp; + private long tick; + + + protected MessageDataRecord( boolean internal ) + { + this.internal = internal; + } + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public void setTimestamp( Timestamp timestamp ) + { + this.timestamp = timestamp; + } + + + public long getTick( ) + { + return tick; + } + + + public void setTick( long tick ) + { + this.tick = tick; + } + + + public boolean isInternal( ) + { + return internal; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/NotificationsRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/NotificationsRecord.java new file mode 100644 index 0000000..9471995 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/NotificationsRecord.java @@ -0,0 +1,154 @@ +package com.deepclone.lw.sqld.msgs; + + +public class NotificationsRecord +{ + + private int id; + private String name; + private String language; + private String address; + + private String onPrivate; + private String onAlliance; + private String onInternal; + private String onAdmin; + + private Long lastUnmailed; + private Long lastUnrecaped; + + private boolean canNotify; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public String getOnPrivate( ) + { + return onPrivate; + } + + + public void setOnPrivate( String onPrivate ) + { + this.onPrivate = onPrivate; + } + + + public String getOnAlliance( ) + { + return onAlliance; + } + + + public void setOnAlliance( String onAlliance ) + { + this.onAlliance = onAlliance; + } + + + public String getOnInternal( ) + { + return onInternal; + } + + + public void setOnInternal( String onInternal ) + { + this.onInternal = onInternal; + } + + + public String getOnAdmin( ) + { + return onAdmin; + } + + + public void setOnAdmin( String onAdmin ) + { + this.onAdmin = onAdmin; + } + + + public Long getLastUnmailed( ) + { + return lastUnmailed; + } + + + public void setLastUnmailed( Long lastUnmailed ) + { + this.lastUnmailed = lastUnmailed; + } + + + public Long getLastUnrecaped( ) + { + return lastUnrecaped; + } + + + public void setLastUnrecaped( Long lastUnrecaped ) + { + this.lastUnrecaped = lastUnrecaped; + } + + + public boolean isCanNotify( ) + { + return canNotify; + } + + + public void setCanNotify( boolean canNotify ) + { + this.canNotify = canNotify; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/PlanetEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/PlanetEventRecord.java new file mode 100644 index 0000000..148bd3a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/PlanetEventRecord.java @@ -0,0 +1,112 @@ +package com.deepclone.lw.sqld.msgs; + + +public class PlanetEventRecord + extends EventRecord +{ + private int locationId; + private String locationName; + private int x; + private int y; + private int orbit; + private Integer empireId; + private String empireName; + private Long battleId; + + + public int getLocationId( ) + { + return locationId; + } + + + public void setLocationId( int locationId ) + { + this.locationId = locationId; + } + + + public String getLocationName( ) + { + return locationName; + } + + + public void setLocationName( String locationName ) + { + this.locationName = locationName; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public Integer getEmpireId( ) + { + return empireId; + } + + + public void setEmpireId( Integer empireId ) + { + this.empireId = empireId; + } + + + public String getEmpireName( ) + { + return empireName; + } + + + public void setEmpireName( String empireName ) + { + this.empireName = empireName; + } + + + public Long getBattleId( ) + { + return battleId; + } + + + public void setBattleId( Long battleId ) + { + this.battleId = battleId; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventLocation.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventLocation.java new file mode 100644 index 0000000..54fa287 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventLocation.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.sqld.msgs; + + +public class QueueEventLocation +{ + + private long eventId; + private int locationId; + private String locationName; + private int x; + private int y; + private int orbit; + + + public long getEventId( ) + { + return eventId; + } + + + public void setEventId( long eventId ) + { + this.eventId = eventId; + } + + + public int getLocationId( ) + { + return locationId; + } + + + public void setLocationId( int locationId ) + { + this.locationId = locationId; + } + + + public String getLocationName( ) + { + return locationName; + } + + + public void setLocationName( String locationName ) + { + this.locationName = locationName; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventRecord.java new file mode 100644 index 0000000..d91b407 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/QueueEventRecord.java @@ -0,0 +1,26 @@ +package com.deepclone.lw.sqld.msgs; + + +import java.util.LinkedList; +import java.util.List; + + + +public class QueueEventRecord + extends EventRecord +{ + + private final List< QueueEventLocation > locations = new LinkedList< QueueEventLocation >( ); + + + public List< QueueEventLocation > getLocations( ) + { + return locations; + } + + + public void addLocation( QueueEventLocation eventLocation ) + { + this.locations.add( eventLocation ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/TextMessageRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/TextMessageRecord.java new file mode 100644 index 0000000..a1dc5b8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/msgs/TextMessageRecord.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.sqld.msgs; + + +public class TextMessageRecord + extends MessageDataRecord +{ + + private String subject; + private String text; + + + public TextMessageRecord( ) + { + super( false ); + } + + + public String getSubject( ) + { + return subject; + } + + + public void setSubject( String subject ) + { + this.subject = subject; + } + + + public String getText( ) + { + return text; + } + + + public void setText( String text ) + { + this.text = text; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Constant.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Constant.java new file mode 100644 index 0000000..971b5ef --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Constant.java @@ -0,0 +1,111 @@ +package com.deepclone.lw.sqld.sys; + + +public class Constant +{ + /** The constant's category */ + private String category; + + /** The constant's internal name */ + private String name; + + /** A description of the constant to be used on the administrative interface */ + private String description; + + /** The minimal value of the constant (may be omitted) */ + private Double minValue; + + /** The maximal value of the constant (may be omitted) */ + private Double maxValue; + + /** The constant's current value */ + private double value; + + + public String getCategory( ) + { + return category; + } + + + public void setCategory( String category ) + { + this.category = category; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public Double getMinValue( ) + { + return minValue; + } + + + public void setMinValue( Double minValue ) + { + + this.minValue = minValue; + } + + + public void setMinValue( Float minValue ) + { + + this.minValue = ( minValue == null ? null : minValue.doubleValue( ) ); + } + + + public Double getMaxValue( ) + { + return maxValue; + } + + + public void setMaxValue( Double maxValue ) + { + this.maxValue = maxValue; + } + + + public void setMaxValue( Float maxValue ) + { + + this.maxValue = ( maxValue == null ? null : maxValue.doubleValue( ) ); + } + + + public double getValue( ) + { + return value; + } + + + public void setValue( double value ) + { + this.value = value; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/ExceptionLog.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/ExceptionLog.java new file mode 100644 index 0000000..a55df83 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/ExceptionLog.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.sqld.sys; + + +import java.util.LinkedList; +import java.util.List; + + + +public class ExceptionLog +{ + + private Long id; + + private Integer order; + + private String className; + + private String message; + + private List< StackTraceLog > stack = new LinkedList< StackTraceLog >( ); + + + public ExceptionLog( SystemLogEntry logEntry, String className , String message ) + { + this.className = className; + this.message = message; + logEntry.addException( this ); + } + + + public ExceptionLog( Long id , Integer order , String className , String message ) + { + this.id = id; + this.order = order; + this.className = className; + this.message = message; + } + + + public Long getId( ) + { + return id; + } + + + public Integer getOrder( ) + { + return order; + } + + + public String getClassName( ) + { + return className; + } + + + public String getMessage( ) + { + return message; + } + + + public List< StackTraceLog > getStack( ) + { + return stack; + } + + + public void addStackTrace( StackTraceLog stackTraceLog ) + { + this.stack.add( stackTraceLog ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/StackTraceLog.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/StackTraceLog.java new file mode 100644 index 0000000..743e6eb --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/StackTraceLog.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.sqld.sys; + + +public class StackTraceLog +{ + private Long excId; + + private Integer order; + + private String location; + + private String fileName; + + private Integer line; + + + public StackTraceLog( ExceptionLog eLog , String location , String fileName , Integer line ) + { + this.location = location; + this.fileName = fileName; + this.line = line; + eLog.addStackTrace( this ); + } + + + public StackTraceLog( Long excId , Integer order , String location , String fileName , Integer line ) + { + this.excId = excId; + this.order = order; + this.location = location; + this.fileName = fileName; + this.line = line; + } + + + public Long getExcId( ) + { + return excId; + } + + + public Integer getOrder( ) + { + return order; + } + + + public String getLocation( ) + { + return location; + } + + + public String getFileName( ) + { + return fileName; + } + + + public Integer getLine( ) + { + return line; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Status.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Status.java new file mode 100644 index 0000000..9144503 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/Status.java @@ -0,0 +1,135 @@ +package com.deepclone.lw.sqld.sys; + + +import java.sql.Timestamp; + + + +/** + * Single-entry system status "table". + * + * @author tseeker + */ +public class Status +{ + /** Identifier of the next tick */ + private long nextTickIdentifier; + + /** Identifier of the current tick, if one is running */ + private Long currentTick; + + /** If the game is under maintenance, timestamp at which maintenance was initiated */ + private Timestamp maintenanceStart; + + /** If the game is under maintenance, timestamp at which maintenance is supposed to end */ + private Timestamp maintenanceEnd; + + /** If the game is under maintenance, text to display as the reason for maintenance */ + private String maintenanceReason; + + /** Timestamp at which errors were last checked */ + private Timestamp lastErrorCheck; + + /** Timestamp at which the last administration recap email was sent */ + private Timestamp lastAdminRecap; + + /** Timestamp at which the last messages recap email was sent */ + private Timestamp lastMsgRecap; + + + public Long getNextTickIdentifier( ) + { + return nextTickIdentifier; + } + + + public void setNextTickIdentifier( long nextTickIdentifier ) + { + this.nextTickIdentifier = nextTickIdentifier; + } + + + public Long getCurrentTick( ) + { + return currentTick; + } + + + public void setCurrentTick( Long currentTick ) + { + this.currentTick = currentTick; + } + + + public Timestamp getMaintenanceStart( ) + { + return maintenanceStart; + } + + + public void setMaintenanceStart( Timestamp maintenanceStart ) + { + this.maintenanceStart = maintenanceStart; + } + + + public Timestamp getMaintenanceEnd( ) + { + return maintenanceEnd; + } + + + public void setMaintenanceEnd( Timestamp maintenanceEnd ) + { + this.maintenanceEnd = maintenanceEnd; + } + + + public String getMaintenanceReason( ) + { + return maintenanceReason; + } + + + public void setMaintenanceReason( String maintenanceReason ) + { + this.maintenanceReason = maintenanceReason; + } + + + public Timestamp getLastErrorCheck( ) + { + return lastErrorCheck; + } + + + public void setLastErrorCheck( Timestamp lastErrorCheck ) + { + this.lastErrorCheck = lastErrorCheck; + } + + + public Timestamp getLastAdminRecap( ) + { + return lastAdminRecap; + } + + + public void setLastAdminRecap( Timestamp lastAdminRecap ) + { + this.lastAdminRecap = lastAdminRecap; + } + + + public Timestamp getLastMsgRecap( ) + { + return lastMsgRecap; + } + + + public void setLastMsgRecap( Timestamp lastMsgRecap ) + { + this.lastMsgRecap = lastMsgRecap; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/SystemLogEntry.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/SystemLogEntry.java new file mode 100644 index 0000000..e599093 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/SystemLogEntry.java @@ -0,0 +1,93 @@ +package com.deepclone.lw.sqld.sys; + + +import java.sql.Timestamp; +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.admin.logs.LogLevel; + + + +/** + * This class represents entries in the system log. + * + * @author tseeker + */ +public class SystemLogEntry +{ + + private Long id; + + private Timestamp timestamp; + + private LogLevel level; + + private String component; + + private String message; + + private List< ExceptionLog > exception; + + + public SystemLogEntry( LogLevel level , String component , String message ) + { + this.level = level; + this.component = component; + this.message = message; + this.exception = new LinkedList< ExceptionLog >( ); + } + + + public SystemLogEntry( Long id , Timestamp timestamp , LogLevel level , String component , String message ) + { + this.id = id; + this.timestamp = timestamp; + this.level = level; + this.component = component; + this.message = message; + } + + + public Long getId( ) + { + return id; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public LogLevel getLevel( ) + { + return level; + } + + + public String getComponent( ) + { + return component; + } + + + public String getMessage( ) + { + return message; + } + + + public List< ExceptionLog > getException( ) + { + return exception; + } + + + public void addException( ExceptionLog exceptionLog ) + { + this.exception.add( exceptionLog ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/TickerTaskRecord.java b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/TickerTaskRecord.java new file mode 100644 index 0000000..cce8086 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/java/com/deepclone/lw/sqld/sys/TickerTaskRecord.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.sqld.sys; + + +import java.sql.Timestamp; + + + +public class TickerTaskRecord +{ + + private int id; + private String name; + private String status; + private Timestamp timestamp; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getStatus( ) + { + return status; + } + + + public void setStatus( String status ) + { + this.status = status; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public void setTimestamp( Timestamp timestamp ) + { + this.timestamp = timestamp; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-data/src/main/resources/configuration/transaction-bean.xml b/legacyworlds-server/legacyworlds-server-data/src/main/resources/configuration/transaction-bean.xml new file mode 100644 index 0000000..6cf7b29 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-data/src/main/resources/configuration/transaction-bean.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-interfaces/.classpath b/legacyworlds-server/legacyworlds-server-interfaces/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-interfaces/.project b/legacyworlds-server/legacyworlds-server-interfaces/.project new file mode 100644 index 0000000..25a4794 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-interfaces + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-interfaces/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-interfaces/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..847aea3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:20:04 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-interfaces/pom.xml b/legacyworlds-server/legacyworlds-server-interfaces/pom.xml new file mode 100644 index 0000000..1a0f426 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-interfaces + 5.99.1 + + Legacy Worlds server interfaces + This package contains interfaces for all beans provided by the various server components. + + + + com.deepclone.lw + legacyworlds-server-data + ${project.version} + + + com.deepclone.lw + legacyworlds-server-utils + ${project.version} + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountMailException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountMailException.java new file mode 100644 index 0000000..2bbffee --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountMailException.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.interfaces.acm; + + +public class AccountMailException + extends Exception +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountManagement.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountManagement.java new file mode 100644 index 0000000..0804324 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountManagement.java @@ -0,0 +1,112 @@ +package com.deepclone.lw.interfaces.acm; + + +import java.net.InetAddress; +import java.util.List; +import java.util.Map; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.users.AccountListEntry; +import com.deepclone.lw.cmd.admin.users.AccountSessionEntry; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.AccountViewEntry; +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.cmd.player.account.BanDetailsResponse; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; +import com.deepclone.lw.interfaces.i18n.TranslationException; +import com.deepclone.lw.interfaces.mailer.MailerException; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.sqld.accounts.ValidationResult; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public interface AccountManagement +{ + public void createAccount( EmailAddress address , Password password , String language ) + throws AccountMailException , MailerException , TranslationException; + + + public ValidationResult validateAccount( EmailAddress address , String token , String empire , String planet ); + + + public void reactivateAccount( EmailAddress address ) + throws AccountMailException , MailerException; + + + public void requestPasswordRecovery( EmailAddress address ) + throws AccountMailException , MailerException , PasswordRecoveryException; + + + public void recoverPassword( EmailAddress address , String token , Password password ) + throws AccountMailException , PasswordRecoveryException , PasswordProhibitedException; + + + public AccountSession login( EmailAddress address , String challenge , String sha1Hash , String md5Hash , + InetAddress ipAddress , String clientType , String sessionName ); + + + public void logout( long session , SessionTerminationType reason ); + + + public Account restoreSession( long session ); + + + public Account getAccount( EmailAddress address ); + + + public List< String > getEmpireNames( EmailAddress address ); + + + public AccountData getAccountPage( EmailAddress address ); + + + public void setLanguage( EmailAddress address , String language ); + + + public boolean setPassword( EmailAddress address , String challenge , String sha1Hash , String md5Hash , + Password newPassword ) + throws PasswordProhibitedException; + + + public boolean setAddress( EmailAddress address , String challenge , String sha1Auth , String md5Auth , + EmailAddress nAddress ) + throws AccountMailException , MailerException; + + + public void cancelAddressChange( EmailAddress cAddress ); + + + public AccountData confirmAddressChange( EmailAddress cAddress , String code ); + + + public void resetPreferences( EmailAddress address ); + + + public void setPreferences( EmailAddress address , Map< String , String > values ); + + + public void setQuit( EmailAddress address , String reason ); + + + public void cancelQuit( EmailAddress address ); + + + public void toggleVacation( EmailAddress address ); + + + public List< AccountListEntry > listAccounts( AccountStatus status , boolean online ); + + + public AccountViewEntry getAccountView( int id ); + + + public AccountSessionEntry viewSessions( int id ); + + + public void giveCredits( Administrator admin , int id , int credits ); + + + public BanDetailsResponse getBanDetails( EmailAddress address ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountSession.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountSession.java new file mode 100644 index 0000000..f7bd4ba --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/AccountSession.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.interfaces.acm; + + +import com.deepclone.lw.sqld.accounts.Account; + + + +public class AccountSession +{ + public final Account account; + public final long session; + + + public AccountSession( Account account , long session ) + { + this.account = account; + this.session = session; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/EmailChangeException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/EmailChangeException.java new file mode 100644 index 0000000..3bed615 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/EmailChangeException.java @@ -0,0 +1,17 @@ +package com.deepclone.lw.interfaces.acm; + + +public class EmailChangeException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + public final boolean statusProblem; + + + public EmailChangeException( boolean statusProblem ) + { + this.statusProblem = statusProblem; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/JoinGameException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/JoinGameException.java new file mode 100644 index 0000000..c410c8b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/JoinGameException.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.interfaces.acm; + + +import com.deepclone.lw.interfaces.naming.EmpireNameException; +import com.deepclone.lw.interfaces.naming.MapNameException; + + + +public class JoinGameException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + public final boolean validated; + public final EmpireNameException.Error empireNameError; + public final MapNameException.Error mapNameError; + + + public JoinGameException( boolean validated , EmpireNameException.Error empireNameError , + MapNameException.Error mapNameError ) + { + this.validated = validated; + this.empireNameError = empireNameError; + this.mapNameError = mapNameError; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordProhibitedException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordProhibitedException.java new file mode 100644 index 0000000..0b8fc8e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordProhibitedException.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.interfaces.acm; + + +public class PasswordProhibitedException + extends Exception +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordRecoveryException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordRecoveryException.java new file mode 100644 index 0000000..63c96ee --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PasswordRecoveryException.java @@ -0,0 +1,17 @@ +package com.deepclone.lw.interfaces.acm; + + +public class PasswordRecoveryException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + public final boolean statusProblem; + + + public PasswordRecoveryException( boolean statusProblem ) + { + this.statusProblem = statusProblem; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PermanentlyDisabledException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PermanentlyDisabledException.java new file mode 100644 index 0000000..09ab753 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/PermanentlyDisabledException.java @@ -0,0 +1,9 @@ +package com.deepclone.lw.interfaces.acm; + +public class PermanentlyDisabledException + extends Exception +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UserSessionDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UserSessionDAO.java new file mode 100644 index 0000000..793e78e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UserSessionDAO.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.interfaces.acm; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.cmd.admin.users.UserSession; + + + +public interface UserSessionDAO +{ + + public long startSession( int id , String sName , String client , String address ); + + + public void endSession( long session , SessionTerminationType termination ); + + + public UserSession getSession( long id ); + + + public boolean isOnline( int id ); + + + public List< UserSession > getSessions( int id ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UsersDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UsersDAO.java new file mode 100644 index 0000000..93c8343 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/acm/UsersDAO.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.interfaces.acm; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.users.AccountListEntry; +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.AccountViewEntry; +import com.deepclone.lw.cmd.player.gdata.account.MailChangeData; +import com.deepclone.lw.sqld.accounts.Account; +import com.deepclone.lw.sqld.accounts.AccountOperationResult; +import com.deepclone.lw.sqld.accounts.QuittingAccount; +import com.deepclone.lw.sqld.accounts.ValidationResult; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public interface UsersDAO +{ + + public Account getAccount( EmailAddress address ); + + + public Account getAccount( int id ); + + + public AccountOperationResult createAccount( EmailAddress address , Password password , String language ); + + + public Account reactivateAccount( EmailAddress address ); + + + public void cancelAccountValidation( Account account ); + + + public ValidationResult validateAccount( EmailAddress address , String token , String eName , String pName ); + + + public AccountOperationResult requestPasswordRecovery( EmailAddress address ); + + + public void cancelPasswordRecovery( Account account ); + + + public AccountOperationResult confirmPasswordRecovery( EmailAddress address , String token , Password nPassword ); + + + public MailChangeData getMailChange( int accountId ); + + + public void setLanguage( EmailAddress address , String language ); + + + public boolean setPassword( Account account , Password newPassword ); + + + public int setAddress( Account account , EmailAddress nAddress ); + + + public void cancelAddressChange( Account account ); + + + public int confirmAddressChange( Account account , String code ); + + + public void expireRequests( ); + + + public void setQuit( Account account , String reason ); + + + public void cancelQuit( Account account ); + + + public List< QuittingAccount > processQuits( ); + + + public void enterVacation( Account account ); + + + public void leaveVacation( Account account ); + + + public void processVacations( ); + + + public List< AccountListEntry > listAccounts( AccountStatus status ); + + + public List< AccountListEntry > listOnlineAccounts( AccountStatus status ); + + + public AccountViewEntry viewAccount( int id ); + + + public void giveCredits( int adminId , int accountId , int credits ); + + + public void deleteOldAccounts( ); + + + public List< QuittingAccount > getInactivesToWarn( ); + + + public List< QuittingAccount > getInactivesToDisable( ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAO.java new file mode 100644 index 0000000..0e4383a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAO.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.interfaces.admin; + + +import java.net.InetAddress; +import java.sql.Timestamp; +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.AdminOverview; +import com.deepclone.lw.sqld.admin.AdminConnection; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.utils.EmailAddress; + + + +public interface AdminDAO +{ + + public AdminRecord getAdmin( int id ); + + + public AdminRecord getAdmin( EmailAddress address ); + + + public AdminRecord getAdmin( String name ); + + + public int createAdmin( String address , String name , int privileges ) + throws AdminDAOException; + + + public void logConnectionAttempt( int id , AdminConnection status , InetAddress address ); + + + public void logDisconnection( int id ); + + + public boolean setPassword( int id , String sha1 , String md5 ); + + + public List< AdminRecord > listAdministrators( ); + + + public boolean resetPassword( int identifier , int superuser ); + + + public boolean setPrivileges( int identifier , int superuser , int privileges ); + + + public AdminOverview getOverview( int id ); + + + public List< AdminOverview > getOverviews( ); + + + public Timestamp isRecapTime( ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAOException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAOException.java new file mode 100644 index 0000000..916430b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/AdminDAOException.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.interfaces.admin; + + +public class AdminDAOException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + private final int errorCode; + + + public AdminDAOException( int errorCode ) + { + this.errorCode = errorCode; + } + + + public int getErrorCode( ) + { + return errorCode; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/Administration.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/Administration.java new file mode 100644 index 0000000..950e3b2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/Administration.java @@ -0,0 +1,71 @@ +package com.deepclone.lw.interfaces.admin; + + +import java.net.InetAddress; +import java.util.List; +import java.util.Set; + +import com.deepclone.lw.cmd.admin.AdminOverviewResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.BanType; +import com.deepclone.lw.cmd.admin.bans.BansSummaryResponse; +import com.deepclone.lw.cmd.admin.bans.ListBansResponse; +import com.deepclone.lw.cmd.admin.bans.RequestBanResponse; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse; +import com.deepclone.lw.interfaces.acm.PasswordProhibitedException; +import com.deepclone.lw.sqld.admin.AdminRecord; +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; + + + +public interface Administration +{ + + public AdminRecord getAdmin( int id ); + + + public AdminRecord login( EmailAddress address , String challenge , String sha1Hash , String md5Hash , + InetAddress ipAddress ); + + + public void logout( int adminId ); + + + public boolean setPassword( int id , String challenge , String sha1Auth , String md5Auth , Password password ) + throws PasswordProhibitedException; + + + public List< AdminRecord > listAdministrators( ); + + + public AddAdministratorResponse createAdmin( Administrator creator , String address , String name , int privileges ); + + + public AdminRecord resetPassword( Administrator admin , int identifier ); + + + public AdminRecord setPrivileges( Administrator admin , int identifier , Set< Privileges > privileges ); + + + public BansSummaryResponse getBansSummary( Administrator admin ); + + + public ListBansResponse getBans( Administrator admin , BanType type ); + + + public RequestBanResponse requestBan( Administrator admin , String user , boolean empire , String reason ); + + + public void rejectBan( Administrator admin , int id , String reason ); + + + public void confirmBan( Administrator admin , int id ); + + + public void liftBan( Administrator admin , int id ); + + + public AdminOverviewResponse getOverview( Administrator admin ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BanMailData.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BanMailData.java new file mode 100644 index 0000000..480c452 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BanMailData.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.interfaces.admin; + + +public class BanMailData +{ + + public final String address; + public final String language; + public final String reason; + + + public BanMailData( String address , String language , String reason ) + { + this.address = address; + this.language = language; + this.reason = reason; + } + + + public BanMailData( String address , String language ) + { + this.address = address; + this.language = language; + this.reason = null; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BansDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BansDAO.java new file mode 100644 index 0000000..7e0872f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/BansDAO.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.interfaces.admin; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.bans.BanRequest; +import com.deepclone.lw.cmd.admin.bans.SummaryEntry; +import com.deepclone.lw.cmd.admin.bans.ValidatedBanRequest; +import com.deepclone.lw.utils.EmailAddress; + + + +public interface BansDAO +{ + + public List< SummaryEntry > getSummary( ); + + + public List< BanRequest > getPending( ); + + + public List< BanRequest > getArchived( ); + + + public List< BanRequest > getActive( ); + + + public int requestBan( int administrator , EmailAddress address , String reason ); + + + public int requestBan( int administrator , String empire , String reason ); + + + public void rejectBan( int administrator , int requestId , String reason ); + + + public BanMailData validateBan( int administrator , int requestId ); + + + public BanMailData liftBan( int administrator , int requestId ); + + + public void expireBanRequests( ); + + + public void expireWarnings( ); + + + public boolean finaliseBan( ); + + + public ValidatedBanRequest getActiveBan( EmailAddress address ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/IpBan.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/IpBan.java new file mode 100644 index 0000000..da7af78 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/admin/IpBan.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.interfaces.admin; + + +import java.net.InetAddress; + + + +/** + * This interface is used to check if an IP address is banned. + * + * @author tseeker + */ +public interface IpBan +{ + + /** + * Checks if the InetAddress provided is banned. + * + * @param address + * the IP Address to be checked + * @return a boolean saying whether or not the address is banned. + */ + public boolean isBanned( InetAddress address ); + + + /** + * Increases the ban counter associated with the given address. + * + * @param address + * the IP Address to be added to the counter. + */ + public void increaseBanCounter( InetAddress address ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/AdminBugs.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/AdminBugs.java new file mode 100644 index 0000000..1de3949 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/AdminBugs.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.interfaces.bt; + + +import com.deepclone.lw.cmd.bt.data.*; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.bt.*; + + + +public interface AdminBugs +{ + + public BugsSummaryResponse getSummary( Administrator admin ); + + + public ListBugsResponse getBugs( Administrator admin , BugStatus status , boolean ownOnly , long first , int count ); + + + public ReportBugResponse postReport( Administrator admin , String title , String contents , boolean publicReport ); + + + ViewBugResponse getReport( Administrator admin , long bugId ); + + + public PostCommentResponse postComment( Administrator admin , long bugId , String comment , boolean publicComment ); + + + public void moderateComment( Administrator admin , long commentId , boolean validation ); + + + public void validateReport( Administrator admin , long bugId , BugStatus status , boolean publicReport , int credits, boolean snapshot ); + + + public void setStatus( Administrator admin , long bugId , BugStatus status ); + + + public void toggleVisibility( Administrator admin , long bugId ); + + + public MergeReportsResponse mergeReports( Administrator admin , long id , long mergeId ); + + + public GetSnapshotResponse getSnapshot( Administrator admin , long bugId ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/BugsDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/BugsDAO.java new file mode 100644 index 0000000..9e28012 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/BugsDAO.java @@ -0,0 +1,71 @@ +package com.deepclone.lw.interfaces.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.*; + + + +public interface BugsDAO +{ + + public long countReports( int empireId , BugStatus status , boolean ownOnly ); + + + public long countReports( Administrator admin , BugStatus status , boolean ownOnly ); + + + public long countUpdatedReports( Administrator admin ); + + + public List< BugReport > getReports( int empireId , BugStatus status , boolean ownOnly , long first , int count ); + + + public List< BugReport > getReports( Administrator admin , BugStatus status , boolean ownOnly , long first , + int count ); + + + public BugReport getReport( int empireId , long reportId ); + + + public BugReport getReport( Administrator admin , long reportId ); + + + public long postReport( int empireId , String title , String contents , String extra ); + + + public long postReport( Administrator admin , String title , String contents , boolean publicReport ); + + + public void postComment( int empireId , long reportId , String comment ); + + + public void postComment( Administrator admin , long reportId , String comment , boolean publicComment ); + + + public List< BugEvent > getEvents( long bugId ); + + + public void showComment( Administrator admin , long commentId ); + + + public void deleteComment( Administrator admin , long commentId ); + + + public void validateReport( Administrator admin , long bugId , BugStatus status , boolean publicReport , int credits, boolean snapshot ); + + + public void setStatus( Administrator admin , long bugId , BugStatus status ); + + + public void toggleVisibility( Administrator admin , long bugId ); + + + public int mergeReports( Administrator admin , long id , long mergeId ); + + + public String getSnapshot( long bugId ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/EmpireSummary.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/EmpireSummary.java new file mode 100644 index 0000000..bd09629 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/EmpireSummary.java @@ -0,0 +1,9 @@ +package com.deepclone.lw.interfaces.bt; + + +public interface EmpireSummary +{ + + public String getSummary( int empireId ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/PlayerBugs.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/PlayerBugs.java new file mode 100644 index 0000000..a798880 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/bt/PlayerBugs.java @@ -0,0 +1,23 @@ +package com.deepclone.lw.interfaces.bt; + + +import com.deepclone.lw.cmd.bt.data.*; +import com.deepclone.lw.cmd.player.bt.*; + + + +public interface PlayerBugs +{ + + public ListBugsResponse getBugs( int empireId , BugStatus status , boolean ownOnly , long first , int count ); + + + public ReportBugResponse postReport( int empireId , String title , String desc ); + + + ViewBugResponse getReport( int empireId , long bugId ); + + + public PostCommentResponse postComment( int empireId , long reportId , String comment ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/ExtendedLogEntry.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/ExtendedLogEntry.java new file mode 100644 index 0000000..f868a27 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/ExtendedLogEntry.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.interfaces.eventlog; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.logs.ExceptionEntry; +import com.deepclone.lw.cmd.admin.logs.LogEntry; + + + +public class ExtendedLogEntry +{ + + public final LogEntry logEntry; + public final List< ExceptionEntry > exceptions; + + + public ExtendedLogEntry( LogEntry logEntry , List< ExceptionEntry > exceptions ) + { + this.logEntry = logEntry; + this.exceptions = exceptions; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogReader.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogReader.java new file mode 100644 index 0000000..4ce8e6f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogReader.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.interfaces.eventlog; + + +import java.sql.Timestamp; +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.logs.GetEntryResponse; +import com.deepclone.lw.cmd.admin.logs.LogEntry; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.logs.LogType; +import com.deepclone.lw.cmd.admin.logs.ViewLogResponse; + + + +public interface LogReader +{ + + public ViewLogResponse getLog( Administrator admin , LogType type , long first , int count , LogLevel minLevel , + String component , boolean excOnly ); + + + public GetEntryResponse getEntry( Administrator admin , long id ); + + + public List< ExtendedLogEntry > getErrorEntries( ); + + + public List< LogEntry > getAdminLogSince( Timestamp timestamp ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogWriter.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogWriter.java new file mode 100644 index 0000000..49fe2f1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/LogWriter.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.interfaces.eventlog; + + +import java.util.List; + +import com.deepclone.lw.sqld.sys.SystemLogEntry; + + + +/** + * This interface is used by the server's log writer bean. It implements an asynchronous log writer + * that uses the database to store log entries. + * + * @author tseeker + */ +public interface LogWriter +{ + + /** + * Adds a list of log entries to the queue of messages to write. + * + * @param entries + * the entries to write + */ + public void addEntries( List< SystemLogEntry > entries ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/Logger.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/Logger.java new file mode 100644 index 0000000..ee98a90 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/Logger.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.interfaces.eventlog; + + +/** + * This interface is used by the server's in-base logger. + * + * @author tseeker + */ +public interface Logger +{ + + /** + * Creates a logger for system actions, using the specified string as the component's name. + * + * @param component + * the name of the component producing log entries + * @return a {@link SystemLogger} for the specified component + */ + public SystemLogger getSystemLogger( String component ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/SystemLogger.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/SystemLogger.java new file mode 100644 index 0000000..fdfe44c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/eventlog/SystemLogger.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.interfaces.eventlog; + + +import com.deepclone.lw.cmd.admin.logs.LogLevel; + + + +/** + * A SystemLogger is capable of writing basic, system-related entries to the database. + * + * @author tseeker + */ +public interface SystemLogger +{ + + /** + * Writes a log entry. + * + * @param level + * the entry's log level + * @param message + * the text of the log entry + * @return the logger + */ + public SystemLogger log( LogLevel level , String message ); + + + /** + * Writes a log entry and an associated exception + * + * @param level + * the entry's log level + * @param message + * the text of the log entry + * @param exception + * the exception to associate to the log entry + * @return the logger + */ + public SystemLogger log( LogLevel level , String message , Throwable exception ); + + + /** + * Flushes a logger's entries to the main logger bean. + * + * @return the logger + */ + public SystemLogger flush( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceDAO.java new file mode 100644 index 0000000..2a48bf0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceDAO.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceLeaderData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceMemberData; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; +import com.deepclone.lw.sqld.game.AllianceMembership; + + + +public interface AllianceDAO +{ + + public AllianceMembership getAlliance( int empireId ); + + + public Integer findAlliance( String tag ); + + + public Integer createAlliance( int empireId , String tag , String name ); + + + public PublicAllianceInformation getPublicInformation( int allianceId ); + + + public AllianceMemberData getMemberData( int allianceId ); + + + public AllianceLeaderData getLeaderData( int allianceId ); + + + public boolean requestJoin( int empireId , int allianceId ); + + + public void cancelJoin( int empireId ); + + + public void leave( int empireId ); + + + public void transferLeadership( int empireId , int toMember ); + + + public void manageRequests( int empireId , boolean accept , int[] members ); + + + public void kick( int empireId , int[] members ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceManagement.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceManagement.java new file mode 100644 index 0000000..e4841cf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/AllianceManagement.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.alliances.AllianceStatusResponse; + + + +public interface AllianceManagement +{ + + public AllianceStatusResponse getView( int empireId ); + + + public AllianceStatusResponse getInformation( int empireId , String tag ); + + + public AllianceStatusResponse create( int empireId , String tag , String name ); + + + public AllianceStatusResponse requestJoin( int empireId , String tag ); + + + public AllianceStatusResponse cancelJoin( int empireId ); + + + public AllianceStatusResponse leave( int empireId ); + + + public AllianceStatusResponse transferLeadership( int empireId , int toMember ); + + + public AllianceStatusResponse manageRequests( int empireId , boolean accept , int[] members ); + + + public AllianceStatusResponse kick( int empireId , int[] members ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattleViewer.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattleViewer.java new file mode 100644 index 0000000..13e89d6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattleViewer.java @@ -0,0 +1,19 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.battles.GetBattleResponse; +import com.deepclone.lw.cmd.player.battles.ListBattlesResponse; + + + +public interface BattleViewer +{ + public GetBattleResponse getBattle( int empireId , long battleId ); + + + public GetBattleResponse getBattle( int empireId , long battleId , long tick ); + + + public ListBattlesResponse getBattles( int empireId , int page ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesCache.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesCache.java new file mode 100644 index 0000000..a7144ff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesCache.java @@ -0,0 +1,8 @@ +package com.deepclone.lw.interfaces.game; + + +public interface BattlesCache + extends BattlesDAO +{ + // EMPTY +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesDAO.java new file mode 100644 index 0000000..c45522b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/BattlesDAO.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.List; +import java.util.Map; + +import com.deepclone.lw.sqld.game.battle.*; + + + +public interface BattlesDAO +{ + + public EmpireBattleRecord getBattleRecord( int empireId , long battleId ); + + + public List< PresenceRecord > getPresence( EmpireBattleRecord record ); + + + public List< EventRecord > getEvents( EmpireBattleRecord record ); + + + public Map< Boolean , Map< Long , List< EventItemRecord >>> getEventItems( EmpireBattleRecord record ); + + + public Map< Long , Map< Long , ProtagonistRecord >> getProtagonists( EmpireBattleRecord record ); + + + public Map< Long , List< BuildingHistoryRecord >> getBuildingsHistory( EmpireBattleRecord record ); + + + public Map< Long , Map< Long , List< ShipHistoryRecord >>> getShipsHistory( EmpireBattleRecord record ); + + + List< BattleListRecord > getBattles( int empireId ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireDAO.java new file mode 100644 index 0000000..59342d4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireDAO.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetListData; +import com.deepclone.lw.cmd.player.gdata.empire.OverviewData; +import com.deepclone.lw.sqld.game.EmpireTechLine; +import com.deepclone.lw.sqld.game.GeneralInformation; + + + +public interface EmpireDAO +{ + + public GeneralInformation getInformation( int empireId ); + + + public List< NameIdPair > getPlanets( int empireId ); + + + public OverviewData getOverview( int empireId ); + + + public List< EmpireTechLine > getTechnology( int empireId ); + + + public void implementTechnology( int empireId , int lineId ); + + + public List< PlanetListData > getPlanetList( int empireId ); + + + public List< NameIdPair > getEnemies( int empireId , boolean alliances ); + + + public ObjectNameError addEnemy( int empireId , boolean alliance , String name ); + + + public void removeEnemies( int empireId , boolean alliance , int[] ids ); + + + public int getNewPlanet( int empireId , String name ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireManagement.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireManagement.java new file mode 100644 index 0000000..eb92be9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/EmpireManagement.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.GetNewPlanetResponse; +import com.deepclone.lw.cmd.player.ListPlanetsResponse; +import com.deepclone.lw.cmd.player.EmpireResponse; +import com.deepclone.lw.cmd.player.elist.EnemyListResponse; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.utils.EmailAddress; + + + +public interface EmpireManagement +{ + + public Integer getEmpireId( EmailAddress address ); + + + public GamePageData getGeneralInformation( int empireId ); + + + public EmpireResponse getOverview( int empireId ); + + + public EmpireResponse implementTechnology( int empireId , int techId ); + + + public ListPlanetsResponse getPlanetList( int empireId ); + + + public EnemyListResponse getEnemyLists( int empireId ); + + + public EnemyListResponse addEnemy( int empireId , boolean alliance , String name ); + + + public EnemyListResponse removeEnemies( int empireId , boolean alliance , int[] ids ); + + + public GetNewPlanetResponse getNewPlanet( int empireId , String name ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetManagement.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetManagement.java new file mode 100644 index 0000000..58bd19d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetManagement.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.Map; + +import com.deepclone.lw.cmd.player.fleets.MultiFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.SplitFleetResponse; +import com.deepclone.lw.cmd.player.fleets.ViewFleetsResponse; + + + +public interface FleetManagement +{ + + public ViewFleetsResponse getFleets( int empireId ); + + + public MultiFleetsResponse move( int empireId , long[] fleets , String destination , boolean attack ); + + + public MultiFleetsResponse setMode( int empireId , long[] fleets , boolean attack , boolean doIt ); + + + public MultiFleetsResponse rename( int empireId , long[] fleets , String name ); + + + public MultiFleetsResponse merge( int empireId , long[] fleets ); + + + public SplitFleetResponse split( int empireId , long fleetId , Map< Integer , Integer > ships , int nFleets , + String name , boolean simulate ); + + + public MultiFleetsResponse disband( int empireId , long[] fleets , boolean doIt ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetsDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetsDAO.java new file mode 100644 index 0000000..bf150b0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/FleetsDAO.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.fleets.FleetsView; +import com.deepclone.lw.cmd.player.gdata.fleets.ShortFleetView; +import com.deepclone.lw.cmd.player.gdata.fleets.SplitShips; + + + +public interface FleetsDAO +{ + + public FleetsView getFleets( int empireId ); + + + public List< ShortFleetView > getShortFleets( int empireId , long[] fleets , boolean needsAvailable ); + + + public ShortFleetView getShortFleet( int empireId , long fleetId ); + + + public boolean move( int empireId , long[] fleets , String destination ); + + + public void setMode( int empireId , long[] fleets , boolean attack ); + + + public void rename( int empireId , long[] fleets , String name ); + + + public void merge( int empireId , long[] fleets ); + + + public void disband( int empireId , long[] fleets ); + + + public List< SplitShips > getShips( int empireId , long fleetId ); + + + public boolean initSplit( long fleetId , int nFleets , String name ); + + + public void setSplitShips( int shipType , int amount ); + + + public boolean executeSplit( boolean simulate ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewParameters.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewParameters.java new file mode 100644 index 0000000..3f32b91 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewParameters.java @@ -0,0 +1,23 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.gdata.MapSize; + + + +public class MapViewParameters +{ + + public final int x; + public final int y; + public final MapSize size; + + + public MapViewParameters( int x , int y , MapSize size ) + { + this.x = x; + this.y = y; + this.size = size; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewer.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewer.java new file mode 100644 index 0000000..282fb95 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/MapViewer.java @@ -0,0 +1,17 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.gdata.map.MapSystemData; +import com.deepclone.lw.utils.EmailAddress; + + + +public interface MapViewer +{ + + public MapViewParameters getDefaults( EmailAddress address ); + + + public MapSystemData[][] getMapView( int empireId , MapViewParameters parameters ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetDAO.java new file mode 100644 index 0000000..b5f1d88 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetDAO.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.planets.BuildableBuildingData; +import com.deepclone.lw.cmd.player.gdata.planets.BuildableShipData; +import com.deepclone.lw.cmd.player.gdata.planets.BuildingData; +import com.deepclone.lw.cmd.player.gdata.planets.QueueData; +import com.deepclone.lw.sqld.game.PlanetData; + + + +public interface PlanetDAO +{ + + public PlanetData.Basic getBasicInformation( int empireId , int planetId ); + + + public PlanetData.Orbital getOrbitalInformation( int empireId , int planetId ); + + + public PlanetData.Owner getOwnerInformation( int empireId , int planetId ); + + + public List< BuildingData > getBuildings( int empireId , int planetId , boolean isOwner ); + + + public QueueData getConstructionQueue( int planetId ); + + + public QueueData getMilitaryQueue( int planetId ); + + + public List< BuildableBuildingData > getAvailableBuildings( int planetId ); + + + public List< BuildableShipData > getAvailableShips( int planetId ); + + + public void flushQueue( int planetId , boolean military ); + + + public void addToMilitaryQueue( int planetId , int sType , int amount ); + + + public void constructBuildings( int planetId , int bType , int amount ); + + + public boolean destroyBuildings( int planetId , int bType , int amount ); + + + public Integer abandon( int planetId ); + + + public void cancelAbandon( int planetId ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetsManagement.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetsManagement.java new file mode 100644 index 0000000..d207a66 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/PlanetsManagement.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.interfaces.game; + + +import com.deepclone.lw.cmd.player.planets.ViewPlanetResponse; + + + +public interface PlanetsManagement +{ + + public ViewPlanetResponse viewPlanet( int empireId , int planetId ); + + + public ViewPlanetResponse renamePlanet( int empireId , int planetId , String name ); + + + public ViewPlanetResponse flushQueue( int empireId , int planetId , boolean military ); + + + public ViewPlanetResponse addToMilitaryQueue( int empireId , int planetId , int sType , int amount ); + + + public ViewPlanetResponse addToCivilianQueue( int empireId , int planetId , int bType , boolean destroy , int amount ); + + + public ViewPlanetResponse abandon( int empireId , int planetId ); + + + public ViewPlanetResponse cancelAbandon( int empireId , int planetId ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UniverseDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UniverseDAO.java new file mode 100644 index 0000000..70af7e5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UniverseDAO.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.interfaces.game; + + +import java.util.List; + +import com.deepclone.lw.sqld.game.MapData; + + + +public interface UniverseDAO +{ + + public void generate( ); + + + public List< MapData > getMap( int empireId , int minX , int minY , int maxX , int maxY ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UpdatesDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UpdatesDAO.java new file mode 100644 index 0000000..86736b4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/game/UpdatesDAO.java @@ -0,0 +1,7 @@ +package com.deepclone.lw.interfaces.game; + + +public interface UpdatesDAO +{ + public boolean processUpdates( long tickId ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateLanguageException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateLanguageException.java new file mode 100644 index 0000000..ad65f8d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateLanguageException.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * This exception is thrown by the administration session object if the creation of a language is + * requested using an identifier that is already present in the database. + * + * @author tseeker + */ +public class DuplicateLanguageException + extends I18NException +{ + + private static final long serialVersionUID = 1L; + + + public DuplicateLanguageException( String message ) + { + super( message ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateStringException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateStringException.java new file mode 100644 index 0000000..e113498 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/DuplicateStringException.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * This exception is thrown by the administration session object when the creation of a string is + * requested and the new string's identifier is already in use. + * + * @author tseeker + */ +public class DuplicateStringException + extends I18NException +{ + + private static final long serialVersionUID = 1L; + + + public DuplicateStringException( String message ) + { + super( message ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NAdministration.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NAdministration.java new file mode 100644 index 0000000..e5be52a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NAdministration.java @@ -0,0 +1,143 @@ +package com.deepclone.lw.interfaces.i18n; + + +import java.util.Map; +import java.util.Set; + + + +/** + * Translations database administration session + * + * This interface defines the various methods allowing an administrator to make changes to the + * translations database. + * + * @author tseeker + */ +public interface I18NAdministration +{ + + /** + * @return the set of all languages identifiers, including languages that are not 100% supported + */ + public Set< String > getLanguages( ); + + + /** + * Obtains the name of a language + * + * @param language + * the language's identifier + * @return the language's name + * @throws UnknownLanguageException + * if the language does not exist + */ + public String getLanguageName( String language ) + throws UnknownLanguageException; + + + /** + * Returns the ratio of translated strings in a language relative to the total amount of string + * definitions. + * + * @param language + * the language's identifier + * @return the language's support ratio + * @throws UnknownLanguageException + * if the language does not exist + */ + public double getLanguageSupport( String language ) + throws UnknownLanguageException; + + + /** + * Adds a new, totally unsupported language. + * + * @param language + * the new language's identifier + * @param name + * the name of the new language + * @throws DuplicateLanguageException + * if the language identifier is already in use + */ + public void createLanguage( String language , String name ) + throws DuplicateLanguageException; + + + /** + * Updates a language's name + * + * @param language + * the language's identifier + * @param name + * the new name of the language + * @throws UnknownLanguageException + * if the language does not exist + */ + public void setLanguageName( String language , String name ) + throws UnknownLanguageException; + + + /** + * @return the set of all string identifiers + */ + public Set< String > getStrings( ); + + + /** + * Accesses a string's translation. + * + * @param language + * the language identifier + * @param string + * the string identifier + * @return the translation for the specified string in the specified language, or null if the + * string has not been translated in this language + * @throws UnknownStringException + * if the string identifier is invalid + * @throws UnknownLanguageException + * if the language does not exist + */ + public String getTranslation( String language , String string ) + throws UnknownStringException , UnknownLanguageException; + + + /** + * Modifies or creates a string's translation in a given language + * + * @param language + * the language identifier + * @param string + * the string identifier + * @param translation + * the new translated string + * @return true if the string was created, false if it was updated + * @throws UnknownStringException + * if the string identifier is invalid + * @throws UnknownLanguageException + * if the language does not exist + */ + public boolean updateTranslation( String language , String string , String translation ) + throws UnknownStringException , UnknownLanguageException; + + + /** + * Creates a new string and adds some of its translations. For this method to work as expected, + * no 100% supported language must become unsupported. + * + * @param string + * the new string's identifier + * @param translations + * a map whose keys are language identifiers and whose values are translations. + * @throws DuplicateStringException + * if the new string's identifier already exists + * @throws UnknownLanguageException + * if one of the languages does not exist + * @throws InvalidUpdateException + * if the creation of the string would cause one or more of the currently supported + * languages to become unsupported + */ + public void createString( String string , Map< String , String > translations ) + throws DuplicateStringException , UnknownLanguageException , InvalidUpdateException; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NException.java new file mode 100644 index 0000000..95cbb02 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NException.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * Base class for all I18N-related exception, including both translation exceptions and + * administration exceptions. + * + * @author tseeker + */ +public abstract class I18NException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + + public I18NException( String message ) + { + super( message ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NManager.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NManager.java new file mode 100644 index 0000000..3895022 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/I18NManager.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.interfaces.i18n; + + + + +/** + * The I18NManager interface is used to access the main I18N management bean. + * + * @author tseeker + */ +public interface I18NManager +{ + + /** + * Creates an administration session for an administrator. + * + * @param administrator + * the administrator editing the I18N database + * @return the administration session instance + */ + public I18NAdministration getAdminSession( int administrator ); + + + /** + * Reloads all translations from the database. This should only be used if manual modifications + * are made to the DB for some reason. + */ + public void reload( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/InvalidUpdateException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/InvalidUpdateException.java new file mode 100644 index 0000000..9f00be1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/InvalidUpdateException.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.interfaces.i18n; + + +import java.util.HashSet; +import java.util.Set; + + + +/** + * This exception is thrown by administration session objects when the creation of a new string + * would make previously supported languages unsupported. + * + * @author tseeker + */ +public class InvalidUpdateException + extends I18NException +{ + + private static final long serialVersionUID = 1L; + private Set< String > downgradedLanguages; + + + public InvalidUpdateException( Set< String > languages ) + { + super( "would downgrade the following languages: " + languages.toString( ) ); + this.downgradedLanguages = new HashSet< String >( languages ); + } + + + /** + * @return the set of identifiers for languages that would have become unsupported + */ + public Set< String > getDowngradedLanguages( ) + { + return new HashSet< String >( this.downgradedLanguages ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/TranslationException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/TranslationException.java new file mode 100644 index 0000000..41b991f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/TranslationException.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * Base class for exceptions that can be thrown by both the administration interface and the + * translator bean. + * + * @author tseeker + */ +public abstract class TranslationException + extends I18NException +{ + + private static final long serialVersionUID = 1L; + + + public TranslationException( String message ) + { + super( message ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/Translator.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/Translator.java new file mode 100644 index 0000000..9c5eb39 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/Translator.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.interfaces.i18n; + + +import java.util.Set; + + + +/** + * Translator service interface + * + * This interface defines the methods available on the Translator service. One such service should + * be present on all nodes. All Translator service instances are managed by the I18NManager service, + * which is shared between nodes and notifies Translator instances of database updates. + * + * @author tseeker + * + */ +public interface Translator +{ + + /** + * @return the list of supported languages + */ + public Set< String > getSupportedLanguages( ); + + + /** + * Checks if a language is supported. + * + * @param language + * the identifier of the language + * @return true if the language is present and fully supported, false otherwise. + */ + public boolean isLanguageSupported( String language ); + + + /** + * Returns the plain text name of a language from its identifier. + * + * @param language + * the identifier of the language + * @return the name of the language + * @throws UnknownLanguageException + * if the specified language does not exist + */ + public String getLanguageName( String language ) + throws UnknownLanguageException;; + + + /** + * Translates a string specified using its identifier. + * + * @param language + * the identifier of the language to translate to + * @param string + * the identifier of the string to translate + * @return the string's translation + * @throws UnknownStringException + * if the string is unknown + * @throws UnknownLanguageException + * if the language does not exist or is not supported + */ + public String translate( String language , String string ) + throws UnknownStringException , UnknownLanguageException; +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownLanguageException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownLanguageException.java new file mode 100644 index 0000000..8deca86 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownLanguageException.java @@ -0,0 +1,29 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * This exception is thrown when a language does not exist in the database or, in the case of the + * translator bean, if the language isn't fully supported. + * + * @author tseeker + */ +public final class UnknownLanguageException + extends TranslationException +{ + private static final long serialVersionUID = 1L; + + private String language; + + + public UnknownLanguageException( String language ) + { + super( "the requested language '" + language + "' could not be found" ); + this.language = language; + } + + + public String getLanguage( ) + { + return this.language; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownStringException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownStringException.java new file mode 100644 index 0000000..e382634 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/i18n/UnknownStringException.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.interfaces.i18n; + + +/** + * This exception is thrown when a string identifier does not exist in the database. + * + * @author tseeker + */ +public final class UnknownStringException + extends TranslationException +{ + + private static final long serialVersionUID = 1L; + + private String string; + + + public UnknownStringException( String string ) + { + super( "the requested i18n string '" + string + "' could not be found" ); + this.string = string; + } + + + public String getString( ) + { + return this.string; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/AlreadySentException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/AlreadySentException.java new file mode 100644 index 0000000..9aa8c44 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/AlreadySentException.java @@ -0,0 +1,15 @@ +package com.deepclone.lw.interfaces.mailer; + + +/** + * This exception is thrown when a message is sent twice. + * + * @author tseeker + */ +public class AlreadySentException + extends MailerException +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailData.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailData.java new file mode 100644 index 0000000..89fd956 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailData.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.interfaces.mailer; + + +/** + * A MailData instance allows an email to be prepared by substituting fields in the message template + * then sent either synchronously or asynchronously. + * + * @author tseeker + */ +public interface MailData +{ + + /** + * Sets the value of a template field + * + * @param identifier + * the field's identifier + * @param value + * the value with which the field is to be replaced + * @throws IllegalArgumentException + * if the identifier does not correspond to a field, if the value is null or if the + * field had already been set. + */ + public void setData( String identifier , Object value ) + throws IllegalArgumentException; + + + /** + * Sends the message immediately, returning only after it has been sent. + * + * @throws AlreadySentException + * if the message had already been sent + * @throws MissingDataException + * if some of the template fields have not been set + * @throws NotSentException + * if the mail could not be sent + */ + public void sendNow( ) + throws AlreadySentException , MissingDataException , NotSentException; + + + /** + * Queue the message so that it may be sent asynchronously. + * + * @throws AlreadySentException + * if the message had already been sent + * @throws MissingDataException + * if some of the template fields have not been set + */ + public void queue( ) + throws AlreadySentException , MissingDataException; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/Mailer.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/Mailer.java new file mode 100644 index 0000000..270b00e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/Mailer.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.interfaces.mailer; + + +import com.deepclone.lw.interfaces.i18n.TranslationException; + + + +/** + * Mailer bean interface + * + * This interface is meant to be implemented by the server's mailer bean. + * + * @author tseeker + */ +public interface Mailer +{ + + /** + * This method generates a MailData instance from a template found in the internationalisation + * database. + * + * @param language + * the language identifier + * @param contentsDef + * the string identifier for the mail's template + * @param target + * the address to which the mail is to be sent + * @return the mail data instance + * @throws TranslationException + * when retrieving the template from the database fails + */ + public MailData createMail( String language , String contentsDef , String target ) + throws TranslationException; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailerException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailerException.java new file mode 100644 index 0000000..80387a5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MailerException.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.interfaces.mailer; + + +/** + * Base class for the mailer bean's exceptions + * + * @author tseeker + */ +public abstract class MailerException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + + public MailerException( ) + { + super( ); + } + + + public MailerException( String message ) + { + super( message ); + } + + + public MailerException( Throwable cause ) + { + super( cause ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MissingDataException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MissingDataException.java new file mode 100644 index 0000000..af04d53 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/MissingDataException.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.interfaces.mailer; + + +/** + * This exception is thrown when a template field has not been assigned a value. + * + * @author tseeker + */ +public class MissingDataException + extends MailerException +{ + + private static final long serialVersionUID = 1L; + + + public MissingDataException( String fieldName ) + { + super( fieldName ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/NotSentException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/NotSentException.java new file mode 100644 index 0000000..01215af --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/mailer/NotSentException.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.interfaces.mailer; + + +/** + * This exception is thrown when an email could not be sent. + * + * @author tseeker + */ +public class NotSentException + extends MailerException +{ + + private static final long serialVersionUID = 1L; + + + public NotSentException( Throwable cause ) + { + super( cause ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/AdminMessages.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/AdminMessages.java new file mode 100644 index 0000000..c48e918 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/AdminMessages.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.interfaces.msg; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.admin.msg.*; + + + +public interface AdminMessages +{ + + public GetMessagesResponse getMessages( Administrator admin , boolean inbox ); + + + public ReadMessageResponse getMessage( Administrator admin , boolean inbox , long id ); + + + public void deleteMessages( Administrator admin , boolean inbox , long[] selection ); + + + public void markRead( Administrator admin , long[] selection ); + + + public void markUnread( Administrator admin , long[] selection ); + + + public ComposeMessageResponse prepareBlankMessage( Administrator admin ); + + + public ComposeMessageResponse prepareMessageTo( Administrator admin , MessageType type , int id ); + + + public ComposeMessageResponse sendMessage( Administrator admin , MessageType type , String target , String title , + String contents , boolean simulate ); + + + public ComposeMessageResponse sendReply( Administrator admin , boolean inbox , long replyTo , MessageType type , + String target , String title , String contents , boolean simulate ); + + + public ComposeMessageResponse prepareReply( Administrator admin , boolean inbox , long id ); + + + public void sendSpam( Administrator admin , String title , String body ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/EmpireMessages.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/EmpireMessages.java new file mode 100644 index 0000000..8ae8af9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/EmpireMessages.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.interfaces.msg; + + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.msgs.ComposeMessageResponse; +import com.deepclone.lw.cmd.player.msgs.GetMessagesResponse; +import com.deepclone.lw.cmd.player.msgs.ListTargetsResponse; +import com.deepclone.lw.cmd.player.msgs.ReadMessageResponse; + + + +public interface EmpireMessages +{ + + public GetMessagesResponse getMessages( int empireId , boolean inbox ); + + + public ReadMessageResponse getMessage( int empireId , boolean inbox , long id ); + + + public void deleteMessages( int empireId , boolean inbox , long[] selection ); + + + public void markRead( int empireId , long[] selection ); + + + public void markUnread( int empireId , long[] selection ); + + + public ComposeMessageResponse prepareBlankMessage( int empireId ); + + + public ComposeMessageResponse prepareMessageTo( int empireId , MessageType type , int id ); + + + public ComposeMessageResponse sendMessage( int empireId , MessageType type , String target , String title , + String contents , boolean simulate ); + + + public ComposeMessageResponse sendReply( int empireId , boolean inbox , long replyTo , MessageType type , + String target , String title , String contents , boolean simulate ); + + + public ComposeMessageResponse prepareReply( int empireId , boolean inbox , long id ); + + + public ListTargetsResponse getTargets( int empireId ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageBoxDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageBoxDAO.java new file mode 100644 index 0000000..a2f921b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageBoxDAO.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.interfaces.msg; + + +import java.util.List; + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.sqld.msgs.InboxRecord; + + + +public interface MessageBoxDAO +{ + + public int sendMessage( boolean admin , int empireId , MessageType type , String target , String title , + String contents , boolean simulate ); + + + public List< InboxRecord > getList( boolean admin , int id , boolean inbox ); + + + public void markRead( boolean admin , int userId , long[] ids ); + + + public void markRead( boolean admin , int userId ); + + + public void markUnread( boolean admin , int userId , long[] ids ); + + + public void markUnread( boolean admin , int userId ); + + + public void delete( boolean admin , int userId , boolean inbox , long[] ids ); + + + public void delete( boolean admin , int userId , boolean inbox ); + + + public void clearCache( ); + + + public void sendSpam( int adminId , String title , String body ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageContentCache.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageContentCache.java new file mode 100644 index 0000000..1612531 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageContentCache.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.interfaces.msg; + + +import java.util.List; +import java.util.Map; + +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +public interface MessageContentCache +{ + + public Map< Long , MessageDataRecord > getContent( List< InboxRecord > messages ); + + + public void clearCache( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageExtractor.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageExtractor.java new file mode 100644 index 0000000..6e88cf1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageExtractor.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.interfaces.msg; + + +public interface MessageExtractor +{ + + public String getSender( ); + + + public String getSubject( ); + + + public String getContents( ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatRegistry.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatRegistry.java new file mode 100644 index 0000000..8e58c82 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatRegistry.java @@ -0,0 +1,16 @@ +package com.deepclone.lw.interfaces.msg; + + +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +public interface MessageFormatRegistry +{ + + public void addFormatter( MessageFormatter formatter ); + + + public MessageFormatter getFormatter( MessageDataRecord contents ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatter.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatter.java new file mode 100644 index 0000000..5c85f14 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageFormatter.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.interfaces.msg; + + +import java.util.Set; + +import com.deepclone.lw.sqld.msgs.FormatType; +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.MessageDataRecord; + + + +public interface MessageFormatter +{ + public Set< FormatType > getFormats( ); + + + public MessageExtractor getExtractor( InboxRecord envelope , MessageDataRecord contents , String language ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageRecordsDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageRecordsDAO.java new file mode 100644 index 0000000..ab64686 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/MessageRecordsDAO.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.interfaces.msg; + + +import java.util.List; + +import com.deepclone.lw.sqld.msgs.*; + + + +public interface MessageRecordsDAO +{ + + public List< TextMessageRecord > getTextMessages( List< Long > ids ); + + + public List< EventTypeRecord > getEventTypes( List< Long > ids ); + + + public List< EventRecord > getEvents( EventType type , List< Long > ids ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/NotificationsDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/NotificationsDAO.java new file mode 100644 index 0000000..1aaad54 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/msg/NotificationsDAO.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.interfaces.msg; + + +import java.util.List; + +import com.deepclone.lw.sqld.msgs.InboxRecord; +import com.deepclone.lw.sqld.msgs.NotificationsRecord; + + + +public interface NotificationsDAO +{ + public boolean isRecapTime( ); + + + public List< NotificationsRecord > getNotificationRecords( boolean instant ); + + + public List< InboxRecord > listMessages( int empireId , long maxId , boolean instant , boolean nPrivate , + boolean nInternal , boolean nAlliance , boolean nAdmin ); + + + public void cleanupMessages( ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/EmpireNameException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/EmpireNameException.java new file mode 100644 index 0000000..d1d2966 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/EmpireNameException.java @@ -0,0 +1,42 @@ +package com.deepclone.lw.interfaces.naming; + + +/** + * Empire/player name manager exception + * + * This exception is used by {@link EmpireNamesDAO} to indicate that something went wrong in the + * name creation or modification code. + * + * @author tseeker + */ +public class EmpireNameException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + /** Possible causes for this exception */ + public static enum Error { + /** Attempting to use a banned name */ + BANNED , + /** Attempting to use a name which already exists in the DB */ + UNAVAILABLE , + } + + /** Actual error code */ + private Error error;; + + + public EmpireNameException( Error error ) + { + super( error.toString( ) ); + this.error = error; + } + + + /** @return the error code for the exception */ + public Error getError( ) + { + return this.error; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/MapNameException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/MapNameException.java new file mode 100644 index 0000000..dcb5826 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/MapNameException.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.interfaces.naming; + + +/** + * Map object name manager exception + * + * This exception is thrown by {@link MapNamesDAO} to indicate that something went wrong. It + * carries an error code indicating the nature of the problem. + * + * @author tseeker + */ +public class MapNameException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + /** Possible causes for this exception */ + public static enum Error { + /** Attempting to use a banned name */ + BANNED , + /** Attempting to use a name which already exists in the DB */ + UNAVAILABLE , + /** Attempting a rename too early after the previous one */ + TOO_EARLY , + /** Attempting to validate a name that's already been validated */ + VALIDATED , + /** Attempting to validate a name that's never been modified by a player */ + NOT_RENAMED + }; + + /** Actual error code */ + private Error error;; + + + public MapNameException( Error error ) + { + super( error.toString( ) ); + this.error = error; + } + + + /** @return the error code for the exception */ + public Error getError( ) + { + return this.error; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamesManager.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamesManager.java new file mode 100644 index 0000000..2adb7d8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamesManager.java @@ -0,0 +1,32 @@ +package com.deepclone.lw.interfaces.naming; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.naming.GetNamesResponse; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.cmd.admin.naming.NamesSummaryResponse; + + + +public interface NamesManager +{ + public NamesSummaryResponse getSummary( Administrator admin ); + + + public GetNamesResponse getNames( Administrator admin , NameType type ); + + + public void validateMapNames( Administrator admin , int[] ids ); + + + public void allowMapNameChanges( Administrator admin , int[] ids ); + + + public void rejectMapNames( Administrator admin , int[] ids , boolean ban ); + + + public void rejectEmpireNames( Administrator admin , int[] ids , boolean ban ); + + + public void rejectAllianceNames( Administrator admin , int[] ids ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamingDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamingDAO.java new file mode 100644 index 0000000..efab7a8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/naming/NamingDAO.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.interfaces.naming; + + +import java.util.List; +import java.util.Map; + +import com.deepclone.lw.cmd.admin.naming.Name; +import com.deepclone.lw.cmd.admin.naming.NameType; +import com.deepclone.lw.sqld.accounts.Account; + + + +public interface NamingDAO +{ + + public List< String > getEmpireNames( int id ); + + + public Integer getCurrentEmpire( Account account ); + + + public int renamePlanet( int id , String name ); + + + public Map< NameType , Long > countNames( ); + + + public List< Name > getNames( NameType type ); + + + void validateMapName( int administrator , int name ); + + + public void allowMapNameChange( int administrator , int name ); + + + public void rejectMapName( int administrator , int name , boolean ban ); + + + public void rejectEmpireName( int administrator , int empire , boolean ban ); + + + public void rejectAllianceName( int administrator , int alliance ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/AccountPreferences.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/AccountPreferences.java new file mode 100644 index 0000000..73f5cea --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/AccountPreferences.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.interfaces.prefs; + + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + + + +public class AccountPreferences +{ + + private final Map< String , PreferenceGroup > groups = new HashMap< String , PreferenceGroup >( ); + + private final List< String > groupOrder = new LinkedList< String >( ); + + private final Map< String , String > prefGroups; + + + public AccountPreferences( List< PreferenceGroup > groups , Map< String , String > prefGroups ) + { + for ( PreferenceGroup group : groups ) { + this.groups.put( group.getName( ) , group ); + this.groupOrder.add( group.getName( ) ); + } + this.prefGroups = prefGroups; + } + + + public List< PreferenceGroup > getGroups( ) + { + List< PreferenceGroup > g = new LinkedList< PreferenceGroup >( ); + for ( String gn : groupOrder ) { + g.add( this.groups.get( gn ) ); + } + return g; + } + + + public < T > T getPreference( String name , Class< T > type ) + { + String gn = this.prefGroups.get( name ); + return this.groups.get( gn ).getPreference( name ).getValue( type ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/Preference.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/Preference.java new file mode 100644 index 0000000..36a2f4a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/Preference.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.interfaces.prefs; + + +public class Preference +{ + + private String name; + + private PreferenceGroup group; + + private String displayName; + + private String description; + + private PreferenceType< ? > type; + + private String value; + + + public Preference( String name , PreferenceGroup group , String displayName , String description , + PreferenceType< ? > type , String value ) + { + this.name = name; + this.group = group; + this.displayName = displayName; + this.description = description; + this.type = type; + this.value = value; + this.group.addPreference( this ); + } + + + public String getName( ) + { + return name; + } + + + public PreferenceGroup getGroup( ) + { + return group; + } + + + public String getDisplayName( ) + { + return displayName; + } + + + public String getDescription( ) + { + return description; + } + + + public PreferenceType< ? > getType( ) + { + return type; + } + + + public String getDBValue( ) + { + return this.value; + } + + + @SuppressWarnings( "unchecked" ) + public < T > T getValue( Class< T > type ) + { + return ( (PreferenceType< T >) this.type ).valueOf( this.value , type ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitionException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitionException.java new file mode 100644 index 0000000..34c12f8 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitionException.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.interfaces.prefs; + + +public class PreferenceDefinitionException + extends Exception +{ + + /** Serialisation version identifier */ + private static final long serialVersionUID = 1L; + + public static enum Error { + MISSING_GROUP , + MISSING_DEFINITION , + MISSING_STRING , + INVALID_TYPE + } + + public final Error error; + + + public PreferenceDefinitionException( Error error ) + { + this.error = error; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitions.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitions.java new file mode 100644 index 0000000..aef759d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceDefinitions.java @@ -0,0 +1,71 @@ +package com.deepclone.lw.interfaces.prefs; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.player.gdata.account.PrefCategory; + + + +/** + * Interface for the preference definitions management bean. + * + * @author tseeker + */ +public interface PreferenceDefinitions +{ + + /** + * Registers a group of preferences. + * + * @param name + * programmatic name of the group + * @param displayName + * internationalised string identifier + * @throws PreferenceDefinitionException + * when the display name string doesn't exist (with the + * {@link PreferenceDefinitionException.Error#MISSING_STRING} error code) + * @throws IllegalArgumentException + * if one of the parameters is null + */ + public void registerGroup( String name , String displayName ) + throws PreferenceDefinitionException , IllegalArgumentException; + + + /** + * Registers a new type of user preference. + * + * @param name + * programmatic name of the preference + * @param group + * programmatic name of the group the preference is a part of + * @param displayName + * internationalised string identifier that allows the preference's name to be + * displayed + * @param displayDescription + * internationalised string identifier that allows the preference's description to be + * displayed (may be null) + * @param defaultValue + * default value of the preference + * @throws PreferenceDefinitionException + * when the group doesn't exist (with the + * {@link PreferenceDefinitionException.Error#MISSING_GROUP} error code), when the + * display name or description string doesn't exist (with the + * {@link PreferenceDefinitionException.Error#MISSING_STRING} error code) or if the + * preference already exists but is defined as having a different type (with the + * {@link PreferenceDefinitionException.Error#INVALID_TYPE} error code). + * @throws IllegalArgumentException + * if one of the mandatory arguments is null + */ + public void registerPreference( String name , String group , String displayName , String displayDescription , + Object defaultValue ) + throws PreferenceDefinitionException , IllegalArgumentException; + + + public List< PrefCategory > getDefaults( ); + + + public void setDefault( Administrator admin , String preference , String value ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceGroup.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceGroup.java new file mode 100644 index 0000000..77b7a8b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceGroup.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.interfaces.prefs; + + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + + + +public class PreferenceGroup +{ + + private String name; + + private String display; + + private final List< Preference > definitions = new LinkedList< Preference >( ); + + private final Map< String , Preference > byName = new HashMap< String , Preference >( ); + + + public PreferenceGroup( String name , String display ) + { + this.name = name; + this.display = display; + } + + + public String getName( ) + { + return name; + } + + + public String getDisplay( ) + { + return display; + } + + + public void addPreference( Preference def ) + { + this.definitions.add( def ); + this.byName.put( def.getName( ) , def ); + } + + + public List< Preference > getPreferences( ) + { + return this.definitions; + } + + + public Preference getPreference( String name ) + { + return this.byName.get( name ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceType.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceType.java new file mode 100644 index 0000000..f69ff95 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceType.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.interfaces.prefs; + + +import java.util.Map; + + + +public interface PreferenceType< T > +{ + + public T valueOf( String dbValue , Class< T > type ); + + + public Object valueOf( String inValue ); + + + public String convert( Object value ); + + + public Map< String , String > getChoices( ); + + + public Class< T > getType( ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceTypesRegistry.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceTypesRegistry.java new file mode 100644 index 0000000..9fb635f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferenceTypesRegistry.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.interfaces.prefs; + + +public interface PreferenceTypesRegistry +{ + + public < T > PreferenceType< T > getType( Class< T > jType ); + + + public PreferenceType< ? > getType( String typeName ); + +} \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferencesDAO.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferencesDAO.java new file mode 100644 index 0000000..1f790d5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/prefs/PreferencesDAO.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.interfaces.prefs; + + +import java.util.Map; + +import com.deepclone.lw.sqld.accounts.Account; + + + +/** + * Interface for the account preferences management bean. + * + * @author tseeker + */ +public interface PreferencesDAO +{ + + /** + * Reads all preferences from an account. + * + *

+ * This method reads all preferences associated to an account. The default value is used if a + * preference definition exists but no such preference is set for the account. + * + * @param account + * account whose preferences are to be read. + */ + public AccountPreferences getPreferences( Account account ); + + + public AccountPreferences getPreferences( int accountId ); + + + /** + * Resets an account's preferences. + * + * @param account + * account whose preferences are to be reset + */ + public void resetPreferences( Account account ); + + + void setPreferences( Account account , Map< String , String > values ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/ServerSession.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/ServerSession.java new file mode 100644 index 0000000..5844208 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/ServerSession.java @@ -0,0 +1,104 @@ +package com.deepclone.lw.interfaces.session; + + +import java.net.InetAddress; +import java.util.Date; + +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; + + + +/** + * Server-side session interface. + * + *

+ * This interface provides session type definers (as defined by {@link SessionTypeDefiner}) limited + * access to server-side session data. + * + * @author tseeker + */ +public interface ServerSession +{ + + /** + * @return the session's identifier (may be null when the session is being initialised) + */ + public String getIdentifier( ); + + + /** + * @return the identifier of the client on behalf of which the session was created + */ + public String getClient( ); + + + /** + * @return the IP address of the client on behalf of which the session was created + */ + public InetAddress getAddress( ); + + + /** + * @return the session's current authentication challenge string + */ + public String getChallenge( ); + + + /** + * Sets the session's expiration date + * + * @param date + * new expiration date + */ + public void setExpirationDate( Date date ); + + + /** + * @return the type of session termination or null if the session is not being + * terminated + */ + public SessionTerminationType getTerminationType( ); + + + /** + * Terminates the session. + * + *

+ * This method can be called by session type definers which need to destroy a session. It will + * set the termination type to {@link SessionTerminationType#MANUAL} and call back + * {@link SessionTypeDefiner#terminate(ServerSession)}. + */ + public void terminate( ); + + + /** + * Terminates the session. + * + *

+ * This method can be called by session type definers which need to destroy a session and give a + * specific reason. + */ + public void terminate( SessionTerminationType reason ); + + + /** + * Stores data into the session. + * + * @param key + * key with which the specified value is to be associated + * @param value + * value to be associated with the specified key + */ + public void put( String key , Object value ); + + + /** + * Retrieves data from the session. + * + * @param key + * the key whose associated value is to be returned + * @param type + * expected type of the value + */ + public < T > T get( String key , Class< T > type ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionManager.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionManager.java new file mode 100644 index 0000000..22a2a8c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionManager.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.interfaces.session; + + +import com.deepclone.lw.session.SessionAccessor; + + + +/** + * Session manager interface. + * + *

+ * This interface, implemented by the session management bean, extends the Legacy Worlds + * {@link SessionAccessor} interface and adds a method allowing {@link SessionTypeDefiner} instances + * to be registered. + * + * @author tseeker + */ +public interface SessionManager + extends SessionAccessor +{ + + /** + * Registers a session type definer. + * + *

+ * This method adds support for a session type using the specified session type definer. If a + * session type with the same name already exists, it is replaced. + * + * @param definer + * the session type definer to register. + */ + public void registerSessionType( SessionTypeDefiner definer ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionTypeDefiner.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionTypeDefiner.java new file mode 100644 index 0000000..16147e1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/session/SessionTypeDefiner.java @@ -0,0 +1,125 @@ +package com.deepclone.lw.interfaces.session; + + +import com.deepclone.lw.cmd.admin.users.SessionTerminationType; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionStateException; + + + +/** + * Interface for session type definers. + * + *

+ * This interface defines methods which allow sessions to be managed. + * + * @author tseeker + */ +public interface SessionTypeDefiner +{ + + /** @return the name of the session type */ + public String getName( ); + + + /** + * Initialises a session. + * + *

+ * This method should initialise the specified session, setting its initial data and expiration + * date. When the method is called by the {@link SessionManager}, the session has no identifier + * - it is only assigned once initialisation has completed. + * + * @param session + * the session to initialise + */ + public void initialise( ServerSession session ); + + + /** + * Determines whether the specified session has undergone authentication. + * + * @param session + * the session whose status is to be determined. + * @return true if the session has undergone authentication or doesn't need to + * authenticate, false if authentication is required + */ + public boolean isAuthenticated( ServerSession session ); + + + /** + * Returns the current state of the session. + * + *

+ * This method returns the current state of an authenticated session. It is useful for session + * definers that implement multi-state sessions, accepting different sets of commands in each + * state. + * + * @param session + * the session whose state is to be determined + * @return the session's state. + */ + public String getState( ServerSession session ); + + + /** + * Authenticates a session. + * + *

+ * This method attempts to authenticate a session, modifying the session's data accordingly if + * successful. + * + * @param session + * the session being authenticated + * @param identifier + * authentication identifier (for example an account's mail address) + * @param sha1Hash + * SHA-1 hash of the challenge response + * @param md5Hash + * MD5 hash of the challenge response + * @throws SessionStateException + * if the session type doesn't support authentication or if the session had already + * undergone authentication. + */ + public void authenticate( ServerSession session , String identifier , String sha1Hash , String md5Hash ) + throws SessionStateException; + + + /** + * Executes a command. + * + *

+ * This method executes the specified command in the session's context, returning the command's + * results. + * + * @param session + * the session whose context is to be used when executing the command + * @param command + * the command to execute + * @return whatever the command execution yields. + * @throws SessionStateException + * if the session type requires authentication and the session is not authenticated. + * @throws SessionCommandException + * if the session type does not support the specified command. + */ + public CommandResponse execute( ServerSession session , Command command ) + throws SessionStateException , SessionCommandException; + + + /** + * Handles session termination. + * + *

+ * This method will execute code specific to a session type when a session is being terminated + * (either through the session type definer itself or for other reasons). + * + * @param session + * the session that's being terminated. + * @param reason + * the reason why the session's being terminated + */ + public void terminate( ServerSession session , SessionTerminationType reason ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantDefinition.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantDefinition.java new file mode 100644 index 0000000..19704ff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantDefinition.java @@ -0,0 +1,122 @@ +package com.deepclone.lw.interfaces.sys; + + +/** + * This class is used by beans which define constants in order to notify the constants manager of + * their existence and specifics. + * + * @author tseeker + */ +public final class ConstantDefinition +{ + + /** The constant's name, as it is used in the code */ + public final String name; + + /** The human-readable category name used in the administration interface */ + public final String category; + + /** The constant's description used in the administrative interface */ + public final String description; + + /** The optional minimal value */ + public final Double minValue; + + /** The optional maximal value */ + public final Double maxValue; + + /** The constant's default value */ + public final Double defaultValue; + + + /** + * Creates a constant definition with no constraints. + * + * @param name + * the constant's name + * @param category + * the constant's category + * @param description + * the constant's description + * @param value + * the constant's default value + */ + public ConstantDefinition( String name , String category , String description , Double value ) + { + this.name = name; + this.category = category; + this.description = description; + this.defaultValue = value; + this.maxValue = this.minValue = null; + } + + + /** + * Creates a constant definition with a single constraint. + * + * @param name + * the constant's name + * @param category + * the constant's category + * @param description + * the constant's description + * @param value + * the constant's default value + * @param constraint + * a constraint to apply on the constant's definition + * @param isMinimal + * whether the constraint is the minimal or maximal value + * @throws IllegalArgumentException + * if the default value is out of bounds + */ + public ConstantDefinition( String name , String category , String description , Double value , Double constraint , + boolean isMinimal ) + throws IllegalArgumentException + { + if ( isMinimal && value < constraint || !isMinimal && value > constraint ) { + throw new IllegalArgumentException( ); + } + this.name = name; + this.category = category; + this.description = description; + this.defaultValue = value; + this.maxValue = isMinimal ? null : constraint; + this.minValue = isMinimal ? constraint : null; + } + + + /** + * Creates a constant definition with two constraints. + * + * @param name + * the constant's name + * @param category + * the constant's category + * @param description + * the constant's description + * @param value + * the constant's default value + * @param min + * the constant's minimal value + * @param max + * the constant's maximal value + * @throws IllegalArgumentException + * if the minimal is greater than the maximal or if the default value is out of + * bounds + */ + public ConstantDefinition( String name , String category , String description , Double value , Double min , + Double max ) + throws IllegalArgumentException + { + if ( min > max || value < min || value > max ) { + throw new IllegalArgumentException( ); + } + this.name = name; + this.category = category; + this.description = description; + this.defaultValue = value; + this.maxValue = max; + this.minValue = min; + + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsAdministration.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsAdministration.java new file mode 100644 index 0000000..5ec7053 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsAdministration.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.interfaces.sys; + + +import java.util.Collection; +import java.util.Set; + + + +/** + * This is the constants administrative interface, which allows constants to be listed and modified + * by the game's administrators. + * + * @author tseeker + */ +public interface ConstantsAdministration +{ + + /** @return the set of constant categories */ + public Set< String > getCategories( ); + + + /** + * List all constants in a category. The constant definition objects that are returned have the + * constant's current value set as their default value field. + * + * @param category + * the name of the category to list + * @return the list of constants in a given category or an empty list if the category does not + * exist + */ + public Collection< ConstantDefinition > getConstants( String category ); + + + /** + * Modifies a constant and notifies all constant user components of the change. + * + * @param name + * the constant's name + * @param value + * the constant's new value + * @throws UnknownConstantError + * if the name doesn't match any actual constant + * @throws InvalidConstantValue + * if the specified value is out of bounds + */ + public void setConstant( String name , Double value ) + throws UnknownConstantError , InvalidConstantValue; +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsManager.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsManager.java new file mode 100644 index 0000000..825e886 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsManager.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.interfaces.sys; + + +import java.util.Collection; +import java.util.Set; + + + +/** + * The constants management service provides a way for system constants to be accessed from a + * central location. All constants are loaded in main memory, and can be modified through an + * administrative interface. + * + * @author tseeker + * + */ +public interface ConstantsManager +{ + + /** + * Registers a set of constants; if the constants already exist in the database, their + * constraints are updated and their value is only modified if it violates the constraints. If + * they do not exist yet, they are created. + * + * If constants are modified or created, and if there are users registered for these constants, + * they will be notified. + * + * @param definitions + * the set of constant definitions to register + */ + public void registerConstants( Collection< ConstantDefinition > definitions ); + + + /** + * Registers a constants user, which will need to be informed of the constants' changes. If the + * required constants have not been registered yet, the user instance will not be notified. + * + * @param user + * the constants user component to register + * @param constants + * set of constant names the user wants to be informed about + */ + public void registerUser( ConstantsUser user , Set< String > constants ); + + + /** + * Unregisters a constants user. + * + * @param user + * the constants user component to unregister + */ + public void unregisterUser( ConstantsUser user ); + + + /** + * Creates an administrative interface for a specific administrator. + * + * @param admin + * the administrator making changes to the constants. + * @return the administrative interface + */ + public ConstantsAdministration getAdminSession( int admin ); +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsUser.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsUser.java new file mode 100644 index 0000000..c821c63 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/ConstantsUser.java @@ -0,0 +1,32 @@ +package com.deepclone.lw.interfaces.sys; + + +import java.util.Map; + + + +/** + * This interface is implemented by beans which need to access system constants and be informed if + * the constants are modified. + * + * @author tseeker + * + */ +public interface ConstantsUser +{ + + /** + * This method will be called by the constants manager when the constants user registers itself + * or whenever one of the constants needed by the user is modified. + * + * @param initial + * true if the call is being issued after registration, false otherwise + * @param values + * a map that associates updated constant names to their new values + * @throws Exception + * for whatever reasons. + */ + public void setConstants( boolean initial , Map< String , Double > values ) + throws Exception; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/EndAutowiredTransaction.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/EndAutowiredTransaction.java new file mode 100644 index 0000000..fc9bf4e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/EndAutowiredTransaction.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.interfaces.sys; + + +public class EndAutowiredTransaction + extends RuntimeException +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/InvalidConstantValue.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/InvalidConstantValue.java new file mode 100644 index 0000000..22eefab --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/InvalidConstantValue.java @@ -0,0 +1,17 @@ +package com.deepclone.lw.interfaces.sys; + + +/** + * This exception is thrown by the constants administrative interface when an administrator attempts + * to set a constraint that is out of bounds. + * + * @author tseeker + * + */ +public class InvalidConstantValue + extends Exception +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceData.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceData.java new file mode 100644 index 0000000..0199d6f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceData.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.interfaces.sys; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public final class MaintenanceData + implements Serializable +{ + + /** Serialisation version identifier */ + private static final long serialVersionUID = 1L; + + public final Timestamp start; + public final Timestamp end; + public final String reason; + + + public MaintenanceData( Timestamp start , Timestamp end , String reason ) + { + this.start = start; + this.end = end; + this.reason = reason; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceStatusException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceStatusException.java new file mode 100644 index 0000000..fb4f2a2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/MaintenanceStatusException.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.interfaces.sys; + + +public class MaintenanceStatusException + extends Exception +{ + + /** Serialisation version identifier */ + private static final long serialVersionUID = 1L; + + public final MaintenanceData maintenanceData; + + + public MaintenanceStatusException( ) + { + super( "not under maintenance" ); + this.maintenanceData = null; + } + + + public MaintenanceStatusException( MaintenanceData data ) + { + super( "under maintenance" ); + this.maintenanceData = data; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/SystemStatus.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/SystemStatus.java new file mode 100644 index 0000000..d8cc5d2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/SystemStatus.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.interfaces.sys; + + +public interface SystemStatus +{ + + /** + * Checks whether the system is currently under maintenance. + * + * @return null or maintenance record + */ + public MaintenanceData checkMaintenance( ); + + + /** + * Activates maintenance mode. + */ + public void startMaintenance( int adminId , String reason , int duration ) + throws MaintenanceStatusException; + + + /** + * Updates maintenance mode duration. + */ + public void updateMaintenance( int adminId , int durationFromNow ) + throws MaintenanceStatusException; + + + /** + * Exits maintenance mode. + */ + public void endMaintenance( int adminId ) + throws MaintenanceStatusException; + + + /** + * Starts a new tick. + * + * @return new tick's identifier + */ + public long startTick( ) + throws TickStatusException , MaintenanceStatusException; + + + /** + * Checks if there is a "stuck" tick. + * + * @return current tick's identifier or null if there is no stuck tick + */ + public Long checkStuckTick( ) + throws MaintenanceStatusException; + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickStatusException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickStatusException.java new file mode 100644 index 0000000..c5d9bd6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickStatusException.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.interfaces.sys; + + +public class TickStatusException + extends Exception +{ + /** Serialisation version identifier */ + private static final long serialVersionUID = 1L; + + public final Long tickIdentifier; + + + public TickStatusException( ) + { + super( "no tick in progress" ); + this.tickIdentifier = null; + } + + + public TickStatusException( long id ) + { + super( "tick in progress" ); + this.tickIdentifier = id; + } +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/Ticker.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/Ticker.java new file mode 100644 index 0000000..26b23fa --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/Ticker.java @@ -0,0 +1,78 @@ +package com.deepclone.lw.interfaces.sys; + + +/** + * System task scheduler + * + * This interface provides access to the system task scheduler, which is used for everything that is + * supposed to happen at a regular interval (from log cleaning to ticks). + * + * @author tseeker + */ +public interface Ticker +{ + + /** Task execution frequencies */ + public enum Frequency { + /** Tasks that are meant to be executed every five seconds */ + HIGH , + + /** Tasks that are meant to be executed every thirty seconds */ + MEDIUM , + + /** Tasks that are meant to be executed every minute */ + MINUTE , + + /** Tasks that are meant to be executed every five minutes */ + LOW + } + + + /** + * Registers a new task. + * + * This method may be called to register a new task in the system ticker. The ticker will use a + * weak reference to store the task's execution instance. + * + * @param frequency + * task execution frequency + * @param name + * task name + * @param task + * runnable instance to be executed at the specified frequency + */ + public void registerTask( Ticker.Frequency frequency , String name , Runnable task ); + + + /** + * Pauses the ticker. + * + * This method pauses the ticker. Once the method is called, no new tasks will be started; + * however, the method will wait for any currently running tasks before returning. + * + * @throws IllegalStateException + * if the ticker was already paused + */ + public void pause( ) + throws IllegalStateException; + + + /** + * Restarts the ticker. + * + * This method attempts to restart the ticker after it has been paused. + * + * @throws IllegalStateException + * if the ticker was already running. + */ + public void unpause( ) + throws IllegalStateException; + + + /** + * @return true the ticker is currently running or false if it has + * been paused. + */ + public boolean isActive( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickerManager.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickerManager.java new file mode 100644 index 0000000..9671b38 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/TickerManager.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.interfaces.sys; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.tick.TickerTaskInfo; + + + +public interface TickerManager +{ + + public List< TickerTaskInfo > getTasks( ); + + + public void startTask( int administrator , int id ); + + + public void stopTask( int administrator , int id ); + + + public void setTaskStart( int administrator , int id , long time ); + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/UnknownConstantError.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/UnknownConstantError.java new file mode 100644 index 0000000..6145b80 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/UnknownConstantError.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.interfaces.sys; + + +/** + * This exception is thrown when a constant name doesn't match an actual constant. + * + * @author tseeker + */ +public class UnknownConstantError + extends Exception +{ + + private static final long serialVersionUID = 1L; + + + public UnknownConstantError( String constant ) + { + super( constant ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/WiringException.java b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/WiringException.java new file mode 100644 index 0000000..42c48e4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-interfaces/src/main/java/com/deepclone/lw/interfaces/sys/WiringException.java @@ -0,0 +1,16 @@ +package com.deepclone.lw.interfaces.sys; + + +public class WiringException + extends RuntimeException +{ + + private static final long serialVersionUID = 1L; + + + public WiringException( Throwable cause ) + { + super( cause ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/.classpath b/legacyworlds-server/legacyworlds-server-main/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/.project b/legacyworlds-server/legacyworlds-server-main/.project new file mode 100644 index 0000000..4fabc51 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-main + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-main/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-main/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..deacd36 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Thu Apr 15 09:16:34 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-main/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-server/legacyworlds-server-main/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..1a8e041 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Apr 15 09:16:34 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-server/legacyworlds-server-main/data-source.xml b/legacyworlds-server/legacyworlds-server-main/data-source.xml new file mode 100644 index 0000000..fccf83f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data-source.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-en.txt new file mode 100644 index 0000000..9dfc314 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-en.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Address change +Hello, + +You are receiving this message because an user of Legacy Worlds (you, presumably) requested to change his or her address to ${address}. + +Your confirmation code is: ${token} + +If you did not request this, please sent the staff an email at staff@legacyworlds.com. + +Thanks! +The Legacy Worlds staff \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-fr.txt new file mode 100644 index 0000000..569a8e9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/addressChangeMail-fr.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Changement d'adresse +Bonjour, + +Vous avez reçu ce message car un utilisateur de Legacy Worlds (vous, probablement) a demandé à ce que son adresse soit changée pour ${address}. + +Votre code de confirmation est: ${token} + +Si vous n'êtes pas responsable de cette demande, veuillez contacter notre équipe par courrier électronique (staff@legacyworlds.com). + +Cordialement, +L'équipe de Legacy Worlds \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/adminErrorMail.txt b/legacyworlds-server/legacyworlds-server-main/data/adminErrorMail.txt new file mode 100644 index 0000000..f577aa2 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/adminErrorMail.txt @@ -0,0 +1,4 @@ +[LWB6-ADMIN] Server errors +Errors have been found in the server's system log. Intervention might be required. + +${contents} diff --git a/legacyworlds-server/legacyworlds-server-main/data/adminRecapMail.txt b/legacyworlds-server/legacyworlds-server-main/data/adminRecapMail.txt new file mode 100644 index 0000000..3d90b25 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/adminRecapMail.txt @@ -0,0 +1,4 @@ +[LWB6-ADMIN] Recap +Here's what happened in the past 12 hours... + +${contents} diff --git a/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-en.txt new file mode 100644 index 0000000..39ceb1d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-en.txt @@ -0,0 +1,9 @@ +Legacy Worlds (B6M1) - Ban lifted +Hello, + +The ban on your account has been lifted. + +Please accept our most sincere apologies. + +Best regards, +The Legacy Worlds staff diff --git a/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-fr.txt new file mode 100644 index 0000000..95b003f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/banLiftedMail-fr.txt @@ -0,0 +1,9 @@ +Legacy Worlds (B6M1) - Bannissement levé +Bonjour, + +Le bannissement de votre compte a été levé. + +Veuillez accepter nos sincères excuses. + +Cordialement, +L'équipe de Legacy Worlds diff --git a/legacyworlds-server/legacyworlds-server-main/data/bannedMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/bannedMail-en.txt new file mode 100644 index 0000000..c546f78 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/bannedMail-en.txt @@ -0,0 +1,12 @@ +Legacy Worlds (B6M1) account banned +Hello, + +Your Legacy Worlds account has been banned by the game's administrators for the following reason: + +${reason} + +You have 48h to appeal this ban before your empire is lost. +To do so, please send an e-mail to the staff at staff@legacyworlds.com + +Best regards, +The Legacy Worlds staff diff --git a/legacyworlds-server/legacyworlds-server-main/data/bannedMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/bannedMail-fr.txt new file mode 100644 index 0000000..a2fb65e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/bannedMail-fr.txt @@ -0,0 +1,12 @@ +Legacy Worlds (B6M1) - Compte banni +Bonjour, + +Votre compte Legacy Worlds a été banni par les administrateurs du jeu pour la raison suivante : + +${reason} + +Vous avez 48h pour faire appel de ce bannissement avant que votre empire soit perdu. +Pour ce faire, veuillez envoyer un mail à l'équipe d'administration à l'adresse staff@legacyworlds.com + +Cordialement, +L'équipe de Legacy Worlds diff --git a/legacyworlds-server/legacyworlds-server-main/data/buildables-test.xml b/legacyworlds-server/legacyworlds-server-main/data/buildables-test.xml new file mode 100644 index 0000000..69bc47a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/buildables-test.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/buildables.xml b/legacyworlds-server/legacyworlds-server-main/data/buildables.xml new file mode 100644 index 0000000..5ba9554 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/buildables.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/buildables.xsd b/legacyworlds-server/legacyworlds-server-main/data/buildables.xsd new file mode 100644 index 0000000..a3e80ab --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/buildables.xsd @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xml b/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xml new file mode 100644 index 0000000..c2ef4e9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xml @@ -0,0 +1,1033 @@ + + + + + + + + + + + + + + + + + + + + +*** +From: ${from} +To: ${to} +Subject: ${subject} + +${text} + + + + + * ${subject} + from ${from} + received ${time} + + + Private messages: + + + Alliance messages: + + + Internal messages: + + + Messages from administrators: + + + + Civilian technologies + + + They're not just your slaves, they're your scientists, poets and workers. Make the poets work first, then use these technologies to increase their productivity! Useless poets. + + + + Universal assemblers + + + You know how it is when you have a thingy-bob that you need to build but you just don't have the right tool. Well, fear no more, Universal Assemblers will solve all your problems! Build anything and everything with these clever machines, they are 1337. + + + Corpse reanimation + + + Tired of workers dying too early? Want a little less perspiration in your corporation? Zombies will work, won't complain and best of all, they can be fed on almost anything! Feed them your enemies! But mostly, use them to increase factory productivity by a rather nice amount. + + + Biological generators + + + For every turret a military commander wants, there is a bigger, stronger turret he wants more. Now you too can have such a turret! It will defend your planet with ease while you venture out into the galaxy, bending it to your will. Available in all good hardware stores. + + + + Military technologies + + + It is only one who is thoroughly acquainted with the evils of war that can thoroughly understand the profitable way of carrying it on. - Sun Tzu + + + + Orbital construction + + + Ships built on the ground must endure the stress of atmospheric flight before they are even able to dominate the vast emptiness of space. Build them in space and they will be sleeker, more powerful and now free of the need for windows. Use your brand new Cruisers to dominate the known universe. + + + Structural reinforcement + + + The power of your Cruisers can be augmented by an improved design! Take advantage of a more structurally sound space vehicle that can bring empires to their knees with its speed and technological grace. + + + Automated space docks + + + Technology has advanced. The ultimate weapon is now available. Claim the awesome power of the Dreadnought and crush your enemies. Ever wanted a tank in space? Well, now you have it. All their base are belong to you. + + + + Ship parts factory + + + A Ship parts factory is a mass production factory for the creation of components used in your space faring vessels. They are essential to any space empire; Properly managed factories produce new vehicles quickly and efficiently. + + + Defence turret + + + Exploration without vigilance is the action of a fool. Turrets are the last line of defence for the planet, super massive weapons capable of destroying orbital vehicles from the ground. They can be placed anywhere, on any building or vacant land in your domain and will defend your planets from attack. + + + Generic assembly line + + + Factories are the backbone of a thriving economy, providing goods and matériel to buy and sell on the free market. Your brand new Generic assembly lines will enhance your wealth and keep the population employed. Properly managed factories produce many economic benefits for an empire. + + + Reanimation centre + + + People are frail but cheap and robots are hard wearing but expensive. Renew the life of your workers and you can take advantage of a cheap zombie resource, giving you a third option for keeping your empire thriving. + + + Biological turret + + + The perfect union of man and machine, Biological Turrets are a blending of the technological and the biological to provide the ultimate defence for your planets. More powerful and accurate than Turrets, in ground based defence they are unmatched. Keep your people away from them, however, as they tend to hunger for human flesh. + + + + Fighter + + + Give a boy a gun and he will become a man. Give a man a ship and he will dominate planets. A Fighter is a light and fast space superiority weapon that alone is inconspicuous and in vast hordes are terrifying. Transport them around the galaxy and you will have all you desire. + + + Cruiser + + + A Cruiser is a compact yet powerful capital ship. It has space-to-space and space-to-ground weapons, as well as a decent number of cup holders. + + + Battlecruiser + + + A BattleCruiser is a capital ship, faster and sleeker than a cruiser. It is much faster than his smaller sibling but still packs a lot of firepower for your money. A worthy addition for any warlord's fleet. + + + Dreadnought + + + Bring the Dread. The Dreadnought is a large capital ship with awesome power and capabilities, expensive and slow but the ultimate in space domination. + + + + Display preferences + + + Real-life time + + + Selecting this option will cause all durations to be displayed using real-life minutes. + + + Map defaults + + + Map centre (X) + + + The abscissa of the default map centre. + + + Map centre (Y) + + + The ordinates of the default map centre. + + + Map size + + + The default size of the map. + + + E-mail settings + + + Private messages + + + Select the type of e-mail notifications you will get for private messages sent by other empires. + + + Alliance messages + + + Select the type of e-mail notifications you will get for alliance-wise messages. + + + Internal messages + + + Select the type of e-mail notifications you will get for internal game messages. + + + Messages from administrators + + + Select the type of e-mail notifications you will get for messages sent by the game's administrators. + + + + Small (3x3) + + + Medium (5x5) + + + Large (7x7) + + + + No notification + + + Include in daily recap + + + Instant notification + + + + + Ministry of Economy + + + Ministry of War + + + Ministry of Peace + + + Ministry of Research + + + Legacy Worlds staff + + + Bug tracker + + + + + Empty civilian queues + + + Some of your planets have finished constructing or destroying buildings: + + + + Empty civilian queue at ${location} + + + Planet ${location} has finished constructing or destroying buildings. + + + + + Empty military queues + + + Some of your planets have finished constructing ships: + + + + Empty military queue at ${location} + + + Planet ${location} has finished constructing ships. + + + + + Battle started at ${location} + + + {{battle:${battleId} Battle #${battleId}}} has started at ${location}. + + + + Battle ended at ${location} + + + {{battle:${battleId} Battle #${battleId}}} has ended at ${location}. + + + + + The citizens of ${location} are on strike + + + The citizens of ${location} are in a really bad mood and have started leaving their posts... We'd better do something about this. + + + + Situation back to normal on ${location} + + + The citizens of ${location} have resumed working. + + + + + Planet ${location} lost + + + We have lost control of ${location}, which was taken from us by ${taker}. + + + + Planet ${location} abandoned + + + Our forces have completed the evacuation of ${location}; the citizens of this world are left to fend for themselves. + + + + + Planet ${location} conquered + + + We have seized control of planet ${location} from the local (lack of) government. + + + We have seized control of planet ${location} from the clutches of ${owner}. + + + + + ${tech} available + + + A new technology, ${tech}, has been fully researched and is ready to be implemented. + + + Out of money!!!!11111 + + + With all due respect, what the hell were you thinking, Sir?! We are so poor we can't even pay for our fleets and buildings anymore! Some of your ministers are even considering prostituting themselves! + + + Economic situation resolved + + + Good to see that our money problems are over, Sir. Good job. Well, of course it'd been better if these problems had never started... Sir? What are you doing with this handgu- + + + + + Pending alliance request + + + ${empire} is requesting to join the alliance. + + + Alliance request accepted + + + Our request to join ${alliance} has been accepted!. + + + Alliance request rejected + + + Our request to join ${alliance} has been rejected. + + + Leadership change + + + ${leader} has stepped down as the alliance's leader. + + + Kicked! + + + We have been kicked out of ${alliance}. + + + ${empire} kicked + + + ${empire} has been kicked from the alliance. + + + ${empire} has left + + + ${empire} has left the alliance. + + + Alliance disbanded! + + + The leader has left and the alliance was disbanded. + + + + + Fleets have arrived at ${location} + + + The following fleet(s) have arrived at ${location}: + + + Fleets have left orbit at ${location} + + + The following fleet(s) have left orbit at ${location}: + + + Fleets mode change at ${location} + + + The following fleet(s) have changed mode at ${location}: + + + Fleets switched to attack at ${location} + + + Our fleets at ${location} have been forced to attack! + + + our unnamed fleet (power: ${power}) + + + our fleet named ${fleet} (power: ${power}) + + + a friendly, unnamed fleet (power: ${power}) owned by ${owner} + + + a friendly fleet named ${fleet} (power: ${power}) owned by ${owner} + + + a hostile, unnamed fleet (power: ${power}) owned by ${owner} + + + a hostile fleet named ${fleet} (power: ${power}) owned by ${owner} + + + - coming from ${source} + + + an unnamed fleet (power: ${power}) owned by ${owner} + + + a fleet named ${fleet} (power: ${power}) owned by ${owner} + + + : switched to attack + + + : switched to defence + + + + + You currently have ${warnings} warning(s). Please note that, upon reaching 3 warnings, the administration team will consider banning you. + + + Warning - planet name ${oldName} + + + This is an official warning from the Legacy Worlds moderation team. + +One of the planets you own, {{planet:${locationId} ${oldName}}}, had a name that was considered either vulgar, disrespectful or discriminating. + +The planet's name has been changed to ${newName}. + + + Warning - your empire '${oldName}' + + + This is an official warning from the Legacy Worlds moderation team. + +Your empire, ${oldName}, had a name that was considered either vulgar, disrespectful or discriminating. + +It was forcibly renamed to ${newName}. + + + Warning - your alliance '${oldName}' + + + This is an official warning from the Legacy Worlds moderation team. + +Your alliance, ${oldName}, had a name that was considered either vulgar, disrespectful or discriminating. + +It was disbanded. + + + + + Bug report #${id} updated + + + Bug report ${bug} has been updated by administrator ${submitter}. + + + Bug report ${bug} has been updated by the owner of empire ${submitter}. + + + + + + + + + + + + + + + + + + + + + +*** +De : ${from} +À : ${to} +Sujet : ${subject} + +${text} + + + + + * ${subject} + de ${from} + date/heure de réception ${time} + + + Messages privés : + + + Messages d'alliance : + + + Messages internes : + + + Messages des administrateurs : + + + + Technologies civiles + + + Ce ne sont pas uniquement vos esclaves, ce sont vos chercheurs, poètes et ouvriers. Faites travailler d'abord les poètes, puis utilisez ces technologies pour augmenter leur productivité! Poètes inutiles... + + + + Assembleurs universels + + + Vous savez ce que c'est d'avoir un truc à construire, alors que malheureusement vous ne diposez pas du bon outil. Eh bien, plus de peur : les Assembleurs Universels vont résoudre tous vos problèmes! Construisez tout et n'importe quoi avec ces machines intelligentes, elles sont 1337. + + + Réanimation de cadavres + + + Fatigué de ces ouvriers qui passent l'arme à gauche trop tôt? Vous voulez un peu plus de transpiration dans vos ateliers ? Les zombies vont travailler, ne vont pas se plaindre, et encore mieux ils peuvent être nourris avec n'importe quoi - y compris avec vos énemis! Mais surtout, utilisez les pour augmenter de manière significative la productivité de vos usines. + + + Générateurs biologiques + + + Pour chaque tourelle qu'un commandant militaire réclame, il en est une qu'il désire encore plus. Maintenant, vous aussi pouvez avoir de telles tourelles! Elles défendront vos planètes avec aisance, pendant que vous vous aventurerez dans la galaxie, la pliant à votre volonté. Disponible chez tous les bons quincaillers. + + + + Technologies militaires + + + Ceux qui ne comprennent pas les dommages que la guerre peut causer n'en comprendront jamais les avantages. - Sun Tzu + + + + Construction orbitale + + + Les vaisseaux construits à la surface doivent subir le stress du vol atmosphérique avant même d'être lancés à assaut du grand vide interstellaire. Construisez-les dans l'espace et ils seront plus gracieux, plus puissants, et ne nécessiteront plus de fenêtres. Utilisez vos tout nouveaux croiseurs pour dominer l'univers connu. + + + Consolidation structurelle + + + La puissance de vos croiseurs peut être augmentée par une conception améliorée! Profitez d'un véhicule à la structure mieux adaptée à l'espace qui peut mettre des empires à genoux grâce à sa vitesse et sa finesse technologique. + + + Docks orbitaux automatisés + + + La technologie a évolué. L'arme ultime est maintenant disponible. Revendiquez la puissance écrasante du cuirassé et pulvérisez vos opposants. Déjà rêvé d'un tank de l'espace ? Eh bien, maintenant, vous l'avez. All their base are belong to you. + + + + Fabrique de pièces de vaisseaux + + + Une fabrique de pièces de vaisseaux est une usine de production de masse pour la création des composants utilisés dans vos vaisseaux spatiaux. Elles sont essentielles à tout empire spatial ; bien gérées, elles produisent de nouveaux vaisseaux rapidement et efficacement. + + + Tourelle défensive + + + Explorer sans être sur ses gardes est une statégie de lunatique. Les tourelles défensives sont la dernière ligne de défense d'une planète, énormes armes capables de détruire des véhicules en orbite depuis le sol. Elles peuvent être placées n'importe où, sur n'importe quel bâtiment ou espace dégagé de votre domaine, et défendront vos planètes contre les attaques. + + + Ligne de production générique + + + Les usines sont l'épine dorsale d'une économie florissante, fournissant des biens et pièces détachées qui peuvent être vendues sur le marché. Vos Lignes de production génériques flambant neuves vont augmenter votre richesse et conserver votre population dans l'emploi. Des usines bien gérées fournissent de nombreux bénéfices économiques à un empire. + + + Centre de réanimation + + + Les humains sont frêles mais peu coûteux et les robots sont endurants mais très chers. Renouvelez la vie de vos travailleurs et vous pourrez tirer partie d'une ressource de zombies bon marché, vous permettant d'explorer une troisième voie pour conserver un empire florissant. + + + Tourelle biologique + + + L'union parfaite de l'homme et de la machine, les tourelles biologiques sont un mélange du technologique et du biologique pour fournir la défense ultime à vos planètes. Plus puissantes et précises que les tourelles, au niveau défense au sol, elles ne peuvent être surclassées. Mais gardez votre population à distance, car elles ont tendance à avoir faim de chair humaine! + + + + Chasseur + + + Donnez un pistolet à un adolescent et il deviendra un homme. Donnez un vaisseau à un homme et il dominera des planètes. Un chasseur est un vaisseau léger et rapide qui seul reste insignifiant mais en vaste horde peut devenir terrifiant. Déplacez les d'un bout à l'autre de la galaxie et vous aurez tout ce que vous désirez. + + + Croiseur + + + Un croisseur est un gros vaisseau compact mais puissant. Il dispose d'armes espace-espace et espace-sol, ainsi que d'un bon nombre de porte-gobelets. + + + Croiseur lourd + + + Un croiseur lourd est gros vaisseau plus rapide et plus racé qu'un croiseur. Il est bien plus rapide que son petit frère et embarque toujours assez d'armes pour en avoir pour son argent. Une addition pertinente à la flotte de tout seigneur de guerre. + + + Cuirassé + + + Amenez la cuirasse. Le cuirassé est un énorme vaisseau aux performances et à la puissance impressionantes, cher et lent, mais le nec plus ultra de la domination spatiale. + + + + Préférences d'affichage + + + Temps réel + + + Les durées seront affichées en utilisant de "vraies" mesures si cette option est sélectionnée. + + + Carte + + + Centre de la carte (X) + + + L'abscisse par défaut du centre de la carte. + + + Centre de la carte (Y) + + + L'ordonnée par défaut du centre de la carte. + + + Taille de la carte + + + La taille par défaut de la carte. + + + Envoi de courrier électronique + + + Messages privés + + + Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque d'autres empires vous envoient des messages privés. + + + Messages d'alliance + + + Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message d'alliance. + + + Messages internes + + + Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message interne du jeu. + + + Messages des administrateurs + + + Sélectionnez le type de notifications par courier électronique que vous recevrez lorsque vous recevez un message des administrateurs du jeu. + + + + Petite (3x3) + + + Moyenne (5x5) + + + Grande (7x7) + + + + Pas de notification + + + Inclure dans le récapitulatif + + + Notification immédiate + + + + + Ministère de l'Économie + + + Ministère de la Guerre + + + Ministère de la Paix + + + Ministère de la Recherche + + + L'Équipe de Legacy Worlds + + + Suivi de bugs + + + + + Listes de construction civiles vides + + + Certaines de vos planètes ont fini de construir ou détruire des bâtiments : + + + + Liste de construction civile sur ${location} + + + La planète ${location} a fini de construire ou détruire des bâtiments. + + + + + Listes de construction militaires vides + + + Certaines de vos planètes ont fini de construire des vaisseaux : + + + + Liste de construction militaire vide sur ${location} + + + La planète ${location} a fini de construire des vaisseaux. + + + + + Bataille commencée sur ${location} + + + {{battle:${battleId} La bataille #${battleId}}} a commencé sur ${location}. + + + + Bataille terminée sur ${location} + + + {{battle:${battleId} La bataille #${battleId}}} s'est terminée sur ${location}. + + + + + Les habitants de ${location} sont en grève + + + Les habitants de ${location} sont de très mauvaise humeur et ont commencé à quitter leurs postes... Nous devrions faire quelque chose à ce sujet. + + + + Situation revenue à la normale sur ${location} + + + Les habitants de ${location} sont de retour au travail. + + + + + Perte de la planète ${location} + + + Nous avons perdu le contrôle de ${location}, qui nous a été prise par ${taker}. + + + + Abandon de la planète ${location} + + + Nos forces ont terminé l'évacutation de ${location}; les habitants de ce monde sont livrés à eux-mêmes. + + + + + Conquête de la planète${location} + + + Nous avons pris le contrôle de la planète ${location} des mains de l'(absence de) gouvernement local. + + + Nous avons pris le contrôle de la planète ${location} des griffes de ${owner}. + + + + + ${tech} disponible + + + Une nouvelle technologie, ${tech}, a été complétement recherchée et est prête à être appliquée. + + + Fauché!!!!11111 + + + Respectueusement, à quoi vous donc vous avez bien pu penser, Chef?! Nous sommes si pauvres que nous ne pouvons même plus payer la maintenance de nos flottes et bâtiments! Certains de vos ministres envisagent même de se prostituer! + + + Amélioration de la situation économique + + + C'est bon de voir que nos problèmes d'argent sont résolus, Chef. Bien joué. Bien sûr, ça aurait été mieux si ces problèmes n'avaient jamais eu lieu... Chef, qu'est ce que vous faites avec ce pistol- + + + + + Demande d'alliance en attente + + + ${empire} demande à joindre l'alliance. + + + Demande d'alliance acceptée + + + Notre demande de joindre ${alliance} a été acceptée. + + + Demande d'alliance rejetée + + + Notre demande de joindre ${alliance} a été rejetée. + + + Changement de direction + + + ${leader} s'est retiré de sa position de dirigeant de l'alliance. + + + Expulsé! + + + Nous avons été expulsés de ${alliance}. + + + ${empire} expulsé + + + ${empire} a été expulsé de l'alliance. + + + Départ de ${empire} + + + ${empire} a quitté alliance. + + + Alliance dissoute! + + + Le dirigeant est parti et l'alliance a été dissoute. + + + + + Arrivée de flottes sur ${location} + + + La(les) flotte(s) suivante(s) est(sont) arrivée(s) sur ${location}: + + + Des flottes ont quitté l'orbite de ${location} + + + La(les) flotte(s) suivante(s) a(ont) quitté l'orbite de ${location}: + + + Changement de mode de flottes sur ${location} + + + La(les) flotte(s) suivante(s) a(ont) changé de mode sur ${location}: + + + Des flottes sont passées en attaque sur ${location} + + + Nos flottes sur ${location} ont été forcées d'attaquer! + + + notre flotte sans nom (puissance : ${power}) + + + notre flotte nommée ${fleet} (puissance : ${power}) + + + une flotte alliées sans nom (puissance : ${power}) possédée par ${owner} + + + une flotte alliée nommée ${fleet} (puissance : ${power}) possédée par ${owner} + + + une flotte hostile sans nom (puissance : ${power}) possédée par ${owner} + + + une flotte hostile nommée ${fleet} (puissance : ${power}) possédée par ${owner} + + + - venant de ${source} + + + une flotte sans nom (puissance : ${power}) possédée par ${owner} + + + une flotte nommée ${fleet} (puissance : ${power}) possédée par ${owner} + + + : est passée en attaque + + + : est passée en défensee + + + + + Vous avez actuellement ${warnings} avertissement(s). Veuillez noter que, lorsque vous atteindrez 3 avertissements, l'équipe d'administration va envisager votre expulsion. + + + Avertissement - nom de planète ${oldName} + + + Ceci est un avertissement officiel de l'équipe de modération de Legacy Worlds. + +Une des planètes que vous possédez, {{planet:${locationId} ${oldName}}}, avait un nom qui a été considéré comme vulgaire, irrespectueux ou disciminatoire. + +Le nom de la planète a été changé en ${newName}. + + + Avertissement - votre empire '${oldName}' + + + Ceci est un avertissement officiel de l'équipe de modération de Legacy Worlds. + +Votre empire, ${oldName}, avait un nom qui a été considéré comme vulgaire, irrespectueux ou disciminatoire. + +Il a été changé de force en ${newName}. + + + Avertissement - votre alliance '${oldName}' + + + Ceci est un avertissement officiel de l'équipe de modération de Legacy Worlds. + +Votre alliance, ${oldName}, avait un nom qui a été considéré comme vulgaire, irrespectueux ou disciminatoire. + +Elle a été dissoute. + + + + + Rapport de bug #${id} mis à jour + + + Le rapport de bug ${bug} a été mis à jour par l'administrateur ${submitter}. + + + Le rapport de bug ${bug} a été mis à jour par le propriétaire de l'empire ${submitter}. + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xsd b/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xsd new file mode 100644 index 0000000..8f8932d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/i18n-text.xsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-en.txt new file mode 100644 index 0000000..d628f44 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-en.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Inactive account closed +Hello, + +This email is being sent to inform you that your account on Legacy Worlds has been disabled. It had been inactive for 28 days. + +You can reactivate your account by logging in to the Legacy Worlds web site using your e-mail address and password. + +We hope to see you again very soon on Legacy Worlds. + +Best regards, +The Legacy Worlds staff diff --git a/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-fr.txt new file mode 100644 index 0000000..7441c8b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/inactivityQuitMail-fr.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Fermeture de compte inactif +Bonjour, + +Ce message vous a été envoyé pour vous prévenir que votre compte sur Legacy Worlds a été désactivé. Il a été inactif pendant 28 jours. + +Vous pourrez réactiver votre compteen vous connectant sur le site Web de Legacy Worlds en utilisant votre adresse e-mail et votre mot de passe. + +Nous espérons vous revoir un jour sur Legacy Worlds. + +Cordialement, +L'équipe de Legacy Worlds diff --git a/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-en.txt new file mode 100644 index 0000000..add97f3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-en.txt @@ -0,0 +1,9 @@ +Legacy Worlds (B6M1) - Inactivity +Hello, + +This email is being sent to warn you that your account on Legacy Worlds has been inactive for the past three weeks. Unless you connect in the coming week, it will be closed and your empire will be lost. + +We hope to see you again on Legacy Worlds. + +Best regards, +The Legacy Worlds staff diff --git a/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-fr.txt new file mode 100644 index 0000000..d2e8f27 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/inactivityWarningMail-fr.txt @@ -0,0 +1,9 @@ +Legacy Worlds (B6M1) - Inactivité +Bonjour, + +Ce message vous a été envoyé pour vous prévenir que votre compte sur Legacy Worlds a été inactif pendant les trois dernières semaines. À moins que vous vous connectiez durant la semaine procahine, il sera fermé et votre empire sera perdu. + +Nous espérons vous revoir un jour sur Legacy Worlds. + +Cordialement, +L'équipe de Legacy Worlds diff --git a/legacyworlds-server/legacyworlds-server-main/data/messageMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/messageMail-en.txt new file mode 100644 index 0000000..299b5c3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/messageMail-en.txt @@ -0,0 +1,10 @@ +Legacy Worlds (B6M1) - New messages +Hello ${empire}, + +You have just received new messages in Legacy Worlds. + +${messages} +*** + +You will not receive message notifications for the next hour. +If you want to stop receiving these e-mail messages completely, please log on to Legacy Worlds and modify your e-mail settings from the "Account" page. \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/messageMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/messageMail-fr.txt new file mode 100644 index 0000000..d31af22 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/messageMail-fr.txt @@ -0,0 +1,10 @@ +Legacy Worlds (B6M1) - Nouveaux messages +Bonjour ${empire}, + +Vous venez de recevoir de nouveaux messages sur Legacy Worlds! + +${messages} +*** + +Vous ne recevrez pas de nouvelle notification de message pendant une heure. +Si vous souhaitez ne plus recevoir ces courriers électroniques, veuillez vous connecter à Legacy Worlds et modifier vos préférences de notification depuis la page "Compte". \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-en.txt new file mode 100644 index 0000000..d7cf79b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-en.txt @@ -0,0 +1,19 @@ +Legacy Worlds (B6M1) password recovery +Hello, + +You are receiving this message because an user of Legacy Worlds (you, presumably) requested to recover his password. +In order to define a new password for your account, please go to the password recovery page and fill in the following information: +- your e-mail address +- the recovery code provided below +- the new password and its confirmation + +Please note that this recovery code is NOT your new password, and you will only need to use it once. +Moreover this code will be valid during a one hour interval. Don't wait too long! + +Your address is: ${address} +Your recovery code is: ${token} + +If you are having problems performing this operation, please contact a member of our support staff at staff@legacyworlds.com + +Thanks! +The Legacy Worlds staff \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-fr.txt new file mode 100644 index 0000000..94bc15e --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/passwordRecoveryMail-fr.txt @@ -0,0 +1,19 @@ +Legacy Worlds (B6M1) - Récupération de mot de passe +Bonjour, + +Vous avez reçu ce message car un utilisateur de Legacy Worlds (vous, probablement) a demandé à récupérer son mot de passe oublié. +Afin de définir un nouveau mot de passe pour votre compte, veuillez vous rendre sur le page de récupération de mot de passe et saisir : +- votre adresse e-mail +- le code de récupération fourni ci-dessous +- le nouveau mot de passe et sa confirmation + +Attention, ce code de récupération n'est PAS votre nouveau mot de passe, vous n'en aurez besoin qu'une seule fois. +De plus, ce code sera valide pendant un intervalle de temps d'une heure. Ne tardez pas trop! + +Votre adresse : ${address} +Votre code de récupération : ${token} + +Si vous éprouvez des difficultés pour mener à bien cette opération, veuillez contacter notre équipe par courrier électronique: staff@legacyworlds.com + +Cordialement, +L'équipe de Legacy Worlds \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/quitMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/quitMail-en.txt new file mode 100644 index 0000000..8f379e7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/quitMail-en.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Account closed +Hello, + +This email is being sent to confirm that your account has been closed as you requested. + +For the next six months, you will be able to reactivate your account by logging in to the Legacy Worlds web site using your address and password. Past this delay, your account will be completely deleted. + +We hope to see you again sometime on Legacy Worlds. + +Best regards, +The Legacy Worlds staff diff --git a/legacyworlds-server/legacyworlds-server-main/data/quitMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/quitMail-fr.txt new file mode 100644 index 0000000..2788e38 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/quitMail-fr.txt @@ -0,0 +1,11 @@ +Legacy Worlds (B6M1) - Compte désactivé +Bonjour, + +Cet e-mail vous est envoyé pour confirmer que votre compte a été fermé à votre demande. + +Pendant les six mois à venir, vous pourrez le réactiver en vous connectant sur le site Web de Legacy Worlds en utilisant votre adresse e-mail et votre mot de passe. passé ce délai, votre compte sera complètement effacé. + +Nous espérons vous revoir un jour sur Legacy Worlds. + +Cordialement, +L'équipe de Legacy Worlds \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-en.txt new file mode 100644 index 0000000..c0176e0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-en.txt @@ -0,0 +1,17 @@ +Legacy Worlds (B6M1) - Account reactivation +Hello, + +Thank you for revisiting at Legacy Worlds! +Please note that you reactivated your account for "Beta 6 Milestone 1", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news. + +Before we reactivate your account, there's just one more step to complete your request. +You have to connect to the site using your e-mail address and password, then validate your account reactivation using the confirmation code below. +Please note that this confirmation code is NOT your password, and you will only need to use it once. + +Your registration address is: ${address} +Your confirmation code is: ${token} + +If you are having problems reactivating your account, please contact a member of our support staff at staff@legacyworlds.com + +Thanks! +The Legacy Worlds staff \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-fr.txt new file mode 100644 index 0000000..3a97e3c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/reactivationMail-fr.txt @@ -0,0 +1,17 @@ +Legacy Worlds (B6M1) - Réactivation de votre compte +Bonjour, + +Merci de revenir sur Legacy Worlds! +Veuillez remarquer que vous venez de réactiver un compte sur le jeu "Beta 6 Milestone 1", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles. + +Avant que nous réactivions votre compte, il vous reste une dernière étape à accomplir. +Vous allez devoir vous connecter au site en utilisant votre adresse électronique et votre mot de passe, puis valider la réactivation de votre compte en saisissant le code de confirmation ci-dessous. +Attention, ce code n'est PAS votre mot de passe, vous n'en aurez besoin qu'une seule fois. + +Votre adresse d'enregistrement est: ${address} +Votre code de confirmation code est: ${token} + +Si vous éprouvez des difficultés lors de cette étape, veuillez contacter notre équipe par courier électronique: staff@legacyworlds.com + +Cordialement, +L'équipe de Legacy Worlds \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/recapMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/recapMail-en.txt new file mode 100644 index 0000000..c72810f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/recapMail-en.txt @@ -0,0 +1,8 @@ +Legacy Worlds (B6M1) - Today's messages +Hello ${empire}, + +Here is a reminder of the messages you received today. + +${messages} + +If you want to stop receiving these e-mail messages completely, please log on to Legacy Worlds and modify your e-mail settings from the "Account" page. \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/recapMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/recapMail-fr.txt new file mode 100644 index 0000000..641f2d7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/recapMail-fr.txt @@ -0,0 +1,8 @@ +Legacy Worlds (B6M1) - Messages du jour +Bonjour ${empire}, + +Voici un récapitulatif des messages que vous avez reçu aujourd'hui. + +${messages} + +Si vous souhaitez ne plus recevoir ces courriers électroniques, veuillez vous connecter à Legacy Worlds et modifier vos préférences de notification depuis la page "Compte". \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/registrationMail-en.txt b/legacyworlds-server/legacyworlds-server-main/data/registrationMail-en.txt new file mode 100644 index 0000000..e91d215 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/registrationMail-en.txt @@ -0,0 +1,17 @@ +Legacy Worlds (B6M1) - Your account +Hello, + +Thank you for registering at Legacy Worlds! +Please note that you registered to "Beta 6 Milestone 1", a highly experimental, in-progress rewrite of the game. As this game does not include forums at this stage, you might want to register to Legacy Worlds Beta 5 to keep up with the game's news. + +Before we activate your account, there's just one more step to complete your registration. +You have to connect to the site using the e-mail address and password you chose, then validate your account using the confirmation code below. +Please note that this confirmation code is NOT your password, and you will only need to use it once. + +Your registration address is: ${address} +Your confirmation code is: ${validationKey} + +If you are having problems signing up, please contact a member of our support staff at staff@legacyworlds.com + +Thanks! +The Legacy Worlds staff \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/registrationMail-fr.txt b/legacyworlds-server/legacyworlds-server-main/data/registrationMail-fr.txt new file mode 100644 index 0000000..a6bc7bf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/registrationMail-fr.txt @@ -0,0 +1,17 @@ +Legacy Worlds (B6M1) - Votre compte +Bonjour, + +Merci de vous être enregistré(e) sur Legacy Worlds! +Veuillez remarquer que vous venez de créer un compte sur le jeu "Beta 6 Milestone 1", une récriture en cours et par conséquent hautement expérimentale du jeu. Comme cette version ne dispose pas de forums à l'heure actuelle, nous vous suggérons de vous enregistrer également à Legacy Worlds Beta 5 afin de vous tenir au courant des dernières nouvelles. + +Avant que nous activions votre compte, il vous reste une dernière étape à accomplir. +Vous allez devoir vous connecter au site en utilisant l'adresse électronique et le mot de passe que vous avez choisi, puis valider votre compte en saisissant le code de confirmation ci-dessous. +Attention, ce code n'est PAS votre mot de passe, vous n'en aurez besoin qu'une seule fois. + +Votre adresse d'enregistrement est: ${address} +Votre code de confirmation code est: ${validationKey} + +Si vous éprouvez des difficultés lors de cette étape, veuillez contacter notre équipe par courier électronique: staff@legacyworlds.com + +Cordialement, +L'équipe de Legacy Worlds \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/techs-test.xml b/legacyworlds-server/legacyworlds-server-main/data/techs-test.xml new file mode 100644 index 0000000..f2b8f44 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/techs-test.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/techs.xml b/legacyworlds-server/legacyworlds-server-main/data/techs.xml new file mode 100644 index 0000000..aef6fc6 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/techs.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/data/techs.xsd b/legacyworlds-server/legacyworlds-server-main/data/techs.xsd new file mode 100644 index 0000000..84698c3 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/data/techs.xsd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/hibernate.xml b/legacyworlds-server/legacyworlds-server-main/hibernate.xml new file mode 100644 index 0000000..03001ba --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/hibernate.xml @@ -0,0 +1,25 @@ + + + + + + + + + org.hibernate.dialect.HSQLDialect + 0 + true + true + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/pom.xml b/legacyworlds-server/legacyworlds-server-main/pom.xml new file mode 100644 index 0000000..6774468 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/pom.xml @@ -0,0 +1,127 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-main + 5.99.1 + Legacy Worlds server + Server main classes and JAR builder. + + + + legacyworlds-server-beans-accounts + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-bt + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-eventlog + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-i18n + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-mailer + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-naming + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-simple + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-system + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-user + com.deepclone.lw + ${project.version} + + + + com.thoughtworks.xstream + xstream + ${com.thoughtworks.xstream.version} + jar + + + + postgresql + postgresql + 8.4-701.jdbc4 + jar + runtime + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + default-jar + package + + jar + + + + + com.deepclone.lw.Main + true + lib + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + false + false + true + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/Main.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/Main.java new file mode 100644 index 0000000..3132a03 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/Main.java @@ -0,0 +1,149 @@ +package com.deepclone.lw; + + +import java.util.Arrays; + +import com.deepclone.lw.cli.CLITool; +import com.deepclone.lw.cli.ToolBase; +import com.deepclone.lw.srv.Server; + + + +public class Main + implements Runnable +{ + private String dataSource = "data-source.xml"; + private int port = 9137; + private int servPort = 9138; + private String tool = null; + private String toolOptions[] = { }; + private ToolBase toolInstance; + + + public Main( String[] args ) + { + this.parseArguments( args ); + + if ( this.tool != null ) { + this.toolInstance = CLITool.create( this.tool ); + } else { + this.toolInstance = new Server( ); + } + + if ( this.toolInstance == null ) { + System.err.println( "tool " + this.tool + " not found" ); + System.exit( -1 ); + } + + this.toolInstance.setMainSettings( this.dataSource , this.port , this.servPort ); + if ( !this.toolInstance.setOptions( this.toolOptions ) ) { + System.err.println( "invalid tool options (" + Arrays.asList( this.toolOptions ) + ")" ); + System.exit( -1 ); + } + } + + + @Override + public void run( ) + { + this.toolInstance.run( ); + System.gc( ); + System.exit( 0 ); + } + + + private void parseArguments( String[] args ) + { + int state = 0; + for ( int i = 0 ; i < args.length ; i++ ) { + switch ( state ) { + case 0: + state = this.parseNextOption( args[ i ] ); + break; + case 1: + this.dataSource = args[ i ]; + state = 0; + break; + case 2: + this.port = this.getPort( args[ i ] ); + state = 0; + break; + case 3: + this.servPort = this.getPort( args[ i ] ); + state = 0; + break; + case 4: + this.tool = args[ i ]; + state = 300; + break; + case 300: + if ( args[ i ].startsWith( "--" ) ) { + i--; + } else if ( !args[ i ].equals( "" ) ) { + this.toolOptions = args[ i ].split( "\\s+" ); + } + state = 0; + break; + } + } + + if ( state % 100 != 0 || this.port == this.servPort ) { + this.printCommandLine( ); + } + } + + + private int parseNextOption( String arg ) + { + if ( "--data-source".equals( arg ) ) { + return 1; + } else if ( "--server-port".equals( arg ) ) { + return 2; + } else if ( "--service-port".equals( arg ) ) { + return 3; + } else if ( "--run-tool".equals( arg ) ) { + return 4; + } + this.printCommandLine( ); + return -1; + } + + + private int getPort( String arg ) + { + int port; + try { + port = Integer.parseInt( arg ); + } catch ( NumberFormatException e ) { + port = 0; + } + if ( port < 1 || port > 65535 ) { + this.printCommandLine( ); + return -1; + } + return port; + } + + + private void printCommandLine( ) + { + System.err.println( "Legacy Worlds beta 6 - Game server and command line tools" ); + System.err.println( ); + System.err.println( " Command line options:" ); + System.err.println( " --data-source Data source configuration file (default: " + + this.dataSource + ")" ); + System.err.println( " --run-tool Command line tool to run (default: none)" ); + System.err.println( " --server-port RMI registry port number (default: " + this.port + ")" ); + System.err.println( " --service-port RMI service port number (default: " + this.servPort + ")" ); + System.err.println( ); + + System.exit( -1 ); + } + + + public static void main( String[] args ) + { + new Main( args ).run( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CLITool.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CLITool.java new file mode 100644 index 0000000..d209760 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CLITool.java @@ -0,0 +1,106 @@ +package com.deepclone.lw.cli; + + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.remoting.rmi.RmiProxyFactoryBean; + + + +public abstract class CLITool + extends ToolBase +{ + + private String makeRmiUrl( String service ) + { + return "rmi://localhost:" + this.getRmiPort( ) + "/" + service; + } + + + private void addRMIClient( GenericApplicationContext context , String service , String iface ) + { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition( RmiProxyFactoryBean.class ); + builder.setScope( BeanDefinition.SCOPE_PROTOTYPE ); + builder.addPropertyValue( "serviceInterface" , iface ); + builder.addPropertyValue( "serviceUrl" , this.makeRmiUrl( service ) ); + context.registerBeanDefinition( service , builder.getBeanDefinition( ) ); + } + + + protected ApplicationContext createClientContext( String... configurationFiles ) + { + return this.createClientContext( null , configurationFiles ); + } + + + protected ApplicationContext createClientContext( Map< String , String > rmiServices ) + { + return this.createClientContext( rmiServices , (String[]) null ); + } + + + protected ApplicationContext createClientContext( Map< String , String > rmiServices , String... configurationFiles ) + { + if ( rmiServices == null ) { + return new ClassPathXmlApplicationContext( configurationFiles , true ); + } + + GenericApplicationContext context = new GenericApplicationContext( ); + for ( Map.Entry< String , String > rmiService : rmiServices.entrySet( ) ) { + this.addRMIClient( context , rmiService.getKey( ) , rmiService.getValue( ) ); + } + context.refresh( ); + if ( configurationFiles == null ) { + return context; + } + return new ClassPathXmlApplicationContext( configurationFiles , true , context ); + } + + + public static ToolBase create( String tool ) + { + String cName = "com.deepclone.lw.cli." + tool; + Class< ? > toolClass; + Object o; + + try { + toolClass = Class.forName( cName ); + } catch ( ClassNotFoundException e ) { + return null; + } + + try { + o = toolClass.newInstance( ); + } catch ( Exception e ) { + return null; + } + + if ( ! ( o instanceof CLITool ) ) { + return null; + } + + return (ToolBase) o; + } + + + protected static String getLine( ) + { + BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) ); + do { + try { + return stdin.readLine( ); + } catch ( IOException e ) { + e.printStackTrace( ); + } + } while ( true ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateSuperuser.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateSuperuser.java new file mode 100644 index 0000000..4c92d2b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateSuperuser.java @@ -0,0 +1,132 @@ +package com.deepclone.lw.cli; + + +import java.sql.Types; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.utils.StoredProc; + + + +public class CreateSuperuser + extends CLITool +{ + private final Logger logger = Logger.getLogger( CreateSuperuser.class ); + + private String address; + private String appearAs; + private TransactionTemplate tTemplate; + private StoredProc fCreateAdmin; + + + private ClassPathXmlApplicationContext getContext( ) + { + // Load data source and Hibernate properties + String[] dataConfig = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load transaction manager bean + String[] cfg = { + "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void getBeans( ApplicationContext ctx ) + { + DataSource dSource = ctx.getBean( DataSource.class ); + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + + this.tTemplate = new TransactionTemplate( tManager ); + + this.fCreateAdmin = new StoredProc( dSource , "admin" , "create_admin" ); + this.fCreateAdmin.addParameter( "address" , Types.VARCHAR ); + this.fCreateAdmin.addParameter( "appear_as" , Types.VARCHAR ); + this.fCreateAdmin.addParameter( "privileges" , Types.INTEGER ); + this.fCreateAdmin.addOutput( "err_code" , Types.INTEGER ); + this.fCreateAdmin.addOutput( "admin_id" , Types.INTEGER ); + } + + + @Override + public void run( ) + { + AbstractApplicationContext ctx = this.getContext( ); + this.getBeans( ctx ); + this.createAdmin( ); + } + + + private void createAdmin( ) + { + int id; + try { + id = this.tTemplate.execute( new TransactionCallback< Integer >( ) { + @Override + public Integer doInTransaction( TransactionStatus status ) + { + return doCreateAdmin( ); + } + } ); + } catch ( RuntimeException e ) { + this.logger.error( "administrator creation failed: " + e.getMessage( ) ); + return; + } + this.logger.info( "Administrator created with identifier #" + id ); + } + + + private int doCreateAdmin( ) + { + Map< String , Object > result; + result = this.fCreateAdmin.execute( this.address , this.appearAs , Privileges.SUPER.getBits( ) ); + + int errCode = (Integer) result.get( "err_code" ); + switch ( errCode ) { + case 0: + break; + case 1: + throw new RuntimeException( "unknown e-mail address " + this.address ); + case 2: + throw new RuntimeException( "user with e-mail address " + this.address + " has an invalid status" ); + case 3: + throw new RuntimeException( "administrator name " + this.appearAs + " is already in use" ); + case 4: + throw new RuntimeException( "user with e-mail address " + this.address + " is already an administrator" ); + default: + throw new RuntimeException( "unknown error code " + errCode ); + } + + return (Integer) result.get( "admin_id" ); + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length == 2 ) { + this.address = options[ 0 ]; + this.appearAs = options[ 1 ]; + return true; + } + return false; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateUser.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateUser.java new file mode 100644 index 0000000..77bc8f5 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/CreateUser.java @@ -0,0 +1,168 @@ +package com.deepclone.lw.cli; + + +import java.sql.Types; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.utils.EmailAddress; +import com.deepclone.lw.utils.Password; +import com.deepclone.lw.utils.StoredProc; + + + +public class CreateUser + extends CLITool +{ + + private boolean query; + private String mailAddress; + private String password; + private String language; + + private String pSha1; + private String pMd5; + + private TransactionTemplate tTemplate; + private StoredProc fCreateUser; + + + private ClassPathXmlApplicationContext getContext( ) + { + // Load data source and Hibernate properties + String[] dataConfig = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load transaction manager bean + String[] cfg = { + "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void getBeans( ApplicationContext ctx ) + { + DataSource dSource = ctx.getBean( DataSource.class ); + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + + this.tTemplate = new TransactionTemplate( tManager ); + + this.fCreateUser = new StoredProc( dSource , "users" , "create_inactive_account" ); + this.fCreateUser.addParameter( "address" , Types.VARCHAR ); + this.fCreateUser.addParameter( "lang_id" , Types.VARCHAR ); + this.fCreateUser.addParameter( "pass_md5" , Types.VARCHAR ); + this.fCreateUser.addParameter( "pass_sha1" , Types.VARCHAR ); + this.fCreateUser.addOutput( "err_code" , Types.INTEGER ); + this.fCreateUser.addOutput( "a_id" , Types.INTEGER ); + } + + + private void queryUser( ) + { + System.out.println( "User creation - E-mail address: " ); + this.mailAddress = CLITool.getLine( ); + System.out.println( "User creation - Password: " ); + this.password = CLITool.getLine( ); + System.out.println( "User creation - Language ID: " ); + this.language = CLITool.getLine( ); + } + + + private boolean validate( ) + { + EmailAddress addr = new EmailAddress( this.mailAddress ); + if ( !addr.isValid( ) ) { + System.err.println( "Invalid mail address" ); + return false; + } + this.mailAddress = addr.getAddress( ); + + Password pwd = new Password( this.password ); + if ( pwd.getStrength( ) < 10 ) { + System.err.println( "Weak password" ); + return false; + } + this.pSha1 = pwd.getSha1( ); + this.pMd5 = pwd.getMd5( ); + + return true; + } + + + private Map< String , Object > createAccount( ) + { + return this.tTemplate.execute( new TransactionCallback< Map< String , Object > >( ) { + @Override + public Map< String , Object > doInTransaction( TransactionStatus status ) + { + return fCreateUser.execute( mailAddress , language , pMd5 , pSha1 ); + } + } ); + } + + + @Override + public void run( ) + { + if ( this.query ) { + this.queryUser( ); + } + if ( !this.validate( ) ) { + return; + } + + AbstractApplicationContext ctx = this.getContext( ); + this.getBeans( ctx ); + + Map< String , Object > m = this.createAccount( ); + int errCode = (Integer) m.get( "err_code" ); + switch ( errCode ) { + case 0: + System.out.println( "Account #" + (Integer) m.get( "a_id" ) + " created." ); + break; + case -1: + System.err.println( "Address in use" ); + break; + case -2: + System.err.println( "Invalid language" ); + break; + } + + ToolBase.destroyContext( ctx ); + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length == 0 ) { + this.query = true; + return true; + } + + if ( options.length == 3 ) { + this.query = false; + this.mailAddress = options[ 0 ]; + this.password = options[ 1 ]; + this.language = options[ 2 ]; + return true; + } + + return false; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ExportDB.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ExportDB.java new file mode 100644 index 0000000..488d63a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ExportDB.java @@ -0,0 +1,176 @@ +package com.deepclone.lw.cli; + + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.cli.dbexport.BugEventMapper; +import com.deepclone.lw.cli.dbexport.BugGroup; +import com.deepclone.lw.cli.dbexport.LegacyWorldsDB; +import com.deepclone.lw.cli.dbexport.UserMapper; +import com.thoughtworks.xstream.XStream; + + + +public class ExportDB + extends CLITool +{ + + private final String sGetUsers = "SELECT ul.* , al.administrator_id , al.name AS administrator_name , al.privileges , al.pass_sha1 AS administrator_sha1 , al.pass_md5 AS administrator_md5 " + + "FROM admin.users_list ul LEFT OUTER JOIN admin.admins_view al on al.account_id = ul.id " + + "WHERE ul.status IN ('ACTIVE' , 'VACATION' , 'START_VACATION' ) OR ( ul.game_credits > 0 AND ul.status <> 'BANNED' ) OR ( al IS NOT NULL AND al.active )"; + + private final String sListGroupEvents = "SELECT group_id , event_id FROM bugs.br_first_report INNER JOIN bugs.br_status USING( group_id ) INNER JOIN bugs.events USING( group_id ) " + + "WHERE status <> 'NOT_A_BUG' ORDER BY group_id"; + + private final String sGetBugEvents = "SELECT be.* , asd.account_status FROM bugs.br_first_report INNER JOIN bugs.br_status s USING( group_id ) INNER JOIN bugs.br_events be USING( bug_report_id ) " + + "LEFT OUTER JOIN bugs.account_status_data asd USING (event_id) WHERE s.status <> 'NOT_A_BUG' ORDER BY event_id"; + + private static class LongPair + { + public long id1; + public long id2; + } + + private static class LongPairMapper + implements RowMapper< LongPair > + { + + @Override + public LongPair mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + LongPair lp = new LongPair( ); + lp.id1 = rs.getLong( 1 ); + lp.id2 = rs.getLong( 2 ); + return lp; + } + + } + + private File file; + private TransactionTemplate tTemplate; + private SimpleJdbcTemplate dTemplate; + + + private ClassPathXmlApplicationContext createContext( ) + { + // Load data source + String[] dataConfig = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load transaction manager bean + String[] cfg = { + "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void prepareDataAccess( AbstractApplicationContext ctx ) + { + DataSource dSource = ctx.getBean( DataSource.class ); + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + + this.tTemplate = new TransactionTemplate( tManager ); + this.dTemplate = new SimpleJdbcTemplate( dSource ); + } + + + @Override + public void run( ) + { + AbstractApplicationContext ctx = this.createContext( ); + this.prepareDataAccess( ctx ); + + LegacyWorldsDB db = this.tTemplate.execute( new TransactionCallback< LegacyWorldsDB >( ) { + @Override + public LegacyWorldsDB doInTransaction( TransactionStatus status ) + { + return readDB( ); + } + } ); + + this.writeFile( db ); + } + + + private LegacyWorldsDB readDB( ) + { + LegacyWorldsDB db = new LegacyWorldsDB( ); + db.users = this.dTemplate.query( sGetUsers , new UserMapper( ) ); + db.bugReports.groups = this.readBugGroups( ); + db.bugReports.events = this.dTemplate.query( sGetBugEvents , new BugEventMapper( ) ); + return db; + } + + + private List< BugGroup > readBugGroups( ) + { + List< BugGroup > groups = new ArrayList< BugGroup >( ); + Long prevGroupId = null; + BugGroup current = null; + + for ( LongPair lp : this.dTemplate.query( sListGroupEvents , new LongPairMapper( ) ) ) { + if ( prevGroupId == null || lp.id1 != prevGroupId ) { + prevGroupId = lp.id1; + current = new BugGroup( ); + groups.add( current ); + } + current.events.add( lp.id2 ); + } + + return groups; + } + + + private void writeFile( LegacyWorldsDB db ) + { + XStream xStream = new XStream( ); + xStream.autodetectAnnotations( true ); + + FileWriter file; + try { + file = new FileWriter( this.file ); + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + xStream.toXML( db , file ); + try { + file.close( ); + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length != 1 ) { + return false; + } + this.file = new File( options[ 0 ] ); + return true; + } +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportBuildables.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportBuildables.java new file mode 100644 index 0000000..ab27ed1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportBuildables.java @@ -0,0 +1,316 @@ +package com.deepclone.lw.cli; + + +import java.io.*; +import java.sql.Types; +import java.util.List; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.sqld.game.BuildingOutputType; +import com.deepclone.lw.utils.StoredProc; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +public class ImportBuildables + extends CLITool +{ + private final Logger logger = Logger.getLogger( ImportBuildables.class ); + + @SuppressWarnings( "serial" ) + @XStreamAlias( "buildables" ) + public static class BuildablesData + implements Serializable + { + @XStreamImplicit + public List< BuildableData > buildables; + } + + @SuppressWarnings( "serial" ) + public static abstract class BuildableData + implements Serializable + { + @XStreamAsAttribute + public String name; + + @XStreamAsAttribute + public String description; + + public CostData cost; + + public TechData tech; + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "cost" ) + public static class CostData + implements Serializable + { + @XStreamAsAttribute + public int build; + + @XStreamAsAttribute + public int upkeep; + + @XStreamAsAttribute + public int work; + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "tech" ) + public static class TechData + implements Serializable + { + @XStreamAsAttribute + public String name; + + @XStreamAsAttribute + public int level; + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "building" ) + public static class BuildingData + extends BuildableData + { + @XStreamAsAttribute + public BuildingOutputType type; + + @XStreamAsAttribute + public int output; + + @XStreamAsAttribute + public int workers; + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "ship" ) + public static class ShipData + extends BuildableData + { + @XStreamAsAttribute + public int time; + + @XStreamAsAttribute + public int power; + } + + private File file; + private TransactionTemplate tTemplate; + private StoredProc uocBuildingNoDep; + private StoredProc uocBuildingDep; + private StoredProc uocShipNoDep; + private StoredProc uocShipDep; + + + private XStream initXStream( ) + { + XStream xstream = new XStream( ); + xstream.processAnnotations( BuildablesData.class ); + xstream.processAnnotations( BuildingData.class ); + xstream.processAnnotations( ShipData.class ); + return xstream; + } + + + private BuildablesData loadData( ) + { + FileInputStream fis; + try { + fis = new FileInputStream( this.file ); + } catch ( FileNotFoundException e ) { + return null; + } + + try { + XStream xstream = this.initXStream( ); + return (BuildablesData) xstream.fromXML( fis ); + } catch ( Exception e ) { + e.printStackTrace( ); + return null; + } finally { + try { + fis.close( ); + } catch ( IOException e ) { + // EMPTY + } + } + } + + + private ClassPathXmlApplicationContext createContext( ) + { + // Load data source + String[] dataConfig = { + this.getDataSource( ) + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load Hibernate bean + String[] cfg = { + "configuration/context-configuration.xml" , "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void createTemplates( ApplicationContext ctx ) + { + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + this.tTemplate = new TransactionTemplate( tManager ); + + DataSource dataSource = ctx.getBean( DataSource.class ); + + this.uocBuildingNoDep = new StoredProc( dataSource , "tech" , "uoc_building" ); + this.uocBuildingNoDep.addParameter( "name" , Types.VARCHAR ); + this.uocBuildingNoDep.addParameter( "description" , Types.VARCHAR ); + this.uocBuildingNoDep.addParameter( "cost" , Types.INTEGER ); + this.uocBuildingNoDep.addParameter( "work" , Types.INTEGER ); + this.uocBuildingNoDep.addParameter( "upkeep" , Types.INTEGER ); + this.uocBuildingNoDep.addParameter( "workers" , Types.INTEGER ); + this.uocBuildingNoDep.addParameter( "output_type" , "building_output_type" ); + this.uocBuildingNoDep.addParameter( "output" , Types.INTEGER ); + + this.uocBuildingDep = new StoredProc( dataSource , "tech" , "uoc_building" ); + this.uocBuildingDep.addParameter( "name" , Types.VARCHAR ); + this.uocBuildingDep.addParameter( "description" , Types.VARCHAR ); + this.uocBuildingDep.addParameter( "cost" , Types.INTEGER ); + this.uocBuildingDep.addParameter( "work" , Types.INTEGER ); + this.uocBuildingDep.addParameter( "upkeep" , Types.INTEGER ); + this.uocBuildingDep.addParameter( "workers" , Types.INTEGER ); + this.uocBuildingDep.addParameter( "output_type" , "building_output_type" ); + this.uocBuildingDep.addParameter( "output" , Types.INTEGER ); + this.uocBuildingDep.addParameter( "dep_name" , Types.VARCHAR ); + this.uocBuildingDep.addParameter( "dep_level" , Types.INTEGER ); + + this.uocShipNoDep = new StoredProc( dataSource , "tech" , "uoc_ship" ); + this.uocShipNoDep.addParameter( "name" , Types.VARCHAR ); + this.uocShipNoDep.addParameter( "description" , Types.VARCHAR ); + this.uocShipNoDep.addParameter( "cost" , Types.INTEGER ); + this.uocShipNoDep.addParameter( "work" , Types.INTEGER ); + this.uocShipNoDep.addParameter( "upkeep" , Types.INTEGER ); + this.uocShipNoDep.addParameter( "power" , Types.INTEGER ); + this.uocShipNoDep.addParameter( "flight_time" , Types.INTEGER ); + + this.uocShipDep = new StoredProc( dataSource , "tech" , "uoc_ship" ); + this.uocShipDep.addParameter( "name" , Types.VARCHAR ); + this.uocShipDep.addParameter( "description" , Types.VARCHAR ); + this.uocShipDep.addParameter( "cost" , Types.INTEGER ); + this.uocShipDep.addParameter( "work" , Types.INTEGER ); + this.uocShipDep.addParameter( "upkeep" , Types.INTEGER ); + this.uocShipDep.addParameter( "power" , Types.INTEGER ); + this.uocShipDep.addParameter( "flight_time" , Types.INTEGER ); + this.uocShipDep.addParameter( "dep_name" , Types.VARCHAR ); + this.uocShipDep.addParameter( "dep_level" , Types.INTEGER ); + } + + + private void importBuildables( BuildablesData buildables ) + { + for ( BuildableData buildable : buildables.buildables ) { + if ( buildable instanceof BuildingData ) { + this.importBuilding( (BuildingData) buildable ); + } else { + this.importShip( (ShipData) buildable ); + } + } + } + + + private void importShip( ShipData ship ) + { + this.logger.info( "Importing ship " + ship.name ); + + if ( ship.tech == null ) { + this.uocShipNoDep.execute( ship.name , ship.description , ship.cost.build , ship.cost.work , + ship.cost.upkeep , ship.power , ship.time ); + } else { + this.uocShipDep.execute( ship.name , ship.description , ship.cost.build , ship.cost.work , + ship.cost.upkeep , ship.power , ship.time , ship.tech.name , ship.tech.level ); + } + } + + + private void importBuilding( BuildingData building ) + { + this.logger.info( "Importing building " + building.name ); + if ( building.tech == null ) { + this.uocBuildingNoDep.execute( building.name , building.description , building.cost.build , + building.cost.work , building.cost.upkeep , building.workers , building.type.toString( ) , + building.output ); + } else { + this.uocBuildingDep.execute( building.name , building.description , building.cost.build , + building.cost.work , building.cost.upkeep , building.workers , building.type.toString( ) , + building.output , building.tech.name , building.tech.level ); + } + } + + + @Override + public void run( ) + { + final BuildablesData buildables = this.loadData( ); + AbstractApplicationContext ctx = this.createContext( ); + this.createTemplates( ctx ); + + boolean rv = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + boolean rv; + try { + importBuildables( buildables ); + rv = true; + } catch ( RuntimeException e ) { + if ( e.getCause( ) != null ) { + logger.error( "Exception encoutered" , e ); + } + logger.error( e.getMessage( ) ); + rv = false; + } + if ( !rv ) { + status.setRollbackOnly( ); + } + return rv; + } + + } ); + + if ( rv ) { + this.logger.info( "Import successful" ); + } + + ToolBase.destroyContext( ctx ); + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length != 1 ) { + return false; + } + this.file = new File( options[ 0 ] ); + if ( ! ( this.file.isFile( ) && this.file.canRead( ) ) ) { + return false; + } + return true; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportTechs.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportTechs.java new file mode 100644 index 0000000..cd15b30 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportTechs.java @@ -0,0 +1,217 @@ +package com.deepclone.lw.cli; + + +import java.io.*; +import java.sql.Types; +import java.util.List; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.deepclone.lw.utils.StoredProc; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +public class ImportTechs + extends CLITool +{ + + private final Logger logger = Logger.getLogger( ImportTechs.class ); + + @XStreamAlias( "technologies" ) + @SuppressWarnings( "serial" ) + public static class Techs + implements Serializable + { + @XStreamImplicit( itemFieldName = "tech-line" ) + public List< TechLine > lines; + } + + @SuppressWarnings( "serial" ) + public static class TechLine + implements Serializable + { + @XStreamAsAttribute + public String name; + + @XStreamAsAttribute + public String description; + + @XStreamImplicit( itemFieldName = "level" ) + public List< TechLevel > levels; + } + + @SuppressWarnings( "serial" ) + public static class TechLevel + implements Serializable + { + @XStreamAsAttribute + public String name; + + @XStreamAsAttribute + public String description; + + @XStreamAsAttribute + public int points; + + @XStreamAsAttribute + public int cost; + } + + private File file; + private TransactionTemplate tTemplate; + private StoredProc uocLine; + private StoredProc uocLevel; + + + private XStream initXStream( ) + { + XStream xstream = new XStream( ); + xstream.processAnnotations( Techs.class ); + return xstream; + } + + + private Techs loadData( ) + { + FileInputStream fis; + try { + fis = new FileInputStream( this.file ); + } catch ( FileNotFoundException e ) { + return null; + } + + try { + XStream xstream = this.initXStream( ); + return (Techs) xstream.fromXML( fis ); + } catch ( Exception e ) { + e.printStackTrace( ); + return null; + } finally { + try { + fis.close( ); + } catch ( IOException e ) { + // EMPTY + } + } + } + + + private ClassPathXmlApplicationContext createContext( ) + { + // Load data source and Hibernate properties + String[] dataConfig = { + this.getDataSource( ) + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load beans + String[] cfg = { + "configuration/context-configuration.xml" , "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void getBeans( ApplicationContext ctx ) + { + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + this.tTemplate = new TransactionTemplate( tManager ); + + DataSource dataSource = ctx.getBean( DataSource.class ); + this.uocLine = new StoredProc( dataSource , "tech" , "uoc_line" ); + this.uocLine.addParameter( "tln" , Types.VARCHAR ); + this.uocLine.addParameter( "tld" , Types.VARCHAR ); + + this.uocLevel = new StoredProc( dataSource , "tech" , "uoc_level" ); + this.uocLevel.addParameter( "tech_line" , Types.VARCHAR ); + this.uocLevel.addParameter( "level" , Types.INTEGER ); + this.uocLevel.addParameter( "name" , Types.VARCHAR ); + this.uocLevel.addParameter( "desc" , Types.VARCHAR ); + this.uocLevel.addParameter( "points" , Types.INTEGER ); + this.uocLevel.addParameter( "cost" , Types.INTEGER ); + } + + + private void importTechnologies( Techs data ) + { + for ( TechLine line : data.lines ) { + this.uocLine.execute( line.name , line.description ); + + int i = 1; + for ( TechLevel level : line.levels ) { + this.uocLevel.execute( line.name , i , level.name , level.description , level.points , level.cost ); + i++; + } + } + } + + + @Override + public void run( ) + { + final Techs data = this.loadData( ); + if ( data == null ) { + System.err.println( "could not read data" ); + return; + } + + AbstractApplicationContext ctx = this.createContext( ); + this.getBeans( ctx ); + boolean rv = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + boolean rv; + try { + importTechnologies( data ); + rv = true; + } catch ( RuntimeException e ) { + logger.error( e.getMessage( ) ); + rv = false; + } + if ( !rv ) { + status.setRollbackOnly( ); + } + return rv; + } + + } ); + + if ( rv ) { + this.logger.info( "Import successful" ); + } + + this.tTemplate = null; + ToolBase.destroyContext( ctx ); + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length != 1 ) { + return false; + } + this.file = new File( options[ 0 ] ); + if ( ! ( this.file.isFile( ) && this.file.canRead( ) ) ) { + return false; + } + return true; + } +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportText.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportText.java new file mode 100644 index 0000000..c3952ed --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ImportText.java @@ -0,0 +1,267 @@ +package com.deepclone.lw.cli; + + +import java.io.*; +import java.util.LinkedList; +import java.util.List; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.jdbc.core.SqlParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +public class ImportText + extends CLITool +{ + + private final Logger logger = Logger.getLogger( ImportText.class ); + + @SuppressWarnings( "serial" ) + public abstract static class StringData + implements Serializable + { + @XStreamAsAttribute + public String id; + + + public abstract String getString( ); + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "inline-string" ) + public static class InlineString + extends StringData + { + public String value; + + + @Override + public String getString( ) + { + return this.value; + } + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "from-file" ) + public static class FileString + extends StringData + { + @XStreamAsAttribute + public String source; + + + @Override + public String getString( ) + { + StringBuilder sBuilder = new StringBuilder( ); + try { + BufferedReader in = new BufferedReader( new FileReader( source ) ); + String str; + while ( ( str = in.readLine( ) ) != null ) { + sBuilder.append( str ); + sBuilder.append( "\n" ); + } + in.close( ); + } catch ( IOException e ) { + throw new RuntimeException( "Could not read " + source ); + } + + return sBuilder.toString( ); + } + } + + @SuppressWarnings( "serial" ) + public static class LanguageData + implements Serializable + { + @XStreamAsAttribute + public String id; + + @XStreamAsAttribute + public String name; + + @XStreamImplicit + public List< StringData > strings = new LinkedList< StringData >( ); + } + + @SuppressWarnings( "serial" ) + @XStreamAlias( "lw-text-data" ) + public static class TextData + implements Serializable + { + @XStreamImplicit( itemFieldName = "language" ) + public List< LanguageData > languages = new LinkedList< LanguageData >( ); + } + + private File file; + private TransactionTemplate tTemplate; + private SimpleJdbcCall uocTranslation; + private SimpleJdbcCall uocLanguage; + + + private XStream initXStream( ) + { + XStream xstream = new XStream( ); + xstream.processAnnotations( TextData.class ); + xstream.processAnnotations( InlineString.class ); + xstream.processAnnotations( FileString.class ); + return xstream; + } + + + private TextData loadData( ) + { + FileInputStream fis; + try { + fis = new FileInputStream( this.file ); + } catch ( FileNotFoundException e ) { + return null; + } + + try { + XStream xstream = this.initXStream( ); + return (TextData) xstream.fromXML( fis ); + } catch ( Exception e ) { + e.printStackTrace( ); + return null; + } finally { + try { + fis.close( ); + } catch ( IOException e ) { + // EMPTY + } + } + } + + + private ClassPathXmlApplicationContext createContext( ) + { + // Load data source and Hibernate properties + String[] dataConfig = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load transaction manager bean + String[] cfg = { + "configuration/transaction-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , ctx ); + } + + + private void createTemplates( ApplicationContext ctx ) + { + DataSource dSource = ctx.getBean( DataSource.class ); + PlatformTransactionManager tManager = ctx.getBean( PlatformTransactionManager.class ); + + this.uocLanguage = new SimpleJdbcCall( dSource ).withCatalogName( "defs" ).withProcedureName( "uoc_language" ); + this.uocLanguage.withoutProcedureColumnMetaDataAccess( ); + this.uocLanguage.declareParameters( new SqlParameter( "lid" , java.sql.Types.VARCHAR ) , new SqlParameter( + "lname" , java.sql.Types.VARCHAR ) ); + + this.uocTranslation = new SimpleJdbcCall( dSource ).withCatalogName( "defs" ).withProcedureName( + "uoc_translation" ); + this.uocTranslation.withoutProcedureColumnMetaDataAccess( ); + this.uocTranslation.declareParameters( new SqlParameter( "lid" , java.sql.Types.VARCHAR ) , new SqlParameter( + "sid" , java.sql.Types.VARCHAR ) , new SqlParameter( "trans" , java.sql.Types.VARCHAR ) ); + + this.tTemplate = new TransactionTemplate( tManager ); + } + + + private void importText( TextData data ) + { + for ( LanguageData ld : data.languages ) { + this.importLanguage( ld ); + } + } + + + private void importLanguage( LanguageData ld ) + { + if ( ld.strings == null ) { + return; + } + + // Try creating or updating the language + this.uocLanguage.execute( ld.id , ld.name ); + + // Import translations + for ( StringData sd : ld.strings ) { + this.uocTranslation.execute( ld.id , sd.id , sd.getString( ) ); + } + } + + + @Override + public void run( ) + { + final TextData data = this.loadData( ); + if ( data == null ) { + System.err.println( "could not read data" ); + return; + } + + AbstractApplicationContext ctx = this.createContext( ); + this.createTemplates( ctx ); + boolean rv = this.tTemplate.execute( new TransactionCallback< Boolean >( ) { + + @Override + public Boolean doInTransaction( TransactionStatus status ) + { + boolean rv; + try { + importText( data ); + rv = true; + } catch ( RuntimeException e ) { + logger.error( "Caught runtime exception" , e ); + rv = false; + } + if ( !rv ) { + status.setRollbackOnly( ); + } + return rv; + } + + } ); + + if ( rv ) { + this.logger.info( "Text import successful" ); + } + + ToolBase.destroyContext( ctx ); + } + + + @Override + public boolean setOptions( String... options ) + { + if ( options.length != 1 ) { + return false; + } + this.file = new File( options[ 0 ] ); + if ( ! ( this.file.isFile( ) && this.file.canRead( ) ) ) { + return false; + } + return true; + } +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Stop.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Stop.java new file mode 100644 index 0000000..80ecfff --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Stop.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cli; + + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.ApplicationContext; + +import com.deepclone.lw.srv.ServerTerminator; + + + +public final class Stop + extends CLITool +{ + + private ApplicationContext getContext( ) + { + Map< String , String > rmiTerminator = new HashMap< String , String >( ); + rmiTerminator.put( "termSrv" , "com.deepclone.lw.srv.ServerTerminator" ); + + return this.createClientContext( rmiTerminator ); + } + + + @Override + public void run( ) + { + ApplicationContext ctx = this.getContext( ); + ServerTerminator terminator; + try { + terminator = (ServerTerminator) ctx.getBean( "termSrv" ); + } catch ( BeanCreationException e ) { + System.err.println("Could not connect to server"); + return; + } + terminator.terminate( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Tick.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Tick.java new file mode 100644 index 0000000..b2484fc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/Tick.java @@ -0,0 +1,114 @@ +package com.deepclone.lw.cli; + + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.context.support.GenericApplicationContext; + +import com.deepclone.lw.interfaces.sys.Ticker; +import com.deepclone.lw.interfaces.sys.Ticker.Frequency; + + + +public class Tick + extends CLITool +{ + + public static class FakeTickerBean + implements Ticker + { + Map< Frequency , List< Runnable > > tasks = new HashMap< Frequency , List< Runnable > >( ); + + + @Override + public boolean isActive( ) + { + return true; + } + + + @Override + public void pause( ) + throws IllegalStateException + { + // EMPTY + } + + + @Override + synchronized public void registerTask( Frequency frequency , String name , Runnable task ) + { + List< Runnable > tasks = this.tasks.get( frequency ); + if ( tasks == null ) { + tasks = new LinkedList< Runnable >( ); + this.tasks.put( frequency , tasks ); + } + tasks.add( task ); + } + + + @Override + public void unpause( ) + throws IllegalStateException + { + // EMPTY + } + + + public void runFrequency( Frequency frequency ) + { + List< Runnable > tasks = this.tasks.get( frequency ); + if ( tasks == null ) { + return; + } + for ( Runnable r : tasks ) { + r.run( ); + } + } + + } + + + private AbstractApplicationContext getContext( ) + { + // Load data source and Hibernate properties + String[] dataConfig = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dataConfig ); + ctx.refresh( ); + + // Load fake ticker + GenericApplicationContext gac = new GenericApplicationContext( ctx ); + gac.registerBeanDefinition( "fakeTicker" , BeanDefinitionBuilder.rootBeanDefinition( FakeTickerBean.class ) + .getBeanDefinition( ) ); + gac.refresh( ); + + String[] cfg = { + "configuration/context-configuration.xml" , "configuration/transaction-bean.xml" , + "configuration/accounts-beans.xml" , "configuration/bt-beans.xml" , "configuration/eventlog-beans.xml" , + "configuration/i18n-beans.xml" , "configuration/mailer-beans.xml" , "configuration/naming-beans.xml" , + "configuration/simple-beans.xml" , + "configuration/system/constants-manager-bean.xml" , "configuration/system/system-status-bean.xml" + }; + return new ClassPathXmlApplicationContext( cfg , true , gac ); + } + + + @Override + public void run( ) + { + AbstractApplicationContext ctx = this.getContext( ); + FakeTickerBean ftb = ctx.getBean( FakeTickerBean.class ); + ftb.runFrequency( Frequency.MINUTE ); + ToolBase.destroyContext( ctx ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ToolBase.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ToolBase.java new file mode 100644 index 0000000..eafb148 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/ToolBase.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.cli; + + +import org.springframework.context.support.AbstractApplicationContext; + + + +public abstract class ToolBase + implements Runnable +{ + + private String dataSource; + private int rmiPort; + private int servPort; + + + protected final String getDataSource( ) + { + return this.dataSource; + } + + + protected final int getRmiPort( ) + { + return this.rmiPort; + } + + + protected final int getServicePort( ) + { + return this.servPort; + } + + + protected final int getTerminationPort( ) + { + return this.servPort + 1; + } + + + protected static void destroyContext( AbstractApplicationContext aac ) + { + while ( aac != null ) { + AbstractApplicationContext p = (AbstractApplicationContext) aac.getParent( ); + aac.destroy( ); + aac = p; + } + System.gc( ); + try { + Thread.sleep( 1000L ); + } catch ( InterruptedException e ) { + e.printStackTrace( ); + } + } + + + public final void setMainSettings( String dataSource , int rmiPort , int servPort ) + { + this.dataSource = dataSource; + this.rmiPort = rmiPort; + this.servPort = servPort; + } + + + public boolean setOptions( String... options ) + { + return ( options == null || options.length == 0 ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Administrator.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Administrator.java new file mode 100644 index 0000000..f3713a9 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Administrator.java @@ -0,0 +1,29 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "administrator" ) +public class Administrator + implements Serializable +{ + + @XStreamAsAttribute + public int id; + + @XStreamAsAttribute + public String name; + + @XStreamAsAttribute + public int privileges; + + public String md5; + public String sha1; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREComment.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREComment.java new file mode 100644 index 0000000..0ea8f2c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREComment.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.cli.dbexport; + + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "comment" ) +public class BREComment + extends BugReportEvent +{ + + @XStreamAsAttribute + public boolean visible; + + public String text; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREInitialReport.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREInitialReport.java new file mode 100644 index 0000000..87bda4c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREInitialReport.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.cli.dbexport; + + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "initial-report" ) +public class BREInitialReport + extends BugReportEvent +{ + + @XStreamAsAttribute + public String title; + + public String contents; + + public String xmlData; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREMerger.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREMerger.java new file mode 100644 index 0000000..e100b34 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREMerger.java @@ -0,0 +1,19 @@ +package com.deepclone.lw.cli.dbexport; + + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "merge-reports" ) +public class BREMerger + extends BugReportEvent +{ + + @XStreamAsAttribute + @XStreamAlias( "from-report" ) + public long merged; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREStatusChange.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREStatusChange.java new file mode 100644 index 0000000..e7735f7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREStatusChange.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.cli.dbexport; + + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "status-change" ) +public class BREStatusChange + extends BugReportEvent +{ + + @XStreamAsAttribute + public String status; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREVisibilityChange.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREVisibilityChange.java new file mode 100644 index 0000000..009e016 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BREVisibilityChange.java @@ -0,0 +1,16 @@ +package com.deepclone.lw.cli.dbexport; + + +import com.thoughtworks.xstream.annotations.XStreamAlias; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "visibility-change" ) +public class BREVisibilityChange + extends BugReportEvent +{ + + public boolean visible; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugEventMapper.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugEventMapper.java new file mode 100644 index 0000000..856be58 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugEventMapper.java @@ -0,0 +1,109 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; + +import com.deepclone.lw.cmd.bt.data.BugEventType; + + + +public class BugEventMapper + implements RowMapper< BugReportEvent > +{ + + @Override + public BugReportEvent mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + BugEventType bet = BugEventType.valueOf( rs.getString( "event_type" ) ); + BugReportEvent bre; + + switch ( bet ) { + case COMMENT: + bre = this.getComment( rs ); + break; + case INIT: + bre = this.getInitialReport( rs ); + break; + case MERGE: + bre = this.getMerger( rs ); + break; + case STATUS: + bre = this.getStatusChange( rs ); + break; + case VISIBILITY: + bre = this.getVisibility( rs ); + break; + default: + throw new IllegalArgumentException( bet.toString( ) ); + } + + bre.id = rs.getLong( "event_id" ); + bre.timestamp = rs.getTimestamp( "event_timestamp" ); + bre.submitter = this.getSubmitter( rs ); + + return bre; + } + + + private BugSubmitter getSubmitter( ResultSet rs ) + throws SQLException + { + BugSubmitter submitter = new BugSubmitter( ); + submitter.isAdmin = rs.getBoolean( "submitter_admin" ); + submitter.name = rs.getString( "submitter_name" ); + return submitter; + } + + + private BugReportEvent getComment( ResultSet rs ) + throws SQLException + { + BREComment evt = new BREComment( ); + evt.text = rs.getString( "contents" ); + evt.visible = rs.getBoolean( "visible" ); + return evt; + } + + + private BugReportEvent getInitialReport( ResultSet rs ) + throws SQLException + { + BREInitialReport evt = new BREInitialReport( ); + evt.title = rs.getString( "title" ); + evt.contents = rs.getString( "contents" ); + evt.xmlData = rs.getString( "account_status" ); + return evt; + } + + + private BugReportEvent getMerger( ResultSet rs ) + throws SQLException + { + BREMerger evt = new BREMerger( ); + evt.merged = rs.getLong( "merged_report_id" ); + return evt; + } + + + private BugReportEvent getStatusChange( ResultSet rs ) + throws SQLException + { + BREStatusChange evt = new BREStatusChange( ); + evt.status = rs.getString( "status" ); + return evt; + } + + + private BugReportEvent getVisibility( ResultSet rs ) + throws SQLException + { + BREVisibilityChange evt = new BREVisibilityChange( ); + evt.visible = rs.getBoolean( "visible" ); + return evt; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugGroup.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugGroup.java new file mode 100644 index 0000000..63fd994 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugGroup.java @@ -0,0 +1,22 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "bug-group" ) +public class BugGroup + implements Serializable +{ + + @XStreamImplicit( itemFieldName = "event-id" ) + public List< Long > events = new ArrayList< Long >( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReportEvent.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReportEvent.java new file mode 100644 index 0000000..21d624d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReportEvent.java @@ -0,0 +1,23 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; +import java.sql.Timestamp; + +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +public abstract class BugReportEvent + implements Serializable +{ + + @XStreamAsAttribute + public long id; + + @XStreamAsAttribute + public Timestamp timestamp; + + public BugSubmitter submitter; +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReports.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReports.java new file mode 100644 index 0000000..8bb9fc4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugReports.java @@ -0,0 +1,17 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; +import java.util.List; + + + +@SuppressWarnings( "serial" ) +public class BugReports + implements Serializable +{ + + public List< BugGroup > groups; + + public List< BugReportEvent > events; +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugSubmitter.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugSubmitter.java new file mode 100644 index 0000000..cfe7a6d --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/BugSubmitter.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "submitter" ) +public class BugSubmitter + implements Serializable +{ + + @XStreamAsAttribute + public String name; + + @XStreamAlias( "is-admin" ) + @XStreamAsAttribute + public boolean isAdmin; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/LegacyWorldsDB.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/LegacyWorldsDB.java new file mode 100644 index 0000000..252e40a --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/LegacyWorldsDB.java @@ -0,0 +1,26 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "legacyworlds" ) +public class LegacyWorldsDB + implements Serializable +{ + + @XStreamAsAttribute + public int version = 1; + + public List< User > users; + + @XStreamAlias( "bug-reports" ) + public BugReports bugReports = new BugReports( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/User.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/User.java new file mode 100644 index 0000000..67dee6c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/User.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "user" ) +public class User + implements Serializable +{ + + @XStreamAsAttribute + public String address; + + @XStreamAsAttribute + public String language; + + @XStreamAsAttribute + @XStreamAlias( "game-credits" ) + public int gameCredits; + + @XStreamAsAttribute + @XStreamAlias("vacation-credits") + public int vacationCredits; + + public String md5; + public String sha1; + + public String empire; + + public Warnings warnings; + public Administrator administrator; + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/UserMapper.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/UserMapper.java new file mode 100644 index 0000000..b80a753 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/UserMapper.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; + + + +public class UserMapper + implements RowMapper< User > +{ + + @Override + public User mapRow( ResultSet rs , int rowNum ) + throws SQLException + { + User user = new User( ); + + user.address = rs.getString( "address" ); + user.language = rs.getString( "language" ); + user.gameCredits = rs.getInt( "game_credits" ); + user.vacationCredits = rs.getInt( "vacation_credits" ); + user.md5 = rs.getString( "pass_md5" ); + user.sha1 = rs.getString( "pass_sha1" ); + user.empire = rs.getString( "current_empire" ); + + int wCount = rs.getInt( "warnings_count" ); + if ( wCount > 0 ) { + user.warnings = new Warnings( ); + user.warnings.count = wCount; + user.warnings.last = rs.getTimestamp( "warnings_last" ); + } + + String aName = rs.getString( "administrator_name" ); + if ( aName != null ) { + user.administrator = new Administrator( ); + user.administrator.id = rs.getInt( "administrator_id" ); + user.administrator.name = aName; + user.administrator.privileges = rs.getInt( "privileges" ); + user.administrator.md5 = rs.getString( "administrator_md5" ); + user.administrator.sha1 = rs.getString( "administrator_sha1" ); + } + + return user; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Warnings.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Warnings.java new file mode 100644 index 0000000..284aebf --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/cli/dbexport/Warnings.java @@ -0,0 +1,23 @@ +package com.deepclone.lw.cli.dbexport; + + +import java.io.Serializable; +import java.sql.Timestamp; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "warnings" ) +public class Warnings + implements Serializable +{ + + @XStreamAsAttribute + public int count; + + @XStreamAsAttribute + public Timestamp last; +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/LogAppender.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/LogAppender.java new file mode 100644 index 0000000..def3414 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/LogAppender.java @@ -0,0 +1,513 @@ +package com.deepclone.lw.srv; + + +/** + * Adapted from the Apache Log4j DailyRollingFileAppender to extend the functionality of the + * existing class so that the user can limit the number of log backups and compress the backups to + * conserve disk space. + * + * @author Ryan Kimber + * + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file to You under the Apache + * License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Calendar; +import java.util.TimeZone; +import java.util.Locale; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +// We have to import the log4j package because this class used to be in it and references other +// classes in that package. +import org.apache.log4j.*; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.spi.LoggingEvent; + + + +/** + * CustodianDailyRollingFileAppender is based on + * {@link org.apache.log4j.appender.DailyRollingFileAppender} so most of the configuration options + * can be taken from the documentation on that class. + */ +public class LogAppender + extends FileAppender +{ + // The code assumes that the following constants are in a increasing + // sequence. + static final int TOP_OF_TROUBLE = -1; + static final int TOP_OF_MINUTE = 0; + static final int TOP_OF_HOUR = 1; + static final int HALF_DAY = 2; + static final int TOP_OF_DAY = 3; + static final int TOP_OF_WEEK = 4; + static final int TOP_OF_MONTH = 5; + + /** + * The date pattern. By default, the pattern is set to "'.'yyyy-MM-dd" meaning daily rollover. + */ + private String datePattern = "'.'yyyy-MM-dd"; + private String compressBackups = "false"; + private String maxNumberOfDays = "7"; + + /** + * The log file will be renamed to the value of the scheduledFilename variable when the next + * interval is entered. For example, if the rollover period is one hour, the log file will be + * renamed to the value of "scheduledFilename" at the beginning of the next hour. + * + * The precise time when a rollover occurs depends on logging activity. + */ + private String scheduledFilename; + + /** + * The next time we estimate a rollover should occur. + */ + private long nextCheck = System.currentTimeMillis( ) - 1; + + Date now = new Date( ); + + SimpleDateFormat sdf; + + RollingCalendar rc = new RollingCalendar( ); + + int checkPeriod = TOP_OF_TROUBLE; + + // The gmtTimeZone is used only in computeCheckPeriod() method. + static final TimeZone gmtTimeZone = TimeZone.getTimeZone( "GMT" ); + + + /** + * The default constructor does nothing. + */ + public LogAppender( ) + { + } + + + /** + * Instantiate a LogAppender and open the file designated by filename. The opened filename will + * become the ouput destination for this appender. + */ + public LogAppender( Layout layout , String filename , String datePattern ) + throws IOException + { + super( layout , filename , true ); + this.datePattern = datePattern; + activateOptions( ); + } + + + /** + * The DatePattern takes a string in the same format as expected by {@link SimpleDateFormat}. + * This options determines the rollover schedule. + */ + public void setDatePattern( String pattern ) + { + datePattern = pattern; + } + + + /** Returns the value of the DatePattern option. */ + public String getDatePattern( ) + { + return datePattern; + } + + + public void activateOptions( ) + { + super.activateOptions( ); + if ( datePattern != null && fileName != null ) { + now.setTime( System.currentTimeMillis( ) ); + sdf = new SimpleDateFormat( datePattern ); + int type = computeCheckPeriod( ); + printPeriodicity( type ); + rc.setType( type ); + File file = new File( fileName ); + scheduledFilename = fileName + sdf.format( new Date( file.lastModified( ) ) ); + + } else { + LogLog.error( "Either File or DatePattern options are not set for appender [" + name + "]." ); + } + } + + + void printPeriodicity( int type ) + { + switch ( type ) { + case TOP_OF_MINUTE: + LogLog.debug( "Appender [" + name + "] to be rolled every minute." ); + break; + case TOP_OF_HOUR: + LogLog.debug( "Appender [" + name + "] to be rolled on top of every hour." ); + break; + case HALF_DAY: + LogLog.debug( "Appender [" + name + "] to be rolled at midday and midnight." ); + break; + case TOP_OF_DAY: + LogLog.debug( "Appender [" + name + "] to be rolled at midnight." ); + break; + case TOP_OF_WEEK: + LogLog.debug( "Appender [" + name + "] to be rolled at start of week." ); + break; + case TOP_OF_MONTH: + LogLog.debug( "Appender [" + name + "] to be rolled at start of every month." ); + break; + default: + LogLog.warn( "Unknown periodicity for appender [" + name + "]." ); + } + } + + + // This method computes the roll over period by looping over the + // periods, starting with the shortest, and stopping when the r0 is + // different from from r1, where r0 is the epoch formatted according + // the datePattern (supplied by the user) and r1 is the + // epoch+nextMillis(i) formatted according to datePattern. All date + // formatting is done in GMT and not local format because the test + // logic is based on comparisons relative to 1970-01-01 00:00:00 + // GMT (the epoch). + + int computeCheckPeriod( ) + { + RollingCalendar rollingCalendar = new RollingCalendar( gmtTimeZone , Locale.ENGLISH ); + // set sate to 1970-01-01 00:00:00 GMT + Date epoch = new Date( 0 ); + if ( datePattern != null ) { + for ( int i = TOP_OF_MINUTE ; i <= TOP_OF_MONTH ; i++ ) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat( datePattern ); + simpleDateFormat.setTimeZone( gmtTimeZone ); // do all date + // formatting in GMT + String r0 = simpleDateFormat.format( epoch ); + rollingCalendar.setType( i ); + Date next = new Date( rollingCalendar.getNextCheckMillis( epoch ) ); + String r1 = simpleDateFormat.format( next ); + // System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1); + if ( r0 != null && r1 != null && !r0.equals( r1 ) ) { + return i; + } + } + } + return TOP_OF_TROUBLE; // Deliberately head for trouble... + } + + + /** + * Rollover the current file to a new file. + */ + void rollOver( ) + throws IOException + { + + /* Compute filename, but only if datePattern is specified */ + if ( datePattern == null ) { + errorHandler.error( "Missing DatePattern option in rollOver()." ); + return; + } + + String datedFilename = fileName + sdf.format( now ); + // It is too early to roll over because we are still within the + // bounds of the current interval. Rollover will occur once the + // next interval is reached. + if ( scheduledFilename.equals( datedFilename ) ) { + return; + } + + // close current file, and rename it to datedFilename + this.closeFile( ); + + File target = new File( scheduledFilename ); + if ( target.exists( ) ) { + target.delete( ); + } + + File file = new File( fileName ); + boolean result = file.renameTo( target ); + if ( result ) { + LogLog.debug( fileName + " -> " + scheduledFilename ); + } else { + LogLog.error( "Failed to rename [" + fileName + "] to [" + scheduledFilename + "]." ); + } + + try { + // This will also close the file. This is OK since multiple + // close operations are safe. + this.setFile( fileName , false , this.bufferedIO , this.bufferSize ); + } catch ( IOException e ) { + errorHandler.error( "setFile(" + fileName + ", false) call failed." ); + } + scheduledFilename = datedFilename; + } + + + /** + * This method differentiates DailyRollingFileAppender from its super class. + * + * + * Before actually logging, this method will check whether it is time to do a rollover. If it + * is, it will schedule the next rollover time and then rollover. + * */ + protected void subAppend( LoggingEvent event ) + { + long n = System.currentTimeMillis( ); + if ( n >= nextCheck ) { + now.setTime( n ); + nextCheck = rc.getNextCheckMillis( now ); + try { + cleanupAndRollOver( ); + } catch ( IOException ioe ) { + LogLog.error( "cleanupAndRollover() failed." , ioe ); + } + } + super.subAppend( event ); + } + + + public String getCompressBackups( ) + { + return compressBackups; + } + + + public void setCompressBackups( String compressBackups ) + { + this.compressBackups = compressBackups; + } + + + public String getMaxNumberOfDays( ) + { + return maxNumberOfDays; + } + + + public void setMaxNumberOfDays( String maxNumberOfDays ) + { + this.maxNumberOfDays = maxNumberOfDays; + } + + + /* + * This method checks to see if we're exceeding the number of log backups that we are supposed + * to keep, and if so, deletes the offending files. It then delegates to the rollover method to + * rollover to a new file if required. + */ + protected void cleanupAndRollOver( ) + throws IOException + { + // Check to see if there are already 5 files + File file = new File( fileName ); + Calendar cal = Calendar.getInstance( ); + int maxDays = 7; + try { + maxDays = Integer.parseInt( getMaxNumberOfDays( ) ); + } catch ( Exception e ) { + // just leave it at 7. + } + cal.add( Calendar.DATE , -maxDays ); + Date cutoffDate = cal.getTime( ); + if ( file.getParentFile( ).exists( ) ) { + File[] files = file.getParentFile( ).listFiles( new StartsWithFileFilter( file.getName( ) , false ) ); + int nameLength = file.getName( ).length( ); + for ( int i = 0 ; i < files.length ; i++ ) { + String datePart = null; + try { + datePart = files[ i ].getName( ).substring( nameLength ); + Date date = sdf.parse( datePart ); + if ( date.before( cutoffDate ) ) { + files[ i ].delete( ); + } + // If we're supposed to zip files and this isn't already a zip + else if ( getCompressBackups( ).equalsIgnoreCase( "YES" ) + || getCompressBackups( ).equalsIgnoreCase( "TRUE" ) ) { + zipAndDelete( files[ i ] ); + } + } catch ( Exception pe ) { + // This isn't a file we should touch (it isn't named + // correctly) + } + } + } + rollOver( ); + } + + + /** + * Compresses the passed file to a .zip file, stores the .zip in the same directory as the + * passed file, and then deletes the original, leaving only the .zipped archive. + * + * @param file + */ + private void zipAndDelete( File file ) + throws IOException + { + if ( !file.getName( ).endsWith( ".zip" ) ) { + File zipFile = new File( file.getParent( ) , file.getName( ) + ".zip" ); + FileInputStream fis = new FileInputStream( file ); + FileOutputStream fos = new FileOutputStream( zipFile ); + ZipOutputStream zos = new ZipOutputStream( fos ); + ZipEntry zipEntry = new ZipEntry( file.getName( ) ); + zos.putNextEntry( zipEntry ); + + byte[] buffer = new byte[ 4096 ]; + while ( true ) { + int bytesRead = fis.read( buffer ); + if ( bytesRead == -1 ) + break; + else { + zos.write( buffer , 0 , bytesRead ); + } + } + zos.closeEntry( ); + fis.close( ); + zos.close( ); + file.delete( ); + } + } + + class StartsWithFileFilter + implements FileFilter + { + private String startsWith; + private boolean inclDirs = false; + + + /** + * + */ + public StartsWithFileFilter( String startsWith , boolean includeDirectories ) + { + super( ); + this.startsWith = startsWith.toUpperCase( ); + inclDirs = includeDirectories; + } + + + /* + * (non-Javadoc) + * + * @see java.io.FileFilter#accept(java.io.File) + */ + public boolean accept( File pathname ) + { + if ( !inclDirs && pathname.isDirectory( ) ) { + return false; + } else + return pathname.getName( ).toUpperCase( ).startsWith( startsWith ); + } + } +} + +/** + * RollingCalendar is a helper class to DailyRollingFileAppender. Given a periodicity type and the + * current time, it computes the start of the next interval. + * */ +class RollingCalendar + extends GregorianCalendar +{ + private static final long serialVersionUID = -3560331770601814177L; + + int type = LogAppender.TOP_OF_TROUBLE; + + + RollingCalendar( ) + { + super( ); + } + + + RollingCalendar( TimeZone tz , Locale locale ) + { + super( tz , locale ); + } + + + void setType( int type ) + { + this.type = type; + } + + + public long getNextCheckMillis( Date now ) + { + return getNextCheckDate( now ).getTime( ); + } + + + public Date getNextCheckDate( Date now ) + { + this.setTime( now ); + + switch ( type ) { + case LogAppender.TOP_OF_MINUTE: + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + this.add( Calendar.MINUTE , 1 ); + break; + case LogAppender.TOP_OF_HOUR: + this.set( Calendar.MINUTE , 0 ); + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + this.add( Calendar.HOUR_OF_DAY , 1 ); + break; + case LogAppender.HALF_DAY: + this.set( Calendar.MINUTE , 0 ); + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + int hour = get( Calendar.HOUR_OF_DAY ); + if ( hour < 12 ) { + this.set( Calendar.HOUR_OF_DAY , 12 ); + } else { + this.set( Calendar.HOUR_OF_DAY , 0 ); + this.add( Calendar.DAY_OF_MONTH , 1 ); + } + break; + case LogAppender.TOP_OF_DAY: + this.set( Calendar.HOUR_OF_DAY , 0 ); + this.set( Calendar.MINUTE , 0 ); + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + this.add( Calendar.DATE , 1 ); + break; + case LogAppender.TOP_OF_WEEK: + this.set( Calendar.DAY_OF_WEEK , getFirstDayOfWeek( ) ); + this.set( Calendar.HOUR_OF_DAY , 0 ); + this.set( Calendar.MINUTE , 0 ); + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + this.add( Calendar.WEEK_OF_YEAR , 1 ); + break; + case LogAppender.TOP_OF_MONTH: + this.set( Calendar.DATE , 1 ); + this.set( Calendar.HOUR_OF_DAY , 0 ); + this.set( Calendar.MINUTE , 0 ); + this.set( Calendar.SECOND , 0 ); + this.set( Calendar.MILLISECOND , 0 ); + this.add( Calendar.MONTH , 1 ); + break; + default: + throw new IllegalStateException( "Unknown periodicity type." ); + } + return getTime( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/Server.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/Server.java new file mode 100644 index 0000000..f6a41e0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/Server.java @@ -0,0 +1,108 @@ +package com.deepclone.lw.srv; + + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.springframework.context.support.GenericApplicationContext; + +import com.deepclone.lw.cli.ToolBase; +import com.deepclone.lw.interfaces.session.SessionManager; + + + +public class Server + extends ToolBase +{ + private static final String[] beanConfigurations = { + "lw-server.xml" , + }; + + private Lock terminationLock = new ReentrantLock( ); + private Condition termination = this.terminationLock.newCondition( ); + + private AbstractApplicationContext applicationContext; + + + private void addRMIService( GenericApplicationContext ctx , String name , Object bean , Class< ? > iface , int sPort ) + { + BeanDefinitionBuilder builder; + builder = BeanDefinitionBuilder.rootBeanDefinition( "org.springframework.remoting.rmi.RmiServiceExporter" ); + builder.setScope( BeanDefinition.SCOPE_SINGLETON ); + builder.addPropertyValue( "serviceName" , name ); + builder.addPropertyValue( "service" , bean ); + builder.addPropertyValue( "ServiceInterface" , iface.getCanonicalName( ) ); + builder.addPropertyValue( "registryPort" , String.valueOf( this.getRmiPort( ) ) ); + builder.addPropertyValue( "servicePort" , String.valueOf( sPort ) ); + ctx.registerBeanDefinition( name , builder.getBeanDefinition( ) ); + } + + + private AbstractApplicationContext makeRMIContext( ApplicationContext parent ) + { + GenericApplicationContext context = new GenericApplicationContext( parent ); + this.addRMIService( context , "termSrv" , parent.getBean( "terminator" ) , ServerTerminator.class , this.getTerminationPort( ) ); + this.addRMIService( context , "sessionSrv" , parent.getBean( "sessionManager" ) , SessionManager.class , this.getServicePort( ) ); + context.refresh( ); + return context; + } + + + private ApplicationContext makeDataConfigContext( ) + { + String[] dSource = { + this.getDataSource( ) , + }; + FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( dSource ); + ctx.refresh( ); + return ctx; + } + + + private void createBeans( ) + { + ApplicationContext ctx = this.makeDataConfigContext( ); + ctx = new ClassPathXmlApplicationContext( Server.beanConfigurations , true , ctx ); + this.applicationContext = this.makeRMIContext( ctx ); + } + + + private void initialiseBeans( ) + { + this.createBeans( ); + this.applicationContext.getBean( "terminator" , ServerTerminatorBean.class ).setServer( this ); + } + + + private void waitForTermination( ) + { + this.terminationLock.lock( ); + this.termination.awaitUninterruptibly( ); + this.terminationLock.unlock( ); + } + + + @Override + public void run( ) + { + this.initialiseBeans( ); + this.waitForTermination( ); + ToolBase.destroyContext( this.applicationContext ); + } + + + public void terminate( ) + { + this.terminationLock.lock( ); + this.termination.signal( ); + this.terminationLock.unlock( ); + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminator.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminator.java new file mode 100644 index 0000000..d533c41 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminator.java @@ -0,0 +1,9 @@ +package com.deepclone.lw.srv; + + +public interface ServerTerminator +{ + + public void terminate( ); + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminatorBean.java b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminatorBean.java new file mode 100644 index 0000000..69994d0 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/java/com/deepclone/lw/srv/ServerTerminatorBean.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.srv; + + +public class ServerTerminatorBean + implements ServerTerminator +{ + + private Server server = null; + + + public void setServer( Server server ) + { + this.server = server; + } + + + @Override + public void terminate( ) + { + if ( this.server != null ) { + this.server.terminate( ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/resources/configuration/context-configuration.xml b/legacyworlds-server/legacyworlds-server-main/src/main/resources/configuration/context-configuration.xml new file mode 100644 index 0000000..11e1a81 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/resources/configuration/context-configuration.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/resources/log4j.properties b/legacyworlds-server/legacyworlds-server-main/src/main/resources/log4j.properties new file mode 100644 index 0000000..994c335 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/resources/log4j.properties @@ -0,0 +1,38 @@ +log4j.appender.fullDebug=org.apache.log4j.RollingFileAppender +log4j.appender.fullDebug.File=./full-debug.log +log4j.appender.fullDebug.layout=org.apache.log4j.PatternLayout +log4j.appender.fullDebug.layout.ConversionPattern=%d{yyyy-MM-dd@HH:mm:ss} %5p (%40c{1}:%-5L) - %m%n +log4j.appender.fullDebug.MaxFileSize=100MB +log4j.appender.fullDebug.MaxBackupIndex=1 + +log4j.appender.server=com.deepclone.lw.srv.LogAppender +log4j.appender.server.File=./server.log +log4j.appender.server.Threshold=DEBUG +log4j.appender.server.layout=org.apache.log4j.PatternLayout +log4j.appender.server.layout.ConversionPattern=%d{yyyy-MM-dd@HH:mm:ss} %5p - %m%n +log4j.appender.server.DatePattern='.'yyyy-MM-dd +log4j.appender.server.MaxNumberOfDays=30 +log4j.appender.server.CompressBackups = true + +log4j.appender.consoleError=org.apache.log4j.ConsoleAppender +log4j.appender.consoleError.Target=System.out +log4j.appender.consoleError.Threshold=WARN +log4j.appender.consoleError.layout=org.apache.log4j.PatternLayout +log4j.appender.consoleError.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + + +#log4j.logger.org.springframework=DEBUG, consoleError, fullDebug +#log4j.logger.org.hibernate=DEBUG, consoleError, fullDebug +#log4j.logger.com.deepclone.lw=DEBUG, stdout, fullDebug +#log4j.logger.com.deepclone.lw.interfaces.eventlog=TRACE, fullDebug, server + + +log4j.logger.org.springframework=WARN, server +log4j.logger.org.springframework=INFO, fullDebug +log4j.logger.com.deepclone.lw=DEBUG, fullDebug +log4j.logger.com.deepclone.lw.interfaces.eventlog=DEBUG, server diff --git a/legacyworlds-server/legacyworlds-server-main/src/main/resources/lw-server.xml b/legacyworlds-server/legacyworlds-server-main/src/main/resources/lw-server.xml new file mode 100644 index 0000000..40e41af --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-main/src/main/resources/lw-server.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-tests/.classpath b/legacyworlds-server/legacyworlds-server-tests/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-tests/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-tests/.project b/legacyworlds-server/legacyworlds-server-tests/.project new file mode 100644 index 0000000..076ecb4 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-tests/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-tests/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..96c9dfc --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:20:32 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-tests/pom.xml b/legacyworlds-server/legacyworlds-server-tests/pom.xml new file mode 100644 index 0000000..ccf4b6b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-tests/pom.xml @@ -0,0 +1,77 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-tests + Legacy Worlds server tests + 5.99.1 + This package regroups all tests for server capabilities. + + + + legacyworlds-server-beans-accounts + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-bt + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-eventlog + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-i18n + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-mailer + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-naming + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-simple + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-system + com.deepclone.lw + ${project.version} + + + legacyworlds-server-beans-user + com.deepclone.lw + ${project.version} + + + + junit + junit + ${junit.version} + test + + + org.springframework + spring-test + ${org.springframework.version} + test + + + + diff --git a/legacyworlds-server/legacyworlds-server-utils/.classpath b/legacyworlds-server/legacyworlds-server-utils/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-server/legacyworlds-server-utils/.project b/legacyworlds-server/legacyworlds-server-utils/.project new file mode 100644 index 0000000..fc174e7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/.project @@ -0,0 +1,23 @@ + + + legacyworlds-server-utils + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-server/legacyworlds-server-utils/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-server/legacyworlds-server-utils/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..6939a66 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 09 10:20:36 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-server/legacyworlds-server-utils/pom.xml b/legacyworlds-server/legacyworlds-server-utils/pom.xml new file mode 100644 index 0000000..492a2e1 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + + legacyworlds-server + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-server-utils + 5.99.1 + Legacy Worlds server utility classes + This package contains utility classes used by various parts of the server-side code. + + + + com.deepclone.lw + legacyworlds-utils + ${project.version} + + + \ No newline at end of file diff --git a/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Base64Serializer.java b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Base64Serializer.java new file mode 100644 index 0000000..9b9bd5c --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Base64Serializer.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.utils; + + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +import org.apache.commons.codec.binary.Base64; + + + +/** + * Helper class for serialisation to Base-64 and de-serialisation from Base-64. + * + * @author tseeker + */ +public final class Base64Serializer +{ + + /** Empty, private constructor that prevents instantiation */ + private Base64Serializer( ) + { + // EMPTY + } + + + /** + * Serialises an object and encodes it as Base-64. + * + * @param value + * object to serialise + * @return Base-64 encoded data resulting from the serialisation + */ + public static String encode( Serializable value ) + { + ByteArrayOutputStream baos = new ByteArrayOutputStream( ); + ObjectOutputStream oos; + + try { + oos = new ObjectOutputStream( baos ); + try { + oos.writeObject( value ); + } finally { + try { + oos.close( ); + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + } + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + + return Base64.encodeBase64String( baos.toByteArray( ) ); + } + + + /** + * De-serialises an object from a Base-64 encoded string. + * + * @param data + * Base-64 encoded string containing the serialised object + * @return de-serialised object + */ + public static Serializable decode( String data ) + { + ByteArrayInputStream bais = new ByteArrayInputStream( Base64.decodeBase64( data ) ); + ObjectInputStream ois; + + try { + ois = new ObjectInputStream( bais ); + try { + return (Serializable) ois.readObject( ); + } catch ( ClassNotFoundException e ) { + throw new RuntimeException( e ); + } finally { + try { + ois.close( ); + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + } + } catch ( IOException e ) { + throw new RuntimeException( e ); + } + } + +} diff --git a/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/EmailAddress.java b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/EmailAddress.java new file mode 100644 index 0000000..5f1a169 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/EmailAddress.java @@ -0,0 +1,78 @@ +package com.deepclone.lw.utils; + + +import java.util.regex.Pattern; + + + +/** + * This class provides e-mail address validation and sanitation. + * + * @author tseeker + */ +public class EmailAddress +{ + + // RFC 2822 2.2.2 Structured Header Field Bodies + private static final String wsp = "[ \\t]"; // space or tab + private static final String fwsp = wsp + "*"; + + // RFC 2822 3.2.1 Primitive tokens + private static final String dquote = "\\\""; + // ASCII Control characters excluding white space: + private static final String noWsCtl = "\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F"; + // all ASCII characters except CR and LF: + private static final String asciiText = "[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F]"; + + // RFC 2822 3.2.2 Quoted characters: + // single backslash followed by a text char + private static final String quotedPair = "(\\\\" + asciiText + ")"; + + // RFC 2822 3.2.4 Atom: + private static final String atext = "[a-zA-Z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; + private static final String dotAtomText = atext + "+" + "(" + "\\." + atext + "+)*"; + private static final String dotAtom = fwsp + "(" + dotAtomText + ")" + fwsp; + + // RFC 2822 3.2.5 Quoted strings: + // noWsCtl and the rest of ASCII except the doublequote and backslash characters: + private static final String qtext = "[" + noWsCtl + "\\x21\\x23-\\x5B\\x5D-\\x7E]"; + private static final String qcontent = "(" + qtext + "|" + quotedPair + ")"; + private static final String quotedString = dquote + "(" + fwsp + qcontent + ")*" + fwsp + dquote; + + // RFC 1035 tokens for domain names: + private static final String letter = "[a-zA-Z]"; + private static final String letDig = "[a-zA-Z0-9]"; + private static final String letDigHyp = "[a-zA-Z0-9-]"; + private static final String rfcLabel = letDig + "(" + letDigHyp + "{0,61}" + letDig + ")?"; + private static final String domain = rfcLabel + "(\\." + rfcLabel + ")*\\." + letter + "{2,6}"; + + private static final String localPart = "((" + dotAtom + ")|(" + quotedString + "))"; + private static final String addrSpec = localPart + "@" + domain; + + /** The pattern used to validate email addresses */ + public static final Pattern VALID_PATTERN = Pattern.compile( addrSpec ); + + /** The sanitised version of the original e-mail address */ + private String cleanAddress; + + + /** Creates a sanitiser/validator from a string */ + public EmailAddress( String address ) + { + this.cleanAddress = address.toLowerCase( ).trim( ); + } + + + /** @return the sanitised version of the address */ + public String getAddress( ) + { + return this.cleanAddress; + } + + + /** @return whether the specified address is valid or not */ + public boolean isValid( ) + { + return VALID_PATTERN.matcher( this.cleanAddress ).matches( ); + } +} diff --git a/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Password.java b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Password.java new file mode 100644 index 0000000..c7e34e7 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/Password.java @@ -0,0 +1,110 @@ +package com.deepclone.lw.utils; + + +import java.util.regex.Pattern; + + + +/** + * This class provide password-related services, such as strength evaluation and hashing. + * + * @author tseeker + */ +public class Password +{ + + /** The various regular expressions used to evaluate a password's strength */ + private static final String regexps[] = { + "[a-z]" , "[A-Z]" , "\\d" , ".*\\d.+\\d.+\\d" , "[^a-zA-Z\\d]" , "[^a-zA-Z\\d].*[^a-zA-Z\\d]" , + "([a-zA-Z].*\\d)|(\\d.*[a-zA-Z])" , "([a-z].*[A-Z])|([A-Z].*[a-z])" , + "([^a-zA-Z\\d][a-zA-Z\\d])|([a-zA-Z\\d][^a-zA-Z\\d])" + }; + + /** The scores associated with each regular expression */ + private static final int reScores[] = { + 1 , 5 , 5 , 5 , 5 , 5 , 2 , 2 , 2 + }; + + /** Compiled regular expressions for strength evaluation */ + private static Pattern patterns[] = null; + + + /** + * This method makes sure that strength evaluation RE's have been compiled and can be used. + */ + private static void initPatterns( ) + { + synchronized ( Password.class ) { + if ( Password.patterns != null ) { + return; + } + + Password.patterns = new Pattern[ Password.regexps.length ]; + for ( int i = 0 ; i < Password.regexps.length ; i++ ) { + Password.patterns[ i ] = Pattern.compile( Password.regexps[ i ] ); + } + } + } + + /** The original password string */ + private String password; + + + /** Initialise the instance with a specific password string */ + public Password( String password ) + { + this.password = password; + } + + + /** @return the password's strength */ + public int getStrength( ) + { + return this.getLengthStrength( ) + this.getPatternStrength( ); + } + + + /** @return the password's SHA-1 hash (hex encoded) */ + public String getSha1( ) + { + return DigestHelper.digest( "sha-1" , this.password ); + } + + + /** @return the password's MD5 hash (hex encoded) */ + public String getMd5( ) + { + return DigestHelper.digest( "md5" , this.password ); + } + + + /** @return the password's strength based on regular expressions */ + private int getPatternStrength( ) + { + int strength = 0; + Password.initPatterns( ); + for ( int i = 0 ; i < Password.regexps.length ; i++ ) { + if ( Password.patterns[ i ].matcher( this.password ).find( ) ) { + strength += Password.reScores[ i ]; + } else { + } + } + return strength; + } + + + /** @return the password's strength based on length */ + private int getLengthStrength( ) + { + int len = this.password.length( ); + if ( len < 5 ) { + return 3; + } else if ( len < 8 ) { + return 6; + } else if ( len < 16 ) { + return 12; + } + return 18; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/RandomStringGenerator.java b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/RandomStringGenerator.java new file mode 100644 index 0000000..e48af15 --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/RandomStringGenerator.java @@ -0,0 +1,95 @@ +package com.deepclone.lw.utils; + + +import java.util.HashSet; +import java.util.Set; + + + +/** + * This class implements a random string generator, for use by stuff like validation tokens, planet + * names, etc. It can be used either directly or as a bean. + * + * @author tseeker + */ +public class RandomStringGenerator +{ + + /** The set of characters that can be used */ + private Character[] characters = { + '0' , '1' + }; + + /** The length of the stings to generate */ + private int length = 2; + + + /** + * Updates the instance's character set. + * + * @param characters + * a string that contains the new set of characters. + * @throws IllegalArgumentException + * if there are less than 2 characters in the set + */ + public void setCharacterSet( String characters ) + throws IllegalArgumentException + { + Set< Character > chSet = new HashSet< Character >( ); + for ( Character c : characters.toCharArray( ) ) { + chSet.add( c ); + } + + if ( chSet.size( ) < 2 ) { + throw new IllegalArgumentException( ); + } + + this.characters = chSet.toArray( new Character[ 1 ] ); + } + + + /** + * Sets the instance's string length. + * + * @param length + * the new string length + * @throws IllegalArgumentException + * if the specified length is lower than 2 + */ + public void setLength( int length ) + throws IllegalArgumentException + { + if ( length < 2 ) { + throw new IllegalArgumentException( ); + } + this.length = length; + } + + + /** + * Generates a random string. The string will have a fixed length and contain only characters + * from the generator's character set. + * + * @return the generated string + */ + public String generate( ) + { + String str = ""; + for ( int i = 0 ; i < this.length ; i++ ) { + str += this.getRandomChar( ); + } + return str; + } + + + /** + * @return a random character from the character set. + */ + private Character getRandomChar( ) + { + Double d = Math.random( ); + d *= this.characters.length; + return this.characters[ (int) Math.floor( d ) ]; + } + +} diff --git a/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/StoredProc.java b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/StoredProc.java new file mode 100644 index 0000000..9277a1b --- /dev/null +++ b/legacyworlds-server/legacyworlds-server-utils/src/main/java/com/deepclone/lw/utils/StoredProc.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.utils; + + +import java.sql.Types; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.SqlOutParameter; +import org.springframework.jdbc.core.SqlParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; + + + +public class StoredProc +{ + + private SimpleJdbcCall storedProc; + + + public StoredProc( DataSource dataSource , String schema , String function ) + { + this.storedProc = new SimpleJdbcCall( dataSource ); + this.storedProc.withCatalogName( schema ).withFunctionName( function ); + this.storedProc.withoutProcedureColumnMetaDataAccess( ); + } + + + public StoredProc addParameter( String name , int sqlType ) + { + this.storedProc.addDeclaredParameter( new SqlParameter( name , sqlType ) ); + return this; + } + + + public StoredProc addParameter( String name , String typeName ) + { + this.storedProc.addDeclaredParameter( new SqlParameter( name , Types.OTHER , typeName ) ); + return this; + } + + + public StoredProc addOutput( String name , int sqlType ) + { + this.storedProc.addDeclaredParameter( new SqlOutParameter( name , sqlType ) ); + return this; + } + + + public Map< String , Object > execute( Object... args ) + { + return this.storedProc.execute( args ); + } +} diff --git a/legacyworlds-server/pom.xml b/legacyworlds-server/pom.xml new file mode 100644 index 0000000..db8aa26 --- /dev/null +++ b/legacyworlds-server/pom.xml @@ -0,0 +1,85 @@ + + 4.0.0 + + legacyworlds + com.deepclone.lw + 5.99.1 + + com.deepclone.lw + legacyworlds-server + Legacy Worlds server + 5.99.1 + pom + This metapackage is the root of the game server's components' code. + + + + + org.springframework + spring-core + ${org.springframework.version} + + + org.springframework + spring-context + ${org.springframework.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-jdbc + ${org.springframework.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${org.slf4j.version} + + + + log4j + log4j + ${log4j.version} + + + + commons-dbcp + commons-dbcp + ${commons.dbcp.version} + + + + cglib + cglib + ${cglib.version} + + + + + + legacyworlds-server-data + legacyworlds-server-beans + legacyworlds-server-tests + legacyworlds-server-interfaces + legacyworlds-server-utils + legacyworlds-server-main + + + \ No newline at end of file diff --git a/legacyworlds-session/.classpath b/legacyworlds-session/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-session/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-session/.project b/legacyworlds-session/.project new file mode 100644 index 0000000..a0b0b33 --- /dev/null +++ b/legacyworlds-session/.project @@ -0,0 +1,23 @@ + + + legacyworlds-session + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-session/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-session/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8d7d4ea --- /dev/null +++ b/legacyworlds-session/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Tue Apr 13 16:03:03 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-session/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-session/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..83991fa --- /dev/null +++ b/legacyworlds-session/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Tue Apr 13 16:03:03 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-session/pom.xml b/legacyworlds-session/pom.xml new file mode 100644 index 0000000..3ea53f7 --- /dev/null +++ b/legacyworlds-session/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + legacyworlds + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-session + 5.99.1 + Legacy Worlds sessions + This module contains the definition of sessions used in client-server communications and all related classes and exceptions. + + \ No newline at end of file diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeCommand.java new file mode 100644 index 0000000..3a6bbef --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeCommand.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd; + +import com.deepclone.lw.session.Command; + +public class CreateAuthChallengeCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeResponse.java new file mode 100644 index 0000000..1e5ad58 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/CreateAuthChallengeResponse.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd; + + +import com.deepclone.lw.session.CommandResponse; + + + +public class CreateAuthChallengeResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final String challenge; + + + public CreateAuthChallengeResponse( String challenge ) + { + this.challenge = challenge; + } + + + public String getChallenge( ) + { + return this.challenge; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MailError.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MailError.java new file mode 100644 index 0000000..33c805c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MailError.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.cmd; + + +public enum MailError { + + EMPTY , + INVALID , + IN_USE , + SEND_FAIL , + MISMATCH + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MaintenanceResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MaintenanceResponse.java new file mode 100644 index 0000000..efe9995 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/MaintenanceResponse.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.cmd; + + +import java.sql.Timestamp; +import java.util.Date; + +import com.deepclone.lw.session.CommandResponse; + + + +public class MaintenanceResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final Timestamp start; + + private final Timestamp end; + + private final String reason; + + + public MaintenanceResponse( Timestamp start , Timestamp end , String reason ) + { + this.start = start; + this.end = end; + this.reason = reason; + } + + + public Timestamp getStart( ) + { + return start; + } + + + public Timestamp getEnd( ) + { + return end; + } + + + public String getReason( ) + { + return reason; + } + + + public boolean isLate( ) + { + return this.end.before( new Date( ) ); + } + + + public Timestamp getCurrent( ) + { + return new Timestamp( new Date( ).getTime( ) ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ObjectNameError.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ObjectNameError.java new file mode 100644 index 0000000..650e8fb --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ObjectNameError.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd; + + +public enum ObjectNameError { + + EMPTY , + UNAVAILABLE , + BANNED , + INVALID + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/PasswordError.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/PasswordError.java new file mode 100644 index 0000000..c376da2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/PasswordError.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd; + + +public enum PasswordError { + + EMPTY , + TOO_WEAK , + MISMATCH + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewCommand.java new file mode 100644 index 0000000..fa340fe --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewCommand.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd.admin; + +import com.deepclone.lw.session.Command; + +public class AdminOverviewCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewResponse.java new file mode 100644 index 0000000..b292818 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminOverviewResponse.java @@ -0,0 +1,29 @@ +package com.deepclone.lw.cmd.admin; + + +import com.deepclone.lw.cmd.admin.adata.AdminOverview; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class AdminOverviewResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + private final AdminOverview overview; + + + public AdminOverviewResponse( Administrator admin , AdminOverview overview ) + { + super( admin ); + this.overview = overview; + } + + + public AdminOverview getOverview( ) + { + return overview; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminResponse.java new file mode 100644 index 0000000..7be1d55 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/AdminResponse.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.session.CommandResponse; + + + +public class AdminResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final Administrator admin; + private final boolean privilegeOk; + + + public AdminResponse( Administrator admin ) + { + this.admin = admin; + this.privilegeOk = true; + } + + + public AdminResponse( Administrator admin , boolean priv ) + { + this.admin = admin; + this.privilegeOk = priv; + } + + + public Administrator getAdmin( ) + { + return admin; + } + + + public boolean isPrivilegeOk( ) + { + return privilegeOk; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/NoOperationCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/NoOperationCommand.java new file mode 100644 index 0000000..4765054 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/NoOperationCommand.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.cmd.admin; + + +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.session.Command; + + + +public class NoOperationCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final Privileges requirePrivilege; + + + public NoOperationCommand( ) + { + this.requirePrivilege = null; + } + + + public NoOperationCommand( Privileges requirePrivilege ) + { + this.requirePrivilege = requirePrivilege; + } + + + public Privileges getRequirePrivilege( ) + { + return requirePrivilege; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordCommand.java new file mode 100644 index 0000000..49eeb2f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.admin; + + +import com.deepclone.lw.session.Command; + + + +public class SetPasswordCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String sha1Auth; + private final String md5Auth; + private final String password; + private final String passwordConfirm; + + + public SetPasswordCommand( String sha1Auth , String md5Auth , String password , String passwordConfirm ) + { + this.sha1Auth = sha1Auth; + this.md5Auth = md5Auth; + this.password = password; + this.passwordConfirm = passwordConfirm; + } + + + public String getSha1Auth( ) + { + return sha1Auth; + } + + + public String getMd5Auth( ) + { + return md5Auth; + } + + + public String getPassword( ) + { + return password; + } + + + public String getPasswordConfirm( ) + { + return passwordConfirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordResponse.java new file mode 100644 index 0000000..a4a429f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/SetPasswordResponse.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.cmd.admin; + + +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class SetPasswordResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum PasswordChangeStatus { + OK , + EMPTY , + TOO_WEAK , + MISMATCH , + PROHIBITED + } + + private final boolean authError; + private final PasswordChangeStatus passwordError; + + + public SetPasswordResponse( ) + { + super( null ); + this.authError = false; + this.passwordError = PasswordChangeStatus.OK; + } + + + public SetPasswordResponse( Administrator admin , boolean authError , PasswordChangeStatus changeStatus ) + { + super( admin ); + this.authError = authError; + this.passwordError = changeStatus; + } + + + public boolean isAuthError( ) + { + return authError; + } + + + public PasswordChangeStatus getPasswordError( ) + { + return passwordError; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdminOverview.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdminOverview.java new file mode 100644 index 0000000..4eb221b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdminOverview.java @@ -0,0 +1,106 @@ +package com.deepclone.lw.cmd.admin.adata; + + +import java.io.Serializable; + + + +public class AdminOverview + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private long newMessages; + private Long pendingNames; + private Long pendingBans; + private Long pendingBugs; + private Long openBugs; + private Long updatedBugs; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public long getNewMessages( ) + { + return newMessages; + } + + + public void setNewMessages( Long newMessages ) + { + this.newMessages = newMessages; + } + + + public Long getPendingNames( ) + { + return pendingNames; + } + + + public void setPendingNames( Long pendingNames ) + { + this.pendingNames = pendingNames; + } + + + public Long getPendingBans( ) + { + return pendingBans; + } + + + public void setPendingBans( Long pendingBans ) + { + this.pendingBans = pendingBans; + } + + + public Long getPendingBugs( ) + { + return pendingBugs; + } + + + public void setPendingBugs( Long pendingBugs ) + { + this.pendingBugs = pendingBugs; + } + + + public Long getOpenBugs( ) + { + return openBugs; + } + + + public void setOpenBugs( Long openBugs ) + { + this.openBugs = openBugs; + } + + + public Long getUpdatedBugs( ) + { + return updatedBugs; + } + + + public void setUpdatedBugs( Long updatedBugs ) + { + this.updatedBugs = updatedBugs; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Administrator.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Administrator.java new file mode 100644 index 0000000..19c3dbf --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Administrator.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.cmd.admin.adata; + + +import java.util.List; + + + +public class Administrator + extends AdministratorBasics +{ + + private static final long serialVersionUID = 1L; + + private String address; + private boolean passwordChange; + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public void setPasswordChange( boolean passChangeRequired ) + { + this.passwordChange = passChangeRequired; + } + + + public boolean isPasswordChange( ) + { + return passwordChange; + } + + + public List< PrivEntry > getAllPrivileges( ) + { + return PrivEntry.fromPrivileges( this.privileges ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdministratorBasics.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdministratorBasics.java new file mode 100644 index 0000000..2f7342b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/AdministratorBasics.java @@ -0,0 +1,139 @@ +package com.deepclone.lw.cmd.admin.adata; + + +import java.io.Serializable; +import java.util.List; + + + +public class AdministratorBasics + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String name; + protected int privileges; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public void setPrivileges( int privileges ) + { + this.privileges = privileges; + } + + + public boolean isSuperuser( ) + { + return Privileges.SUPER.hasPrivilege( this.privileges ); + } + + + public boolean isCanSpam( ) + { + return Privileges.SPAM.hasPrivilege( this.privileges ); + } + + + public boolean isTranslator( ) + { + return Privileges.I18N.hasPrivilege( this.privileges ); + } + + + public boolean isConstantsAdmin( ) + { + return Privileges.CNST.hasPrivilege( this.privileges ); + } + + + public boolean isUserAdmin( ) + { + return Privileges.USER.hasPrivilege( this.privileges ); + } + + + public boolean isBanhammerUser( ) + { + return Privileges.BANH.hasPrivilege( this.privileges ); + } + + + public boolean isTickAdmin( ) + { + return Privileges.TICK.hasPrivilege( this.privileges ); + } + + + public boolean isNameAdmin( ) + { + return Privileges.NAME.hasPrivilege( this.privileges ); + } + + + public boolean isPrefAdmin( ) + { + return Privileges.PREF.hasPrivilege( this.privileges ); + } + + + public boolean isCanViewLogs( ) + { + return Privileges.LOGS.hasPrivilege( this.privileges ); + } + + + public boolean isBugMailReceiver( ) + { + return Privileges.BUGM.hasPrivilege( this.privileges ); + } + + + public boolean isBugTrackerAdmin( ) + { + return Privileges.BUGT.hasPrivilege( this.privileges ); + } + + + public boolean isMaintenanceAdmin( ) + { + return Privileges.MNTM.hasPrivilege( this.privileges ); + } + + + public boolean hasPrivilege( Privileges priv ) + { + return priv.hasPrivilege( this.privileges ); + } + + + public List< Privileges > getPrivileges( ) + { + return Privileges.getPrivileges( this.privileges ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/PrivEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/PrivEntry.java new file mode 100644 index 0000000..82c496d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/PrivEntry.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.adata; + + +import java.util.LinkedList; +import java.util.List; + + + +public class PrivEntry +{ + private final Privileges privilege; + private final boolean present; + + + private PrivEntry( Privileges priv , int uPriv ) + { + this.privilege = priv; + this.present = ( priv == Privileges.SUPER && priv.hasPrivilege( uPriv ) ) + || ( !Privileges.SUPER.hasPrivilege( uPriv ) && priv.hasPrivilege( uPriv ) ); + } + + + public Privileges getPrivilege( ) + { + return privilege; + } + + + public boolean isPresent( ) + { + return present; + } + + + public static List< PrivEntry > fromPrivileges( int privileges ) + { + List< PrivEntry > privs = new LinkedList< PrivEntry >( ); + for ( Privileges p : Privileges.values( ) ) { + privs.add( new PrivEntry( p , privileges ) ); + } + return privs; + + } +} \ No newline at end of file diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Privileges.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Privileges.java new file mode 100644 index 0000000..824fb65 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/adata/Privileges.java @@ -0,0 +1,71 @@ +package com.deepclone.lw.cmd.admin.adata; + + +import java.util.ArrayList; +import java.util.List; + + + +public enum Privileges { + + SPAM( 0x00000001 , "Sending in-game spam" ) , + I18N( 0x00000002 , "Managing translations" ) , + CNST( 0x00000004 , "Modifying game constants" ) , + USER( 0x00000008 , "Managing user accounts" ) , + BANH( 0x00000010 , "Using the banhammer" ) , + TICK( 0x00000020 , "Pausing/restarting server-side tasks" ) , + NAME( 0x00000040 , "Validating empire and planet names" ) , + PREF( 0x00000080 , "Setting default preferences" ) , + LOGS( 0x00000100 , "Browsing server logs" ) , + BUGM( 0x00000200 , "Receiving automated error e-mail" ) , + BUGT( 0x00000400 , "Managing bugs reported through the bug tracker" ) , + MNTM( 0x00000800 , "Activating/disabling maintenance mode" ) , + SUPER( 0x80000000 , "Superuser (all privileges + admin management)" ); + + private final int bits; + private final String description; + + + private Privileges( int bits , String description ) + { + this.bits = bits; + this.description = description; + } + + + public int getBits( ) + { + return bits; + } + + + public String getDescription( ) + { + return description; + } + + + public boolean hasPrivilege( int privs ) + { + return ( privs & this.bits ) != 0 || ( privs & 0x80000000 ) != 0; + } + + + public static List< Privileges > getPrivileges( int privs ) + { + List< Privileges > result = new ArrayList< Privileges >( ); + for ( Privileges p : Privileges.values( ) ) { + if ( p.hasPrivilege( privs ) ) { + result.add( p ); + } + } + return result; + } + + + public int grant( int privileges ) + { + return privileges | this.bits; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ArchivedBanRequest.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ArchivedBanRequest.java new file mode 100644 index 0000000..d04e0ce --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ArchivedBanRequest.java @@ -0,0 +1,80 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.sql.Timestamp; + + + +public class ArchivedBanRequest + extends BanRequest +{ + + private static final long serialVersionUID = 1L; + + private Timestamp update; + private boolean expired; + private Integer rejectedById; + private String rejectedByName; + private String rejectionReason; + + + public Timestamp getUpdate( ) + { + return update; + } + + + public void setUpdate( Timestamp update ) + { + this.update = update; + } + + + public boolean isExpired( ) + { + return expired; + } + + + public void setExpired( boolean expired ) + { + this.expired = expired; + } + + + public Integer getRejectedById( ) + { + return rejectedById; + } + + + public void setRejectedById( Integer rejectedById ) + { + this.rejectedById = rejectedById; + } + + + public String getRejectedByName( ) + { + return rejectedByName; + } + + + public void setRejectedByName( String rejectedByName ) + { + this.rejectedByName = rejectedByName; + } + + + public String getRejectionReason( ) + { + return rejectionReason; + } + + + public void setRejectionReason( String rejectionReason ) + { + this.rejectionReason = rejectionReason; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanRequest.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanRequest.java new file mode 100644 index 0000000..dee4b52 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanRequest.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class BanRequest + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private int requestedById; + private String requestedByName; + private String reason; + private Timestamp timestamp; + private int accountId; + private String accountMail; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public int getRequestedById( ) + { + return requestedById; + } + + + public void setRequestedById( int requestedById ) + { + this.requestedById = requestedById; + } + + + public String getRequestedByName( ) + { + return requestedByName; + } + + + public void setRequestedByName( String requestedByName ) + { + this.requestedByName = requestedByName; + } + + + public String getReason( ) + { + return reason; + } + + + public void setReason( String reason ) + { + this.reason = reason; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public void setTimestamp( Timestamp timestamp ) + { + this.timestamp = timestamp; + } + + + public int getAccountId( ) + { + return accountId; + } + + + public void setAccountId( int accountId ) + { + this.accountId = accountId; + } + + + public String getAccountMail( ) + { + return accountMail; + } + + + public void setAccountMail( String accountMail ) + { + this.accountMail = accountMail; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanType.java new file mode 100644 index 0000000..fa2e744 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BanType.java @@ -0,0 +1,8 @@ +package com.deepclone.lw.cmd.admin.bans; + + +public enum BanType { + PENDING , + ARCHIVED , + VALIDATED +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryCommand.java new file mode 100644 index 0000000..6b54955 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class BansSummaryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryResponse.java new file mode 100644 index 0000000..9cfe672 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/BansSummaryResponse.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class BansSummaryResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final List< SummaryEntry > entries; + + + public BansSummaryResponse( Administrator admin ) + { + super( admin , false ); + this.entries = null; + } + + + public BansSummaryResponse( Administrator admin , List< SummaryEntry > entries ) + { + super( admin ); + this.entries = entries; + } + + + public List< SummaryEntry > getEntries( ) + { + return entries; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ConfirmBanCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ConfirmBanCommand.java new file mode 100644 index 0000000..3ff608c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ConfirmBanCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class ConfirmBanCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + + + public ConfirmBanCommand( int id ) + { + this.id = id; + } + + + public int getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/LiftBanCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/LiftBanCommand.java new file mode 100644 index 0000000..24f2067 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/LiftBanCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class LiftBanCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + + + public LiftBanCommand( int id ) + { + this.id = id; + } + + + public int getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansCommand.java new file mode 100644 index 0000000..1ba7c91 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class ListBansCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final BanType type; + + + public ListBansCommand( BanType type ) + { + this.type = type; + } + + + public BanType getType( ) + { + return type; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansResponse.java new file mode 100644 index 0000000..c956cec --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ListBansResponse.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ListBansResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final BanType type; + private final List< BanRequest > bans; + + + public ListBansResponse( Administrator admin ) + { + super( admin , false ); + this.type = null; + this.bans = null; + } + + + public ListBansResponse( Administrator admin , BanType type , List< BanRequest > bans ) + { + super( admin ); + this.type = type; + this.bans = bans; + } + + + public BanType getType( ) + { + return type; + } + + + public List< BanRequest > getBans( ) + { + return bans; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanCommand.java new file mode 100644 index 0000000..1e5e56b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class RejectBanCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + private final String reason; + + + public RejectBanCommand( int id , String reason ) + { + this.id = id; + this.reason = reason; + } + + + public int getId( ) + { + return id; + } + + + public String getReason( ) + { + return reason; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanResponse.java new file mode 100644 index 0000000..caa0a1e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RejectBanResponse.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class RejectBanResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + private final boolean error; + private final int id; + + + public RejectBanResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.error = false; + this.id = 0; + } + + + public RejectBanResponse( Administrator admin , int requestId ) + { + super( admin ); + this.error = true; + this.id = requestId; + } + + + public boolean isError( ) + { + return error; + } + + + public int getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanCommand.java new file mode 100644 index 0000000..8f6e882 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanCommand.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.session.Command; + + + +public class RequestBanCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String user; + private final boolean empire; + private final String reason; + + + public RequestBanCommand( String user , boolean empire , String reason ) + { + this.user = user; + this.empire = empire; + this.reason = reason; + } + + + public String getUser( ) + { + return user; + } + + + public boolean isEmpire( ) + { + return empire; + } + + + public String getReason( ) + { + return reason; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanResponse.java new file mode 100644 index 0000000..8637681 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/RequestBanResponse.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class RequestBanResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum Error { + NOT_FOUND , + BANNED , + NO_REASON + } + + private final Error error; + private final String user; + private final boolean empire; + private final String reason; + + + public RequestBanResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.error = null; + this.user = null; + this.empire = false; + this.reason = null; + } + + + public RequestBanResponse( Administrator admin , Error error , String user , boolean empire , String reason ) + { + super( admin ); + this.error = error; + this.user = user; + this.empire = empire; + this.reason = reason; + } + + + public Error getError( ) + { + return error; + } + + + public String getUser( ) + { + return user; + } + + + public boolean isEmpire( ) + { + return empire; + } + + + public String getReason( ) + { + return reason; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/SummaryEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/SummaryEntry.java new file mode 100644 index 0000000..0fcfa02 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/SummaryEntry.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.io.Serializable; + + + +public class SummaryEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final BanType type; + private final long count; + + + public SummaryEntry( BanType type , long count ) + { + this.type = type; + this.count = count; + } + + + public BanType getType( ) + { + return type; + } + + + public long getCount( ) + { + return count; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ValidatedBanRequest.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ValidatedBanRequest.java new file mode 100644 index 0000000..dfa6945 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bans/ValidatedBanRequest.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.cmd.admin.bans; + + +import java.sql.Timestamp; + + + +public class ValidatedBanRequest + extends BanRequest +{ + + private static final long serialVersionUID = 1L; + + private Timestamp update; + private boolean redeemable; + private int validatedById; + private String validatedByName; + + + public Timestamp getUpdate( ) + { + return update; + } + + + public void setUpdate( Timestamp update ) + { + this.update = update; + } + + + public boolean isRedeemable( ) + { + return redeemable; + } + + + public void setRedeemable( boolean redeemable ) + { + this.redeemable = redeemable; + } + + + public int getValidatedById( ) + { + return validatedById; + } + + + public void setValidatedById( int validatedById ) + { + this.validatedById = validatedById; + } + + + public String getValidatedByName( ) + { + return validatedByName; + } + + + public void setValidatedByName( String validatedByName ) + { + this.validatedByName = validatedByName; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryCommand.java new file mode 100644 index 0000000..d5846a0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryCommand.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.cmd.admin.bt; + +import com.deepclone.lw.session.Command; + + +public class BugsSummaryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryResponse.java new file mode 100644 index 0000000..c399f41 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/BugsSummaryResponse.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class BugsSummaryResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final long pending; + private final long open; + private final long own; + private final long updated; + private final long total; + + + public BugsSummaryResponse( Administrator admin ) + { + super( admin , false ); + this.pending = 0; + this.open = 0; + this.own = 0; + this.updated = 0; + this.total = 0; + } + + + public BugsSummaryResponse( Administrator admin , long pending , long open , long own , long updated , long total ) + { + super( admin ); + this.pending = pending; + this.open = open; + this.own = own; + this.updated = updated; + this.total = total; + } + + + public long getPending( ) + { + return pending; + } + + + public long getOpen( ) + { + return open; + } + + + public long getOwn( ) + { + return own; + } + + + public long getUpdated( ) + { + return updated; + } + + + public long getTotal( ) + { + return total; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotCommand.java new file mode 100644 index 0000000..9aa671a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.session.Command; + + + +public class GetSnapshotCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long bugId; + + + public GetSnapshotCommand( long bugId ) + { + this.bugId = bugId; + } + + + public long getBugId( ) + { + return bugId; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotResponse.java new file mode 100644 index 0000000..439c768 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/GetSnapshotResponse.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class GetSnapshotResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final String snapshot; + + + public GetSnapshotResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.snapshot = null; + } + + + public GetSnapshotResponse( Administrator admin , String snapshot ) + { + super( admin ); + this.snapshot = snapshot; + } + + + public String getSnapshot( ) + { + return snapshot; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ListBugsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ListBugsResponse.java new file mode 100644 index 0000000..4975ab8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ListBugsResponse.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.BugReport; +import com.deepclone.lw.cmd.bt.data.BugStatus; + + + +public class ListBugsResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final BugStatus status; + private final boolean ownOnly; + private final long first; + private final int count; + private final long entries; + private final List< BugReport > reports; + + + public ListBugsResponse( Administrator admin ) + { + super( admin , false ); + this.status = null; + this.ownOnly = false; + this.first = 0; + this.count = 0; + this.entries = 0; + this.reports = null; + } + + + public ListBugsResponse( Administrator admin , BugStatus status , boolean ownOnly , long first , int count , + long entries , List< BugReport > reports ) + { + super( admin ); + this.status = status; + this.ownOnly = ownOnly; + this.first = first; + this.count = count; + this.entries = entries; + this.reports = reports; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public boolean isOwnOnly( ) + { + return ownOnly; + } + + + public long getFirst( ) + { + return first; + } + + + public int getCount( ) + { + return count; + } + + + public long getEntries( ) + { + return entries; + } + + + public List< BugReport > getReports( ) + { + return reports; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeError.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeError.java new file mode 100644 index 0000000..bd05c3c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeError.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd.admin.bt; + + +public enum MergeError { + + NOT_FOUND , + MERGED , + STATUS + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsCommand.java new file mode 100644 index 0000000..f95de2f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.session.Command; + + + +public class MergeReportsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id1; + private final long id2; + + + public MergeReportsCommand( long id1 , long id2 ) + { + this.id1 = id1; + this.id2 = id2; + } + + + public long getId1( ) + { + return id1; + } + + + public long getId2( ) + { + return id2; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsResponse.java new file mode 100644 index 0000000..aedcc55 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/MergeReportsResponse.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugReport; + + + +public class MergeReportsResponse + extends ViewBugResponse +{ + + private static final long serialVersionUID = 1L; + + private final MergeError mergeError; + private final long mergeId; + + + public MergeReportsResponse( Administrator admin ) + { + super( admin , false ); + this.mergeError = null; + this.mergeId = 0; + } + + + public MergeReportsResponse( Administrator admin , boolean privError ) + { + super( admin , privError ); + this.mergeError = MergeError.NOT_FOUND; + this.mergeId = 0; + } + + + public MergeReportsResponse( Administrator admin , BugReport report , List< BugEvent > events , + MergeError mergeError , long mergeId ) + { + super( admin , report , events ); + this.mergeError = mergeError; + this.mergeId = mergeId; + } + + + public MergeReportsResponse( MergeReportsResponse response , Object query ) + { + super( response , query ); + this.mergeError = response.mergeError; + this.mergeId = response.mergeId; + } + + + public MergeError getMergeError( ) + { + return mergeError; + } + + + public long getMergeId( ) + { + return mergeId; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ModerateCommentCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ModerateCommentCommand.java new file mode 100644 index 0000000..f648c86 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ModerateCommentCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.session.Command; + + + +public class ModerateCommentCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final boolean validation; + + + public ModerateCommentCommand( long id , boolean validate ) + { + this.id = id; + this.validation = validate; + } + + + public long getId( ) + { + return id; + } + + + public boolean isValidation( ) + { + return validation; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/PostCommentResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/PostCommentResponse.java new file mode 100644 index 0000000..13a97f0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/PostCommentResponse.java @@ -0,0 +1,92 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugReport; + + + +public class PostCommentResponse + extends ViewBugResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean posted; + private final ObjectNameError commentError; + private final String comment; + private final boolean publicComment; + + + /** "Post comment" response indicating a successful post */ + public PostCommentResponse( Administrator admin ) + { + super( admin , false ); + this.posted = true; + this.comment = null; + this.commentError = null; + this.publicComment = false; + } + + + /** "Post comment" response indicating a missing report or privilege error */ + public PostCommentResponse( Administrator admin , boolean privError ) + { + super( admin , privError ); + this.posted = false; + this.comment = null; + this.commentError = null; + this.publicComment = false; + } + + + /** "Post comment" response indicating a comment error */ + public PostCommentResponse( Administrator admin , BugReport report , List< BugEvent > events , + ObjectNameError error , String comment , boolean publicComment ) + { + super( admin , report , events ); + this.posted = false; + this.commentError = error; + this.comment = comment; + this.publicComment = publicComment; + } + + + public PostCommentResponse( PostCommentResponse response , Object query ) + { + super( response , query ); + this.posted = false; + this.commentError = response.commentError; + this.comment = response.comment; + this.publicComment = response.publicComment; + } + + + public boolean isPosted( ) + { + return posted; + } + + + public ObjectNameError getCommentError( ) + { + return commentError; + } + + + public String getComment( ) + { + return comment; + } + + + public boolean isPublicComment( ) + { + return publicComment; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportBugResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportBugResponse.java new file mode 100644 index 0000000..3231103 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportBugResponse.java @@ -0,0 +1,119 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ReportBugResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final long bugId; + private final ObjectNameError titleError; + private final String title; + private final ObjectNameError descriptionError; + private final String description; + private final boolean publicReport; + private final Object query; + + + public ReportBugResponse( Administrator admin ) + { + super( admin , false ); + this.bugId = 0; + this.titleError = null; + this.title = null; + this.descriptionError = null; + this.description = null; + this.publicReport = false; + this.query = null; + } + + + public ReportBugResponse( Administrator admin , long bugId ) + { + super( admin ); + this.bugId = bugId; + this.titleError = null; + this.title = null; + this.descriptionError = null; + this.description = null; + this.publicReport = false; + this.query = null; + } + + + public ReportBugResponse( Administrator admin , ObjectNameError titleError , String title , + ObjectNameError descriptionError , String description , boolean publicReport ) + { + super( admin ); + this.bugId = 0; + this.titleError = titleError; + this.title = title; + this.descriptionError = descriptionError; + this.description = description; + this.publicReport = publicReport; + this.query = null; + } + + + public ReportBugResponse( ReportBugResponse response , Object query ) + { + super( response.getAdmin( ) , response.isPrivilegeOk( ) ); + this.bugId = 0; + this.titleError = response.titleError; + this.title = response.title; + this.descriptionError = response.descriptionError; + this.description = response.description; + this.publicReport = response.publicReport; + this.query = query; + } + + + public long getBugId( ) + { + return bugId; + } + + + public ObjectNameError getTitleError( ) + { + return titleError; + } + + + public String getTitle( ) + { + return title; + } + + + public ObjectNameError getDescriptionError( ) + { + return descriptionError; + } + + + public String getDescription( ) + { + return description; + } + + + public boolean isPublicReport( ) + { + return publicReport; + } + + + public Object getQuery( ) + { + return query; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportStatusCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportStatusCommand.java new file mode 100644 index 0000000..2f7ee85 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportStatusCommand.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.session.Command; + + + +public class ReportStatusCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final BugStatus status; + + + public ReportStatusCommand( long id , BugStatus status ) + { + this.id = id; + this.status = status; + } + + + public long getId( ) + { + return id; + } + + + public BugStatus getStatus( ) + { + return status; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportVisibilityCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportVisibilityCommand.java new file mode 100644 index 0000000..04d82c1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ReportVisibilityCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.session.Command; + + + +public class ReportVisibilityCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + + + public ReportVisibilityCommand( long id ) + { + this.id = id; + } + + + public long getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ValidateReportCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ValidateReportCommand.java new file mode 100644 index 0000000..704c018 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ValidateReportCommand.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.session.Command; + + + +public class ValidateReportCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final BugStatus status; + private final boolean publicReport; + private final int grantCredits; + private final boolean snapshot; + + + public ValidateReportCommand( long id , BugStatus status , boolean publicReport , int grantCredits , + boolean snapshot ) + { + this.id = id; + this.status = status; + this.publicReport = publicReport; + this.grantCredits = grantCredits; + this.snapshot = snapshot; + } + + + public long getId( ) + { + return id; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public boolean isPublicReport( ) + { + return publicReport; + } + + + public int getGrantCredits( ) + { + return grantCredits; + } + + + public boolean isSnapshot( ) + { + return snapshot; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ViewBugResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ViewBugResponse.java new file mode 100644 index 0000000..eccb9d5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/bt/ViewBugResponse.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.admin.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugReport; + + + +public class ViewBugResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final BugReport report; + private final List< BugEvent > events; + private final Object query; + + + public ViewBugResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.report = null; + this.events = null; + this.query = null; + } + + + public ViewBugResponse( Administrator admin , BugReport report , List< BugEvent > events ) + { + super( admin ); + this.report = report; + this.events = events; + this.query = null; + } + + + public ViewBugResponse( ViewBugResponse response , Object query ) + { + super( response.getAdmin( ) ); + this.report = response.report; + this.events = response.events; + this.query = query; + } + + + public BugReport getReport( ) + { + return report; + } + + + public List< BugEvent > getEvents( ) + { + return events; + } + + + public Object getQuery( ) + { + return query; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Category.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Category.java new file mode 100644 index 0000000..774a70a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Category.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.cmd.admin.constants; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + + + +public class Category + implements Serializable , Comparable< Category > +{ + + private static final long serialVersionUID = 1L; + + private final String name; + private final List< Definition > definitions; + + + public Category( String name , List< Definition > defs ) + { + this.name = name; + this.definitions = defs; + Collections.sort( defs ); + } + + + @Override + public int compareTo( Category other ) + { + if ( other == null ) { + return 1; + } + return this.name.compareTo( other.name ); + } + + + public String getName( ) + { + return name; + } + + + public List< Definition > getDefinitions( ) + { + return definitions; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Definition.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Definition.java new file mode 100644 index 0000000..7115438 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/Definition.java @@ -0,0 +1,90 @@ +package com.deepclone.lw.cmd.admin.constants; + + +import java.io.Serializable; + + + +public class Definition + implements Serializable , Comparable< Definition > +{ + + private static final long serialVersionUID = 1L; + + private String name; + private String description; + private double value; + private Double minValue; + private Double maxValue; + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public double getValue( ) + { + return value; + } + + + public void setValue( double value ) + { + this.value = value; + } + + + public Double getMinValue( ) + { + return minValue; + } + + + public void setMinValue( Double minValue ) + { + this.minValue = minValue; + } + + + public Double getMaxValue( ) + { + return maxValue; + } + + + public void setMaxValue( Double maxValue ) + { + this.maxValue = maxValue; + } + + + @Override + public int compareTo( Definition other ) + { + if ( other == null ) { + return 1; + } + return this.name.compareTo( other.name ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsCommand.java new file mode 100644 index 0000000..93920a5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsCommand.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd.admin.constants; + +import com.deepclone.lw.session.Command; + +public class GetConstantsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsResponse.java new file mode 100644 index 0000000..a31d96f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/GetConstantsResponse.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.constants; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class GetConstantsResponse + extends AdminResponse +{ + private static final long serialVersionUID = 1L; + private List< Category > categories; + + + public GetConstantsResponse( Administrator admin ) + { + super( admin , false ); + } + + + public GetConstantsResponse( Administrator admin , List< Category > constants ) + { + super( admin , true ); + this.categories = constants; + Collections.sort( this.categories ); + } + + + protected GetConstantsResponse( Administrator admin , boolean error ) + { + super( admin , !error ); + } + + + public List< Category > getCategories( ) + { + return this.categories; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantCommand.java new file mode 100644 index 0000000..d2efe93 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.constants; + + +import com.deepclone.lw.session.Command; + + + +public class SetConstantCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String name; + private final double value; + + + public SetConstantCommand( String name , double value ) + { + this.name = name; + this.value = value; + } + + + public String getName( ) + { + return name; + } + + + public double getValue( ) + { + return value; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantResponse.java new file mode 100644 index 0000000..cec5d9c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/constants/SetConstantResponse.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.cmd.admin.constants; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class SetConstantResponse + extends GetConstantsResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean error; + private final String name; + private final double value; + + + public SetConstantResponse( Administrator admin , boolean privError ) + { + super( admin , privError ); + this.error = false; + this.name = null; + this.value = 0; + } + + + public SetConstantResponse( Administrator admin , List< Category > cats , String name , double value ) + { + super( admin , cats ); + this.error = true; + this.name = name; + this.value = value; + } + + + public boolean isError( ) + { + return error; + } + + + public String getName( ) + { + return name; + } + + + public double getValue( ) + { + return value; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageCommand.java new file mode 100644 index 0000000..9882fd5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import com.deepclone.lw.session.Command; + + + +public class ChangeLanguageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String id; + private final String name; + + + public ChangeLanguageCommand( String id , String name ) + { + this.id = id; + this.name = name; + } + + + public String getId( ) + { + return id; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageResponse.java new file mode 100644 index 0000000..fd23d8e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ChangeLanguageResponse.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ChangeLanguageResponse + extends GetLanguageResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean nameError; + + + public ChangeLanguageResponse( Administrator admin , Language language , List< I18NString > strings ) + { + super( admin , language , strings ); + this.nameError = true; + } + + + public ChangeLanguageResponse( Administrator admin , Language language ) + { + super( admin , language , null ); + this.nameError = false; + } + + + public ChangeLanguageResponse( Administrator admin ) + { + super( admin ); + this.nameError = false; + } + + + public boolean isNameError( ) + { + return nameError; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageCommand.java new file mode 100644 index 0000000..9ed73bb --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import com.deepclone.lw.session.Command; + + + +public class GetLanguageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String language; + + + public GetLanguageCommand( String language ) + { + this.language = language; + } + + + public String getLanguage( ) + { + return language; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageResponse.java new file mode 100644 index 0000000..68cbe5a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/GetLanguageResponse.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class GetLanguageResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final Language language; + private final List< I18NString > strings; + + + public GetLanguageResponse( Administrator admin ) + { + super( admin , false ); + this.language = null; + this.strings = null; + } + + + public GetLanguageResponse( Administrator admin , Language language , List< I18NString > strings ) + { + super( admin , true ); + this.language = language; + this.strings = strings; + if ( strings != null ) { + Collections.sort( this.strings ); + } + } + + + public Language getLanguage( ) + { + return language; + } + + + public List< I18NString > getStrings( ) + { + return strings; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/I18NString.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/I18NString.java new file mode 100644 index 0000000..06ada37 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/I18NString.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.io.Serializable; + + + +public class I18NString + implements Serializable , Comparable< I18NString > +{ + + private static final long serialVersionUID = 1L; + + private final String id; + private final String text; + + + public I18NString( String id , String text ) + { + this.id = id; + this.text = text; + } + + + public String getId( ) + { + return id; + } + + + public String getText( ) + { + return text; + } + + + @Override + public int compareTo( I18NString other ) + { + if ( other == null ) { + return 1; + } + return this.id.compareTo( other.id ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/Language.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/Language.java new file mode 100644 index 0000000..6258920 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/Language.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.io.Serializable; + + + +public class Language + implements Serializable , Comparable< Language > +{ + + private static final long serialVersionUID = 1L; + + private String id; + private String name; + private int completion; + + + public String getId( ) + { + return id; + } + + + public void setId( String id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public int getCompletion( ) + { + return completion; + } + + + public void setCompletion( int completion ) + { + this.completion = completion; + } + + + @Override + public int compareTo( Language other ) + { + if ( other == null ) { + return 1; + } + return this.id.compareTo( other.id ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringCommand.java new file mode 100644 index 0000000..8cff779 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringCommand.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import com.deepclone.lw.session.Command; + + + +public class SetStringCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String language; + private final String id; + private final String text; + + + public SetStringCommand( String language , String id , String text ) + { + this.language = language; + this.id = id; + this.text = text; + } + + + public String getLanguage( ) + { + return language; + } + + + public String getId( ) + { + return id; + } + + + public String getText( ) + { + return text; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringResponse.java new file mode 100644 index 0000000..5b3af0f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/SetStringResponse.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class SetStringResponse + extends GetLanguageResponse +{ + + private static final long serialVersionUID = 1L; + + private final String edited; + + + public SetStringResponse( Administrator admin ) + { + super( admin ); + this.edited = null; + } + + + public SetStringResponse( Administrator admin , Language language , List< I18NString > strings , String edited ) + { + super( admin , language , strings ); + this.edited = edited; + } + + + public SetStringResponse( Administrator admin , Language language ) + { + super( admin , language , null ); + this.edited = null; + } + + + public String getEdited( ) + { + return edited; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesCommand.java new file mode 100644 index 0000000..5a22e75 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesCommand.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.cmd.admin.i18n; + +import com.deepclone.lw.session.Command; + + +public class ViewLanguagesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesResponse.java new file mode 100644 index 0000000..96e66cf --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/i18n/ViewLanguagesResponse.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.admin.i18n; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ViewLanguagesResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final List< Language > languages; + + + public ViewLanguagesResponse( Administrator admin ) + { + super( admin , false ); + this.languages = null; + } + + + public ViewLanguagesResponse( Administrator admin , List< Language > languages ) + { + super( admin , true ); + this.languages = languages; + Collections.sort( this.languages ); + } + + + public List< Language > getLanguages( ) + { + return languages; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ExceptionEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ExceptionEntry.java new file mode 100644 index 0000000..55d4aa3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ExceptionEntry.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import java.io.Serializable; +import java.util.List; + + + +public class ExceptionEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String className; + private final String message; + private List< TraceEntry > trace; + + + public ExceptionEntry( String className , String message ) + { + this.className = className; + this.message = message; + } + + + public String getClassName( ) + { + return className; + } + + + public String getMessage( ) + { + return message; + } + + + public List< TraceEntry > getTrace( ) + { + return trace; + } + + + public void setTrace( List< TraceEntry > trace ) + { + this.trace = trace; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryCommand.java new file mode 100644 index 0000000..c07f7c9 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import com.deepclone.lw.session.Command; + + + +public class GetEntryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + + + public GetEntryCommand( long id ) + { + this.id = id; + } + + + public long getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryResponse.java new file mode 100644 index 0000000..8d20250 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/GetEntryResponse.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class GetEntryResponse + extends AdminResponse +{ + private static final long serialVersionUID = 1L; + + private final LogEntry entry; + private final List< ExceptionEntry > exceptions; + + + public GetEntryResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.entry = null; + this.exceptions = null; + } + + + public GetEntryResponse( Administrator admin , LogEntry entry , List< ExceptionEntry > exceptions ) + { + super( admin ); + this.entry = entry; + this.exceptions = exceptions; + } + + + public LogEntry getEntry( ) + { + return entry; + } + + + public List< ExceptionEntry > getExceptions( ) + { + return exceptions; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogEntry.java new file mode 100644 index 0000000..f203bb6 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogEntry.java @@ -0,0 +1,94 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class LogEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private Long id; + private Timestamp timestamp; + private LogLevel level; + private String about; + private String entry; + private Long exception; + + + public Long getId( ) + { + return id; + } + + + public void setId( Long id ) + { + this.id = id; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public void setTimestamp( Timestamp timestamp ) + { + this.timestamp = timestamp; + } + + + public LogLevel getLevel( ) + { + return level; + } + + + public void setLevel( LogLevel level ) + { + this.level = level; + } + + + public String getAbout( ) + { + return about; + } + + + public void setAbout( String about ) + { + this.about = about; + } + + + public String getEntry( ) + { + return entry; + } + + + public void setEntry( String entry ) + { + this.entry = entry; + } + + + public Long getException( ) + { + return exception; + } + + + public void setException( Long exception ) + { + this.exception = exception; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogLevel.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogLevel.java new file mode 100644 index 0000000..b3908e2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogLevel.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.logs; + + +/** + * This enumeration defines the various levels which can be affected to system log entries. + * + * @author tseeker + */ +public enum LogLevel { + + /** Trace mode entry */ + TRACE , + + /** Entry that may be used for debugging purposes, but has no other actual use */ + DEBUG , + + /** Entry that indicates that something important but mostly benign happened */ + INFO , + + /** + * Entry that indicates that something went wrong, although it is unlikely to affect the whole + * system + */ + WARNING , + + /** Entry that indicates that something went really wrong and might affect the whole system */ + ERROR +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogType.java new file mode 100644 index 0000000..131f7c4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/LogType.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cmd.admin.logs; + + +public enum LogType { + + SYSTEM( "System log" ) , + ADMIN( "Administration log" ) , + PLAYER( "Player log" ); + + private final String description; + + + private LogType( String description ) + { + this.description = description; + } + + + public String getDescription( ) + { + return description; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/TraceEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/TraceEntry.java new file mode 100644 index 0000000..885c6f4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/TraceEntry.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import java.io.Serializable; + + + +public class TraceEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String location; + private final String fileName; + private final Integer line; + + + public TraceEntry( String location , String fileName , Integer line ) + { + this.location = location; + this.fileName = fileName; + this.line = line; + } + + + public String getLocation( ) + { + return location; + } + + + public String getFileName( ) + { + return fileName; + } + + + public Integer getLine( ) + { + return line; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogCommand.java new file mode 100644 index 0000000..d3f3ad7 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogCommand.java @@ -0,0 +1,69 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import com.deepclone.lw.session.Command; + + + +public class ViewLogCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final LogType type; + private final long firstEntry; + private final int count; + private final LogLevel minLogLevel; + private final String component; + private final boolean exceptionOnly; + + + public ViewLogCommand( LogType type , long firstEntry , int count , LogLevel minLogLevel , String component , + boolean exceptionOnly ) + { + this.type = type; + this.firstEntry = firstEntry; + this.count = count; + this.minLogLevel = minLogLevel; + this.component = component; + this.exceptionOnly = exceptionOnly; + } + + + public LogType getType( ) + { + return type; + } + + + public long getFirstEntry( ) + { + return firstEntry; + } + + + public int getCount( ) + { + return count; + } + + + public LogLevel getMinLogLevel( ) + { + return minLogLevel; + } + + + public String getComponent( ) + { + return component; + } + + + public boolean isExceptionOnly( ) + { + return exceptionOnly; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogResponse.java new file mode 100644 index 0000000..3964c7e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/logs/ViewLogResponse.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.admin.logs; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ViewLogResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final long count; + private final List< LogEntry > entries; + + + public ViewLogResponse( Administrator admin ) + { + super( admin , false ); + this.count = 0; + this.entries = null; + } + + + public ViewLogResponse( Administrator admin , long count , List< LogEntry > entries ) + { + super( admin ); + this.count = count; + this.entries = entries; + } + + + public long getCount( ) + { + return count; + } + + + public List< LogEntry > getEntries( ) + { + return entries; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EnableMaintenanceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EnableMaintenanceCommand.java new file mode 100644 index 0000000..2848b92 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EnableMaintenanceCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import com.deepclone.lw.session.Command; + + + +public class EnableMaintenanceCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String reason; + private final int duration; + + + public EnableMaintenanceCommand( String reason , int duration ) + { + this.reason = reason; + this.duration = duration; + } + + + public String getReason( ) + { + return reason; + } + + + public int getDuration( ) + { + return duration; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EndMaintenanceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EndMaintenanceCommand.java new file mode 100644 index 0000000..11d5a82 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/EndMaintenanceCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import com.deepclone.lw.session.Command; + + + +public class EndMaintenanceCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/ExtendMaintenanceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/ExtendMaintenanceCommand.java new file mode 100644 index 0000000..4a40d58 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/ExtendMaintenanceCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import com.deepclone.lw.session.Command; + + + +public class ExtendMaintenanceCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int duration; + + + public ExtendMaintenanceCommand( int duration ) + { + this.duration = duration; + } + + + public int getDuration( ) + { + return duration; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceChangeResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceChangeResponse.java new file mode 100644 index 0000000..c5ea32c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceChangeResponse.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import java.util.Date; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class MaintenanceChangeResponse + extends MaintenanceStatusResponse +{ + + private static final long serialVersionUID = 1L; + + private final String newReason; + private final ObjectNameError reasonError; + private final long newDuration; + + + public MaintenanceChangeResponse( Administrator admin , boolean privError ) + { + super( admin , privError ); + this.newReason = null; + this.reasonError = null; + this.newDuration = 0; + } + + + public MaintenanceChangeResponse( Administrator admin , String reason , Date started , Date until , + String newReason , ObjectNameError reasonError , long newDuration ) + { + super( admin , reason , started , until ); + this.newReason = newReason; + this.reasonError = reasonError; + this.newDuration = newDuration; + } + + + public String getNewReason( ) + { + return newReason; + } + + + public ObjectNameError getReasonError( ) + { + return reasonError; + } + + + public long getNewDuration( ) + { + return newDuration; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusCommand.java new file mode 100644 index 0000000..c0fd9b0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import com.deepclone.lw.session.Command; + + + +public class MaintenanceStatusCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusResponse.java new file mode 100644 index 0000000..4f98983 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/mntm/MaintenanceStatusResponse.java @@ -0,0 +1,57 @@ +package com.deepclone.lw.cmd.admin.mntm; + + +import java.util.Date; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class MaintenanceStatusResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final String reason; + private final Date started; + private final Date until; + + + public MaintenanceStatusResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.reason = null; + this.started = null; + this.until = null; + } + + + public MaintenanceStatusResponse( Administrator admin , String reason , Date start , Date end ) + { + super( admin ); + this.reason = reason; + this.started = start; + this.until = end; + } + + + public String getReason( ) + { + return reason; + } + + + public Date getStarted( ) + { + return started; + } + + + public Date getUntil( ) + { + return until; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageCommand.java new file mode 100644 index 0000000..5eb5314 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageCommand.java @@ -0,0 +1,97 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.session.Command; + + + +public class ComposeMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final Boolean inbox; + private final Long replyTo; + + private MessageType type; + private String target; + private String subject; + private String contents; + + + public ComposeMessageCommand( ) + { + this.inbox = null; + this.replyTo = null; + } + + + public ComposeMessageCommand( boolean inbox , long replyTo ) + { + this.inbox = inbox; + this.replyTo = replyTo; + } + + + public MessageType getType( ) + { + return type; + } + + + public void setType( MessageType type ) + { + this.type = type; + } + + + public String getTarget( ) + { + return target; + } + + + public void setTarget( String target ) + { + this.target = target; + } + + + public String getSubject( ) + { + return subject; + } + + + public void setSubject( String subject ) + { + this.subject = subject; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public Long getReplyTo( ) + { + return replyTo; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageResponse.java new file mode 100644 index 0000000..7b01bc4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ComposeMessageResponse.java @@ -0,0 +1,160 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageType; + + + +public class ComposeMessageResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private MessageType messageType; + private String target; + private String title; + private String contents; + + private final Boolean inbox; + private final Message replyTo; + + private boolean targetError = false; + private boolean timingError = false; + private boolean titleError = false; + private boolean contentsError = false; + + + public ComposeMessageResponse( Administrator admin ) + { + super( admin ); + this.inbox = null; + this.replyTo = null; + } + + + public ComposeMessageResponse( Administrator admin , boolean inbox , Message replyTo ) + { + super( admin ); + this.inbox = inbox; + this.replyTo = replyTo; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public Message getReplyTo( ) + { + return replyTo; + } + + + public MessageType getMessageType( ) + { + return messageType; + } + + + public void setMessageType( MessageType messageType ) + { + this.messageType = messageType; + } + + + public String getTarget( ) + { + return target; + } + + + public void setTarget( String target ) + { + this.target = target; + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + + + public boolean isTargetError( ) + { + return targetError; + } + + + public void setTargetError( boolean targetError ) + { + this.targetError = targetError; + } + + + public boolean isTimingError( ) + { + return timingError; + } + + + public void setTimingError( boolean timingError ) + { + this.timingError = timingError; + } + + + public boolean isTitleError( ) + { + return titleError; + } + + + public void setTitleError( boolean titleError ) + { + this.titleError = titleError; + } + + + public boolean isContentsError( ) + { + return contentsError; + } + + + public void setContentsError( boolean contentsError ) + { + this.contentsError = contentsError; + } + + + public boolean isError( ) + { + return ( this.titleError || this.contentsError || this.targetError || this.timingError ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesCommand.java new file mode 100644 index 0000000..f6019f1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.session.Command; + + + +public class GetMessagesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + + + public GetMessagesCommand( boolean inbox ) + { + this.inbox = inbox; + } + + + public boolean isInbox( ) + { + return inbox; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesResponse.java new file mode 100644 index 0000000..bd0c6da --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/GetMessagesResponse.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.MessageListEntry; + + + +public class GetMessagesResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final List< MessageListEntry > messages; + + + public GetMessagesResponse( Administrator admin , List< MessageListEntry > messages ) + { + super( admin ); + this.messages = messages; + } + + + public List< MessageListEntry > getMessages( ) + { + return messages; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxAction.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxAction.java new file mode 100644 index 0000000..e4fa82e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxAction.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd.admin.msg; + + +public enum MessageBoxAction { + + DELETE , + MARK_READ , + MARK_UNREAD + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxCommand.java new file mode 100644 index 0000000..c7431f2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/MessageBoxCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.session.Command; + + + +public class MessageBoxCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final MessageBoxAction action; + private final boolean inbox; + private final long[] selection; + + + public MessageBoxCommand( boolean inbox , long[] selection ) + { + this.action = MessageBoxAction.DELETE; + this.inbox = inbox; + this.selection = selection; + } + + + public MessageBoxCommand( long[] selection , boolean read ) + { + this.action = read ? MessageBoxAction.MARK_READ : MessageBoxAction.MARK_UNREAD; + this.inbox = true; + this.selection = selection; + } + + + public MessageBoxAction getAction( ) + { + return action; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public long[] getSelection( ) + { + return selection; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/PrepareMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/PrepareMessageCommand.java new file mode 100644 index 0000000..0da0140 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/PrepareMessageCommand.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.session.Command; + + + +public class PrepareMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final MessageType type; + private final Long id; + private final Boolean inbox; + + + private PrepareMessageCommand( MessageType type , Long id ) + { + this.type = type; + this.id = id; + this.inbox = null; + } + + + public PrepareMessageCommand( long id , boolean inbox ) + { + this.type = MessageType.INTERNAL; + this.id = id; + this.inbox = inbox; + } + + + public MessageType getType( ) + { + return type; + } + + + public Long getId( ) + { + return id; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public static PrepareMessageCommand newMessage( ) + { + return new PrepareMessageCommand( null , null ); + } + + + public static PrepareMessageCommand newMessageTo( MessageType type , int id ) + { + if ( type == MessageType.INTERNAL ) { + throw new IllegalArgumentException( ); + } + return new PrepareMessageCommand( type , (long) id ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageCommand.java new file mode 100644 index 0000000..e4d178f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.session.Command; + + + +public class ReadMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private final long id; + + + public ReadMessageCommand( boolean inbox , long id ) + { + this.inbox = inbox; + this.id = id; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public long getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageResponse.java new file mode 100644 index 0000000..c310b93 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/ReadMessageResponse.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.Message; + + + +public class ReadMessageResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private final Message message; + + + public ReadMessageResponse( Administrator admin , boolean inbox ) + { + super( admin ); + this.inbox = inbox; + this.message = null; + } + + + public ReadMessageResponse( Administrator admin , boolean inbox , Message message ) + { + super( admin ); + this.inbox = inbox; + this.message = message; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public Message getMessage( ) + { + return message; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/SendSpamCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/SendSpamCommand.java new file mode 100644 index 0000000..b282bcc --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/msg/SendSpamCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.msg; + + +import com.deepclone.lw.session.Command; + + + +public class SendSpamCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String title; + private final String body; + + + public SendSpamCommand( String title , String body ) + { + this.title = title; + this.body = body; + } + + + public String getTitle( ) + { + return title; + } + + + public String getBody( ) + { + return body; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesCommand.java new file mode 100644 index 0000000..1502f47 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import com.deepclone.lw.session.Command; + + + +public class GetNamesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final NameType type; + + + public GetNamesCommand( NameType type ) + { + this.type = type; + } + + + public NameType getType( ) + { + return type; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesResponse.java new file mode 100644 index 0000000..735a487 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/GetNamesResponse.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class GetNamesResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final NameType type; + private final List< Name > names; + + + public GetNamesResponse( Administrator admin ) + { + super( admin , false ); + this.type = null; + this.names = null; + } + + + public GetNamesResponse( Administrator admin , NameType type , List< Name > names ) + { + super( admin ); + this.type = type; + this.names = names; + } + + + public NameType getType( ) + { + return type; + } + + + public List< Name > getNames( ) + { + return names; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/Name.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/Name.java new file mode 100644 index 0000000..c3f67e8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/Name.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import java.io.Serializable; + + + +public class Name + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final int id; + private final String name; + private final String extra; + private final NameType type; + + + public Name( int id , String name , String extra , NameType type ) + { + this.id = id; + this.name = name; + this.extra = extra; + this.type = type; + } + + + public int getId( ) + { + return id; + } + + + public String getName( ) + { + return name; + } + + + public String getExtra( ) + { + return extra; + } + + + public NameType getType( ) + { + return type; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameAction.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameAction.java new file mode 100644 index 0000000..2901c9d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameAction.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd.admin.naming; + +public enum NameAction { + + VALIDATE , + REJECT , + REJECT_BAN , + RESET + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameType.java new file mode 100644 index 0000000..16de002 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NameType.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.cmd.admin.naming; + + +public enum NameType { + MAP_PENDING( "Map names - validation pending" ) , + MAP_VALIDATED( "Map names - validated" ) , + MAP_CHANGED( "Map names - modified" ) , + EMPIRE( "Empire names" ) , + ALLIANCE( "Alliance names" ); + + private String description; + + + private NameType( String description ) + { + this.description = description; + } + + + public String getDescription( ) + { + return this.description; + } + + + public String getId( ) + { + return this.toString( ).replace( "_" , "-" ).toLowerCase( ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesActionCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesActionCommand.java new file mode 100644 index 0000000..0b778e1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesActionCommand.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import com.deepclone.lw.session.Command; + + + +public class NamesActionCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final NameType type; + private final NameAction action; + private final int[] identifiers; + + + public NamesActionCommand( NameType type , NameAction action , int[] identifiers ) + { + this.type = type; + this.identifiers = identifiers; + this.action = action; + } + + + public NameType getType( ) + { + return type; + } + + + public NameAction getAction( ) + { + return action; + } + + + public int[] getIdentifiers( ) + { + return identifiers; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryCommand.java new file mode 100644 index 0000000..96ea84a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import com.deepclone.lw.session.Command; + + + +public class NamesSummaryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryResponse.java new file mode 100644 index 0000000..adbb523 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/naming/NamesSummaryResponse.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.admin.naming; + + +import java.io.Serializable; +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class NamesSummaryResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + @SuppressWarnings( "serial" ) + public static class Entry + implements Serializable + { + private final NameType type; + private final long count; + + + public Entry( NameType type , long count ) + { + this.type = type; + this.count = count; + } + + + public NameType getType( ) + { + return type; + } + + + public long getCount( ) + { + return count; + } + + } + + private final List< Entry > entries; + + + public NamesSummaryResponse( Administrator admin , List< Entry > entries ) + { + super( admin ); + this.entries = entries; + } + + + public NamesSummaryResponse( Administrator admin ) + { + super( admin , false ); + this.entries = null; + } + + + public List< Entry > getEntries( ) + { + return entries; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/GetPrefDefaultsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/GetPrefDefaultsCommand.java new file mode 100644 index 0000000..0946c22 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/GetPrefDefaultsCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.prefs; + + +import com.deepclone.lw.session.Command; + + + +public class GetPrefDefaultsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/PrefDefaultsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/PrefDefaultsResponse.java new file mode 100644 index 0000000..fed8047 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/PrefDefaultsResponse.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.cmd.admin.prefs; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.player.gdata.account.PrefCategory; + + + +public class PrefDefaultsResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final List< PrefCategory > preferences; + + + public PrefDefaultsResponse( Administrator admin ) + { + super( admin , false ); + this.preferences = null; + } + + + public PrefDefaultsResponse( Administrator admin , List< PrefCategory > preferences ) + { + super( admin ); + this.preferences = preferences; + } + + + public List< PrefCategory > getPreferences( ) + { + return preferences; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/SetPrefDefaultCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/SetPrefDefaultCommand.java new file mode 100644 index 0000000..35f3945 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/prefs/SetPrefDefaultCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.prefs; + + +import com.deepclone.lw.session.Command; + + + +public class SetPrefDefaultCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String preference; + private final String value; + + + public SetPrefDefaultCommand( String preference , String value ) + { + this.preference = preference; + this.value = value; + } + + + public String getPreference( ) + { + return preference; + } + + + public String getValue( ) + { + return value; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorCommand.java new file mode 100644 index 0000000..ed1eeb8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorCommand.java @@ -0,0 +1,49 @@ +package com.deepclone.lw.cmd.admin.su; + + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.session.Command; + + + +public class AddAdministratorCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String address; + private final String appearAs; + private final Set< Privileges > privileges; + + + public AddAdministratorCommand( String address , String appearAs , Collection< Privileges > privileges ) + { + this.address = address; + this.appearAs = appearAs; + this.privileges = new HashSet< Privileges >( privileges ); + } + + + public String getAddress( ) + { + return address; + } + + + public String getAppearAs( ) + { + return appearAs; + } + + + public Set< Privileges > getPrivileges( ) + { + return privileges; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorResponse.java new file mode 100644 index 0000000..a31e6d4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/AddAdministratorResponse.java @@ -0,0 +1,99 @@ +package com.deepclone.lw.cmd.admin.su; + + +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.PrivEntry; + + + +public class AddAdministratorResponse + extends AdminResponse +{ + private static final long serialVersionUID = 1L; + + public static enum AddressError { + EMPTY , + INVALID , + NOT_FOUND , + ALREADY_ADMIN , + STATUS + } + + private final AddressError addressError; + private final String address; + private final ObjectNameError nameError; + private final String name; + private final boolean privError; + private final int privileges; + + + public AddAdministratorResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.addressError = null; + this.address = null; + this.nameError = null; + this.name = null; + this.privError = false; + this.privileges = 0; + } + + + public AddAdministratorResponse( Administrator admin , AddressError aError , String address , + ObjectNameError nError , String name , boolean pError , int privileges ) + { + super( admin , true ); + this.addressError = aError; + this.address = address; + this.nameError = nError; + this.name = name; + this.privError = pError; + this.privileges = privileges; + } + + + public AddressError getAddressError( ) + { + return addressError; + } + + + public String getAddress( ) + { + return address; + } + + + public ObjectNameError getNameError( ) + { + return nameError; + } + + + public String getName( ) + { + return name; + } + + + public boolean isPrivError( ) + { + return privError; + } + + + public List< PrivEntry > getPrivileges( ) + { + return PrivEntry.fromPrivileges( this.privileges ); + } + + + public boolean isError( ) + { + return this.addressError != null || this.nameError != null || this.privError; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsCommand.java new file mode 100644 index 0000000..8133b1c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsCommand.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd.admin.su; + +import com.deepclone.lw.session.Command; + +public class ListAdministratorsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsResponse.java new file mode 100644 index 0000000..9a49ab2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ListAdministratorsResponse.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.cmd.admin.su; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ListAdministratorsResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final List< Administrator > administrators; + + + public ListAdministratorsResponse( Administrator admin ) + { + super( admin , false ); + this.administrators = null; + } + + + public ListAdministratorsResponse( Administrator admin , List< Administrator > administrators ) + { + super( admin ); + this.administrators = administrators; + } + + + public List< Administrator > getAdministrators( ) + { + return administrators; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ResetAdminPasswordCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ResetAdminPasswordCommand.java new file mode 100644 index 0000000..78c5bb0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ResetAdminPasswordCommand.java @@ -0,0 +1,15 @@ +package com.deepclone.lw.cmd.admin.su; + + +public class ResetAdminPasswordCommand + extends ViewAdministratorCommand +{ + private static final long serialVersionUID = 1L; + + + public ResetAdminPasswordCommand( int identifier ) + { + super( identifier ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/SetPrivilegesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/SetPrivilegesCommand.java new file mode 100644 index 0000000..ea902e3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/SetPrivilegesCommand.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.admin.su; + + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import com.deepclone.lw.cmd.admin.adata.Privileges; + + + +public class SetPrivilegesCommand + extends ViewAdministratorCommand +{ + + private static final long serialVersionUID = 1L; + + private final Set< Privileges > privileges; + + + public SetPrivilegesCommand( int identifier , Collection< Privileges > privileges ) + { + super( identifier ); + this.privileges = new HashSet< Privileges >( privileges ); + } + + + public Set< Privileges > getPrivileges( ) + { + return privileges; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorCommand.java new file mode 100644 index 0000000..8b6e119 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.su; + + +import com.deepclone.lw.session.Command; + + + +public class ViewAdministratorCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int identifier; + + + public ViewAdministratorCommand( int identifier ) + { + this.identifier = identifier; + } + + + public int getIdentifier( ) + { + return identifier; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorResponse.java new file mode 100644 index 0000000..a903ccc --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/su/ViewAdministratorResponse.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.admin.su; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ViewAdministratorResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final Administrator view; + + + public ViewAdministratorResponse( Administrator admin , boolean privError ) + { + super( admin , !privError ); + this.view = null; + } + + + public ViewAdministratorResponse( Administrator admin , Administrator view ) + { + super( admin , true ); + this.view = view; + } + + + public Administrator getView( ) + { + return view; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/SetTaskStatusCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/SetTaskStatusCommand.java new file mode 100644 index 0000000..82645b8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/SetTaskStatusCommand.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.cmd.admin.tick; + + +import com.deepclone.lw.session.Command; + + + +public class SetTaskStatusCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int task; + private final TickerTaskStatus newStatus; + private final Long delay; + + + public SetTaskStatusCommand( int task , boolean run ) + { + this.task = task; + this.newStatus = run ? TickerTaskStatus.RUNNING : TickerTaskStatus.STOPPED; + this.delay = null; + } + + + public SetTaskStatusCommand( int task , long delay ) + { + this.task = task; + this.newStatus = TickerTaskStatus.AUTO; + this.delay = delay; + } + + + public int getTask( ) + { + return task; + } + + + public TickerTaskStatus getNewStatus( ) + { + return newStatus; + } + + + public Long getDelay( ) + { + return delay; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusCommand.java new file mode 100644 index 0000000..e6dda40 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.tick; + + +import com.deepclone.lw.session.Command; + + + +public class TickerStatusCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusResponse.java new file mode 100644 index 0000000..9de84db --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerStatusResponse.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.admin.tick; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class TickerStatusResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean paused; + private final List< TickerTaskInfo > tasks; + + + public TickerStatusResponse( Administrator admin ) + { + super( admin , false ); + this.paused = false; + this.tasks = null; + } + + + public TickerStatusResponse( Administrator admin , boolean paused , List< TickerTaskInfo > tasks ) + { + super( admin ); + this.paused = paused; + this.tasks = tasks; + } + + + public boolean isPaused( ) + { + return paused; + } + + + public List< TickerTaskInfo > getTasks( ) + { + return tasks; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskInfo.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskInfo.java new file mode 100644 index 0000000..5f189de --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskInfo.java @@ -0,0 +1,91 @@ +package com.deepclone.lw.cmd.admin.tick; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class TickerTaskInfo + implements Serializable , Comparable< TickerTaskInfo > +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String name; + private TickerTaskStatus status; + private Timestamp start; + private Long timeToStart; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public TickerTaskStatus getStatus( ) + { + return status; + } + + + public void setStatus( TickerTaskStatus status ) + { + this.status = status; + } + + + public Timestamp getStart( ) + { + return start; + } + + + public void setStart( Timestamp start ) + { + this.start = start; + } + + + public Long getTimeToStart( ) + { + return timeToStart; + } + + + public void setTimeToStart( Long timeToStart ) + { + this.timeToStart = timeToStart; + } + + + @Override + public int compareTo( TickerTaskInfo other ) + { + if ( other == null ) { + return 1; + } + return this.name.compareTo( other.name ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskStatus.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskStatus.java new file mode 100644 index 0000000..e1b0afc --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/TickerTaskStatus.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cmd.admin.tick; + + +public enum TickerTaskStatus { + + RUNNING( "Running" ) , + STOPPED( "Stopped" ) , + AUTO( "Scheduled to start automatically" ); + + private final String description; + + + private TickerTaskStatus( String description ) + { + this.description = description; + } + + + public String getDescription( ) + { + return description; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/ToggleTickerCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/ToggleTickerCommand.java new file mode 100644 index 0000000..797781f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/tick/ToggleTickerCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.admin.tick; + + +import com.deepclone.lw.session.Command; + + + +public class ToggleTickerCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountBanEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountBanEntry.java new file mode 100644 index 0000000..6f124e0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountBanEntry.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.io.Serializable; + + + +public class AccountBanEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String requestedByName; + private int requestedById; + private String confirmedByName; + private int confirmedById; + + + public String getRequestedByName( ) + { + return requestedByName; + } + + + public void setRequestedByName( String requestedByName ) + { + this.requestedByName = requestedByName; + } + + + public int getRequestedById( ) + { + return requestedById; + } + + + public void setRequestedById( int requestedById ) + { + this.requestedById = requestedById; + } + + + public String getConfirmedByName( ) + { + return confirmedByName; + } + + + public void setConfirmedByName( String confirmedByName ) + { + this.confirmedByName = confirmedByName; + } + + + public int getConfirmedById( ) + { + return confirmedById; + } + + + public void setConfirmedById( int confirmedById ) + { + this.confirmedById = confirmedById; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountListEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountListEntry.java new file mode 100644 index 0000000..f102958 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountListEntry.java @@ -0,0 +1,80 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.io.Serializable; + + + +public class AccountListEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String address; + private AccountStatus status; + private String currentEmpire; + private String language; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public AccountStatus getStatus( ) + { + return status; + } + + + public void setStatus( AccountStatus status ) + { + this.status = status; + } + + + public String getCurrentEmpire( ) + { + return currentEmpire; + } + + + public void setCurrentEmpire( String currentEmpire ) + { + this.currentEmpire = currentEmpire; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountSessionEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountSessionEntry.java new file mode 100644 index 0000000..ff8594d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountSessionEntry.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.util.List; + + + +public class AccountSessionEntry + extends AccountListEntry +{ + private static final long serialVersionUID = 1L; + + private List< UserSession > sessions; + + + public AccountSessionEntry( ) + { + // EMPTY + } + + public AccountSessionEntry( AccountListEntry e ) { + this.setId( e.getId( ) ); + this.setAddress( e.getAddress( ) ); + this.setCurrentEmpire( e.getCurrentEmpire( ) ); + this.setLanguage( e.getLanguage( ) ); + this.setStatus( e.getStatus( ) ); + } + + + public List< UserSession > getSessions( ) + { + return sessions; + } + + + public void setSessions( List< UserSession > sessions ) + { + this.sessions = sessions; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountStatus.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountStatus.java new file mode 100644 index 0000000..92d693d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountStatus.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.cmd.admin.users; + + +/** + * Account status enumeration + * + * This enumerated type defines the various possible statuses for an account. Each status is + * associated with a boolean value indicating whether the status corresponds to an active or + * inactive account. + * + * @author tseeker + */ +public enum AccountStatus { + + /** Unconfirmed account, still needs initial validation */ + UNCONFIRMED( false , "unconfirmed" ) , + + /** Active account */ + ACTIVE( true , "active") , + + /** Account currently in vacation mode */ + VACATION( true , "on vacation" ) , + + /** Account currently entering vacation mode */ + START_VACATION( true , "entering vacation" ) , + + /** Account being disabled by its owner */ + QUITTING( true , "leaving" ) , + + /** Disabled account, either because it was closed or because it became inactive */ + DISABLED( false , "disabled" ) , + + /** Banned account */ + BANNED( false , "banned" ) , + + /** Account being re-activated */ + REACTIVATING( false , "being reactivated" ); + + /** Activity flag */ + private boolean active; + + /** Description used in the admin interface */ + private final String description; + + + private AccountStatus( boolean active , String description ) + { + this.active = active; + this.description = description; + } + + + /** @return true if the account status corresponds to an active account */ + public boolean isActive( ) + { + return this.active; + } + + + public String getDescription( ) + { + return description; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountViewEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountViewEntry.java new file mode 100644 index 0000000..44ff78d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/AccountViewEntry.java @@ -0,0 +1,147 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; + + + +public class AccountViewEntry + extends AccountListEntry +{ + + private static final long serialVersionUID = 1L; + + private Integer empireId; + private int gameCredits; + private int vacationCredits; + private Timestamp statusStart; + private String inactivityReason; + private AccountBanEntry ban; + private boolean online; + private List< String > empireNames = new ArrayList< String >( 0 ); + private int warnings; + private Timestamp lastWarning; + + + public Integer getEmpireId( ) + { + return empireId; + } + + + public void setEmpireId( Integer empireId ) + { + this.empireId = empireId; + } + + + public int getGameCredits( ) + { + return gameCredits; + } + + + public void setGameCredits( int gameCredits ) + { + this.gameCredits = gameCredits; + } + + + public int getVacationCredits( ) + { + return vacationCredits; + } + + + public void setVacationCredits( int vacationCredits ) + { + this.vacationCredits = vacationCredits; + } + + + public Timestamp getStatusStart( ) + { + return statusStart; + } + + + public void setStatusStart( Timestamp statusStart ) + { + this.statusStart = statusStart; + } + + + public String getInactivityReason( ) + { + return inactivityReason; + } + + + public void setInactivityReason( String inactivityReason ) + { + this.inactivityReason = inactivityReason; + } + + + public AccountBanEntry getBan( ) + { + return ban; + } + + + public void setBan( AccountBanEntry ban ) + { + this.ban = ban; + } + + + public boolean isOnline( ) + { + return online; + } + + + public void setOnline( boolean isOnline ) + { + this.online = isOnline; + } + + + public List< String > getEmpireNames( ) + { + return empireNames; + } + + + public void setEmpireNames( List< String > empireNames ) + { + this.empireNames = empireNames; + } + + + public int getWarnings( ) + { + return warnings; + } + + + public void setWarnings( int warnings ) + { + this.warnings = warnings; + } + + + public Timestamp getLastWarning( ) + { + return lastWarning; + } + + + public void setLastWarning( Timestamp lastWarning ) + { + this.lastWarning = lastWarning; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/GiveCreditsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/GiveCreditsCommand.java new file mode 100644 index 0000000..5ab9330 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/GiveCreditsCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.session.Command; + + + +public class GiveCreditsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + private final int credits; + + + public GiveCreditsCommand( int id , int credits ) + { + this.id = id; + this.credits = credits; + } + + + public int getId( ) + { + return id; + } + + + public int getCredits( ) + { + return credits; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsCommand.java new file mode 100644 index 0000000..5b52707 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsCommand.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.session.Command; + + + +public class ListAccountsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final AccountStatus status; + private final boolean online; + + + public ListAccountsCommand( ) + { + this.status = null; + this.online = false; + } + + + public ListAccountsCommand( AccountStatus status ) + { + this.status = status; + this.online = false; + } + + + public ListAccountsCommand( AccountStatus status , boolean online ) + { + this.status = status; + this.online = online; + } + + + public AccountStatus getStatus( ) + { + return status; + } + + + public boolean isOnline( ) + { + return online; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsResponse.java new file mode 100644 index 0000000..389bd1e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListAccountsResponse.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ListAccountsResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final AccountStatus status; + private final boolean online; + private final List< AccountListEntry > entries; + + + public ListAccountsResponse( Administrator admin , AccountStatus status , boolean online , + List< AccountListEntry > entries ) + { + super( admin ); + this.status = status; + this.online = online; + this.entries = entries; + } + + + public ListAccountsResponse( Administrator admin ) + { + super( admin , false ); + this.status = null; + this.online = false; + this.entries = null; + } + + + public AccountStatus getStatus( ) + { + return status; + } + + + public boolean isOnline( ) + { + return online; + } + + + public List< AccountListEntry > getEntries( ) + { + return entries; + } + + + public AccountStatus[] getAllStatuses( ) + { + return AccountStatus.values( ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsCommand.java new file mode 100644 index 0000000..0dd8336 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.session.Command; + + + +public class ListSessionsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + + + public ListSessionsCommand( int id ) + { + this.id = id; + } + + + public int getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsResponse.java new file mode 100644 index 0000000..a9ae818 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ListSessionsResponse.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ListSessionsResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final AccountSessionEntry account; + + + public ListSessionsResponse( Administrator admin ) + { + super( admin , false ); + this.account = null; + } + + + public ListSessionsResponse( Administrator admin , AccountSessionEntry account ) + { + super( admin ); + this.account = account; + } + + + public AccountSessionEntry getAccount( ) + { + return account; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/SessionTerminationType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/SessionTerminationType.java new file mode 100644 index 0000000..04e933e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/SessionTerminationType.java @@ -0,0 +1,26 @@ +package com.deepclone.lw.cmd.admin.users; + + +public enum SessionTerminationType { + + MANUAL( "Logged out" ) , + GONE( "User account is gone" ) , + EXPIRED( "Session expired" ) , + EXCLUSIVE( "Terminated by new session" ) , + SERVER( "Server restart" ); + + private final String description; + + + private SessionTerminationType( String description ) + { + this.description = description; + } + + + public String getDescription( ) + { + return description; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/UserSession.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/UserSession.java new file mode 100644 index 0000000..b66cb2b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/UserSession.java @@ -0,0 +1,134 @@ +package com.deepclone.lw.cmd.admin.users; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class UserSession + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private int credentialsId; + private String clientName; + private String sessionName; + private boolean exclusive; + private String fromAddress; + + private Timestamp started; + private Timestamp ended; + private SessionTerminationType endType; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public int getCredentialsId( ) + { + return credentialsId; + } + + + public void setCredentialsId( int credentialsId ) + { + this.credentialsId = credentialsId; + } + + + public String getClientName( ) + { + return clientName; + } + + + public void setClientName( String clientName ) + { + this.clientName = clientName; + } + + + public String getSessionName( ) + { + return sessionName; + } + + + public void setSessionName( String sessionName ) + { + this.sessionName = sessionName; + } + + + public boolean isExclusive( ) + { + return exclusive; + } + + + public void setExclusive( boolean exclusive ) + { + this.exclusive = exclusive; + } + + + public String getFromAddress( ) + { + return fromAddress; + } + + + public void setFromAddress( String fromAddress ) + { + this.fromAddress = fromAddress; + } + + + public Timestamp getStarted( ) + { + return started; + } + + + public void setStarted( Timestamp started ) + { + this.started = started; + } + + + public Timestamp getEnded( ) + { + return ended; + } + + + public void setEnded( Timestamp ended ) + { + this.ended = ended; + } + + + public SessionTerminationType getEndType( ) + { + return endType; + } + + + public void setEndType( SessionTerminationType endType ) + { + this.endType = endType; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountCommand.java new file mode 100644 index 0000000..aa05383 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.session.Command; + + + +public class ViewAccountCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + + + public ViewAccountCommand( int id ) + { + this.id = id; + } + + + public int getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountResponse.java new file mode 100644 index 0000000..add90f9 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/admin/users/ViewAccountResponse.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.admin.users; + + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; + + + +public class ViewAccountResponse + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final AccountViewEntry account; + + + public ViewAccountResponse( Administrator admin ) + { + super( admin , false ); + this.account = null; + } + + + public ViewAccountResponse( Administrator admin , AccountViewEntry account ) + { + super( admin ); + this.account = account; + } + + + public AccountViewEntry getAccount( ) + { + return account; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ListBugsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ListBugsCommand.java new file mode 100644 index 0000000..18763af --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ListBugsCommand.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.cmd.bt; + + +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.session.Command; + + + +public class ListBugsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final BugStatus status; + private final boolean ownOnly; + private final long first; + private final int count; + + + public ListBugsCommand( BugStatus status , boolean ownOnly , long first , int count ) + { + this.status = status; + this.ownOnly = ownOnly; + this.first = first; + this.count = count; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public boolean isOwnOnly( ) + { + return ownOnly; + } + + + public long getFirst( ) + { + return first; + } + + + public int getCount( ) + { + return count; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/PostCommentCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/PostCommentCommand.java new file mode 100644 index 0000000..d032610 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/PostCommentCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.bt; + + +import com.deepclone.lw.session.Command; + + + +public class PostCommentCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final String comment; + private final boolean publicComment; + + + public PostCommentCommand( long id , String comment ) + { + this.id = id; + this.comment = comment; + this.publicComment = false; + } + + + public PostCommentCommand( long id , String comment , boolean publicComment ) + { + this.id = id; + this.comment = comment; + this.publicComment = publicComment; + } + + + public long getId( ) + { + return id; + } + + + public String getComment( ) + { + return comment; + } + + + public boolean isPublicComment( ) + { + return publicComment; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ReportBugCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ReportBugCommand.java new file mode 100644 index 0000000..92425fe --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ReportBugCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.bt; + + +import com.deepclone.lw.session.Command; + + + +public class ReportBugCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String title; + private final String description; + private final boolean publicReport; + + + public ReportBugCommand( String title , String description ) + { + this.title = title; + this.description = description; + this.publicReport = false; + } + + + public ReportBugCommand( String title , String description , boolean publicReport ) + { + this.title = title; + this.description = description; + this.publicReport = publicReport; + } + + + public String getTitle( ) + { + return title; + } + + + public String getDescription( ) + { + return description; + } + + + public boolean isPublicReport( ) + { + return publicReport; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ViewBugCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ViewBugCommand.java new file mode 100644 index 0000000..1ef74ba --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/ViewBugCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.bt; + + +import com.deepclone.lw.session.Command; + + + +public class ViewBugCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long id; + + + public ViewBugCommand( long id ) + { + this.id = id; + } + + + public long getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEvent.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEvent.java new file mode 100644 index 0000000..027b9d7 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEvent.java @@ -0,0 +1,134 @@ +package com.deepclone.lw.cmd.bt.data; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class BugEvent + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private BugEventType type; + private Timestamp timestamp; + private BugSubmitter submitter; + + private String title; + private String contents; + private Long mergedId; + private BugStatus status; + private Boolean visible; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public BugEventType getType( ) + { + return type; + } + + + public void setType( BugEventType type ) + { + this.type = type; + } + + + public Timestamp getTimestamp( ) + { + return timestamp; + } + + + public void setTimestamp( Timestamp timestamp ) + { + this.timestamp = timestamp; + } + + + public BugSubmitter getSubmitter( ) + { + return submitter; + } + + + public void setSubmitter( BugSubmitter submitter ) + { + this.submitter = submitter; + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + + + public Long getMergedId( ) + { + return mergedId; + } + + + public void setMergedId( Long mergedId ) + { + this.mergedId = mergedId; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public void setStatus( BugStatus status ) + { + this.status = status; + } + + + public Boolean getVisible( ) + { + return visible; + } + + + public void setVisible( Boolean visible ) + { + this.visible = visible; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEventType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEventType.java new file mode 100644 index 0000000..d21cc93 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugEventType.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.cmd.bt.data; + + +public enum BugEventType { + + INIT , + MERGE , + STATUS , + COMMENT , + VISIBILITY + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugReport.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugReport.java new file mode 100644 index 0000000..2767173 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugReport.java @@ -0,0 +1,133 @@ +package com.deepclone.lw.cmd.bt.data; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class BugReport + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long reportId; + private String title; + private Timestamp posted; + private boolean visible; + private BugStatus status; + private BugSubmitter initialSubmitter; + private Timestamp lastUpdate; + private BugSubmitter latestSubmitter; + private boolean updated; + + + public long getReportId( ) + { + return reportId; + } + + + public void setReportId( long reportId ) + { + this.reportId = reportId; + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public Timestamp getPosted( ) + { + return posted; + } + + + public void setPosted( Timestamp posted ) + { + this.posted = posted; + } + + + public boolean isVisible( ) + { + return visible; + } + + + public void setVisible( boolean visible ) + { + this.visible = visible; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public void setStatus( BugStatus status ) + { + this.status = status; + } + + + public BugSubmitter getInitialSubmitter( ) + { + return initialSubmitter; + } + + + public void setInitialSubmitter( BugSubmitter initialSubmitter ) + { + this.initialSubmitter = initialSubmitter; + } + + + public Timestamp getLastUpdate( ) + { + return lastUpdate; + } + + + public void setLastUpdate( Timestamp lastUpdate ) + { + this.lastUpdate = lastUpdate; + } + + + public BugSubmitter getLatestSubmitter( ) + { + return latestSubmitter; + } + + + public void setLatestSubmitter( BugSubmitter latestSubmitter ) + { + this.latestSubmitter = latestSubmitter; + } + + + public boolean isUpdated( ) + { + return updated; + } + + + public void setUpdated( boolean updated ) + { + this.updated = updated; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugStatus.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugStatus.java new file mode 100644 index 0000000..8636860 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugStatus.java @@ -0,0 +1,12 @@ +package com.deepclone.lw.cmd.bt.data; + + +public enum BugStatus { + + PENDING , + OPEN , + NOT_A_BUG , + WONT_FIX , + RESOLVED + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugSubmitter.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugSubmitter.java new file mode 100644 index 0000000..3e6e5b8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/bt/data/BugSubmitter.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.cmd.bt.data; + + +import java.io.Serializable; + + + +public class BugSubmitter + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private boolean isAdmin; + private String name; + private Integer userId; + + + public boolean isAdmin( ) + { + return isAdmin; + } + + + public void setAdmin( boolean isAdmin ) + { + this.isAdmin = isAdmin; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public Integer getUserId( ) + { + return userId; + } + + + public void setUserId( Integer userId ) + { + this.userId = userId; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryCommand.java new file mode 100644 index 0000000..fe21b7d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryCommand.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.Command; + + + +public class ConfirmPasswordRecoveryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String mailAddress; + + private final String token; + + private final String password; + + private final String passwordConfirm; + + + public ConfirmPasswordRecoveryCommand( String mailAddress , String token , String password , String passwordConfirm ) + { + this.mailAddress = mailAddress; + this.token = token; + this.password = password; + this.passwordConfirm = passwordConfirm; + } + + + public String getMailAddress( ) + { + return this.mailAddress; + } + + + public String getToken( ) + { + return this.token; + } + + + public String getPassword( ) + { + return this.password; + } + + + public String getPasswordConfirm( ) + { + return this.passwordConfirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryResponse.java new file mode 100644 index 0000000..4342cdd --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ConfirmPasswordRecoveryResponse.java @@ -0,0 +1,38 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.CommandResponse; + + + +public class ConfirmPasswordRecoveryResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum PasswordRecoveryStatus { + OK , + INVALID_MAIL , + WEAK_PASSWORD , + MISMATCH_PASSWORD , + NOT_FOUND , + ACCOUNT_STATUS , + PROHIBITED + } + + private final PasswordRecoveryStatus status; + + + public ConfirmPasswordRecoveryResponse( PasswordRecoveryStatus status ) + { + this.status = status; + } + + + public PasswordRecoveryStatus getStatus( ) + { + return this.status; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountCommand.java new file mode 100644 index 0000000..a4d0d32 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountCommand.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.Command; + + + +public final class CreateAccountCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + private final String mail; + private final String mailConfirm; + private final String password; + private final String passwordConfirm; + private final String language; + + + public CreateAccountCommand( String mail , String mailConfirm , String password , String passwordConfirm , + String language ) + { + this.mail = mail; + this.mailConfirm = mailConfirm; + this.password = password; + this.passwordConfirm = passwordConfirm; + this.language = language; + } + + + public String getMail( ) + { + return this.mail; + } + + + public String getMailConfirm( ) + { + return this.mailConfirm; + } + + + public String getPassword( ) + { + return this.password; + } + + + public String getPasswordConfirm( ) + { + return this.passwordConfirm; + } + + + public String getLanguage( ) + { + return this.language; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountResponse.java new file mode 100644 index 0000000..d7fff8b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/CreateAccountResponse.java @@ -0,0 +1,98 @@ +package com.deepclone.lw.cmd.ext; + + +import java.util.Map; + +import com.deepclone.lw.cmd.MailError; +import com.deepclone.lw.cmd.PasswordError; +import com.deepclone.lw.session.CommandResponse; + + + +public final class CreateAccountResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean created; + + private final String language; + + private final String mail; + + private final String mailConfirm; + + private final PasswordError passwordError; + + private final MailError mailError; + + private final ListLanguagesResponse supportedLanguages; + + + public CreateAccountResponse( String mail , String language ) + { + this.created = true; + this.language = language; + this.mail = mail; + this.mailConfirm = null; + this.passwordError = null; + this.mailError = null; + this.supportedLanguages = null; + } + + + public CreateAccountResponse( String mail , String mailConfirm , PasswordError passwordError , MailError mailError , + String language , Map< String , String > supportedLanguages ) + { + this.created = false; + this.language = language; + this.mail = mail; + this.mailConfirm = mailConfirm; + this.passwordError = passwordError; + this.mailError = mailError; + this.supportedLanguages = new ListLanguagesResponse( supportedLanguages ); + } + + + public boolean getCreated( ) + { + return created; + } + + + public String getLanguage( ) + { + return language; + } + + + public String getMail( ) + { + return mail; + } + + + public String getMailConfirm( ) + { + return mailConfirm; + } + + + public PasswordError getPasswordError( ) + { + return passwordError; + } + + + public MailError getMailError( ) + { + return mailError; + } + + + public ListLanguagesResponse getSupportedLanguages( ) + { + return supportedLanguages; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesCommand.java new file mode 100644 index 0000000..d04a39e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.Command; + + + +public class ListLanguagesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesResponse.java new file mode 100644 index 0000000..5f046c3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/ListLanguagesResponse.java @@ -0,0 +1,66 @@ +package com.deepclone.lw.cmd.ext; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import com.deepclone.lw.session.CommandResponse; + + + +public class ListLanguagesResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + public static class Language + implements Serializable + { + private static final long serialVersionUID = 1L; + + private final String id; + + private final String name; + + + private Language( String id , String name ) + { + this.id = id; + this.name = name; + } + + + public String getId( ) + { + return this.id; + } + + + public String getName( ) + { + return this.name; + } + } + + private final List< Language > languages; + + + public ListLanguagesResponse( Map< String , String > languages ) + { + List< Language > theList = new LinkedList< Language >( ); + for ( Map.Entry< String , String > lDef : languages.entrySet( ) ) { + theList.add( new Language( lDef.getKey( ) , lDef.getValue( ) ) ); + } + this.languages = Collections.unmodifiableList( theList ); + } + + + public List< Language > getLanguages( ) + { + return this.languages; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryCommand.java new file mode 100644 index 0000000..dea1b75 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.Command; + + + +public class RequestPasswordRecoveryCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String mailAddress; + + + public RequestPasswordRecoveryCommand( String mailAddress ) + { + this.mailAddress = mailAddress; + } + + + public String getMailAddress( ) + { + return this.mailAddress; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryResponse.java new file mode 100644 index 0000000..cdf6407 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/ext/RequestPasswordRecoveryResponse.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.ext; + + +import com.deepclone.lw.session.CommandResponse; + + + +public class RequestPasswordRecoveryResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum PasswordRecoveryRequestStatus { + OK , + INVALID_INPUT , + ACCOUNT_NOT_FOUND , + ACCOUNT_STATUS , + RECOVERY_IN_PROGRESS , + MAIL_ERROR + } + + private final PasswordRecoveryRequestStatus status; + + + public RequestPasswordRecoveryResponse( PasswordRecoveryRequestStatus status ) + { + this.status = status; + } + + + public PasswordRecoveryRequestStatus getStatus( ) + { + return status; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/Message.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/Message.java new file mode 100644 index 0000000..d3e8547 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/Message.java @@ -0,0 +1,164 @@ +package com.deepclone.lw.cmd.msgdata; + + +import java.io.Serializable; +import java.sql.Timestamp; + +import com.deepclone.lw.cmd.player.gdata.GameTime; + + + +public class Message + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private Long previous; + private Long next; + + private boolean unread; + private MessageType type; + + private String sender; + private String receiver; + private Timestamp time; + private GameTime gameTime; + + private String title; + private String contents; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public Long getPrevious( ) + { + return previous; + } + + + public void setPrevious( Long previous ) + { + this.previous = previous; + } + + + public Long getNext( ) + { + return next; + } + + + public void setNext( Long next ) + { + this.next = next; + } + + + public boolean isUnread( ) + { + return unread; + } + + + public void setUnread( boolean unread ) + { + this.unread = unread; + } + + + public MessageType getType( ) + { + return type; + } + + + public void setType( MessageType type ) + { + this.type = type; + } + + + public String getSender( ) + { + return sender; + } + + + public void setSender( String sender ) + { + this.sender = sender; + } + + + public String getReceiver( ) + { + return receiver; + } + + + public void setReceiver( String receiver ) + { + this.receiver = receiver; + } + + + public Timestamp getTime( ) + { + return time; + } + + + public void setTime( Timestamp time ) + { + this.time = time; + } + + + public GameTime getGameTime( ) + { + return gameTime; + } + + + public void setGameTime( long tick ) + { + this.gameTime = new GameTime( tick ); + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageListEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageListEntry.java new file mode 100644 index 0000000..aee6cac --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageListEntry.java @@ -0,0 +1,94 @@ +package com.deepclone.lw.cmd.msgdata; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class MessageListEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private MessageType type; + private boolean read; + private String title; + private String sender; + private Timestamp time; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public MessageType getType( ) + { + return type; + } + + + public void setType( MessageType type ) + { + this.type = type; + } + + + public boolean isRead( ) + { + return read; + } + + + public void setRead( boolean read ) + { + this.read = read; + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public String getSender( ) + { + return sender; + } + + + public void setSender( String sender ) + { + this.sender = sender; + } + + + public Timestamp getTime( ) + { + return time; + } + + + public void setTime( Timestamp time ) + { + this.time = time; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageType.java new file mode 100644 index 0000000..319d557 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/msgdata/MessageType.java @@ -0,0 +1,9 @@ +package com.deepclone.lw.cmd.msgdata; + + +public enum MessageType { + EMPIRE , + ALLIANCE , + ADMINISTRATOR , + INTERNAL +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/EmpireResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/EmpireResponse.java new file mode 100644 index 0000000..7b6eea1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/EmpireResponse.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.player; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.battles.BattleListEntry; +import com.deepclone.lw.cmd.player.gdata.empire.OverviewData; +import com.deepclone.lw.cmd.player.gdata.empire.ResearchLineData; + + + +public class EmpireResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + private final OverviewData overview; + private final List< ResearchLineData > research; + private final List< BattleListEntry > battles; + + + public EmpireResponse( GamePageData page , OverviewData overview , List< ResearchLineData > research , + List< BattleListEntry > battles ) + { + super( page ); + this.overview = overview; + this.battles = battles; + this.research = Collections.unmodifiableList( research ); + } + + + public OverviewData getOverview( ) + { + return overview; + } + + + public List< ResearchLineData > getResearch( ) + { + return research; + } + + + public List< BattleListEntry > getBattles( ) + { + return battles; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetCommand.java new file mode 100644 index 0000000..0901c47 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.session.Command; + + + +public class GetNewPlanetCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String name; + + + public GetNewPlanetCommand( String name ) + { + this.name = name; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetResponse.java new file mode 100644 index 0000000..772d507 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/GetNewPlanetResponse.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class GetNewPlanetResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final String name; + private final ObjectNameError error; + private final Integer planet; + + + public GetNewPlanetResponse( GamePageData page , String name , ObjectNameError error ) + { + super( page ); + this.name = name; + this.error = error; + this.planet = null; + } + + + public GetNewPlanetResponse( GamePageData page , int planet ) + { + super( page ); + this.name = null; + this.error = null; + this.planet = planet; + } + + + public String getName( ) + { + return name; + } + + + public ObjectNameError getError( ) + { + return error; + } + + + public Integer getPlanet( ) + { + return planet; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ImplementTechCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ImplementTechCommand.java new file mode 100644 index 0000000..9a26ed7 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ImplementTechCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.session.Command; + + + +public class ImplementTechCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int tech; + + + public ImplementTechCommand( int tech ) + { + this.tech = tech; + } + + + public int getTech( ) + { + return tech; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsCommand.java new file mode 100644 index 0000000..bf8b5e8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.session.Command; + + + +public class ListPlanetsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsResponse.java new file mode 100644 index 0000000..0e93aac --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ListPlanetsResponse.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.cmd.player; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.PlanetListData; + + + +public class ListPlanetsResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final List< PlanetListData > planets; + + + public ListPlanetsResponse( GamePageData page , List< PlanetListData > planets ) + { + super( page ); + this.planets = Collections.unmodifiableList( planets ); + } + + + public List< PlanetListData > getPlanets( ) + { + return planets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/OverviewCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/OverviewCommand.java new file mode 100644 index 0000000..030a27b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/OverviewCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.session.Command; + + + +public class OverviewCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapCommand.java new file mode 100644 index 0000000..2eb03bb --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapCommand.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.cmd.player; + + +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.session.Command; + + + +public class ViewMapCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean defaults; + private final Integer x; + private final Integer y; + private final MapSize size; + + + public ViewMapCommand( ) + { + this.defaults = true; + this.x = null; + this.y = null; + this.size = null; + } + + + public ViewMapCommand( int x , int y , MapSize size ) + { + this.defaults = false; + this.x = x; + this.y = y; + this.size = size; + } + + + public boolean isDefaults( ) + { + return defaults; + } + + + public Integer getX( ) + { + return x; + } + + + public Integer getY( ) + { + return y; + } + + + public MapSize getSize( ) + { + return size; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapResponse.java new file mode 100644 index 0000000..703b122 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/ViewMapResponse.java @@ -0,0 +1,74 @@ +package com.deepclone.lw.cmd.player; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.cmd.player.gdata.map.MapSystemData; + + + +public class ViewMapResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final int x; + private final int y; + private final MapSize size; + private final List< String > sizes; + private final MapSystemData[][] systems; + + + public ViewMapResponse( GamePageData page , int x , int y , MapSize size , List< String > sizes , + MapSystemData[][] systems ) + { + super( page ); + this.x = x; + this.y = y; + this.size = size; + this.sizes = Collections.unmodifiableList( sizes ); + this.systems = systems; + } + + + public int getX( ) + { + return x; + } + + + public int getY( ) + { + return y; + } + + + public MapSize getSize( ) + { + return size; + } + + + public int getSizeOrdinal( ) + { + return size.ordinal( ); + } + + + public List< String > getSizes( ) + { + return sizes; + } + + + public MapSystemData[][] getSystems( ) + { + return systems; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationCommand.java new file mode 100644 index 0000000..2634d43 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class AccountReactivationCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationResponse.java new file mode 100644 index 0000000..9eddc44 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountReactivationResponse.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.CommandResponse; + + + +public class AccountReactivationResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final String address; + + private final boolean success; + + + public AccountReactivationResponse( String address , boolean success ) + { + this.address = address; + this.success = success; + } + + + public String getAddress( ) + { + return this.address; + } + + + public boolean isSuccess( ) + { + return this.success; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationCommand.java new file mode 100644 index 0000000..9854256 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationCommand.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class AccountValidationCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean initialisation; + + private final String token; + + private final String empire; + + private final String planet; + + + public AccountValidationCommand( ) + { + this.initialisation = true; + this.token = null; + this.empire = null; + this.planet = null; + } + + + public AccountValidationCommand( String token , String empire , String planet ) + { + this.initialisation = false; + this.token = token; + this.empire = empire; + this.planet = planet; + } + + + public boolean isInitialisation( ) + { + return this.initialisation; + } + + + public String getToken( ) + { + return this.token; + } + + + public String getEmpire( ) + { + return this.empire; + } + + + public String getPlanet( ) + { + return this.planet; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationResponse.java new file mode 100644 index 0000000..8bd908f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/AccountValidationResponse.java @@ -0,0 +1,121 @@ +package com.deepclone.lw.cmd.player.account; + + +import java.util.Collections; +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.session.CommandResponse; + + + +public class AccountValidationResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean validated; + + private final List< String > previousEmpires; + + private final String token; + + private final String empire; + + private final String planet; + + private final boolean wrongToken; + + private final ObjectNameError empireError; + + private final ObjectNameError planetError; + + + public AccountValidationResponse( ) + { + this.validated = true; + this.previousEmpires = null; + this.token = null; + this.empire = null; + this.planet = null; + this.wrongToken = false; + this.empireError = null; + this.planetError = null; + } + + + public AccountValidationResponse( List< String > previous ) + { + this.validated = false; + this.previousEmpires = Collections.unmodifiableList( previous ); + this.token = null; + this.empire = null; + this.planet = null; + this.wrongToken = false; + this.empireError = null; + this.planetError = null; + } + + + public AccountValidationResponse( List< String > previous , String token , String empire , String planet , + boolean wrongToken , ObjectNameError empireError , ObjectNameError planetError ) + { + this.validated = false; + this.previousEmpires = Collections.unmodifiableList( previous ); + this.token = token; + this.empire = empire; + this.planet = planet; + this.wrongToken = wrongToken; + this.empireError = empireError; + this.planetError = planetError; + } + + + public boolean isValidated( ) + { + return this.validated; + } + + + public List< String > getPreviousEmpires( ) + { + return this.previousEmpires; + } + + + public String getToken( ) + { + return this.token; + } + + + public String getEmpire( ) + { + return this.empire; + } + + + public String getPlanet( ) + { + return this.planet; + } + + + public boolean isWrongToken( ) + { + return this.wrongToken; + } + + + public ObjectNameError getEmpireError( ) + { + return this.empireError; + } + + + public ObjectNameError getPlanetError( ) + { + return this.planetError; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsCommand.java new file mode 100644 index 0000000..dca68e4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class BanDetailsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsResponse.java new file mode 100644 index 0000000..20e70c3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/BanDetailsResponse.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.cmd.player.account; + + +import java.sql.Timestamp; + +import com.deepclone.lw.session.CommandResponse; + + + +public class BanDetailsResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final Timestamp banTime; + private final String banReason; + private final boolean redeemable; + + + public BanDetailsResponse( Timestamp banTime , String banReason , boolean redeemable ) + { + this.banTime = banTime; + this.banReason = banReason; + this.redeemable = redeemable; + } + + + public Timestamp getBanTime( ) + { + return banTime; + } + + + public String getBanReason( ) + { + return banReason; + } + + + public boolean isRedeemable( ) + { + return redeemable; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/CancelQuitCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/CancelQuitCommand.java new file mode 100644 index 0000000..062f377 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/CancelQuitCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class CancelQuitCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountCommand.java new file mode 100644 index 0000000..e51d582 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountCommand.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd.player.account; + +import com.deepclone.lw.session.Command; + +public class GetAccountCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountResponse.java new file mode 100644 index 0000000..3deb26c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetAccountResponse.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; + + + +public class GetAccountResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final AccountData account; + + + public GetAccountResponse( GamePageData page , AccountData account ) + { + super( page ); + this.account = account; + } + + + public AccountData getAccount( ) + { + return account; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageCommand.java new file mode 100644 index 0000000..b60f61c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class GetLanguageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageResponse.java new file mode 100644 index 0000000..c18ad3d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/GetLanguageResponse.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.CommandResponse; + + + +public class GetLanguageResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final String language; + + + public GetLanguageResponse( String language ) + { + this.language = language; + } + + + public String getLanguage( ) + { + return this.language; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/QuitGameCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/QuitGameCommand.java new file mode 100644 index 0000000..c0a4776 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/QuitGameCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class QuitGameCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String reason; + + + public QuitGameCommand( String reason ) + { + this.reason = ( reason == null ? "" : reason.trim( ) ); + } + + + public String getReason( ) + { + return reason; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressCommand.java new file mode 100644 index 0000000..3362047 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class SetAddressCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String sha1Auth; + private final String md5Auth; + private final String mail; + private final String mailConfirm; + + + public SetAddressCommand( String sha1Auth , String md5Auth , String mail , String mailConfirm ) + { + this.sha1Auth = sha1Auth; + this.md5Auth = md5Auth; + this.mail = mail; + this.mailConfirm = mailConfirm; + } + + + public String getSha1Auth( ) + { + return sha1Auth; + } + + + public String getMd5Auth( ) + { + return md5Auth; + } + + + public String getMail( ) + { + return mail; + } + + + public String getMailConfirm( ) + { + return mailConfirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressResponse.java new file mode 100644 index 0000000..b281611 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetAddressResponse.java @@ -0,0 +1,65 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; + + + +public class SetAddressResponse + extends GetAccountResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum AddressChangeStatus { + OK , + EMPTY , + INVALID , + MISMATCH , + IN_USE , + SEND_FAIL + } + + private final boolean mailAuthError; + private final AddressChangeStatus mailError; + private final String mail; + + + public SetAddressResponse( ) + { + super( null , null ); + this.mailAuthError = false; + this.mailError = AddressChangeStatus.OK; + this.mail = null; + } + + + public SetAddressResponse( GamePageData page , AccountData account , boolean mailAuthError , + AddressChangeStatus changeStatus , String mail ) + { + super( page , account ); + this.mailAuthError = mailAuthError; + this.mailError = changeStatus; + this.mail = mail; + } + + + public boolean isMailAuthError( ) + { + return mailAuthError; + } + + + public AddressChangeStatus getMailError( ) + { + return mailError; + } + + + public String getMail( ) + { + return mail; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetLanguageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetLanguageCommand.java new file mode 100644 index 0000000..75b7984 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetLanguageCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class SetLanguageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String language; + + + public SetLanguageCommand( String language ) + { + this.language = language; + } + + + public String getLanguage( ) + { + return language; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordCommand.java new file mode 100644 index 0000000..ef777be --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class SetPasswordCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final String sha1Auth; + private final String md5Auth; + private final String password; + private final String passwordConfirm; + + + public SetPasswordCommand( String sha1Auth , String md5Auth , String password , String passwordConfirm ) + { + this.sha1Auth = sha1Auth; + this.md5Auth = md5Auth; + this.password = password; + this.passwordConfirm = passwordConfirm; + } + + + public String getSha1Auth( ) + { + return sha1Auth; + } + + + public String getMd5Auth( ) + { + return md5Auth; + } + + + public String getPassword( ) + { + return password; + } + + + public String getPasswordConfirm( ) + { + return passwordConfirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordResponse.java new file mode 100644 index 0000000..3d6e71d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPasswordResponse.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; + + + +public class SetPasswordResponse + extends GetAccountResponse +{ + + private static final long serialVersionUID = 1L; + + public static enum PasswordChangeStatus { + OK , + EMPTY , + TOO_WEAK , + MISMATCH , + PROHIBITED + } + + private final boolean authError; + private final PasswordChangeStatus passwordError; + + + public SetPasswordResponse( ) + { + super( null , null ); + this.authError = false; + this.passwordError = PasswordChangeStatus.OK; + } + + + public SetPasswordResponse( GamePageData page , AccountData account , boolean authError , + PasswordChangeStatus changeStatus ) + { + super( page , account ); + this.authError = authError; + this.passwordError = changeStatus; + } + + + public boolean isAuthError( ) + { + return authError; + } + + + public PasswordChangeStatus getPasswordError( ) + { + return passwordError; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPreferencesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPreferencesCommand.java new file mode 100644 index 0000000..d1c4057 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/SetPreferencesCommand.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.player.account; + + +import java.util.Map; + +import com.deepclone.lw.session.Command; + + + +public class SetPreferencesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final Map< String , String > values; + + + public SetPreferencesCommand( ) + { + this.values = null; + } + + + public SetPreferencesCommand( Map< String , String > values ) + { + this.values = values; + } + + + public boolean isReset( ) + { + return this.values == null; + } + + + public Map< String , String > getValues( ) + { + return this.values; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ToggleVacationCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ToggleVacationCommand.java new file mode 100644 index 0000000..da6d81a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ToggleVacationCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class ToggleVacationCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressCommand.java new file mode 100644 index 0000000..69ad994 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressCommand.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.session.Command; + + + +public class ValidateSetAddressCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean cancel; + private final String code; + + + public ValidateSetAddressCommand( ) + { + this.code = null; + this.cancel = true; + } + + + public ValidateSetAddressCommand( String code ) + { + this.code = code; + this.cancel = false; + } + + + public boolean isCancel( ) + { + return cancel; + } + + + public String getCode( ) + { + return code; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressResponse.java new file mode 100644 index 0000000..5f1f15a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/account/ValidateSetAddressResponse.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.cmd.player.account; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.account.AccountData; + + + +public class ValidateSetAddressResponse + extends GetAccountResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean codeError; + private final String code; + + + public ValidateSetAddressResponse( ) + { + super( null , null ); + this.code = null; + this.codeError = false; + } + + + public ValidateSetAddressResponse( GamePageData page , AccountData account , String code ) + { + super( page , account ); + this.code = code; + this.codeError = true; + } + + + public boolean isCodeError( ) + { + return codeError; + } + + + public String getCode( ) + { + return code; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusCommand.java new file mode 100644 index 0000000..ceeb01c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class AllianceStatusCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusResponse.java new file mode 100644 index 0000000..f2eea70 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/AllianceStatusResponse.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceData; + + + +public class AllianceStatusResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final AllianceData alliance; + + + public AllianceStatusResponse( GamePageData page , AllianceData alliance ) + { + super( page ); + this.alliance = alliance; + } + + + public AllianceData getAlliance( ) + { + return alliance; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CancelJoinCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CancelJoinCommand.java new file mode 100644 index 0000000..54af717 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CancelJoinCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class CancelJoinCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceCommand.java new file mode 100644 index 0000000..5e250e7 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceCommand.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class CreateAllianceCommand + extends Command +{ + private static final long serialVersionUID = 1L; + + private final String tag; + private final String name; + + + public CreateAllianceCommand( String tag , String name ) + { + this.tag = tag; + this.name = name; + } + + + public String getTag( ) + { + return tag; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceResponse.java new file mode 100644 index 0000000..c484453 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/CreateAllianceResponse.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceCreationStatus; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceData; + + + +public class CreateAllianceResponse + extends AllianceStatusResponse +{ + + private static final long serialVersionUID = 1L; + + private final AllianceCreationStatus creation; + + + public CreateAllianceResponse( GamePageData page , AllianceData alliance , AllianceCreationStatus creation ) + { + super( page , alliance ); + this.creation = creation; + } + + + public AllianceCreationStatus getCreation( ) + { + return creation; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceCommand.java new file mode 100644 index 0000000..e0fe9cd --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceCommand.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class JoinAllianceCommand + extends Command +{ + private static final long serialVersionUID = 1L; + + private final String tag; + + + public JoinAllianceCommand( String tag ) + { + this.tag = tag; + } + + + public String getTag( ) + { + return tag; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceResponse.java new file mode 100644 index 0000000..d544543 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/JoinAllianceResponse.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceData; + + + +public class JoinAllianceResponse + extends AllianceStatusResponse +{ + + private static final long serialVersionUID = 1L; + + private final String joinFailure; + + + public JoinAllianceResponse( GamePageData page , AllianceData alliance , String tag ) + { + super( page , alliance ); + this.joinFailure = tag; + } + + + public String getJoinFailure( ) + { + return joinFailure; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/KickMembersCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/KickMembersCommand.java new file mode 100644 index 0000000..fddf2a3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/KickMembersCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class KickMembersCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int[] members; + + + public KickMembersCommand( int[] members ) + { + this.members = members; + } + + + public int[] getMembers( ) + { + return members; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/LeaveAllianceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/LeaveAllianceCommand.java new file mode 100644 index 0000000..4cf33da --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/LeaveAllianceCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class LeaveAllianceCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ManageRequestsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ManageRequestsCommand.java new file mode 100644 index 0000000..826e1a1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ManageRequestsCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class ManageRequestsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int[] members; + private final boolean accept; + + + public ManageRequestsCommand( int[] members , boolean accept ) + { + this.members = members; + this.accept = accept; + } + + + public int[] getMembers( ) + { + return members; + } + + + public boolean isAccept( ) + { + return accept; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/TransferLeadershipCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/TransferLeadershipCommand.java new file mode 100644 index 0000000..558d360 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/TransferLeadershipCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class TransferLeadershipCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int toMember; + + + public TransferLeadershipCommand( int toMember ) + { + this.toMember = toMember; + } + + + public int getToMember( ) + { + return toMember; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceCommand.java new file mode 100644 index 0000000..aa201bf --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceCommand.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.session.Command; + + + +public class ViewAllianceCommand + extends Command +{ + private static final long serialVersionUID = 1L; + + private final String tag; + + + public ViewAllianceCommand( String tag ) + { + this.tag = tag; + } + + + public String getTag( ) + { + return tag; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceResponse.java new file mode 100644 index 0000000..2f3e083 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/alliances/ViewAllianceResponse.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.cmd.player.alliances; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.alliance.AllianceData; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; + + + +public class ViewAllianceResponse + extends AllianceStatusResponse +{ + + private static final long serialVersionUID = 1L; + + private final String requested; + private final PublicAllianceInformation info; + + + public ViewAllianceResponse( GamePageData page , AllianceData alliance , String requested , + PublicAllianceInformation info ) + { + super( page , alliance ); + this.requested = requested; + this.info = info; + } + + + public String getRequested( ) + { + return requested; + } + + + public PublicAllianceInformation getInfo( ) + { + return info; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleCommand.java new file mode 100644 index 0000000..555c2f4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleCommand.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.cmd.player.battles; + + +import com.deepclone.lw.session.Command; + + + +public class GetBattleCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long battle; + private final Long tick; + + + public GetBattleCommand( long battle ) + { + this.battle = battle; + this.tick = null; + } + + + public GetBattleCommand( long battle , long tick ) + { + this.battle = battle; + this.tick = tick; + } + + + public long getBattle( ) + { + return battle; + } + + + public Long getTick( ) + { + return tick; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleResponse.java new file mode 100644 index 0000000..bf46be5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/GetBattleResponse.java @@ -0,0 +1,29 @@ +package com.deepclone.lw.cmd.player.battles; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.battles.BattleView; + + + +public class GetBattleResponse + extends GameResponseBase +{ + private static final long serialVersionUID = 1L; + private final BattleView battle; + + + public GetBattleResponse( GamePageData page , BattleView battle ) + { + super( page ); + this.battle = battle; + } + + + public BattleView getBattle( ) + { + return battle; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesCommand.java new file mode 100644 index 0000000..6b8041a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesCommand.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.cmd.player.battles; + + +import com.deepclone.lw.session.Command; + + + +public class ListBattlesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int page; + + + public ListBattlesCommand( ) + { + this.page = 0; + } + + + public ListBattlesCommand( int page ) + { + this.page = page; + } + + + public int getPage( ) + { + return page; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesResponse.java new file mode 100644 index 0000000..a4856c7 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/battles/ListBattlesResponse.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.player.battles; + + +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.battles.BattleListEntry; + + + +public class ListBattlesResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + private final List< BattleListEntry > list; + private final int currentPage; + private final int pages; + + + public ListBattlesResponse( GamePageData page , List< BattleListEntry > list , int cPage , int pages ) + { + super( page ); + this.list = list; + this.currentPage = cPage; + this.pages = pages; + } + + + public List< BattleListEntry > getList( ) + { + return list; + } + + + public int getCurrentPage( ) + { + return currentPage; + } + + + public int getPages( ) + { + return pages; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ListBugsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ListBugsResponse.java new file mode 100644 index 0000000..6481ab0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ListBugsResponse.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.cmd.player.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.bt.data.BugReport; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class ListBugsResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final BugStatus status; + private final boolean ownOnly; + private final long first; + private final int count; + private final long entries; + private final List< BugReport > reports; + + + public ListBugsResponse( GamePageData page , BugStatus status , boolean ownOnly , long first , int count , + long entries , List< BugReport > reports ) + { + super( page ); + this.status = status; + this.ownOnly = ownOnly; + this.first = first; + this.count = count; + this.entries = entries; + this.reports = reports; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public boolean isOwnOnly( ) + { + return ownOnly; + } + + + public long getFirst( ) + { + return first; + } + + + public int getCount( ) + { + return count; + } + + + public long getEntries( ) + { + return entries; + } + + + public List< BugReport > getReports( ) + { + return reports; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/PostCommentResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/PostCommentResponse.java new file mode 100644 index 0000000..2c7c353 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/PostCommentResponse.java @@ -0,0 +1,69 @@ +package com.deepclone.lw.cmd.player.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugReport; +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class PostCommentResponse + extends ViewBugResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean posted; + private final ObjectNameError commentError; + private final String comment; + + + public PostCommentResponse( GamePageData page , boolean posted ) + { + super( page ); + this.posted = posted; + this.comment = null; + this.commentError = null; + } + + + public PostCommentResponse( GamePageData page , BugReport report , List< BugEvent > events , ObjectNameError error , + String comment ) + { + super( page , report , events ); + this.posted = false; + this.commentError = error; + this.comment = comment; + } + + + public PostCommentResponse( PostCommentResponse response , Object query ) + { + super( response , query ); + this.posted = false; + this.commentError = response.commentError; + this.comment = response.comment; + } + + + public boolean isPosted( ) + { + return posted; + } + + + public ObjectNameError getCommentError( ) + { + return commentError; + } + + + public String getComment( ) + { + return comment; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ReportBugResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ReportBugResponse.java new file mode 100644 index 0000000..6fb47c9 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ReportBugResponse.java @@ -0,0 +1,96 @@ +package com.deepclone.lw.cmd.player.bt; + + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class ReportBugResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final long bugId; + private final ObjectNameError titleError; + private final String title; + private final ObjectNameError descriptionError; + private final String description; + private final Object query; + + + public ReportBugResponse( GamePageData page , long bugId ) + { + super( page ); + this.bugId = bugId; + this.titleError = null; + this.title = null; + this.descriptionError = null; + this.description = null; + this.query = null; + } + + + public ReportBugResponse( GamePageData page , ObjectNameError titleError , String title , + ObjectNameError descriptionError , String description ) + { + super( page ); + this.bugId = 0; + this.titleError = titleError; + this.title = title; + this.descriptionError = descriptionError; + this.description = description; + this.query = null; + } + + + public ReportBugResponse( ReportBugResponse response , Object query ) + { + super( response.getPage( ) ); + this.bugId = 0; + this.titleError = response.titleError; + this.title = response.title; + this.descriptionError = response.descriptionError; + this.description = response.description; + this.query = query; + } + + + public long getBugId( ) + { + return bugId; + } + + + public ObjectNameError getTitleError( ) + { + return titleError; + } + + + public String getTitle( ) + { + return title; + } + + + public ObjectNameError getDescriptionError( ) + { + return descriptionError; + } + + + public String getDescription( ) + { + return description; + } + + + public Object getQuery( ) + { + return query; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ViewBugResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ViewBugResponse.java new file mode 100644 index 0000000..0f487c5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/bt/ViewBugResponse.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.player.bt; + + +import java.util.List; + +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugReport; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class ViewBugResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final BugReport report; + private final List< BugEvent > events; + private final Object query; + + + public ViewBugResponse( GamePageData page ) + { + super( page ); + this.report = null; + this.events = null; + this.query = null; + } + + + public ViewBugResponse( GamePageData page , BugReport report , List< BugEvent > events ) + { + super( page ); + this.report = report; + this.events = events; + this.query = null; + } + + + public ViewBugResponse( ViewBugResponse response , Object query ) + { + super( response.getPage( ) ); + this.report = response.report; + this.events = response.events; + this.query = query; + } + + + public BugReport getReport( ) + { + return report; + } + + + public List< BugEvent > getEvents( ) + { + return events; + } + + + public Object getQuery( ) + { + return query; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyCommand.java new file mode 100644 index 0000000..f4342b2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.elist; + + +import com.deepclone.lw.session.Command; + + + +public class AddEnemyCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean alliance; + private final String name; + + + public AddEnemyCommand( boolean alliance , String name ) + { + this.alliance = alliance; + this.name = name; + } + + + public boolean isAlliance( ) + { + return alliance; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyResponse.java new file mode 100644 index 0000000..0e3e7e2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/AddEnemyResponse.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.cmd.player.elist; + + +import java.util.List; + +import com.deepclone.lw.cmd.ObjectNameError; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class AddEnemyResponse + extends EnemyListResponse +{ + + private static final long serialVersionUID = 1L; + + private final ObjectNameError error; + private final boolean alliance; + private final String name; + + + public AddEnemyResponse( GamePageData page , List< NameIdPair > empires , List< NameIdPair > alliances , + ObjectNameError error , boolean alliance , String name ) + { + super( page , empires , alliances ); + this.error = error; + this.alliance = alliance; + this.name = name; + } + + + public ObjectNameError getError( ) + { + return error; + } + + + public boolean isAlliance( ) + { + return alliance; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListCommand.java new file mode 100644 index 0000000..d72bf7d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.elist; + + +import com.deepclone.lw.session.Command; + + + +public class EnemyListCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListResponse.java new file mode 100644 index 0000000..85ebd0d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/EnemyListResponse.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.cmd.player.elist; + + +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class EnemyListResponse + extends GameResponseBase +{ + private static final long serialVersionUID = 1L; + + private final List< NameIdPair > empires; + private final List< NameIdPair > alliances; + + + public EnemyListResponse( GamePageData page , List< NameIdPair > empires , List< NameIdPair > alliances ) + { + super( page ); + this.empires = empires; + this.alliances = alliances; + } + + + public List< NameIdPair > getEmpires( ) + { + return empires; + } + + + public List< NameIdPair > getAlliances( ) + { + return alliances; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/RemoveEnemiesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/RemoveEnemiesCommand.java new file mode 100644 index 0000000..9a3ffbe --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/elist/RemoveEnemiesCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.elist; + + +import com.deepclone.lw.session.Command; + + + +public class RemoveEnemiesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean alliance; + private final int[] identifiers; + + + public RemoveEnemiesCommand( boolean alliance , int[] identifiers ) + { + this.alliance = alliance; + this.identifiers = identifiers; + } + + + public boolean isAlliance( ) + { + return alliance; + } + + + public int[] getIdentifiers( ) + { + return identifiers; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsCommand.java new file mode 100644 index 0000000..4ac3589 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsCommand.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.cmd.player.fleets; + + +public class DisbandFleetsCommand + extends MultiFleetsCommand +{ + + private static final long serialVersionUID = 1L; + + private final boolean confirm; + + + public DisbandFleetsCommand( long[] fleets , boolean confirm ) + { + super( fleets ); + this.confirm = confirm; + } + + + public boolean isConfirm( ) + { + return confirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsResponse.java new file mode 100644 index 0000000..9eace3b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/DisbandFleetsResponse.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class DisbandFleetsResponse + extends MultiFleetsResponse +{ + + private static final long serialVersionUID = 1L; + + + public DisbandFleetsResponse( GamePageData page ) + { + super( page ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsCommand.java new file mode 100644 index 0000000..f5029ce --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsCommand.java @@ -0,0 +1,16 @@ +package com.deepclone.lw.cmd.player.fleets; + + +public class MergeFleetsCommand + extends MultiFleetsCommand +{ + + private static final long serialVersionUID = 1L; + + + public MergeFleetsCommand( long[] fleets ) + { + super( fleets ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsResponse.java new file mode 100644 index 0000000..f0e92a5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MergeFleetsResponse.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class MergeFleetsResponse + extends MultiFleetsResponse +{ + + private static final long serialVersionUID = 1L; + + + public MergeFleetsResponse( GamePageData page ) + { + super( page ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsCommand.java new file mode 100644 index 0000000..1efee46 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsCommand.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.player.fleets; + + +public class MoveFleetsCommand + extends MultiFleetsCommand +{ + + private static final long serialVersionUID = 1L; + + private final String destination; + private final Boolean mode; + + + public MoveFleetsCommand( long[] fleets ) + { + super( fleets ); + this.destination = null; + this.mode = null; + } + + + public MoveFleetsCommand( long[] fleets , String destination , boolean mode ) + { + super( fleets ); + this.destination = destination; + this.mode = mode; + } + + + public String getDestination( ) + { + return destination; + } + + + public Boolean getMode( ) + { + return mode; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsResponse.java new file mode 100644 index 0000000..e524398 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MoveFleetsResponse.java @@ -0,0 +1,60 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class MoveFleetsResponse + extends MultiFleetsResponse +{ + + private static final long serialVersionUID = 1L; + + private boolean error; + private String destination; + private Boolean mode; + + + public MoveFleetsResponse( GamePageData page ) + { + super( page ); + } + + + public boolean isError( ) + { + return error; + } + + + public void setError( boolean error ) + { + this.error = error; + } + + + public String getDestination( ) + { + return destination; + } + + + public void setDestination( String destination ) + { + this.destination = destination; + } + + + public Boolean getMode( ) + { + return mode; + } + + + public void setMode( Boolean mode ) + { + this.mode = mode; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsCommand.java new file mode 100644 index 0000000..4ebc86c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsCommand.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.session.Command; + + + +public abstract class MultiFleetsCommand + extends Command +{ + private static final long serialVersionUID = 1L; + + private final long fleets[]; + + + public MultiFleetsCommand( long fleets[] ) + { + this.fleets = fleets.clone( ); + } + + + public long[] getFleets( ) + { + return fleets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsResponse.java new file mode 100644 index 0000000..3728e18 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/MultiFleetsResponse.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.fleets.ShortFleetView; + + + +public abstract class MultiFleetsResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final List< ShortFleetView > fleets = new LinkedList< ShortFleetView >( ); + + + public MultiFleetsResponse( GamePageData page ) + { + super( page ); + } + + + public void addFleet( ShortFleetView fleet ) + { + this.fleets.add( fleet ); + } + + + public List< ShortFleetView > getFleets( ) + { + return fleets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsCommand.java new file mode 100644 index 0000000..95393e6 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsCommand.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.player.fleets; + + +public class RenameFleetsCommand + extends MultiFleetsCommand +{ + + private static final long serialVersionUID = 1L; + + private final boolean rename; + private final String name; + + + public RenameFleetsCommand( long[] fleets ) + { + super( fleets ); + this.name = null; + this.rename = false; + } + + + public RenameFleetsCommand( long[] fleets , String name ) + { + super( fleets ); + this.name = name; + this.rename = true; + } + + + public boolean isRename( ) + { + return rename; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsResponse.java new file mode 100644 index 0000000..e20a569 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/RenameFleetsResponse.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class RenameFleetsResponse + extends MultiFleetsResponse +{ + + private static final long serialVersionUID = 1L; + + private boolean error; + private String name; + + + public RenameFleetsResponse( GamePageData page ) + { + super( page ); + } + + + public boolean isError( ) + { + return error; + } + + + public void setError( boolean error ) + { + this.error = error; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeCommand.java new file mode 100644 index 0000000..3f44ab3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeCommand.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.player.fleets; + + +public class SetFleetsModeCommand + extends MultiFleetsCommand +{ + + private static final long serialVersionUID = 1L; + + private final boolean attack; + private final boolean confirm; + + + public SetFleetsModeCommand( long[] fleets , boolean attack , boolean confirm ) + { + super( fleets ); + this.attack = attack; + this.confirm = confirm; + } + + + public boolean isAttack( ) + { + return attack; + } + + + public boolean isConfirm( ) + { + return confirm; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeResponse.java new file mode 100644 index 0000000..edf245c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SetFleetsModeResponse.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; + + + +public class SetFleetsModeResponse + extends MultiFleetsResponse +{ + + private static final long serialVersionUID = 1L; + + private boolean attack; + + + public SetFleetsModeResponse( GamePageData page ) + { + super( page ); + } + + + public boolean isAttack( ) + { + return attack; + } + + + public void setAttack( boolean attack ) + { + this.attack = attack; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetCommand.java new file mode 100644 index 0000000..686a3c2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetCommand.java @@ -0,0 +1,63 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import java.util.Map; + +import com.deepclone.lw.session.Command; + + + +public class SplitFleetCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final long fleet; + private final Map< Integer , Integer > ships; + private final Integer nFleets; + private final String name; + + + public SplitFleetCommand( long fleet ) + { + this.fleet = fleet; + this.ships = null; + this.nFleets = null; + this.name = null; + } + + + public SplitFleetCommand( long fleet , Map< Integer , Integer > ships , Integer nFleets , String name ) + { + this.fleet = fleet; + this.ships = ships; + this.nFleets = nFleets; + this.name = name; + } + + + public long getFleet( ) + { + return fleet; + } + + + public Map< Integer , Integer > getShips( ) + { + return ships; + } + + + public Integer getnFleets( ) + { + return nFleets; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetResponse.java new file mode 100644 index 0000000..6351066 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/SplitFleetResponse.java @@ -0,0 +1,106 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.fleets.ShortFleetView; +import com.deepclone.lw.cmd.player.gdata.fleets.SplitShips; + + + +public class SplitFleetResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private ShortFleetView initialFleet; + private final List< SplitShips > ships = new LinkedList< SplitShips >( ); + + private int nFleets = 1; + private String name = ""; + private boolean nameError = false; + private boolean shipsError = false; + + + public SplitFleetResponse( GamePageData page ) + { + super( page ); + } + + + public ShortFleetView getInitialFleet( ) + { + return initialFleet; + } + + + public void setInitialFleet( ShortFleetView initialFleet ) + { + this.initialFleet = initialFleet; + } + + + public int getnFleets( ) + { + return nFleets; + } + + + public void setnFleets( int nFleets ) + { + this.nFleets = nFleets; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public boolean isNameError( ) + { + return nameError; + } + + + public void setNameError( boolean nameError ) + { + this.nameError = nameError; + } + + + public boolean isShipsError( ) + { + return shipsError; + } + + + public void setShipsError( boolean shipsError ) + { + this.shipsError = shipsError; + } + + + public void addShips( SplitShips ships ) + { + this.ships.add( ships ); + } + + + public List< SplitShips > getShips( ) + { + return ships; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsCommand.java new file mode 100644 index 0000000..67f33d3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.session.Command; + + + +public class ViewFleetsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsResponse.java new file mode 100644 index 0000000..d1c6484 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/fleets/ViewFleetsResponse.java @@ -0,0 +1,30 @@ +package com.deepclone.lw.cmd.player.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.fleets.FleetsView; + + + +public class ViewFleetsResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + private final FleetsView fleets; + + + public ViewFleetsResponse( GamePageData page , FleetsView view ) + { + super( page ); + this.fleets = view; + } + + + public FleetsView getFleets( ) + { + return fleets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GamePageData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GamePageData.java new file mode 100644 index 0000000..82e1767 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GamePageData.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.Date; +import java.util.List; + + + +public class GamePageData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + private final String empire; + private final Character special; + private final String alliance; + private final long cash; + private final Date serverTime; + private final GameTime gameTime; + private final List< NameIdPair > planets; + private final boolean useRLTime; + + + public GamePageData( String empire , Character special , String alliance , long cash , long gameTime , + List< NameIdPair > planets , boolean useRLTime ) + { + this.empire = empire; + this.special = special; + this.alliance = alliance; + this.cash = cash; + this.serverTime = new Date( ); + this.gameTime = new GameTime( gameTime ); + this.planets = Collections.unmodifiableList( planets ); + this.useRLTime = useRLTime; + } + + + public String getEmpire( ) + { + return empire; + } + + + public Character getSpecial( ) + { + return special; + } + + + public String getAlliance( ) + { + return alliance; + } + + + public long getCash( ) + { + return cash; + } + + + public Date getServerTime( ) + { + return serverTime; + } + + + public GameTime getGameTime( ) + { + return gameTime; + } + + + public List< NameIdPair > getPlanets( ) + { + return planets; + } + + + public boolean isUseRLTime( ) + { + return useRLTime; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameResponseBase.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameResponseBase.java new file mode 100644 index 0000000..f535b9d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameResponseBase.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import com.deepclone.lw.session.CommandResponse; + + + +public abstract class GameResponseBase + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + + private final GamePageData page; + + + public GameResponseBase( GamePageData page ) + { + this.page = page; + } + + + public GamePageData getPage( ) + { + return page; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameTime.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameTime.java new file mode 100644 index 0000000..ac2c9b1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/GameTime.java @@ -0,0 +1,58 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class GameTime + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final int years; + private final int weeks; + private final int days; + private final int hours; + + + public GameTime( long time ) + { + if ( time <= 0 ) { + this.hours = this.days = this.weeks = this.years = 0; + } else { + this.hours = (int) ( time % 24 ); + time = ( time - this.hours ) / 24; + this.days = (int) ( time % 7 ); + time = ( time - this.days ) / 7; + this.weeks = (int) ( time % 52 ); + this.years = (int) ( ( time - this.weeks ) / 52 ); + } + } + + + public int getYears( ) + { + return years; + } + + + public int getWeeks( ) + { + return weeks; + } + + + public int getDays( ) + { + return days; + } + + + public int getHours( ) + { + return hours; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MailPreference.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MailPreference.java new file mode 100644 index 0000000..c4f9eb1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MailPreference.java @@ -0,0 +1,32 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.util.HashMap; +import java.util.Map; + + + +public enum MailPreference { + + NO_MAIL( "mailPrefNo" ) , + DAILY_RECAP( "mailPrefRecap" ) , + INSTANT( "mailPrefInstant" ); + + private String i18nId; + + + private MailPreference( String i18nId ) + { + this.i18nId = i18nId; + } + + + public static Map< MailPreference , String > getValues( ) + { + Map< MailPreference , String > v = new HashMap< MailPreference , String >( ); + for ( MailPreference s : MailPreference.values( ) ) { + v.put( s , s.i18nId ); + } + return v; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MapSize.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MapSize.java new file mode 100644 index 0000000..058c7f8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/MapSize.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.util.HashMap; +import java.util.Map; + + + +public enum MapSize { + + SMALL( "mapSizeSmall" ) , + MEDIUM( "mapSizeMedium" ) , + LARGE( "mapSizeLarge" ); + + private String i18nId; + + + private MapSize( String i18nId ) + { + this.i18nId = i18nId; + } + + + public static Map< MapSize , String > getValues( ) + { + Map< MapSize , String > v = new HashMap< MapSize , String >( ); + for ( MapSize s : MapSize.values( ) ) { + v.put( s , s.i18nId ); + } + return v; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/NameIdPair.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/NameIdPair.java new file mode 100644 index 0000000..4bea9e4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/NameIdPair.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class NameIdPair + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final String name; + + + public NameIdPair( long id , String name ) + { + this.id = id; + this.name = name; + } + + + public long getId( ) + { + return id; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetListData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetListData.java new file mode 100644 index 0000000..27c4571 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetListData.java @@ -0,0 +1,335 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class PlanetListData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String name; + + private int x; + private int y; + private int orbit; + + private long population; + private int happiness; + + private long income; + private long upkeep; + + private long militaryProduction; + private long industrialProduction; + private long growthProduction; + + private long civInvestment; + private int civAmount; + private boolean civDestroy; + private String civName; + + private long milInvestment; + private int milAmount; + private String milName; + + private long fpStatic; + private long fpOwn; + private long fpFriendly; + private long fpHostile; + + private Long battle; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public long getPopulation( ) + { + return population; + } + + + public void setPopulation( long population ) + { + this.population = population; + } + + + public int getHappiness( ) + { + return happiness; + } + + + public void setHappiness( int happiness ) + { + this.happiness = happiness; + } + + + public long getIncome( ) + { + return income; + } + + + public void setIncome( long income ) + { + this.income = income; + } + + + public long getUpkeep( ) + { + return upkeep; + } + + + public void setUpkeep( long upkeep ) + { + this.upkeep = upkeep; + } + + + public long getMilitaryProduction( ) + { + return militaryProduction; + } + + + public void setMilitaryProduction( long militaryProduction ) + { + this.militaryProduction = militaryProduction; + } + + + public long getIndustrialProduction( ) + { + return industrialProduction; + } + + + public void setIndustrialProduction( long industrialProduction ) + { + this.industrialProduction = industrialProduction; + } + + + public long getGrowthProduction( ) + { + return growthProduction; + } + + + public void setGrowthProduction( long growthProduction ) + { + this.growthProduction = growthProduction; + } + + + public long getCivInvestment( ) + { + return civInvestment; + } + + + public void setCivInvestment( long civInvestment ) + { + this.civInvestment = civInvestment; + } + + + public int getCivAmount( ) + { + return civAmount; + } + + + public void setCivAmount( int civAmount ) + { + this.civAmount = civAmount; + } + + + public boolean isCivDestroy( ) + { + return civDestroy; + } + + + public void setCivDestroy( boolean civDestroy ) + { + this.civDestroy = civDestroy; + } + + + public String getCivName( ) + { + return civName; + } + + + public void setCivName( String civName ) + { + this.civName = civName; + } + + + public long getMilInvestment( ) + { + return milInvestment; + } + + + public void setMilInvestment( long milInvestment ) + { + this.milInvestment = milInvestment; + } + + + public int getMilAmount( ) + { + return milAmount; + } + + + public void setMilAmount( int milAmount ) + { + this.milAmount = milAmount; + } + + + public String getMilName( ) + { + return milName; + } + + + public void setMilName( String milName ) + { + this.milName = milName; + } + + + public long getFpStatic( ) + { + return fpStatic; + } + + + public void setFpStatic( long fpStatic ) + { + this.fpStatic = fpStatic; + } + + + public long getFpOwn( ) + { + return fpOwn; + } + + + public void setFpOwn( long fpOwn ) + { + this.fpOwn = fpOwn; + } + + + public long getFpFriendly( ) + { + return fpFriendly; + } + + + public void setFpFriendly( long fpFriendly ) + { + this.fpFriendly = fpFriendly; + } + + + public long getFpHostile( ) + { + return fpHostile; + } + + + public void setFpHostile( long fpHostile ) + { + this.fpHostile = fpHostile; + } + + + public Long getBattle( ) + { + return battle; + } + + + public void setBattle( Long battle ) + { + this.battle = battle; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetReference.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetReference.java new file mode 100644 index 0000000..fb111b3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetReference.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class PlanetReference + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final long identifier; + private final String name; + + + public PlanetReference( long identifier , String name ) + { + this.identifier = identifier; + this.name = name; + } + + + public long getIdentifier( ) + { + return identifier; + } + + + public String getName( ) + { + return name; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetRelationType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetRelationType.java new file mode 100644 index 0000000..4934723 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/PlanetRelationType.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd.player.gdata; + + +public enum PlanetRelationType { + + OWN , + ALLIED , + ENEMY + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/ShortBattleView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/ShortBattleView.java new file mode 100644 index 0000000..111f17e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/ShortBattleView.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class ShortBattleView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private long friendly; + private long hostile; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public long getFriendly( ) + { + return friendly; + } + + + public void setFriendly( long friendly ) + { + this.friendly = friendly; + } + + + public long getHostile( ) + { + return hostile; + } + + + public void setHostile( long hostile ) + { + this.hostile = hostile; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/TimeCombo.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/TimeCombo.java new file mode 100644 index 0000000..4f180d2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/TimeCombo.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.gdata; + + +import java.io.Serializable; + + + +public class TimeCombo + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long ticks; + private GameTime gameTime; + + + public TimeCombo( long time ) + { + this.ticks = time; + this.gameTime = new GameTime( time ); + } + + + public long getTicks( ) + { + return ticks; + } + + + public GameTime getGameTime( ) + { + return gameTime; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/AccountData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/AccountData.java new file mode 100644 index 0000000..8b94e01 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/AccountData.java @@ -0,0 +1,156 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.ext.ListLanguagesResponse; +import com.deepclone.lw.cmd.player.gdata.GameTime; + + + +public class AccountData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String address; + private int gameCredits; + + private int vacCredits; + private GameTime vacTime; + private Timestamp vacStart; + + private Timestamp quitGame; + + private ListLanguagesResponse supportedLanguages; + private String language; + + private MailChangeData mailChange; + + private List< PrefCategory > preferences = new LinkedList< PrefCategory >( ); + + + public String getAddress( ) + { + return address; + } + + + public void setAddress( String address ) + { + this.address = address; + } + + + public int getGameCredits( ) + { + return gameCredits; + } + + + public void setGameCredits( int gameCredits ) + { + this.gameCredits = gameCredits; + } + + + public int getVacCredits( ) + { + return vacCredits; + } + + + public void setVacCredits( int vacCredits ) + { + this.vacCredits = vacCredits; + } + + + public GameTime getVacTime( ) + { + return this.vacTime; + } + + + public void setVacTime( int vacTime ) + { + this.vacTime = ( vacTime >= 60 ) ? new GameTime( vacTime / 60 ) : null; + } + + + public Timestamp getVacStart( ) + { + return vacStart; + } + + + public void setVacStart( Timestamp vacStart ) + { + this.vacStart = vacStart; + } + + + public Timestamp getQuitGame( ) + { + return quitGame; + } + + + public void setQuitGame( Timestamp quitGame ) + { + this.quitGame = quitGame; + } + + + public ListLanguagesResponse getSupportedLanguages( ) + { + return supportedLanguages; + } + + + public void setSupportedLanguages( ListLanguagesResponse supportedLanguages ) + { + this.supportedLanguages = supportedLanguages; + } + + + public String getLanguage( ) + { + return language; + } + + + public void setLanguage( String language ) + { + this.language = language; + } + + + public MailChangeData getMailChange( ) + { + return mailChange; + } + + + public void setMailChange( MailChangeData mailChange ) + { + this.mailChange = mailChange; + } + + + public void addPreferenceCategory( PrefCategory cat ) + { + this.preferences.add( cat ); + } + + + public List< PrefCategory > getPreferences( ) + { + return preferences; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/MailChangeData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/MailChangeData.java new file mode 100644 index 0000000..65957a1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/MailChangeData.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +import java.io.Serializable; +import java.sql.Timestamp; + + + +public class MailChangeData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final Timestamp until; + + private final boolean used; + + private final String newAddress; + + + public MailChangeData( Timestamp until ) + { + this.until = until; + this.used = true; + this.newAddress = null; + } + + + public MailChangeData( Timestamp until , String newAddress ) + { + this.until = until; + this.used = false; + this.newAddress = newAddress; + } + + + public Timestamp getUntil( ) + { + return until; + } + + + public boolean isUsed( ) + { + return used; + } + + + public String getNewAddress( ) + { + return newAddress; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefCategory.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefCategory.java new file mode 100644 index 0000000..6641104 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefCategory.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + + + +public class PrefCategory + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String name; + private List< PrefValue > preferences = new LinkedList< PrefValue >( ); + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public void addValue( PrefValue value ) + { + this.preferences.add( value ); + } + + + public List< PrefValue > getPreferences( ) + { + return preferences; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefChoice.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefChoice.java new file mode 100644 index 0000000..fe45669 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefChoice.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +import java.io.Serializable; + + + +public class PrefChoice + implements Serializable +{ + private static final long serialVersionUID = 1L; + + private String value; + private String display; + + + public PrefChoice( String value , String display ) + { + this.value = value; + this.display = display; + } + + + public String getValue( ) + { + return value; + } + + + public String getDisplay( ) + { + return display; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefType.java new file mode 100644 index 0000000..267e203 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefType.java @@ -0,0 +1,9 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +public enum PrefType { + STRING , + INTEGER , + BOOLEAN , + CHOICE +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefValue.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefValue.java new file mode 100644 index 0000000..1ed93ed --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/account/PrefValue.java @@ -0,0 +1,94 @@ +package com.deepclone.lw.cmd.player.gdata.account; + + +import java.io.Serializable; +import java.util.List; + + + +public class PrefValue + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String id; + private String name; + private String description; + private PrefType type; + private List< PrefChoice > choices; + private String value; + + + public String getId( ) + { + return id; + } + + + public void setId( String id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public PrefType getType( ) + { + return type; + } + + + public void setType( PrefType type ) + { + this.type = type; + } + + + public List< PrefChoice > getChoices( ) + { + return choices; + } + + + public void setChoices( List< PrefChoice > choices ) + { + this.choices = choices; + } + + + public String getValue( ) + { + return value; + } + + + public void setValue( String value ) + { + this.value = value; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceCreationStatus.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceCreationStatus.java new file mode 100644 index 0000000..241b5a3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceCreationStatus.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.ObjectNameError; + + + +public class AllianceCreationStatus + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String tag; + private final ObjectNameError tagError; + private final String name; + private final ObjectNameError nameError; + + + public AllianceCreationStatus( String tag , ObjectNameError tagError , String name , ObjectNameError nameError ) + { + this.tag = tag; + this.tagError = tagError; + this.name = name; + this.nameError = nameError; + } + + + public String getTag( ) + { + return tag; + } + + + public ObjectNameError getTagError( ) + { + return tagError; + } + + + public String getName( ) + { + return name; + } + + + public ObjectNameError getNameError( ) + { + return nameError; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceData.java new file mode 100644 index 0000000..08b670c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceData.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; + + + + +public class AllianceData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final PublicAllianceInformation main; + private final AllianceMemberData member; + private final AllianceLeaderData leader; + + + public AllianceData( PublicAllianceInformation main , AllianceMemberData member , AllianceLeaderData leader ) + { + this.main = main; + this.member = member; + this.leader = leader; + } + + + public PublicAllianceInformation getMain( ) + { + return main; + } + + + public AllianceMemberData getMember( ) + { + return member; + } + + + public AllianceLeaderData getLeader( ) + { + return leader; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceLeaderData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceLeaderData.java new file mode 100644 index 0000000..a5293df --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceLeaderData.java @@ -0,0 +1,31 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class AllianceLeaderData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final List< NameIdPair > requests; + + + public AllianceLeaderData( List< NameIdPair > requests ) + { + this.requests = requests; + } + + + public List< NameIdPair > getRequests( ) + { + return requests; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceMemberData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceMemberData.java new file mode 100644 index 0000000..48f35a3 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AllianceMemberData.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class AllianceMemberData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final List< NameIdPair > members; + private final List< AlliancePlanetData > planets; + + + public AllianceMemberData( List< NameIdPair > members , List< AlliancePlanetData > planets ) + { + this.members = members; + this.planets = planets; + } + + + public List< NameIdPair > getMembers( ) + { + return members; + } + + + public List< AlliancePlanetData > getPlanets( ) + { + return planets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AlliancePlanetData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AlliancePlanetData.java new file mode 100644 index 0000000..a17aa8a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/AlliancePlanetData.java @@ -0,0 +1,146 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; + + + +public class AlliancePlanetData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String name; + private int x; + private int y; + private int orbit; + private int ownerId; + private String owner; + + private boolean battle; + private long defence; + private long attack; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public int getOwnerId( ) + { + return ownerId; + } + + + public void setOwnerId( int ownerId ) + { + this.ownerId = ownerId; + } + + + public String getOwner( ) + { + return owner; + } + + + public void setOwner( String owner ) + { + this.owner = owner; + } + + + public boolean isBattle( ) + { + return battle; + } + + + public void setBattle( boolean battle ) + { + this.battle = battle; + } + + + public long getDefence( ) + { + return defence; + } + + + public void setDefence( long defence ) + { + this.defence = defence; + } + + + public long getAttack( ) + { + return attack; + } + + + public void setAttack( long attack ) + { + this.attack = attack; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/PublicAllianceInformation.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/PublicAllianceInformation.java new file mode 100644 index 0000000..76463c1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/alliance/PublicAllianceInformation.java @@ -0,0 +1,69 @@ +package com.deepclone.lw.cmd.player.gdata.alliance; + + +import java.io.Serializable; + + + +public class PublicAllianceInformation + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final int id; + private final String tag; + private final String name; + private final int leaderId; + private final String leaderName; + private final long planets; + + + public PublicAllianceInformation( int id , String tag , String name , int leaderId , String leaderName , + long planets ) + { + this.id = id; + this.tag = tag; + this.name = name; + this.leaderId = leaderId; + this.leaderName = leaderName; + this.planets = planets; + } + + + public int getId( ) + { + return id; + } + + + public String getTag( ) + { + return tag; + } + + + public String getName( ) + { + return name; + } + + + public int getLeaderId( ) + { + return leaderId; + } + + + public String getLeaderName( ) + { + return leaderName; + } + + + public long getPlanets( ) + { + return planets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDescription.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDescription.java new file mode 100644 index 0000000..22eed1e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDescription.java @@ -0,0 +1,83 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class BattleDescription + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private NameIdPair location; + private int x; + private int y; + private int orbit; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public NameIdPair getLocation( ) + { + return location; + } + + + public void setLocation( NameIdPair location ) + { + this.location = location; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDisplay.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDisplay.java new file mode 100644 index 0000000..e6d94d0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleDisplay.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.TimeCombo; + + + +public class BattleDisplay + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private TimeCombo current; + private TimeCombo previous; + private TimeCombo next; + private List< TimeCombo > all = new LinkedList< TimeCombo >( ); + + + public TimeCombo getCurrent( ) + { + return current; + } + + + public void setCurrent( long current ) + { + this.current = new TimeCombo( current ); + } + + + public TimeCombo getPrevious( ) + { + return previous; + } + + + public void setPrevious( long previous ) + { + this.previous = new TimeCombo( previous ); + } + + + public TimeCombo getNext( ) + { + return next; + } + + + public void setNext( long next ) + { + this.next = new TimeCombo( next ); + } + + + public void addTime( long time ) + { + this.all.add( new TimeCombo( time ) ); + } + + + public List< TimeCombo > getAll( ) + { + return all; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEvent.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEvent.java new file mode 100644 index 0000000..6e99a05 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEvent.java @@ -0,0 +1,82 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + + + +public class BattleEvent + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private BattleEventType type; + private boolean planet; + private String name; + private Boolean hostile; + private List< BattleShipType > ships = new LinkedList< BattleShipType >( ); + + + public BattleEventType getType( ) + { + return type; + } + + + public void setType( BattleEventType type ) + { + this.type = type; + } + + + public boolean isPlanet( ) + { + return planet; + } + + + public void setPlanet( boolean planet ) + { + this.planet = planet; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public Boolean getHostile( ) + { + return hostile; + } + + + public void setHostile( Boolean attack ) + { + this.hostile = attack; + } + + + public void addShip( BattleShipType shipType ) + { + this.ships.add( shipType ); + } + + + public List< BattleShipType > getShips( ) + { + return ships; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEventType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEventType.java new file mode 100644 index 0000000..34ed24f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleEventType.java @@ -0,0 +1,13 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +public enum BattleEventType { + + RENAME , + SWITCH , + ARRIVE , + DEPART , + BUILD , + DESTROY + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryInterval.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryInterval.java new file mode 100644 index 0000000..7c15e5e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryInterval.java @@ -0,0 +1,75 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.TimeCombo; + + + +public class BattleHistoryInterval + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private TimeCombo begin; + private boolean battleBegins; + private TimeCombo end; + private boolean battleEnds; + + private final List< BattleHistoryTick > entries = new LinkedList< BattleHistoryTick >( ); + + + public TimeCombo getBegin( ) + { + return begin; + } + + + public boolean isBattleBegins( ) + { + return battleBegins; + } + + + public void setBegin( long tick , boolean battle ) + { + this.battleBegins = battle; + this.begin = new TimeCombo( tick ); + } + + + public TimeCombo getEnd( ) + { + return end; + } + + + public boolean isBattleEnds( ) + { + return battleEnds; + } + + + public void setEnd( long tick , boolean battle ) + { + this.battleEnds = battle; + this.end = new TimeCombo( tick ); + } + + + public List< BattleHistoryTick > getEntries( ) + { + return entries; + } + + + public void addEntry( BattleHistoryTick cTick ) + { + this.entries.add( cTick ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryTick.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryTick.java new file mode 100644 index 0000000..526de4f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleHistoryTick.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.TimeCombo; + + + +public class BattleHistoryTick + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final TimeCombo time; + private final List< BattleEvent > events = new LinkedList< BattleEvent >( ); + + + public BattleHistoryTick( long tick ) + { + this.time = new TimeCombo( tick ); + } + + + public void addEvent( BattleEvent event ) + { + this.events.add( event ); + } + + + public TimeCombo getTime( ) + { + return time; + } + + + public List< BattleEvent > getEvents( ) + { + return events; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleListEntry.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleListEntry.java new file mode 100644 index 0000000..aca40ad --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleListEntry.java @@ -0,0 +1,109 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.TimeCombo; + + + +public class BattleListEntry + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long id; + private NameIdPair location; + private int x; + private int y; + private int orbit; + private TimeCombo first; + private TimeCombo last; + + + public long getId( ) + { + return id; + } + + + public void setId( long id ) + { + this.id = id; + } + + + public NameIdPair getLocation( ) + { + return location; + } + + + public void setLocation( NameIdPair location ) + { + this.location = location; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public TimeCombo getFirst( ) + { + return first; + } + + + public void setFirst( long first ) + { + this.first = new TimeCombo( first ); + } + + + public TimeCombo getLast( ) + { + return last; + } + + + public void setLast( long last ) + { + this.last = new TimeCombo( last ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlanetBuildings.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlanetBuildings.java new file mode 100644 index 0000000..d416dd1 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlanetBuildings.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; + + + +public class BattlePlanetBuildings + extends BattleShipsList +{ + + private static final long serialVersionUID = 1L; + + private PlanetRelationType relation; + + + public PlanetRelationType getRelation( ) + { + return relation; + } + + + public void setRelation( PlanetRelationType relation ) + { + this.relation = relation; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlayerShips.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlayerShips.java new file mode 100644 index 0000000..af042d8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattlePlayerShips.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class BattlePlayerShips + extends BattleShipsList +{ + + private static final long serialVersionUID = 1L; + + private NameIdPair player; + + + public NameIdPair getPlayer( ) + { + return player; + } + + + public void setPlayer( NameIdPair player ) + { + this.player = player; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipType.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipType.java new file mode 100644 index 0000000..3133440 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipType.java @@ -0,0 +1,111 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; + + + +public class BattleShipType + implements Serializable , Comparable< BattleShipType > +{ + + private static final long serialVersionUID = 1L; + + private String name; + private long cAmount; + private long cPower; + private long lAmount; + private long lPower; + + + public BattleShipType( ) + { + // EMPTY + } + + + public BattleShipType( BattleShipType shipType ) + { + this.name = shipType.name; + this.cAmount = shipType.cAmount; + this.cPower = shipType.cPower; + this.lAmount = shipType.lAmount; + this.lPower = shipType.lPower; + } + + + public void add( BattleShipType shipType ) + { + this.cAmount += shipType.cAmount; + this.cPower += shipType.cPower; + this.lAmount += shipType.lAmount; + this.lPower += shipType.lPower; + } + + + @Override + public int compareTo( BattleShipType o ) + { + return this.name.compareTo( o.name ); + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public long getcAmount( ) + { + return cAmount; + } + + + public void setcAmount( long cAmount ) + { + this.cAmount = cAmount; + } + + + public long getcPower( ) + { + return cPower; + } + + + public void setcPower( long cPower ) + { + this.cPower = cPower; + } + + + public long getlAmount( ) + { + return lAmount; + } + + + public void setlAmount( long lAmount ) + { + this.lAmount = lAmount; + } + + + public long getlPower( ) + { + return lPower; + } + + + public void setlPower( long lPower ) + { + this.lPower = lPower; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsList.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsList.java new file mode 100644 index 0000000..389771b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsList.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + + + +public abstract class BattleShipsList + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + protected List< BattleShipType > ships = new LinkedList< BattleShipType >( ); + protected long cPower = 0; + protected long lPower = 0; + + + public void addShip( BattleShipType shipType ) + { + this.ships.add( shipType ); + this.cPower += shipType.getcPower( ); + this.lPower += shipType.getlPower( ); + } + + + public List< BattleShipType > getShips( ) + { + return ships; + } + + + public long getcPower( ) + { + return cPower; + } + + + public long getlPower( ) + { + return lPower; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsView.java new file mode 100644 index 0000000..d38d726 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleShipsView.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; + + + +public class BattleShipsView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final BattlePlayerShips own = new BattlePlayerShips( ); + private final BattleSideShips friendly = new BattleSideShips( false ); + private final BattleSideShips hostile = new BattleSideShips( true ); + private final BattlePlanetBuildings planet = new BattlePlanetBuildings( ); + + + public BattlePlayerShips getOwn( ) + { + return own; + } + + + public BattleSideShips getFriendly( ) + { + return friendly; + } + + + public BattleSideShips getHostile( ) + { + return hostile; + } + + + public BattlePlanetBuildings getPlanet( ) + { + return planet; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleSideShips.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleSideShips.java new file mode 100644 index 0000000..6dca7ad --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleSideShips.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + + + +public class BattleSideShips + extends BattleShipsList +{ + + private static final long serialVersionUID = 1L; + + private final boolean hostile; + private final List< BattlePlayerShips > players = new LinkedList< BattlePlayerShips >( ); + + + public BattleSideShips( boolean hostile ) + { + this.hostile = hostile; + } + + + public boolean isHostile( ) + { + return hostile; + } + + + public List< BattlePlayerShips > getPlayers( ) + { + return players; + } + + + public void addPlayer( BattlePlayerShips player ) + { + this.players.add( player ); + for ( BattleShipType pShipType : player.getShips( ) ) { + boolean found = false; + + for ( BattleShipType shipType : this.ships ) { + if ( shipType.compareTo( pShipType ) != 0 ) { + continue; + } + + shipType.add( pShipType ); + found = true; + break; + } + + if ( !found ) { + this.ships.add( new BattleShipType( pShipType ) ); + } + this.cPower += pShipType.getcPower( ); + this.lPower += pShipType.getlPower( ); + } + Collections.sort( this.ships ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleView.java new file mode 100644 index 0000000..c9fc728 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/battles/BattleView.java @@ -0,0 +1,69 @@ +package com.deepclone.lw.cmd.player.gdata.battles; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + + + +public class BattleView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private BattleDescription description; + private BattleDisplay display; + private BattleShipsView ships; + private final List< BattleHistoryInterval > history = new LinkedList< BattleHistoryInterval >( ); + + + public BattleDescription getDescription( ) + { + return description; + } + + + public void setDescription( BattleDescription description ) + { + this.description = description; + } + + + public BattleDisplay getDisplay( ) + { + return display; + } + + + public void setDisplay( BattleDisplay display ) + { + this.display = display; + } + + + public BattleShipsView getShips( ) + { + return ships; + } + + + public void setShips( BattleShipsView ships ) + { + this.ships = ships; + } + + + public void addHistoryInterval( BattleHistoryInterval entry ) + { + this.history.add( entry ); + } + + + public List< BattleHistoryInterval > getHistory( ) + { + return history; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/OverviewData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/OverviewData.java new file mode 100644 index 0000000..d82cc66 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/OverviewData.java @@ -0,0 +1,132 @@ +package com.deepclone.lw.cmd.player.gdata.empire; + + +import java.io.Serializable; + + + +public class OverviewData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long planets; + private int newMessages; + private long population; + private int avgHappiness; + private long fleetPower; + private long planetIncome; + private long planetUpkeep; + private long fleetUpkeep; + private long investment; + + + public long getPlanets( ) + { + return planets; + } + + + public void setPlanets( long planets ) + { + this.planets = planets; + } + + + public int getNewMessages( ) + { + return newMessages; + } + + + public void setNewMessages( int newMessages ) + { + this.newMessages = newMessages; + } + + + public long getPopulation( ) + { + return population; + } + + + public void setPopulation( long population ) + { + this.population = population; + } + + + public int getAvgHappiness( ) + { + return avgHappiness; + } + + + public void setAvgHappiness( int avgHappiness ) + { + this.avgHappiness = avgHappiness; + } + + + public long getFleetPower( ) + { + return fleetPower; + } + + + public void setFleetPower( long fleetPower ) + { + this.fleetPower = fleetPower; + } + + + public long getPlanetIncome( ) + { + return planetIncome; + } + + + public void setPlanetIncome( long planetIncome ) + { + this.planetIncome = planetIncome; + } + + + public long getPlanetUpkeep( ) + { + return planetUpkeep; + } + + + public void setPlanetUpkeep( long planetUpkeep ) + { + this.planetUpkeep = planetUpkeep; + } + + + public long getFleetUpkeep( ) + { + return fleetUpkeep; + } + + + public void setFleetUpkeep( long fleetUpkeep ) + { + this.fleetUpkeep = fleetUpkeep; + } + + + public long getInvestment( ) + { + return investment; + } + + + public void setInvestment( long investment ) + { + this.investment = investment; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/ResearchLineData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/ResearchLineData.java new file mode 100644 index 0000000..a48f027 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/ResearchLineData.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.cmd.player.gdata.empire; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + + + +public class ResearchLineData + implements Serializable , Comparable< ResearchLineData > +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final String name; + private final String description; + private final List< TechnologyData > implemented; + private final TechnologyData current; + + + public ResearchLineData( long id , String name , String description , List< TechnologyData > implemented , + TechnologyData current ) + { + this.id = id; + this.name = name; + this.description = description; + this.implemented = Collections.unmodifiableList( implemented ); + this.current = current; + } + + + @Override + public int compareTo( ResearchLineData other ) + { + return this.name.compareTo( other.name ); + } + + + public long getId( ) + { + return id; + } + + + public String getName( ) + { + return name; + } + + + public String getDescription( ) + { + return description; + } + + + public List< TechnologyData > getImplemented( ) + { + return implemented; + } + + + public TechnologyData getCurrent( ) + { + return current; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/TechnologyData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/TechnologyData.java new file mode 100644 index 0000000..7ea35f0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/empire/TechnologyData.java @@ -0,0 +1,70 @@ +package com.deepclone.lw.cmd.player.gdata.empire; + + +import java.io.Serializable; + + + +public class TechnologyData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String name; + private final String description; + private final Integer researched; + private final Long cost; + + + public TechnologyData( String name , String description ) + { + this.name = name; + this.description = description; + this.researched = null; + this.cost = null; + } + + + public TechnologyData( String name , String description , int researched ) + { + this.name = name; + this.description = description; + this.researched = researched; + this.cost = null; + } + + + public TechnologyData( String name , String description , int researched , long cost ) + { + this.name = name; + this.description = description; + this.researched = researched; + this.cost = cost; + } + + + public String getName( ) + { + return name; + } + + + public String getDescription( ) + { + return description; + } + + + public Integer getResearched( ) + { + return researched; + } + + + public Long getCost( ) + { + return cost; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetLocation.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetLocation.java new file mode 100644 index 0000000..464936b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetLocation.java @@ -0,0 +1,181 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.ShortBattleView; + + + +public class FleetLocation + extends NameIdPair +{ + + private static final long serialVersionUID = 1L; + + private boolean own; + private boolean attacking; + private int x; + private int y; + private int orbit; + private String tag; + private int picture; + private long population; + private long defence; + private ShortBattleView battle; + private boolean onVacation; + private final List< FleetOwner > fleetOwners = new LinkedList< FleetOwner >( ); + + + public FleetLocation( long id , String name ) + { + super( id , name ); + } + + + public boolean isOwn( ) + { + return own; + } + + + public void setOwn( boolean own ) + { + this.own = own; + } + + + public boolean isAttacking( ) + { + return attacking; + } + + + public void setAttacking( boolean attacking ) + { + this.attacking = attacking; + } + + + public int getX( ) + { + return x; + } + + + public void setX( int x ) + { + this.x = x; + } + + + public int getY( ) + { + return y; + } + + + public void setY( int y ) + { + this.y = y; + } + + + public int getOrbit( ) + { + return orbit; + } + + + public void setOrbit( int orbit ) + { + this.orbit = orbit; + } + + + public String getTag( ) + { + return tag; + } + + + public void setTag( String tag ) + { + this.tag = tag; + } + + + public int getPicture( ) + { + return picture; + } + + + public void setPicture( int picture ) + { + this.picture = picture; + } + + + public long getPopulation( ) + { + return population; + } + + + public void setPopulation( long population ) + { + this.population = population; + } + + + public long getDefence( ) + { + return defence; + } + + + public void setDefence( long defence ) + { + this.defence = defence; + } + + + public ShortBattleView getBattle( ) + { + return battle; + } + + + public void setBattle( ShortBattleView battle ) + { + this.battle = battle; + } + + + public boolean isOnVacation( ) + { + return onVacation; + } + + + public void setOnVacation( boolean onVacation ) + { + this.onVacation = onVacation; + } + + + public void addFleetOwner( FleetOwner fOwner ) + { + this.fleetOwners.add( fOwner ); + } + + + public List< FleetOwner > getFleetOwners( ) + { + return fleetOwners; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetOwner.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetOwner.java new file mode 100644 index 0000000..2653142 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetOwner.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; + + + +; + +public class FleetOwner + extends NameIdPair +{ + + private static final long serialVersionUID = 1L; + + private final PlanetRelationType relation; + private final List< StaticFleet > fleets = new LinkedList< StaticFleet >( ); + + + public FleetOwner( long id , String name , PlanetRelationType relation ) + { + super( id , name ); + this.relation = relation; + } + + + public PlanetRelationType getRelation( ) + { + return relation; + } + + + public void addFleet( StaticFleet fleet ) + { + this.fleets.add( fleet ); + } + + + public List< StaticFleet > getFleets( ) + { + return fleets; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetShips.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetShips.java new file mode 100644 index 0000000..a29a8a6 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetShips.java @@ -0,0 +1,67 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import java.io.Serializable; + + + +public class FleetShips + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int type; + private String name; + private long amount; + private long power; + + + public int getType( ) + { + return type; + } + + + public void setType( int type ) + { + this.type = type; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public long getAmount( ) + { + return amount; + } + + + public void setAmount( long amount ) + { + this.amount = amount; + } + + + public long getPower( ) + { + return power; + } + + + public void setPower( long power ) + { + this.power = power; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetStatus.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetStatus.java new file mode 100644 index 0000000..e588b40 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetStatus.java @@ -0,0 +1,11 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +public enum FleetStatus { + + AVAILABLE , + DEPLOYING , + REDEPLOYING , + REDIRECTING + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetsView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetsView.java new file mode 100644 index 0000000..dc16fe4 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/FleetsView.java @@ -0,0 +1,43 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + + + +public class FleetsView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final List< FleetLocation > locations = new LinkedList< FleetLocation >( ); + private final List< MovingFleet > moving = new LinkedList< MovingFleet >( ); + + + public void addLocation( FleetLocation location ) + { + this.locations.add( location ); + } + + + public List< FleetLocation > getLocations( ) + { + return locations; + } + + + public void addMovingFleet( MovingFleet fleet ) + { + this.moving.add( fleet ); + } + + + public List< MovingFleet > getMoving( ) + { + return moving; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/MovingFleet.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/MovingFleet.java new file mode 100644 index 0000000..e37a38f --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/MovingFleet.java @@ -0,0 +1,130 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GameTime; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class MovingFleet + extends StaticFleet +{ + + private static final long serialVersionUID = 1L; + + private long timeLeft; + private boolean attacking; + private NameIdPair source; + private NameIdPair destination; + private double currentX; + private double currentY; + private NameIdPair nearest; + + + public MovingFleet( long id , String name ) + { + super( id , name ); + } + + + public long getTimeLeft( ) + { + return timeLeft; + } + + + public GameTime getGameTimeLeft( ) + { + return new GameTime( this.timeLeft ); + } + + + public void setTimeLeft( long timeLeft ) + { + this.timeLeft = timeLeft; + } + + + public boolean isAttacking( ) + { + return attacking; + } + + + public void setAttacking( boolean attacking ) + { + this.attacking = attacking; + } + + + public NameIdPair getSource( ) + { + return source; + } + + + public void setSource( NameIdPair source ) + { + this.source = source; + } + + + public NameIdPair getDestination( ) + { + return destination; + } + + + public void setDestination( NameIdPair destination ) + { + this.destination = destination; + } + + + public double getCurrentX( ) + { + return currentX; + } + + + public void setCurrentX( double currentX ) + { + this.currentX = currentX; + } + + + public double getCurrentY( ) + { + return currentY; + } + + + public void setCurrentY( double currentY ) + { + this.currentY = currentY; + } + + + public NameIdPair getNearest( ) + { + return nearest; + } + + + public void setNearest( NameIdPair nearest ) + { + this.nearest = nearest; + } + + + public long getEta( ) + { + return this.getPenalty( ) + this.timeLeft; + } + + + public GameTime getGameEta( ) + { + return new GameTime( this.getPenalty( ) + this.timeLeft ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/ShortFleetView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/ShortFleetView.java new file mode 100644 index 0000000..a19833a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/ShortFleetView.java @@ -0,0 +1,147 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import com.deepclone.lw.cmd.player.gdata.GameTime; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class ShortFleetView + extends NameIdPair +{ + + private static final long serialVersionUID = 1L; + + private int flightTime; + private GameTime gameFlightTime; + private long power; + private FleetStatus status; + private int penalty; + private boolean attack; + private double x; + private double y; + private boolean atPlanet; + private NameIdPair nearest; + + + public ShortFleetView( long id , String name ) + { + super( id , name ); + } + + + public int getFlightTime( ) + { + return flightTime; + } + + + public GameTime getGameFlightTime( ) + { + return gameFlightTime; + } + + + public void setFlightTime( int flightTime ) + { + this.flightTime = flightTime; + this.gameFlightTime = new GameTime( flightTime ); + } + + + public long getPower( ) + { + return power; + } + + + public void setPower( long power ) + { + this.power = power; + } + + + public FleetStatus getStatus( ) + { + return status; + } + + + public void setStatus( FleetStatus status ) + { + this.status = status; + } + + + public int getPenalty( ) + { + return penalty; + } + + + public void setPenalty( int penalty ) + { + this.penalty = penalty; + } + + + public boolean isAttack( ) + { + return attack; + } + + + public void setAttack( boolean attack ) + { + this.attack = attack; + } + + + public double getX( ) + { + return x; + } + + + public void setX( double x ) + { + this.x = x; + } + + + public double getY( ) + { + return y; + } + + + public void setY( double y ) + { + this.y = y; + } + + + public boolean isAtPlanet( ) + { + return atPlanet; + } + + + public void setAtPlanet( boolean atPlanet ) + { + this.atPlanet = atPlanet; + } + + + public NameIdPair getNearest( ) + { + return nearest; + } + + + public void setNearest( NameIdPair nearest ) + { + this.nearest = nearest; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/SplitShips.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/SplitShips.java new file mode 100644 index 0000000..b464387 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/SplitShips.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +public class SplitShips + extends FleetShips +{ + + private static final long serialVersionUID = 1L; + + private int id; + private int selectedAmount = 0; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public int getSelectedAmount( ) + { + return selectedAmount; + } + + + public void setSelectedAmount( int selectedAmount ) + { + this.selectedAmount = selectedAmount; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/StaticFleet.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/StaticFleet.java new file mode 100644 index 0000000..32d9ac9 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/fleets/StaticFleet.java @@ -0,0 +1,101 @@ +package com.deepclone.lw.cmd.player.gdata.fleets; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.player.gdata.GameTime; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; + + + +public class StaticFleet + extends NameIdPair +{ + + private static final long serialVersionUID = 1L; + + private FleetStatus status; + private long penalty; + private long power; + private int flightTime; + private final List< FleetShips > ships = new LinkedList< FleetShips >( ); + + + public StaticFleet( long id , String name ) + { + super( id , name ); + } + + + public FleetStatus getStatus( ) + { + return status; + } + + + public void setStatus( FleetStatus status ) + { + this.status = status; + } + + + public long getPenalty( ) + { + return penalty; + } + + public GameTime getGamePenalty( ) + { + return new GameTime( penalty); + } + + + public void setPenalty( int penalty ) + { + this.penalty = penalty; + } + + + public long getPower( ) + { + return power; + } + + + public void setPower( long power ) + { + this.power = power; + } + + + public long getFlightTime( ) + { + return flightTime; + } + + + public GameTime getGameFlightTime( ) + { + return new GameTime( this.flightTime ); + } + + + public void setFlightTime( int flightTime ) + { + this.flightTime = flightTime; + } + + + public void addShips( FleetShips ships ) + { + this.ships.add( ships ); + } + + + public List< FleetShips > getShips( ) + { + return ships; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapPlanetData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapPlanetData.java new file mode 100644 index 0000000..8a04d19 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapPlanetData.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.cmd.player.gdata.map; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.PlanetRelationType; + + + +public class MapPlanetData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final long id; + private final int picture; + private final String name; + private final String tag; + private final PlanetRelationType relation; + + + public MapPlanetData( long id , int picture , String name , String tag , PlanetRelationType relation ) + { + this.id = id; + this.picture = picture; + this.name = name; + this.tag = tag; + this.relation = relation; + } + + + public long getId( ) + { + return id; + } + + + public int getPicture( ) + { + return picture; + } + + + public String getName( ) + { + return name; + } + + + public String getTag( ) + { + return tag; + } + + + public PlanetRelationType getRelation( ) + { + return relation; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapSystemData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapSystemData.java new file mode 100644 index 0000000..db7a54a --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/map/MapSystemData.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.cmd.player.gdata.map; + + +import java.io.Serializable; + + + +public class MapSystemData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final MapPlanetData planets[] = new MapPlanetData[ 5 ]; + + + public MapPlanetData[] getPlanets( ) + { + return this.planets; + } + + + public void setPlanet( int orbit , MapPlanetData planet ) + { + this.planets[ orbit - 1 ] = planet; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableBuildingData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableBuildingData.java new file mode 100644 index 0000000..34c5ce6 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableBuildingData.java @@ -0,0 +1,50 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +public class BuildableBuildingData + extends BuildableItemData +{ + + private static final long serialVersionUID = 1L; + + private int workers; + private String prodType; + private int output; + + + public int getWorkers( ) + { + return workers; + } + + + public void setWorkers( int workers ) + { + this.workers = workers; + } + + + public String getProdType( ) + { + return prodType; + } + + + public void setProdType( String prodType ) + { + this.prodType = prodType; + } + + + public int getOutput( ) + { + return output; + } + + + public void setOutput( int output ) + { + this.output = output; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableItemData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableItemData.java new file mode 100644 index 0000000..5ae878e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableItemData.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.GameTime; + + + +public abstract class BuildableItemData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int id; + private String name; + private String description; + private int cost; + private int upkeep; + private Long time; + private GameTime gameTime; + + + public int getId( ) + { + return id; + } + + + public void setId( int id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public int getCost( ) + { + return cost; + } + + + public void setCost( int cost ) + { + this.cost = cost; + } + + + public int getUpkeep( ) + { + return upkeep; + } + + + public void setUpkeep( int upkeep ) + { + this.upkeep = upkeep; + } + + + public Long getTime( ) + { + return time; + } + + + public void setTime( Long time ) + { + this.time = time; + if ( time == null ) { + this.gameTime = null; + } else { + this.gameTime = new GameTime( time ); + } + } + + + public GameTime getGameTime( ) + { + return gameTime; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableShipData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableShipData.java new file mode 100644 index 0000000..99c6d5b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildableShipData.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + +import com.deepclone.lw.cmd.player.gdata.GameTime; + + +public class BuildableShipData + extends BuildableItemData +{ + + private static final long serialVersionUID = 1L; + + private int power; + private int flightTime; + private GameTime gameFlightTime; + + + public int getPower( ) + { + return power; + } + + + public void setPower( int power ) + { + this.power = power; + } + + + public int getFlightTime( ) + { + return flightTime; + } + + + public GameTime getGameFlightTime( ) + { + return gameFlightTime; + } + + + public void setFlightTime( int flightTime ) + { + this.flightTime = flightTime; + this.gameFlightTime = new GameTime( flightTime ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildingData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildingData.java new file mode 100644 index 0000000..7647c24 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/BuildingData.java @@ -0,0 +1,119 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; + + + +public class BuildingData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private Integer id; + private String name; + private String description; + private int amount; + private String produces; + private Long output; + private Integer jobs; + private Long upkeep; + + + public Integer getId( ) + { + return id; + } + + + public void setId( Integer id ) + { + this.id = id; + } + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + + + public String getProduces( ) + { + return produces; + } + + + public void setProduces( String produces ) + { + this.produces = produces; + } + + + public Long getOutput( ) + { + return output; + } + + + public void setOutput( Long output ) + { + this.output = output; + } + + + public Integer getJobs( ) + { + return jobs; + } + + + public void setJobs( Integer jobs ) + { + this.jobs = jobs; + } + + + public Long getUpkeep( ) + { + return upkeep; + } + + + public void setUpkeep( Long upkeep ) + { + this.upkeep = upkeep; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/OwnPlanetStatusData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/OwnPlanetStatusData.java new file mode 100644 index 0000000..6013826 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/OwnPlanetStatusData.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.GameTime; + + + +public class OwnPlanetStatusData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private boolean abandonPossible; + private boolean renamePossible; + private Integer abandonTime; + private GameTime abandonGameTime; + + + public boolean isAbandonPossible( ) + { + return abandonPossible; + } + + + public void setAbandonPossible( boolean abandonPossible ) + { + this.abandonPossible = abandonPossible; + } + + + public boolean isRenamePossible( ) + { + return renamePossible; + } + + + public void setRenamePossible( boolean renamePossible ) + { + this.renamePossible = renamePossible; + } + + + public Integer getAbandonTime( ) + { + return abandonTime; + } + + + public void setAbandonTime( Integer abandonTime ) + { + this.abandonTime = abandonTime; + if ( abandonTime == null ) { + this.abandonGameTime = null; + } else { + this.abandonGameTime = new GameTime( abandonTime.longValue( ) ); + } + } + + + public GameTime getAbandonGameTime( ) + { + return abandonGameTime; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetBasicView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetBasicView.java new file mode 100644 index 0000000..31de86e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetBasicView.java @@ -0,0 +1,79 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; + + + +public class PlanetBasicView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final String name; + private final int picture; + private final String alliance; + private final int x; + private final int y; + private final int orbit; + + + public PlanetBasicView( String name , int picture , String alliance , int x , int y , int orbit ) + { + this.name = name; + this.picture = picture; + this.alliance = alliance; + this.x = x; + this.y = y; + this.orbit = orbit; + } + + + public PlanetBasicView( PlanetBasicView source , String newName ) + { + this.name = newName; + this.picture = source.picture; + this.alliance = source.alliance; + this.x = source.x; + this.y = source.y; + this.orbit = source.orbit; + } + + + public String getName( ) + { + return name; + } + + + public int getPicture( ) + { + return picture; + } + + + public String getAlliance( ) + { + return alliance; + } + + + public int getX( ) + { + return x; + } + + + public int getY( ) + { + return y; + } + + + public int getOrbit( ) + { + return orbit; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOrbitalView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOrbitalView.java new file mode 100644 index 0000000..5992b9c --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOrbitalView.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; +import java.util.List; + + + +public class PlanetOrbitalView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private long population; + private long defencePoints; + private long ownFleet; + private long friendlyFleet; + private long hostileFleet; + private Long battle; + private List< BuildingData > buildings; + + + public long getPopulation( ) + { + return population; + } + + + public void setPopulation( long population ) + { + this.population = population; + } + + + public long getDefencePoints( ) + { + return defencePoints; + } + + + public void setDefencePoints( long defencePoints ) + { + this.defencePoints = defencePoints; + } + + + public long getOwnFleet( ) + { + return ownFleet; + } + + + public void setOwnFleet( long ownFleet ) + { + this.ownFleet = ownFleet; + } + + + public long getFriendlyFleet( ) + { + return friendlyFleet; + } + + + public void setFriendlyFleet( long friendlyFleet ) + { + this.friendlyFleet = friendlyFleet; + } + + + public long getHostileFleet( ) + { + return hostileFleet; + } + + + public void setHostileFleet( long hostileFleet ) + { + this.hostileFleet = hostileFleet; + } + + + public Long getBattle( ) + { + return battle; + } + + + public void setBattle( Long battle ) + { + this.battle = battle; + } + + + public List< BuildingData > getBuildings( ) + { + return buildings; + } + + + public void setBuildings( List< BuildingData > buildings ) + { + this.buildings = buildings; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOwnView.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOwnView.java new file mode 100644 index 0000000..a567a8e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/PlanetOwnView.java @@ -0,0 +1,133 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; +import java.util.List; + + + +public class PlanetOwnView + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private int happiness; + private int hChange; + private long income; + private long upkeep; + private OwnPlanetStatusData status; + private QueueData civQueue; + private QueueData milQueue; + private List< BuildableShipData > bShips; + private List< BuildableBuildingData > bBuildings; + + + public int getHappiness( ) + { + return happiness; + } + + + public void setHappiness( int happiness ) + { + this.happiness = happiness; + } + + + public int gethChange( ) + { + return hChange; + } + + + public void sethChange( int hChange ) + { + this.hChange = hChange; + } + + + public long getIncome( ) + { + return income; + } + + + public void setIncome( long income ) + { + this.income = income; + } + + + public long getUpkeep( ) + { + return upkeep; + } + + + public void setUpkeep( long upkeep ) + { + this.upkeep = upkeep; + } + + + public OwnPlanetStatusData getStatus( ) + { + return status; + } + + + public void setStatus( OwnPlanetStatusData status ) + { + this.status = status; + } + + + public QueueData getCivQueue( ) + { + return civQueue; + } + + + public void setCivQueue( QueueData civQueue ) + { + this.civQueue = civQueue; + } + + + public QueueData getMilQueue( ) + { + return milQueue; + } + + + public void setMilQueue( QueueData milQueue ) + { + this.milQueue = milQueue; + } + + + public List< BuildableShipData > getbShips( ) + { + return bShips; + } + + + public void setbShips( List< BuildableShipData > bShips ) + { + this.bShips = bShips; + } + + + public List< BuildableBuildingData > getbBuildings( ) + { + return bBuildings; + } + + + public void setbBuildings( List< BuildableBuildingData > bBuildings ) + { + this.bBuildings = bBuildings; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueData.java new file mode 100644 index 0000000..8aad730 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueData.java @@ -0,0 +1,38 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + + + +public class QueueData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private final boolean appendPossible; + private final List< QueueItemData > items; + + + public QueueData( boolean appendPossible , List< QueueItemData > items ) + { + this.appendPossible = appendPossible; + this.items = Collections.unmodifiableList( items ); + } + + + public boolean isAppendPossible( ) + { + return appendPossible; + } + + + public List< QueueItemData > getItems( ) + { + return items; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueItemData.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueItemData.java new file mode 100644 index 0000000..a1000df --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/gdata/planets/QueueItemData.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.cmd.player.gdata.planets; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.player.gdata.GameTime; + + + +public class QueueItemData + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String name; + private String description; + private int amount; + private boolean destroy; + private long invested; + private Long timeLeft; + private GameTime gameTimeLeft; + + + public String getName( ) + { + return name; + } + + + public void setName( String name ) + { + this.name = name; + } + + + public String getDescription( ) + { + return description; + } + + + public void setDescription( String description ) + { + this.description = description; + } + + + public int getAmount( ) + { + return amount; + } + + + public void setAmount( int amount ) + { + this.amount = amount; + } + + + public boolean isDestroy( ) + { + return destroy; + } + + + public void setDestroy( boolean destroy ) + { + this.destroy = destroy; + } + + + public long getInvested( ) + { + return invested; + } + + + public void setInvested( long invested ) + { + this.invested = invested; + } + + + public Long getTimeLeft( ) + { + return timeLeft; + } + + + public void setTimeLeft( Long timeLeft ) + { + this.timeLeft = timeLeft; + if ( timeLeft == null ) { + this.gameTimeLeft = null; + } else { + this.gameTimeLeft = new GameTime( timeLeft ); + } + } + + + public GameTime getGameTimeLeft( ) + { + return gameTimeLeft; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageCommand.java new file mode 100644 index 0000000..8d7a441 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageCommand.java @@ -0,0 +1,97 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.session.Command; + + + +public class ComposeMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final Boolean inbox; + private final Long replyTo; + + private MessageType type; + private String target; + private String subject; + private String contents; + + + public ComposeMessageCommand( ) + { + this.inbox = null; + this.replyTo = null; + } + + + public ComposeMessageCommand( boolean inbox , long replyTo ) + { + this.inbox = inbox; + this.replyTo = replyTo; + } + + + public MessageType getType( ) + { + return type; + } + + + public void setType( MessageType type ) + { + this.type = type; + } + + + public String getTarget( ) + { + return target; + } + + + public void setTarget( String target ) + { + this.target = target; + } + + + public String getSubject( ) + { + return subject; + } + + + public void setSubject( String subject ) + { + this.subject = subject; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public Long getReplyTo( ) + { + return replyTo; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageResponse.java new file mode 100644 index 0000000..45b95c0 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ComposeMessageResponse.java @@ -0,0 +1,160 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class ComposeMessageResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private MessageType messageType; + private String target; + private String title; + private String contents; + + private final Boolean inbox; + private final Message replyTo; + + private boolean targetError = false; + private boolean timingError = false; + private boolean titleError = false; + private boolean contentsError = false; + + + public ComposeMessageResponse( GamePageData page ) + { + super( page ); + this.inbox = null; + this.replyTo = null; + } + + + public ComposeMessageResponse( GamePageData page , boolean inbox , Message replyTo ) + { + super( page ); + this.inbox = inbox; + this.replyTo = replyTo; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public Message getReplyTo( ) + { + return replyTo; + } + + + public MessageType getMessageType( ) + { + return messageType; + } + + + public void setMessageType( MessageType messageType ) + { + this.messageType = messageType; + } + + + public String getTarget( ) + { + return target; + } + + + public void setTarget( String target ) + { + this.target = target; + } + + + public String getTitle( ) + { + return title; + } + + + public void setTitle( String title ) + { + this.title = title; + } + + + public String getContents( ) + { + return contents; + } + + + public void setContents( String contents ) + { + this.contents = contents; + } + + + public boolean isTargetError( ) + { + return targetError; + } + + + public void setTargetError( boolean targetError ) + { + this.targetError = targetError; + } + + + public boolean isTimingError( ) + { + return timingError; + } + + + public void setTimingError( boolean timingError ) + { + this.timingError = timingError; + } + + + public boolean isTitleError( ) + { + return titleError; + } + + + public void setTitleError( boolean titleError ) + { + this.titleError = titleError; + } + + + public boolean isContentsError( ) + { + return contentsError; + } + + + public void setContentsError( boolean contentsError ) + { + this.contentsError = contentsError; + } + + + public boolean isError( ) + { + return ( this.titleError || this.contentsError || this.targetError || this.timingError ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesCommand.java new file mode 100644 index 0000000..92d24ef --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesCommand.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.session.Command; + + + +public class GetMessagesCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + + + public GetMessagesCommand( boolean inbox ) + { + this.inbox = inbox; + } + + + public boolean isInbox( ) + { + return inbox; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesResponse.java new file mode 100644 index 0000000..09025bc --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/GetMessagesResponse.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import java.util.List; + +import com.deepclone.lw.cmd.msgdata.MessageListEntry; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class GetMessagesResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final List< MessageListEntry > messages; + + + public GetMessagesResponse( GamePageData page , List< MessageListEntry > messages ) + { + super( page ); + this.messages = messages; + } + + + public List< MessageListEntry > getMessages( ) + { + return messages; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsCommand.java new file mode 100644 index 0000000..9809a62 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsCommand.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.session.Command; + + + +public class ListTargetsCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsResponse.java new file mode 100644 index 0000000..28aa092 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ListTargetsResponse.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import java.util.List; + +import com.deepclone.lw.cmd.admin.adata.AdministratorBasics; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.NameIdPair; +import com.deepclone.lw.cmd.player.gdata.alliance.PublicAllianceInformation; + + + +public class ListTargetsResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final List< NameIdPair > empires; + private final List< PublicAllianceInformation > alliances; + private final List< AdministratorBasics > admins; + + + public ListTargetsResponse( GamePageData page , List< NameIdPair > empires , + List< PublicAllianceInformation > alliances , List< AdministratorBasics > admins ) + { + super( page ); + this.empires = empires; + this.alliances = alliances; + this.admins = admins; + } + + + public List< NameIdPair > getEmpires( ) + { + return empires; + } + + + public List< PublicAllianceInformation > getAlliances( ) + { + return alliances; + } + + + public List< AdministratorBasics > getAdmins( ) + { + return admins; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxAction.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxAction.java new file mode 100644 index 0000000..cb6b467 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxAction.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.cmd.player.msgs; + + +public enum MessageBoxAction { + + DELETE , + MARK_READ , + MARK_UNREAD + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxCommand.java new file mode 100644 index 0000000..757cd99 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/MessageBoxCommand.java @@ -0,0 +1,52 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.session.Command; + + + +public class MessageBoxCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final MessageBoxAction action; + private final boolean inbox; + private final long[] selection; + + + public MessageBoxCommand( boolean inbox , long[] selection ) + { + this.action = MessageBoxAction.DELETE; + this.inbox = inbox; + this.selection = selection; + } + + + public MessageBoxCommand( long[] selection , boolean read ) + { + this.action = read ? MessageBoxAction.MARK_READ : MessageBoxAction.MARK_UNREAD; + this.inbox = true; + this.selection = selection; + } + + + public MessageBoxAction getAction( ) + { + return action; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public long[] getSelection( ) + { + return selection; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/PrepareMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/PrepareMessageCommand.java new file mode 100644 index 0000000..3abe09e --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/PrepareMessageCommand.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.session.Command; + + + +public class PrepareMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final MessageType type; + private final Long id; + private final Boolean inbox; + + + private PrepareMessageCommand( MessageType type , Long id ) + { + this.type = type; + this.id = id; + this.inbox = null; + } + + + public PrepareMessageCommand( long id , boolean inbox ) + { + this.type = MessageType.INTERNAL; + this.id = id; + this.inbox = inbox; + } + + + public MessageType getType( ) + { + return type; + } + + + public Long getId( ) + { + return id; + } + + + public Boolean getInbox( ) + { + return inbox; + } + + + public static PrepareMessageCommand newMessage( ) + { + return new PrepareMessageCommand( null , null ); + } + + + public static PrepareMessageCommand newMessageTo( MessageType type , int id ) + { + if ( type == MessageType.INTERNAL ) { + throw new IllegalArgumentException( ); + } + return new PrepareMessageCommand( type , (long) id ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageCommand.java new file mode 100644 index 0000000..1656175 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageCommand.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.session.Command; + + + +public class ReadMessageCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private final long id; + + + public ReadMessageCommand( boolean inbox , long id ) + { + this.inbox = inbox; + this.id = id; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public long getId( ) + { + return id; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageResponse.java new file mode 100644 index 0000000..436de68 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/msgs/ReadMessageResponse.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.cmd.player.msgs; + + +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class ReadMessageResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private final Message message; + + + public ReadMessageResponse( GamePageData page , boolean inbox ) + { + super( page ); + this.inbox = inbox; + this.message = null; + } + + + public ReadMessageResponse( GamePageData page , boolean inbox , Message message ) + { + super( page ); + this.inbox = inbox; + this.message = message; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public Message getMessage( ) + { + return message; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/AbandonPlanetCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/AbandonPlanetCommand.java new file mode 100644 index 0000000..34711e2 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/AbandonPlanetCommand.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cmd.player.planets; + + +public class AbandonPlanetCommand + extends ViewPlanetCommand +{ + private static final long serialVersionUID = 1L; + + private final boolean cancel; + + + public AbandonPlanetCommand( int id , boolean cancel ) + { + super( id ); + this.cancel = cancel; + } + + + public boolean isCancel( ) + { + return cancel; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildShipsCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildShipsCommand.java new file mode 100644 index 0000000..62d8521 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildShipsCommand.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.player.planets; + + +public class BuildShipsCommand + extends ViewPlanetCommand +{ + + private static final long serialVersionUID = 1L; + + private final int sType; + private final int amount; + + + public BuildShipsCommand( int id , int sType , int amount ) + { + super( id ); + this.sType = sType; + this.amount = amount; + } + + + public int getsType( ) + { + return sType; + } + + + public int getAmount( ) + { + return amount; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionCommand.java new file mode 100644 index 0000000..4d7ec2b --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionCommand.java @@ -0,0 +1,41 @@ +package com.deepclone.lw.cmd.player.planets; + + +public class BuildingActionCommand + extends ViewPlanetCommand +{ + + private static final long serialVersionUID = 1L; + + private final int bType; + private final int amount; + private final boolean destroy; + + + public BuildingActionCommand( int id , int bType , int amount , boolean destroy ) + { + super( id ); + this.bType = bType; + this.amount = amount; + this.destroy = destroy; + } + + + public int getbType( ) + { + return bType; + } + + + public int getAmount( ) + { + return amount; + } + + + public boolean isDestroy( ) + { + return destroy; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionResponse.java new file mode 100644 index 0000000..86a4daf --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/BuildingActionResponse.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.cmd.player.planets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetBasicView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOrbitalView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOwnView; + + + +public class BuildingActionResponse + extends ViewPlanetResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean destructionFailed; + + + public BuildingActionResponse( int id , GamePageData page , PlanetBasicView basic , PlanetOrbitalView orbital , + PlanetOwnView own ) + { + super( id , page , basic , orbital , own ); + this.destructionFailed = true; + } + + + public boolean isDestructionFailed( ) + { + return destructionFailed; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/FlushQueueCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/FlushQueueCommand.java new file mode 100644 index 0000000..d2e1b08 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/FlushQueueCommand.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cmd.player.planets; + + +public class FlushQueueCommand + extends ViewPlanetCommand +{ + private static final long serialVersionUID = 1L; + + private final boolean military; + + + public FlushQueueCommand( int id , boolean military ) + { + super( id ); + this.military = military; + } + + + public boolean isMilitary( ) + { + return military; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetCommand.java new file mode 100644 index 0000000..09a586d --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetCommand.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.cmd.player.planets; + + +public class RenamePlanetCommand + extends ViewPlanetCommand +{ + + private static final long serialVersionUID = 1L; + + private final String name; + + + public RenamePlanetCommand( int id , String name ) + { + super( id ); + this.name = name; + } + + + public String getName( ) + { + return name; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetResponse.java new file mode 100644 index 0000000..9073eb6 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/RenamePlanetResponse.java @@ -0,0 +1,40 @@ +package com.deepclone.lw.cmd.player.planets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetBasicView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOrbitalView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOwnView; + + + +public class RenamePlanetResponse + extends ViewPlanetResponse +{ + + private static final long serialVersionUID = 1L; + + private final String renamingTo; + private final String renameError; + + + public RenamePlanetResponse( int id , GamePageData page , PlanetBasicView basic , PlanetOrbitalView orbital , + PlanetOwnView own , String failName , String error ) + { + super( id , page , basic , orbital , own ); + this.renamingTo = failName; + this.renameError = error; + } + + + public String getRenamingTo( ) + { + return renamingTo; + } + + + public String getRenameError( ) + { + return renameError; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetCommand.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetCommand.java new file mode 100644 index 0000000..b3d1137 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetCommand.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.cmd.player.planets; + + +import com.deepclone.lw.session.Command; + + + +public class ViewPlanetCommand + extends Command +{ + + private static final long serialVersionUID = 1L; + + private final int id; + + + public ViewPlanetCommand( int id ) + { + this.id = id; + } + + + public int getId( ) + { + return this.id; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetResponse.java new file mode 100644 index 0000000..6761652 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/cmd/player/planets/ViewPlanetResponse.java @@ -0,0 +1,87 @@ +package com.deepclone.lw.cmd.player.planets; + + +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetBasicView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOrbitalView; +import com.deepclone.lw.cmd.player.gdata.planets.PlanetOwnView; + + + +public class ViewPlanetResponse + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final Integer id; + private final boolean ownershipError; + private final PlanetBasicView basic; + private final PlanetOrbitalView orbit; + private final PlanetOwnView own; + + + public ViewPlanetResponse( GamePageData page ) + { + super( page ); + this.id = null; + this.ownershipError = true; + this.basic = null; + this.orbit = null; + this.own = null; + } + + + public ViewPlanetResponse( int id , GamePageData page , PlanetBasicView basic , PlanetOrbitalView orbital , + PlanetOwnView own ) + { + super( page ); + this.id = id; + this.ownershipError = false; + this.basic = basic; + this.orbit = orbital; + this.own = own; + } + + + public ViewPlanetResponse( int id , GamePageData page , PlanetBasicView basic , PlanetOrbitalView orbital ) + { + super( page ); + this.id = id; + this.ownershipError = true; + this.basic = basic; + this.orbit = orbital; + this.own = null; + } + + + public Integer getId( ) + { + return id; + } + + + public boolean isOwnershipError( ) + { + return ownershipError; + } + + + public PlanetBasicView getBasic( ) + { + return basic; + } + + + public PlanetOrbitalView getOrbit( ) + { + return orbit; + } + + + public PlanetOwnView getOwn( ) + { + return own; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/Command.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/Command.java new file mode 100644 index 0000000..5733eae --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/Command.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.session; + + +import java.io.Serializable; + + + +public abstract class Command + implements Serializable +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/CommandResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/CommandResponse.java new file mode 100644 index 0000000..bef3cd8 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/CommandResponse.java @@ -0,0 +1,14 @@ +package com.deepclone.lw.session; + + +import java.io.Serializable; + + + +public abstract class CommandResponse + implements Serializable +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/NullResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/NullResponse.java new file mode 100644 index 0000000..a7f44ab --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/NullResponse.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.session; + + +public final class NullResponse + extends CommandResponse +{ + + private static final long serialVersionUID = 1L; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionAccessor.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionAccessor.java new file mode 100644 index 0000000..1d3b734 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionAccessor.java @@ -0,0 +1,25 @@ +package com.deepclone.lw.session; + +import java.net.InetAddress; + + +public interface SessionAccessor +{ + + SessionReference create( String type , String client , InetAddress ip ) + throws SessionInternalException; + + + SessionReference authenticate( String session , String identifier , String sha1Hash , String md5Hash ) + throws SessionIdentifierException , SessionStateException , SessionInternalException; + + + SessionResponse executeCommand( String session , Command command ) + throws SessionIdentifierException , SessionStateException , SessionCommandException , + SessionInternalException; + + + void terminate( String session ) + throws SessionIdentifierException , SessionInternalException; + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionCommandException.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionCommandException.java new file mode 100644 index 0000000..bc53083 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionCommandException.java @@ -0,0 +1,15 @@ +package com.deepclone.lw.session; + + +public class SessionCommandException + extends SessionException +{ + + private static final long serialVersionUID = 1L; + + + public SessionCommandException( String message ) + { + super( true , message ); + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionException.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionException.java new file mode 100644 index 0000000..8490fb9 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionException.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.session; + + +public abstract class SessionException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + private boolean keepSession; + + + public SessionException( boolean keep ) + { + this.keepSession = keep; + } + + + public SessionException( boolean keep , String message ) + { + super( message ); + this.keepSession = keep; + } + + + public SessionException( boolean keep , Throwable cause ) + { + super( cause ); + this.keepSession = keep; + } + + + public SessionException( boolean keep , String message , Throwable cause ) + { + super( message , cause ); + this.keepSession = keep; + } + + + public final boolean isSessionKept( ) + { + return this.keepSession; + } +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionIdentifierException.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionIdentifierException.java new file mode 100644 index 0000000..4273f76 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionIdentifierException.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.session; + + +/** + * Thrown when a session identifier does not exist on the server. + * + * @author tseeker + */ +public final class SessionIdentifierException + extends SessionException +{ + + private static final long serialVersionUID = 1L; + + + public SessionIdentifierException( String identifier ) + { + super( false , identifier ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionInternalException.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionInternalException.java new file mode 100644 index 0000000..42474ee --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionInternalException.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.session; + + +/** + * Thrown when a runtime error occurs while handling a session-related request. + * + * @author tseeker + */ +public final class SessionInternalException + extends SessionException +{ + + private static final long serialVersionUID = 1L; + + + public SessionInternalException( boolean keep , Throwable cause ) + { + super( keep , cause.getClass( ).getName( ) + " (" + cause.getMessage( ) + ")" ); + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionReference.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionReference.java new file mode 100644 index 0000000..4e7fb70 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionReference.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.session; + + +import java.io.Serializable; + + + +/** + * Session reference. + * + *

+ * Session references are send from the server to the client for all session-related actions. They + * contain information about the session itself (identifier and type of session) and about its state + * (authentication and sub-type). + * + * @author tseeker + */ +public final class SessionReference + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + /** String identifier of the session */ + public final String identifier; + + /** Type of the session */ + public final String type; + + /** Whether the session has been authenticated or not */ + public final boolean authenticated; + + /** + * Extra state information. + * + *

+ * If the session needs authentication, this field contains a challenge to use when + * authenticating. If the session has been authenticated, it contains the session's sub-type. + */ + public final String extra; + + + public SessionReference( String identifier , String type , boolean authenticated , String extra ) + { + this.identifier = identifier; + this.type = type; + this.authenticated = authenticated; + this.extra = extra; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionResponse.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionResponse.java new file mode 100644 index 0000000..6071671 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionResponse.java @@ -0,0 +1,39 @@ +package com.deepclone.lw.session; + + +import java.io.Serializable; + + + +/** + * Response to a session command. + * + * @author tseeker + */ +public class SessionResponse + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + /** Updated session reference */ + public final SessionReference session; + + /** Response data, if any */ + public final CommandResponse data; + + + public SessionResponse( SessionReference session ) + { + this.session = session; + this.data = null; + } + + + public SessionResponse( SessionReference session , CommandResponse data ) + { + this.session = session; + this.data = data; + } + +} diff --git a/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionStateException.java b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionStateException.java new file mode 100644 index 0000000..eaa69e5 --- /dev/null +++ b/legacyworlds-session/src/main/java/com/deepclone/lw/session/SessionStateException.java @@ -0,0 +1,20 @@ +package com.deepclone.lw.session; + + +/** + * Thrown when an authentication request is issued to an authenticated session or vice-versa. + * + * @author tseeker + */ +public final class SessionStateException + extends SessionException +{ + + private static final long serialVersionUID = 1L; + + + public SessionStateException( ) + { + super( true ); + } +} diff --git a/legacyworlds-utils/.classpath b/legacyworlds-utils/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-utils/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-utils/.project b/legacyworlds-utils/.project new file mode 100644 index 0000000..fd839fa --- /dev/null +++ b/legacyworlds-utils/.project @@ -0,0 +1,23 @@ + + + legacyworlds-utils + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-utils/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-utils/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..878d24f --- /dev/null +++ b/legacyworlds-utils/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Mon Apr 19 12:23:34 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-utils/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-utils/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..762f9e9 --- /dev/null +++ b/legacyworlds-utils/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Mon Apr 19 12:23:33 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-utils/pom.xml b/legacyworlds-utils/pom.xml new file mode 100644 index 0000000..195d0d6 --- /dev/null +++ b/legacyworlds-utils/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + legacyworlds + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-utils + 5.99.1 + Legacy Worlds common utilities + The classes in this package are used by all parts of the Legacy Worlds code. + + + + commons-codec + commons-codec + ${commons.codec.version} + jar + + + \ No newline at end of file diff --git a/legacyworlds-utils/src/main/java/com/deepclone/lw/utils/DigestHelper.java b/legacyworlds-utils/src/main/java/com/deepclone/lw/utils/DigestHelper.java new file mode 100644 index 0000000..17471b5 --- /dev/null +++ b/legacyworlds-utils/src/main/java/com/deepclone/lw/utils/DigestHelper.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.utils; + + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.binary.Hex; + + + +/** + * This class provides a static method which simplies computing hex-encoded digests of strings using + * some hashing algorithm. + * + * @author tseeker + */ +public final class DigestHelper +{ + + private DigestHelper( ) + { + // EMPTY + } + + + /** + * This method computes a hex-encoded digest of a string using the specified algorithm. + * + * @param algo + * the digest algorithm to use + * @param source + * the string to digest + * @return the hex-encoded digest + */ + public static String digest( String algo , String source ) + { + // Create digest + MessageDigest digestAlgorithm; + try { + digestAlgorithm = MessageDigest.getInstance( algo ); + } catch ( NoSuchAlgorithmException e ) { + throw new RuntimeException( "'" + algo + "' digest not supported" ); + } + // Add data + try { + digestAlgorithm.update( source.getBytes( "UTF-8" ) ); + } catch ( UnsupportedEncodingException e ) { + throw new RuntimeException( "UTF-8 not supported? I must be dreaming." ); + } + // Compute digest and return its hexadecimal encoding + byte[] digest = digestAlgorithm.digest( ); + return Hex.encodeHexString( digest ); + } + +} diff --git a/legacyworlds-web/.project b/legacyworlds-web/.project new file mode 100644 index 0000000..b64463a --- /dev/null +++ b/legacyworlds-web/.project @@ -0,0 +1,17 @@ + + + legacyworlds-web + + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-web/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-web/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..32dc0c3 --- /dev/null +++ b/legacyworlds-web/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Apr 15 18:51:39 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-web/legacyworlds-web-admin/.classpath b/legacyworlds-web/legacyworlds-web-admin/.classpath new file mode 100644 index 0000000..3d4e21c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.classpath @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/.project b/legacyworlds-web/legacyworlds-web-admin/.project new file mode 100644 index 0000000..073b138 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.project @@ -0,0 +1,37 @@ + + + legacyworlds-web-admin + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/.jsdtscope b/legacyworlds-web/legacyworlds-web-admin/.settings/.jsdtscope new file mode 100644 index 0000000..bbb8e68 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/.jsdtscope @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..4e54f2c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Thu Apr 15 19:33:04 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.component b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..45b17b5 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.component @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.project.facet.core.xml b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..9680654 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.ws.service.policy.prefs b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.ws.service.policy.prefs new file mode 100644 index 0000000..5095f8b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.eclipse.wst.ws.service.policy.prefs @@ -0,0 +1,3 @@ +#Mon Apr 19 12:39:12 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.wst.ws.service.policy.projectEnabled=false diff --git a/legacyworlds-web/legacyworlds-web-admin/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-web/legacyworlds-web-admin/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..bb79aef --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Apr 15 19:11:01 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/META-INF/MANIFEST.MF b/legacyworlds-web/legacyworlds-web-admin/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/admin-servlet.xml b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/admin-servlet.xml new file mode 100644 index 0000000..0391a5a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/admin-servlet.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/ROOT.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/ROOT.ftl new file mode 100644 index 0000000..7bb596f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/ROOT.ftl @@ -0,0 +1,11 @@ +<#setting url_escaping_charset='UTF-8'> +<#setting number_format='computer'> +<#include "/version.ftl"> +<#include "/layout/columns.ftl"> +<#include "/layout/datatable.ftl"> +<#include "/layout/fields.ftl"> +<#include "/layout/form.ftl"> +<#include "/layout/lists.ftl"> +<#include "/layout/tabs.ftl"> +<#include "containers/${container}.ftl" /> +<#include "types/${type}.ftl" /> diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/external.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/external.ftl new file mode 100644 index 0000000..8bf39b8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/external.ftl @@ -0,0 +1,20 @@ +<#macro page title> + + + + + LW Beta 6 <@version/> Administration - ${title?xhtml} + + + +

+
+ <#nested> +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/internal.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/internal.ftl new file mode 100644 index 0000000..3f00a0d --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/containers/internal.ftl @@ -0,0 +1,72 @@ +<#macro page title> + + + + + LW Beta 6 <@version/> Administration - ${title?xhtml} + + + + + +
+ +
+ <#nested> +
+
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/columns.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/columns.ftl new file mode 100644 index 0000000..6d79301 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/columns.ftl @@ -0,0 +1,18 @@ +<#macro left_column width=0> + <#if width gt 0> +
+ <#else> +
+ + <#nested> +
+ +<#macro right_column width=0> + <#if width gt 0> +
+ <#else> +
+ + <#nested> +
+ diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/datatable.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/datatable.ftl new file mode 100644 index 0000000..e02f8e8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/datatable.ftl @@ -0,0 +1,20 @@ +<#macro dt_main title=""> + + <#if title != ""> + + + <#nested> +
${title}
+ +<#macro dt_entry title abbr="" width=0> + + style="width: ${width}px"><#if title == ""> <#else><#if abbr != "">${abbr?xhtml}<#else>${title?xhtml}: + <#nested> + + +<#macro dt_blank> +   + +<#macro dt_status> + <#nested> + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/fields.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/fields.ftl new file mode 100644 index 0000000..63dcdcd --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/fields.ftl @@ -0,0 +1,20 @@ +<#macro ff_text name value id="" maxLength=0 size=0> + maxlength="${maxLength?string}" <#if size gt 0>size="${size?string}" /> + +<#macro ff_pwd id name> + + +<#macro ff_select id name style=""> + + +<#macro ff_checkbox id name value checked=false> + checked="checked" /> + +<#macro form_option text="" selected=false value=""> + value="${value?xhtml}"<#if selected> selected="selected"><#if text == ""><#nested><#else>${text?xhtml} + +<#macro ff_submit label extraClass="" name="" style=""> + name="${name?xhtml}" type="submit" value="${label?xhtml}" <#if style != "">style="${style}" /> + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/form.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/form.ftl new file mode 100644 index 0000000..c39631c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/form.ftl @@ -0,0 +1,98 @@ +<#macro form action hash=""> +
+
#${hash?url}" method="post"> + + <#nested> +
+
+
+ +<#macro form_field_line label id> + + + <#nested> + + +<#macro form_text label name value id="" maxLength=0 multiline=false> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <#if multiline> + + <#else> + <@ff_text id=id name=name maxLength=maxLenth value=value /> + + + +<#macro form_checkbox label name value id="" checked=false> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_checkbox id=id name=name value=value checked=checked /> + + +<#macro form_pwd label name id=""> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_pwd id=id name=name /> + + +<#macro form_select label name id=""> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_select id=id name=name> + <#nested> + + + +<#macro form_part title> + + ${title} + + +<#macro form_extra> + + <#nested> + + +<#macro form_error> + + <#nested> + + +<#macro standalone_error> +
+ + + + +
<#nested>
+
+ +<#macro form_submit label extraClass=""> + +   + <@ff_submit label=label extraClass=extraClass /> + + +<#macro form_extended_submit label extraClass=""> + +   + <@ff_submit label=label extraClass=extraClass /><#nested /> + + +<#macro lineform action name="" hash=""> +
+
#${hash?url}" method="post"> + + +
<#nested>
+
+
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/lists.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/lists.ftl new file mode 100644 index 0000000..86e36bb --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/lists.ftl @@ -0,0 +1,25 @@ +<#macro listview> + + <#nested> +
+ +<#macro lv_line headers=false class=""> + class="${class}<#if headers>headers"<#elseif headers> class="headers"> + <#nested> + + +<#macro lv_column width=0 centered=false> + <#if width?is_string> + + <#nested> + + <#elseif width gt 0> + + <#nested> + + <#else> + + <#nested> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/tabs.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/tabs.ftl new file mode 100644 index 0000000..b1ab861 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/layout/tabs.ftl @@ -0,0 +1,13 @@ +<#macro tabs> +
+ <#nested> +
+ +<#macro tab id title> +
+

${title?xhtml}

+
+ <#nested> +
+
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/addAdmin.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/addAdmin.ftl new file mode 100644 index 0000000..ecf9868 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/addAdmin.ftl @@ -0,0 +1,68 @@ +<#macro render_privs> + <#if data.privileges?has_content> + <#local source = data.privileges> + <#local useSource = true> + <#else> + <#local source = data.admin.allPrivileges> + <#local useSource = false> + + + Privileges: + + <#list source as privilege> + <#if useSource> + <#local value = privilege.present> + <#else> + <#local value = false> + + checked="checked" /> + + + + + +<@page title="Add administrator"> + <@form action="add-admin"> + + <#switch data.addressError!> + <#case 'EMPTY'> + <@form_error>Please specify the user's address. + <#break> + <#case 'INVALID'> + <@form_error>Invalid address. + <#break> + <#case 'NOT_FOUND'> + <@form_error>User not found. + <#break> + <#case 'STATUS'> + <@form_error>Invalid user status (banned or unconfirmed). + <#break> + <#case 'ALREADY_ADMIN'> + <@form_error>This user is already an administrator. + <#break> + + <@form_text label="E-mail address" name="address" value=data.address! /> + + <#switch data.nameError!> + <#case 'EMPTY'> + <@form_error>Please specify a name. + <#break> + <#case 'INVALID'> + <@form_error>Invalid name. + <#break> + <#case 'UNAVAILABLE'> + <@form_error>This name is already in use. + <#break> + + <@form_text label="Administrator name" name="name" value=data.name! /> + + <#-- Privs --> + <#if data.privError!false> + <@form_error>Please select the new administrator's privileges. + + <@render_privs /> + + <@form_submit label="Add administrator" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/admins.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/admins.ftl new file mode 100644 index 0000000..86306ca --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/admins.ftl @@ -0,0 +1,43 @@ +<#macro render_admin admin> + <#if admin.id = data.admin.id> + <#local begin = ""> + <#local end = ""> + <#elseif admin.privileges?size = 0> + <#local begin = ""> + <#local end = ""> + + + <@lv_line> + <@lv_column>${begin!}${admin.name?xhtml}${end!} + <@lv_column> + <#if admin.address?has_content> + ${begin!}${admin.address?xhtml}${end!} + <#else> + ${begin!}N/A${end!} + + + <@lv_column> + <#if admin.privileges?size gt 0> + <#list admin.privileges as priv> + ${priv} + + <#else> + (inactive) + + + + + +<@page title="Administrators"> + <@listview> + <@lv_line headers=true> + <@lv_column width=300>Name + <@lv_column width=300>Address + <@lv_column width="x">Privileges + + <#list data.administrators as admin> + <@render_admin admin=admin /> + + +

Add administrator

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banReject.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banReject.ftl new file mode 100644 index 0000000..27600a3 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banReject.ftl @@ -0,0 +1,9 @@ +<@page title="Reject ban request"> + <@form action="reject-ban-${data.id}"> + <#if data.error!false> + <@form_error>You must give a reason + + <@form_text label="Rejection reason" name="reason" value="" multiline=true maxLength = 10 /> + <@form_submit label="Reject ban request" /> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banRequest.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banRequest.ftl new file mode 100644 index 0000000..f58b163 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/banRequest.ftl @@ -0,0 +1,20 @@ +<@page title="Request ban"> + <@form action="request-ban"> + <#switch data.error!""> + <#case "NOT_FOUND"><@form_error>User not found<#break> + <#case "BANNED"><@form_error>User is already banned or has a pending ban request.<#break> + <#case "NO_REASON"><@form_error>You have no reason!...<#break> + + <#if data.empire!false> + <#assign eValue = data.user!"" > + <#assign mValue = "" > + <#else> + <#assign mValue = data.user!"" > + <#assign eValue = "" > + + <@form_text label="Empire name" value="" name="eName" value=eValue /> + <@form_text label="(or) User address" value="" name="eMail" value=mValue /> + <@form_text label="Reason" name="reason" value="" multiline=true maxLength=10 value=data.reason!"" /> + <@form_submit label="Request ban" /> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bans.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bans.ftl new file mode 100644 index 0000000..75ca31b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bans.ftl @@ -0,0 +1,75 @@ +<#if data.type = 'PENDING'> + <#assign title = "Pending ban requests"> +<#elseif data.type = 'ARCHIVED'> + <#assign title = "Expired/rejected ban requests"> +<#else> + <#assign title = "Confirmed ban requests"> + +<@page title=title> + <#if data.bans?size = 0> +

No ban requests in this category.

+ <#else> + <@listview> + + <@lv_line headers=true> + <@lv_column width="x">User address + <@lv_column width="x">Requested by + <@lv_column width="x">Requested on + <@lv_column width="x">Reason + <#if data.type = 'ARCHIVED'> + <@lv_column width="x">Cancelled on + <@lv_column width="x">Rejected by + <@lv_column width="x">Rejection reason + <#elseif data.type = 'VALIDATED'> + <@lv_column width="x">Validated on + <@lv_column width="x">Validated by + <@lv_column>  + <#else> + <@lv_column>  + + + + <#list data.bans as ban> + <@lv_line> + <@lv_column>${ban.accountMail?xhtml} + <@lv_column>${ban.requestedByName?xhtml} + <@lv_column>${ban.timestamp?string("yyyy-MM-dd HH:mm:ss")} + <@lv_column>${ban.reason?xhtml} + <#if data.type = 'ARCHIVED'> + <@lv_column>${ban.update?string("yyyy-MM-dd HH:mm:ss")} + <@lv_column> + <#if ban.rejectedByName?has_content> + ${ban.rejectedByName?xhtml} + <#else> + (expired) + + + <@lv_column> + <#if ban.rejectedByName?has_content> + ${ban.rejectionReason?xhtml} + <#else> + (expired) + + + <#elseif data.type = 'VALIDATED'> + <@lv_column>${ban.update?string("yyyy-MM-dd HH:mm:ss")} + <@lv_column> + ${ban.validatedByName?xhtml} + + <@lv_column> + <#if ban.redeemable>Redeem<#else>Lift ban + + <#else> + <@lv_column> + <#if ban.requestedById != data.admin.id> + Confirm ban - + + Reject ban + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bansSummary.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bansSummary.ftl new file mode 100644 index 0000000..f05ed56 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bansSummary.ftl @@ -0,0 +1,37 @@ +<@page title="Banhammer"> + <@listview> + + <@lv_line headers=true> + <@lv_column width=300>  + <@lv_column width=100 centered=true>Entries + + + <#list data.entries as entry> + <@lv_line> + <@lv_column> + <#if entry.count gt 0> + + + <#switch entry.type> + <#case "PENDING"> + Pending requests + <#break> + <#case "ARCHIVED"> + Expired and rejected requests + <#break> + <#case "VALIDATED"> + Confirmed bans + <#break> + + <#if entry.count gt 0> + + + + <@lv_column centered=true>${entry.count} + + + +

Request ban

+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsList.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsList.ftl new file mode 100644 index 0000000..736b587 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsList.ftl @@ -0,0 +1,151 @@ +<#include "bugsTabs.ftl"> +<#macro render_navigation current count total qString> + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 1> + ${total?string(',##0')} entries found. + <#elseif total = 1> + 1 entry found. + <#else> + No entries found. + + + <#if current lt total - count> + + + >> + <#if current lt total - count> + + +
+ +<#macro render> +<#if data.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.status!'x'}&own=${ownOnly}" > +<@page title="Bug tracker"> + <#-- Tabs --> + <@bugTabs selected="bugsList" qString="${qString}&first=${data.first}" /> + + <#-- Selection --> +
+
+ + +
+ List + <@ff_select id="sel-own" name="own"> + <@form_option value="0">all + <@form_option value="1" selected=(data.ownOnly)>my own + + reports with the following status: + <@ff_select id="sel-stat" name="status"> + <@form_option value="x">(indifferent) + <@form_option value="PENDING" selected=((data.status!"") = 'PENDING')>pending validation + <@form_option value="OPEN" selected=((data.status!"") = 'OPEN')>being handled + <@form_option value="RESOLVED" selected=((data.status!"") = 'RESOLVED')>fixed + <@form_option value="WONT_FIX" selected=((data.status!"") = 'WONT_FIX')>won't fix + <@form_option value="NOT_A_BUG" selected=((data.status!"") = 'NOT_A_BUG')>not a bug + + <@ff_submit label="Search" /> +
+
+
+ + <#-- Navigation --> + <@render_navigation current=data.first count=data.count total=data.entries qString=qString /> + + <#-- List of bugs --> + <#if data.reports?size gt 0> + <@listview> + + <@lv_line headers=true> + <@lv_column centered=true width=60># + <@lv_column width=300>Title + <#if !( data.status?has_content )> + <@lv_column width=130 centered=true>Status + + <@lv_column width=150 centered=true>Initial post + <@lv_column width=150 centered=true>Last update + + + <#list data.reports as report> + + <#if !data.ownOnly && report.initialSubmitter.userId?has_content && report.initialSubmitter.admin && report.initialSubmitter.userId = data.admin.id> + <#local eClass="own-fleet"> + <#else> + <#local eClass=""> + + + <@lv_line class=eClass> + <@lv_column centered=true>${report.reportId?string(",##0")} + <@lv_column>${report.title?xhtml} + <#if !( data.status?has_content )> + <@lv_column centered=true><@bugStatus status=report.status /> + + <@lv_column centered=true> + ${report.posted?string("yyyy-MM-dd HH:mm:ss")} + + <@lv_column centered=true> + <#if report.updated> + + + ${report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + <#if report.updated> + + + + + <@lv_line class=eClass> + <#if data.status?has_content> + + <#else> + + +   + <@lv_column centered=true> + by + <#if report.initialSubmitter.admin> + + + ${report.initialSubmitter.name} + <#if report.initialSubmitter.admin> + + + + <@lv_column centered=true> + by + <#if report.latestSubmitter.admin> + + + ${report.latestSubmitter.name} + <#if report.latestSubmitter.admin> + + + + + + + + + + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsReport.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsReport.ftl new file mode 100644 index 0000000..df98218 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsReport.ftl @@ -0,0 +1,42 @@ +<#include "bugsTabs.ftl"> +<#macro render> +<#if data.query.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Bug tracker - Report bug"> + <@bugTabs selected="bugsReport" qString="${qString}&first=${data.query.first}" /> + + <@form action="report-bug"> + + + + + + + <#switch data.titleError!""> + <#case "EMPTY"><@form_error>Please specify the report's title<#break> + <#case "INVALID"><@form_error>Title should be at least 10 characters long<#break> + + <@form_text label="Title" name="title" value=data.title!"" maxLength=127 /> + + <#switch data.descriptionError!""> + <#case "EMPTY"><@form_error>Please specify the bug's description<#break> + <#case "INVALID"><@form_error>Title should be at least 30 characters long<#break> + + <@form_text label="Description" name="description" value=data.description!"" multiline=true maxLength=10 /> + + <@form_select name="public" label="Visible by players"> + <@form_option value="0">No + <@form_option value="1" selected=data.publicReport!false>Yes + + + <@form_submit label="Post bug report" /> + + + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsSummary.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsSummary.ftl new file mode 100644 index 0000000..7977481 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsSummary.ftl @@ -0,0 +1,53 @@ +<#include "bugsTabs.ftl"> +<#macro summary_entry label amount qString> + + <@lv_line> + <@lv_column> + <#if amount gt 0> + + + ${label} + <#if amount gt 0> + + + + <@lv_column centered=true> + ${amount?string(",##0")} + + + + +<#macro render> +<#local qString = "status=x&own=0" > +<@page title="Bug tracker - Summary"> + <#-- Tabs --> + <@bugTabs selected="bugsSummary" qString=qString /> + + <#-- Summary --> + <@listview> + <@lv_line headers=true> + <@lv_column width=300>  + <@lv_column width=100>  + + <@summary_entry label="Pending validation" amount=data.pending qString="status=PENDING&own=0" /> + <@summary_entry label="Open bugs" amount=data.open qString="status=OPEN&own=0" /> + <@summary_entry label="Bugs you reported" amount=data.own qString="status=x&own=1" /> + <@summary_entry label="Total bugs" amount=data.total qString="status=x&own=0" /> + <#if data.updated gt 0> + <@lv_line> + <@lv_column>  + <@lv_column>  + + <@lv_line> + <@lv_column> + Updated bug reports + + <@lv_column centered=true> + ${data.updated?string(",##0")} + + + + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsTabs.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsTabs.ftl new file mode 100644 index 0000000..2e40787 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsTabs.ftl @@ -0,0 +1,19 @@ +<#macro bugTab href title selected> + ${title} + +<#macro bugTabs selected qString> +
+ <@bugTab href="btracker" title="Summary" selected=( selected = 'bugsSummary' ) /> + <@bugTab href="bugs?${qString}" title="List bugs" selected=( selected = 'bugsList' ) /> + <@bugTab href="report-bug?${qString}" title="Report bug" selected=( selected = 'bugsReport' ) /> +
+ +<#macro bugStatus status> + <#switch status> + <#case "PENDING">pending validation<#break> + <#case "OPEN">being handled<#break> + <#case "RESOLVED">fixed<#break> + <#case "WONT_FIX">won't fix<#break> + <#case "NOT_A_BUG">not a bug<#break> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsView.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsView.ftl new file mode 100644 index 0000000..73566e6 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/bugsView.ftl @@ -0,0 +1,220 @@ +<#include "bugsTabs.ftl" /> +<#macro render_submitter s> + <#if s.admin> + + <#if s.userId?has_content && s.userId = data.admin.id> + + + + ${s.name?xhtml} + <#if s.admin> + <#if s.userId?has_content && s.userId = data.admin.id> + + + + + +<#macro render_event e> +
+ ${e.timestamp?string("yyyy-MM-dd HH:mm:ss")} - <@render_submitter s=e.submitter /> + <#nested> +
+ +<#macro render_report_event e> + <@render_event e=e> + posted bug report #${e.id?string(",##0")} + +

${e.title}

+
+ ${e.contents} +
+ <#if e.visible!false> +
+ This report includes an XML snapshot of the empire's status + (download). +
+ + +<#macro render_status_event e> + <@render_event e=e> + set the report's status to <@bugStatus status=e.status /> + + +<#macro render_visibility_event e> + <@render_event e=e> + set the report's visibility to <#if e.visible>public<#else>private + + +<#macro render_merge_event e> + <@render_event e=e> + merged current bug report with bug report #${e.mergedId?string(",##0")} + + +<#macro render_comment_event e> + <@render_event e=e> + posted a comment + +
+ ${e.contents} +
+ <#if !e.visible> + <@lineform action="bug-${data.report.reportId}-comment-moderation"> + + + + + This comment is currently hidden. + <@ff_select name="cAction" id="cAction-${e.id}"> + <@form_option value="1">Validate it + <@form_option value="0">Delete it + + <@ff_submit label="Go" /> + + + +<#macro render> +<#if data.query.ownOnly> + <#assign ownOnly = "1"> +<#else> + <#assign ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Bug #${data.report.reportId?string(',##0')} - ${data.report.title}"> + <#-- Tabs --> + <@bugTabs selected="" qString="${qString}&first=${data.query.first}" /> + + <#-- Bug info --> + <@dt_main> + <@dt_entry title="Status"><@bugStatus status=data.report.status /> + <@dt_entry title="Public"><#if data.report.visible>yes<#else>no + <@dt_entry title="Initially reported"> + ${data.report.posted?string("yyyy-MM-dd HH:mm:ss")} + by <@render_submitter s=data.report.initialSubmitter /> + + <@dt_entry title="Latest update"> + ${data.report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + by <@render_submitter s=data.report.latestSubmitter /> + + + + <#-- List events --> + <#list data.events as event> +
+ <#switch event.type> + <#case 'INIT'> + <@render_report_event e=event /> + <#break> + <#case 'STATUS'> + <@render_status_event e=event /> + <#break> + <#case 'COMMENT'> + <@render_comment_event e=event /> + <#break> + <#case 'VISIBILITY'> + <@render_visibility_event e=event /> + <#break> + <#case 'MERGE'> + <@render_merge_event e=event /> + <#break> + + + + <#-- Controls --> +
+ <#if data.report.status = 'PENDING'> + <@form action="bug-${data.report.reportId}-validation" hash="br-controls"> + + + + + + + + <@form_extra>This report is currently pending validation. + <@form_select label="Set status to" name="nStatus"> + <@form_option value="OPEN"><@bugStatus status="OPEN" /> + <@form_option value="RESOLVED"><@bugStatus status="RESOLVED" /> + <@form_option value="WONT_FIX"><@bugStatus status="WONT_FIX" /> + <@form_option value="NOT_A_BUG"><@bugStatus status="NOT_A_BUG" /> + + <@form_select label="Visibility" name="visibility"> + <@form_option value="1">public + <@form_option value="0">hidden + + <@form_select label="Grant game credits" name="credits"> + <@form_option value="0">no + <@form_option value="1" selected=true>low priority bug - small amount + <@form_option value="2">normal bug - medium amount + <@form_option value="3">critical bug - large amount + + <@form_select label="Empire status snapshot" name="snapshot"> + <@form_option value="1">keep + <@form_option value="0">delete + + <@form_submit label="Go" /> + + <#else> + <@lineform action="bug-${data.report.reportId}-status" hash="br-controls"> + + + + Change status to + <@ff_select name="nStatus" id="nStatus"> + <@form_option value="OPEN" selected=( data.report.status = 'OPEN' )><@bugStatus status="OPEN" /> + <@form_option value="RESOLVED" selected=( data.report.status = 'RESOLVED' )><@bugStatus status="RESOLVED" /> + <@form_option value="WONT_FIX" selected=( data.report.status = 'WONT_FIX' )><@bugStatus status="WONT_FIX" /> + <@form_option value="NOT_A_BUG" selected=( data.report.status = 'NOT_A_BUG' )><@bugStatus status="NOT_A_BUG" /> + + <@ff_submit label="Go" /> + + <#if data.report.status = 'OPEN'> + <@lineform action="bug-${data.report.reportId}-visibility" hash="br-controls"> + + + + Change visibility to + <#if data.report.visible> + hidden + <#else> + public + + <@ff_submit label="Go" /> + + <#switch data.mergeError!> + <#case "NOT_FOUND"><@standalone_error>Bug report not found<#break> + <#case "MERGED"><@standalone_error>Bug reports already merged<#break> + <#case "STATUS"><@standalone_error>Both bug reports must be open<#break> + + <@lineform action="bug-${data.report.reportId}-merge" hash="br-controls"> + + + + Merge into bug report #<@ff_text name="mergeId" id="merge-into" value=data.mergeId!"" /> + <@ff_submit label="Go" /> + +
+ <@form action="bug-${data.report.reportId}-comment" hash="post-comment"> + + + + + + + + <#switch data.commentError!""> + <#case "EMPTY"><@form_error>You should type a comment before posting a comment.<#break> + <#case "INVALID"><@form_error>Comments must be at least 30 characters long.<#break> + + <@form_text label="New comment" name="comment" multiline=true maxLength=6 value=data.comment!"" /> + <@form_select label="Visibility" name="visibility"> + <@form_option value="1">public + <@form_option value="0" selected=(! data.publicComment!true )>hidden + + <@form_submit label="Post comment" /> + + + + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/changePassword.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/changePassword.ftl new file mode 100644 index 0000000..3552562 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/changePassword.ftl @@ -0,0 +1,31 @@ +<@page title="Change password"> + <@form action="change-password"> + <#if data.admin.passwordChange!false> + <@form_extra>Your administration password is currently the same as your player account's password. You must change it before you can proceed. + + + <#if data.authError!false> + <@form_error>Incorrect password + + <@form_pwd name="current" label="Current password" /> + + <#switch data.passwordError!> + <#case 'EMPTY'> + <@form_error>No password specified + <#break> + <#case 'TOO_WEAK'> + <@form_error>Password too weak + <#break> + <#case 'MISMATCH'> + <@form_error>Password and password confirmation did not match + <#break> + <#case 'PROHIBITED'> + <@form_error>You are not allowed to use your player account's password. + <#break> + + <@form_pwd name="password" label="New password" /> + <@form_pwd name="passwordConfirm" label="New password (confirmation)" /> + + <@form_submit label="Change password" /> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/constants.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/constants.ftl new file mode 100644 index 0000000..542b875 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/constants.ftl @@ -0,0 +1,29 @@ +<#macro render_constant constant wrong> +

${constant.name?xhtml}

+

${constant.description?xhtml}

+ <#if wrong> + <@standalone_error>Invalid constant value + <#local cValue = data.value> + <#else> + <#local cValue = constant.value> + + <@lineform action="set-constant" hash=constant.name?replace("." , "-")> + Value: + <@ff_text name="value" id=constant.name?replace("." , "-") value=cValue?string("#.###") maxLength=10 size=10 /> + <#if constant.minValue?has_content || constant.maxValue?has_content> + (<#if constant.minValue?has_content>min.: ${constant.minValue?string("#.###")}<#if constant.maxValue?has_content> ; <#if constant.maxValue?has_content>max.: ${constant.maxValue?string("#.###")}) + + <@ff_submit label="Change" /> + + +

 

+ +<@page title="Constants"> + <#list data.categories as category> +

${category.name?xhtml}

+ <#list category.definitions as constant> + <@render_constant constant=constant wrong=(((data.name!"") == constant.name) && data.error!false) /> + +

 

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/language.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/language.ftl new file mode 100644 index 0000000..a9300f9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/language.ftl @@ -0,0 +1,37 @@ +<#macro render_string str> + + ${str.id} + + <#if (data.edited!"") == str.id> +
Empty strings are not allowed
+ +
+
+ + +
+ +
+
+ + + +<@page title="Language '${data.language.name}'"> + +

Change language name

+ <@form action="i18n-${data.language.id}-edit"> + <#if data.nameError!false> + <@form_error>Invalid name + + <@form_text name="name" label="New name" value=data.language.name! /> + <@form_submit label="Change name" /> + + +

Translations

+ + <#list data.strings as str> + <@render_string str=str /> + +
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/languages.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/languages.ftl new file mode 100644 index 0000000..c791270 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/languages.ftl @@ -0,0 +1,24 @@ +<#macro render_language lang> + <@lv_line> + <@lv_column centered=true>${lang.id} + <@lv_column>${lang.name?xhtml} + <@lv_column centered=true>${lang.completion}% + <@lv_column centered=true>(XML export) + + +<@page title="Languages"> + <@listview> + + <@lv_line headers=true> + <@lv_column width=100 centered=true>ID + <@lv_column width="x">Name + <@lv_column width=200 centered=true>Completion % + <@lv_column width=150>  + + + <#list data.languages as lang> + <@render_language lang=lang /> + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logEntry.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logEntry.ftl new file mode 100644 index 0000000..2a51ced --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logEntry.ftl @@ -0,0 +1,41 @@ +<@page title="Log entry #${data.entry.id?string(',##0')}"> +

Basics

+ <@dt_main> + <@dt_entry title="Date">${data.entry.timestamp?string("yyyy-MM-dd")} + <@dt_entry title="Time">${data.entry.timestamp?string("HH:mm:ss")} + <@dt_entry title="Log level">${data.entry.level} + <@dt_entry title="Component">${data.entry.about?xhtml} + <@dt_entry title="Message">${data.entry.entry?xhtml} + +

 

+ + <#if data.exceptions?size gt 0> +

Exception log

+ + <#list data.exceptions as exc> + + + + <#list exc.trace as stEntry> + + + + + + +
+ ${exc.className?xhtml} + <#if exc.message?has_content>: ${exc.message?xhtml} +
  + In + <#if stEntry.location?has_content> + ${stEntry.location?xhtml} + <#else> + ??? + + <#if stEntry.fileName?has_content> + (in file ${stEntry.fileName?xhtml}<#if stEntry.line?has_content> at line ${stEntry.line?string(",##0")}) + +
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/login.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/login.ftl new file mode 100644 index 0000000..5d563ea --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/login.ftl @@ -0,0 +1,10 @@ +<@page title="Log in"> + <@form action="login"> + <#if data.failed!false> + <@form_error>Invalid address or password + + <@form_text name="mail" label="E-mail address" value=data.mail! /> + <@form_pwd name="password" label="Password" /> + <@form_submit label="Log in" /> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logs.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logs.ftl new file mode 100644 index 0000000..7a2d9e7 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/logs.ftl @@ -0,0 +1,103 @@ +<@page title="Logs viewer"> +

Log entries

+ + + + + + +
+ <#if data.params.first = 0> + << + <#else> + <#if data.params.first gt 30> + 1<#else>0&first=${data.params.first - 30 }"> + <#else> + 1<#else>0&first=0"> + + << + + + <#if data.count = 0> + No entries found. + <#else> + ${data.count?string(",##0")} entries + + + <#if (data.params.first + 30) gt data.count> + >> + <#else> + 1<#else>0&first=${data.params.first + 30 }"> + >> + +
+ <#if data.count gt 0> + + + <@lv_line headers=true> + <@lv_column width=60 centered=true>Date + <@lv_column width=60 centered=true>Time + <@lv_column width=60 centered=true>Log level + <@lv_column width=200 centered=true> + <#if data.params.type = "SYSTEM"> + Component + <#else> + User + + + <@lv_column width="x">Message + <@lv_column width=50>  + + + <#list data.entries as entry> + <@lv_line class="log-entry-${entry.level?lower_case}"> + <@lv_column centered=true>${entry.timestamp?string("yyyy-MM-dd")} + <@lv_column centered=true>${entry.timestamp?string("HH:mm:ss")} + <@lv_column centered=true>${entry.level} + <@lv_column centered=true>${entry.about?xhtml} + <@lv_column>${entry.entry?xhtml} + <@lv_column> + <#if entry.exception?has_content> + Details + <#else> +   + + + + + +
+ + +

Search parameters

+
+
+ + + <@form_select name="logType" label="Log type"> + <@form_option value="SYSTEM" selected=((data.params.type!"") = "SYSTEM")>system log + <@form_option value="ADMIN" selected=((data.params.type!"") = "ADMIN")>administrative actions + <@form_option value="PLAYER" selected=((data.params.type!"") = "PLAYER")>player actions + + + <@form_select name="logLevel" label="Minimal log level"> + <@form_option value="TRACE" selected=((data.params.level!"") = "TRACE")>TRACE + <@form_option value="DEBUG" selected=((data.params.level!"") = "DEBUG")>DEBUG + <@form_option value="INFO" selected=((data.params.level!"") = "INFO")>INFO + <@form_option value="WARNING" selected=((data.params.level!"") = "WARNING")>WARNING + <@form_option value="ERROR" selected=((data.params.level!"") = "ERROR")>ERROR + + + <@form_text label="Component / user" name="component" value=data.params.component! /> + + <@form_select name="excOnly" label="Only entries with exceptions"> + <@form_option value="0" selected=!( data.params.excOnly!false)>no + <@form_option value="1" selected=data.params.excOnly!false>yes + + + <@form_submit label="Search"/> +
+
+
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/main.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/main.ftl new file mode 100644 index 0000000..c1a1c52 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/main.ftl @@ -0,0 +1,42 @@ +<@page title="Overview"> +

Your administrative account

+

+ E-mail address: ${data.admin.address?xhtml} +

+

+ Privileges: + <#list data.admin.privileges as priv> + ${priv} + +

+

+ Change password +

+

 

+ +

Overview

+

+ Unread messages: ${data.overview.newMessages} +

+ <#if data.overview.pendingNames?has_content> +

+ Unvalidated map names: ${data.overview.pendingNames} +

+ + <#if data.overview.pendingBans?has_content> +

+ Unvalidated ban requests: ${data.overview.pendingBans} +

+ + <#if data.overview.pendingBugs?has_content> +

+ Bug reports pending validation: ${data.overview.pendingBugs} +

+

+ Open bug reports: ${data.overview.openBugs} +

+

+ Updated bug reports: ${data.overview.updatedBugs} +

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/maintenance.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/maintenance.ftl new file mode 100644 index 0000000..32bbd62 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/maintenance.ftl @@ -0,0 +1,40 @@ +<@page title="Maintenance mode"> + + <#if data.reason?has_content> + +

Maintenance mode is enabled.

+ <@dt_main> + <@dt_entry title="Started">${data.started?string("yyyy-MM-dd HH:mm:ss")} + <@dt_entry title="Scheduled to end">${data.until?string("yyyy-MM-dd HH:mm:ss")} + <@dt_entry title="Reason">${data.reason?xhtml} + + + + <@form action="maintenance-extend"> + <@form_text label="Duration (minutes)" name="duration" value="" /> + <@form_submit label="Extend maintenance mode"/> + + <@form action="maintenance-end"> + <@form_submit label="Disable maintenance mode"/> + + + <#else> + +

Maintenance mode is currently disabled.

+ + <@form action="maintenance-start"> + <#switch data.reasonError!""> + <#case 'EMPTY'><@form_error>You must specify a reason.<#break> + <#case 'INVALID'><@form_error>Reason too short (must be at least 10 characters long).<#break> + + <@form_text label="Reason for maintenance activation" name="reason" value=data.newReason!"" /> + <#if ( data.newReason!"" ) != "" && ! data.reasonError?has_content> + <@form_error>Invalid duration + + <@form_text label="Duration (minutes)" name="duration" value=data.newDuration!"" /> + <@form_submit label="Enable maintenance mode"/> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/message.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/message.ftl new file mode 100644 index 0000000..028ef4a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/message.ftl @@ -0,0 +1,96 @@ +<#macro render_navigation message inbox> + <#if inbox> + <#local link="inbox-message-"> + <#else> + <#local link="outbox-message-"> + + + + + + + +
+ <#if message.previous?has_content> + + + << + <#if message.previous?has_content> + + + + <#if inbox> + Received messages + <#else> + Sent messages + + + <#if message.next?has_content> + + + >> + <#if message.next?has_content> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Received messages"> + <#local timeTtl="Received"> +<#else> + <#local title="Sent messages"> + <#local timeTtl="Sent"> + +<@page title=title> + <@render_navigation message=data.message inbox=data.inbox /> + + <@dt_main> + <@dt_entry width=100 title="From"> + ${data.message.sender!} + <#if data.inbox> + (${data.message.type?lower_case}) + + + <@dt_entry width=100 title="To"> + ${data.message.receiver!} + <#if !data.inbox> + (${data.message.type?lower_case}) + + + <@dt_entry width=100 title=timeTtl> + ${data.message.time?string("yyyy-MM-dd HH:mm:ss")} + + <#if data.message.unread> + <@dt_entry width=100 title="">New! + + + + <@listview><@lv_line headers=true>  + +

${data.message.title}

+
+ ${data.message.contents} +
+ + <@listview><@lv_line headers=true>  + <@lineform action="message"> + + + <#if data.message.previous?has_content> + <#local afterDelete = data.message.previous> + <#elseif data.message.next?has_content> + <#local afterDelete = data.message.next> + <#else> + <#local afterDelete = "x"> + + + <@ff_submit label="Delete message" name="delete" /> + <#if data.inbox && data.message.type != 'INTERNAL'> + <@ff_submit label="Compose reply" name="reply" /> + + + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageBox.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageBox.ftl new file mode 100644 index 0000000..f0e5ace --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageBox.ftl @@ -0,0 +1,112 @@ +<#include "messageTabs.ftl" /> +<#macro render_navigation current total inbox> + <#if inbox> + <#local link="inbox-"> + <#else> + <#local link="outbox-"> + + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 0> + Page ${current + 1} / ${total} + <#elseif inbox> + No messages received. + <#else> + No messages sent. + + + <#if current lt total - 1> + + + >> + <#if current lt total - 1> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Received messages"> + <#local tab="inbox"> +<#else> + <#local title="Sent messages"> + <#local tab="outbox"> + +<@page title=title> + <@messageTabs selected=tab /> + <@render_navigation current=data.cPage total=data.pages inbox=data.inbox /> + <#if data.messages?size gt 0> +
+ + + <@listview> + + <@lv_line headers=true> + <@lv_column width=16 centered=true>  + <@lv_column width="x">Subject + <@lv_column width=150 centered=true><#if data.inbox>From<#else>To + <@lv_column width=150 centered=true><#if data.inbox>Received<#else>Sent + + + <#list data.messages as message> + <#if ! message.read> + <#local mType = "unread-msg"> + <#else> + <#local mType = ""> + + + <@lv_line class=mType> + <@lv_column centered=true> + + + <@lv_column><#if message.type = 'EMPIRE'>${message.title}<#else>${message.title} + <@lv_column centered=true>${message.sender!} + <@lv_column centered=true>${message.time?string("yyyy-MM-dd HH:mm:ss")} + + + + + <#if data.inbox> +
+ With + <@ff_select name="target" id="target"> + <@form_option value="0">selected + <@form_option value="1">all + + messages: + <@ff_select name="action" id="action"> + <@form_option value="r">mark as read + <@form_option value="u">mark as unread + <@form_option value="d">delete + + <@ff_submit label="Go" /> +
+ <#else> +
+ + Delete + <@ff_select name="target" id="target"> + <@form_option value="0">selected + <@form_option value="1">all + + messages <@ff_submit label="Go" /> +
+ +
+ + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageTabs.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageTabs.ftl new file mode 100644 index 0000000..33c248e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageTabs.ftl @@ -0,0 +1,10 @@ +<#macro messageTab href title selected> + ${title} + +<#macro messageTabs selected> +
+ <@messageTab href="messages" title="Received" selected=( selected = 'inbox' ) /> + <@messageTab href="outbox" title="Sent" selected=( selected = 'outbox' ) /> + <@messageTab href="compose-message" title="Compose" selected=( selected = 'compose' ) /> +
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageWriter.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageWriter.ftl new file mode 100644 index 0000000..f003b62 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/messageWriter.ftl @@ -0,0 +1,79 @@ +<#include "messageTabs.ftl" /> +<#macro render> +<#if data.replyTo?has_content> + <#local title="Reply to message"> +<#else> + <#local title="Compose new message"> + +<@page title=title> + <@messageTabs selected="compose" /> + +
+
+ <#if data.replyTo?has_content> + + + + + + <#if data.timingError> + <@form_error>Not so fast! Wait a few seconds before trying again. + + + <#-- Message recipient --> + <#if data.targetError> + <@form_error>Message recipient not found. + + <@form_select label="Recipient type" name="toType"> + <@form_option value="ADMINISTRATOR" selected=( data.messageType = 'ADMINISTRATOR' )>Administrator + <@form_option value="EMPIRE" selected=( data.messageType = 'EMPIRE' )>Empire + + <@form_text label="Recipient name" name="toName" maxLength=48 value=data.target /> + + <#-- Subject --> + <#if data.titleError> + <@form_error>Subject is too short (min.: 2 characters) + + <@form_text label="Subject" name="title" maxLength=64 value=data.title /> + + <#-- Body --> + <#if data.contentsError> + <@form_error>Contents are too short (min.: 2 characters) + + <@form_text label="Contents" name="contents" value=data.contents multiline=true maxLength=10 /> + + <@form_extended_submit label="Send message"> + <@ff_submit label="Cancel" name="cancel" /> + +
+ +
+
+ + <#-- Original message --> + <#if data.replyTo?has_content> + <@listview><@lv_line headers=true>  + <@dt_main> + <@dt_entry width=100 title="">Original message: + <@dt_entry width=100 title="From"> + ${data.replyTo.sender!} + + <@dt_entry width=100 title="To"> + ${data.replyTo.receiver!} + + <@dt_entry width=100 title="Received"> + ${data.replyTo.time?string("yyyy-MM-dd HH:mm:ss")} + + + + <@listview><@lv_line headers=true>  + +

${data.replyTo.title}

+
+ ${data.replyTo.contents} +
+ + + + +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/names.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/names.ftl new file mode 100644 index 0000000..55a9c32 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/names.ftl @@ -0,0 +1,72 @@ +<#macro render_name_entry name> + <@lv_line> + <@lv_column centered=true> + <#if data.type = "EMPIRE" && (name.extra!"x") == ""> + <@lv_column> + <#else> + <@lv_column> + + <#if data.type = "ALLIANCE"> + <@lv_column> + <#elseif data.type = "MAP_CHANGED"> + <@lv_column centered=true><#if name.type = "MAP_PENDING">No<#else>Yes + + + +<#macro render_actions> + <#if data.type = "MAP_PENDING"> + <@ff_select name="action" id="action"> + <@form_option value="VALIDATE">Validate + <@form_option value="REJECT">Reject and send warning + <@form_option value="REJECT_BAN">Reject, send warning and ban name + + <#elseif data.type = "MAP_VALIDATED"> + <@ff_select name="action" id="action"> + <@form_option value="REJECT">Reject and send warning + <@form_option value="REJECT_BAN">Reject, send warning and ban name + <@form_option value="RESET">Allow early renaming + + <#elseif data.type = "MAP_CHANGED"> + <@ff_select name="action" id="action"> + <@form_option value="VALIDATE">Validate + <@form_option value="REJECT">Reject and send warning + <@form_option value="REJECT_BAN">Reject, send warning and ban name + <@form_option value="RESET">Allow early renaming + + <#elseif data.type = "EMPIRE"> + <@ff_select name="action" id="action"> + <@form_option value="REJECT">Forcibly rename to "RudeGuyXXX" + <@form_option value="REJECT_BAN">Forcibly rename and ban old name + + <#else> + + Disband selected alliance(s) + + +<@page title=data.type.description> + <#if data.names?size = 0> +

No names to display

+

There are no such names at the moment.

+ <#else> +
+ <@listview> + <@lv_line headers=true> + <@lv_column width=24>  + <#if data.type = "ALLIANCE"> + <@lv_column width=100>Tag + <@lv_column width=300>Name + <#elseif data.type = "MAP_CHANGED"> + <@lv_column width=300>Name + <@lv_column width=150 centered=true>Validated + <#else> + <@lv_column width=300>Name + + + <#list data.names as name> + <@render_name_entry name=name /> + + +

<@render_actions />

+
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/namesSummary.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/namesSummary.ftl new file mode 100644 index 0000000..39857d4 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/namesSummary.ftl @@ -0,0 +1,20 @@ +<@page title="Names"> + <@listview> + <@lv_line headers=true> + <@lv_column width=250>Status + <@lv_column width=100 centered=true>Names + + <#list data.entries as entry> + <@lv_line> + <@lv_column> + <#if entry.count gt 0> + ${entry.type.description?xhtml} + <#else> + ${entry.type.description?xhtml} + + + <@lv_column centered=true>${entry.count?string(",##0")} + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/offline.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/offline.ftl new file mode 100644 index 0000000..a59838f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/offline.ftl @@ -0,0 +1,5 @@ +<@page title="Server off-line"> +

+ The Legacy Worlds game server is currently off-line. Manual repairs need to be undertaken. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/preferences.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/preferences.ftl new file mode 100644 index 0000000..413d959 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/preferences.ftl @@ -0,0 +1,53 @@ +<#macro render_preference pref> +
+
+ + + + + + <#switch pref.type> + <#case 'BOOLEAN'> + <@form_select label="Default value" name="value" id="pref-${pref.id}"> + <@form_option value="0" text="No" selected=( pref.value != "1" )/> + <@form_option value="1" text="Yes" selected=( pref.value == "1" )/> + + <#break> + <#case 'INTEGER'> + <#case 'STRING'> + <@form_text label="Default value" name="value" id="pref-${pref.id}" value=pref.value /> + <#break> + <#case 'CHOICE'> + <@form_select label="Default value" name="value" id="pref-${pref.id}"> + <#list pref.choices as choice> + <@form_option value=choice.value text=choice.display selected=( pref.value == choice.value )/> + + + <#break> + + <#if pref.description?has_content> + + + + + + <@form_submit label="Update default value" /> +
Preference name: + ${pref.name?xhtml} + +
Description:${pref.description?xhtml}
+
+

 

+
+ +<#macro render_prefs_category category> +

${category.name?xhtml}

+ <#list category.preferences as p> + <@render_preference pref=p /> + + +<@page title="Default preferences"> + <#list data.preferences as c> + <@render_prefs_category category=c /> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/resetAdmin.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/resetAdmin.ftl new file mode 100644 index 0000000..41ee429 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/resetAdmin.ftl @@ -0,0 +1,18 @@ +<@page title="Administrator ${data.view.name} - reset password"> + <@dt_main> + <@dt_entry title="Name">${data.view.name?xhtml} + <@dt_entry title="Address"> + <#if data.view.address?has_content> + ${data.view.address?xhtml} + <#else> + (account deleted) + + + + + <@form action="do-reset-admin-${data.view.id}"> + <@form_extended_submit label="Reset password"> + <@ff_submit label="Cancel" name="cancel" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/spam.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/spam.ftl new file mode 100644 index 0000000..b658b85 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/spam.ftl @@ -0,0 +1,27 @@ +<@page title="Spaminator! (TM)"> + <#if data.preview?has_content> +

Message preview

+
${data.preview}
+

 

+ + +

Compose spam

+

This message is going to be sent to every player in the game, so please don't be a complete idiot while typing it.

+ <@form action="send-spam"> + + <#if data.titleError!false> + <@form_error>Spam title missing, too short or too long + + <@form_text name="title" label="Title" value=data.title!"" maxLength=64/> + + <#if data.bodyError!false> + <@form_error>Spam body missing or too short + + <@form_text name="body" label="Body" value=data.body!"" multiline=true maxLength=10 /> + + <@form_extended_submit label="Spam, spam, spam!"> + <@ff_submit label="Preview" name="preview" /> + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/ticker.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/ticker.ftl new file mode 100644 index 0000000..367969a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/ticker.ftl @@ -0,0 +1,51 @@ +<#macro render_task task> + <@lv_line> + <@lv_column>  + <@lv_column>${task.name?xhtml} + <@lv_column>${task.status.description?xhtml}<#if task.status = 'AUTO'> +
${task.start?string("yyyy-MM-dd HH:mm:ss")} + + <@lv_column> +
+ <#if task.status != 'RUNNING'> + Start - + + <#if task.status != 'STOPPED'> + Stop + +
+ Schedule automatic start in + <@ff_text name="delay" value="1" id="delay" maxLength=5 /> + <@ff_select name="multiplier" id="multiplier"> + <@form_option value="86400">day(s) + <@form_option value="3600">hour(s) + <@form_option value="60">minute(s) + <@form_option value="1">second(s) + + <@ff_submit label="Go" /> +
+ + + +<@page title="Ticker status"> +

Ticker tasks

+ <@listview> + <@lv_line headers=true> + <@lv_column width=40>  + <@lv_column width=180>Task name + <@lv_column width=200>Status + <@lv_column width="x">  + + <#list data.tasks as task> + <@render_task task=task /> + + +

 

+ +

Ticker main thread

+ <#if data.paused> +

The main ticker thread is currently paused. Start it

+ <#else> +

The main ticker thread is currently running. Pause it

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/user.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/user.ftl new file mode 100644 index 0000000..acfdeba --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/user.ftl @@ -0,0 +1,58 @@ +<#assign accnt = data.account> +<@page title="User #${accnt.id?string(',##0')} - ${accnt.address}"> + <@dt_main> + + <@dt_entry title="User ID">${accnt.id?string(',##0')} + <@dt_entry title="E-mail address">${accnt.address?xhtml} + <@dt_entry title="Language code">${accnt.language} + + <@dt_blank /> + + <@dt_entry title="Current status">${accnt.status.description?xhtml} + <#if accnt.statusStart?has_content> + <@dt_entry title="Since / Starting from">${accnt.statusStart?string("yyyy-MM-dd HH:mm:ss")} + + <#if accnt.inactivityReason?has_content> + <@dt_entry title="Reason">${accnt.inactivityReason?xhtml} + + <#if accnt.ban?has_content> + <#assign be = accnt.ban> + <@dt_entry title="Requested by">${be.requestedByName?xhtml} + <@dt_entry title="Confirmed by">${be.confirmedByName?xhtml} + + <@dt_entry title="Warnings received">${accnt.warnings} + <#if accnt.warnings gt 0> + <@dt_entry title="Last warning">${accnt.lastWarning?string("yyyy-MM-dd HH:mm:ss")} + + + <@dt_blank /> + + <#if accnt.online> + <@dt_entry title="">CURRENTLY ONLINE + + <@dt_entry title="">View sessions + + <@dt_blank /> + + <@dt_entry title="Vacation credits">${accnt.vacationCredits?string(",##0")} + <@dt_entry title="Game credits">${accnt.gameCredits?string(",##0")} + <@dt_entry title=""> +
+ Grant this user <@ff_text name="credits" id="credits" value=1 /> credit(s) + <@ff_submit label="Go" /> +
+ + + <@dt_blank /> + + <#if accnt.currentEmpire?has_content> + <@dt_entry title="Currently playing as">${accnt.currentEmpire?xhtml} + + <#if accnt.empireNames?size gt 0> + <@dt_entry title="All empire names"> + <#list accnt.empireNames as name>${name?xhtml}
+ + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/userSessions.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/userSessions.ftl new file mode 100644 index 0000000..4b05631 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/userSessions.ftl @@ -0,0 +1,57 @@ +<@page title="User #${data.account.id?string(',##0')} - Sessions"> +

Account

+ <@dt_main> + <@dt_entry title="E-mail address">${data.account.address?xhtml} + <@dt_entry title="Language code">${data.account.language} + <@dt_entry title="Current status">${data.account.status.description?xhtml} + <#if data.account.currentEmpire?has_content> + <@dt_entry title="Currently playing as">${data.account.currentEmpire?xhtml} + + <@dt_entry title="">Back to account page + + +

Sessions

+ <#if data.account.sessions?size = 0> +

No sessions for this account.

+ <#else> + <@listview> + + <@lv_line headers=true> + <@lv_column width=60 centered=true>ID# + <@lv_column width=60 centered=true>C.T. + <@lv_column width=120 centered=true>IP address + <@lv_column width=60 centered=true>Start date + <@lv_column width=60 centered=true>- time + <@lv_column width=60 centered=true>End date + <@lv_column width=60 centered=true>- time + <@lv_column width="x">Termination reason + + + <#list data.account.sessions as session> + <@lv_line> + <@lv_column centered=true>${session.id?string(",##0")} + <@lv_column centered=true> + <#if session.exclusive> + ${session.clientName?xhtml} + <#else> + ${session.clientName?xhtml} + + + <@lv_column centered=true>${session.fromAddress?xhtml} + <@lv_column centered=true>${session.started?string('yyyy-MM-dd')} + <@lv_column centered=true>${session.started?string('HH:mm:ss')} + + <#if session.ended?has_content> + <@lv_column centered=true>${session.ended?string('yyyy-MM-dd')} + <@lv_column centered=true>${session.ended?string('HH:mm:ss')} + <@lv_column>${session.endType.description?xhtml} + <#else> + Still connected + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/users.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/users.ftl new file mode 100644 index 0000000..2ffe322 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/users.ftl @@ -0,0 +1,49 @@ +<#if data.status?has_content> + <#assign pTitle= "Users with status '${data.status.description}'"> + +<@page title=pTitle!"Users"> +
+

+ Display + <@ff_select name="online" id="online"> + <@form_option value="0">all + <@form_option value="1" selected=data.online!false>online + + users that have the following status: + <@ff_select name="status" id="status"> + <@form_option value="x" selected=!(data.status?has_content)>(all users) + <#list data.allStatuses as st> + <@form_option value=st selected=((data.status!"") = st)>${st.description} + + + <@ff_submit label="Filter" /> +

+
+ + <#if data.entries?size gt 0> +

${data.entries?size} account(s) found.

+ <@listview> + + <@lv_line headers=true> + <@lv_column width=40>  + <@lv_column width=250>E-mail address + <@lv_column width=250>Current empire + <@lv_column width=100 centered=true>Status + <@lv_column width=100 centered=true>Language + + + <#list data.entries as entry> + <@lv_line> + <@lv_column>  + <@lv_column>${entry.address?xhtml} + <@lv_column><#if entry.currentEmpire?has_content>${entry.currentEmpire?xhtml}<#else>N/A + <@lv_column centered=true>${entry.status.description?xhtml} + <@lv_column centered=true>${entry.language} + + + + + <#else> +

No accounts found

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/viewAdmin.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/viewAdmin.ftl new file mode 100644 index 0000000..5276f7b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/types/viewAdmin.ftl @@ -0,0 +1,41 @@ +<@page title="Administrator ${data.view.name}"> +

General information

+ <@dt_main> + <@dt_entry title="Name">${data.view.name?xhtml} + <@dt_entry title="Address"> + <#if data.view.address?has_content> + ${data.view.address?xhtml} + <#else> + (account deleted) + + + + <@dt_entry title="Password modified"> + <#if data.view.passwordChange> + no + <#else> + yes + + + <#if data.view.id != data.admin.id && data.view.address?has_content && !data.view.passwordChange> + <@dt_entry title="">Reset administration password + + + + <#if data.view.id != data.admin.id && data.view.address?has_content> +

 

+

Privileges

+ <@form action="admin-privileges-${data.view.id}"> + + Privileges: + + <#list data.view.allPrivileges as privilege> + checked="checked" /> + + + + + <@form_submit label="Update privileges" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/version.ftl b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/version.ftl new file mode 100644 index 0000000..c9406cf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/fm/version.ftl @@ -0,0 +1,2 @@ +<#macro version>Milestone 1 +<#macro full_version>Beta 6 milestone 1 (5.99.1) \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/web.xml b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000..72556c9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/WEB-INF/web.xml @@ -0,0 +1,61 @@ + + + + legacyworlds-web-admin + + + charsetFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + 1 + + + + + charsetFilter + /* + + + + admin + org.springframework.web.servlet.DispatcherServlet + 1 + + + + pass-through + org.apache.catalina.servlets.DefaultServlet + + + + pass-through + *.js + + + + pass-through + *.css + + + + pass-through + *.jpg + + + + pass-through + *.png + + + + admin + / + + + diff --git a/legacyworlds-web/legacyworlds-web-admin/WebContent/css/main.css b/legacyworlds-web/legacyworlds-web-admin/WebContent/css/main.css new file mode 100644 index 0000000..ed50e64 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/WebContent/css/main.css @@ -0,0 +1,171 @@ +* { + color: black; + font-family: Arial, sans-serif; + font-size: 10pt; + margin: 0; + padding: 0 +} + +body { + background-color: #ffefef; +} + +/* Page header */ +div.page-header { + width: 80%; + margin: 5px auto 20px auto; + background-color: #ff7f7f; + border-color: #ff0000; + border-width: 1px; + border-style: solid; +} + +.page-header * { + text-align: center; + color: white; +} + +.page-header h1 { + font-size: 16pt; +} + +.page-header h2 { + font-size: 12pt; +} + +.page-header h3 { + font-size: 9pt; + font-style: italic; +} + +/* Page body */ +div.page-full { + width: 100%; +} + +.page-full.page-contents { + padding: 0px 20px; +} + +.page-full .page-contents { + padding: 0px 20px 0px 250px; +} + +/* Side bar */ +.side-bar { + float: left; + margin: 0px 5px; + padding: 5px; + width: 225px; + background-color: #ffafaf; + border-color: #ff7f7f; + border-width: 1px; + border-style: solid; +} + +.side-bar .admin { + font-size: 11pt; + font-weight: bold; + padding: 0 0 10px 0; + text-align: center; +} + +.side-bar a { + display: block; + width: 100%; + text-decoration: none; + text-align: center; + padding: 3px 0; +} + +.side-bar a:hover { + background-color: #ff0000; + color: white; +} + +/* Text */ +h1 { + font-size: 14pt; + margin: 0 0 10px 0; +} + +h2 { + font-size: 13pt; + margin: 0 0 10px 10px; +} + +h3 { + font-size: 12pt; + margin: 0 0 10px 20px; +} + +h4 { + font-size: 11pt; + margin: 0 0 10px 40px; +} + +.page-contents p { + margin: 5px 10px 5px 30px; + text-align: justify; + text-indent: 20px; +} + +.page-contents ul,.page-contents ol { + margin: 0px 0px 0px 20px; + padding: 0px 0px 0px 10px; +} + +.page-contents li { + margin: 0px 0px 0px 20px; + padding: 0px 0px 0px 0px; +} + +/* Forms */ +.form-container table { + margin: 0 0 0 80px; +} + +.form-error { + background-color: red; + font-weight: bold; +} + +.form-error,.form-error * { + color: yellow; + padding: 2px; +} + +/* List views */ +.list-view th,.list-view td { + padding: 0 15px 0 0; +} + +/* Log entries */ +tr.log-entry-error,tr.log-entry-error * { + background-color: #ff0000; + color: #ffff00; +} + +tr.log-entry-warning,tr.log-entry-warning * { + background-color: #ffff00; + color: #0000ff; +} + +tr.log-entry-info,tr.log-entry-info * { + background-color: #ffffff; + color: #000000; +} + +tr.log-entry-debug,tr.log-entry-debug * { + background-color: #afffff; + color: #000000; +} + +tr.log-entry-trace,tr.log-entry-trace * { + background-color: #afffaf; + color: #000000; +} + +.unread-msg * { + font-weight: bold; +} \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/pom.xml b/legacyworlds-web/legacyworlds-web-admin/pom.xml new file mode 100644 index 0000000..5d1f361 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/pom.xml @@ -0,0 +1,95 @@ + + 4.0.0 + + legacyworlds-web + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-web-admin + 5.99.1 + war + Legacy Worlds administration site + + + + com.deepclone.lw + legacyworlds-web-beans + ${project.version} + + + + javax.servlet + servlet-api + 2.5 + provided + + + + org.freemarker + freemarker + ${org.freemarker.version} + runtime + + + + com.thoughtworks.xstream + xstream + ${com.thoughtworks.xstream.version} + jar + + + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.0 + + + + legacyworlds-web/legacyworlds-web-admin/WebContent + + + + + + build-admin-war + package + + war + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BanhammerPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BanhammerPages.java new file mode 100644 index 0000000..c57ed04 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BanhammerPages.java @@ -0,0 +1,172 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bans.BanType; +import com.deepclone.lw.cmd.admin.bans.BansSummaryResponse; +import com.deepclone.lw.cmd.admin.bans.ListBansResponse; +import com.deepclone.lw.cmd.admin.bans.RejectBanResponse; +import com.deepclone.lw.cmd.admin.bans.RequestBanResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class BanhammerPages + extends PageControllerBase +{ + + @RequestMapping( "/bans" ) + public String bansSummary( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BansSummaryResponse response = this.getSession( AdminSession.class , request ).getBansSummary( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "bansSummary" , response ); + } + + + @RequestMapping( "/bans-{type}" ) + public String listBans( HttpServletRequest request , Model model , @PathVariable( "type" ) String sType ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BanType type; + try { + type = BanType.valueOf( sType.toUpperCase( ) ); + } catch ( IllegalArgumentException e ) { + return this.redirect( "bans" ); + } + + ListBansResponse response = this.getSession( AdminSession.class , request ).getBans( type ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + + return this.render( model , "internal" , "en" , "bans" , response ); + } + + + @RequestMapping( "/request-ban" ) + public String requestBan( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminResponse response = this.getSession( AdminSession.class , request ).noOp( Privileges.BANH ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "banRequest" , response ); + } + + + @RequestMapping( value = "/request-ban.action" , method = RequestMethod.POST ) + public String requestBan( HttpServletRequest request , Model model , @RequestParam( "eName" ) String eName , + @RequestParam( "eMail" ) String eMail , @RequestParam( "reason" ) String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean empire = "".equals( eMail ); + String user = empire ? eName : eMail; + + RequestBanResponse response = this.getSession( AdminSession.class , request ).requestBan( user , empire , + reason ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getError( ) == null ) { + return this.redirect( "bans" ); + } + return this.render( model , "internal" , "en" , "banRequest" , response ); + } + + + @RequestMapping( value = "reject-ban-{id}" ) + public String rejectBan( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bans-pending" ); + } + + AdminResponse response = this.getSession( AdminSession.class , request ).noOp( Privileges.BANH ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + + return this.renderMap( model , "internal" , "en" , "banReject" , "admin" , response.getAdmin( ) , "id" , id ); + } + + + @RequestMapping( value = "reject-ban-{id}.action" , method = RequestMethod.POST ) + public String rejectBan( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId , + @RequestParam( "reason" ) String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bans-pending" ); + } + + RejectBanResponse response = this.getSession( AdminSession.class , request ).rejectBan( id , reason ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( !response.isError( ) ) { + return this.redirect( "bans-pending" ); + } + + return this.render( model , "internal" , "en" , "banReject" , response ); + } + + + @RequestMapping( "confirm-ban-{id}.action" ) + public String confirmBan( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bans-pending" ); + } + + this.getSession( AdminSession.class , request ).confirmBan( id ); + return this.redirect( "bans-pending" ); + } + + + @RequestMapping( "lift-ban-{id}.action" ) + public String liftBan( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bans-validated" ); + } + + this.getSession( AdminSession.class , request ).liftBan( id ); + return this.redirect( "bans-validated" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BugTrackerPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BugTrackerPages.java new file mode 100644 index 0000000..95c4176 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/BugTrackerPages.java @@ -0,0 +1,373 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.bt.*; +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.msgs.MessageFormatter; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.BugTrackerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class BugTrackerPages + extends BugTrackerBase +{ + private static final int perPage = 20; + + private MessageFormatter formatter; + + + @Autowired( required = true ) + public void setFormatter( MessageFormatter formatter ) + { + this.formatter = formatter; + } + + + @RequestMapping( "/btracker" ) + public String getSummary( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugsSummaryResponse summary = this.getSession( AdminSession.class , request ).getBugsSummary( ); + if ( !summary.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "bugsSummary" , summary ); + } + + + @RequestMapping( "/bugs" ) + public String listBugs( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + AdminSession aSession = this.getSession( AdminSession.class , request ); + ListBugsResponse response = aSession.listBugs( query.status , query.ownOnly , query.first , perPage ); + return this.render( model , "internal" , "en" , "bugsList" , response ); + } + + + @RequestMapping( "/report-bug" ) + public String showReportForm( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + AdminSession aSession = this.getSession( AdminSession.class , request ); + Administrator admin = aSession.noOp( Privileges.BUGT ).getAdmin( ); + return this.renderMap( model , "internal" , "en" , "bugsReport" , "admin" , admin , "query" , query ); + } + + + @RequestMapping( value = "/report-bug.action" , method = RequestMethod.POST ) + public String postReport( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @RequestParam( "title" ) String title , + @RequestParam( "description" ) String description , + @RequestParam( value = "public" , required = false , defaultValue = "0" ) String publicReport ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + AdminSession aSession = this.getSession( AdminSession.class , request ); + ReportBugResponse response = aSession.reportBug( title , description , "1".equals( publicReport ) ); + + if ( response.getTitle( ) == null ) { + // Successful post + String rTo = "bug-" + response.getBugId( ) + this.makeGetParams( query ); + return this.redirect( rTo ); + } + + response = new ReportBugResponse( response , query ); + return this.render( model , "internal" , "en" , "bugsReport" , response ); + } + + + @RequestMapping( value = "/bug-{id}" ) + public String viewBug( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugs" + this.makeGetParams( query ) ); + } + + ViewBugResponse response = this.getSession( AdminSession.class , request ).getBugReport( bugId ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getReport( ) == null ) { + return this.redirect( "bugs" + this.makeGetParams( query ) ); + } + + response = new ViewBugResponse( response , query ); + return this.displayReport( model , response ); + } + + + @RequestMapping( value = "/bug-{id}-comment.action" , method = RequestMethod.POST ) + public String commentBug( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "comment" ) String comment , @RequestParam( "visibility" ) String visibility ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + PostCommentResponse response = this.getSession( AdminSession.class , request ).postBugComment( bugId , comment , + "1".equals( visibility ) ); + if ( response.isPosted( ) ) { + String rTo = "bug-" + bugId + this.makeGetParams( query ); + return this.redirect( rTo ); + } else if ( response.getReport( ) == null ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + response = new PostCommentResponse( response , query ); + return this.displayReport( model , response ); + } + + + private String displayReport( Model model , ViewBugResponse response ) + { + for ( BugEvent event : response.getEvents( ) ) { + if ( event.getTitle( ) != null ) { + event.setTitle( this.formatter.cleanMessage( event.getTitle( ) ) ); + } + if ( event.getContents( ) != null ) { + event.setContents( this.formatter.formatMessage( event.getContents( ) , false ) ); + } + } + return this.render( model , "internal" , "en" , "bugsView" , response ); + } + + + @RequestMapping( value = "/bug-{id}-comment-moderation.action" , method = RequestMethod.POST ) + public String moderateComment( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "comment" ) String sComment , @RequestParam( "cAction" ) String validate ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + long commentId; + try { + commentId = Long.parseLong( sComment ); + } catch ( NumberFormatException e ) { + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + this.getSession( AdminSession.class , request ).moderateBugComment( commentId , "1".equals( validate ) ); + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + + @RequestMapping( value = "/bug-{id}-validation.action" , method = RequestMethod.POST ) + public String moderateReport( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "nStatus" ) String sNewStatus , @RequestParam( "visibility" ) String visibility , + @RequestParam( "credits" ) String sCredits , @RequestParam( "snapshot" ) String keepSnapshot ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + BugStatus newStatus; + try { + newStatus = BugStatus.valueOf( sNewStatus ); + } catch ( IllegalArgumentException e ) { + newStatus = BugStatus.PENDING; + } + + boolean visible = "1".equals( visibility ); + boolean snapshot = "1".equals( keepSnapshot ); + int grantCredits; + try { + grantCredits = Integer.parseInt( sCredits ); + } catch ( NumberFormatException e ) { + grantCredits = -1; + } + if ( grantCredits < 0 || grantCredits > 3 || newStatus == BugStatus.PENDING ) { + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + this.getSession( AdminSession.class , request ).validateReport( bugId , newStatus , visible , grantCredits , + snapshot ); + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + + @RequestMapping( value = "/bug-{id}-status.action" , method = RequestMethod.POST ) + public String setReportStatus( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "nStatus" ) String sNewStatus ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + BugStatus newStatus; + try { + newStatus = BugStatus.valueOf( sNewStatus ); + } catch ( IllegalArgumentException e ) { + newStatus = BugStatus.PENDING; + } + + if ( newStatus != BugStatus.PENDING ) { + this.getSession( AdminSession.class , request ).setReportStatus( bugId , newStatus ); + } + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + + @RequestMapping( value = "/bug-{id}-visibility.action" , method = RequestMethod.POST ) + public String toggleReportVisibility( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + this.getSession( AdminSession.class , request ).toggleReportVisibility( bugId ); + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + + @RequestMapping( value = "/bug-{id}-merge.action" , method = RequestMethod.POST ) + public String mergeReports( HttpServletRequest request , Model model , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "mergeId" ) String sMerge ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + long mergeId; + try { + mergeId = Long.parseLong( sMerge ); + } catch ( NumberFormatException e ) { + return this.redirect( "bug-" + bugId + this.makeGetParams( query ) ); + } + + MergeReportsResponse response = this.getSession( AdminSession.class , request ).mergeReports( bugId , mergeId ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getReport( ) == null ) { + if ( response.getMergeError( ) == null ) { + return this.redirect( "bug-" + mergeId + this.makeGetParams( query ) ); + } else { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + } + + response = new MergeReportsResponse( response , query ); + return this.displayReport( model , response ); + } + + + @RequestMapping( "/bug-{id}-xmlsnapshot" ) + public ResponseEntity< String > downloadSnapshot( HttpServletRequest request , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return new ResponseEntity< String >( "GTFO" , HttpStatus.NOT_FOUND ); + } + + GetSnapshotResponse response = this.getSession( AdminSession.class , request ).getSnapshot( bugId ); + if ( !response.isPrivilegeOk( ) ) { + return new ResponseEntity< String >( "GTFO" , HttpStatus.FORBIDDEN ); + } else if ( response.getSnapshot( ) == null ) { + return new ResponseEntity< String >( "GTFO" , HttpStatus.NOT_FOUND ); + } + + HttpHeaders rHeaders = new HttpHeaders( ); + rHeaders.setContentType( MediaType.APPLICATION_OCTET_STREAM ); + return new ResponseEntity< String >( response.getSnapshot( ) , rHeaders , HttpStatus.OK ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ConstantsPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ConstantsPages.java new file mode 100644 index 0000000..5bacd2e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ConstantsPages.java @@ -0,0 +1,64 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.constants.GetConstantsResponse; +import com.deepclone.lw.cmd.admin.constants.SetConstantResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class ConstantsPages + extends PageControllerBase +{ + + @RequestMapping( "/constants" ) + public String getConstants( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession session = this.getSession( AdminSession.class , request ); + GetConstantsResponse response = session.getConstants( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "constants" , response ); + } + + + @RequestMapping( value = "/set-constant.action" , method = RequestMethod.POST ) + public String setConstant( HttpServletRequest request , Model model , @RequestParam( "name" ) String name , + @RequestParam( "value" ) String sValue ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + double value; + try { + value = Double.parseDouble( sValue ); + } catch ( NumberFormatException e ) { + return this.redirect( "constants" ); + } + + AdminSession session = this.getSession( AdminSession.class , request ); + SetConstantResponse response = session.setConstant( name , value ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( !response.isError( ) ) { + return this.redirect( "constants" ); + } + + return this.render( model , "internal" , "en" , "constants" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ErrorHandlerBean.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ErrorHandlerBean.java new file mode 100644 index 0000000..b3ff978 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/ErrorHandlerBean.java @@ -0,0 +1,44 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionIdentifierException; +import com.deepclone.lw.web.beans.session.SessionServerException; + + + +public class ErrorHandlerBean + implements HandlerExceptionResolver +{ + + @Override + public ModelAndView resolveException( HttpServletRequest request , HttpServletResponse response , Object handler , + Exception ex ) + { + if ( ex instanceof SessionServerException ) { + return this.offline( request ); + } else if ( ex instanceof SessionIdentifierException || ex instanceof SessionCommandException ) { + return new ModelAndView( "redirect:admin-session" ); + } + + // Other exceptions are not handled + return null; + } + + + private ModelAndView offline( HttpServletRequest request ) + { + ModelAndView mav = new ModelAndView( "ROOT" ); + mav.addObject( "container" , "external" ); + mav.addObject( "language" , "en" ); + mav.addObject( "type" , "offline" ); + return mav; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/I18NPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/I18NPages.java new file mode 100644 index 0000000..b6e7d14 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/I18NPages.java @@ -0,0 +1,131 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.i18n.ChangeLanguageResponse; +import com.deepclone.lw.cmd.admin.i18n.GetLanguageResponse; +import com.deepclone.lw.cmd.admin.i18n.I18NString; +import com.deepclone.lw.cmd.admin.i18n.SetStringResponse; +import com.deepclone.lw.cmd.admin.i18n.ViewLanguagesResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.admin.i18ne.LanguageExport; +import com.deepclone.lw.web.admin.i18ne.StringExport; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; +import com.thoughtworks.xstream.XStream; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class I18NPages + extends PageControllerBase +{ + + @RequestMapping( "/i18n" ) + public String listLanguages( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ViewLanguagesResponse response = this.getSession( AdminSession.class , request ).listLanguages( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "languages" , response ); + } + + + @RequestMapping( "/i18n-{language}" ) + public String viewLanguage( HttpServletRequest request , Model model , @PathVariable( "language" ) String language ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetLanguageResponse response = this.getSession( AdminSession.class , request ).getLanguage( language ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getLanguage( ) == null ) { + return this.redirect( "i18n" ); + } + return this.render( model , "internal" , "en" , "language" , response ); + } + + + @RequestMapping( "/i18n-export-{language}" ) + public ResponseEntity< String > exportLanguage( HttpServletRequest request , + @PathVariable( "language" ) String language ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + HttpHeaders rHeaders = new HttpHeaders( ); + GetLanguageResponse response = this.getSession( AdminSession.class , request ).getLanguage( language ); + + if ( !response.isPrivilegeOk( ) ) { + return new ResponseEntity< String >( "GTFO" , HttpStatus.FORBIDDEN ); + } else if ( response.getLanguage( ) == null ) { + return new ResponseEntity< String >( "GTFO" , HttpStatus.NOT_FOUND ); + } + + LanguageExport lExport = new LanguageExport( ); + lExport.id = response.getLanguage( ).getId( ); + lExport.name = response.getLanguage( ).getName( ); + for ( I18NString str : response.getStrings( ) ) { + StringExport sExport = new StringExport( ); + sExport.id = str.getId( ); + sExport.value = str.getText( ); + lExport.strings.add( sExport ); + } + + XStream xStream = new XStream( ); + xStream.autodetectAnnotations( true ); + rHeaders.setContentType( MediaType.APPLICATION_OCTET_STREAM ); + return new ResponseEntity< String >( xStream.toXML( lExport ) , rHeaders , HttpStatus.OK ); + } + + + @RequestMapping( value = "/i18n-{language}-edit.action" , method = RequestMethod.POST ) + public String changeLanguage( HttpServletRequest request , Model model , + @PathVariable( "language" ) String language , @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ChangeLanguageResponse response; + response = this.getSession( AdminSession.class , request ).setLanguageName( language , name ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getLanguage( ) == null ) { + return this.redirect( "i18n" ); + } else if ( !response.isNameError( ) ) { + return this.redirect( "i18n-" + response.getLanguage( ).getId( ) ); + } + return this.render( model , "internal" , "en" , "language" , response ); + } + + + @RequestMapping( value = "/i18n-{language}-set-string.action" , method = RequestMethod.POST ) + public String setString( HttpServletRequest request , Model model , @PathVariable( "language" ) String language , + @RequestParam( "string" ) String string , @RequestParam( "value" ) String value ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + SetStringResponse response; + response = this.getSession( AdminSession.class , request ).setTranslation( language , string , value ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getLanguage( ) == null ) { + return this.redirect( "i18n" ); + } else if ( response.getEdited( ) == null ) { + return this.redirect( "i18n-" + response.getLanguage( ).getId( ) ); + } + return this.render( model , "internal" , "en" , "language" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LogPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LogPages.java new file mode 100644 index 0000000..4f60c6b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LogPages.java @@ -0,0 +1,144 @@ +package com.deepclone.lw.web.admin; + + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.deepclone.lw.cmd.admin.logs.GetEntryResponse; +import com.deepclone.lw.cmd.admin.logs.LogLevel; +import com.deepclone.lw.cmd.admin.logs.LogType; +import com.deepclone.lw.cmd.admin.logs.ViewLogResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class LogPages + extends PageControllerBase +{ + private final int pageSize = 30; + + + @RequestMapping( value = "/logs" , method = RequestMethod.GET ) + public String viewLogs( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int first = this.getFirstIndex( request ); + LogType logType = this.getLogType( request ); + LogLevel logLevel = this.getLogLevel( request ); + String component = request.getParameter( "component" ); + if ( component == null ) { + component = ""; + } else { + component = component.trim( ).toLowerCase( ); + } + boolean excOnly = "1".equals( request.getParameter( "excOnly" ) ); + + AdminSession aSession = this.getSession( AdminSession.class , request ); + ViewLogResponse response = aSession.viewLog( logType , first , pageSize , logLevel , component , excOnly ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + + Map< String , Object > params = new HashMap< String , Object >( ); + params.put( "type" , logType ); + params.put( "level" , logLevel ); + params.put( "component" , component ); + params.put( "excOnly" , (Boolean) excOnly ); + params.put( "first" , first ); + + Map< String , Object > data = new HashMap< String , Object >( ); + data.put( "admin" , response.getAdmin( ) ); + data.put( "entries" , response.getEntries( ) ); + data.put( "count" , response.getCount( ) ); + data.put( "params" , params ); + + return this.render( model , "internal" , "en" , "logs" , data ); + } + + + private int getFirstIndex( HttpServletRequest request ) + { + String sIndex = request.getParameter( "first" ); + if ( sIndex == null ) { + return 0; + } + int f; + try { + f = Integer.parseInt( sIndex ); + } catch ( NumberFormatException e ) { + return 0; + } + return ( f > 0 ) ? f : 0; + } + + + private LogType getLogType( HttpServletRequest request ) + { + LogType logType; + String sLogType = request.getParameter( "logType" ); + if ( sLogType == null ) { + logType = LogType.SYSTEM; + } else { + try { + logType = LogType.valueOf( sLogType ); + } catch ( IllegalArgumentException e ) { + logType = LogType.SYSTEM; + } + } + return logType; + } + + + private LogLevel getLogLevel( HttpServletRequest request ) + { + LogLevel logLevel; + String sLogLevel = request.getParameter( "logLevel" ); + if ( sLogLevel == null ) { + logLevel = LogLevel.INFO; + } else { + try { + logLevel = LogLevel.valueOf( sLogLevel ); + } catch ( IllegalArgumentException e ) { + logLevel = LogLevel.INFO; + } + } + return logLevel; + } + + + @RequestMapping( "/view-log-entry-{id}" ) + public String viewLogEntry( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "logs" ); + } + + GetEntryResponse response = this.getSession( AdminSession.class , request ).getLogEntry( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getEntry( ) == null ) { + return this.redirect( "logs" ); + } + + return this.render( model , "internal" , "en" , "logEntry" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LoginPage.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LoginPage.java new file mode 100644 index 0000000..14aae05 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/LoginPage.java @@ -0,0 +1,53 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = false , redirectTo = "admin-session" ) +public class LoginPage + extends PageControllerBase +{ + @RequestMapping( value = "/" ) + public String root( HttpServletRequest request , Model model ) + { + return this.redirect( "login" ); + } + + @RequestMapping( value = "/login" ) + public String login( HttpServletRequest request , Model model ) + { + return this.renderMap( model , "external" , "en" , "login" , "failed" , (Boolean) false ); + } + + + @RequestMapping( value = "/login.action" , method = RequestMethod.POST ) + public String login( HttpServletRequest request , Model model , @RequestParam( "mail" ) String mail , + @RequestParam( "password" ) String password ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession aSession = this.initSession( AdminSession.class , request ); + boolean authenticated = aSession.authenticate( mail , password ); + if ( !authenticated ) { + this.clearSession( request ); + return this.renderMap( model , "external" , "en" , "login" , "failed" , (Boolean) true ); + } + return this.redirect( "admin-session" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MaintenancePages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MaintenancePages.java new file mode 100644 index 0000000..052e5c0 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MaintenancePages.java @@ -0,0 +1,89 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.mntm.*; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class MaintenancePages + extends PageControllerBase +{ + + @RequestMapping( "/maintenance" ) + public String getMaintenanceStatus( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + MaintenanceStatusResponse response = this.getSession( AdminSession.class , request ).getMaintenanceStatus( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "maintenance" , response ); + } + + + @RequestMapping( value = "/maintenance-start.action" , method = RequestMethod.POST ) + public String enableMaintenance( HttpServletRequest request , Model model , + @RequestParam( "reason" ) String reason , @RequestParam( "duration" ) String sDuration ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int duration; + try { + duration = Integer.parseInt( sDuration ); + } catch ( NumberFormatException e ) { + duration = -1; + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + MaintenanceChangeResponse response = aSession.enableMaintenance( reason , duration ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getNewReason( ) == null ) { + return this.redirect( "maintenance" ); + } + + return this.render( model , "internal" , "en" , "maintenance" , response ); + } + + + @RequestMapping( value = "/maintenance-extend.action" , method = RequestMethod.POST ) + public String extendMaintenance( HttpServletRequest request , Model model , + @RequestParam( "duration" ) String sDuration ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int duration; + try { + duration = Integer.parseInt( sDuration ); + } catch ( NumberFormatException e ) { + duration = -1; + } + + this.getSession( AdminSession.class , request ).extendMaintenance( duration ); + return this.redirect( "maintenance" ); + } + + + @RequestMapping( value = "/maintenance-end.action" , method = RequestMethod.POST ) + public String endMaintenance( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( AdminSession.class , request ).endMaintenance( ); + return this.redirect( "maintenance" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessageBoxView.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessageBoxView.java new file mode 100644 index 0000000..42c879e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessageBoxView.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.web.admin; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Administrator; +import com.deepclone.lw.cmd.msgdata.MessageListEntry; + + + +public class MessageBoxView + extends AdminResponse +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private int pages; + private int cPage; + private final List< MessageListEntry > messages = new LinkedList< MessageListEntry >( ); + + + public MessageBoxView( Administrator admin , boolean inbox ) + { + super( admin ); + this.inbox = inbox; + } + + + public int getPages( ) + { + return pages; + } + + + public void setPages( int pages ) + { + this.pages = pages; + } + + + public int getcPage( ) + { + return cPage; + } + + + public void setcPage( int cPage ) + { + this.cPage = cPage; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public List< MessageListEntry > getMessages( ) + { + return messages; + } + + + public void addMessage( MessageListEntry entry ) + { + this.messages.add( entry ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessagesPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessagesPages.java new file mode 100644 index 0000000..5b61879 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/MessagesPages.java @@ -0,0 +1,453 @@ +package com.deepclone.lw.web.admin; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.msg.*; +import com.deepclone.lw.cmd.msgdata.*; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.msgs.MessageFormatter; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class MessagesPages + extends PageControllerBase +{ + + private final static int perPage = 30; + + private MessageFormatter formatter; + + + @Autowired( required = true ) + public void setFormatter( MessageFormatter formatter ) + { + this.formatter = formatter; + } + + + @RequestMapping( "/messages" ) + public String viewInbox( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + MessageBoxView view = this.viewMessageBox( true , this.getSession( AdminSession.class , request ) , 0 ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + @RequestMapping( "/inbox-{page}" ) + public String viewInbox( HttpServletRequest request , Model model , @PathVariable( "page" ) String sPage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + + MessageBoxView view = this.viewMessageBox( true , this.getSession( AdminSession.class , request ) , page ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + @RequestMapping( "/inbox-from-{id}" ) + public String viewInboxFrom( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + id = 0; + } + + MessageBoxView view = this.viewMessageBoxFrom( true , this.getSession( AdminSession.class , request ) , id ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + @RequestMapping( "/outbox" ) + public String viewOutbox( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + MessageBoxView view = this.viewMessageBox( false , this.getSession( AdminSession.class , request ) , 0 ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + @RequestMapping( "/outbox-{page}" ) + public String viewOutbox( HttpServletRequest request , Model model , @PathVariable( "page" ) String sPage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + + MessageBoxView view = this.viewMessageBox( false , this.getSession( AdminSession.class , request ) , page ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + @RequestMapping( "/outbox-from-{id}" ) + public String viewOutboxFrom( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + id = 0; + } + + MessageBoxView view = this.viewMessageBoxFrom( false , this.getSession( AdminSession.class , request ) , id ); + return this.render( model , "internal" , "en" , "messageBox" , view ); + } + + + private MessageBoxView viewMessageBox( boolean inbox , AdminSession aSession , int page ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetMessagesResponse mResponse = aSession.getMessages( inbox ); + MessageBoxView view = new MessageBoxView( mResponse.getAdmin( ) , inbox ); + List< MessageListEntry > messages = mResponse.getMessages( ); + + // Handle paging + messages = this.setPage( view , messages , page ); + this.prepareMessages( view , messages ); + + return view; + } + + + private MessageBoxView viewMessageBoxFrom( boolean inbox , AdminSession pSession , long fromId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetMessagesResponse mResponse = pSession.getMessages( inbox ); + MessageBoxView view = new MessageBoxView( mResponse.getAdmin( ) , inbox ); + List< MessageListEntry > messages = mResponse.getMessages( ); + int page = 0; + int nSeen = -1; + for ( MessageListEntry e : messages ) { + nSeen++; + if ( e.getId( ) != fromId ) { + continue; + } + page = ( nSeen - nSeen % MessagesPages.perPage ) / MessagesPages.perPage; + break; + } + + // Handle paging + messages = this.setPage( view , messages , page ); + this.prepareMessages( view , messages ); + + return view; + } + + + private void prepareMessages( MessageBoxView view , List< MessageListEntry > messages ) + { + for ( MessageListEntry message : messages ) { + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + view.addMessage( message ); + } + } + + + private List< MessageListEntry > setPage( MessageBoxView view , List< MessageListEntry > messages , int page ) + { + int nMessages = messages.size( ); + int mod = nMessages % MessagesPages.perPage; + int nPages = ( nMessages - mod ) / MessagesPages.perPage + ( mod > 0 ? 1 : 0 ); + if ( page < 0 ) { + page = 0; + } else if ( page >= nPages ) { + page = nPages - 1; + } + if ( !messages.isEmpty( ) ) { + messages = messages.subList( page * MessagesPages.perPage , Math.min( ( page + 1 ) * MessagesPages.perPage , + nMessages ) ); + } + + view.setPages( nPages ); + view.setcPage( page ); + return messages; + } + + + @RequestMapping( "/inbox-message-{id}" ) + public String viewInboxMessage( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.viewMessage( request , model , sId , true ); + } + + + @RequestMapping( "/outbox-message-{id}" ) + public String viewOutboxMessage( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.viewMessage( request , model , sId , false ); + } + + + private String viewMessage( HttpServletRequest request , Model model , String sId , boolean inbox ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + ReadMessageResponse response = aSession.readMessage( inbox , id ); + Message message = response.getMessage( ); + if ( message == null ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + boolean internal = ( message.getType( ) == MessageType.INTERNAL ); + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + message.setContents( this.formatter.formatMessage( message.getContents( ) , internal ) ); + + return this.render( model , "internal" , "en" , "message" , response ); + } + + + @RequestMapping( value = "/messages.action" , method = RequestMethod.POST ) + public String mbAction( HttpServletRequest request , Model model , @RequestParam( "inbox" ) String sInbox , + @RequestParam( "page" ) String sPage , @RequestParam( "target" ) String sTarget , + @RequestParam( "action" ) String action , + @RequestParam( value = "selection" , required = false ) String[] sSelection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean inbox = "1".equals( sInbox ); + if ( !inbox ) { + action = "d"; + } + + boolean useSelected = "0".equals( sTarget ); + long selection[]; + if ( useSelected ) { + List< Long > rSel = new LinkedList< Long >( ); + if ( sSelection != null ) { + for ( String sItem : sSelection ) { + Long value; + try { + value = Long.parseLong( sItem ); + } catch ( NumberFormatException e ) { + continue; + } + rSel.add( value ); + } + + selection = new long[ rSel.size( ) ]; + int i = 0; + for ( Long value : rSel ) { + selection[ i++ ] = value; + } + } else { + selection = new long[ 0 ]; + } + } else { + selection = null; + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + if ( selection == null || selection.length > 0 ) { + if ( "d".equals( action ) ) { + aSession.deleteMessages( inbox , selection ); + } else if ( "r".equals( action ) ) { + aSession.markRead( selection ); + } else if ( "u".equals( action ) ) { + aSession.markUnread( selection ); + } + } + + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-" + page ); + } + + + @RequestMapping( value = "/message.action" , method = RequestMethod.POST ) + public String msgAction( HttpServletRequest request , Model model , @RequestParam( "inbox" ) String sInbox , + @RequestParam( "id" ) String sId , @RequestParam( "next" ) String sNext , + @RequestParam( value = "delete" , required = false ) String delete , + @RequestParam( value = "reply" , required = false ) String reply ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean inbox = "1".equals( sInbox ); + + long id; + try { + id = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + if ( delete != null ) { + aSession.deleteMessages( inbox , new long[] { + id + } ); + + try { + id = Long.parseLong( sNext ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-message-" + id ); + } else if ( reply != null ) { + ComposeMessageResponse response; + response = aSession.replyTo( inbox , id ); + return this.showWriter( model , response ); + } + return this.redirect( inbox ? "messages" : "outbox" ); + } + + + @RequestMapping( "/compose-message" ) + public String composeNew( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession aSession = this.getSession( AdminSession.class , request ); + return this.render( model , "internal" , "en" , "messageWriter" , aSession.initNewMessage( ) ); + } + + + @RequestMapping( "/msg-empire-{id}" ) + public String messageEmpire( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.newMessageTo( request , model , MessageType.EMPIRE , sId ); + } + + + @RequestMapping( "/msg-admin-{id}" ) + public String messageAdmin( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.newMessageTo( request , model , MessageType.ADMINISTRATOR , sId ); + } + + + @RequestMapping( value = "/send-message.action" , method = RequestMethod.POST ) + public String sendMessage( HttpServletRequest request , Model model , @RequestParam( "toType" ) String sToType , + @RequestParam( "toName" ) String toName , @RequestParam( "title" ) String title , + @RequestParam( "contents" ) String contents , + @RequestParam( value = "rtInbox" , required = false ) String sRtInbox , + @RequestParam( value = "rtId" , required = false ) String sRtId , + @RequestParam( value = "cancel" , required = false ) String sCancel ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + // Handle cancellation + if ( sCancel != null ) { + return this.cancelSendRedirect( sRtInbox , sRtId ); + } + + // Get message type + MessageType type; + try { + type = MessageType.valueOf( sToType ); + } catch ( IllegalArgumentException e ) { + type = MessageType.INTERNAL; + } + if ( type == MessageType.INTERNAL ) { + type = MessageType.EMPIRE; + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + ComposeMessageResponse response; + if ( sRtInbox == null || sRtId == null ) { + response = aSession.sendMessage( type , toName , title , contents ); + } else { + boolean inbox = "1".equals( sRtInbox ); + long rtId; + try { + rtId = Long.parseLong( sRtId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + response = aSession.sendReply( inbox , rtId , type , toName , title , contents ); + } + + if ( !response.isError( ) ) { + return this.cancelSendRedirect( sRtInbox , sRtId ); + } + return this.showWriter( model , response ); + } + + + private String newMessageTo( HttpServletRequest request , Model model , MessageType type , String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "compose-message" ); + } + + ComposeMessageResponse response; + response = this.getSession( AdminSession.class , request ).messageTo( type , id ); + return this.showWriter( model , response ); + } + + + private String showWriter( Model model , ComposeMessageResponse response ) + { + if ( response.getReplyTo( ) != null ) { + Message message = response.getReplyTo( ); + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + message.setContents( this.formatter.formatMessage( message.getContents( ) , false ) ); + } + return this.render( model , "internal" , "en" , "messageWriter" , response ); + } + + + private String cancelSendRedirect( String sRtInbox , String sRtId ) + { + if ( sRtInbox == null || sRtId == null ) { + return this.redirect( "messages" ); + } + + boolean inbox = "1".equals( sRtInbox ); + long rtId; + try { + rtId = Long.parseLong( sRtId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-message-" + rtId ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/NamesPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/NamesPages.java new file mode 100644 index 0000000..0d1ad44 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/NamesPages.java @@ -0,0 +1,107 @@ +package com.deepclone.lw.web.admin; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.naming.*; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class NamesPages + extends PageControllerBase +{ + + @RequestMapping( "/names" ) + public String listNameTypes( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + NamesSummaryResponse response = this.getSession( AdminSession.class , request ).getNameSummary( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "namesSummary" , response ); + } + + + @RequestMapping( "/names-{type}" ) + public String listNames( HttpServletRequest request , Model model , @PathVariable( "type" ) String sType ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + NameType type; + try { + type = NameType.valueOf( sType.toUpperCase( ).replace( "-" , "_" ) ); + } catch ( IllegalArgumentException e ) { + return this.redirect( "names" ); + } + + GetNamesResponse response = this.getSession( AdminSession.class , request ).getNames( type ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "names" , response ); + } + + + @RequestMapping( value = "/names-{type}.action" , method = RequestMethod.POST ) + public String namesAction( HttpServletRequest request , Model model , @PathVariable( "type" ) String sType , + @RequestParam( "action" ) String sAction , @RequestParam( value = "ids" , required = false ) String[] sIds ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + // Parse type + NameType type; + try { + type = NameType.valueOf( sType.toUpperCase( ).replace( "-" , "_" ) ); + } catch ( IllegalArgumentException e ) { + return this.redirect( "names" ); + } + + // Parse action + NameAction action; + try { + action = NameAction.valueOf( sAction ); + } catch ( IllegalArgumentException e ) { + return this.redirect( "names-" + type.toString( ).toLowerCase( ).replace( "_" , "-" ) ); + } + + // Parse identifiers + List< Integer > lIds = new LinkedList< Integer >( ); + if ( sIds != null ) { + for ( String s : sIds ) { + try { + lIds.add( Integer.parseInt( s ) ); + } catch ( NumberFormatException e ) { + // EMPTY + } + } + } + if ( lIds.isEmpty( ) ) { + return this.redirect( "names-" + type.toString( ).toLowerCase( ).replace( "_" , "-" ) ); + } + int[] ids = new int[ lIds.size( ) ]; + int i = 0; + for ( Integer v : lIds ) { + ids[ i++ ] = v.intValue( ); + } + + this.getSession( AdminSession.class , request ).namesAction( type , action , ids ); + return this.redirect( "names-" + type.toString( ).toLowerCase( ).replace( "_" , "-" ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PasswordPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PasswordPages.java new file mode 100644 index 0000000..1d2726e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PasswordPages.java @@ -0,0 +1,51 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.SetPasswordResponse; +import com.deepclone.lw.cmd.admin.SetPasswordResponse.PasswordChangeStatus; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "login" ) +public class PasswordPages + extends PageControllerBase +{ + + @RequestMapping( "/change-password" ) + public String changePassword( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession aSession = this.getSession( AdminSession.class , request ); + return this.render( model , "internal" , "en" , "changePassword" , aSession.noOp( ) ); + } + + + @RequestMapping( value = "/change-password.action" , method = RequestMethod.POST ) + public String changePassword( HttpServletRequest request , Model model , @RequestParam( "current" ) String current , + @RequestParam( "password" ) String pass1 , @RequestParam( "passwordConfirm" ) String pass2 ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession aSession = this.getSession( AdminSession.class , request ); + SetPasswordResponse response = aSession.changePassword( current , pass1 , pass2 ); + if ( !response.isAuthError( ) && response.getPasswordError( ) == PasswordChangeStatus.OK ) { + return this.redirect( "admin-session" ); + } + + return this.render( model , "internal" , "en" , "changePassword" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PreferencesPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PreferencesPages.java new file mode 100644 index 0000000..b4fd39c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/PreferencesPages.java @@ -0,0 +1,48 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.prefs.PrefDefaultsResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class PreferencesPages + extends PageControllerBase +{ + + @RequestMapping( "/prefs" ) + public String listPrefDefaults( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PrefDefaultsResponse response = this.getSession( AdminSession.class , request ).getPrefDefaults( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "preferences" , response ); + } + + + @RequestMapping( value = "/prefs.action" , method = RequestMethod.POST ) + public String setPrefDefault( HttpServletRequest request , Model model , @RequestParam( "pref" ) String pref , + @RequestParam( "value" ) String value ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( AdminSession.class , request ).setPrefDefault( pref , value ); + return this.redirect( "prefs" ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SessionPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SessionPages.java new file mode 100644 index 0000000..1537b9c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SessionPages.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.ClientSessionReference; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "login" ) +public class SessionPages + extends PageControllerBase +{ + @RequestMapping( "/admin-session" ) + public String login( HttpServletRequest request , Model model ) + { + ClientSessionReference cReference = (ClientSessionReference) request.getSession( ).getAttribute( "sReference" ); + String type = cReference.getReference( ).extra; + if ( "pass".equals( type ) ) { + return this.redirect( "change-password" ); + } + + return this.redirect( "main" ); + } + + + @RequestMapping( "/main" ) + public String main( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession session = this.getSession( AdminSession.class , request ); + return this.render( model , "internal" , "en" , "main" , session.getOverview( ) ); + } + + + @RequestMapping( value = "/logout.action" ) + public String validation( HttpServletRequest request , Model model ) + throws SessionServerException , SessionException + { + this.getSession( AdminSession.class , request ).terminate( ); + return this.redirect( "login" ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SpamPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SpamPages.java new file mode 100644 index 0000000..e9a41c1 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SpamPages.java @@ -0,0 +1,89 @@ +package com.deepclone.lw.web.admin; + + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.msgs.MessageFormatter; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "admin-session" , subType = "main" ) +public class SpamPages + extends PageControllerBase +{ + + private MessageFormatter formatter; + + + @Autowired( required = true ) + public void setFormatter( MessageFormatter formatter ) + { + this.formatter = formatter; + } + + + @RequestMapping( "/send-spam" ) + public String sendSpam( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminResponse response = this.getSession( AdminSession.class , request ).noOp( Privileges.SPAM ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + + return this.render( model , "internal" , "en" , "spam" , response ); + } + + + @RequestMapping( value = "/send-spam.action" , method = RequestMethod.POST ) + public String sendSpam( HttpServletRequest request , Model model , @RequestParam( "title" ) String title , + @RequestParam( "body" ) String body , @RequestParam( value = "preview" , required = false ) String preview ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean tError , bError; + title = title.trim( ); + body = body.trim( ); + tError = ( title.length( ) < 5 || title.length( ) > 64 ); + bError = ( body.length( ) < 10 ); + + AdminResponse response; + if ( ( tError || bError || preview != null ) ) { + response = this.getSession( AdminSession.class , request ).noOp( Privileges.SPAM ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + } else { + this.getSession( AdminSession.class , request ).sendSpam( title , body ); + return this.redirect( "send-spam" ); + } + + Map< String , Object > data = new HashMap< String , Object >( ); + data.put( "admin" , response.getAdmin( ) ); + data.put( "title" , title ); + data.put( "body" , body ); + data.put( "preview" , this.formatter.formatMessage( body , false ) ); + data.put( "titleError" , (Boolean) tError ); + data.put( "bodyError" , (Boolean) bError ); + + return this.render( model , "internal" , "en" , "spam" , data ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SuperUserPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SuperUserPages.java new file mode 100644 index 0000000..479dadb --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/SuperUserPages.java @@ -0,0 +1,186 @@ +package com.deepclone.lw.web.admin; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.AdminResponse; +import com.deepclone.lw.cmd.admin.adata.Privileges; +import com.deepclone.lw.cmd.admin.su.AddAdministratorResponse; +import com.deepclone.lw.cmd.admin.su.ListAdministratorsResponse; +import com.deepclone.lw.cmd.admin.su.ViewAdministratorResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class SuperUserPages + extends PageControllerBase +{ + + @RequestMapping( "/admins" ) + public String listAdministrators( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ListAdministratorsResponse response = this.getSession( AdminSession.class , request ).listAdmins( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "admins" , response ); + } + + + @RequestMapping( "/add-admin" ) + public String addAdministrator( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminResponse response = this.getSession( AdminSession.class , request ).noOp( Privileges.SUPER ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "addAdmin" , response ); + } + + + @RequestMapping( value = "/add-admin.action" , method = RequestMethod.POST ) + public String addAdministrator( HttpServletRequest request , Model model , + @RequestParam( "address" ) String address , @RequestParam( "name" ) String name , + @RequestParam( value = "privileges" , required = false ) String[] sPrivs ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + List< Privileges > privs = this.getPrivileges( sPrivs ); + AddAdministratorResponse response; + response = this.getSession( AdminSession.class , request ).addAdmin( address , name , privs ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( !response.isError( ) ) { + return this.redirect( "admins" ); + } + + return this.render( model , "internal" , "en" , "addAdmin" , response ); + } + + + @RequestMapping( "/admin-{id}" ) + public String viewAdministrator( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "admins" ); + } + + ViewAdministratorResponse response = this.getSession( AdminSession.class , request ).viewAdministrator( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getView( ) == null ) { + return this.redirect( "admins" ); + } + return this.render( model , "internal" , "en" , "viewAdmin" , response ); + } + + + @RequestMapping( "/reset-admin-{id}.action" ) + public String resetAdministrator( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "admins" ); + } + + ViewAdministratorResponse response = this.getSession( AdminSession.class , request ).viewAdministrator( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getView( ) == null || response.getView( ).getPrivileges( ).isEmpty( ) ) { + return this.redirect( "admins" ); + } + return this.render( model , "internal" , "en" , "resetAdmin" , response ); + } + + + @RequestMapping( value = "/do-reset-admin-{id}.action" , method = RequestMethod.POST ) + public String confirmResetAdministrator( HttpServletRequest request , Model model , + @PathVariable( "id" ) String sId , @RequestParam( value = "cancel" , required = false ) String sCancel ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "admins" ); + } + + if ( sCancel != null ) { + return this.redirect( "admin-" + id ); + } + + ViewAdministratorResponse response = this.getSession( AdminSession.class , request ).resetAdministrator( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getView( ) == null ) { + return this.redirect( "admins" ); + } + return this.redirect( "admin-" + id ); + } + + + @RequestMapping( value = "/admin-privileges-{id}.action" , method = RequestMethod.POST ) + public String setPrivileges( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId , + @RequestParam( value = "privileges" , required = false ) String[] sPrivs ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "admins" ); + } + + List< Privileges > privs = this.getPrivileges( sPrivs ); + ViewAdministratorResponse response; + response = this.getSession( AdminSession.class , request ).setAdminPrivileges( id , privs ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getView( ) == null ) { + return this.redirect( "admins" ); + } + return this.redirect( "admin-" + id ); + } + + + private List< Privileges > getPrivileges( String[] sPrivs ) + { + List< Privileges > privs = new LinkedList< Privileges >( ); + if ( sPrivs != null ) { + for ( String sPriv : sPrivs ) { + try { + privs.add( Privileges.valueOf( sPriv ) ); + } catch ( IllegalArgumentException e ) { + // EMPTY + } + } + } + return privs; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/TickerPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/TickerPages.java new file mode 100644 index 0000000..09dbb13 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/TickerPages.java @@ -0,0 +1,101 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.tick.TickerStatusResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class TickerPages + extends PageControllerBase +{ + + @RequestMapping( "/ticker" ) + public String viewStatus( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + TickerStatusResponse response = this.getSession( AdminSession.class , request ).getTickerStatus( ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "ticker" , response ); + } + + + @RequestMapping( "/toggle-ticker.action" ) + public String toggleTicker( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( AdminSession.class , request ).toggleTicker( ); + return this.redirect( "ticker" ); + } + + + @RequestMapping( "/start-ticker-task-{id}.action" ) + public String startTask( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.setTickerTaskStatus( request , sId , true ); + } + + + @RequestMapping( "/stop-ticker-task-{id}.action" ) + public String stopTask( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.setTickerTaskStatus( request , sId , false ); + } + + + private String setTickerTaskStatus( HttpServletRequest request , String sId , boolean run ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "ticker" ); + } + this.getSession( AdminSession.class , request ).setTickerTaskStatus( id , run ); + return this.redirect( "ticker" ); + } + + + @RequestMapping( value = "/set-ticker-task-{id}.action" , method = RequestMethod.POST ) + public String setTaskDelay( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId , + @RequestParam( "delay" ) String sDelay , @RequestParam( "multiplier" ) String sMultiplier ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + long delay , multiplier; + try { + id = Integer.parseInt( sId ); + delay = Long.parseLong( sDelay ); + multiplier = Long.parseLong( sMultiplier ); + } catch ( NumberFormatException e ) { + return this.redirect( "ticker" ); + } + delay *= multiplier; + if ( delay <= 0 ) { + return this.redirect( "ticker" ); + } + this.getSession( AdminSession.class , request ).setTickerTaskStatus( id , delay ); + return this.redirect( "ticker" ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/UsersPages.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/UsersPages.java new file mode 100644 index 0000000..def95b1 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/UsersPages.java @@ -0,0 +1,144 @@ +package com.deepclone.lw.web.admin; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.deepclone.lw.cmd.admin.users.AccountStatus; +import com.deepclone.lw.cmd.admin.users.ListAccountsResponse; +import com.deepclone.lw.cmd.admin.users.ListSessionsResponse; +import com.deepclone.lw.cmd.admin.users.ViewAccountResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.AdminSession; + + + +@Controller +@SessionRequirement( value = true , subType = "main" , redirectTo = "admin-session" ) +public class UsersPages + extends PageControllerBase +{ + + @RequestMapping( "/users" ) + public String listUsers( HttpServletRequest request , Model model , + @RequestParam( value = "online" , required = false ) String sOnline ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AdminSession aSession = this.getSession( AdminSession.class , request ); + ListAccountsResponse list; + if ( "1".equals( sOnline ) ) { + list = aSession.listOnlineUsers( ); + } else { + list = aSession.listUsers( ); + } + if ( !list.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + + return this.render( model , "internal" , "en" , "users" , list ); + } + + + @RequestMapping( "/users-by-status" ) + public String listUsers( HttpServletRequest request , Model model , @RequestParam( "status" ) String sStatus , + @RequestParam( value = "online" , required = false ) String sOnline ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + AccountStatus status; + try { + status = AccountStatus.valueOf( sStatus ); + } catch ( IllegalArgumentException e ) { + return this.redirect( "users" + ( "1".equals( sOnline ) ? "?online=1" : "" ) ); + } + + AdminSession aSession = this.getSession( AdminSession.class , request ); + ListAccountsResponse list; + if ( "1".equals( sOnline ) ) { + list = aSession.listOnlineUsers( status ); + } else { + list = aSession.listUsers( status ); + } + if ( !list.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } + return this.render( model , "internal" , "en" , "users" , list ); + } + + + @RequestMapping( "/user-{id}" ) + public String viewUser( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "users" ); + } + + ViewAccountResponse response = this.getSession( AdminSession.class , request ).viewUser( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getAccount( ) == null ) { + return this.redirect( "users" ); + } + return this.render( model , "internal" , "en" , "user" , response ); + } + + + @RequestMapping( "/user-{id}-sessions" ) + public String viewUserSessions( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "users" ); + } + + ListSessionsResponse response = this.getSession( AdminSession.class , request ).viewUserSessions( id ); + if ( !response.isPrivilegeOk( ) ) { + return this.redirect( "main" ); + } else if ( response.getAccount( ) == null ) { + return this.redirect( "users" ); + } + return this.render( model , "internal" , "en" , "userSessions" , response ); + } + + + @RequestMapping( value = "/user-{id}.action" , method = RequestMethod.POST ) + public String grantCredits( HttpServletRequest request , Model model , @PathVariable( "id" ) String sId , + @RequestParam( "credits" ) String sCredits ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "users" ); + } + + int credits; + try { + credits = Integer.parseInt( sCredits ); + } catch ( NumberFormatException e ) { + credits = 0; + } + if ( credits > 0 ) { + this.getSession( AdminSession.class , request ).giveCredits( id , credits ); + } + return this.redirect( "user-" + id ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/LanguageExport.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/LanguageExport.java new file mode 100644 index 0000000..1e14932 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/LanguageExport.java @@ -0,0 +1,28 @@ +package com.deepclone.lw.web.admin.i18ne; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "language" ) +public class LanguageExport + implements Serializable +{ + @XStreamAsAttribute + public String id; + + @XStreamAsAttribute + public String name; + + @XStreamImplicit + public List< StringExport > strings = new LinkedList< StringExport >( ); + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/StringExport.java b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/StringExport.java new file mode 100644 index 0000000..76785c0 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/java/com/deepclone/lw/web/admin/i18ne/StringExport.java @@ -0,0 +1,21 @@ +package com.deepclone.lw.web.admin.i18ne; + + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; + + + +@SuppressWarnings( "serial" ) +@XStreamAlias( "inline-string" ) +public class StringExport + implements Serializable +{ + @XStreamAsAttribute + public String id; + + public String value; + +} diff --git a/legacyworlds-web/legacyworlds-web-admin/src/main/resources/log4j.properties b/legacyworlds-web/legacyworlds-web-admin/src/main/resources/log4j.properties new file mode 100644 index 0000000..774c437 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-admin/src/main/resources/log4j.properties @@ -0,0 +1,5 @@ +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n +log4j.rootLogger=warn, stdout \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-beans/.classpath b/legacyworlds-web/legacyworlds-web-beans/.classpath new file mode 100644 index 0000000..7c3d14f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-beans/.project b/legacyworlds-web/legacyworlds-web-beans/.project new file mode 100644 index 0000000..5702a99 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/.project @@ -0,0 +1,23 @@ + + + legacyworlds-web-beans + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/legacyworlds-web/legacyworlds-web-beans/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-web/legacyworlds-web-beans/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..34724f2 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +#Fri Apr 16 07:54:29 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-web/legacyworlds-web-beans/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-web/legacyworlds-web-beans/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..b3bba2f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Apr 16 07:54:27 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-web/legacyworlds-web-beans/pom.xml b/legacyworlds-web/legacyworlds-web-beans/pom.xml new file mode 100644 index 0000000..5560487 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + legacyworlds-web + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-web-beans + 5.99.1 + Legacy Worlds common web beans + Module for common web-related beans. + jar + + + + com.deepclone.lw + legacyworlds-session + ${project.version} + + + com.deepclone.lw + legacyworlds-utils + ${project.version} + + + + org.springframework + spring-core + ${org.springframework.version} + + + org.springframework + spring-context + ${org.springframework.version} + + + org.springframework + spring-webmvc + ${org.springframework.version} + + + + log4j + log4j + ${log4j.version} + + + + commons-dbcp + commons-dbcp + ${commons.dbcp.version} + + + + cglib + cglib + ${cglib.version} + + + + javax.servlet + servlet-api + 2.5 + provided + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/IEContentTypeBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/IEContentTypeBean.java new file mode 100644 index 0000000..69da9f9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/IEContentTypeBean.java @@ -0,0 +1,26 @@ +package com.deepclone.lw.web.beans.intercept; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + + + +public class IEContentTypeBean + extends HandlerInterceptorAdapter +{ + + @Override + public void postHandle( HttpServletRequest request , HttpServletResponse response , Object handler , + ModelAndView modelAndView ) + { + String userAgent = request.getHeader( "User-Agent" ); + if ( userAgent.contains( "MSIE" ) + && ( response.getContentType( ) == null || response.getContentType( ).startsWith( "application/xhtml+xml" ) ) ) { + response.setHeader( "Content-Type" , "text/html" ); + } + } +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/LanguageInterceptorBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/LanguageInterceptorBean.java new file mode 100644 index 0000000..f818348 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/LanguageInterceptorBean.java @@ -0,0 +1,159 @@ +package com.deepclone.lw.web.beans.intercept; + + +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import com.deepclone.lw.cmd.MaintenanceResponse; +import com.deepclone.lw.cmd.ext.ListLanguagesResponse; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.session.ClientSessionReference; +import com.deepclone.lw.web.beans.session.SessionClient; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.csess.ExternalSession; + + + +public class LanguageInterceptorBean + extends HandlerInterceptorAdapter + +{ + + private final Logger logger = Logger.getLogger( SessionInterceptorBean.class ); + private SessionClient client; + + + @Autowired( required = true ) + public void setSessionClient( SessionClient client ) + { + this.client = client; + } + + + @Override + public boolean preHandle( HttpServletRequest request , HttpServletResponse response , Object handler ) + throws IOException + { + HttpSession session = request.getSession( ); + String language = (String) session.getAttribute( "language" ); + + if ( language != null ) { + return true; + } + + this.logger.debug( "no language configured, trying to look it up" ); + + ExternalSession eSession; + CommandResponse cResponse; + ClientSessionReference sReference = new ClientSessionReference( null ); + try { + InetAddress addr = InetAddress.getByName( request.getRemoteAddr( ) ); + eSession = this.client.getSession( sReference , ExternalSession.class , addr ); + cResponse = eSession.listLanguages( ); + } catch ( SessionException e ) { + this.logger.error( "session error while initialising session language" ); + throw new RuntimeException( e ); + } catch ( SessionServerException e ) { + this.logger.warn( "server offline while initialising session language, defaulting" ); + session.setAttribute( "language" , "en" ); + return true; + } catch ( SessionMaintenanceException e ) { + this.logger.warn( "server under maintenance while initialising session language, defaulting" ); + session.setAttribute( "language" , "en" ); + return true; + } + + if ( cResponse instanceof MaintenanceResponse ) { + this.logger.warn( "server under maintenance while initialising session language, defaulting" ); + session.setAttribute( "language" , "en" ); + return true; + } + + ListLanguagesResponse languages = (ListLanguagesResponse) cResponse; + String accept = request.getHeader( "Accept-Language" ); + if ( accept == null ) { + this.logger.info( "Accept-Language not found, defaulting" ); + session.setAttribute( "language" , "en" ); + return true; + } + + Set< String > supported = new HashSet< String >( ); + for ( ListLanguagesResponse.Language l : languages.getLanguages( ) ) { + supported.add( l.getId( ).toLowerCase( ) ); + this.logger.trace( "supported language code '" + l.getId( ) + "'" ); + } + + List< String > lAccept = this.makeLangList( accept.replaceAll( "\\s+" , "" ) ); + for ( String lId : lAccept ) { + this.logger.debug( "accepted language code '" + lId + "'" ); + if ( supported.contains( lId.toLowerCase( ) ) ) { + this.logger.info( "using language " + lId ); + session.setAttribute( "language" , lId ); + return true; + } + } + + this.logger.info( "no language found in Accept-Language, defaulting" ); + session.setAttribute( "language" , "en" ); + return true; + } + + + private List< String > makeLangList( String acceptString ) + { + List< Double > qValues = new ArrayList< Double >( ); + Map< Double , Set< String > > found = new HashMap< Double , Set< String > >( ); + + for ( String part : acceptString.split( "," ) ) { + + Double qValue; + String language; + if ( part.contains( ";q=" ) ) { + try { + String r[] = part.split( ";q=" ); + language = r[ 0 ]; + qValue = Double.parseDouble( r[ 1 ] ); + } catch ( NumberFormatException e ) { + continue; + } + } else { + qValue = 1.0; + language = part; + } + + Set< String > accepts = found.get( qValue ); + if ( accepts == null ) { + accepts = new HashSet< String >( ); + qValues.add( qValue ); + found.put( qValue , accepts ); + } + accepts.add( language ); + } + + Collections.sort( qValues ); + Collections.reverse( qValues ); + List< String > result = new LinkedList< String >( ); + for ( Double v : qValues ) { + result.addAll( found.get( v ) ); + } + return result; + } +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionInterceptorBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionInterceptorBean.java new file mode 100644 index 0000000..cdcf33e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionInterceptorBean.java @@ -0,0 +1,59 @@ +package com.deepclone.lw.web.beans.intercept; + + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import com.deepclone.lw.web.beans.session.ClientSessionReference; + + + +public class SessionInterceptorBean + extends HandlerInterceptorAdapter +{ + + private final Logger logger = Logger.getLogger( SessionInterceptorBean.class ); + + + @Override + public boolean preHandle( HttpServletRequest request , HttpServletResponse response , Object handler ) + throws IOException + { + HttpSession session = request.getSession( ); + ClientSessionReference sReference = (ClientSessionReference) session.getAttribute( "sReference" ); + if ( sReference == null ) { + sReference = new ClientSessionReference( null ); + session.setAttribute( "sReference" , sReference ); + } + + Class< ? > handlerType = handler.getClass( ); + SessionRequirement requirement = handlerType.getAnnotation( SessionRequirement.class ); + if ( requirement == null ) { + this.logger.debug( "no session requirement" ); + return true; + } + + if ( ( requirement.value( ) && sReference.isNull( ) ) || ( !requirement.value( ) && !sReference.isNull( ) ) ) { + this.logger.debug( "requirement fail, redirecting to /" + requirement.redirectTo( ) ); + response.sendRedirect( requirement.redirectTo( ) ); + return false; + } + if ( requirement.value( ) && requirement.subType( ).length == 1 ) { + String rType = requirement.subType( )[ 0 ]; + if ( !rType.equals( sReference.getReference( ).extra ) ) { + this.logger.debug( "sub-type requirement fail, redirecting to /" + requirement.redirectTo( ) ); + response.sendRedirect( requirement.redirectTo( ) ); + return false; + } + } + this.logger.debug( "session requirement satisfied" ); + + return true; + } +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionRequirement.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionRequirement.java new file mode 100644 index 0000000..371ee4b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/intercept/SessionRequirement.java @@ -0,0 +1,24 @@ +package com.deepclone.lw.web.beans.intercept; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + + +@Retention( RetentionPolicy.RUNTIME ) +@Target( ElementType.TYPE ) +public @interface SessionRequirement +{ + + public boolean value( ); + + + public String[] subType( ) default { }; + + + public String redirectTo( ); + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatter.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatter.java new file mode 100644 index 0000000..6dead0e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatter.java @@ -0,0 +1,10 @@ +package com.deepclone.lw.web.beans.msgs; + + +public interface MessageFormatter +{ + public String cleanMessage( String message ); + + public String formatMessage( String message , boolean internal ); + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatterBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatterBean.java new file mode 100644 index 0000000..0184ae2 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/msgs/MessageFormatterBean.java @@ -0,0 +1,129 @@ +package com.deepclone.lw.web.beans.msgs; + + +import java.util.regex.Pattern; + + + +public class MessageFormatterBean + implements MessageFormatter +{ + private final Pattern planet = Pattern.compile( "\\{\\{planet:(\\d+) ([^\\}]+)\\}\\}" ); + private final Pattern empire = Pattern.compile( "\\{\\{empire:(\\d+) ([^\\}]+)\\}\\}" ); + private final Pattern battle = Pattern.compile( "\\{\\{battle:(\\d+) ([^\\}]+)\\}\\}" ); + private final Pattern bug = Pattern.compile( "\\{\\{bug:(\\d+)\\}\\}" ); + + + public String cleanMessage( String message ) + { + message = message.trim( ); + + StringBuilder repLine = new StringBuilder( ); + for ( Character c : message.toCharArray( ) ) { + int nVal = Character.codePointAt( new char[] { + c + } , 0 ); + if ( Character.isISOControl( nVal ) ) { + continue; + } + + switch ( c ) { + case '<': + repLine.append( "<" ); + continue; + case '>': + repLine.append( ">" ); + continue; + case '&': + repLine.append( "&" ); + continue; + case '\'': + repLine.append( "'" ); + continue; + case '"': + repLine.append( """ ); + continue; + } + if ( nVal < 128 ) { + repLine.append( c ); + } else { + repLine.append( "&#" ).append( nVal ).append( ";" ); + } + } + message = repLine.toString( ); + return message; + } + + + @Override + public String formatMessage( String message , boolean internal ) + { + StringBuilder result = new StringBuilder( ); + boolean inList = false; + boolean prevEmpty = true; + for ( String line : message.split( "\\n" ) ) { + line = this.cleanMessage( line ); + + if ( line.equals( "" ) ) { + if ( prevEmpty ) { + continue; + } + if ( inList ) { + result.append( "" ); + } else { + result.append( "

" ); + } + result.append( "

 

" ); + prevEmpty = true; + inList = false; + continue; + } + + if ( line.charAt( 0 ) == '*' ) { + if ( !inList ) { + if ( !prevEmpty ) { + result.append( "

" ); + } + result.append( "
    " ); + inList = true; + } + result.append( "
  • " ).append( line.substring( 1 ) ).append( "
  • " ); + } else { + if ( prevEmpty ) { + result.append( "

    " ); + } else if ( inList ) { + result.append( "

" ); + inList = false; + } else { + result.append( "
" ); + } + result.append( line ); + } + prevEmpty = false; + } + + if ( !prevEmpty ) { + if ( inList ) { + result.append( "" ); + } else { + result.append( "

" ); + } + } + + if ( !internal ) { + return result.toString( ); + } + return this.applyInternals( result.toString( ) ); + } + + + private String applyInternals( String message ) + { + message = planet.matcher( message ).replaceAll( "$2" ); + message = empire.matcher( message ).replaceAll( "$2" ); + message = battle.matcher( message ).replaceAll( "$2" ); + message = bug.matcher( message ).replaceAll( "#$1" ); + return message; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/ClientSessionReference.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/ClientSessionReference.java new file mode 100644 index 0000000..09ab219 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/ClientSessionReference.java @@ -0,0 +1,47 @@ +package com.deepclone.lw.web.beans.session; + + +import java.io.Serializable; + +import com.deepclone.lw.session.SessionReference; + + + +public class ClientSessionReference + implements Serializable +{ + + private static final long serialVersionUID = 1L; + private SessionReference reference; + + + public ClientSessionReference( SessionReference reference ) + { + this.setReference( reference ); + } + + + public void setReference( SessionReference reference ) + { + this.reference = reference; + } + + + public SessionReference getReference( ) + { + return this.reference; + } + + + public boolean isNull( ) + { + return this.reference == null; + } + + + public void clear( ) + { + this.reference = null; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatus.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatus.java new file mode 100644 index 0000000..cdf1a04 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatus.java @@ -0,0 +1,15 @@ +package com.deepclone.lw.web.beans.session; + + +import com.deepclone.lw.cmd.MaintenanceResponse; + + + +public interface MaintenanceStatus +{ + + public void storeStatus( MaintenanceResponse response ); + + public MaintenanceResponse getStatus( ); + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatusBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatusBean.java new file mode 100644 index 0000000..194dc9a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/MaintenanceStatusBean.java @@ -0,0 +1,32 @@ +package com.deepclone.lw.web.beans.session; + + +import org.apache.log4j.Logger; + +import com.deepclone.lw.cmd.MaintenanceResponse; + + + +public class MaintenanceStatusBean + implements MaintenanceStatus +{ + private final Logger logger = Logger.getLogger( MaintenanceStatusBean.class ); + private MaintenanceResponse maintenance = null; + + + @Override + synchronized public void storeStatus( MaintenanceResponse response ) + { + this.logger.debug( "Setting maintenance status response: " + response ); + this.maintenance = response; + } + + + @Override + synchronized public MaintenanceResponse getStatus( ) + { + this.logger.debug( "Reading latest maintenance status response: " + this.maintenance ); + return this.maintenance; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/Session.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/Session.java new file mode 100644 index 0000000..b826f25 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/Session.java @@ -0,0 +1,103 @@ +package com.deepclone.lw.web.beans.session; + + +import com.deepclone.lw.cmd.MaintenanceResponse; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionException; + + + +public abstract class Session +{ + + private static final long serialVersionUID = 1L; + private ClientSessionReference reference; + private SessionClient sClient; + + + void initialise( SessionClient client , ClientSessionReference ref ) + { + this.sClient = client; + this.reference = ref; + } + + + public final boolean isActive( ) + { + return !this.reference.isNull( ); + } + + + public boolean authenticate( String identifier , String secret ) + throws SessionException , SessionServerException + { + try { + this.sClient.authenticate( this.reference , identifier , secret ); + } catch ( SessionException e ) { + this.handleSessionException( e ); + } catch ( SessionServerException e ) { + this.reference.clear( ); + throw e; + } + + if ( this.reference.isNull( ) ) { + return false; + } + return this.reference.getReference( ).authenticated; + } + + + public void terminate( ) + throws SessionServerException , SessionException + { + try { + this.sClient.terminate( this.reference ); + } catch ( SessionServerException e ) { + throw e; + } catch ( SessionException e ) { + this.handleSessionException( e ); + } + } + + + public final String getSessionSubType( ) + { + try { + return this.reference.getReference( ).extra; + } catch ( NullPointerException e ) { + return null; + } + } + + + protected CommandResponse execute( Command command ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + CommandResponse response = null; + try { + response = this.sClient.execute( this.reference , command ); + } catch ( SessionServerException e ) { + this.reference.clear( ); + throw e; + } catch ( SessionException e ) { + this.handleSessionException( e ); + } + + if ( response instanceof MaintenanceResponse ) { + throw new SessionMaintenanceException( (MaintenanceResponse) response ); + } + return response; + } + + + protected void handleSessionException( SessionException e ) + throws SessionException + { + if ( !e.isSessionKept( ) ) { + this.reference.clear( ); + } + throw e; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClient.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClient.java new file mode 100644 index 0000000..ed1b446 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClient.java @@ -0,0 +1,33 @@ +package com.deepclone.lw.web.beans.session; + + +import java.net.InetAddress; + +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionException; + + + +public interface SessionClient +{ + + public < T extends Session > T getSession( ClientSessionReference reference , Class< T > type , InetAddress ip ) + throws SessionException , SessionServerException; + + + public < T extends Session > T restoreSession( ClientSessionReference session , Class< T > type ); + + + public void authenticate( ClientSessionReference session , String identifier , String secret ) + throws SessionException , SessionServerException; + + + public CommandResponse execute( ClientSessionReference reference , Command command ) + throws SessionServerException , SessionException; + + + public void terminate( ClientSessionReference reference ) + throws SessionServerException , SessionException; + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClientBean.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClientBean.java new file mode 100644 index 0000000..8ad80d9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionClientBean.java @@ -0,0 +1,165 @@ +package com.deepclone.lw.web.beans.session; + + +import java.net.InetAddress; + +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.remoting.RemoteAccessException; + +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionAccessor; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.session.SessionReference; +import com.deepclone.lw.session.SessionResponse; +import com.deepclone.lw.utils.DigestHelper; + + + +public class SessionClientBean + implements SessionClient , ApplicationContextAware +{ + private Logger logger = Logger.getLogger( SessionClient.class ); + private String sessionService = "sessionSrv"; + private ApplicationContext appContext; + + + public void setSessionService( String name ) + { + this.sessionService = name; + } + + + @Override + public void setApplicationContext( ApplicationContext applicationContext ) + throws BeansException + { + this.appContext = applicationContext; + } + + + private SessionAccessor getSessionService( ) + throws SessionServerException + { + try { + return (SessionAccessor) this.appContext.getBean( this.sessionService ); + } catch ( BeanCreationException e ) { + this.logger.error( "Could not connect to session manager" , e.getCause( ) ); + throw new SessionServerException( e.getCause( ) ); + } + } + + + private < T extends Session > T makeSession( ClientSessionReference sRef , Class< T > type ) + { + T session; + try { + session = type.newInstance( ); + } catch ( Exception e ) { + this.logger.error( "Session creation failed" , e ); + throw new RuntimeException( e ); + } + session.initialise( this , sRef ); + return session; + } + + + @Override + public < T extends Session > T getSession( ClientSessionReference session , Class< T > type , InetAddress ip ) + throws SessionException , SessionServerException + { + if ( !type.isAnnotationPresent( SessionType.class ) ) { + throw new RuntimeException( "missing SessionType annotation on " + type ); + } + + SessionType t = type.getAnnotation( SessionType.class ); + SessionAccessor sAcc = this.getSessionService( ); + SessionReference sRef; + try { + sRef = sAcc.create( t.value( ) , "web" , ip ); + } catch ( RemoteAccessException e ) { + this.logger.error( "Could not create session" , e ); + throw new SessionServerException( e ); + } + + session.setReference( sRef ); + return this.makeSession( session , type ); + } + + + @Override + public < T extends Session > T restoreSession( ClientSessionReference session , Class< T > type ) + { + if ( session.isNull( ) ) { + return null; + } + + if ( !type.isAnnotationPresent( SessionType.class ) ) { + throw new RuntimeException( "missing SessionType annotation on " + type ); + } + + SessionType t = type.getAnnotation( SessionType.class ); + if ( !t.value( ).equals( session.getReference( ).type ) ) { + throw new RuntimeException( "session type mismatch" ); + } + + return this.makeSession( session , type ); + } + + + @Override + public void authenticate( ClientSessionReference session , String identifier , String secret ) + throws SessionException , SessionServerException + { + String challenge = session.getReference( ).extra; + String sha1 = DigestHelper.digest( "sha-1" , challenge + " " + DigestHelper.digest( "sha-1" , secret ) ); + String md5 = DigestHelper.digest( "md5" , challenge + " " + DigestHelper.digest( "md5" , secret ) ); + + SessionAccessor sAcc = this.getSessionService( ); + SessionReference ref; + try { + ref = sAcc.authenticate( session.getReference( ).identifier , identifier , sha1 , md5 ); + } catch ( RemoteAccessException e ) { + this.logger.error( "Could not authenticate session" , e ); + throw new SessionServerException( e ); + } + session.setReference( ref ); + } + + + @Override + public CommandResponse execute( ClientSessionReference reference , Command command ) + throws SessionServerException , SessionException + { + SessionAccessor sAcc = this.getSessionService( ); + SessionResponse sRep; + try { + sRep = sAcc.executeCommand( reference.getReference( ).identifier , command ); + } catch ( RemoteAccessException e ) { + this.logger.error( "Could not execute command" , e ); + throw new SessionServerException( e ); + } + reference.setReference( sRep.session ); + return sRep.data; + } + + + @Override + public void terminate( ClientSessionReference reference ) + throws SessionServerException , SessionException + { + try { + this.getSessionService( ).terminate( reference.getReference( ).identifier ); + } catch ( RemoteAccessException e ) { + this.logger.error( "Could not terminate session" , e ); + throw new SessionServerException( e ); + } finally { + reference.clear( ); + } + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionMaintenanceException.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionMaintenanceException.java new file mode 100644 index 0000000..4643128 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionMaintenanceException.java @@ -0,0 +1,27 @@ +package com.deepclone.lw.web.beans.session; + + +import com.deepclone.lw.cmd.MaintenanceResponse; + + + +public class SessionMaintenanceException + extends Exception +{ + + private static final long serialVersionUID = 1L; + private final MaintenanceResponse maintenance; + + + public SessionMaintenanceException( MaintenanceResponse data ) + { + this.maintenance = data; + } + + + public MaintenanceResponse getMaintenance( ) + { + return maintenance; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionServerException.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionServerException.java new file mode 100644 index 0000000..94c06d6 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionServerException.java @@ -0,0 +1,16 @@ +package com.deepclone.lw.web.beans.session; + + +public class SessionServerException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + + public SessionServerException( Throwable cause ) + { + super( "could not reach session server" , cause ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionType.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionType.java new file mode 100644 index 0000000..23bc649 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/session/SessionType.java @@ -0,0 +1,18 @@ +package com.deepclone.lw.web.beans.session; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + + +@Retention( RetentionPolicy.RUNTIME ) +@Target( ElementType.TYPE ) +public @interface SessionType +{ + + public String value( ); + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/BugTrackerBase.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/BugTrackerBase.java new file mode 100644 index 0000000..0827c92 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/BugTrackerBase.java @@ -0,0 +1,99 @@ +package com.deepclone.lw.web.beans.view; + + +import java.io.Serializable; + +import com.deepclone.lw.cmd.bt.data.BugStatus; + + + +public abstract class BugTrackerBase + extends PageControllerBase +{ + + @SuppressWarnings( "serial" ) + public static class BugQuery + implements Serializable + { + public final BugStatus status; + public final boolean ownOnly; + public final long first; + + + BugQuery( BugStatus status , boolean ownOnly , long first ) + { + this.status = status; + this.ownOnly = ownOnly; + this.first = first; + } + + + public BugStatus getStatus( ) + { + return status; + } + + + public boolean isOwnOnly( ) + { + return ownOnly; + } + + + public long getFirst( ) + { + return first; + } + + } + + + protected final BugQuery getBugQuery( String sStatus , String sOwn , String sFirst ) + { + BugQuery query; + + // Get status + BugStatus status; + if ( sStatus == null ) { + status = null; + } else { + try { + status = BugStatus.valueOf( sStatus ); + } catch ( IllegalArgumentException e ) { + status = null; + } + } + + // Own reports only? + boolean ownOnly = ( sOwn != null && "1".equals( sOwn ) ); + + // First report displayed + long first; + if ( sFirst == null ) { + first = 0; + } else { + try { + first = Long.parseLong( sFirst ); + } catch ( NumberFormatException e ) { + first = 0; + } + } + + query = new BugQuery( status , ownOnly , first ); + return query; + } + + + protected String makeGetParams( BugQuery query ) + { + String rTo = "?status="; + if ( query.status == null ) { + rTo += "x"; + } else { + rTo += query.status.toString( ); + } + rTo += "&own=" + ( query.ownOnly ? "1" : "0" ) + "&first=" + query.first; + return rTo; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/Page.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/Page.java new file mode 100644 index 0000000..096b08c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/Page.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.web.beans.view; + + +import java.io.Serializable; + + + +public class Page + implements Serializable +{ + + private static final long serialVersionUID = 1L; + + private String type; + + private String language; + + private Serializable data; + + + public Page( String name , String language ) + { + this.type = name; + this.language = language; + } + + + public Page( String name , String language , Serializable data ) + { + this.type = name; + this.language = language; + this.data = data; + } + + + public String getDataType( ) + { + if ( this.data == null ) { + return "null"; + } + return this.data.getClass( ).getSimpleName( ); + } + + + public String getLanguage( ) + { + return this.language; + } + + + public Object getData( ) + { + return this.data; + } + + + public String getType( ) + { + return this.type; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/PageControllerBase.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/PageControllerBase.java new file mode 100644 index 0000000..c5fe5ef --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/beans/view/PageControllerBase.java @@ -0,0 +1,163 @@ +package com.deepclone.lw.web.beans.view; + + +import java.io.Serializable; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.ui.Model; + +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.session.CommandResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.session.ClientSessionReference; +import com.deepclone.lw.web.beans.session.Session; +import com.deepclone.lw.web.beans.session.SessionClient; +import com.deepclone.lw.web.beans.session.SessionServerException; + + + +public abstract class PageControllerBase +{ + + protected SessionClient client; + + + @Autowired( required = true ) + public void setSessionClient( SessionClient client ) + { + this.client = client; + } + + + protected String render( Model model , String template , String language ) + { + return this.render( model , template , new Page( null , language ) ); + } + + + protected String render( Model model , String template , String language , String subPage ) + { + return this.render( model , template , new Page( subPage , language ) ); + } + + + protected String render( Model model , String template , String language , CommandResponse data ) + { + return this.render( model , template , new Page( null , language , data ) ); + } + + + protected String render( Model model , String template , String language , String subPage , CommandResponse data ) + { + return this.render( model , template , new Page( subPage , language , data ) ); + } + + + protected String renderMap( Model model , String template , String language , String subPage , Object... data ) + { + HashMap< String , Serializable > map = new HashMap< String , Serializable >( ); + for ( int i = 0 ; i < data.length / 2 ; i++ ) { + map.put( (String) data[ i * 2 ] , (Serializable) data[ i * 2 + 1 ] ); + } + return this.render( model , template , new Page( subPage , language , map ) ); + } + + + protected String renderStatic( Model model , String template , String language , String name ) + { + return this.render( model , template , new Page( "static" , language , name ) ); + } + + + protected String renderStatic( Model model , String template , String language , GameResponseBase gameData , + String name ) + { + return this.renderMap( model , template , language , "static" , "page" , gameData.getPage( ) , "name" , name ); + } + + + protected String render( Model model , String template , Page page ) + { + model.addAttribute( "container" , template ); + model.addAttribute( "language" , page.getLanguage( ) ); + model.addAttribute( "type" , page.getType( ) ); + model.addAttribute( "data" , page.getData( ) ); + model.addAttribute( "dataType" , page.getDataType( ) ); + return "ROOT"; + } + + + protected String render( Model model , String template , String language , String type , Map< String , Object > data ) + { + model.addAttribute( "container" , template ); + model.addAttribute( "language" , language ); + model.addAttribute( "type" , type ); + model.addAttribute( "data" , data ); + model.addAttribute( "dataType" , "map" ); + return "ROOT"; + } + + + protected String redirect( String to ) + { + return "redirect:" + to; + } + + + protected final InetAddress getAddress( HttpServletRequest request ) + { + InetAddress address; + try { + address = InetAddress.getByName( request.getRemoteAddr( ) ); + } catch ( UnknownHostException e ) { + throw new RuntimeException( e ); + } + return address; + } + + + protected final ClientSessionReference getSessionReference( HttpServletRequest request ) + { + return (ClientSessionReference) request.getSession( ).getAttribute( "sReference" ); + } + + + protected < T extends Session > T createTemporarySession( Class< T > type , HttpServletRequest request ) + throws SessionException , SessionServerException + { + return this.client.getSession( new ClientSessionReference( null ) , type , this.getAddress( request ) ); + } + + + protected < T extends Session > T initSession( Class< T > type , HttpServletRequest request ) + throws SessionException , SessionServerException + { + return this.client.getSession( this.getSessionReference( request ) , type , this.getAddress( request ) ); + } + + + protected < T extends Session > T getSession( Class< T > type , HttpServletRequest request ) + { + return this.client.restoreSession( this.getSessionReference( request ) , type ); + } + + + protected void clearSession( HttpServletRequest request ) + { + this.getSessionReference( request ).clear( ); + } + + + @SuppressWarnings( "unchecked" ) + protected Map< String , Object > getInput( HttpServletRequest request ) + { + return (Map< String , Object >) request.getParameterMap( ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/AdminSession.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/AdminSession.java new file mode 100644 index 0000000..2f89e3e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/AdminSession.java @@ -0,0 +1,542 @@ +package com.deepclone.lw.web.csess; + + +import java.util.List; + +import com.deepclone.lw.cmd.CreateAuthChallengeCommand; +import com.deepclone.lw.cmd.CreateAuthChallengeResponse; +import com.deepclone.lw.cmd.admin.*; +import com.deepclone.lw.cmd.admin.adata.*; +import com.deepclone.lw.cmd.admin.bans.*; +import com.deepclone.lw.cmd.admin.bt.*; +import com.deepclone.lw.cmd.admin.constants.*; +import com.deepclone.lw.cmd.admin.i18n.*; +import com.deepclone.lw.cmd.admin.logs.*; +import com.deepclone.lw.cmd.admin.mntm.*; +import com.deepclone.lw.cmd.admin.msg.*; +import com.deepclone.lw.cmd.admin.naming.*; +import com.deepclone.lw.cmd.admin.prefs.*; +import com.deepclone.lw.cmd.admin.su.*; +import com.deepclone.lw.cmd.admin.tick.*; +import com.deepclone.lw.cmd.admin.users.*; +import com.deepclone.lw.cmd.bt.*; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.utils.DigestHelper; +import com.deepclone.lw.web.beans.session.Session; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.session.SessionType; + + + +@SessionType( "admin" ) +public class AdminSession + extends Session +{ + + /* Common commands */ + + public AdminOverviewResponse getOverview( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AdminOverviewResponse) this.execute( new AdminOverviewCommand( ) ); + } + + + public AdminResponse noOp( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AdminResponse) this.execute( new NoOperationCommand( ) ); + } + + + public AdminResponse noOp( Privileges privilege ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AdminResponse) this.execute( new NoOperationCommand( privilege ) ); + } + + + public SetPasswordResponse changePassword( String current , String password , String passwordConfirm ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + String challenge = ( (CreateAuthChallengeResponse) this.execute( new CreateAuthChallengeCommand( ) ) ) + .getChallenge( ); + + String sha1 , md5; + sha1 = DigestHelper.digest( "sha-1" , challenge + " " + DigestHelper.digest( "sha-1" , current ) ); + md5 = DigestHelper.digest( "md5" , challenge + " " + DigestHelper.digest( "md5" , current ) ); + + return (SetPasswordResponse) this.execute( new SetPasswordCommand( sha1 , md5 , password , passwordConfirm ) ); + } + + + /* Constants administration */ + + public GetConstantsResponse getConstants( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetConstantsResponse) this.execute( new GetConstantsCommand( ) ); + } + + + public SetConstantResponse setConstant( String name , double value ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (SetConstantResponse) this.execute( new SetConstantCommand( name , value ) ); + } + + + /* Administrators administration */ + + public ListAdministratorsResponse listAdmins( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListAdministratorsResponse) this.execute( new ListAdministratorsCommand( ) ); + } + + + public AddAdministratorResponse addAdmin( String address , String name , List< Privileges > privs ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AddAdministratorResponse) this.execute( new AddAdministratorCommand( address , name , privs ) ); + } + + + public ViewAdministratorResponse viewAdministrator( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewAdministratorResponse) this.execute( new ViewAdministratorCommand( id ) ); + } + + + public ViewAdministratorResponse resetAdministrator( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewAdministratorResponse) this.execute( new ResetAdminPasswordCommand( id ) ); + } + + + public ViewAdministratorResponse setAdminPrivileges( int id , List< Privileges > privs ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewAdministratorResponse) this.execute( new SetPrivilegesCommand( id , privs ) ); + } + + + /* I18N administration */ + + public ViewLanguagesResponse listLanguages( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewLanguagesResponse) this.execute( new ViewLanguagesCommand( ) ); + } + + + public GetLanguageResponse getLanguage( String language ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetLanguageResponse) this.execute( new GetLanguageCommand( language ) ); + } + + + public ChangeLanguageResponse setLanguageName( String language , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ChangeLanguageResponse) this.execute( new ChangeLanguageCommand( language , name ) ); + } + + + public SetStringResponse setTranslation( String language , String string , String value ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (SetStringResponse) this.execute( new SetStringCommand( language , string , value ) ); + } + + + /* Names */ + + public NamesSummaryResponse getNameSummary( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (NamesSummaryResponse) this.execute( new NamesSummaryCommand( ) ); + } + + + public GetNamesResponse getNames( NameType type ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetNamesResponse) this.execute( new GetNamesCommand( type ) ); + } + + + public void namesAction( NameType type , NameAction action , int[] ids ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new NamesActionCommand( type , action , ids ) ); + } + + + /* Banhammer */ + + public BansSummaryResponse getBansSummary( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (BansSummaryResponse) this.execute( new BansSummaryCommand( ) ); + } + + + public ListBansResponse getBans( BanType type ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListBansResponse) this.execute( new ListBansCommand( type ) ); + } + + + public RequestBanResponse requestBan( String user , boolean empire , String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (RequestBanResponse) this.execute( new RequestBanCommand( user , empire , reason ) ); + } + + + public RejectBanResponse rejectBan( int id , String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (RejectBanResponse) this.execute( new RejectBanCommand( id , reason ) ); + } + + + public void confirmBan( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ConfirmBanCommand( id ) ); + } + + + public void liftBan( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new LiftBanCommand( id ) ); + } + + + /* Ticker */ + + public TickerStatusResponse getTickerStatus( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (TickerStatusResponse) this.execute( new TickerStatusCommand( ) ); + } + + + public void toggleTicker( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ToggleTickerCommand( ) ); + } + + + public void setTickerTaskStatus( int task , boolean run ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetTaskStatusCommand( task , run ) ); + } + + + public void setTickerTaskStatus( int task , long delay ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetTaskStatusCommand( task , delay ) ); + } + + + /* Logs */ + + public ViewLogResponse viewLog( LogType logType , int first , int pageSize , LogLevel logLevel , String component , + boolean excOnly ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewLogResponse) this.execute( new ViewLogCommand( logType , first , pageSize , logLevel , component , + excOnly ) ); + } + + + public GetEntryResponse getLogEntry( long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetEntryResponse) this.execute( new GetEntryCommand( id ) ); + } + + + /* Spam! */ + + public AdminResponse sendSpam( String title , String body ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AdminResponse) this.execute( new SendSpamCommand( title , body ) ); + } + + + /* Messages */ + + public GetMessagesResponse getMessages( boolean inbox ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetMessagesResponse) this.execute( new GetMessagesCommand( inbox ) ); + } + + + public ReadMessageResponse readMessage( boolean inbox , long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ReadMessageResponse) this.execute( new ReadMessageCommand( inbox , id ) ); + } + + + public void deleteMessages( boolean inbox , long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( inbox , selection ) ); + } + + + public void markRead( long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( selection , true ) ); + } + + + public void markUnread( long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( selection , false ) ); + } + + + public ComposeMessageResponse initNewMessage( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( PrepareMessageCommand.newMessage( ) ); + } + + + public ComposeMessageResponse replyTo( boolean inbox , long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( new PrepareMessageCommand( id , inbox ) ); + } + + + public ComposeMessageResponse messageTo( MessageType type , int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( PrepareMessageCommand.newMessageTo( type , id ) ); + } + + + public ComposeMessageResponse sendMessage( MessageType type , String toName , String title , String contents ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ComposeMessageCommand command = new ComposeMessageCommand( ); + command.setType( type ); + command.setTarget( toName ); + command.setSubject( title ); + command.setContents( contents ); + return (ComposeMessageResponse) this.execute( command ); + } + + + public ComposeMessageResponse sendReply( boolean inbox , long rtId , MessageType type , String toName , + String title , String contents ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ComposeMessageCommand command = new ComposeMessageCommand( inbox , rtId ); + command.setType( type ); + command.setTarget( toName ); + command.setSubject( title ); + command.setContents( contents ); + return (ComposeMessageResponse) this.execute( command ); + } + + + /* Users */ + + public ListAccountsResponse listUsers( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListAccountsResponse) this.execute( new ListAccountsCommand( ) ); + } + + + public ListAccountsResponse listOnlineUsers( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListAccountsResponse) this.execute( new ListAccountsCommand( null , true ) ); + } + + + public ListAccountsResponse listUsers( AccountStatus status ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListAccountsResponse) this.execute( new ListAccountsCommand( status ) ); + } + + + public ListAccountsResponse listOnlineUsers( AccountStatus status ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListAccountsResponse) this.execute( new ListAccountsCommand( status , true ) ); + } + + + public ViewAccountResponse viewUser( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewAccountResponse) this.execute( new ViewAccountCommand( id ) ); + } + + + public ListSessionsResponse viewUserSessions( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListSessionsResponse) this.execute( new ListSessionsCommand( id ) ); + } + + + public void giveCredits( int id , int credits ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new GiveCreditsCommand( id , credits ) ); + } + + + /* Default preferences */ + + public PrefDefaultsResponse getPrefDefaults( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (PrefDefaultsResponse) this.execute( new GetPrefDefaultsCommand( ) ); + } + + + public void setPrefDefault( String pref , String value ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetPrefDefaultCommand( pref , value ) ); + } + + + /* Bug tracking system */ + + public BugsSummaryResponse getBugsSummary( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (BugsSummaryResponse) this.execute( new BugsSummaryCommand( ) ); + } + + + public ListBugsResponse listBugs( BugStatus status , boolean ownOnly , long first , int count ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListBugsResponse) this.execute( new ListBugsCommand( status , ownOnly , first , count ) ); + } + + + public ReportBugResponse reportBug( String title , String description , boolean publicReport ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ReportBugResponse) this.execute( new ReportBugCommand( title , description , publicReport ) ); + } + + + public ViewBugResponse getBugReport( long bugId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewBugResponse) this.execute( new ViewBugCommand( bugId ) ); + } + + + public PostCommentResponse postBugComment( long bugId , String comment , boolean publicComment ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (PostCommentResponse) this.execute( new PostCommentCommand( bugId , comment , publicComment ) ); + } + + + public void moderateBugComment( long commentId , boolean validate ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ModerateCommentCommand( commentId , validate ) ); + } + + + public void validateReport( long bugId , BugStatus newStatus , boolean visible , int grantCredits , boolean snapshot ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ValidateReportCommand( bugId , newStatus , visible , grantCredits , snapshot ) ); + + } + + + public void setReportStatus( long bugId , BugStatus newStatus ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ReportStatusCommand( bugId , newStatus ) ); + } + + + public void toggleReportVisibility( long bugId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ReportVisibilityCommand( bugId ) ); + } + + + public MergeReportsResponse mergeReports( long bugId , long mergeId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MergeReportsResponse) this.execute( new MergeReportsCommand( bugId , mergeId ) ); + } + + + public GetSnapshotResponse getSnapshot( long bugId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetSnapshotResponse) this.execute( new GetSnapshotCommand( bugId ) ); + } + + + /* Maintenance mode */ + + public MaintenanceStatusResponse getMaintenanceStatus( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MaintenanceStatusResponse) this.execute( new MaintenanceStatusCommand( ) ); + } + + + public MaintenanceChangeResponse enableMaintenance( String reason , int duration ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MaintenanceChangeResponse) this.execute( new EnableMaintenanceCommand( reason , duration ) ); + } + + + public void extendMaintenance( int duration ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ExtendMaintenanceCommand( duration ) ); + } + + + public void endMaintenance( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new EndMaintenanceCommand( ) ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/ExternalSession.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/ExternalSession.java new file mode 100644 index 0000000..f899790 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/ExternalSession.java @@ -0,0 +1,68 @@ +package com.deepclone.lw.web.csess; + + +import com.deepclone.lw.cmd.ext.*; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.session.Session; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.session.SessionType; + + + +@SessionType( "ext" ) +public class ExternalSession + extends Session +{ + + public ListLanguagesResponse listLanguages( ) + throws SessionServerException , SessionMaintenanceException + { + Command ll = new ListLanguagesCommand( ); + try { + return (ListLanguagesResponse) this.execute( ll ); + } catch ( SessionException se ) { + throw new RuntimeException( se ); + } + } + + + public CreateAccountResponse createAccount( String mail , String mailConfirm , String password , + String passwordConfirm , String language ) + throws SessionServerException , SessionMaintenanceException + { + Command command = new CreateAccountCommand( mail , mailConfirm , password , passwordConfirm , language ); + try { + return (CreateAccountResponse) this.execute( command ); + } catch ( SessionException se ) { + throw new RuntimeException( se ); + } + } + + + public RequestPasswordRecoveryResponse requestPasswordRecovery( String mail ) + throws SessionServerException , SessionMaintenanceException + { + Command command = new RequestPasswordRecoveryCommand( mail ); + try { + return (RequestPasswordRecoveryResponse) this.execute( command ); + } catch ( SessionException se ) { + throw new RuntimeException( se ); + } + } + + + public ConfirmPasswordRecoveryResponse confirmPasswordRecovery( String mail , String token , String password , + String passwordConfirm ) + throws SessionServerException , SessionMaintenanceException + { + Command command = new ConfirmPasswordRecoveryCommand( mail , token , password , passwordConfirm ); + try { + return (ConfirmPasswordRecoveryResponse) this.execute( command ); + } catch ( SessionException se ) { + throw new RuntimeException( se ); + } + } + +} diff --git a/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/PlayerSession.java b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/PlayerSession.java new file mode 100644 index 0000000..1cc1607 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-beans/src/main/java/com/deepclone/lw/web/csess/PlayerSession.java @@ -0,0 +1,578 @@ +package com.deepclone.lw.web.csess; + + +import java.util.Map; + +import com.deepclone.lw.cmd.CreateAuthChallengeCommand; +import com.deepclone.lw.cmd.CreateAuthChallengeResponse; +import com.deepclone.lw.cmd.bt.*; +import com.deepclone.lw.cmd.bt.data.BugStatus; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.*; +import com.deepclone.lw.cmd.player.account.*; +import com.deepclone.lw.cmd.player.alliances.*; +import com.deepclone.lw.cmd.player.battles.*; +import com.deepclone.lw.cmd.player.bt.*; +import com.deepclone.lw.cmd.player.elist.*; +import com.deepclone.lw.cmd.player.fleets.*; +import com.deepclone.lw.cmd.player.gdata.*; +import com.deepclone.lw.cmd.player.planets.*; +import com.deepclone.lw.cmd.player.msgs.*; +import com.deepclone.lw.session.Command; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.utils.DigestHelper; +import com.deepclone.lw.web.beans.session.*; + + + +@SessionType( "player" ) +public class PlayerSession + extends Session +{ + + /* General & account management commands */ + + public String getLanguage( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command command = new GetLanguageCommand( ); + return ( (GetLanguageResponse) this.execute( command ) ).getLanguage( ); + } + + + public AccountValidationResponse startValidation( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AccountValidationResponse) this.execute( new AccountValidationCommand( ) ); + } + + + public AccountValidationResponse validate( String token , String empire , String planet ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command command = new AccountValidationCommand( token , empire , planet ); + return (AccountValidationResponse) this.execute( command ); + } + + + public AccountReactivationResponse reactivate( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AccountReactivationResponse) this.execute( new AccountReactivationCommand( ) ); + } + + + public BanDetailsResponse getBanDetails( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (BanDetailsResponse) this.execute( new BanDetailsCommand( ) ); + } + + + /* Empire commands */ + + public EmpireResponse getOverview( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (EmpireResponse) this.execute( new OverviewCommand( ) ); + } + + + public EmpireResponse implementTechnology( int technology ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (EmpireResponse) this.execute( new ImplementTechCommand( technology ) ); + } + + + /* Planet list */ + + public ListPlanetsResponse listPlanets( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListPlanetsResponse) this.execute( new ListPlanetsCommand( ) ); + } + + + /* Map */ + + public ViewMapResponse viewMap( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewMapResponse) this.execute( new ViewMapCommand( ) ); + } + + + public ViewMapResponse viewMap( int x , int y , MapSize size ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewMapResponse) this.execute( new ViewMapCommand( x , y , size ) ); + } + + + /* Planet commands */ + + public ViewPlanetResponse getPlanetView( int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewPlanetResponse) this.execute( new ViewPlanetCommand( id ) ); + } + + + public ViewPlanetResponse constructBuildings( int planetId , int type , int amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command cmd = new BuildingActionCommand( planetId , type , amount , false ); + return (ViewPlanetResponse) this.execute( cmd ); + } + + + public ViewPlanetResponse destroyBuildings( int planetId , int type , int amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command cmd = new BuildingActionCommand( planetId , type , amount , true ); + return (ViewPlanetResponse) this.execute( cmd ); + } + + + public ViewPlanetResponse buildShips( int planetId , int type , int amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command cmd = new BuildShipsCommand( planetId , type , amount ); + return (ViewPlanetResponse) this.execute( cmd ); + } + + + public ViewPlanetResponse flushQueue( int planetId , boolean military ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Command cmd = new FlushQueueCommand( planetId , military ); + return (ViewPlanetResponse) this.execute( cmd ); + } + + + public ViewPlanetResponse rename( int planetId , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewPlanetResponse) this.execute( new RenamePlanetCommand( planetId , name ) ); + } + + + public ViewPlanetResponse abandon( int planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewPlanetResponse) this.execute( new AbandonPlanetCommand( planetId , false ) ); + } + + + public ViewPlanetResponse cancelAbandon( int planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewPlanetResponse) this.execute( new AbandonPlanetCommand( planetId , true ) ); + } + + + /* Alliance commands */ + + public AllianceStatusResponse getAllianceStatus( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new AllianceStatusCommand( ) ); + } + + + public AllianceStatusResponse viewAlliance( String tag ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new ViewAllianceCommand( tag ) ); + } + + + public AllianceStatusResponse joinAlliance( String tag ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new JoinAllianceCommand( tag ) ); + } + + + public AllianceStatusResponse cancelJoinAlliance( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new CancelJoinCommand( ) ); + } + + + public AllianceStatusResponse createAlliance( String tag , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new CreateAllianceCommand( tag , name ) ); + } + + + public AllianceStatusResponse manageRequests( boolean accept , int[] members ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new ManageRequestsCommand( members , accept ) ); + } + + + public AllianceStatusResponse kickMembers( int[] members ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new KickMembersCommand( members ) ); + } + + + public AllianceStatusResponse transferLeadership( int to ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new TransferLeadershipCommand( to ) ); + } + + + public AllianceStatusResponse leaveAlliance( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (AllianceStatusResponse) this.execute( new LeaveAllianceCommand( ) ); + } + + + /* Enemy list */ + + public EnemyListResponse getEnemyList( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (EnemyListResponse) this.execute( new EnemyListCommand( ) ); + } + + + public EnemyListResponse addEnemy( boolean alliance , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (EnemyListResponse) this.execute( new AddEnemyCommand( alliance , name ) ); + } + + + public EnemyListResponse removeEnemies( boolean alliance , int[] ids ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (EnemyListResponse) this.execute( new RemoveEnemiesCommand( alliance , ids ) ); + } + + + /* Fleets */ + + public ViewFleetsResponse getFleets( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewFleetsResponse) this.execute( new ViewFleetsCommand( ) ); + } + + + public MoveFleetsResponse moveFleets( long[] ids ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MoveFleetsResponse) this.execute( new MoveFleetsCommand( ids ) ); + } + + + public MoveFleetsResponse moveFleets( long[] ids , String destination , boolean attack ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MoveFleetsResponse) this.execute( new MoveFleetsCommand( ids , destination , attack ) ); + } + + + public SetFleetsModeResponse setFleetsMode( long[] ids , boolean attack , boolean forReal ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (SetFleetsModeResponse) this.execute( new SetFleetsModeCommand( ids , attack , forReal ) ); + } + + + public RenameFleetsResponse renameFleets( long[] ids ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (RenameFleetsResponse) this.execute( new RenameFleetsCommand( ids ) ); + } + + + public RenameFleetsResponse renameFleets( long[] ids , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (RenameFleetsResponse) this.execute( new RenameFleetsCommand( ids , name ) ); + } + + + public SplitFleetResponse splitFleet( long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (SplitFleetResponse) this.execute( new SplitFleetCommand( id ) ); + } + + + public SplitFleetResponse splitFleet( long id , Map< Integer , Integer > ships , int nFleets , String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (SplitFleetResponse) this.execute( new SplitFleetCommand( id , ships , nFleets , name ) ); + } + + + public DisbandFleetsResponse disbandFleets( long[] ids , boolean confirm ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (DisbandFleetsResponse) this.execute( new DisbandFleetsCommand( ids , confirm ) ); + } + + + public MergeFleetsResponse mergeFleets( long[] ids ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (MergeFleetsResponse) this.execute( new MergeFleetsCommand( ids ) ); + } + + + /* Account management */ + + public GetAccountResponse getAccount( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetAccountResponse) this.execute( new GetAccountCommand( ) ); + } + + + public void setLanguage( String language ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetLanguageCommand( language ) ); + } + + + public String createAuthenticationChallenge( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return ( (CreateAuthChallengeResponse) this.execute( new CreateAuthChallengeCommand( ) ) ).getChallenge( ); + } + + + public SetPasswordResponse setPassword( String currentPassword , String challenge , String newPass1 , + String newPass2 ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + String sha1 , md5; + sha1 = DigestHelper.digest( "sha-1" , challenge + " " + DigestHelper.digest( "sha-1" , currentPassword ) ); + md5 = DigestHelper.digest( "md5" , challenge + " " + DigestHelper.digest( "md5" , currentPassword ) ); + + return (SetPasswordResponse) this.execute( new SetPasswordCommand( sha1 , md5 , newPass1 , newPass2 ) ); + } + + + public SetAddressResponse setAddress( String currentPassword , String challenge , String newAddr1 , String newAddr2 ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + String sha1 , md5; + sha1 = DigestHelper.digest( "sha-1" , challenge + " " + DigestHelper.digest( "sha-1" , currentPassword ) ); + md5 = DigestHelper.digest( "md5" , challenge + " " + DigestHelper.digest( "md5" , currentPassword ) ); + + return (SetAddressResponse) this.execute( new SetAddressCommand( sha1 , md5 , newAddr1 , newAddr2 ) ); + } + + + public ValidateSetAddressResponse cancelAddressChange( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ValidateSetAddressResponse) this.execute( new ValidateSetAddressCommand( ) ); + } + + + public ValidateSetAddressResponse confirmAddressChange( String code ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ValidateSetAddressResponse) this.execute( new ValidateSetAddressCommand( code ) ); + } + + + public void loadDefaultPreferences( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetPreferencesCommand( ) ); + } + + + public void setPreferences( Map< String , String > prefs ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new SetPreferencesCommand( prefs ) ); + } + + + public void setQuit( String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new QuitGameCommand( reason ) ); + } + + + public void cancelQuit( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new CancelQuitCommand( ) ); + } + + + public void toggleVacation( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new ToggleVacationCommand( ) ); + } + + + /* Battles */ + + public GetBattleResponse getBattle( long battle ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetBattleResponse) this.execute( new GetBattleCommand( battle ) ); + } + + + public GetBattleResponse getBattle( long battle , long tick ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetBattleResponse) this.execute( new GetBattleCommand( battle , tick ) ); + } + + + public ListBattlesResponse getBattles( int page ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListBattlesResponse) this.execute( new ListBattlesCommand( page ) ); + } + + + public GetNewPlanetResponse getNewPlanet( String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetNewPlanetResponse) this.execute( new GetNewPlanetCommand( name ) ); + } + + + /* Messages */ + + public GetMessagesResponse getMessages( boolean inbox ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (GetMessagesResponse) this.execute( new GetMessagesCommand( inbox ) ); + } + + + public ReadMessageResponse readMessage( boolean inbox , long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ReadMessageResponse) this.execute( new ReadMessageCommand( inbox , id ) ); + } + + + public void deleteMessages( boolean inbox , long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( inbox , selection ) ); + } + + + public void markRead( long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( selection , true ) ); + } + + + public void markUnread( long[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.execute( new MessageBoxCommand( selection , false ) ); + } + + + public ComposeMessageResponse initNewMessage( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( PrepareMessageCommand.newMessage( ) ); + } + + + public ComposeMessageResponse messageTo( MessageType messageType , int id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( PrepareMessageCommand.newMessageTo( messageType , id ) ); + } + + + public ComposeMessageResponse sendMessage( MessageType type , String toName , String title , String contents ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ComposeMessageCommand command = new ComposeMessageCommand( ); + command.setType( type ); + command.setTarget( toName ); + command.setSubject( title ); + command.setContents( contents ); + return (ComposeMessageResponse) this.execute( command ); + } + + + public ComposeMessageResponse sendReply( boolean inbox , long rtId , MessageType type , String toName , + String title , String contents ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ComposeMessageCommand command = new ComposeMessageCommand( inbox , rtId ); + command.setType( type ); + command.setTarget( toName ); + command.setSubject( title ); + command.setContents( contents ); + return (ComposeMessageResponse) this.execute( command ); + } + + + public ComposeMessageResponse replyTo( boolean inbox , long id ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ComposeMessageResponse) this.execute( new PrepareMessageCommand( id , inbox ) ); + } + + + public ListTargetsResponse listMessageTargets( ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListTargetsResponse) this.execute( new ListTargetsCommand( ) ); + } + + + /* Bug tracking system */ + + public ListBugsResponse listBugs( BugStatus status , boolean ownOnly , long first , int count ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ListBugsResponse) this.execute( new ListBugsCommand( status , ownOnly , first , count ) ); + } + + + public ReportBugResponse reportBug( String title , String description ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ReportBugResponse) this.execute( new ReportBugCommand( title , description ) ); + } + + + public ViewBugResponse getBugReport( long bugId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (ViewBugResponse) this.execute( new ViewBugCommand( bugId ) ); + } + + + public PostCommentResponse postBugComment( long bugId , String comment ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return (PostCommentResponse) this.execute( new PostCommentCommand( bugId , comment ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/.classpath b/legacyworlds-web/legacyworlds-web-main/.classpath new file mode 100644 index 0000000..3f554db --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.classpath @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-main/.project b/legacyworlds-web/legacyworlds-web-main/.project new file mode 100644 index 0000000..348118f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.project @@ -0,0 +1,37 @@ + + + legacyworlds-web-main + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/.jsdtscope b/legacyworlds-web/legacyworlds-web-main/.settings/.jsdtscope new file mode 100644 index 0000000..bbb8e68 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/.jsdtscope @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.jdt.core.prefs b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..30a3c16 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Thu Apr 15 19:50:22 CEST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.component b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..9c506c0 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.component @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.project.facet.core.xml b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..9680654 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.container b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.name b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/.settings/org.maven.ide.eclipse.prefs b/legacyworlds-web/legacyworlds-web-main/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..a40fb0f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Apr 15 18:52:28 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/META-INF/MANIFEST.MF b/legacyworlds-web/legacyworlds-web-main/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/ROOT.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/ROOT.ftl new file mode 100644 index 0000000..a6c8975 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/ROOT.ftl @@ -0,0 +1,13 @@ +<#setting url_escaping_charset='UTF-8'> +<#setting number_format='computer'> +<#include "/version.ftl"> +<#include "/layout/columns.ftl"> +<#include "/layout/datatable.ftl"> +<#include "/layout/fields.ftl"> +<#include "/layout/form.ftl"> +<#include "/layout/happiness.ftl"> +<#include "/layout/lists.ftl"> +<#include "/layout/tabs.ftl"> +<#include "${language}/containers/${container}.ftl" /> +<#include "${language}/types/${type}.ftl" /> +<@render /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/chat.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/chat.ftl new file mode 100644 index 0000000..28deee5 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/chat.ftl @@ -0,0 +1,28 @@ +<#include "../game.ftl"> +<#macro page title hidePlanets=false> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ +
+

${title?xhtml}

+
+ +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/external.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/external.ftl new file mode 100644 index 0000000..5f9e1ef --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/external.ftl @@ -0,0 +1,44 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
current version: <@full_version/>
+
${title?xhtml}
+ + +
+
+
+ E-mail address:
+ Password:
+ Forgot your password? + +
+
+
+ + + Scope + Rules + Register + +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/game.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/game.ftl new file mode 100644 index 0000000..3d07f3f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/game.ftl @@ -0,0 +1,70 @@ +<#include "../game.ftl"> +<#macro page title hidePlanets=false> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ Legacy Worlds Beta 6 <@version/> +
<@abbr_gt/>: <@game_time record=data.page.gameTime /> / <@abbr_st/>: ${data.page.serverTime?string("yyyy-MM-dd HH:mm:ss ZZZZZ")}
+ + +
+

${title?xhtml}

+

 

+ <#if !hidePlanets> + <#if data.page.planets?size == 0> +

Get new planet

+ <#else> +

Jump to planet: + <#list data.page.planets as planet> + ${planet.name?xhtml} + +

+ + +
+ +
+ ${data.page.empire} + <#if data.page.alliance?has_content> + [${data.page.alliance}] +
+ ${data.page.cash?string(",##0")} <@abbr_bgc/>
+ <#if data.page.special?has_content> + + <#switch data.page.special> + <#case 'v'>ON VACATION<#break> + <#case 's'>ENTERING VACATION<#break> + <#case 'q'>QUITTING<#break> + + + +
+ Account - Log out +
+ + Planets + Fleets + Map + Alliance + Enemy list + Messages + Bug tracker + +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/offline.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/offline.ftl new file mode 100644 index 0000000..37af005 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/offline.ftl @@ -0,0 +1,27 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
current version: <@full_version/>
+
${title?xhtml}
+ +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/restricted.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/restricted.ftl new file mode 100644 index 0000000..6f5efb8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/containers/restricted.ftl @@ -0,0 +1,33 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
current version: <@full_version/>
+
${title?xhtml}
+ + +
+


+ Log out +
+ +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/game.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/game.ftl new file mode 100644 index 0000000..f9518eb --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/game.ftl @@ -0,0 +1,66 @@ +<#macro game_time record> + <#if record.years == 1> + 1 year, + <#elseif record.years gt 1 > + ${record.years?string(",##0")} years, + + <#if record.weeks == 1> + 1 week, + <#elseif record.weeks gt 1 > + ${record.weeks?string} weeks, + + <#if record.days == 1> + 1 day + <#elseif record.days gt 1 > + ${record.days?string} days, + <#else> + first day, + + ${record.hours?string("00")}:00 + +<#macro game_duration record> + <#if record.years == 1> + 1 year + <#elseif record.years gt 1 > + ${record.years?string(",##0")} years + + <#if record.weeks == 1> + 1 week + <#elseif record.weeks gt 1 > + ${record.weeks?string} weeks + + <#if record.days == 1> + 1 day + <#elseif record.days gt 1 > + ${record.days?string} days + + <#if record.hours == 1> + 1 hour + <#elseif record.hours gt 1 > + ${record.hours?string} hours + + +<#macro rl_duration rTime> + <#local rlDays = (rTime / 1440)?floor> + <#local rlHours = ((rTime - rlDays * 1440) / 60)?floor> + <#local rlMinutes = (rTime - rlDays * 1440 - rlHours * 60)> + <#if rlDays gt 0> + <#if rlDays = 1>1 day<#else>${rlDays} days + + <#if rlHours gt 0> + <#if rlHours = 1>1 hour<#else>${rlHours} hours + + <#if rlMinutes gt 0> + <#if rlMinutes = 1>1 minute<#else>${rlMinutes} minutes + + +<#macro duration rTime gTime> + <#if data.page.useRLTime> + <@rl_duration rTime=rTime /> + <#else> + <@game_duration record=gTime /> + + +<#macro abbr_bgc>bgc +<#macro abbr_st>ST +<#macro abbr_gt>GT \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/home.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/home.ftl new file mode 100644 index 0000000..a9dedfb --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/home.ftl @@ -0,0 +1,28 @@ +<@page title="Legacy Worlds Beta 6 - Milestone 1"> +

+ Welcome to the first milestone release for Legacy Worlds' Beta 6. +

+

 

+

+ This is not a complete game. In fact, most of Beta 5's advanced features have been left out. + However, it is a good starting point for the development of Beta 6. The complete list of features + included in this release can be found on the Scope page. +

+

 

+

+ You will find more information about the game itself on the Rules page. It's + basically the same old thing: build stuff, kill people using the aforementioned stuff. Only the + details have changed. +

+

 

+

+ Now - this is a bit unusual, but because the real goal of this release is to test the system itself, + you are encouraged to create multiple accounts. +

+

 

+

+ While this version may be played independently from Beta 5, it doesn't feature forums (although a bug + reporting system has been included); it is therefore recommended that you + join Beta 5 anyway. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loggedOut.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loggedOut.ftl new file mode 100644 index 0000000..6f77200 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loggedOut.ftl @@ -0,0 +1,8 @@ +<@page title="Logged out"> +

+ You have been logged out of Legacy Worlds. +

+

+ Thanks for playing! +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loginFailed.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loginFailed.ftl new file mode 100644 index 0000000..8a70011 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/loginFailed.ftl @@ -0,0 +1,8 @@ +<@page title="Invalid credentials"> +

+ The e-mail address and password you entered do not match any existing account. +

+

+ Please try again. If you have forgotten your password, you may use the password recovery utility. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/noSession.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/noSession.ftl new file mode 100644 index 0000000..3b1b72b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/noSession.ftl @@ -0,0 +1,8 @@ +<@page title="Logged out automatically"> +

+ Your session has expired, and you've been logged out of Legacy Worlds. +

+

+ You need to log in again. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/passwordRecoveryOk.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/passwordRecoveryOk.ftl new file mode 100644 index 0000000..a41c2d4 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/passwordRecoveryOk.ftl @@ -0,0 +1,8 @@ +<@page title="Password Recovery Successful"> +

+ Your password recovery request has been successfully processed. +

+

+ You may now log in with the new password you have just set. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/reactivate.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/reactivate.ftl new file mode 100644 index 0000000..f83bebc --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/reactivate.ftl @@ -0,0 +1,11 @@ +<@page title="Account disabled"> +

+ Your account is currently disabled. +

+

+ You can either leave it as it is by logging out or choose to re-activate it. +

+

+ Please note that your email address must still be valid if you want to re-activate your account. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/rules.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/rules.ftl new file mode 100644 index 0000000..92ade38 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/rules.ftl @@ -0,0 +1,113 @@ +<@page title="Rules of the game"> +

General

+

+ The whole game is based on per-minute updates. Because these updates are computed depending on when the game + server was started, they may happen at any time. +

+

+ Because of this, a game time is provided. It corresponds to the amount of updates that were computed. + One "hour" of game time corresponds to an update and, generally speaking, a minute of real-world time. +

+

+ No real attempts at balancing the game were made. It is therefore quite likely that some aspects of the rules + will not work as expected. +

+

 

+ +

Money & research

+

+ Income is mostly provided by an empire's population. While income and upkeep are displayed for 24h of real-world time, + an empire's cash reserve will increase (or decrease) continuously. The optional Generic assembly line building + provides additional income. +

+

+ Populations also generate research points, which are used to update an empire's research progress. When a + technology reaches 100% of its required research points, it needs to be implemented, which costs + money. +

+

+ Two sets of three technologies are available: civilian technologies provide new buildings, while + military technologies provide new ships. +

+

+ If an empire's cash reserve reach 0 because of a high upkeep, its fleets will begin to degrade. If it does not + own any fleets, then its planet's buildings start to degrade. +

+

+ It is however possible for an empire to reach 0 because of buildings and ships construction. In this case, + no damage will be inflicted, but construction will be slowed down. +

+

 

+ +

Planet management

+

+ Two types of buildings are available without any technology: ship parts factories (which allow ships to be built) + and defence turrets (which provide stationary defences to your planets). +

+

+ Buildings construction or destruction are not immediate. The speed at which buildings are constructed or destroyed + depend on a planet's population. When building, the monetary cost of buildings is taken from the empire's reserves + at every update. +

+

+ Destroying buildings is much faster than constructing them; in addition, a small proportion of the building's cost + is added back to the empire's cash reserves once the building is destroyed. +

+

+ A planet's happiness is determined by three factors: the amount of jobs provided by the planet's buildings relative + to the planet's population, the stationary defences' power and the amount of planets owned by the empire. +

+

+ Happiness does not change immediately when something affects it. The change is progressive, and its speed depend + on its amplitude and on the planet's total population. +

+

+ When a planet's happiness is below 25%, its citizen go on strike, which reduces the planet's income, production and + defences. +

+

+ Population growth is directly proportional to the planet's happiness. +

+

 

+ +

Fleets and ships

+

+ Ships are constructed on planets using the same principle as buildings. However, their construction speed is determined + by the planet's military production. +

+

+ Ships have two characteristics: their power, which determine how effective they are in battle, and their + orbit-to-orbit flight time, which determines their speed and the various penalties which may be inflicted + on a fleet (redirection, redeployment, etc). +

+

+ A fleet's power is the sum of each of its ships' power. Its orbit-to-orbit flight time is determined by the slowest + ship in the fleet. +

+

+ Only fleets that have the available status may be moved, split, or merged. In addition, fleets that have + the deploying status do not inflict damage in battle (they do however receive damage). All fleets may be + renamed, disbanded, or switched between offensive and defensive modes, whatever their status is. +

+

 

+ +

Battles

+

+ A battle starts whenever an attacking fleet is present on a planet, and end when all attacking fleets are gone / have + been destroyed, or when all defensive fleets and planetary defences are gone / have been destroyed. In the latter case, + the attacker with the biggest fleet takes control of the planet at the next update. +

+

+ Battles are updated every minute. Therefore, there are no "battle reports"; instead, a history of the battle and + the events that occured during the battle are provided. +

+

+ A battle's intensity starts at a low level, slowly increasing over time until it reaches full intensity. It determines how + much damage is dealt. +

+

+ Battle damage on both buildings and ships accumulates over time. It is not possible to repair ships or buildings. +

+

 

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/scope.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/scope.ftl new file mode 100644 index 0000000..0f7ee32 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/static/scope.ftl @@ -0,0 +1,56 @@ +<@page title="Scope of this milestone"> +

+ This milestone consists mostly in writing the game's engine and most of the common + administrative functionalities. Because of this, the game itself + is pretty limited, and so is the interface. +

+

 

+ +

Game server

+

+ The stand-alone game server runs independently of any interface and is responsible for + all administrative and game functionalities. This release concentrates on: +

+
    +
  • system basics - logging, run-time access to game-related "constants", + internationalisation, communications with user interfaces,
  • +
  • accounts - from registration to preferences to inactivity management,
  • +
  • naming system - the names of all in-game entities (empires and planets + in this release) are managed through the same sub-system,
  • +
  • bug tracking system - because it will not be possible to include forums + until much further in the game's development cycle, the bug-tracking system is an essential + tool,
  • +
  • scheduler - because ticks still need to run, sometimes.
  • +
+

 

+ +

Server administration

+

+ Server administration is one of the most important areas for this release, although most + people will (hopefully) never get to see it. It is implemented as a separate user interface + accessing the server through its external communication interface. The administration interface + includes: +

+
    +
  • privilege system (not all administrators are equal),
  • +
  • account management,
  • +
  • game parameters access,
  • +
  • bug tracker administration,
  • +
  • names validation,
  • +
  • log viewer,
  • +
  • automated error reports.
  • +
+

 

+ +

Game and interface

+

+ While the game does not bring anything really new, it is based on a per-minute update system. + Its interface is probably not really appropriate, as Beta 5's external layout is a bit cramped + when it comes to displaying all required in-game information; it is however temporary. +

+

+ This release is available in two languages - English and French - as the internationalisation + system needs to be tested. However, it is extremely likely that future milestone releases will + only be available in English. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/account.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/account.ftl new file mode 100644 index 0000000..2fa1826 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/account.ftl @@ -0,0 +1,220 @@ +<#macro render_preference pref> + <#switch pref.type> + <#case 'BOOLEAN'> + <@form_select label=pref.name name=pref.id id="pref-${pref.id}"> + <@form_option value="0" text="No" selected=( pref.value != "1" )/> + <@form_option value="1" text="Yes" selected=( pref.value == "1" )/> + + <#break> + <#case 'INTEGER'> + <#case 'STRING'> + <@form_text label=pref.name name=pref.id id="pref-${pref.id}" value=pref.value /> + <#break> + <#case 'CHOICE'> + <@form_select label=pref.name name=pref.id id="pref-${pref.id}"> + <#list pref.choices as choice> + <@form_option value=choice.value text=choice.display selected=( pref.value == choice.value )/> + + + <#break> + + <#if pref.description?has_content> + <@form_extra>${pref.description?xhtml} + + +<#macro render_prefs_category category> + <@form_part title=category.name /> + <#list category.preferences as p> + <@render_preference pref=p /> + + +<#macro render> +<@page title="Account"> + <@tabs> + + <@tab id="prefs" title="Preferences"> + <@form name="prefs-form" action="set-preferences" hash="prefs"> + <#list data.account.preferences as c> + <@render_prefs_category category=c /> + + <@form_extended_submit label="Change preferences"> + <@ff_submit label="Defaults" name="load-default-preferences" /> + + + + + <@tab id="basics" title="Identity"> + <@form name="lang-form" action="set-language" hash="basics"> + <@form_part title="Account language" /> + <@form_select name="language" label="Language"> + <#list data.account.supportedLanguages.languages as lang> + <@form_option text=lang.name value=lang.id selected=(lang.id == data.account.language) /> + + + <@form_submit label="Update" /> + + + <@form name="pwd-form" action="set-password" hash="basics"> + <@form_part title="Change password" /> + <#if data.authError!false> + <@form_error>Incorrect password + + <@form_pwd label="Current password" name="current" /> + <#switch data.passwordError!""> + <#case "EMPTY"> + <@form_error>Empty password. + <#break> + <#case "TOO_WEAK"> + <@form_error>This password is too weak. + <#break> + <#case "MISMATCH"> + <@form_error>Password field and confirmation field do not match. + <#break> + <#case "PROHIBITED"> + <@form_error>You are not allowed to use this password here. + <#break> + <#default> + <@form_extra>At least 6 characters, containing both text and numbers. Bonus points for special characters, spaces, and extremely long passwords. + + <@form_pwd label="Password" name="password" /> + <@form_pwd label="Password (confirm)" name="passwordConfirm" /> + <@form_submit label="Update" /> + + + <#if data.account.mailChange?has_content> + <#local mc = data.account.mailChange> + <#if mc.used> + <@form name="mail-form" action="set-address" hash="basics"> + <@form_part title="Change e-mail address" /> + + Current address: + ${data.account.address?xhtml} + + <@form_extra> + You will be able to request an e-mail address change at ${mc.until?string("HH:mm:ss (ZZZZZ)")}. + + + <#else> + <@form name="mail-form" action="confirm-set-address" hash="basics"> + <@form_part title="Change e-mail address" /> + + Current address: + ${data.account.address?xhtml} + + <@form_extra> + You are changing your address to ${mc.newAddress?xhtml}.
+ Your request will expire at ${mc.until?string("HH:mm (ZZZZZ)")}. + + <#if data.codeError!false> + <@form_error>Incorrect confirmation code + + <@form_text name="code" id="mail-confirmation-code" value="${data.code!}" maxLength=64 label="Confirmation code" /> + <@form_extended_submit label="Change address"> + <@ff_submit label="Cancel" name="cancel-set-address" /> + + + + <#else> + <@form name="mail-form" action="set-address" hash="basics"> + <@form_part title="Change e-mail address" /> + <#if data.mailAuthError!false> + <@form_error>Incorrect password + + + Current address: + ${data.account.address?xhtml} + + <@form_pwd label="Current password" name="password" id="current-2" /> + <#switch data.mailError!""> + <#case "EMPTY"> + <@form_error>Empty e-mail address. + <#break> + <#case "INVALID"> + <@form_error>Invalid e-mail address. + <#break> + <#case "IN_USE"> + <@form_error>This e-mail address is already associated with an account. + <#break> + <#case "SEND_FAIL"> + <@form_error>Unable to send confirmation code to this address. + <#break> + <#case "MISMATCH"> + <@form_error>E-mail address field and confirmation field do not match. + <#break> + <#default> + <@form_extra>The e-mail address MUST exist. + + <@form_text label="E-mail address" maxLength=128 name="mail" value=data.mail! /> + <@form_text label="E-mail address (confirm)" maxLength=128 name="mailConfirm" value=data.mail! /> + <@form_submit label="Update" /> + + + + + <@tab id="status" title="Status"> + <@form name="game-credits" action="no-action" hash="status"> + <@form_part title="Game credits" /> + + Game credits: + ${data.account.gameCredits?string(',##0')} + + <@form_extra> + Game credits cannot be used at this time. They will however be accumulated + throughout the LWB6 development cycle. You obtain them by reporting bugs. + + + + <@form name="vacation-form" action="toggle-vacation" hash="status"> + <@form_part title="Vacation mode" /> + + Vacation credits: + ${data.account.vacCredits?string(',##0')} + + + Maximal duration: + + <#if data.account.vacTime?has_content> + approximately <@game_duration record=data.account.vacTime /> + <#else> + less than an hour + + + + <#if data.account.vacStart?has_content> + + Vacation start: + ${data.account.vacStart?string("HH:mm (yyyy-MM-dd ZZZZZ)")} + + <#if data.page.special == 'v'> + <@form_submit label="Exit vacation mode" /> + <#else> + <@form_submit label="Cancel vacation mode" /> + + <#elseif !data.page.special?has_content && data.account.vacTime?has_content> + <@form_submit label="Enter vacation mode" /> + + + + <#if !data.page.special?has_content> + <@form name="quit-form" action="quit" hash="status"> + <@form_part title="Quit game" /> + <@form_extra> + If you click the button below, your account will be disabled after 24 hours. You will be able to re-enable it for the next 6 months, after which it will be deleted. + + <@form_text label="Reason for quitting (optional)" name="reason" value="" /> + <@form_submit label="Quit game" /> + + <#elseif data.page.special == 'q'> + <@form name="quit-form" action="cancel-quit" hash="status"> + <@form_part title="Quit game" /> + <@form_extra> + Your account will be disabled at ${data.account.quitGame?string("HH:mm (yyyy-MM-dd ZZZZZ)")}. + + <@form_submit label="Cancel" /> + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/alliance.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/alliance.ftl new file mode 100644 index 0000000..c0c8dd7 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/alliance.ftl @@ -0,0 +1,268 @@ +<#macro show_alliance alliance> + <@dt_main> + <@dt_entry title="Tag">${alliance.tag?xhtml} + <@dt_entry title="Name">${alliance.name?xhtml} + <@dt_entry title="Leader">${alliance.leaderName?xhtml} + <@dt_entry title="Planets">${alliance.planets?string(",##0")} + <@dt_entry title="">Send message + + +<#macro alliance_info_tab> + + <@tab id="info" title="Other alliances"> + + <@form action="alliance-info" name="alliance-info" hash="info"> + <@form_text name="tag" id="ai-tag" label="Alliance tag" value=data.requested! maxLength=5 /> + <@form_submit label="Get information" /> + + + <#if data.info?has_content> + <@show_alliance alliance=data.info /> + + + + + +<#macro alliance_creation_tab> + + <#if data.creation?has_content> + <#assign tag = data.creation.tag!> + <#assign tagError = data.creation.tagError!> + <#assign name = data.creation.name!> + <#assign nameError = data.creation.nameError!> + <#else> + <#assign tag = ""> + <#assign tagError = ""> + <#assign name = ""> + <#assign nameError = ""> + + + <@tab id="create-alliance" title="Create"> + <@form action="create-alliance" name="create-alliance" hash="create-alliance"> + <#switch tagError> + <#case "EMPTY"><@form_error>Please specify your alliance's tag.<#break> + <#case "INVALID"><@form_error>This tag is invalid.<#break> + <#case "UNAVAILABLE"><@form_error>This tag is used by another alliance. + + <@form_text name="tag" id="ca-tag" label="Alliance tag" value=tag maxLength=5 /> + + <#switch nameError> + <#case "EMPTY"><@form_error>Please specify your alliance's name.<#break> + <#case "INVALID"><@form_error>This name is invalid.<#break> + + <@form_text name="name" id="ca-name" label="Alliance name" value=name maxLength=5 /> + + <@form_submit label="Create an alliance" /> + + + + +<#macro alliance_join_tab> + + <@tab id="join-alliance" title="Join"> + <@form action="join-alliance" name="join-alliance" hash="join-alliance"> + <#if data.joinFailure?has_content> + <@form_error>Alliance not found. + + <@form_text name="tag" id="ja-tag" label="Alliance tag" value=data.joinFailure! maxLength=5 /> + <@form_submit label="Join this alliance" /> + + + + +<#macro no_alliance> + + <#if data.page.special! != 'v'> + <@alliance_join_tab /> + <@alliance_creation_tab /> + + + +<#macro alliance_joining_tab> + + <@tab id="join-alliance" title="Request sent"> + <@lineform action="cancel-join" hash="join-alliance"> + A request to join ${alliance.main.tag?xhtml} has been sent. + <#if data.page.special! != 'v'> + <@ff_submit label="Cancel" /> + + + <@show_alliance alliance=alliance.main /> + + + +<#macro alliance_planets pList> + <@tab id="planets" title="Planets"> + + <#if pList?size == 0> +

There are no planets in the alliance.

+ <#return> + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Coordinates + <@lv_column width=150>Planet + <@lv_column width=150>Owner + + + <#list pList as planet> + <#if planet.battle> + <#local bStart = ""> + <#local bEnd = ""> + <#else> + <#local bStart = " "> + <#local bEnd = " "> + + + <@lv_line> + <@lv_column centered=true>${bStart}(${planet.x},${planet.y};${planet.orbit})${bEnd} + <@lv_column>${bStart}${planet.name?xhtml}${bEnd} + <@lv_column>${bStart}${planet.owner?xhtml}${bEnd} + + + <#if planet.battle> + <@lv_line> +   + + Military situation: + ${planet.defence?string(",##0")} + vs. + ${planet.attack?string(",##0")} + + + + + + + + +<#macro alliance_members mList isLeader empty=""> + + <#if mList?size == 0 && empty != ""> +

${empty?xhtml}

+ <#return> + + + <@listview> + <@lv_line headers=true> + <#if isLeader && data.page.special! != 'v'> + <@lv_column width=40 centered=true>  + + <@lv_column width="x">Empire + + + <#list mList as member> + <@lv_line> + <#if isLeader && data.page.special! != 'v'> + <@lv_column centered=true> + <#if member.name == data.page.empire> +   + <#else> + + + + + <@lv_column> + <#if member.name == data.page.empire> + ${member.name?xhtml} + <#else> + ${member.name?xhtml} + + + + + + + +<#macro alliance_member_page> + <#local leader = alliance.leader?has_content> + + <@tab id="in-alliance" title="Alliance"> + <@lineform action="leave-alliance" hash="join-alliance"> + You are + <#if alliance.leader?has_content> + the leader + <#else> + a member + + of ${alliance.main.tag?xhtml}. + <#if data.page.special! != 'v'> + <@ff_submit label="Leave alliance" /> + + + <@show_alliance alliance=alliance.main /> + + + <@alliance_planets pList=alliance.member.planets /> + + <@tab id="members" title="Members"> + <#if leader && alliance.member.members?size gt 1 && data.page.special! != 'v'> +
+ + <@alliance_members mList=alliance.member.members isLeader=leader /> + <#if leader && alliance.member.members?size gt 1 && data.page.special! != 'v'> +
+
+ <@ff_submit label="Kick selected members" /> +
+
+
+ + <@lineform action="transfer-leadership" hash="members"> + Transfer leadership to + <@ff_select id="leadership" name="leadership"> + <#list alliance.member.members as member> + <#if member.name != data.page.empire> + <@form_option value=member.id text=member.name /> + + + + <@ff_submit label="Confirm" /> + + + + + <#if leader> + <@tab id="requests" title="Requests"> + <#if alliance.leader.requests?size gt 0 && data.page.special! != 'v'> +
+ + <@alliance_members mList=alliance.leader.requests isLeader=true empty="No pending requests" /> + <#if alliance.leader.requests?size gt 0 && data.page.special! != 'v'> +
+
+ <@ff_select id="requests-select" name="action"> + <@form_option value="1" text="Accept" /> + <@form_option value="0" text="Reject" /> + selected applicants + <@ff_submit label="Confirm" /> +
+
+
+ + + + + +<#macro render> +<@page title="Alliance"> + + <#assign alliance = data.alliance> + <@tabs> + + <#if alliance.main?has_content> + <#if alliance.member?has_content> + <@alliance_member_page /> + <#else> + <@alliance_joining_tab /> + + <#else> + <@no_alliance /> + + <@alliance_info_tab /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/banned.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/banned.ftl new file mode 100644 index 0000000..b143398 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/banned.ftl @@ -0,0 +1,12 @@ +<#macro render> +<@page title="You've been banned"> +

You did it. You got yourself banned. Nice work.

+ <@dt_main> + <@dt_entry width=200 title="Ban date/time">${data.banTime?string("yyyy-MM-dd HH:mm:ss")} + <@dt_entry width=200 title="Reason for the ban">${data.banReason?xhtml} + + <#if data.redeemable> +

Your empire has not been deleted yet. You may appeal the ban by sending an email to the staff within 48h.

+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battle.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battle.ftl new file mode 100644 index 0000000..f749a23 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battle.ftl @@ -0,0 +1,261 @@ +<#macro render_header desc> +
+ At ${desc.location.name?xhtml} + (${desc.x},${desc.y};${desc.orbit}) +
+ +<#macro render_navigation id disp> +
+ + + + + + + +
+ <#if disp.previous?has_content> + + + << + <#if disp.previous?has_content> + + + + <@ff_select id="view-battle-tick" name="tick" style="width:470px"> + <#list disp.all as viewable> + <@form_option value="${viewable.ticks?string('#')}" selected=(viewable.ticks == disp.current.ticks)><@game_time record=viewable.gameTime /> + + + <@ff_submit label="Go" style="width:40px" /> + + <#if disp.next?has_content> + + + >> + <#if disp.next?has_content> + + + + >>> +
+
+ +<#macro render_list_entry mode record type> + +   + buildings<#else>ships">  +   + + <#nested> + + ${record.cPower?string(',##0')} + ${record.lPower?string(',##0')} + + <#list record.ships as shipType> + +   + ${shipType.name} + ${shipType.cAmount?string(',##0')} + ${shipType.lAmount?string(',##0')} + + + +<#macro render_protagonist mode record> + <#if record.ships?has_content> + <@render_list_entry mode=mode record=record type="empire"> + <#if record.player.id = 0 || mode = "own"> + ${record.player.name?xhtml} + <#else> + ${record.player.name?xhtml} + + + + +<#macro render_planet mode record> + <@render_list_entry mode=mode record=record type="planet">( planet ) + +<#macro render_protagonists mode source> + <#if source.players?size = 0> + <#return> + + +   +   + <#if mode == "allied">Allied<#else>Hostile forces + ${source.cPower?string(',##0')} + ${source.lPower?string(',##0')} + + <#list source.ships as shipType> + +   + ${shipType.name} + ${shipType.cAmount?string(',##0')} + ${shipType.lAmount?string(',##0')} + + + <#list source.players as pRecord> + <@render_protagonist mode=mode record=pRecord /> + + +<#macro render_fleets fData> + <@listview> + Forces + <@lv_line headers=true> +   +   +   +   +   + <@lv_column width=100 centered=true>Current + <@lv_column width=100 centered=true>Lost + + <@render_protagonist mode="own" record=fData.own /> + <#if fData.planet.relation == "OWN"> + <@render_planet mode="own" record=fData.planet /> + + <@render_protagonists mode="allied" source=fData.friendly /> + <#if fData.planet.relation == "ALLIED"> + <@render_planet mode="allied" record=fData.planet /> + + <@render_protagonists mode="enemy" source=fData.hostile /> + <#if fData.planet.relation == "ENEMY"> + <@render_planet mode="enemy" record=fData.planet /> + + Click "*" and "+" to toggle ships/buildings and forces display. + + +<#macro render_event_items items> + <#list items as item> + <@lv_line> +   + ${item.name} + ${item.cAmount?string(",##0")} + + + +<#macro render_event event> + <#switch event.type> + <#case "RENAME"> + <@lv_line> + Planet renamed to ${event.name} + + <#break> + <#case "SWITCH"> + <@lv_line> + + <#if event.name = data.page.empire> + We have switched to <#if event.hostile>attack<#else>defence. + <#else> + ${event.name} has switched mode and is now <#if event.hostile>hostile<#else>friendly. + + + + <#break> + <#case "BUILD"> + <@lv_line> + + <#if event.planet> + New buildings have been constructed on the planet. + <#elseif event.name = data.page.empire> + Our new fleets have been deployed. + <#else> + <#if event.hostile>Hostile<#else>Friendly fleets belonging to ${event.name} have been deployed. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "DEPART"> + <@lv_line> + + <#if event.name = data.page.empire> + Our fleets have left orbit. + <#else> + <#if event.hostile>Hostile<#else>Friendly fleets belonging to ${event.name} have left orbit. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "ARRIVE"> + <@lv_line> + + <#if event.name = data.page.empire> + Our fleets have joined the battle. + <#else> + <#if event.hostile>Hostile<#else>Friendly fleets belonging to ${event.name} have joined the battle. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "DESTROY"> + <@lv_line> + + <#if event.planet> + Buildings have been destroyed on the planet. + <#elseif event.name = data.page.empire> + Our fleets have been disbanded. + <#else> + <#if event.hostile>Hostile<#else>Friendly fleets belonging to ${event.name} have been disbanded. + + + + <@render_event_items items=event.ships /> + <#break> + <#default> + <@lv_line> + + Missing event type "${event.type}" (this is a bug) + + + <#break> + + +<#macro render_history hData> + <#if hData?size = 0> + <#return> + + <@listview> + History + <@lv_line headers=true> +   +   +   + + <#list hData as hInterval> + <#if hInterval.end?has_content> + <#if hInterval.battleEnds> + Battle ended at <@game_time record=hInterval.end.gameTime /> + <#else> + No more fleets at this location + +   + + <#list hInterval.entries as atTick> + <@game_time record=atTick.time.gameTime />: + <#list atTick.events as event> + <@render_event event=event /> + +   + + <#if hInterval.battleBegins> + Battle started at <@game_time record=hInterval.begin.gameTime /> + + + + +<#macro render> +<#local bDescription = data.battle.description> +<#local bDisplay = data.battle.display> +<@page title="Battle #${bDescription.id?string(',##0')} at ${bDescription.location.name}"> + + <@render_header desc=bDescription /> + <@render_navigation id=bDescription.id disp=bDisplay /> +

 

+ <@render_fleets fData=data.battle.ships /> + <@render_history hData=data.battle.history /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battles.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battles.ftl new file mode 100644 index 0000000..0c39c6c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/battles.ftl @@ -0,0 +1,62 @@ +<#macro render_battles battles page pages> + <#if pages gt 1> + + + + + + +
+ <#if page gt 0> + + + << + <#if page gt 0> + + + + Page ${page + 1} / ${pages} + + <#if page lt pages - 1> + + + >> + <#if page lt pages - 1> + + +
+ + <@listview> + <@lv_line headers=true> + <@lv_column width=60 centered=true># + <@lv_column width="x">Location + <@lv_column width=80 centered=true>  + <@lv_column width=125 centered=true>Joined + <@lv_column width=125 centered=true>Finished + + <#list battles as battle> + <@lv_line> + <@lv_column centered=true>${battle.id?string(',##0')} + <@lv_column>${battle.location.name?xhtml} + <@lv_column centered=true>(${battle.x},${battle.y};${battle.orbit}) + <@lv_column centered=true><@game_time record=battle.first.gameTime /> + <@lv_column centered=true> + <#if battle.last?has_content> + <@game_time record=battle.last.gameTime /> + <#else> + In progress + + + + + + +<#macro render> +<@page title="Battles"> + <#if data.pages == 0> +

We have not taken part in any battle

+ <#else> + <@render_battles battles=data.list page=data.currentPage pages=data.pages /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsList.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsList.ftl new file mode 100644 index 0000000..e206f0d --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsList.ftl @@ -0,0 +1,136 @@ +<#include "bugsTabs.ftl"> +<#macro render_navigation current count total qString> + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 1> + ${total?string(',##0')} entries found. + <#elseif total = 1> + 1 entry found. + <#else> + No entries found. + + + <#if current lt total - count> + + + >> + <#if current lt total - count> + + +
+ +<#macro render> +<#if data.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.status!'x'}&own=${ownOnly}" > +<@page title="Bug tracker"> + <#-- Tabs --> + <@bugTabs selected="bugsList" qString="${qString}&first=${data.first}" /> + + <#-- Selection --> +
+
+ + +
+ List + <@ff_select id="sel-own" name="own"> + <@form_option value="0">all + <@form_option value="1" selected=(data.ownOnly)>my own + + reports with the following status: + <@ff_select id="sel-stat" name="status"> + <@form_option value="x">(indifferent) + <@form_option value="PENDING" selected=((data.status!"") = 'PENDING')>pending validation + <@form_option value="OPEN" selected=((data.status!"") = 'OPEN')>being handled + <@form_option value="RESOLVED" selected=((data.status!"") = 'RESOLVED')>fixed + <@form_option value="WONT_FIX" selected=((data.status!"") = 'WONT_FIX')>won't fix + <@form_option value="NOT_A_BUG" selected=((data.status!"") = 'NOT_A_BUG')>not a bug + + <@ff_submit label="Search" /> +
+
+
+ + <#-- Navigation --> + <@render_navigation current=data.first count=data.count total=data.entries qString=qString /> + + <#-- List of bugs --> + <#if data.reports?size gt 0> + <@listview> + + <@lv_line headers=true> + <@lv_column centered=true width=60># + <@lv_column width="x">Title + <#if !( data.status?has_content )> + <@lv_column width=130 centered=true>Status + + <@lv_column width=150 centered=true>Last update + + + <#list data.reports as report> + + <#if !data.ownOnly && report.initialSubmitter.userId?has_content && !report.initialSubmitter.admin && report.initialSubmitter.name = data.page.empire> + <#local eClass="own-fleet"> + <#else> + <#local eClass=""> + + + <@lv_line class=eClass> + <@lv_column centered=true>${report.reportId?string(",##0")} + <@lv_column>${report.title} + <#if !( data.status?has_content )> + <@lv_column centered=true><@bugStatus status=report.status /> + + <@lv_column centered=true> + <#if report.updated> + + + ${report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + <#if report.updated> + + + + + <@lv_line class=eClass> + <#if data.status?has_content> + + <#else> + + +   + <@lv_column centered=true> + by + <#if report.latestSubmitter.admin> + + + ${report.latestSubmitter.name} + <#if report.latestSubmitter.admin> + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsReport.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsReport.ftl new file mode 100644 index 0000000..0dc7272 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsReport.ftl @@ -0,0 +1,57 @@ +<#include "bugsTabs.ftl"> +<#macro render> +<#if data.query.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Report bug"> + <@bugTabs selected="bugsReport" qString="${qString}&first=${data.query.first}" /> + +

READ THIS BEFORE REPORTING BUGS

+

+ So, you've found something that doesn't work or that seems to be behaving in an unexpected manner. + Nice, that's the reason why this version has been made public. +

+

+ However, are you sure that what you have found is really a bug? If you'd been playing Beta 5 in + the past, there are many things that no longer work in the same way. Make sure you've read the + rules and milestone information first. +

+

+ Once you've read this documentation and haven't found any clue related to your problem, well, + it's either a bug or something missing in these pages. In any case, it should be reported. + Use the form below for that. Make sure the title is as clear as possible + (it should indicate the nature of the problem) and that the description is as thorough as you + can make it. +

+

+ Thanks for helping! +

+ + <@form action="report-bug" hash="report-form"> + + + + + + + <#switch data.titleError!""> + <#case "EMPTY"><@form_error>Please specify the report's title<#break> + <#case "INVALID"><@form_error>Title should be at least 10 characters long<#break> + + <@form_text label="Title" name="title" value=data.title!"" maxLength=127 /> + + <#switch data.descriptionError!""> + <#case "EMPTY"><@form_error>Please specify the bug's description<#break> + <#case "INVALID"><@form_error>Description should be at least 30 characters long<#break> + + <@form_text label="Description" name="description" value=data.description!"" multiline=true maxLength=10 /> + + <@form_submit label="Post bug report" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsTabs.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsTabs.ftl new file mode 100644 index 0000000..e047ca7 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsTabs.ftl @@ -0,0 +1,18 @@ +<#macro bugTab href title selected> + ${title} + +<#macro bugTabs selected qString> +
+ <@bugTab href="bugtrack?${qString}" title="List bugs" selected=( selected = 'bugsList' ) /> + <@bugTab href="report-bug?${qString}" title="Report bug" selected=( selected = 'bugsReport' ) /> +
+ +<#macro bugStatus status> + <#switch status> + <#case "PENDING">pending validation<#break> + <#case "OPEN">being handled<#break> + <#case "RESOLVED">fixed<#break> + <#case "WONT_FIX">won't fix<#break> + <#case "NOT_A_BUG">not a bug<#break> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsView.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsView.ftl new file mode 100644 index 0000000..0fea18b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/bugsView.ftl @@ -0,0 +1,124 @@ +<#include "bugsTabs.ftl" /> +<#macro render_submitter s> + <#if s.admin> + + <#elseif s.userId?has_content && s.name = data.page.empire> + + + ${s.name?xhtml} + <#if s.admin || ( s.userId?has_content && s.name = data.page.empire )> + + + +<#macro render_event e> +
+ ${e.timestamp?string("yyyy-MM-dd HH:mm:ss")} - <@render_submitter s=e.submitter /> + <#nested> +
+ +<#macro render_report_event e> + <@render_event e=e> + posted bug report #${e.id?string(",##0")} + +

${e.title}

+
+ ${e.contents} +
+ +<#macro render_status_event e> + <@render_event e=e> + set the report's status to <@bugStatus status=e.status /> + + +<#macro render_visibility_event e> + <@render_event e=e> + set the report's visibility to <#if e.visible>public<#else>private + + +<#macro render_merge_event e> + <@render_event e=e> + merged current bug report with bug report #${e.mergedId?string(",##0")} + + +<#macro render_comment_event e> + <@render_event e=e> + posted a comment + <#if !e.visible> + (moderation pending) + + +
+ ${e.contents} +
+ +<#macro render> +<#if data.query.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Bug #${data.report.reportId?string(',##0')} - ${data.report.title}" hidePlanets=true> + <#-- Tabs --> + <@bugTabs selected="" qString="${qString}&first=${data.query.first}" /> + + <#-- Bug info --> + <@dt_main> + <@dt_entry title="Status"><@bugStatus status=data.report.status /> + <@dt_entry title="Public"><#if data.report.visible>Yes<#else>No + <@dt_entry title="Initially reported"> + ${data.report.posted?string("yyyy-MM-dd HH:mm:ss")} + by <@render_submitter s=data.report.initialSubmitter /> + + <@dt_entry title="Latest update"> + ${data.report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + by <@render_submitter s=data.report.latestSubmitter /> + + + + <#-- List events --> + <#local mayPost = false> + <#list data.events as event> +
+ <#local mayPost = ( mayPost || ( !event.submitter.admin && event.submitter.userId?has_content && event.submitter.name = data.page.empire ) )> + <#switch event.type> + <#case 'INIT'> + <@render_report_event e=event /> + <#break> + <#case 'STATUS'> + <@render_status_event e=event /> + <#break> + <#case 'COMMENT'> + <@render_comment_event e=event /> + <#break> + <#case 'VISIBILITY'> + <@render_visibility_event e=event /> + <#break> + <#case 'MERGE'> + <@render_merge_event e=event /> + <#break> + + + + <#-- Comment form --> + <#if mayPost && ( data.report.status = 'OPEN' || data.report.status = 'PENDING' )> +
+ <@form action="bug-${data.report.reportId}-comment" hash="post-comment"> + + + + + + + + <#switch data.commentError!""> + <#case "EMPTY"><@form_error>You should type a comment before posting a comment.<#break> + <#case "INVALID"><@form_error>Comments must be at least 30 characters long.<#break> + + <@form_text label="New comment" name="comment" multiline=true maxLength=6 value=data.comment!"" /> + <@form_submit label="Post comment" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/chat.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/chat.ftl new file mode 100644 index 0000000..f62c595 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/chat.ftl @@ -0,0 +1,27 @@ +<#macro render> +<@page title="Legacy Worlds chat"> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/enemies.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/enemies.ftl new file mode 100644 index 0000000..3dc1fa9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/enemies.ftl @@ -0,0 +1,98 @@ +<#macro enemy_tab eList alliances> + + <#if alliances> + <#local tabId = "alliances"> + <#local addAction = "alliance"> + <#local tabTitle = "Alliances"> + <#local emptyText = "No enemy alliances."> + <#local nameLen = 5> + <#if data.alliance?has_content & data.alliance> + <#local error = data.error> + <#local defName = data.name> + + <#else> + <#local tabId = "empires"> + <#local addAction = "empire"> + <#local tabTitle = "Empires"> + <#local emptyText = "No enemy empires."> + <#local nameLen = 20> + <#if data.alliance?has_content & !data.alliance> + <#local error = data.error> + <#local defName = data.name> + + + + <@tab id=tabId title=tabTitle> + + <#if eList?size == 0> +

${emptyText}

+ <#else> +
+ <@listview> + <@lv_line headers=true> + <#if data.page.special! != 'v'> + <@lv_column width=40 centered=true>  + + <@lv_column width="x">${tabTitle} + + + <#list eList as enemy> + <@lv_line> + <#if data.page.special! != 'v'> + <@lv_column centered=true> + + <@lv_column> + <#if alliances>[<#else>${enemy.name?xhtml}<#if alliances>] + + + + + <#if data.page.special! != 'v'> +
+
+ <@ff_submit label="Remove selected enemies" /> +
+
+ +
+ + + <#if data.page.special! != 'v'> + <#if error?has_content> + <@standalone_error> + <#switch error> + <#case "INVALID"><#if alliances>Alliance<#else>Empire not found.<#break> + <#case "BANNED"> + <#if alliances> + Feeling Mordred-ish today, are we? + <#else> + There's a medical term for that - schizophrenia. + + <#break> + <#case "UNAVAILABLE"> + This <#if alliances>alliance<#else>empire is already in your enemy list. + <#break> + + + + <@lineform action="add-enemy-${addAction}" hash=tabId> + New enemy: <@ff_text id="name-${addAction}" name="name" value=defName! maxLength=nameLen size=(nameLen+1) /> + <@ff_submit label="Add" /> + + + + + + +<#macro render> +<@page title="Enemy list"> + + <@tabs> + + <@enemy_tab eList=data.empires alliances=false /> + <@enemy_tab eList=data.alliances alliances=true /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleets.ftl new file mode 100644 index 0000000..1833cf9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleets.ftl @@ -0,0 +1,261 @@ +<#macro render_fleet_ships rType id ships> + + + + + + + <#list ships as ship> + + + + + + +
Ship classQuantityPower
${ship.name}${ship.amount?string(',##0')}${ship.power?string(',##0')}
+ +<#macro render_static_fleet_details rType fleet> + +   + +
+ <@render_fleet_ships rType="own-fleet" id=fleet.id ships=fleet.ships /> +
+
+ <@dt_main> + <#if fleet.status != 'AVAILABLE'> + <@dt_entry title="Penalty"> + <@duration rTime=fleet.penalty gTime=fleet.gamePenalty /> + + + <@dt_entry abbr="OOFT" title="Orbit-to-orbit flight time"> + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + +
+ + + +<#macro render_fleets_at location owners> + <#list owners as owner> + <#switch owner.relation> + <#case 'OWN'> + <#local rType = 'own-fleet'> + <#local mode = location.attacking > + <#break> + <#case 'ALLIED'> + <#local rType = 'allied-fleet'> + <#local mode = location.attacking > + <#break> + <#case 'ENEMY'> + <#local rType = 'enemy-fleet'> + <#local mode = ! location.attacking > + <#break> + + <#list owner.fleets as fleet> + + + <#if owner.relation == 'OWN' && data.page.special! != 'v'> + + <#else> +   + + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (unnamed fleet) + + + + <#if owner.relation = 'OWN'> + ${owner.name?xhtml} + <#else> + ${owner.name?xhtml} + + + + <#if mode>A<#else>D + + ${fleet.power?string(',##0')} + + <#if fleet.status == 'AVAILABLE'> + AVL + <#else> + <#switch fleet.status> + <#case 'DEPLOYING'>DPL<#break> + <#case 'REDEPLOYING'>RDP<#break> + + + + + <@render_static_fleet_details rType=rType fleet=fleet /> + + + +<#macro render_static_fleets locations> + <#list locations as location> + + + + + + + + + + + <#if location.onVacation!false> + + <#elseif location.battle?has_content && location.battle.hostile gt 0> + + +
${location.name?xhtml}${location.name?xhtml} (${location.x},${location.y};${location.orbit})Population: ${location.population?string(",##0")} + <#if location.attacking> + + <#elseif location.own> + + <#else> + + + Defence: ${location.defence?string(",##0")} + +
+ <#if location.fleetOwners?size == 0> +

No fleets at this location.

+ <#else> + + + + + + + + + + <@render_fleets_at location=location owners=location.fleetOwners /> +
 Fleet nameOwnerMPS
+ +
Vacation mode enabled
+ Battle - ${location.battle.friendly?string(',##0')} vs. ${location.battle.hostile?string(',##0')} - + Details +
+ + +<#macro render_moving_fleet_details fleet> + +   + +
+ <@render_fleet_ships rType="own-fleet" id=fleet.id ships=fleet.ships /> +
+
+ <@dt_main> + <@dt_entry title="Source">${fleet.source.name?xhtml} + <@dt_entry title="Status"> + <#if fleet.status == 'AVAILABLE'> + AVL + <#else> + RDR - + <@duration rTime=fleet.penalty gTime=fleet.gamePenalty /> + + + <@dt_entry title="Time to target"><@duration rTime=fleet.timeLeft gTime=fleet.gameTimeLeft /> + <@dt_entry title="Coordinates">(${fleet.currentX?string("0.00")};${fleet.currentY?string("0.00")}) + <@dt_entry title="Nearest planet"> + <#if fleet.nearest?has_content> + ${fleet.nearest.name?xhtml} + <#else> + in outer space + + + <@dt_entry abbr="OOFT" title="Orbit-to-orbit flight time"> + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + +
+ + + +<#macro render_moving_fleet fleet> + + + <#if data.page.special! != 'v'> + + <#else> +   + + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (unnamed fleet) + + + + <#if fleet.attacking>A<#else>D + + ${fleet.power?string(',##0')} + <@duration rTime=fleet.eta gTime=fleet.gameEta /> + ${fleet.destination.name?xhtml} + + <@render_moving_fleet_details fleet=fleet /> + +<#macro render_moving_fleets fleets> + <#if fleets?size != 0> + + + + + + + +
Moving fleets
+ + + + + + + + + + <#list fleets as fleet> + <@render_moving_fleet fleet=fleet /> + +
 Fleet nameMPETADestination
+
+ + +<#macro render> +<@page title="Fleets"> + <#local locations = data.fleets.locations> + <#local mFleets = data.fleets.moving> + <#if locations?size == 0 && mFleets?size == 0> +

You do not own any fleets or planets.

+ <#else> +
Click a fleet's name to see composition and details
+
+ <@render_static_fleets locations=locations /> + <@render_moving_fleets fleets=mFleets /> + <#if data.page.special! != 'v'> +
+ +   + +   + + +   + + +   + +
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleetsCommand.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleetsCommand.ftl new file mode 100644 index 0000000..0c19219 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/fleetsCommand.ftl @@ -0,0 +1,137 @@ +<#macro render_fleet fleet> + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (unnamed fleet) + + + ${fleet.power?string(',##0')} + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + <#switch fleet.status> + <#case 'DEPLOYING'>DPL<#break> + <#case 'REDEPLOYING'>RDP<#break> + <#case 'REDIRECTING'>RDP<#break> + <#case 'AVAILABLE'>AVL<#break> + + + + (${fleet.x?string("0.00")};${fleet.y?string("0.00")})
+ <#if fleet.nearest?has_content> + <#if fleet.atPlanet>At<#else>Near + ${fleet.nearest.name?xhtml} + <#else> + In outer space + + + +<#macro render_selected_fleets fleets> +

Selected fleets

+ + + + + + + + + + <#list fleets as fleet> + + <@render_fleet fleet=fleet /> + + +
 NamePFTSLocation
+ +<#macro render_move_fleets> +

New orders

+ <#if data.error> + <@standalone_error>This planet does not exist. + +

+ Move selected fleets to + <@ff_text name="destination" id="destination" value="${data.destination!?xhtml}" maxLength=20 size=21 /> + for + <@ff_select name="mode" id="mode"> + <@form_option text="defence" selected=( !data.mode!false ) value="0" /> + <@form_option text="attack" selected=( data.mode!false ) value="1" /> + +   + <@ff_submit label="Ok" /> + <@ff_submit label="Cancel" name="cancel" /> +

+ +<#macro render_rename_fleets> +

Rename fleets

+ <#if data.error> + <@standalone_error>This name is invalid. + +

+ Rename selected fleets to + <@ff_text name="name" id="name" value="${data.name!?xhtml}" maxLength=40 size=21 /> +   + <@ff_submit label="Ok" /> + <@ff_submit label="Cancel" name="cancel" /> +

+ +<#macro render_set_fleets_mode> +

Set fleets mode

+

+ Assign selected fleets to + <#if data.attack>attack<#else>defence? +   + <@ff_submit label="Yes" /> + <@ff_submit label="No" name="cancel" /> +

+ + +<#macro render_disband_fleets> +

Disband fleets

+

+ Are you sure? +   + <@ff_submit label="Yes" /> + <@ff_submit label="No" name="cancel" /> +

+ +<#macro render> +<#switch dataType> + <#case 'MoveFleetsResponse'> + <#local title="Move fleets"> + <#local action="move-fleets.action"> + <#break> + <#case 'RenameFleetsResponse'> + <#local title="Rename fleets"> + <#local action="rename-fleets.action"> + <#break> + <#case 'SetFleetsModeResponse'> + <#local title="Set fleets mode"> + <#local action="set-fleets-mode.action"> + <#break> + <#case 'DisbandFleetsResponse'> + <#local title="Disband fleets"> + <#local action="disband-fleets.action"> + <#break> + +<@page title=title> +
+ <@render_selected_fleets fleets=data.fleets /> + <#switch dataType> + <#case 'MoveFleetsResponse'> + <@render_move_fleets /> + <#break> + <#case 'RenameFleetsResponse'> + <@render_rename_fleets /> + <#break> + <#case 'SetFleetsModeResponse'> + <@render_set_fleets_mode /> + <#break> + <#case 'DisbandFleetsResponse'> + <@render_disband_fleets /> + <#break> + +
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/getNewPlanet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/getNewPlanet.ftl new file mode 100644 index 0000000..4534ee5 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/getNewPlanet.ftl @@ -0,0 +1,17 @@ +<#macro render> +<@page title="Get new planet"> +

Hordes of drooling barbarians invaded your empire, slaughtering your women and raping your cattle?

+

Well, fear no more! You will be able to get a brand new planet.

+

Please note that doing this will disband your fleets.

+ <@form action="get-planet" name="get-planet"> + <#switch data.error!> + <#case "EMPTY"><@form_error>Please select a planet name.<#break> + <#case "INVALID"><@form_error>Invalid planet name.<#break> + <#case "UNAVAILABLE"><@form_error>This planet name is unavailable.<#break> + <#case "BANNED"><@form_error>This planet name has been banned.<#break> + + <@form_text name="name" label="New planet's name" value=data.name! /> + <@form_submit label="Get planet" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/maintenance.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/maintenance.ftl new file mode 100644 index 0000000..0b3dcd7 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/maintenance.ftl @@ -0,0 +1,16 @@ +<#macro render><@page title="Server under maintenance"> + <@dt_main title="The server is currently under maintenance."> + <@dt_entry title="Maintenance mode activated">${data.start?string("yyyy-MM-dd HH:mm")} + <@dt_entry title="Current server time">${data.current?string("yyyy-MM-dd HH:mm")} + <@dt_entry title="Planned end of maintenance"> + <#if data.late> + + + ${data.end?string("yyyy-MM-dd HH:mm")} + <#if data.late> + + + + <@dt_entry title="Reason">${data.reason?xhtml} + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/map.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/map.ftl new file mode 100644 index 0000000..0e33d71 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/map.ftl @@ -0,0 +1,83 @@ +<#macro render_system system tags> + + <#list system.planets as planet> + <#if tags> + <#if planet.tag?has_content> + <#assign vName = "[${planet.tag}]"> + <#else> + <#assign vName = "N/A"> + + <#else> + <#assign vName = planet.name> + + <#if planet.tag?has_content> + <#assign vTitle = " [${planet.tag}]" > + <#else> + <#assign vTitle = "" > + + <#if planet.relation?has_content> + <#switch planet.relation> + <#case "OWN"> + <#assign lStyle = "class='own-planet'" > + <#break> + <#case "ALLIED"> + <#assign lStyle = "class='allied-planet'" > + <#break> + <#case "ENEMY"> + <#assign lStyle = "class='enemy-planet'" > + <#break> + + <#elseif planet.tag?has_content> + <#assign lStyle = "class='other-planet'" > + <#else> + <#assign lStyle = "" > + + + + + +<#macro render_map size systems tags> + + + <#list systems as row> + + <#list row as system> + <#if system?has_content> + <@render_system system=system tags=tags /> + <#else> + + + + + + +
(unexplored)
+ +<#macro render> +<@page title="Map"> + + <@lineform action="move-map"> + Coordinates: ( <@ff_text name="x" id="x" maxLength=4 size=5 value=data.x?string /> ; + <@ff_text name="y" id="y" maxLength=4 size=5 value=data.y?string /> ) + Size: <@ff_select id="sz" name="sz"> + <#list data.sizes as size> + <@form_option text=size value=size_index selected=( size_index == data.sizeOrdinal ) /> + + + <@ff_submit label="Centre map" /> + + + <@tabs> + <@tab id="names" title="Planets"> + <@render_map size=data.sizeOrdinal systems=data.systems tags=false /> + + <@tab id="alliances" title="Alliances"> + <@render_map size=data.sizeOrdinal systems=data.systems tags=true /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/message.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/message.ftl new file mode 100644 index 0000000..c1f7cd8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/message.ftl @@ -0,0 +1,115 @@ +<#macro render_navigation message inbox> + <#if inbox> + <#local link="inbox-message-"> + <#else> + <#local link="outbox-message-"> + + + + + + + +
+ <#if message.previous?has_content> + + + << + <#if message.previous?has_content> + + + + <#if inbox> + Received messages + <#else> + Sent messages + + + <#if message.next?has_content> + + + >> + <#if message.next?has_content> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Received messages"> + <#local timeTtl="Received"> +<#else> + <#local title="Sent messages"> + <#local timeTtl="Sent"> + +<#switch data.message.type> + <#case 'INTERNAL'> + <#local mColor="#ffffaf"> + <#break> + <#case 'ADMINISTRATOR'> + <#local mColor="#ffafaf"> + <#break> + <#case 'ALLIANCE'> + <#local mColor="#afafff"> + <#break> + <#case 'EMPIRE'> + <#local mColor="#afafaf"> + <#break> + +<@page title=title> + <@render_navigation message=data.message inbox=data.inbox /> + + <@dt_main> + <@dt_entry width=100 title="From"> + <#if data.inbox> + + + ${data.message.sender!} + <#if data.inbox> + + + + <@dt_entry width=100 title="To"> + <#if !data.inbox> + + + ${data.message.receiver!} + <#if !data.inbox> + + + + <@dt_entry width=100 title=timeTtl> + <@abbr_gt />: <@game_time record=data.message.gameTime /> / <@abbr_st />: ${data.message.time?string("yyyy-MM-dd HH:mm:ss")} + + <#if data.message.unread> + <@dt_entry width=100 title="">New! + + + + <@listview><@lv_line headers=true>  + +

${data.message.title}

+
+ ${data.message.contents} +
+ + <@listview><@lv_line headers=true>  + <@lineform action="message"> + + + <#if data.message.previous?has_content> + <#local afterDelete = data.message.previous> + <#elseif data.message.next?has_content> + <#local afterDelete = data.message.next> + <#else> + <#local afterDelete = "x"> + + + <@ff_submit label="Delete message" name="delete" /> + <#if data.inbox && data.message.type != 'INTERNAL'> + <@ff_submit label="Compose reply" name="reply" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageBox.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageBox.ftl new file mode 100644 index 0000000..8b9db23 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageBox.ftl @@ -0,0 +1,125 @@ +<#include "messageTabs.ftl" /> +<#macro render_navigation current total inbox> + <#if inbox> + <#local link="inbox-"> + <#else> + <#local link="outbox-"> + + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 0> + Page ${current + 1} / ${total} + <#elseif inbox> + No messages received. + <#else> + No messages sent. + + + <#if current lt total - 1> + + + >> + <#if current lt total - 1> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Received messages"> + <#local tab="inbox"> +<#else> + <#local title="Sent messages"> + <#local tab="outbox"> + +<@page title=title> + <@messageTabs selected=tab /> + <@render_navigation current=data.cPage total=data.pages inbox=data.inbox /> + <#if data.messages?size gt 0> +
+
+ + +
+ <@listview> + + <@lv_line headers=true> + <@lv_column width=16 centered=true>  + <@lv_column width="x">Subject + <@lv_column width=150 centered=true><#if data.inbox>From<#else>To + <@lv_column width=150 centered=true><#if data.inbox>Received<#else>Sent + + + <#list data.messages as message> + <#switch message.type> + <#case 'INTERNAL'> + <#local mType="int-msg"> + <#break> + <#case 'ADMINISTRATOR'> + <#local mType="admin-msg"> + <#break> + <#case 'ALLIANCE'> + <#local mType="alliance-msg"> + <#break> + <#case 'EMPIRE'> + <#local mType="empire-msg"> + <#break> + + <#if ! message.read> + <#local mType = "${mType} unread-msg"> + + + <@lv_line class=mType> + <@lv_column centered=true> + + + <@lv_column>${message.title} + <@lv_column centered=true>${message.sender!} + <@lv_column centered=true>${message.time?string("yyyy-MM-dd HH:mm:ss")} + + + + + <#if data.inbox> +
+ With + <@ff_select name="target" id="target"> + <@form_option value="0">selected + <@form_option value="1">all + + messages: + <@ff_select name="action" id="action"> + <@form_option value="r">mark as read + <@form_option value="u">mark as unread + <@form_option value="d">delete + + <@ff_submit label="Go" /> +
+ <#else> +
+ + Delete + <@ff_select name="target" id="target"> + <@form_option value="0">selected + <@form_option value="1">all + + messages <@ff_submit label="Go" /> +
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTabs.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTabs.ftl new file mode 100644 index 0000000..bfb7ecf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTabs.ftl @@ -0,0 +1,11 @@ +<#macro messageTab href title selected=false eClass=""> + ${title} + +<#macro messageTabs selected> +
+ <@messageTab href="messages" title="Received" selected=( selected = 'inbox' ) /> + <@messageTab href="outbox" title="Sent" selected=( selected = 'outbox' ) /> + <@messageTab href="compose-message" title="Compose" selected=( selected = 'compose' ) /> + <@messageTab href="chat" title="Chat" eClass="open-chat-button" /> +
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTargets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTargets.ftl new file mode 100644 index 0000000..78b1c96 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageTargets.ftl @@ -0,0 +1,62 @@ +<#include "messageTabs.ftl" /> +<#macro render> +<@page title="Recipients"> + <@messageTabs selected="compose" /> + + <@tabs> + + <#if data.empires?size gt 0> + <@tab id="empires" title="Empires"> + + <#list data.empires as empire> + <#if empire_index % 3 == 0> + + <#if empire_index % 3 == 2> + + <#if data.empires?size % 3 == 1> + + <#elseif data.empires?size % 3 == 2> + + +
+ <#else> + + + ${empire.name?xhtml}
  
 
+ + + + <#if data.alliances?size gt 0> + <@tab id="alliances" title="Alliances"> + <@listview> + <#list data.alliances as alliance> + <@lv_line> + [${alliance.tag?xhtml}]   + ${alliance.name} + + + + + + + <#if data.admins?size gt 0> + <@tab id="admins" title="Administrators"> + <@listview> + <#list data.admins as admin> + <@lv_line> + ${admin.name?xhtml}   + + <#list admin.privileges as priv> + ${priv} + + + +   + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageWriter.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageWriter.ftl new file mode 100644 index 0000000..4499f4f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/messageWriter.ftl @@ -0,0 +1,82 @@ +<#include "messageTabs.ftl" /> +<#macro render> +<#if data.replyTo?has_content> + <#local title="Reply to message"> +<#else> + <#local title="Compose new message"> + +<@page title=title> + <@messageTabs selected="compose" /> + +
+
+ <#if data.replyTo?has_content> + + + + + + <#if data.timingError> + <@form_error>Not so fast! Wait a few seconds before trying again. + + + <#-- Message recipient --> + <#if data.targetError> + <@form_error>Message recipient not found. + + <@form_select label="Recipient type" name="toType"> + <@form_option value="EMPIRE" selected=( data.messageType = 'EMPIRE' )>Empire + <@form_option value="ALLIANCE" selected=( data.messageType = 'ALLIANCE' )>Alliance + <@form_option value="ADMINISTRATOR" selected=( data.messageType = 'ADMINISTRATOR' )>Administrator + + <@form_text label="Recipient name" name="toName" maxLength=48 value=data.target /> + <#if (data.target == "")> + + + + <#-- Subject --> + <#if data.titleError> + <@form_error>Subject is too short (min.: 2 characters) + + <@form_text label="Subject" name="title" maxLength=64 value=data.title /> + + <#-- Body --> + <#if data.contentsError> + <@form_error>Contents are too short (min.: 2 characters) + + <@form_text label="Contents" name="contents" value=data.contents multiline=true maxLength=10 /> + + <@form_extended_submit label="Send message"> + <@ff_submit label="Cancel" name="cancel" /> + +
 Select from list...
+ +
+
+ + <#-- Original message --> + <#if data.replyTo?has_content> + <@listview><@lv_line headers=true>  + <@dt_main> + <@dt_entry width=100 title="">Original message: + <@dt_entry width=100 title="From"> + ${data.replyTo.sender!} + + <@dt_entry width=100 title="To"> + ${data.replyTo.receiver!} + + <@dt_entry width=100 title="Received"> + <@abbr_gt />: <@game_time record=data.replyTo.gameTime /> / <@abbr_st />: ${data.replyTo.time?string("yyyy-MM-dd HH:mm:ss")} + + + + <@listview><@lv_line headers=true>  + +

${data.replyTo.title}

+
+ ${data.replyTo.contents} +
+ + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/offline.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/offline.ftl new file mode 100644 index 0000000..772290b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/offline.ftl @@ -0,0 +1,9 @@ +<#macro render><@page title="Server off-line"> +

The game server could not be reached.

+

+ It may be under maintenance, or it may have crashed. In any case, the staff will receive a notification of the problem. +

+

+ Sorry for the inconvenience. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/overview.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/overview.ftl new file mode 100644 index 0000000..af04b79 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/overview.ftl @@ -0,0 +1,118 @@ +<#macro render> +<@page title="Empire"> + + <#assign ov = data.overview > + <#assign rs = data.research > + + <@tabs> + + <@tab id="overview" title="Overview"> + <@left_column> + + <#assign nplanets = data.page.planets?size> + <@dt_main title="Fleets & planets"> + <@dt_entry title="Number of planets">${nplanets?string(",##0")} + <@dt_entry title="Total population">${ov.population?string(",##0")} + <@dt_entry title="Average happiness"><@happiness value=data.overview.avgHappiness /> + <@dt_entry title="Total fleet power">${ov.fleetPower?string(",##0")} + + + <@dt_main title="Battles"> + <#if data.battles?size gt 0> + <@dt_status>We are involved in the following battle(s): + <#list data.battles as battle> + <@dt_status>${battle.location.name?xhtml} + (${battle.x},${battle.y};${battle.orbit}) + + <#else> + <@dt_status>We are not involved in any battle at the moment. + + <@dt_status> + View all battles + + + + + + <@right_column> + + <@dt_main title="Money"> + <@dt_entry title="Cash reserves">${data.page.cash?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Planet income">${ov.planetIncome?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Planet upkeep">${ov.planetUpkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Fleet upkeep">${ov.fleetUpkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Investments">${ov.investment?string(",##0")} <@abbr_bgc/> + + + <@dt_main title="Messages"> + <@dt_status> + <#if ov.newMessages == 0> + No new messages. + <#elseif ov.newMessages == 1> + You have a new message. + <#else> + You have ${ov.newMessages} new messages. + + + <@dt_status> + Compose a message + + + + + + + <@tab id="research" title="Research"> + <#if rs?size == 0> +

Our scientists are still settling in.

+ + <#list rs as research> +
+

${research.name?xhtml}

+

${research.description?xhtml}

+ + <@left_column> + <#if research.implemented?size == 0> +

No usable technologies.

+ <#else> + <@dt_main> + <#list research.implemented as tech> + <@dt_status> + ${tech.name?xhtml} +
${tech.description?xhtml}
+ + + + + + + <#if research.current?has_content> + <@right_column> + <@dt_main> + <@dt_status> + Current research: ${research.current.name?xhtml} +

+ ${research.current.description?xhtml} +

+ + <@dt_entry title="Progress">${research.current.researched}% + <#if research.current.cost?has_content> + <@dt_entry title="Cost">${research.current.cost?string(",##0")} <@abbr_bgc/> + <#if data.page.cash gte research.current.cost && data.page.special! != 'v'> + <@dt_status>
+
<@ff_submit label="Implement technology" />
+
+ + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/passwordRecovery.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/passwordRecovery.ftl new file mode 100644 index 0000000..f18054c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/passwordRecovery.ftl @@ -0,0 +1,69 @@ +<#macro render> +<@page title="Password recovery"> + <@tabs> + + <@tab title="Request password recovery" id="request-recovery"> + <#if data.sent?has_content> +

An email has been sent to your address, ${data.mail?xhtml}

+

It contains a one-time authentication code you can use to change your password.

+

The authentication code will expire in one hour, and you will not be able to request another code until it expires.

+ <#else> + + <@form name="req-pwd-recovery" action="request-password-recovery"> + <#switch data.status!> + <#case "INVALID_INPUT"> + <@form_error>Invalid e-mail address. + <#break> + <#case "ACCOUNT_NOT_FOUND"> + <@form_error>Unknown e-mail address. + <#break> + <#case "ACCOUNT_STATUS"> + <@form_error>The account's status prevents password recovery. + <#break> + <#case "RECOVERY_IN_PROGRESS"> + <@form_error>A password recovery request has been made within the last hour. + <#break> + <#case "MAIL_ERROR"> + <@form_error>Unable to send e-mail. + <#break> + + <@form_text label="E-mail address" name="mail" id="req-mail" value=data.mail! maxLength=128 /> + <@form_submit label="Request password recovery" extraClass="" /> + + + + + + <@tab id="confirm-recovery" title="Confirm password recovery"> + <@form name="conf-pwd-recovery" action="confirm-password-recovery" hash="confirm-recovery"> + <#switch data.cStatus!> + <#case "INVALID_MAIL"> + <@form_error>Invalid e-mail address. + <#break> + <#case "NOT_FOUND"> + <@form_error>Unknown e-mail address or code. + <#break> + <#case "ACCOUNT_STATUS"> + <@form_error>The account's status prevents password recovery. + <#break> + <#case "WEAK_PASSWORD"> + <@form_error>New password too weak. + <#break> + <#case "MISMATCH_PASSWORD"> + <@form_error>Password and password confirmation did not match. + <#break> + <#case "PROHIBITED"> + <@form_error>You may not use this password. + <#break> + + <@form_text label="E-mail address" name="mail" id="conf-mail" value=data.cMail! maxLength=128 /> + <@form_text label="Confirmation code" name="code" id="conf-code" value=data.cCode! maxLength=64 /> + <@form_pwd label="New password" name="password" id="conf-pwd1" /> + <@form_pwd label="Confirm new password" name="passwordConfirm" id="conf-pwd2" /> + <@form_submit label="Set new password" /> + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planet.ftl new file mode 100644 index 0000000..f32d709 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planet.ftl @@ -0,0 +1,329 @@ +<#macro render> +<#if ! data.basic?has_content> +<@page title="Planet not found"> +

This planet does not exist.

+ +<#return> + +<@page title="Planet ${data.basic.name}"> + <#if data.ownershipError> + <@standalone_error>Unfortunately, we no longer control this planet. + + + <@tabs> + + <@tab id="general" title="General"> +
+
+ ${data.basic.name?xhtml} +
+ + <@left_column width=250> + <@dt_main> + <@dt_entry title="Coordinates">(${data.basic.x},${data.basic.y};${data.basic.orbit}) + <#if data.basic.alliance?has_content> + <@dt_entry title="Alliance">${data.basic.alliance} + <#else> + <@dt_blank /> + + + <#if data.orbit?has_content> + <@dt_entry title="Population">${data.orbit.population?string(",##0")} + <@dt_entry title="Stationary defence">${data.orbit.defencePoints?string(",##0")} + + + <#if data.own?has_content> + <@dt_entry title="Happiness"><@happiness value=data.own.happiness /> <@happiness_change value=data.own.hChange /> + <@dt_entry title="Income">${data.own.income?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Upkeep">${data.own.upkeep?string(",##0")} <@abbr_bgc/> + + + + + <@right_column width=250> + <#if data.orbit?has_content> + <@dt_main> + + <#if data.orbit.ownFleet gt 0> + <@dt_entry title="Own fleet power">${data.orbit.ownFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.friendlyFleet gt 0> + <@dt_entry title="Friendly fleet power">${data.orbit.friendlyFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.hostileFleet gt 0> + <@dt_entry title="Hostile fleet power">${data.orbit.hostileFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.battle?has_content> + <@dt_entry title="">View battle + <#else> + <@dt_blank /> + + + <@dt_blank /><@dt_blank /><@dt_blank /><@dt_blank /><@dt_blank /> + + + + +
+ + <#if data.own?has_content> + <#if data.own.status.renamePossible && data.page.special! != 'v'> + <#switch data.renameError!> + <#case "EMPTY"><@standalone_error>Please specify a name.<#break> + <#case "INVALID"><@standalone_error>Invalid planet name.<#break> + <#case "UNAVAILABLE"><@standalone_error>This planet name already exists.<#break> + <#case "BANNED"><@standalone_error>This name is banned.<#break> + + <@lineform action="planet-${data.id}-rename" name="rename" hash="general"> + <#if data.renamingTo?has_content> + <#assign newName = data.renamingTo!> + + Rename planet to <@ff_text name="name" id="rename-name" maxLength=20 size=21 value=newName! /> + <@ff_submit label="Rename planet" /> + + + + <#if data.own.status.abandonPossible && data.page.special! != 'v'> + <@lineform action="planet-${data.id}-abandon" name="abandon" hash="general"> + <@ff_submit label="Abandon planet" /> + + <#elseif data.own.status.abandonTime gt 0> + <@lineform action="planet-${data.id}-cancel-abandon" name="abandon" hash="general"> + Abandoning planet in <@duration rTime=data.own.status.abandonTime gTime=data.own.status.abandonGameTime /> +   + <#if data.page.special! != 'v'> + <@ff_submit label="Cancel" /> + + + + + + + + <#if data.orbit?has_content> + + <#if data.orbit.buildings?size gt 0 || data.own?has_content> + <@tab id="buildings" title="Buildings"> + + <#if data.orbit.buildings?size gt 0> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Building + <@lv_column width=50 centered=true>Amount + <#if data.own?has_content> + <@lv_column width=150 centered=true>Production + <@lv_column width=50 centered=true>Jobs + <@lv_column width=100 centered=true>Upkeep + + + + <#list data.orbit.buildings as building> + <@lv_line> + <@lv_column> + ${building.name?xhtml} + <#if data.own?has_content> +
${building.description?xhtml}
+ + + <@lv_column centered=true>${building.amount?string(",##0")} + <#if data.own?has_content> + <@lv_column centered=true> + ${building.output?string(",##0")} + <#switch building.produces> + <#case "CASH">ind. production<#break> + <#case "DEF">defence<#break> + <#case "WORK">mil. output<#break> + <#case "POP">growth<#break> + + + <@lv_column centered=true>${building.jobs?string(",##0")} + <@lv_column centered=true>${building.upkeep?string(",##0")} <@abbr_bgc/> + + + + + <#else> + <@dt_main><@dt_status>No buildings on this planet. + + + <#if data.own?has_content> + <#if data.page.special! != 'v'> + <#if data.own.civQueue.appendPossible> + <@lineform name="build-civ" action="planet-${data.id}-build-civ" hash="buildings"> + Build <@ff_text name="amount" id="civ-build-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="civ-build-type"> + <@form_option value="0" text="(building type)" /> + <#list data.own.bBuildings as building> + <@form_option value=building.id text=building.name /> + + + <@ff_submit label="Add to queue" /> + +
+ <#list data.own.bBuildings as building> +
+ <@dt_main> + <@dt_status>${building.description?xhtml} + <@dt_entry title="Cost">${building.cost?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Upkeep">${building.upkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Time to build"> + <#if building.time?has_content> + <@duration rTime=building.time gTime=building.gameTime /> + <#else> + N/A + + + <@dt_entry title="Jobs">${building.workers?string(",##0")} + <@dt_entry title="Production">${building.output?string(",##0")} + <#switch building.prodType> + <#case "CASH">ind. production<#break> + <#case "DEF">defence<#break> + <#case "WORK">mil. output<#break> + <#case "POP">growth<#break> + + + +
+ +
+ + <#if data.orbit.buildings?size gt 0> + <#if data.destructionFailed!false> + <@standalone_error>Trying to destroy too many buildings + + <@lineform name="destroy" action="planet-${data.id}-destroy" hash="buildings"> + Destroy <@ff_text name="amount" id="civ-destroy-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="civ-destroy-type"> + <@form_option value="0" text="(building type)" /> + <#list data.orbit.buildings as building> + <@form_option value=building.id text=building.name /> + + + <@ff_submit label="Add to queue" /> + + + + + + <#if data.own.civQueue.items?size gt 0> + <#if data.page.special! != 'v'> + <@lineform name="flush-civ-queue" action="planet-${data.id}-flush-civ" hash="buildings"> + Remove all items from the build queue (investments will be lost) + <@ff_submit label="Flush" /> + + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Amount + <@lv_column width="x">Nature + <@lv_column width=200 centered=true>Time + <@lv_column width=70 centered=true>Investment + + <#list data.own.civQueue.items as qItem> + <@lv_line> + <@lv_column centered=true>${qItem.amount?string(",##0")} + <@lv_column>${qItem.name} <#if qItem.destroy>(destruction)<#else>(construction) + <@lv_column centered=true> + <#if qItem.timeLeft?has_content> + <@duration rTime=qItem.timeLeft gTime=qItem.gameTimeLeft /> + <#else> + N/A + + + <@lv_column centered=true>${qItem.invested?string(",##0")} <@abbr_bgc/> + + + + + + + + + + <#if data.own?has_content> + <@tab id="ships" title="Shipyards"> + <#if data.page.special! != 'v'> + <#if data.own.milQueue.appendPossible> + <@lineform name="build-mil" action="planet-${data.id}-build-mil" hash="ships"> + Build <@ff_text name="amount" id="mil-build-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="mil-build-type"> + <@form_option value="0" text="(ship type)" /> + <#list data.own.bShips as ship> + <@form_option value=ship.id text=ship.name /> + + + <@ff_submit label="Add to queue" /> + +
+ <#list data.own.bShips as ship> +
+ <@dt_main> + <@dt_status>${ship.description?xhtml} + <@dt_entry title="Cost">${ship.cost?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Upkeep">${ship.upkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Time to build"> + <#if ship.time?has_content> + <@duration rTime=ship.time gTime=ship.gameTime /> + <#else> + N/A + + + <@dt_entry title="Power">${ship.power?string(",##0")} + <@dt_entry abbr="OOFT" title="Orbit-to-orbit flight time"> + <@duration rTime=ship.flightTime gTime=ship.gameFlightTime /> + + +
+ +
+ + + + <#if data.own.milQueue.items?size gt 0> + <#if data.page.special! != 'v'> + <@lineform name="flush-mil-queue" action="planet-${data.id}-flush-mil" hash="ships"> + Remove all items from the build queue (investments will be lost) + <@ff_submit label="Flush" /> + + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Amount + <@lv_column width="x">Ship + <@lv_column width=200 centered=true>Time + <@lv_column width=70 centered=true>Investment + + <#list data.own.milQueue.items as qItem> + <@lv_line> + <@lv_column centered=true>${qItem.amount?string(",##0")} + <@lv_column>${qItem.name} + <@lv_column centered=true> + <#if qItem.timeLeft?has_content> + <@duration rTime=qItem.timeLeft gTime=qItem.gameTimeLeft /> + <#else> + N/A + + + <@lv_column centered=true>${qItem.invested?string(",##0")} <@abbr_bgc/> + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planets.ftl new file mode 100644 index 0000000..0321889 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/planets.ftl @@ -0,0 +1,167 @@ +<#macro render> +<@page title="Planets"> + <#assign pl = data.planets> + <#if pl?size == 0> +

We no longer own any planet.

+

Get a new planet?

+ <#else> + + <@tabs> + + <@tab id="general" title="General"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=90 centered=true>Coordinates + <@lv_column width=90 centered=true>Happiness + <@lv_column width=90 right=true>Population + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true>(${planet.x},${planet.y};${planet.orbit}) + <@lv_column centered=true><@happiness value=planet.happiness /> + <@lv_column right=true>${planet.population?string(",##0")} + + + + + + <@tab id="eco" title="Economy"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=110 right=true>Income + <@lv_column width=110 right=true>Upkeep + <@lv_column width=110 right=true>Profit + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column right=true>${planet.income?string(",##0")} <@abbr_bgc /> + <@lv_column right=true>${planet.upkeep?string(",##0")} <@abbr_bgc /> + <@lv_column right=true> + <#if planet.upkeep gt planet.income> + + + ${( planet.income - planet.upkeep )?string(",##0")} <@abbr_bgc /> + <#if planet.upkeep gt planet.income> + + + + + + + + + <@tab id="prod" title="Production"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=90 right=true>Military + <@lv_column width=90 right=true>Industrial + <@lv_column width=90 right=true>Growth inc. + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column right=true>${planet.militaryProduction?string(",##0")} + <@lv_column right=true>${planet.industrialProduction?string(",##0")} + <@lv_column right=true>${planet.growthProduction?string(",##0")} + + + + + + <@tab id="cons" title="Construction"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=200 centered=true>Current queue item + <@lv_column width=90 right=true>Investment + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true> + <#if planet.civAmount = 0> + N/A + <#else> + ${planet.civAmount?string(",##0")}x + ${planet.civName?xhtml} + <#if planet.civDestroy> + (destruction) + <#else> + (construction) + + + + <@lv_column right=true>${planet.civInvestment?string(",##0")} <@abbr_bgc /> + + + + + + <@tab id="ships" title="Shipyards"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=200 centered=true>Current queue item + <@lv_column width=90 right=true>Investment + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true> + <#if planet.milAmount = 0> + N/A + <#else> + ${planet.milAmount?string(",##0")}x + ${planet.milName?xhtml} + + + <@lv_column right=true>${planet.milInvestment?string(",##0")} <@abbr_bgc /> + + + + + + <@tab id="mil" title="Military"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Name + <@lv_column width=90 right=true>Stationary + <@lv_column width=90 right=true>Own fleets + <@lv_column width=90 right=true>Friendly + <@lv_column width=90 right=true>Hostile + + + <#list pl as planet> + <@lv_line> + <@lv_column> + <#if planet.battle?has_content> + + + ${planet.name?xhtml} + <#if planet.battle?has_content> + + + + <@lv_column right=true>${planet.fpStatic?string(",##0")} + <@lv_column right=true>${planet.fpOwn?string(",##0")} + <@lv_column right=true>${planet.fpFriendly?string(",##0")} + <@lv_column right=true>${planet.fpHostile?string(",##0")} + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/reactivation.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/reactivation.ftl new file mode 100644 index 0000000..803d61b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/reactivation.ftl @@ -0,0 +1,24 @@ +<#macro render> +<#if data.success> +<@page title="Account re-activation"> +

+ Your account was successfully re-activated. The confirmation code was sent to ${data.address}. +

+

+ One you've received this e-mail, please proceed to the confirmation page. +

+ +<#else> +<@page title="Account re-activation failed"> +

+ An error occurred while trying to send an e-mail to your address, ${data.address}. +

+

+ If your address is still valid, you might want to wait a bit and then try again. +

+

+ Or the server might be on crack, in which case you should drop the staff a line. +

+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/register.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/register.ftl new file mode 100644 index 0000000..bbbdb14 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/register.ftl @@ -0,0 +1,56 @@ +<#macro render> +<@page title="Register"> + <@form name="register" action="register"> + <#switch data.mailError!""> + <#case "EMPTY"> + <@form_error>Empty e-mail address. + <#break> + <#case "INVALID"> + <@form_error>Invalid e-mail address. + <#break> + <#case "IN_USE"> + <@form_error>This e-mail address is already associated with an account. + <#break> + <#case "SEND_FAIL"> + <@form_error>Unable to send confirmation code to this address. + <#break> + <#case "MISMATCH"> + <@form_error>E-mail address field and confirmation field do not match. + <#break> + <#default> + <@form_extra>The e-mail address MUST exist. + + <@form_text label="E-mail address" maxLength=128 name="mail" value=data.mail! /> + <@form_text label="E-mail address (confirm)" maxLength=128 name="mailConfirm" value=data.mail! /> + + <#switch data.passwordError!""> + <#case "EMPTY"> + <@form_error>Empty password. + <#break> + <#case "TOO_WEAK"> + <@form_error>This password is too weak. + <#break> + <#case "MISMATCH"> + <@form_error>Password field and confirmation field do not match. + <#break> + <#default> + <@form_extra>At least 6 characters, containing both text and numbers. Bonus points for special characters, spaces, and extremely long passwords. + + <@form_pwd label="Password" name="password" /> + <@form_pwd label="Password (confirm)" name="passwordConfirm" /> + + <@form_select name="language" label="Language"> + <#if dataType == "ListLanguagesResponse"> + <#assign lList = data.languages> + <#else> + <#assign lList = data.supportedLanguages.languages> + + <#list lList as lang> + <@form_option text=lang.name value=lang.id selected=(lang.id == language) /> + + + + <@form_submit label="Register" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/registered.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/registered.ftl new file mode 100644 index 0000000..a32d101 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/registered.ftl @@ -0,0 +1,13 @@ +<#macro render> +<@page title="Accound created"> +

+ Your account has been successfully created. +

+

+ An e-mail containing its confirmation code has been sent to your address, ${data.mail?xhtml}. +

+

+ Once you have received it, you will be able to log in and confirm your account. +

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/splitFleet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/splitFleet.ftl new file mode 100644 index 0000000..b469677 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/splitFleet.ftl @@ -0,0 +1,40 @@ +<#macro render> +<@page title="Split fleet"> +
+
+ + <#if data.shipsError> + <@standalone_error>Invalid amount(s) of ships or resulting fleets + + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Ship type + <@lv_column width=150>Initial amount + <@lv_column width=150>Amount in new fleet + + <#list data.ships as ships> + <@lv_line headers> + <@lv_column>${ships.name} + <@lv_column>${ships.amount?string(",##0")} + <@lv_column> + <@ff_text name="ships_${ships.id}" id="ships-${ships.id}" value=ships.selectedAmount /> + + + + + <#if data.nameError> + <@standalone_error>Invalid fleet name. + +

+ Create + <@ff_text name="nFleets" id="n-fleets" value=data.nFleets size=3 maxLength=2 /> + new fleet(s) named + <@ff_text name="name" id="name" value=data.name size=20 maxLength=40 /> +   + <@ff_submit label="Ok" /> + <@ff_submit label="Cancel" name="cancel" /> +

+
+
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/static.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/static.ftl new file mode 100644 index 0000000..cbf01c8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/static.ftl @@ -0,0 +1 @@ +<#macro render><#if dataType == "HashMap"><#include "../static/${data.name}.ftl" /><#else><#include "../static/${data}.ftl" /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/validation.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/validation.ftl new file mode 100644 index 0000000..9a01b54 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/en/types/validation.ftl @@ -0,0 +1,50 @@ +<#macro render> +<@page title="Account validation"> + <@form action="validation" name="validation"> + <@form_extra> + Before you can proceed any further, you need to validate your account using the confirmation code that was e-mailed to you.
+ You will also be able to select the names of your empire and first planet. + + + <#if data.wrongToken> + <@form_error>Incorrect confirmation code. + + <@form_text label="Confirmation code" value=data.token! name="token" maxLength=64 /> + + <#switch data.empireError!> + <#case "EMPTY"><@form_error>Please select an empire name.<#break> + <#case "INVALID"><@form_error>Invalid empire name.<#break> + <#case "UNAVAILABLE"><@form_error>This empire name is unavailable.<#break> + <#case "BANNED"><@form_error>This empire name has been banned.<#break> + + + <#if data.previousEmpires?size == 0> + <@form_text label="Empire name" value=data.empire! name="empire" maxLength=20 /> + + <#else> + <@form_select name="old" label="Re-use empire name"> + <#list data.previousEmpires as oldName> + <@form_option text=oldName selected=( oldName == data.empire! ) /> + + + + <@form_extra>Leave this blank if you want to re-use a previous empire name. + <#if ! data.previousEmpires?seq_contains(data.empire!)> + <#assign empValue = data.empire!> + + <@form_text name="empire" label="New empire name" value=empValue! maxLength=20 /> + + + + <#switch data.planetError!> + <#case "EMPTY"><@form_error>Please select a planet name.<#break> + <#case "INVALID"><@form_error>Invalid planet name.<#break> + <#case "UNAVAILABLE"><@form_error>This planet name is unavailable.<#break> + <#case "BANNED"><@form_error>This planet name has been banned.<#break> + + <@form_text name="planet" label="Planet name" value=data.planet! maxLength=20 /> + + <@form_submit label="Join the game" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/chat.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/chat.ftl new file mode 100644 index 0000000..28deee5 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/chat.ftl @@ -0,0 +1,28 @@ +<#include "../game.ftl"> +<#macro page title hidePlanets=false> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ +
+

${title?xhtml}

+
+ +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/external.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/external.ftl new file mode 100644 index 0000000..040e9d7 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/external.ftl @@ -0,0 +1,44 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
version courante : <@full_version/>
+
${title?xhtml}
+ + +
+
+
+ Adresse e-mail :
+ Mot de passe :
+ Mot de passe oublié ? + +
+
+
+ + + Portée + Règles + Inscription + +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/game.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/game.ftl new file mode 100644 index 0000000..2f8e922 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/game.ftl @@ -0,0 +1,70 @@ +<#include "../game.ftl"> +<#macro page title hidePlanets=false> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ Legacy Worlds Beta 6 <@version/> +
<@abbr_gt/>: <@game_time record=data.page.gameTime /> / <@abbr_st/>: ${data.page.serverTime?string("yyyy-MM-dd HH:mm:ss ZZZZZ")}
+ + +
+

${title?xhtml}

+ <#if !hidePlanets> +

 

+ <#if data.page.planets?size == 0> +

Obtenir une nouvelle planète

+ <#else> +

Aller à la planète: + <#list data.page.planets as planet> + ${planet.name?xhtml} + +

+ + +
+ +
+ ${data.page.empire} + <#if data.page.alliance?has_content> + [${data.page.alliance}] +
+ ${data.page.cash?string(",##0")} <@abbr_bgc/>
+ <#if data.page.special?has_content> + + <#switch data.page.special> + <#case 'v'>EN VACANCES<#break> + <#case 's'>PRELIMINAIRES AUX VACANCES<#break> + <#case 'q'>EN TRAIN D'ABANDONNER<#break> + + + +
+ Compte - Déconnexion +
+ + Planètes + Flottes + Carte + Alliance + Listes d'ennemis + Messages + Suivi des bugs + +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/offline.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/offline.ftl new file mode 100644 index 0000000..9261f58 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/offline.ftl @@ -0,0 +1,27 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
Version courante : <@full_version/>
+
${title?xhtml}
+ +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/restricted.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/restricted.ftl new file mode 100644 index 0000000..7f1db1a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/containers/restricted.ftl @@ -0,0 +1,33 @@ +<#macro page title> + + + + + Legacy Worlds Beta 6 <@version/> - ${title?xhtml} + + + + + +
+
+ + Legacy Worlds Beta 6 <@version/> +
Version courante : <@full_version/>
+
${title?xhtml}
+ + + + +
<#nested>
+
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/game.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/game.ftl new file mode 100644 index 0000000..81e8aa9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/game.ftl @@ -0,0 +1,66 @@ +<#macro game_time record> + <#if record.years == 1> + 1 an, + <#elseif record.years gt 1 > + ${record.years?string(",##0")} ans, + + <#if record.weeks == 1> + 1 semaine, + <#elseif record.weeks gt 1 > + ${record.weeks?string} semaines, + + <#if record.days == 1> + 1 jour + <#elseif record.days gt 1 > + ${record.days?string} jours, + <#else> + premier jour, + + ${record.hours?string("00")}:00 + +<#macro game_duration record> + <#if record.years == 1> + 1 an + <#elseif record.years gt 1 > + ${record.years?string(",##0")} ans + + <#if record.weeks == 1> + 1 semaine + <#elseif record.weeks gt 1 > + ${record.weeks?string} semaines + + <#if record.days == 1> + 1 jour + <#elseif record.days gt 1 > + ${record.days?string} jours + + <#if record.hours == 1> + 1 heure + <#elseif record.hours gt 1 > + ${record.hours?string} heures + + +<#macro rl_duration rTime> + <#local rlDays = (rTime / 1440)?floor> + <#local rlHours = ((rTime - rlDays * 1440) / 60)?floor> + <#local rlMinutes = (rTime - rlDays * 1440 - rlHours * 60)> + <#if rlDays gt 0> + <#if rlDays = 1>1 jour<#else>${rlDays} jours + + <#if rlHours gt 0> + <#if rlHours = 1>1 heure<#else>${rlHours} heures + + <#if rlMinutes gt 0> + <#if rlMinutes = 1>1 minute<#else>${rlMinutes} minutes + + +<#macro duration rTime gTime> + <#if data.page.useRLTime> + <@rl_duration rTime=rTime /> + <#else> + <@game_duration record=gTime /> + + +<#macro abbr_bgc>mcg +<#macro abbr_st>TS +<#macro abbr_gt>TJ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/home.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/home.ftl new file mode 100644 index 0000000..d23fb64 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/home.ftl @@ -0,0 +1,26 @@ +<@page title="Legacy Worlds Beta 6 - Jalon 1"> +

+ Bienvenue sur le premier jalon de la Beta 6 de Legacy Worls. +

+

 

+

+ Ceci n'est pas un jeu complet. En fait, la plupart des fonctionnalités avancées de la Beta 5 ont été laissées de côté. + Mais il s'agit d'un bon point de départ pour le développement de la Beta 6. La liste complète des fonctionnalités incluses dans cette version + peut être trouvée sur la page Portée. +

+

 

+

+ Vous trouverez plus d'informations sur le jeu lui-même sur la page Règles. Il s'agit basiquement + de ce dont vous avez l'habitude : contruire des choses, tuer des gens aux moyens des choses susnommées. Seuls les détails ont changé. +

+

 

+

+ Maintenant - c'est un peu inhabituel, mais puisque le but réel de cette version est de tester le système lui-même, vous êtes encouragés à créer + des comptes multiples. +

+

 

+

+ Bien que cette version puisse être jouée indépendamment de la Beta 5, elle ne dispose pas de forums (bien qu'un système + de rapport de bugs ait été inclus) ; il est donc recommandé que vous joigniez la Beta 5 quoi qu'il en soit. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loggedOut.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loggedOut.ftl new file mode 100644 index 0000000..3218bb1 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loggedOut.ftl @@ -0,0 +1,8 @@ +<@page title="Déconnecté"> +

+ Vous avez été déconnecté de Legacy Worlds. +

+

+ Merci d'avoir joué! +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loginFailed.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loginFailed.ftl new file mode 100644 index 0000000..f7be93d --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/loginFailed.ftl @@ -0,0 +1,8 @@ +<@page title="Identité invalide"> +

+ L'adresse e-mail et le mot de passe que vous avez entrés ne correspondent à aucun compte existant. +

+

+ Veuillez réessayer. Si vous avez oublié votre mot de passe, vous pouvez utiliser le service de récupération de mot de passe. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/noSession.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/noSession.ftl new file mode 100644 index 0000000..0ac7423 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/noSession.ftl @@ -0,0 +1,8 @@ +<@page title="Automatiquement déconnecté"> +

+ Votre session a expiré et vous avez été déconnecté de Legacy Worlds. +

+

+ Vous devez vous reconnecter. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/passwordRecoveryOk.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/passwordRecoveryOk.ftl new file mode 100644 index 0000000..9e7693a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/passwordRecoveryOk.ftl @@ -0,0 +1,8 @@ +<@page title="Récupération de mot de passe réussie"> +

+ Votre demande de récupération de mot de passe a été traitée avec succès. +

+

+ Vous pouvez maintenant vous connecter avec le mot de passe que vous venez de définir. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/reactivate.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/reactivate.ftl new file mode 100644 index 0000000..e55163d --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/reactivate.ftl @@ -0,0 +1,11 @@ +<@page title="Compte désactivé"> +

+ Votre compte est actuellement désactivé. +

+

+ Vous pouvez soit le laisser tel quel en vous déconnectant ou choisir de le réactiver. +

+

+ Veuillez noter que votre adresse e-mail doit toujours être valide si vous voulez réactiver votre compte. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/rules.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/rules.ftl new file mode 100644 index 0000000..ed40d85 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/rules.ftl @@ -0,0 +1,116 @@ +<@page title="Règles du jeu"> +

Général

+

+ L'ensemble du jeu est basé sur des mises à jour toutes les minutes. Comme ces mises à jour sont calculées en fonction du moment + où le serveur du jeu a démarré, elles peuvent intervenir à tout moment. +

+

+ C'est pour cela qu'un temps du jeu est défini. Il correspond à la quantité de mises à jour qui ont été calculées. + Une "heure" de temps du jeu correspond à une mise à jour et, en général, à une minute en temps du monde réel. +

+

+ Aucune vraie tentative pour atteindre un jeu équilibré n'a été fait. Il est donc très possible que certains aspects + des règles fonctionnent pas comme prévu. +

+

 

+ +

Finances & recherche

+

+ Les bénéfices sont majoritairement produits par la population d'un empire. Alors que les bénéfices et charges sont affichés + pour une durée de 24h en temps du monde réel, les réserves financières d'un empire augmentent (ou diminuent) en continu. + Les bâtiments optionnels nommés Ligne de production générique apportent un revenu supplémentaire. +

+

+ La population génère aussi des points de recherche qui sont utilisés pour mettre à jour les progrès scientifiques d'un empire. + Quand une technologie atteint 100% de ses points de recherche requis, elle doit être appliquée, ce qui coûte de l'argent. +

+

+ Deux jeux de trois technologies sont disponibles : les technologies civiles donnent accès à de nouveaux bâtiments, + alors que les technologies militaires fournissent de nouveau types de vaisseaux. +

+

+ Si les réserves financières d'un empire atteignent 0 à cause de charges trop élevées, ses flottes vont commencer à se + dégrader. S'il ne possède pas de flottes, alors ce sont les bâtiments de ses planètes qui commencent à se dégrader. +

+

+ Il est par contre possible qu'un empire atteigne 0 à cause de la construction de bâtiments ou vaisseaux. Dans ce cas, aucun + dommage ne sera infligé, mais la construction sera ralentie. +

+

 

+ +

Gestion de planète

+

+ Deux types de bâtiments sont disponibles sans aucune technologie : les fabriques de pièces de vaisseaux (qui permettent la + construction de vaisseaux) et les tourelles défensives (qui fournissent une défense statique à vos planètes). +

+

+ La construction et la destruction de bâtiments ne sont pas immédiates. La vitesse à laquelle les bâtiments sont construits + ou détruits dépend de la population de la planète considérée. Pendant la construction, le coût financier des bâtiments + est prélevé dans les réserves de l'empire à chaque mise à jour. +

+

+ Détruire des bâtiments est bien plus rapide que les construire ; de plus, une petite partie du coût du bâtiment est + restituée aux réserves financières de l'empire une fois que le bâtiment a été détruit. +

+

+ La satisfaction d'une planète est déterminée par trois facteurs : le nombre d'emplois fournis par les bâtiments de la planète + par rapport à la population de la planète, la puissance des défenses statiques et la quantité de planètes + possédées par l'empire. +

+

+ La satisfaction ne change pas immédiatement quand un événement l'affecte. L'évolution est progressive et sa vitesse + dépend de son amplitude et de la population totale de la planète. +

+

+ Quand la satisfaction d'une planète est inférieure à 25%, ses habitants se mettent en grève, ce qui réduit les bénéfices, + la production et les défenses de la planète. +

+

+ La croissance de la population est directement proportionnelle à la satisfaction de la planète. +

+

 

+ +

Flottes et vaisseaux

+

+ Les vaisseaux sont construite sur les planètes selon les mêmes principes que les bâtiments. Par contre, leur vitesse + de construction est déterminée par la production militaire de la planète. +

+

+ Les vaisseaux ont deux caractéristiques : leur puissance, qui détermine leur efficacité au combat, et leur + temps de vol orbite-à-orbite, qui détermine leur vitesse et les différentes pénalités qui peuvent être + infligées à une flottes (redirection, redéploiement, etc.). +

+

+ La puissance d'une flotte correspond à la somme des puissances des vaisseaux qui la composent. Son temps de vol orbite-à-orbite + est déterminé par le vaisseau le plus lent de la flotte. +

+

+ Seules les flottes dont le statut est disponible peuvent être déplacées, divisées ou fusionnées. En + complément, les flottes dont le statut est déploiement initial n'infligent pas de dommages pendant les + combats (par contre, elles peuvent être endommagées). Toutes les flottes peuvent être renommées, dissoutes ou + passées d'un mode à l'autre (entre attaque et défense), quel que soit leur statut. +

+

 

+ +

Batailles

+

+ Une bataille commence à partir du moment une flotte offensive est présente sur une planète, et se termine quand toutes + les flottes offensives sont parties / ont été détruites, ou quand toutes les flottes défensives et défenses planétaires + sont parties / ont été détruites. Dans ce dernier cas, l'attaquant dont la flotte est la plus puissante prend contrôle + de la planète à la mise à jour suivante. +

+

+ Les batailles sont mises à jour toutes les minutes. En conséquence, il n'y a pas de "rapports de bataille" ; à la place, + un historique de la bataille et des événements qui ont eu lieu pendant la bataille est fourni. +

+

+ L'intensité d'une bataille commence à un faible niveau, augmentant progressivement au cours du temps jusqu'à atteindre + l'intensité maximale. Cette intensité détermine la quantité de dommages infligés. +

+

+ Les dommages dus aux combats qui sont infligés que ce soit aux bâtiments ou aux vaisseaux s'accumulent au cours du temps. + Il n'est pas possible de réparer vaisseaux ou bâtiments. +

+

 

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/scope.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/scope.ftl new file mode 100644 index 0000000..39a4f58 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/static/scope.ftl @@ -0,0 +1,58 @@ +<@page title="Portée de ce jalon"> +

+ Ce jalon consiste majoritairement en l'écriture du moteur du jeu et des fonctionnalités + administratives de base. De ce fait, le jeu lui-même est très limité, + de même que l'interface. +

+

 

+ +

Serveur du jeu

+

+ Le serveur du jeu tourne indépendamment de toute interface et est en charge de toutes les + fonctionnalités administratives et de jeu. Cette version est focalisée sur : +

+
    +
  • bases système - enregistrement de fichiers journal, accès en cours d'exécution + à des "constantes" liées au jeu, internationalisation, communications avec les interfaces utilisateur,
  • +
  • comptes - depuis l'enregistrement jusqu'aux préférences et à la gestion de l'inactivité,
  • +
  • système de nommage - les noms de toutes les entités au sein du jeu (empires et + planètes dans cette version) sont gérées par le même sous-système,
  • +
  • système de suivi des bugs - parce qu'il ne sera pas possible d'inclure de forums avant + d'être bien plus loin dans le cycle de développement du jeu, le système de suivi des bugs est un outil + essentiel,
  • +
  • ordonnanceur - parce que les mises à jour ont quand même besoin d'être d'être calculées, + parfois.
  • +
+

 

+ +

Administration du serveur

+

+ L'administration du serveur est l'une des composantes principales de cette version, bien que + la plupart des gens ne la verront (on peut l'espérer) jamais. Elle est implantée comme une + interface utilisateur séparée qui accède au serveur par son interface de communication externe. + L'interface d'administration inclut : +

+
    +
  • système de droits (tous les administrateurs ne sont pas égaux),
  • +
  • gestion des comptes,
  • +
  • accès aux paramètres du jeu,
  • +
  • administration du suivi des bugs,
  • +
  • validation de noms,
  • +
  • affichage des fichiers journal,
  • +
  • rapports d'erreurs automatisés.
  • +
+

 

+ +

Jeu et interface

+

+ Bien que je jeu n'apporte rien de réellement nouveau, il est basé sur un système de mise à + jour à la minute. Son interface n'est probablement pas appropriée, du fait que la disposition + de l'interface externe de la Beta 5 est un peu restreinte quand il s'agit d'afficher toutes + les informations requises au sein du jeu. Cette interface est quoi qu'il en soit temporaire. +

+

+ Cette version est disponible en deux langues - anglais et français - parce que le système + d'internationalisation a besoin d'être testé. Mais il est extrêmement probable que les futurs + jalons ne seront disponibles qu'en anglais. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/account.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/account.ftl new file mode 100644 index 0000000..6f1f622 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/account.ftl @@ -0,0 +1,220 @@ +<#macro render_preference pref> + <#switch pref.type> + <#case 'BOOLEAN'> + <@form_select label=pref.name name=pref.id id="pref-${pref.id}"> + <@form_option value="0" text="Non" selected=( pref.value != "1" )/> + <@form_option value="1" text="Oui" selected=( pref.value == "1" )/> + + <#break> + <#case 'INTEGER'> + <#case 'STRING'> + <@form_text label=pref.name name=pref.id id="pref-${pref.id}" value=pref.value /> + <#break> + <#case 'CHOICE'> + <@form_select label=pref.name name=pref.id id="pref-${pref.id}"> + <#list pref.choices as choice> + <@form_option value=choice.value text=choice.display selected=( pref.value == choice.value )/> + + + <#break> + + <#if pref.description?has_content> + <@form_extra>${pref.description?xhtml} + + +<#macro render_prefs_category category> + <@form_part title=category.name /> + <#list category.preferences as p> + <@render_preference pref=p /> + + +<#macro render> +<@page title="Compte"> + <@tabs> + + <@tab id="prefs" title="Préférences"> + <@form name="prefs-form" action="set-preferences" hash="prefs"> + <#list data.account.preferences as c> + <@render_prefs_category category=c /> + + <@form_extended_submit label="Changer les préférences"> + <@ff_submit label="Défauts" name="load-default-preferences" /> + + + + + <@tab id="basics" title="Identité"> + <@form name="lang-form" action="set-language" hash="basics"> + <@form_part title="Langue du compte" /> + <@form_select name="language" label="Langue "> + <#list data.account.supportedLanguages.languages as lang> + <@form_option text=lang.name value=lang.id selected=(lang.id == data.account.language) /> + + + <@form_submit label="Mettre à jour" /> + + + <@form name="pwd-form" action="set-password" hash="basics"> + <@form_part title="Changement de mot de passe" /> + <#if data.authError!false> + <@form_error>Mot de passe incorrect + + <@form_pwd label="Mot de passe actuel " name="current" /> + <#switch data.passwordError!""> + <#case "EMPTY"> + <@form_error>Mot de passe vide. + <#break> + <#case "TOO_WEAK"> + <@form_error>Ce mot de passe est trop faible. + <#break> + <#case "MISMATCH"> + <@form_error>Le mot de passe et sa confirmation ne sont pas identiques. + <#break> + <#case "PROHIBITED"> + <@form_error>Vous ne pouvez pas utiliser ce mot de passe ici. + <#break> + <#default> + <@form_extra>Au moins 6 caractères, incluant à la fois des lettres et des chiffres. Bonus pour les caractères spéciaux, les espaces et les mots de passe extrèmement longs. + + <@form_pwd label="Mot de passe " name="password" /> + <@form_pwd label="Mot de passe (confirmation) " name="passwordConfirm" /> + <@form_submit label="Mettre à jour" /> + + + <#if data.account.mailChange?has_content> + <#local mc = data.account.mailChange> + <#if mc.used> + <@form name="mail-form" action="set-address" hash="basics"> + <@form_part title="Changement d'adresse e-mail" /> + + Adresse actuelle : + ${data.account.address?xhtml} + + <@form_extra> + Vous pourrez demander un changement d'adresse e-mail à ${mc.until?string("HH:mm:ss (ZZZZZ)")}. + + + <#else> + <@form name="mail-form" action="confirm-set-address" hash="basics"> + <@form_part title="Changement d'adresse e-mail" /> + + Adresse actuelle : + ${data.account.address?xhtml} + + <@form_extra> + Vous êtes en train de demander un changement d'adresse e-mail pour ${mc.newAddress?xhtml}.
+ Votre requête va expirer à ${mc.until?string("HH:mm (ZZZZZ)")}. + + <#if data.codeError!false> + <@form_error>Code de confirmation erroné + + <@form_text name="code" id="mail-confirmation-code" value="${data.code!}" maxLength=64 label="Code de confirmation" /> + <@form_extended_submit label="Changer d'adresse"> + <@ff_submit label="Annuler" name="cancel-set-address" /> + + + + <#else> + <@form name="mail-form" action="set-address" hash="basics"> + <@form_part title="Changement d'adresse e-mail" /> + <#if data.mailAuthError!false> + <@form_error>Mot de pase erroné + + + Current address: + ${data.account.address?xhtml} + + <@form_pwd label="Mot de passe actuel " name="password" id="current-2" /> + <#switch data.mailError!""> + <#case "EMPTY"> + <@form_error>Adresse e-mail vide. + <#break> + <#case "INVALID"> + <@form_error>Adresse e-mail invalide. + <#break> + <#case "IN_USE"> + <@form_error>Cette adresse e-mail est déjà associée à un compte. + <#break> + <#case "SEND_FAIL"> + <@form_error>Impossible d'envoyer un code de confirmation à cette adresse. + <#break> + <#case "MISMATCH"> + <@form_error>L'adresse e-mail et sa confirmation ne sont pas identiques. + <#break> + <#default> + <@form_extra>L'adresse e-mail DOIT exister. + + <@form_text label="Adresse e-mail " maxLength=128 name="mail" value=data.mail! /> + <@form_text label="Adresse e-mail (confirmation) " maxLength=128 name="mailConfirm" value=data.mail! /> + <@form_submit label="Mettre à jour" /> + + + + + <@tab id="status" title="Statut"> + <@form name="game-credits" action="no-action" hash="status"> + <@form_part title="Crédits de jeu" /> + + Crédits de jeu: + ${data.account.gameCredits?string(',##0')} + + <@form_extra> + Les crédits de jeu ne peuvent pas être utilisés actuellement. Par contre, ils seront accumulés au cours du cycle de développement de LWB6. + Vous les obtenez en rapportant des bugs. + + + + <@form name="vacation-form" action="toggle-vacation" hash="status"> + <@form_part title="Mode vacances" /> + + Crédits de vacances : + ${data.account.vacCredits?string(',##0')} + + + Durée maximale : + + <#if data.account.vacTime?has_content> + approximativement <@game_duration record=data.account.vacTime /> + <#else> + moins d'une heure + + + + <#if data.account.vacStart?has_content> + + Début de vacances : + ${data.account.vacStart?string("HH:mm (yyyy-MM-dd ZZZZZ)")} + + <#if data.page.special == 'v'> + <@form_submit label="Quitter le mode vacances" /> + <#else> + <@form_submit label="Annuler le mode vacances" /> + + <#elseif !data.page.special?has_content && data.account.vacTime?has_content> + <@form_submit label="Entrer en mode vacances" /> + + + + <#if !data.page.special?has_content> + <@form name="quit-form" action="quit" hash="status"> + <@form_part title="Quitter le jeu" /> + <@form_extra> + Si vous cliquez le bouton ci-dessous, votre compte sera désactivé après un délai de 24h. Vous pourrez le réactiver pendant les 6 prochains mois, délai après lequel il sera supprimé. + + <@form_text label="Raison de quitter (optionel) " name="reason" value="" /> + <@form_submit label="Quitter le jeu" /> + + <#elseif data.page.special == 'q'> + <@form name="quit-form" action="cancel-quit" hash="status"> + <@form_part title="Quitter le jeu" /> + <@form_extra> + Votre compte sera désactivé à ${data.account.quitGame?string("HH:mm (yyyy-MM-dd ZZZZZ)")}. + + <@form_submit label="Annuler" /> + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/alliance.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/alliance.ftl new file mode 100644 index 0000000..8cbb99c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/alliance.ftl @@ -0,0 +1,268 @@ +<#macro show_alliance alliance> + <@dt_main> + <@dt_entry title="Tag ">${alliance.tag?xhtml} + <@dt_entry title="Nom ">${alliance.name?xhtml} + <@dt_entry title="Dirigeant ">${alliance.leaderName?xhtml} + <@dt_entry title="Planètes ">${alliance.planets?string(",##0")} + <@dt_entry title="">Envoyer un message + + +<#macro alliance_info_tab> + + <@tab id="info" title="Autres alliances"> + + <@form action="alliance-info" name="alliance-info" hash="info"> + <@form_text name="tag" id="ai-tag" label="Tag de l'alliance" value=data.requested! maxLength=5 /> + <@form_submit label="Obtenir les informations" /> + + + <#if data.info?has_content> + <@show_alliance alliance=data.info /> + + + + + +<#macro alliance_creation_tab> + + <#if data.creation?has_content> + <#assign tag = data.creation.tag!> + <#assign tagError = data.creation.tagError!> + <#assign name = data.creation.name!> + <#assign nameError = data.creation.nameError!> + <#else> + <#assign tag = ""> + <#assign tagError = ""> + <#assign name = ""> + <#assign nameError = ""> + + + <@tab id="create-alliance" title="Créer"> + <@form action="create-alliance" name="create-alliance" hash="create-alliance"> + <#switch tagError> + <#case "EMPTY"><@form_error>Veuillez indiquer le tag de votre alliance.<#break> + <#case "INVALID"><@form_error>Ce tag est invalide.<#break> + <#case "UNAVAILABLE"><@form_error>Ce tag est utilisé par une autre alliance. + + <@form_text name="tag" id="ca-tag" label="Tag de l'alliance " value=tag maxLength=5 /> + + <#switch nameError> + <#case "EMPTY"><@form_error>Veuillez spécifier le nom de votre alliance.<#break> + <#case "INVALID"><@form_error>Ce nom est invalide.<#break> + + <@form_text name="name" id="ca-name" label="Nom de l'alliance " value=name maxLength=5 /> + + <@form_submit label="Créer une alliance" /> + + + + +<#macro alliance_join_tab> + + <@tab id="join-alliance" title="Rejoindre"> + <@form action="join-alliance" name="join-alliance" hash="join-alliance"> + <#if data.joinFailure?has_content> + <@form_error>Alliance non trouvée. + + <@form_text name="tag" id="ja-tag" label="Tag de l'alliance" value=data.joinFailure! maxLength=5 /> + <@form_submit label="Rejoindre cette alliance" /> + + + + +<#macro no_alliance> + + <#if data.page.special! != 'v'> + <@alliance_join_tab /> + <@alliance_creation_tab /> + + + +<#macro alliance_joining_tab> + + <@tab id="join-alliance" title="Requête envoyée"> + <@lineform action="cancel-join" hash="join-alliance"> + Une requête pour rejoindre ${alliance.main.tag?xhtml} a été envoyée. + <#if data.page.special! != 'v'> + <@ff_submit label="Annuler" /> + + + <@show_alliance alliance=alliance.main /> + + + +<#macro alliance_planets pList> + <@tab id="planets" title="Planètes"> + + <#if pList?size == 0> +

Il n'y a pas de planètes dans cette alliance.

+ <#return> + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Coordonnées + <@lv_column width=150>Planètes + <@lv_column width=150>Propriétaire + + + <#list pList as planet> + <#if planet.battle> + <#local bStart = ""> + <#local bEnd = ""> + <#else> + <#local bStart = " "> + <#local bEnd = " "> + + + <@lv_line> + <@lv_column centered=true>${bStart}(${planet.x},${planet.y};${planet.orbit})${bEnd} + <@lv_column>${bStart}${planet.name?xhtml}${bEnd} + <@lv_column>${bStart}${planet.owner?xhtml}${bEnd} + + + <#if planet.battle> + <@lv_line> +   + + Situation militaire: + ${planet.defence?string(",##0")} + contre + ${planet.attack?string(",##0")} + + + + + + + + +<#macro alliance_members mList isLeader empty=""> + + <#if mList?size == 0 && empty != ""> +

${empty?xhtml}

+ <#return> + + + <@listview> + <@lv_line headers=true> + <#if isLeader && data.page.special! != 'v'> + <@lv_column width=40 centered=true>  + + <@lv_column width="x">Empire + + + <#list mList as member> + <@lv_line> + <#if isLeader && data.page.special! != 'v'> + <@lv_column centered=true> + <#if member.name == data.page.empire> +   + <#else> + + + + + <@lv_column> + <#if member.name == data.page.empire> + ${member.name?xhtml} + <#else> + ${member.name?xhtml} + + + + + + + +<#macro alliance_member_page> + <#local leader = alliance.leader?has_content> + + <@tab id="in-alliance" title="Alliance"> + <@lineform action="leave-alliance" hash="join-alliance"> + Vous êtes + <#if alliance.leader?has_content> + le dirigeant + <#else> + un membre + + de ${alliance.main.tag?xhtml}. + <#if data.page.special! != 'v'> + <@ff_submit label="Quitter l'alliance" /> + + + <@show_alliance alliance=alliance.main /> + + + <@alliance_planets pList=alliance.member.planets /> + + <@tab id="members" title="Members"> + <#if leader && alliance.member.members?size gt 1 && data.page.special! != 'v'> +
+ + <@alliance_members mList=alliance.member.members isLeader=leader /> + <#if leader && alliance.member.members?size gt 1 && data.page.special! != 'v'> +
+
+ <@ff_submit label="Exclure les membres sélectionnés" /> +
+
+
+ + <@lineform action="transfer-leadership" hash="members"> + Trasnférer la direction à + <@ff_select id="leadership" name="leadership"> + <#list alliance.member.members as member> + <#if member.name != data.page.empire> + <@form_option value=member.id text=member.name /> + + + + <@ff_submit label="Confirmation" /> + + + + + <#if leader> + <@tab id="requests" title="Requêtes"> + <#if alliance.leader.requests?size gt 0 && data.page.special! != 'v'> +
+ + <@alliance_members mList=alliance.leader.requests isLeader=true empty="Aucune requête en suspens" /> + <#if alliance.leader.requests?size gt 0 && data.page.special! != 'v'> +
+
+ <@ff_select id="requests-select" name="action"> + <@form_option value="1" text="Accepter" /> + <@form_option value="0" text="Rejecter" /> + postulants sélectionnés + <@ff_submit label="Confirmation" /> +
+
+
+ + + + + +<#macro render> +<@page title="Alliance"> + + <#assign alliance = data.alliance> + <@tabs> + + <#if alliance.main?has_content> + <#if alliance.member?has_content> + <@alliance_member_page /> + <#else> + <@alliance_joining_tab /> + + <#else> + <@no_alliance /> + + <@alliance_info_tab /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/banned.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/banned.ftl new file mode 100644 index 0000000..c098592 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/banned.ftl @@ -0,0 +1,12 @@ +<#macro render> +<@page title="Vous avez été banni"> +

Vous avez réussi. Vous avez été banni. Bien joué.

+ <@dt_main> + <@dt_entry width=200 title="Date/Heure du bannissement ">${data.banTime?string("yyyy-MM-dd HH:mm:ss")} + <@dt_entry width=200 title="Raison du bannissement ">${data.banReason?xhtml} + + <#if data.redeemable> +

Votre empire n'a pas encore été supprimé. Vous pouvez faire appel de ce bannissement en envoyant un e-mail à the staff dans un délai de 48h.

+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battle.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battle.ftl new file mode 100644 index 0000000..69236c1 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battle.ftl @@ -0,0 +1,261 @@ +<#macro render_header desc> +
+ At ${desc.location.name?xhtml} + (${desc.x},${desc.y};${desc.orbit}) +
+ +<#macro render_navigation id disp> +
+ + + + + + + +
+ <#if disp.previous?has_content> + + + << + <#if disp.previous?has_content> + + + + <@ff_select id="view-battle-tick" name="tick" style="width:470px"> + <#list disp.all as viewable> + <@form_option value="${viewable.ticks?string('#')}" selected=(viewable.ticks == disp.current.ticks)><@game_time record=viewable.gameTime /> + + + <@ff_submit label="Voir" style="width:40px" /> + + <#if disp.next?has_content> + + + >> + <#if disp.next?has_content> + + + + >>> +
+
+ +<#macro render_list_entry mode record type> + +   + les bâtiments<#else>les vaisseaux">  +   + + <#nested> + + ${record.cPower?string(',##0')} + ${record.lPower?string(',##0')} + + <#list record.ships as shipType> + +   + ${shipType.name} + ${shipType.cAmount?string(',##0')} + ${shipType.lAmount?string(',##0')} + + + +<#macro render_protagonist mode record> + <#if record.ships?has_content> + <@render_list_entry mode=mode record=record type="empire"> + <#if record.player.id = 0 || mode = "own"> + ${record.player.name?xhtml} + <#else> + ${record.player.name?xhtml} + + + + +<#macro render_planet mode record> + <@render_list_entry mode=mode record=record type="planet">( planète ) + +<#macro render_protagonists mode source> + <#if source.players?size = 0> + <#return> + + +   +   + Forces <#if mode == "allied">Alliées<#else>Hostiles + ${source.cPower?string(',##0')} + ${source.lPower?string(',##0')} + + <#list source.ships as shipType> + +   + ${shipType.name} + ${shipType.cAmount?string(',##0')} + ${shipType.lAmount?string(',##0')} + + + <#list source.players as pRecord> + <@render_protagonist mode=mode record=pRecord /> + + +<#macro render_fleets fData> + <@listview> + Forces + <@lv_line headers=true> +   +   +   +   +   + <@lv_column width=100 centered=true>Actuelles + <@lv_column width=100 centered=true>Détruites + + <@render_protagonist mode="own" record=fData.own /> + <#if fData.planet.relation == "OWN"> + <@render_planet mode="own" record=fData.planet /> + + <@render_protagonists mode="allied" source=fData.friendly /> + <#if fData.planet.relation == "ALLIED"> + <@render_planet mode="allied" record=fData.planet /> + + <@render_protagonists mode="enemy" source=fData.hostile /> + <#if fData.planet.relation == "ENEMY"> + <@render_planet mode="enemy" record=fData.planet /> + + Cliquer "*" et "+" pour étendre les affichages de vaisseaux/bâtiments. + + +<#macro render_event_items items> + <#list items as item> + <@lv_line> +   + ${item.name} + ${item.cAmount?string(",##0")} + + + +<#macro render_event event> + <#switch event.type> + <#case "RENAME"> + <@lv_line> + Planète renommée en ${event.name} + + <#break> + <#case "SWITCH"> + <@lv_line> + + <#if event.name = data.page.empire> + Nous sommes passés en <#if event.hostile>attaque<#else>défense. + <#else> + ${event.name} a changé de mode et est maintenant <#if event.hostile>hostile<#else>dans notre camp. + + + + <#break> + <#case "BUILD"> + <@lv_line> + + <#if event.planet> + De nouveau bâtiments ont été construits sur la planète. + <#elseif event.name = data.page.empire> + Nos nouvelles flottes ont été déployées. + <#else> + Des flottes <#if event.hostile>Hostiles<#else>Alliées appartenant à ${event.name} ont été déployées. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "DEPART"> + <@lv_line> + + <#if event.name = data.page.empire> + Nos flottes ont quitté l'orbite. + <#else> + Des flottes <#if event.hostile>Hostiles<#else>Alliées appartemant à ${event.name} ont quitté l'orbite. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "ARRIVE"> + <@lv_line> + + <#if event.name = data.page.empire> + Nos flottes se sont jointes à la bataille. + <#else> + Des flottes <#if event.hostile>Hostiles<#else>Alliées appartenant à ${event.name} se sont jointes à la bataille. + + + + <@render_event_items items=event.ships /> + <#break> + <#case "DESTROY"> + <@lv_line> + + <#if event.planet> + Des bâtiments ont été détruits sur la planète. + <#elseif event.name = data.page.empire> + Nos flottes ont été dissoutes. + <#else> + Des flottes <#if event.hostile>Hostiles<#else>Alliées appartenant à ${event.name} ont été dissoutes. + + + + <@render_event_items items=event.ships /> + <#break> + <#default> + <@lv_line> + + Type d'événement manquant "${event.type}" (ceci est un bug) + + + <#break> + + +<#macro render_history hData> + <#if hData?size = 0> + <#return> + + <@listview> + Historique + <@lv_line headers=true> +   +   +   + + <#list hData as hInterval> + <#if hInterval.end?has_content> + <#if hInterval.battleEnds> + La bataille s'est terminée à <@game_time record=hInterval.end.gameTime /> + <#else> + Plus de flottes à cet endroit + +   + + <#list hInterval.entries as atTick> + <@game_time record=atTick.time.gameTime />: + <#list atTick.events as event> + <@render_event event=event /> + +   + + <#if hInterval.battleBegins> + La bataille a commencé à <@game_time record=hInterval.begin.gameTime /> + + + + +<#macro render> +<#local bDescription = data.battle.description> +<#local bDisplay = data.battle.display> +<@page title="Battle #${bDescription.id?string(',##0')} at ${bDescription.location.name}"> + + <@render_header desc=bDescription /> + <@render_navigation id=bDescription.id disp=bDisplay /> +

 

+ <@render_fleets fData=data.battle.ships /> + <@render_history hData=data.battle.history /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battles.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battles.ftl new file mode 100644 index 0000000..1cd3e7c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/battles.ftl @@ -0,0 +1,62 @@ +<#macro render_battles battles page pages> + <#if pages gt 1> + + + + + + +
+ <#if page gt 0> + + + << + <#if page gt 0> + + + + Page ${page + 1} / ${pages} + + <#if page lt pages - 1> + + + >> + <#if page lt pages - 1> + + +
+ + <@listview> + <@lv_line headers=true> + <@lv_column width=60 centered=true># + <@lv_column width="x">Localisation + <@lv_column width=80 centered=true>  + <@lv_column width=125 centered=true>Rejointe + <@lv_column width=125 centered=true>Terminée + + <#list battles as battle> + <@lv_line> + <@lv_column centered=true>${battle.id?string(',##0')} + <@lv_column>${battle.location.name?xhtml} + <@lv_column centered=true>(${battle.x},${battle.y};${battle.orbit}) + <@lv_column centered=true><@game_time record=battle.first.gameTime /> + <@lv_column centered=true> + <#if battle.last?has_content> + <@game_time record=battle.last.gameTime /> + <#else> + En cours + + + + + + +<#macro render> +<@page title="Batailles"> + <#if data.pages == 0> +

Nous n'avons pris part à aucune bataille

+ <#else> + <@render_battles battles=data.list page=data.currentPage pages=data.pages /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsList.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsList.ftl new file mode 100644 index 0000000..c964038 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsList.ftl @@ -0,0 +1,136 @@ +<#include "bugsTabs.ftl"> +<#macro render_navigation current count total qString> + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 1> + ${total?string(',##0')} entrées trouvées. + <#elseif total = 1> + 1 entrée trouvée. + <#else> + Aucune entrée trouvée. + + + <#if current lt total - count> + + + >> + <#if current lt total - count> + + +
+ +<#macro render> +<#if data.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.status!'x'}&own=${ownOnly}" > +<@page title="Suivi des bugs"> + <#-- Tabs --> + <@bugTabs selected="bugsList" qString="${qString}&first=${data.first}" /> + + <#-- Selection --> +
+
+ + +
+ Lister + <@ff_select id="sel-own" name="own"> + <@form_option value="0">tous les + <@form_option value="1" selected=(data.ownOnly)>mes + + rapports dont le statut est : + <@ff_select id="sel-stat" name="status"> + <@form_option value="x">(indifférent) + <@form_option value="PENDING" selected=((data.status!"") = 'PENDING')>en attente de validation + <@form_option value="OPEN" selected=((data.status!"") = 'OPEN')>en cours de traitement + <@form_option value="RESOLVED" selected=((data.status!"") = 'RESOLVED')>résolu + <@form_option value="WONT_FIX" selected=((data.status!"") = 'WONT_FIX')>ne sera pas résolu + <@form_option value="NOT_A_BUG" selected=((data.status!"") = 'NOT_A_BUG')>pas un bug + + <@ff_submit label="Rechercher" /> +
+
+
+ + <#-- Navigation --> + <@render_navigation current=data.first count=data.count total=data.entries qString=qString /> + + <#-- List of bugs --> + <#if data.reports?size gt 0> + <@listview> + + <@lv_line headers=true> + <@lv_column centered=true width=60># + <@lv_column width="x">Titre + <#if !( data.status?has_content )> + <@lv_column width=130 centered=true>Statut + + <@lv_column width=150 centered=true>Dernière mise à jour + + + <#list data.reports as report> + + <#if !data.ownOnly && report.initialSubmitter.userId?has_content && !report.initialSubmitter.admin && report.initialSubmitter.name = data.page.empire> + <#local eClass="own-fleet"> + <#else> + <#local eClass=""> + + + <@lv_line class=eClass> + <@lv_column centered=true>${report.reportId?string(",##0")} + <@lv_column>${report.title} + <#if !( data.status?has_content )> + <@lv_column centered=true><@bugStatus status=report.status /> + + <@lv_column centered=true> + <#if report.updated> + + + ${report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + <#if report.updated> + + + + + <@lv_line class=eClass> + <#if data.status?has_content> + + <#else> + + +   + <@lv_column centered=true> + par + <#if report.latestSubmitter.admin> + + + ${report.latestSubmitter.name} + <#if report.latestSubmitter.admin> + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsReport.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsReport.ftl new file mode 100644 index 0000000..df9adab --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsReport.ftl @@ -0,0 +1,62 @@ +<#include "bugsTabs.ftl"> +<#macro render> +<#if data.query.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Rapporter un bug"> + <@bugTabs selected="bugsReport" qString="${qString}&first=${data.query.first}" /> + +

LISEZ CECI AVANT DE RAPPORTER UN BUG

+

+ Or donc, vous avez découvert quelque chose qui ne fonctionne pas ou qui semble se comporter + incorrectement. Très bien - c'est la raison pour laquelle cette version est publique. +

+

+ Cependant, êtes-vous sûr qu'il s'agit bel et bien d'un bug? Si vous avez joué à la Beta 5, beaucoup + de choses ont changé et ne se comportent plus de la même manière. Assurez-vous tout d'abord d'avoir + consulté les règles du jeu ainsi que les informations concernant la + portée de ce jalon. +

+

+ Une fois que vous avez lu cette documentation, si vous n'avez rien trouvé qui semble se rapporter + à votre problème, hé bien, il s'agit d'un vrai bug ou bien de quelque chose qui a été omis dans la doc. + Dans tous les cas, ce problème devrait être rapporté en utilisant le formulaire ci-dessous. + Utilisez un titre aussi clair que possible (il devrait indiquer la nature du problème) + et écrivez une description aussi précise que vous le pouvez. +

+

+ Il est préférable que ce rapport soit écrit en Anglais, afin d'être lisible par tous les membres + de l'équipe, mais ce n'est pas obligatoire. +

+

+ Merci pour votre aide! +

+ + <@form action="report-bug"> + + + + + + + <#switch data.titleError!""> + <#case "EMPTY"><@form_error>Veuillez spécifier le titre du rapport<#break> + <#case "INVALID"><@form_error>Le titre doit comprendre au moins 10 caractères<#break> + + <@form_text label="Titre " name="title" value=data.title!"" maxLength=127 /> + + <#switch data.descriptionError!""> + <#case "EMPTY"><@form_error>Veuillez spécifier la description du bug<#break> + <#case "INVALID"><@form_error>La description doit comprendre au moins 30 caractères<#break> + + <@form_text label="Description " name="description" value=data.description!"" multiline=true maxLength=10 /> + + <@form_submit label="Poster le rapport de bug" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsTabs.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsTabs.ftl new file mode 100644 index 0000000..b5d7633 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsTabs.ftl @@ -0,0 +1,18 @@ +<#macro bugTab href title selected> + ${title} + +<#macro bugTabs selected qString> +
+ <@bugTab href="bugtrack?${qString}" title="Lister les bugs" selected=( selected = 'bugsList' ) /> + <@bugTab href="report-bug?${qString}" title="Rapporter un bug" selected=( selected = 'bugsReport' ) /> +
+ +<#macro bugStatus status> + <#switch status> + <#case "PENDING">en attende de validation<#break> + <#case "OPEN">en cours de traitement<#break> + <#case "RESOLVED">résolu<#break> + <#case "WONT_FIX">ne sera pas résolu<#break> + <#case "NOT_A_BUG">pas un bug<#break> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsView.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsView.ftl new file mode 100644 index 0000000..5937a63 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/bugsView.ftl @@ -0,0 +1,124 @@ +<#include "bugsTabs.ftl" /> +<#macro render_submitter s> + <#if s.admin> + + <#elseif s.userId?has_content && s.name = data.page.empire> + + + ${s.name?xhtml} + <#if s.admin || ( s.userId?has_content && s.name = data.page.empire )> + + + +<#macro render_event e> +
+ ${e.timestamp?string("yyyy-MM-dd HH:mm:ss")} - <@render_submitter s=e.submitter /> + <#nested> +
+ +<#macro render_report_event e> + <@render_event e=e> + a posté un rapport de bug #${e.id?string(",##0")} + +

${e.title}

+
+ ${e.contents} +
+ +<#macro render_status_event e> + <@render_event e=e> + a changé le statut du rapport en <@bugStatus status=e.status /> + + +<#macro render_visibility_event e> + <@render_event e=e> + a mis la visibilité du rapport à <#if e.visible>public<#else>privé + + +<#macro render_merge_event e> + <@render_event e=e> + a fusionné le rapport de bug courant avec le rapport de bug #${e.mergedId?string(",##0")} + + +<#macro render_comment_event e> + <@render_event e=e> + a posté un commentaire + <#if !e.visible> + (en attente de modération) + + +
+ ${e.contents} +
+ +<#macro render> +<#if data.query.ownOnly> + <#local ownOnly = "1"> +<#else> + <#local ownOnly = "0"> + +<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" > +<@page title="Bug #${data.report.reportId?string(',##0')} - ${data.report.title}" hidePlanets=true> + <#-- Tabs --> + <@bugTabs selected="" qString="${qString}&first=${data.query.first}" /> + + <#-- Bug info --> + <@dt_main> + <@dt_entry title="Statut "><@bugStatus status=data.report.status /> + <@dt_entry title="Public "><#if data.report.visible>Oui<#else>Non + <@dt_entry title="Rapporté initialement le "> + ${data.report.posted?string("yyyy-MM-dd HH:mm:ss")} + par <@render_submitter s=data.report.initialSubmitter /> + + <@dt_entry title="Dernière mise à jour le "> + ${data.report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")} + par <@render_submitter s=data.report.latestSubmitter /> + + + + <#-- List events --> + <#local mayPost = false> + <#list data.events as event> +
+ <#local mayPost = ( mayPost || ( !event.submitter.admin && event.submitter.userId?has_content && event.submitter.name = data.page.empire ) )> + <#switch event.type> + <#case 'INIT'> + <@render_report_event e=event /> + <#break> + <#case 'STATUS'> + <@render_status_event e=event /> + <#break> + <#case 'COMMENT'> + <@render_comment_event e=event /> + <#break> + <#case 'VISIBILITY'> + <@render_visibility_event e=event /> + <#break> + <#case 'MERGE'> + <@render_merge_event e=event /> + <#break> + + + + <#-- Comment form --> + <#if mayPost && ( data.report.status = 'OPEN' || data.report.status = 'PENDING' )> +
+ <@form action="bug-${data.report.reportId}-comment" hash="post-comment"> + + + + + + + + <#switch data.commentError!""> + <#case "EMPTY"><@form_error>Vous devriez écrire le commentaire avant de le poster.<#break> + <#case "INVALID"><@form_error>Les commentaires doivent compter au moins 30 caractères.<#break> + + <@form_text label="Nouveau commentaire " name="comment" multiline=true maxLength=6 value=data.comment!"" /> + <@form_submit label="Poster le commentaire" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/chat.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/chat.ftl new file mode 100644 index 0000000..52708bf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/chat.ftl @@ -0,0 +1,28 @@ +<#macro render> +<@page title="Legacy Worlds - Discussion"> + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/enemies.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/enemies.ftl new file mode 100644 index 0000000..0c98924 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/enemies.ftl @@ -0,0 +1,92 @@ +<#macro enemy_tab eList alliances> + + <#if alliances> + <#local tabId = "alliances"> + <#local addAction = "alliance"> + <#local tabTitle = "Alliances"> + <#local emptyText = "Aucune alliance ennemie."> + <#local nameLen = 5> + <#if data.alliance?has_content & data.alliance> + <#local error = data.error> + <#local defName = data.name> + + <#else> + <#local tabId = "empires"> + <#local addAction = "empire"> + <#local tabTitle = "Empires"> + <#local emptyText = "Aucun empire ennemi."> + <#local nameLen = 20> + <#if data.alliance?has_content & !data.alliance> + <#local error = data.error> + <#local defName = data.name> + + + + <@tab id=tabId title=tabTitle> + + <#if eList?size == 0> +

${emptyText}

+ <#else> +
+ <@listview> + <@lv_line headers=true> + <@lv_column width=40 centered=true>  + <@lv_column width="x">${tabTitle} + + + <#list eList as enemy> + <@lv_line> + <@lv_column centered=true> + <@lv_column> + <#if alliances>[<#else>${enemy.name?xhtml}<#if alliances>] + + + + +
+
+ <@ff_submit label="Supprimer les ennemis sélectionnés" /> +
+
+
+ + + <#if data.page.special! != 'v'> + <#if error?has_content> + <@standalone_error> + <#switch error> + <#case "INVALID"><#if alliances>Alliance<#else>Empire non trouvé.<#break> + <#case "BANNED"> + <#if alliances> + Petite trahison entre amis ? + <#else> + Il y a un terme médical pour ça - schizophrénie. + + <#break> + <#case "UNAVAILABLE"> + <#if alliances>Cette alliance<#else>Cet empire est déjà dans votre liste d'ennemis. + <#break> + + + + <@lineform action="add-enemy-${addAction}" hash=tabId> + Nouvel ennemi: <@ff_text id="name-${addAction}" name="name" value=defName! maxLength=nameLen size=(nameLen+1) /> + <@ff_submit label="Ajouter" /> + + + + + + +<#macro render> +<@page title="Liste d'ennemis"> + + <@tabs> + + <@enemy_tab eList=data.empires alliances=false /> + <@enemy_tab eList=data.alliances alliances=true /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleets.ftl new file mode 100644 index 0000000..016cdaf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleets.ftl @@ -0,0 +1,261 @@ +<#macro render_fleet_ships rType id ships> + + + + + + + <#list ships as ship> + + + + + + +
Classe de vaisseauxQuantitéPuissance
${ship.name}${ship.amount?string(',##0')}${ship.power?string(',##0')}
+ +<#macro render_static_fleet_details rType fleet> + +   + +
+ <@render_fleet_ships rType="own-fleet" id=fleet.id ships=fleet.ships /> +
+
+ <@dt_main> + <#if fleet.status != 'AVAILABLE'> + <@dt_entry title="Pénalité"> + <@duration rTime=fleet.penalty gTime=fleet.gamePenalty /> + + + <@dt_entry abbr="TVOO " title="Temps de vol d'orbite-à-orbite"> + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + +
+ + + +<#macro render_fleets_at location owners> + <#list owners as owner> + <#switch owner.relation> + <#case 'OWN'> + <#local rType = 'own-fleet'> + <#local mode = location.attacking > + <#break> + <#case 'ALLIED'> + <#local rType = 'allied-fleet'> + <#local mode = location.attacking > + <#break> + <#case 'ENEMY'> + <#local rType = 'enemy-fleet'> + <#local mode = ! location.attacking > + <#break> + + <#list owner.fleets as fleet> + + + <#if owner.relation == 'OWN' && data.page.special! != 'v'> + + <#else> +   + + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (flotte sans nom) + + + + <#if owner.relation = 'OWN'> + ${owner.name?xhtml} + <#else> + ${owner.name?xhtml} + + + + <#if mode>A<#else>D + + ${fleet.power?string(',##0')} + + <#if fleet.status == 'AVAILABLE'> + DIS + <#else> + <#switch fleet.status> + <#case 'DEPLOYING'>DPL<#break> + <#case 'REDEPLOYING'>RDP<#break> + + + + + <@render_static_fleet_details rType=rType fleet=fleet /> + + + +<#macro render_static_fleets locations> + <#list locations as location> + + + + + + + + + + + <#if location.onVacation!false> + + <#elseif location.battle?has_content && location.battle.hostile gt 0> + + +
${location.name?xhtml}${location.name?xhtml} (${location.x},${location.y};${location.orbit})Population : ${location.population?string(",##0")} + <#if location.attacking> + + <#elseif location.own> + + <#else> + + + Défense : ${location.defence?string(",##0")} + +
+ <#if location.fleetOwners?size == 0> +

Aucune flotte à cet endroit.

+ <#else> + + + + + + + + + + <@render_fleets_at location=location owners=location.fleetOwners /> +
 Nom de la flottePropriétaireMPS
+ +
Mode vacances activé
+ Bataille - ${location.battle.friendly?string(',##0')} contre ${location.battle.hostile?string(',##0')} - + Détails +
+ + +<#macro render_moving_fleet_details fleet> + +   + +
+ <@render_fleet_ships rType="own-fleet" id=fleet.id ships=fleet.ships /> +
+
+ <@dt_main> + <@dt_entry title="Origine ">${fleet.source.name?xhtml} + <@dt_entry title="Statut "> + <#if fleet.status == 'AVAILABLE'> + DIS + <#else> + RDR - + <@duration rTime=fleet.penalty gTime=fleet.gamePenalty /> + + + <@dt_entry title="Temps jusqu'à la destionation "><@duration rTime=fleet.timeLeft gTime=fleet.gameTimeLeft /> + <@dt_entry title="Coordonnées ">(${fleet.currentX?string("0.00")};${fleet.currentY?string("0.00")}) + <@dt_entry title="Planète la plus proche "> + <#if fleet.nearest?has_content> + ${fleet.nearest.name?xhtml} + <#else> + dans l'espace profond + + + <@dt_entry abbr="TVOO " title="Temps de vol d'orbite-à-orbite"> + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + +
+ + + +<#macro render_moving_fleet fleet> + + + <#if data.page.special! != 'v'> + + <#else> +   + + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (flotte sans nom) + + + + <#if fleet.attacking>A<#else>D + + ${fleet.power?string(',##0')} + <@duration rTime=fleet.eta gTime=fleet.gameEta /> + ${fleet.destination.name?xhtml} + + <@render_moving_fleet_details fleet=fleet /> + +<#macro render_moving_fleets fleets> + <#if fleets?size != 0> + + + + + + + +
Flottes en mouvement
+ + + + + + + + + + <#list fleets as fleet> + <@render_moving_fleet fleet=fleet /> + +
 Nom de la flotteMPTEADestination
+
+ + +<#macro render> +<@page title="Flottes"> + <#local locations = data.fleets.locations> + <#local mFleets = data.fleets.moving> + <#if locations?size == 0 && mFleets?size == 0> +

Vous ne possédez ni flottes ni planètes.

+ <#else> +
Cliquez sur le nom d'un flotte pour voir sa compsition et autres détails la concernant
+
+ <@render_static_fleets locations=locations /> + <@render_moving_fleets fleets=mFleets /> + <#if data.page.special! != 'v'> +
+ +   + +   + + +   + + +   + +
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleetsCommand.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleetsCommand.ftl new file mode 100644 index 0000000..7543fca --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/fleetsCommand.ftl @@ -0,0 +1,137 @@ +<#macro render_fleet fleet> + + + <#if fleet.name?has_content && fleet.name != ""> + ${fleet.name?xhtml} + <#else> + (flotte sans nom) + + + ${fleet.power?string(',##0')} + <@duration rTime=fleet.flightTime gTime=fleet.gameFlightTime /> + + <#switch fleet.status> + <#case 'DEPLOYING'>DPL<#break> + <#case 'REDEPLOYING'>RDP<#break> + <#case 'REDIRECTING'>RDP<#break> + <#case 'AVAILABLE'>DIS<#break> + + + + (${fleet.x?string("0.00")};${fleet.y?string("0.00")})
+ <#if fleet.nearest?has_content> + <#if fleet.atPlanet>À<#else>Près de + ${fleet.nearest.name?xhtml} + <#else> + Dans l'espace profond + + + +<#macro render_selected_fleets fleets> +

Flottes sélectionnées

+ + + + + + + + + + <#list fleets as fleet> + + <@render_fleet fleet=fleet /> + + +
 NomPTVSLocalisation
+ +<#macro render_move_fleets> +

Nouveaux ordres

+ <#if data.error> + <@standalone_error>Cette planète n'existe pas. + +

+ Diriger les flottes sélectionnées vers + <@ff_text name="destination" id="destination" value="${data.destination!?xhtml}" maxLength=20 size=21 /> + en + <@ff_select name="mode" id="mode"> + <@form_option text="défense" selected=( !data.mode!false ) value="0" /> + <@form_option text="attaque" selected=( data.mode!false ) value="1" /> + +   + <@ff_submit label="Ok" /> + <@ff_submit label="Annuler" name="cancel" /> +

+ +<#macro render_rename_fleets> +

Renommer les flottes

+ <#if data.error> + <@standalone_error>Ce nom est invalide. + +

+ Renommer les flottes sélectionnées en + <@ff_text name="name" id="name" value="${data.name!?xhtml}" maxLength=40 size=21 /> +   + <@ff_submit label="Ok" /> + <@ff_submit label="Annuler" name="cancel" /> +

+ +<#macro render_set_fleets_mode> +

Définir le mode des flottes

+

+ Mettre les flottes sélectionnées en + <#if data.attack>attaque<#else>défense? +   + <@ff_submit label="Oui" /> + <@ff_submit label="Non" name="cancel" /> +

+ + +<#macro render_disband_fleets> +

Dissudre les flottes

+

+ Êtes-vous sûr? +   + <@ff_submit label="Oui" /> + <@ff_submit label="Non" name="cancel" /> +

+ +<#macro render> +<#switch dataType> + <#case 'MoveFleetsResponse'> + <#local title="Déplacer les flottes"> + <#local action="move-fleets.action"> + <#break> + <#case 'RenameFleetsResponse'> + <#local title="Renommer les flottes"> + <#local action="rename-fleets.action"> + <#break> + <#case 'SetFleetsModeResponse'> + <#local title="Définir le mode des flottes"> + <#local action="set-fleets-mode.action"> + <#break> + <#case 'DisbandFleetsResponse'> + <#local title="Dissoudre les flottes"> + <#local action="disband-fleets.action"> + <#break> + +<@page title=title> +
+ <@render_selected_fleets fleets=data.fleets /> + <#switch dataType> + <#case 'MoveFleetsResponse'> + <@render_move_fleets /> + <#break> + <#case 'RenameFleetsResponse'> + <@render_rename_fleets /> + <#break> + <#case 'SetFleetsModeResponse'> + <@render_set_fleets_mode /> + <#break> + <#case 'DisbandFleetsResponse'> + <@render_disband_fleets /> + <#break> + +
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/getNewPlanet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/getNewPlanet.ftl new file mode 100644 index 0000000..d1e336c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/getNewPlanet.ftl @@ -0,0 +1,17 @@ +<#macro render> +<@page title="Obtenir une nouvelle planète"> +

Des hordes de barbares à la bouche écumante ont envahi votre empire, massacrant vos femmes et violant votre bétail ?

+

Eh bien, n'ayez plus peur ! Vous pourrez recevoir une nouvelle planète flambant neuve.

+

Please note that doing this will disband your fleets.

+ <@form action="get-planet" name="get-planet"> + <#switch data.error!> + <#case "EMPTY"><@form_error>Veuillez sélectionner un nom de planète.<#break> + <#case "INVALID"><@form_error>Nom de planète invalide.<#break> + <#case "UNAVAILABLE"><@form_error>Ce nom de planète n'est pas disponible.<#break> + <#case "BANNED"><@form_error>Ce nom de planète a été banni.<#break> + + <@form_text name="name" label="Nom de la nouvelle planète " value=data.name! /> + <@form_submit label="Obtenir la planète" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/maintenance.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/maintenance.ftl new file mode 100644 index 0000000..41cffba --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/maintenance.ftl @@ -0,0 +1,16 @@ +<#macro render><@page title="Serveur en cours de maintenance"> + <@dt_main title="Le serveur est en cours de maintenance."> + <@dt_entry title="Début de la maintenance">${data.start?string("yyyy-MM-dd HH:mm")} + <@dt_entry title="Temps serveur actuel">${data.current?string("yyyy-MM-dd HH:mm")} + <@dt_entry title="Fin prévue de l'opération"> + <#if data.late> + + + ${data.end?string("yyyy-MM-dd HH:mm")} + <#if data.late> + + + + <@dt_entry title="Raison">${data.reason?xhtml} + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/map.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/map.ftl new file mode 100644 index 0000000..6150e35 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/map.ftl @@ -0,0 +1,83 @@ +<#macro render_system system tags> + + <#list system.planets as planet> + <#if tags> + <#if planet.tag?has_content> + <#assign vName = "[${planet.tag}]"> + <#else> + <#assign vName = "N/A"> + + <#else> + <#assign vName = planet.name> + + <#if planet.tag?has_content> + <#assign vTitle = " [${planet.tag}]" > + <#else> + <#assign vTitle = "" > + + <#if planet.relation?has_content> + <#switch planet.relation> + <#case "OWN"> + <#assign lStyle = "class='own-planet'" > + <#break> + <#case "ALLIED"> + <#assign lStyle = "class='allied-planet'" > + <#break> + <#case "ENEMY"> + <#assign lStyle = "class='enemy-planet'" > + <#break> + + <#elseif planet.tag?has_content> + <#assign lStyle = "class='other-planet'" > + <#else> + <#assign lStyle = "" > + + + + + +<#macro render_map size systems tags> + + + <#list systems as row> + + <#list row as system> + <#if system?has_content> + <@render_system system=system tags=tags /> + <#else> + + + + + + +
(inexploré)
+ +<#macro render> +<@page title="Carte"> + + <@lineform action="move-map"> + Coordonnées : ( <@ff_text name="x" id="x" maxLength=4 size=5 value=data.x?string /> ; + <@ff_text name="y" id="y" maxLength=4 size=5 value=data.y?string /> ) + Taille : <@ff_select id="sz" name="sz"> + <#list data.sizes as size> + <@form_option text=size value=size_index selected=( size_index == data.sizeOrdinal ) /> + + + <@ff_submit label="Centrer la carte" /> + + + <@tabs> + <@tab id="names" title="Planètes"> + <@render_map size=data.sizeOrdinal systems=data.systems tags=false /> + + <@tab id="alliances" title="Alliances"> + <@render_map size=data.sizeOrdinal systems=data.systems tags=true /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/message.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/message.ftl new file mode 100644 index 0000000..016c466 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/message.ftl @@ -0,0 +1,115 @@ +<#macro render_navigation message inbox> + <#if inbox> + <#local link="inbox-message-"> + <#else> + <#local link="outbox-message-"> + + + + + + + +
+ <#if message.previous?has_content> + + + << + <#if message.previous?has_content> + + + + <#if inbox> + Messages reçus + <#else> + Messages envoyés + + + <#if message.next?has_content> + + + >> + <#if message.next?has_content> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Messages reçus"> + <#local timeTtl="Reçu le "> +<#else> + <#local title="Messages envoyés"> + <#local timeTtl="Envoyé le "> + +<#switch data.message.type> + <#case 'INTERNAL'> + <#local mColor="#ffffaf"> + <#break> + <#case 'ADMINISTRATOR'> + <#local mColor="#ffafaf"> + <#break> + <#case 'ALLIANCE'> + <#local mColor="#afafff"> + <#break> + <#case 'EMPIRE'> + <#local mColor="#afafaf"> + <#break> + +<@page title=title> + <@render_navigation message=data.message inbox=data.inbox /> + + <@dt_main> + <@dt_entry width=100 title="De "> + <#if data.inbox> + + + ${data.message.sender!} + <#if data.inbox> + + + + <@dt_entry width=100 title="À "> + <#if !data.inbox> + + + ${data.message.receiver!} + <#if !data.inbox> + + + + <@dt_entry width=100 title=timeTtl> + <@abbr_gt />: <@game_time record=data.message.gameTime /> / <@abbr_st />: ${data.message.time?string("yyyy-MM-dd HH:mm:ss")} + + <#if data.message.unread> + <@dt_entry width=100 title="">Nouveau! + + + + <@listview><@lv_line headers=true>  + +

${data.message.title}

+
+ ${data.message.contents} +
+ + <@listview><@lv_line headers=true>  + <@lineform action="message"> + + + <#if data.message.previous?has_content> + <#local afterDelete = data.message.previous> + <#elseif data.message.next?has_content> + <#local afterDelete = data.message.next> + <#else> + <#local afterDelete = "x"> + + + <@ff_submit label="Supprimer le message" name="delete" /> + <#if data.inbox && data.message.type != 'INTERNAL'> + <@ff_submit label="Écrire une réponse" name="reply" /> + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageBox.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageBox.ftl new file mode 100644 index 0000000..1125a86 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageBox.ftl @@ -0,0 +1,124 @@ +<#include "messageTabs.ftl" /> +<#macro render_navigation current total inbox> + <#if inbox> + <#local link="inbox-"> + <#else> + <#local link="outbox-"> + + + + + + + +
+ <#if current gt 0> + + + << + <#if current gt 0> + + + + <#if total gt 0> + Page ${current + 1} / ${total} + <#elseif inbox> + Aucun message reçu. + <#else> + Aucun message envoyé. + + + <#if current lt total - 1> + + + >> + <#if current lt total - 1> + + +
+ +<#macro render> +<#if data.inbox> + <#local title="Messages reçus"> + <#local tab="inbox"> +<#else> + <#local title="Messages envoyés"> + <#local tab="outbox"> + +<@page title=title> + <@messageTabs selected=tab /> + <@render_navigation current=data.cPage total=data.pages inbox=data.inbox /> + <#if data.messages?size gt 0> +
+
+ + +
+ <@listview> + + <@lv_line headers=true> + <@lv_column width=16 centered=true>  + <@lv_column width="x">Sujet + <@lv_column width=150 centered=true><#if data.inbox>De<#else>À + <@lv_column width=150 centered=true><#if data.inbox>Reçu le<#else>Envoyé le + + + <#list data.messages as message> + <#switch message.type> + <#case 'INTERNAL'> + <#local mType="int-msg"> + <#break> + <#case 'ADMINISTRATOR'> + <#local mType="admin-msg"> + <#break> + <#case 'ALLIANCE'> + <#local mType="alliance-msg"> + <#break> + <#case 'EMPIRE'> + <#local mType="empire-msg"> + <#break> + + <#if ! message.read> + <#local mType = "${mType} unread-msg"> + + + <@lv_line class=mType> + <@lv_column centered=true> + + + <@lv_column>${message.title} + <@lv_column centered=true>${message.sender!} + <@lv_column centered=true>${message.time?string("yyyy-MM-dd HH:mm:ss")} + + + + + <#if data.inbox> +
+ <@ff_select name="action" id="action"> + <@form_option value="r">Marquer comme lus + <@form_option value="u">Marquer comme non lus + <@form_option value="d">Supprimer + + + <@ff_select name="target" id="target"> + <@form_option value="0">les messages sélectionnés + <@form_option value="1">tous les messages + + <@ff_submit label="Appliquer" /> +
+ <#else> +
+ + Supprimer + <@ff_select name="target" id="target"> + <@form_option value="0">les messages sélectionnés + <@form_option value="1">tous les messages + + <@ff_submit label="Appliquer" /> +
+ +
+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTabs.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTabs.ftl new file mode 100644 index 0000000..d98b6dc --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTabs.ftl @@ -0,0 +1,11 @@ +<#macro messageTab href title selected=false eClass=""> + ${title} + +<#macro messageTabs selected> +
+ <@messageTab href="messages" title="Reçus" selected=( selected = 'inbox' ) /> + <@messageTab href="outbox" title="Envoyés" selected=( selected = 'outbox' ) /> + <@messageTab href="compose-message" title="Écrire" selected=( selected = 'compose' ) /> + <@messageTab href="chat" title="Disussion" eClass="open-chat-button" /> +
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTargets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTargets.ftl new file mode 100644 index 0000000..7b4508f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageTargets.ftl @@ -0,0 +1,62 @@ +<#include "messageTabs.ftl" /> +<#macro render> +<@page title="Destinataires"> + <@messageTabs selected="compose" /> + + <@tabs> + + <#if data.empires?size gt 0> + <@tab id="empires" title="Empires"> + + <#list data.empires as empire> + <#if empire_index % 3 == 0> + + <#if empire_index % 3 == 2> + + <#if data.empires?size % 3 == 1> + + <#elseif data.empires?size % 3 == 2> + + +
+ <#else> + + + ${empire.name?xhtml}
  
 
+ + + + <#if data.alliances?size gt 0> + <@tab id="alliances" title="Alliances"> + <@listview> + <#list data.alliances as alliance> + <@lv_line> + [${alliance.tag?xhtml}]   + ${alliance.name} + + + + + + + <#if data.admins?size gt 0> + <@tab id="admins" title="Administrateurs"> + <@listview> + <#list data.admins as admin> + <@lv_line> + ${admin.name?xhtml}   + + <#list admin.privileges as priv> + ${priv} + + + +   + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageWriter.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageWriter.ftl new file mode 100644 index 0000000..c72a2bb --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/messageWriter.ftl @@ -0,0 +1,82 @@ +<#include "messageTabs.ftl" /> +<#macro render> +<#if data.replyTo?has_content> + <#local title="Répondre au message"> +<#else> + <#local title="Écrire un nouveau message"> + +<@page title=title> + <@messageTabs selected="compose" /> + +
+
+ <#if data.replyTo?has_content> + + + + + + <#if data.timingError> + <@form_error>Pas si vite ! Attendez quelques secondes avant d'essayer à nouveau. + + + <#-- Message recipient --> + <#if data.targetError> + <@form_error>Destinataire du message non trouvé. + + <@form_select label="Type de destinataire " name="toType"> + <@form_option value="EMPIRE" selected=( data.messageType = 'EMPIRE' )>Empire + <@form_option value="ALLIANCE" selected=( data.messageType = 'ALLIANCE' )>Alliance + <@form_option value="ADMINISTRATOR" selected=( data.messageType = 'ADMINISTRATOR' )>Administrateur + + <@form_text label="Nom du destinataire " name="toName" maxLength=48 value=data.target /> + <#if (data.target == "")> + + + + <#-- Subject --> + <#if data.titleError> + <@form_error>Le sujet est trop court (min.: 2 caractères) + + <@form_text label="Sujet " name="title" maxLength=64 value=data.title /> + + <#-- Body --> + <#if data.contentsError> + <@form_error>Le corps du message est trop court (min.: 2 caractères) + + <@form_text label="Corps du message " name="contents" value=data.contents multiline=true maxLength=10 /> + + <@form_extended_submit label="Envoyer le message"> + <@ff_submit label="Annuler" name="cancel" /> + +
 Sélectionner depuis la liste...
+ +
+
+ + <#-- Original message --> + <#if data.replyTo?has_content> + <@listview><@lv_line headers=true>  + <@dt_main> + <@dt_entry width=100 title="">Message d'origine : + <@dt_entry width=100 title="De "> + ${data.replyTo.sender!} + + <@dt_entry width=100 title="À "> + ${data.replyTo.receiver!} + + <@dt_entry width=100 title="Reçu le "> + <@abbr_gt />: <@game_time record=data.replyTo.gameTime /> / <@abbr_st />: ${data.replyTo.time?string("yyyy-MM-dd HH:mm:ss")} + + + + <@listview><@lv_line headers=true>  + +

${data.replyTo.title}

+
+ ${data.replyTo.contents} +
+ + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/offline.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/offline.ftl new file mode 100644 index 0000000..3f4d4c2 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/offline.ftl @@ -0,0 +1,9 @@ +<#macro render><@page title="Serveur hors ligne"> +

Le serveur du jeu n'a pas pu être contacté.

+

+ Il peut être en cours de maintenance ou il a pu planter. Dans tous les cas, une alerte a été transmise à l'équipe d'administration. +

+

+ Désolés pour les troubles occasionnés. +

+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/overview.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/overview.ftl new file mode 100644 index 0000000..919f8e9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/overview.ftl @@ -0,0 +1,118 @@ +<#macro render> +<@page title="Empire"> + + <#assign ov = data.overview > + <#assign rs = data.research > + + <@tabs> + + <@tab id="overview" title="Résumé"> + <@left_column> + + <#assign nplanets = data.page.planets?size> + <@dt_main title="Flottes & Planètes"> + <@dt_entry title="Nombre de planètes ">${nplanets?string(",##0")} + <@dt_entry title="Population totale ">${ov.population?string(",##0")} + <@dt_entry title="Satisfaction moyenne "><@happiness value=data.overview.avgHappiness /> + <@dt_entry title="Puissance de flotte totale ">${ov.fleetPower?string(",##0")} + + + <@dt_main title="Batailles"> + <#if data.battles?size gt 0> + <@dt_status>Nous sommes impliqués dans les batailles suivantes: + <#list data.battles as battle> + <@dt_status>${battle.location.name?xhtml} + (${battle.x},${battle.y};${battle.orbit}) + + <#else> + <@dt_status>Nous ne sommes impliqués dans aucune bataille. + + <@dt_status> + Toutes les batailles + + + + + + <@right_column> + + <@dt_main title="Finances"> + <@dt_entry title="Réserves financières ">${data.page.cash?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Bénéfice planétaire ">${ov.planetIncome?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Charges planètaires ">${ov.planetUpkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Charges des flottes ">${ov.fleetUpkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Investissements ">${ov.investment?string(",##0")} <@abbr_bgc/> + + + <@dt_main title="Messages"> + <@dt_status> + <#if ov.newMessages == 0> + Aucun nouveau message. + <#elseif ov.newMessages == 1> + Vous avez un nouveau message. + <#else> + Vous avez ${ov.newMessages} nouveaux messages. + + + <@dt_status> + Ecrire message + + + + + + + <@tab id="research" title="Recherche"> + <#if rs?size == 0> +

Nos scientifiques sont encore en train de s'installer.

+ + <#list rs as research> +
+

${research.name?xhtml}

+

${research.description?xhtml}

+ + <@left_column> + <#if research.implemented?size == 0> +

Aucune technologie utilisable.

+ <#else> + <@dt_main> + <#list research.implemented as tech> + <@dt_status> + ${tech.name?xhtml} +
${tech.description?xhtml}
+ + + + + + + <#if research.current?has_content> + <@right_column> + <@dt_main> + <@dt_status> + Recherche actuelle : ${research.current.name?xhtml} +

+ ${research.current.description?xhtml} +

+ + <@dt_entry title="Progression">${research.current.researched}% + <#if research.current.cost?has_content> + <@dt_entry title="Coût">${research.current.cost?string(",##0")} <@abbr_bgc/> + <#if data.page.cash gte research.current.cost && data.page.special! != 'v'> + <@dt_status>
+
<@ff_submit label="Appliquer la technologie" />
+
+ + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/passwordRecovery.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/passwordRecovery.ftl new file mode 100644 index 0000000..4236933 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/passwordRecovery.ftl @@ -0,0 +1,69 @@ +<#macro render> +<@page title="Récupération de mot de passe"> + <@tabs> + + <@tab title="Demande de récupération de mot de passe" id="request-recovery"> + <#if data.sent?has_content> +

Un e-mail vous a été envoyé à votre adresse, ${data.mail?xhtml}

+

Il contient un code d'authetification à usage unique que vous devez utiliser pour changer votre mot de passe.

+

Le code d'authentification va expirer dans une heure, et vous ne pourrez pas demander un autre code jusqu'à ce qu'il ait expiré.

+ <#else> + + <@form name="req-pwd-recovery" action="request-password-recovery"> + <#switch data.status!> + <#case "INVALID_INPUT"> + <@form_error>Adresse e-mail invalide. + <#break> + <#case "ACCOUNT_NOT_FOUND"> + <@form_error>Adresse e-mail inconnue. + <#break> + <#case "ACCOUNT_STATUS"> + <@form_error>L'état du compte ne permet pas la récupération de mot de passe. + <#break> + <#case "RECOVERY_IN_PROGRESS"> + <@form_error>Une demande de récupération de mot de passe a été fait au cours de la dernière heure. + <#break> + <#case "MAIL_ERROR"> + <@form_error>Incapable d'envoyer un e-mail. + <#break> + + <@form_text label="Adresse e-mail" name="mail" id="req-mail" value=data.mail! maxLength=128 /> + <@form_submit label="Demander la récupération de mot de passe" extraClass="" /> + + + + + + <@tab id="confirm-recovery" title="Confirmer la récupération de mot de passe"> + <@form name="conf-pwd-recovery" action="confirm-password-recovery" hash="confirm-recovery"> + <#switch data.cStatus!> + <#case "INVALID_MAIL"> + <@form_error>Adresse e-mail invalide. + <#break> + <#case "NOT_FOUND"> + <@form_error>Code ou adresse e-mail inconnu. + <#break> + <#case "ACCOUNT_STATUS"> + <@form_error>L'état du compte ne permet pas la récupération de mot de passe. + <#break> + <#case "WEAK_PASSWORD"> + <@form_error>Nouveau mot de passe trop faible. + <#break> + <#case "MISMATCH_PASSWORD"> + <@form_error>Le mot de passe et sa confirmation ne sont pas identiques. + <#break> + <#case "PROHIBITED"> + <@form_error>Vous ne pouvez pas utiliser ce mot de passe. + <#break> + + <@form_text label="Adresse e-mail" name="mail" id="conf-mail" value=data.cMail! maxLength=128 /> + <@form_text label="Code de confirmation" name="code" id="conf-code" value=data.cCode! maxLength=64 /> + <@form_pwd label="Nouveau mot de passe" name="password" id="conf-pwd1" /> + <@form_pwd label="Confirmation du nouveau mot de passe" name="passwordConfirm" id="conf-pwd2" /> + <@form_submit label="Définir le nouveau mot de passe" /> + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planet.ftl new file mode 100644 index 0000000..1aed9bf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planet.ftl @@ -0,0 +1,329 @@ +<#macro render> +<#if ! data.basic?has_content> +<@page title="Planète non trouvée"> +

Cette planète n'existe pas.

+ +<#return> + +<@page title="Planète ${data.basic.name}"> + <#if data.ownershipError> + <@standalone_error>Malheureusement, nous ne controllons plus cette planète. + + + <@tabs> + + <@tab id="general" title="Général"> +
+
+ ${data.basic.name?xhtml} +
+ + <@left_column width=250> + <@dt_main> + <@dt_entry title="Coordonnées ">(${data.basic.x},${data.basic.y};${data.basic.orbit}) + <#if data.basic.alliance?has_content> + <@dt_entry title="Alliance ">${data.basic.alliance} + <#else> + <@dt_blank /> + + + <#if data.orbit?has_content> + <@dt_entry title="Population ">${data.orbit.population?string(",##0")} + <@dt_entry title="Défense statique ">${data.orbit.defencePoints?string(",##0")} + + + <#if data.own?has_content> + <@dt_entry title="Satisfaction "><@happiness value=data.own.happiness /> <@happiness_change value=data.own.hChange /> + <@dt_entry title="Bénéfice ">${data.own.income?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Charges ">${data.own.upkeep?string(",##0")} <@abbr_bgc/> + + + + + <@right_column width=250> + <#if data.orbit?has_content> + <@dt_main> + + <#if data.orbit.ownFleet gt 0> + <@dt_entry title="Puissance de flotte propre ">${data.orbit.ownFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.friendlyFleet gt 0> + <@dt_entry title="Puissance de flotte alliée ">${data.orbit.friendlyFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.hostileFleet gt 0> + <@dt_entry title="Puissance de flotte hostile">${data.orbit.hostileFleet?string(",##0")} + <#else> + <@dt_blank /> + + + <#if data.orbit.battle?has_content> + <@dt_entry title="">Voir la bataille + <#else> + <@dt_blank /> + + + <@dt_blank /><@dt_blank /><@dt_blank /><@dt_blank /><@dt_blank /> + + + + +
+ + <#if data.own?has_content> + <#if data.own.status.renamePossible && data.page.special! != 'v'> + <#switch data.renameError!> + <#case "EMPTY"><@standalone_error>Veuillez spécifier un nom.<#break> + <#case "INVALID"><@standalone_error>Nom de planète invalide.<#break> + <#case "UNAVAILABLE"><@standalone_error>Ce nom de planète existe déjà.<#break> + <#case "BANNED"><@standalone_error>Ce nom a été banni.<#break> + + <@lineform action="planet-${data.id}-rename" name="rename" hash="general"> + <#if data.renamingTo?has_content> + <#assign newName = data.renamingTo!> + + Renommer la planète en <@ff_text name="name" id="rename-name" maxLength=20 size=21 value=newName! /> + <@ff_submit label="Renommer la planète" /> + + + + <#if data.own.status.abandonPossible && data.page.special! != 'v'> + <@lineform action="planet-${data.id}-abandon" name="abandon" hash="general"> + <@ff_submit label="Abandonner la planète" /> + + <#elseif data.own.status.abandonTime gt 0> + <@lineform action="planet-${data.id}-cancel-abandon" name="abandon" hash="general"> + Abandon de la planète dans <@duration rTime=data.own.status.abandonTime gTime=data.own.status.abandonGameTime /> +   + <#if data.page.special! != 'v'> + <@ff_submit label="Annuler" /> + + + + + + + + <#if data.orbit?has_content> + + <#if data.orbit.buildings?size gt 0 || data.own?has_content> + <@tab id="buildings" title="Bâtiments"> + + <#if data.orbit.buildings?size gt 0> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Bâtiment + <@lv_column width=50 centered=true>Nombre + <#if data.own?has_content> + <@lv_column width=150 centered=true>Production + <@lv_column width=50 centered=true>Emplois + <@lv_column width=100 centered=true>Charges + + + + <#list data.orbit.buildings as building> + <@lv_line> + <@lv_column> + ${building.name?xhtml} + <#if data.own?has_content> +
${building.description?xhtml}
+ + + <@lv_column centered=true>${building.amount?string(",##0")} + <#if data.own?has_content> + <@lv_column centered=true> + ${building.output?string(",##0")} + <#switch building.produces> + <#case "CASH">production ind.<#break> + <#case "DEF">défense<#break> + <#case "WORK">production mil.<#break> + <#case "POP">croissance<#break> + + + <@lv_column centered=true>${building.jobs?string(",##0")} + <@lv_column centered=true>${building.upkeep?string(",##0")} <@abbr_bgc/> + + + + + <#else> + <@dt_main><@dt_status>Aucun bâtiment sur cette planète. + + + <#if data.own?has_content> + <#if data.page.special! != 'v'> + <#if data.own.civQueue.appendPossible> + <@lineform name="build-civ" action="planet-${data.id}-build-civ" hash="buildings"> + Construire <@ff_text name="amount" id="civ-build-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="civ-build-type"> + <@form_option value="0" text="(type de bâtiment)" /> + <#list data.own.bBuildings as building> + <@form_option value=building.id text=building.name /> + + + <@ff_submit label="Ajouter à la liste" /> + +
+ <#list data.own.bBuildings as building> +
+ <@dt_main> + <@dt_status>${building.description?xhtml} + <@dt_entry title="Coût ">${building.cost?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Charges ">${building.upkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Temps de construction "> + <#if building.time?has_content> + <@duration rTime=building.time gTime=building.gameTime /> + <#else> + N/A + + + <@dt_entry title="Emplois ">${building.workers?string(",##0")} + <@dt_entry title="Production ">${building.output?string(",##0")} + <#switch building.prodType> + <#case "CASH">production ind.<#break> + <#case "DEF">défense<#break> + <#case "WORK">production mil.<#break> + <#case "POP">croissance<#break> + + + +
+ +
+ + <#if data.orbit.buildings?size gt 0> + <#if data.destructionFailed!false> + <@standalone_error>Tentative de destruction d'un trop grand nombre de bâtiments + + <@lineform name="destroy" action="planet-${data.id}-destroy" hash="buildings"> + Détruire <@ff_text name="amount" id="civ-destroy-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="civ-destroy-type"> + <@form_option value="0" text="(type de bâtiment)" /> + <#list data.orbit.buildings as building> + <@form_option value=building.id text=building.name /> + + + <@ff_submit label="Ajouter à la liste" /> + + + + + + <#if data.own.civQueue.items?size gt 0> + <#if data.page.special! != 'v'> + <@lineform name="flush-civ-queue" action="planet-${data.id}-flush-civ" hash="buildings"> + Retirer tous les éléments de la liste de construction (les investissements seront perdus) + <@ff_submit label="Vider" /> + + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Nombre + <@lv_column width="x">Nature + <@lv_column width=200 centered=true>Temps + <@lv_column width=70 centered=true>Investissement + + <#list data.own.civQueue.items as qItem> + <@lv_line> + <@lv_column centered=true>${qItem.amount?string(",##0")} + <@lv_column>${qItem.name} <#if qItem.destroy>(destruction)<#else>(construction) + <@lv_column centered=true> + <#if qItem.timeLeft?has_content> + <@duration rTime=qItem.timeLeft gTime=qItem.gameTimeLeft /> + <#else> + N/A + + + <@lv_column centered=true>${qItem.invested?string(",##0")} <@abbr_bgc/> + + + + + + + + + + <#if data.own?has_content> + <@tab id="ships" title="Chantiers navals"> + <#if data.page.special! != 'v'> + <#if data.own.milQueue.appendPossible> + <@lineform name="build-mil" action="planet-${data.id}-build-mil" hash="ships"> + Construire <@ff_text name="amount" id="mil-build-amount" size=5 maxLength=4 value="" /> + <@ff_select name="type" id="mil-build-type"> + <@form_option value="0" text="(type de vaisseau)" /> + <#list data.own.bShips as ship> + <@form_option value=ship.id text=ship.name /> + + + <@ff_submit label="Ajouter à la liste" /> + +
+ <#list data.own.bShips as ship> +
+ <@dt_main> + <@dt_status>${ship.description?xhtml} + <@dt_entry title="Coût ">${ship.cost?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Charges ">${ship.upkeep?string(",##0")} <@abbr_bgc/> + <@dt_entry title="Temps de Construction "> + <#if ship.time?has_content> + <@duration rTime=ship.time gTime=ship.gameTime /> + <#else> + N/A + + + <@dt_entry title="Puissance ">${ship.power?string(",##0")} + <@dt_entry abbr="TVOO " title="Temps de vol orbite-à-orbite"> + <@duration rTime=ship.flightTime gTime=ship.gameFlightTime /> + + +
+ +
+ + + + <#if data.own.milQueue.items?size gt 0> + <#if data.page.special! != 'v'> + <@lineform name="flush-mil-queue" action="planet-${data.id}-flush-mil" hash="ships"> + Retirer tous les éléments de la liste de construction (les investissements seront perdus) + <@ff_submit label="Vider" /> + + + + <@listview> + <@lv_line headers=true> + <@lv_column width=80 centered=true>Nombre + <@lv_column width="x">Vaisseau + <@lv_column width=200 centered=true>Temps + <@lv_column width=70 centered=true>Investissement + + <#list data.own.milQueue.items as qItem> + <@lv_line> + <@lv_column centered=true>${qItem.amount?string(",##0")} + <@lv_column>${qItem.name} + <@lv_column centered=true> + <#if qItem.timeLeft?has_content> + <@duration rTime=qItem.timeLeft gTime=qItem.gameTimeLeft /> + <#else> + N/A + + + <@lv_column centered=true>${qItem.invested?string(",##0")} <@abbr_bgc/> + + + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planets.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planets.ftl new file mode 100644 index 0000000..e8fb997 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/planets.ftl @@ -0,0 +1,167 @@ +<#macro render> +<@page title="Planètes"> + <#assign pl = data.planets> + <#if pl?size == 0> +

Nous ne possédons plus aucune planète.

+

Obtenir une nouvelle planète ?

+ <#else> + + <@tabs> + + <@tab id="general" title="Général"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=90 centered=true>Coordonnées + <@lv_column width=90 centered=true>Satisfaction + <@lv_column width=90 right=true>Population + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true>(${planet.x},${planet.y};${planet.orbit}) + <@lv_column centered=true><@happiness value=planet.happiness /> + <@lv_column right=true>${planet.population?string(",##0")} + + + + + + <@tab id="eco" title="Économie"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=110 right=true>Bénéfice + <@lv_column width=110 right=true>Charges + <@lv_column width=110 right=true>Revenu + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column right=true>${planet.income?string(",##0")} <@abbr_bgc /> + <@lv_column right=true>${planet.upkeep?string(",##0")} <@abbr_bgc /> + <@lv_column right=true> + <#if planet.upkeep gt planet.income> + + + ${( planet.income - planet.upkeep )?string(",##0")} <@abbr_bgc /> + <#if planet.upkeep gt planet.income> + + + + + + + + + <@tab id="prod" title="Production"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=90 right=true>Militaire + <@lv_column width=90 right=true>Industriel + <@lv_column width=120 right=true>Aug. Croissance + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column right=true>${planet.militaryProduction?string(",##0")} + <@lv_column right=true>${planet.industrialProduction?string(",##0")} + <@lv_column right=true>${planet.growthProduction?string(",##0")} + + + + + + <@tab id="cons" title="Construction"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=200 centered=true>Item actuellement produit + <@lv_column width=90 right=true>Investissement + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true> + <#if planet.civAmount = 0> + N/A + <#else> + ${planet.civAmount?string(",##0")}x + ${planet.civName?xhtml} + <#if planet.civDestroy> + (destruction) + <#else> + (construction) + + + + <@lv_column right=true>${planet.civInvestment?string(",##0")} <@abbr_bgc /> + + + + + + <@tab id="ships" title="Chantiers navals"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=200 centered=true>Item actuellement produit + <@lv_column width=90 right=true>Investissement + + + <#list pl as planet> + <@lv_line> + <@lv_column>${planet.name?xhtml} + <@lv_column centered=true> + <#if planet.milAmount = 0> + N/A + <#else> + ${planet.milAmount?string(",##0")}x + ${planet.milName?xhtml} + + + <@lv_column right=true>${planet.milInvestment?string(",##0")} <@abbr_bgc /> + + + + + + <@tab id="mil" title="Militaire"> + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Nom + <@lv_column width=90 right=true>Stationnaire + <@lv_column width=110 right=true>Flottes propres + <@lv_column width=90 right=true>Alliées + <@lv_column width=90 right=true>Hostiles + + + <#list pl as planet> + <@lv_line> + <@lv_column> + <#if planet.battle?has_content> + + + ${planet.name?xhtml} + <#if planet.battle?has_content> + + + + <@lv_column right=true>${planet.fpStatic?string(",##0")} + <@lv_column right=true>${planet.fpOwn?string(",##0")} + <@lv_column right=true>${planet.fpFriendly?string(",##0")} + <@lv_column right=true>${planet.fpHostile?string(",##0")} + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/reactivation.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/reactivation.ftl new file mode 100644 index 0000000..db56988 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/reactivation.ftl @@ -0,0 +1,24 @@ +<#macro render> +<#if data.success> +<@page title="réactivation de compte"> +

+ Votre compte a été réactivé avec succès. Le conde de confirmation a été envoyé à ${data.address}. +

+

+ Une fois que vous avez reçu cet e-mail, veuillez aller sur la page de confirmation. +

+ +<#else> +<@page title="Erreur de réactivation de compte"> +

+ Une erreur a eu lieu lors de l'envoi d'un e-mail à votre adresse, ${data.address}. +

+

+ Si votre adresse est toujours valide, vous pouvez envisager d'attendre un peu et d'essayer à nouveau. +

+

+ Ou le serveur est peut-être sous acide, auquel cas vous devriez informer l'équipe d'administration. +

+ + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/register.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/register.ftl new file mode 100644 index 0000000..32a4c93 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/register.ftl @@ -0,0 +1,56 @@ +<#macro render> +<@page title="Enregistrement"> + <@form name="register" action="register"> + <#switch data.mailError!""> + <#case "EMPTY"> + <@form_error>Adresse e-mail vide. + <#break> + <#case "INVALID"> + <@form_error>Adresse e-mail invalide. + <#break> + <#case "IN_USE"> + <@form_error>Cette adresse e-mail est déjà associée à un compte. + <#break> + <#case "SEND_FAIL"> + <@form_error>Impossible d'envoyer le code de confirmation à cette adresse. + <#break> + <#case "MISMATCH"> + <@form_error>L'adresse e-mail et sa confirmation ne sont pas identiques. + <#break> + <#default> + <@form_extra>L'adresse e-mail DOIT exister. + + <@form_text label="Adresse e-mail" maxLength=128 name="mail" value=data.mail! /> + <@form_text label="Adresse e-mail (confirmation)" maxLength=128 name="mailConfirm" value=data.mail! /> + + <#switch data.passwordError!""> + <#case "EMPTY"> + <@form_error>Mot de passe vide. + <#break> + <#case "TOO_WEAK"> + <@form_error>Cet mot de passe est trop faible. + <#break> + <#case "MISMATCH"> + <@form_error>Le mot de passe et sa confirmation ne sont pas identiques. + <#break> + <#default> + <@form_extra>Au moins 6 catactères, contenant à la fois des lettres et des chiffres. Points bonus pour les caractères spéciaux, les espaces et les mots de passe extrèmement longs. + + <@form_pwd label="Mot de passe" name="password" /> + <@form_pwd label="Mot de passe (confirmation)" name="passwordConfirm" /> + + <@form_select name="language" label="Langue"> + <#if dataType == "ListLanguagesResponse"> + <#assign lList = data.languages> + <#else> + <#assign lList = data.supportedLanguages.languages> + + <#list lList as lang> + <@form_option text=lang.name value=lang.id selected=(lang.id == language) /> + + + + <@form_submit label="S'enregistrer" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/registered.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/registered.ftl new file mode 100644 index 0000000..456884a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/registered.ftl @@ -0,0 +1,13 @@ +<#macro render> +<@page title="Compte créé"> +

+ Votre compte a été créé avec succès. +

+

+ Un e-mail contenant son code de confirmation a été envoyé à votre adresse, ${data.mail?xhtml}. +

+

+ Une fois que vous l'aurez reçu, vous serez en mesure de vous connecter et de confirmer votre compte. +

+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/splitFleet.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/splitFleet.ftl new file mode 100644 index 0000000..d213195 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/splitFleet.ftl @@ -0,0 +1,40 @@ +<#macro render> +<@page title="Diviser la flotte"> +
+
+ + <#if data.shipsError> + <@standalone_error>Nombre de vaisseaux ou de flottes résultantes invalides + + <@listview> + <@lv_line headers=true> + <@lv_column width="x">Type de vaisseaux + <@lv_column width=150>Nombre initial + <@lv_column width=150>Nombre dans la nouvelle flotte + + <#list data.ships as ships> + <@lv_line headers> + <@lv_column>${ships.name} + <@lv_column>${ships.amount?string(",##0")} + <@lv_column> + <@ff_text name="ships_${ships.id}" id="ships-${ships.id}" value=ships.selectedAmount /> + + + + + <#if data.nameError> + <@standalone_error>Nom de flotte invalide. + +

+ Créer + <@ff_text name="nFleets" id="n-fleets" value=data.nFleets size=3 maxLength=2 /> + nouvelle(s) flotte(s) nommée(s) + <@ff_text name="name" id="name" value=data.name size=20 maxLength=40 /> +   + <@ff_submit label="Ok" /> + <@ff_submit label="Annuler" name="cancel" /> +

+
+
+ + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/static.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/static.ftl new file mode 100644 index 0000000..cbf01c8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/static.ftl @@ -0,0 +1 @@ +<#macro render><#if dataType == "HashMap"><#include "../static/${data.name}.ftl" /><#else><#include "../static/${data}.ftl" /> \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/validation.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/validation.ftl new file mode 100644 index 0000000..683d0f4 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/fr/types/validation.ftl @@ -0,0 +1,50 @@ +<#macro render> +<@page title="Validation de compte"> + <@form action="validation" name="validation"> + <@form_extra> + Avant d'aller plus loin, vous devez valider votre compte en utilisant le code de confirmation qui vous a été envoyé par e-mail.
+ Vous pouvez aussi choisir le nom de votre empire et de votre première planète. + + + <#if data.wrongToken> + <@form_error>Code ds confirmation incorrect. + + <@form_text label="Code de confirmation" value=data.token! name="token" maxLength=64 /> + + <#switch data.empireError!> + <#case "EMPTY"><@form_error>Veuillez choisir un nom d'empire.<#break> + <#case "INVALID"><@form_error>Nom d'empire invalide.<#break> + <#case "UNAVAILABLE"><@form_error>Ce nom d'empire n'est pas disponible.<#break> + <#case "BANNED"><@form_error>Ce nom d'empire a été banni.<#break> + + + <#if data.previousEmpires?size == 0> + <@form_text label="Nom d'empire" value=data.empire! name="empire" maxLength=20 /> + + <#else> + <@form_select name="old" label="Réutiliser un nom d'empire"> + <#list data.previousEmpires as oldName> + <@form_option text=oldName selected=( oldName == data.empire! ) /> + + + + <@form_extra>Laissez ce champ vide si vous voulez réutiliser un ancien nom d'empire. + <#if ! data.previousEmpires?seq_contains(data.empire!)> + <#assign empValue = data.empire!> + + <@form_text name="empire" label="Nouveau nom d'empire" value=empValue! maxLength=20 /> + + + + <#switch data.planetError!> + <#case "EMPTY"><@form_error>Veuillez choisir un nom de planète.<#break> + <#case "INVALID"><@form_error>Nom de planète invalide.<#break> + <#case "UNAVAILABLE"><@form_error>Ce nom de planète n'est pas disponible.<#break> + <#case "BANNED"><@form_error>Ce nom de planète a été banni.<#break> + + <@form_text name="planet" label="Nom de planète" value=data.planet! maxLength=20 /> + + <@form_submit label="Entrer dans le jeu" /> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/columns.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/columns.ftl new file mode 100644 index 0000000..6d79301 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/columns.ftl @@ -0,0 +1,18 @@ +<#macro left_column width=0> + <#if width gt 0> +
+ <#else> +
+ + <#nested> +
+ +<#macro right_column width=0> + <#if width gt 0> +
+ <#else> +
+ + <#nested> +
+ diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/datatable.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/datatable.ftl new file mode 100644 index 0000000..e02f8e8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/datatable.ftl @@ -0,0 +1,20 @@ +<#macro dt_main title=""> + + <#if title != ""> + + + <#nested> +
${title}
+ +<#macro dt_entry title abbr="" width=0> + + style="width: ${width}px"><#if title == ""> <#else><#if abbr != "">${abbr?xhtml}<#else>${title?xhtml}: + <#nested> + + +<#macro dt_blank> +   + +<#macro dt_status> + <#nested> + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/fields.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/fields.ftl new file mode 100644 index 0000000..63dcdcd --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/fields.ftl @@ -0,0 +1,20 @@ +<#macro ff_text name value id="" maxLength=0 size=0> + maxlength="${maxLength?string}" <#if size gt 0>size="${size?string}" /> + +<#macro ff_pwd id name> + + +<#macro ff_select id name style=""> + + +<#macro ff_checkbox id name value checked=false> + checked="checked" /> + +<#macro form_option text="" selected=false value=""> + value="${value?xhtml}"<#if selected> selected="selected"><#if text == ""><#nested><#else>${text?xhtml} + +<#macro ff_submit label extraClass="" name="" style=""> + name="${name?xhtml}" type="submit" value="${label?xhtml}" <#if style != "">style="${style}" /> + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/form.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/form.ftl new file mode 100644 index 0000000..4544473 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/form.ftl @@ -0,0 +1,98 @@ +<#macro form action name="" hash=""> +
+
#${hash?url}" method="post"> + + <#nested> +
+
+
+ +<#macro form_field_line label id> + + + <#nested> + + +<#macro form_text label name value id="" maxLength=0 multiline=false> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <#if multiline> + + <#else> + <@ff_text id=id name=name maxLength=maxLenth value=value /> + + + +<#macro form_checkbox label name value id="" checked=false> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_checkbox id=id name=name value=value checked=checked /> + + +<#macro form_pwd label name id=""> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_pwd id=id name=name /> + + +<#macro form_select label name id=""> + <#if id = ""> + <#local id = name> + + <@form_field_line label=label id=id> + <@ff_select id=id name=name> + <#nested> + + + +<#macro form_part title> + + ${title} + + +<#macro form_extra> + + <#nested> + + +<#macro form_error> + + <#nested> + + +<#macro standalone_error> +
+ + + + +
<#nested>
+
+ +<#macro form_submit label extraClass=""> + +   + <@ff_submit label=label extraClass=extraClass /> + + +<#macro form_extended_submit label extraClass=""> + +   + <@ff_submit label=label extraClass=extraClass /><#nested /> + + +<#macro lineform action name="" hash=""> +
+
#${hash?url}" method="post"> + + +
<#nested>
+
+
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/happiness.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/happiness.ftl new file mode 100644 index 0000000..ada6ca6 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/happiness.ftl @@ -0,0 +1,20 @@ +<#macro happiness value> + <#if value lt 26> + <#assign colour = "#ffafaf"> + <#elseif value lt 51> + <#assign colour = "#ffffaf"> + <#elseif value lt 76> + <#assign colour = "#afafff"> + <#else> + <#assign colour = "#afffaf"> + + ${value}% + +<#macro happiness_change value> + <#switch data.own.hChange> + <#case -2>--<#break> + <#case -1>-<#break> + <#case 1>+<#break> + <#case 2>++<#break> + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/lists.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/lists.ftl new file mode 100644 index 0000000..798342a --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/lists.ftl @@ -0,0 +1,25 @@ +<#macro listview> + + <#nested> +
+ +<#macro lv_line headers=false class=""> + class="${class}<#if headers>headers"<#elseif headers> class="headers"> + <#nested> + + +<#macro lv_column width=0 centered=false right=false> + <#if width?is_string> + + <#nested> + + <#elseif width gt 0> + + <#nested> + + <#else> + + <#nested> + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/tabs.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/tabs.ftl new file mode 100644 index 0000000..b1ab861 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/layout/tabs.ftl @@ -0,0 +1,13 @@ +<#macro tabs> +
+ <#nested> +
+ +<#macro tab id title> +
+

${title?xhtml}

+
+ <#nested> +
+
+ \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/version.ftl b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/version.ftl new file mode 100644 index 0000000..c9406cf --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/fm/version.ftl @@ -0,0 +1,2 @@ +<#macro version>Milestone 1 +<#macro full_version>Beta 6 milestone 1 (5.99.1) \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/main-servlet.xml b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/main-servlet.xml new file mode 100644 index 0000000..25ea52b --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/main-servlet.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/web.xml b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000..19183e1 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/WEB-INF/web.xml @@ -0,0 +1,83 @@ + + + + legacyworlds-web-main + + + charsetFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + 1 + + + + + charsetFilter + /* + + + + main + org.springframework.web.servlet.DispatcherServlet + 1 + + + + pass-through + org.apache.catalina.servlets.DefaultServlet + 1 + + + + pass-through + *.js + + + + pass-through + *.css + + + + pass-through + *.jpg + + + + pass-through + *.png + + + + pass-through + *.gif + + + pass-through + *.cab + + + pass-through + *.jar + + + pass-through + *.lng + + + pass-through + *.class + + + + main + / + + + diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/css/main.css b/legacyworlds-web/legacyworlds-web-main/WebContent/css/main.css new file mode 100644 index 0000000..48ff3b4 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/css/main.css @@ -0,0 +1,842 @@ +/* General appearance */ +* { + font-family: Arial, sans-serif; + font-size: 10pt; + padding: 0px; + margin: 0px; + color: white; + scrollbar-face-color: #1f1f1f; + scrollbar-highlight-color: #1f1f1f; + scrollbar-3dlight-color: #3f3f3f; + scrollbar-darkshadow-color: #3f3f3f; + scrollbar-shadow-color: #1f1f1f; + scrollbar-arrow-color: #afafaf; + scrollbar-track-color: #1f1f1f; +} + +h1 { + font-size: 16pt +} + +h2 { + font-size: 14pt +} + +h3 { + font-size: 12pt +} + +h4 { + font-size: 11pt +} + +h5 { + font-size: 11pt +} + +h6 { + font-size: 10pt +} + +body { + background-color: #000; + color: #888; + overflow: auto; +} + +/* Page layout */ +#extframe { + position: absolute; + top: 50%; + left: 0px; + width: 100%; + height: 1px +} + +.internal { + margin-left: -475px; + position: absolute; + left: 50%; + width: 950px; +} + +#intframe { + top: -280px; + height: 560px; + background-image: url(../img/background.jpg); + background-repeat: no-repeat; +} + +/* Footer (DCD link) */ +#footer { + top: 280px; + text-align: center; + font-size: 8pt; + font-style: italic; + padding: 2px 0 0 0; +} + +#footer a,#footer a:visited { + font-size: 8pt; + text-decoration: none; + color: white; +} + +#footer a:hover { + text-decoration: underline; +} + +/* "Home" button */ +#hbutton { + display: block; + position: absolute; + top: 12px; + left: 10px; + width: 272px; + height: 90px; + background-color: transparent; +} + +#hbutton span { + display: none; +} + +/* Current version text */ +#version { + position: absolute; + top: 89px; + left: 299px; + width: 640px; + height: 22px; + font-size: 10pt; + text-align: center; + font-style: italic; + font-weight: bold; +} + +/* Log-in/player info box */ +#lbox { + position: absolute; + top: 9px; + left: 699px; + width: 230px; + height: 60px; + text-align: right; + font-size: 10pt; +} + +#lbox a { + color: white; + text-decoration: none; + font-style: italic; +} + +#lbox a:hover { + text-decoration: underline; +} + +/* Menu and buttons */ +a.mbutton { + display: block; + position: absolute; + height: 21px; + width: 250px; + left: 14px; + padding: 18px 0px; + background-repeat: no-repeat; + border-style: none; + border-width: 0px; + font-weight: bold; + text-align: center; + text-decoration: none; + color: #ddd; + background-position: 0px 0px; + font-size: 12pt; +} + +a.mbutton:hover { + color: white; + background-position: 0px -57px; +} + +a#b0 { + top: 136px; + background-image: url(../img/button-0.png); +} + +a#b1 { + top: 193px; + background-image: url(../img/button-1.png); +} + +a#b2 { + top: 250px; + background-image: url(../img/button-2.png); +} + +a#b3 { + top: 307px; + background-image: url(../img/button-3.png); +} + +a#b4 { + top: 364px; + background-image: url(../img/button-4.png); +} + +a#b5 { + top: 421px; + background-image: url(../img/button-5.png); +} + +a#b6 { + top: 478px; + background-image: url(../img/button-6.png); +} + +/* Content frame */ +.cframe { + position: absolute; + left: 299px; + top: 117px; + width: 637px; + height: 426px; + overflow: auto; + background-color: transparent; + color: white; +} + +.cframe.full-width { + left: 15px; + width: 921px; +} + +.cframe.offline { + height: 279px; + top: 264px; + overflow: hidden; +} + +.cframe p { + color: #CCCCCC; +} + +.cframe ul,.cframe ol { + margin: 0px 0px 0px 20px; + padding: 0px 0px 0px 10px; +} + +.cframe li { + margin: 0px 0px 0px 20px; + padding: 0px 0px 0px 0px; +} + +/* Text in the content frame */ +.cframe ul { + list-style-type: square; +} + +.cframe li { + font-size: 10pt; +} + +.cframe li:first-letter { + font-size: 11pt; + font-weight: bold; +} + +.cframe p { + margin: 5px 10px 5px 30px; + text-align: justify; + text-indent: 10px; + font-size: 10pt; +} + +.cframe p:first-letter { + font-size: 11pt; + font-weight: bold; +} + +/* Tabs */ +.tab-buttons { + width: 100%; + text-align: center; + margin: 0 0 5px 0; + padding: 5px 0 0 0; + height: 20px; +} + +a.tab-button { + padding: 4px; + margin: 1px 0 0 5px; + background-color: #3f3f3f; + border: 1px solid #7f7f7f; + text-decoration: none; + font-style: normal; +} + +a.tab-button:hover { + background-color: #4f4f4f; + border-color: #8f8f8f; +} + +a.tab-button.selected-tab,a.tab-button.selected-tab:hover { + background-color: #7f7f7f; + border-color: white; +} + +/* Top/centered layer (title, planet links) */ +div.top-centered { + position: absolute; + left: 330px; + width: 320px; + top: 10px; + height: 50px; + text-align: center; +} + +#tc-title { + font-weight: bold; + font-size: 13pt; + text-align: center; +} + +div#tc-title { + top: 30px; + height: 30px; +} + +span.special-info { + color: red; + font-weight: bold; +} + +/* Forms */ +.form-container { + width: 509px; + margin: 0 64px; +} + +.full-width .form-container { + width: 793px; + margin: 0 64px; +} + +.form-container table { + width: 509px; + table-layout: fixed; +} + +.full-width .form-container table { + width: 793px; +} + +.form-field th,.form-submit th { + text-align: right; + vertical-align: middle; + height: 16px; + width: 200px; + padding: 4px; + font-weight: normal; +} + +.form-field td { + padding: 1px 2px 1px 0px; +} + +.form-submit td { + padding: 10px 0px 30px 0px; +} + +.form-part th { + padding: 30px 0 0 0; +} + +.form-submit .input { + padding: 5px 20px; +} + +.form-submit .input:hover { + padding: 5px 20px; + border-color: #dfdfdf; + background-color: #7f7f7f; +} + +.form-extra td { + padding: 4px 0px 0px 100px; + text-align: justify; +} + +.form-field .input { + width: 100%; + height: 20px; +} + +.form-error td { + font-size: 11pt; + color: white; + background-color: red; + font-weight: bold; + margin: 2px 0px; + padding: 5px; +} + +.input { + border-style: solid; + border-width: 1px; + border-color: #afafaf; + background-color: #3f3f3f; + color: white; + font-size: 10pt; + margin: 1px 0px +} + +/* Data display */ +.data-table { + width: 100%; + margin: 0 0 10px 0; +} + +.data-table th { + text-align: right; + padding: 2px 10px 2px 0px; + font-weight: normal; + color: #cccccc; + width: 50%; +} + +.data-table th.title { + text-align: center; + padding: 0px 0px 5px 0px; + font-weight: bold; + font-size: 12pt; + color: white; +} + +.data-table td.status { + text-align: center; + color: #cccccc; +} + +/* List display */ +.list-view { + width: 573px; + margin: 0 32px 20px 32px; + border-collapse: collapse; +} + +.list-view th,.list-view td { + padding: 0; + margin: 0; + vertical-align: top; +} + +.list-view .headers th { + border-style: solid; + border-color: white; + border-width: 0 0 1px 0; +} + +.list-view td { + color: #cccccc; +} + +/* Column layout */ +.column { + width: 310px +} + +.left-column { + float: left +} + +.right-column { + padding: 0 0 0 310px; +} + +/* Misc */ +div.auto-hide { + padding: 2px 0px 5px 20px; +} + +/* Map */ +table.map { + border: 1px solid white; + border-collapse: collapse +} + +.map td { + border: 1px solid white; + vertical-align: top +} + +.map img { + display: block; + float: left; + border: 0; + padding: 0; + margin: 0; + border: 0 +} + +.map a { + display: block; + text-decoration: none +} + +.map a.own-planet { + color: #afffaf; +} + +.map a.allied-planet { + color: #afafff; +} + +.map a.other-planet { + color: #ffffaf; +} + +.map a.enemy-planet { + color: #ffafaf; +} + +.map-empty div { + text-align: center; + font-style: italic +} + +div.map-invert { + cursor: pointer; +} + +.map div.map-invert a,.map div.map-invert a.own-planet,.map div.map-invert a.allied-planet,.map div.map-invert a.other-planet + { + color: black +} + +div.map-bg-none { + background-color: #cccccc +} + +div.map-bg-allied { + background-color: #afafff +} + +div.map-bg-own { + background-color: #afffaf +} + +div.map-bg-other { + background-color: #ffffaf +} + +div.map-bg-enemy { + background-color: #ffafaf +} + +/* Map - 3x3 */ +.map-0 { + width: 540px; + height: 540px; + margin: 0 49px 0 48px; +} + +.map-0 * { + font-size: 9pt +} + +.map-0 tr { + height: 180px +} + +.map-0 td { + width: 180px +} + +.map-0 div.map-planet { + height: 36px; + width: 100% +} + +.map-0 img { + height: 36px; + width: 36px +} + +.map-0 a { + padding: 10px 0 0 41px +} + +.map-0 .map-empty div { + padding: 82px 0 0 0; +} + +/* Map - 5x5 */ +.map-1 { + width: 600px; + height: 600px; + margin: 0 19px 0 18px; +} + +.map-1 * { + font-size: 6pt +} + +.map-1 tr { + height: 120px +} + +.map-1 td { + width: 120px +} + +.map-1 div.map-planet { + height: 24px; + width: 100% +} + +.map-1 img { + height: 24px; + width: 24px +} + +.map-1 a { + padding: 7px 0 0 27px +} + +.map-1 .map-empty div { + padding: 54px 0 0 0; +} + +/* Map - 7x7 */ +.map-2 { + width: 595px; + height: 595px; + margin: 0 22px 0 22px; +} + +.map-2 * { + font-size: 4pt +} + +.map-2 tr { + height: 85px +} + +.map-2 td { + width: 85px +} + +.map-2 div.map-planet { + height: 17px; + width: 100% +} + +.map-2 img { + height: 17px; + width: 17px +} + +.map-2 a { + padding: 5px 0 0 19px +} + +.map-2 .map-empty div { + padding: 37px 0 0 0; +} + +/* Fleets */ +table.fleets-planet,table.fleets-moving { + border: 1px solid white; + border-collapse: collapse; + margin: 0 0 20px 5px; + width: 610px; +} + +table.selected-fleets { + border: 1px solid white; + border-collapse: collapse; + margin: 10px 0 20px 15px; + width: 600px; +} + +table.fleets-planet td { + border: 1px solid white; +} + +table.fleets-planet td.pic { + width: 32px; + height: 32px; +} + +table.fleets-planet td.planet-data { + width: 150px; + text-align: center; +} + +table.fleets-planet th.planet-name { + text-align: left; + font-weight: normal; + padding: 0 0 0 5px; +} + +table.fleets-planet p { + padding: 8px 0px; + margin: 0; + text-align: center; +} + +table.fleets-list { + width: 100%; + padding: 0; + margin: 0; + border-style: none; + border-collapse: collapse; +} + +table.fleets-list td,table.selected-fleets td { + border-style: none; + vertical-align: top; + padding: 2px 0px; +} + +table.fleets-moving th.mv-header { + border-style: solid; + border-width: 0px 0px 1px 0px; + border-color: white; + height: 32px; +} + +table.fleets-list th,table.selected-fleets th { + font-weight: bold; + border-style: solid; + border-width: 0px 0px 1px 0px; + border-color: white; +} + +table.fleets-list table.data-table th { + text-align: right; + padding: 2px 10px 2px 0px; + font-weight: normal; + color: #cccccc; + width: 40%; + border-style: none; +} + +table.fleets-list .selector,table.selected-fleets .selector { + width: 20px; + text-align: center; +} + +table.fleets-list .name,table.selected-fleets .name { + text-align: left; +} + +table.fleets-list .owner { + text-align: left; + width: 120px; +} + +table.fleets-list .mode { + text-align: center; + width: 20px; +} + +table.fleets-list .power,table.selected-fleets .power { + text-align: right; + width: 80px; +} + +table.fleets-list .fltime,table.selected-fleets .fltime { + text-align: right; + width: 80px; +} + +table.fleets-list .status { + text-align: center; + width: 80px; +} + +table.fleets-moving .timeleft { + text-align: right; + width: 160px; +} + +table.fleets-moving .destination { + text-align: right; + width: 160px; +} + +table.selected-fleets .status { + text-align: center; + width: 60px; +} + +table.selected-fleets .cloc { + text-align: left; + width: 190px; +} + +.list-view .own-fleet,.list-view .own-fleet *,.own-fleet,.own-fleet * { + color: #afffaf; +} + +.list-view .allied-fleet,.list-view .allied-fleet *,.allied-fleet,.allied-fleet * + { + color: #afafff; +} + +.list-view .enemy-fleet,.list-view .enemy-fleet *,.enemy-fleet,.enemy-fleet * + { + color: #ffafaf; +} + +.fleet-ships table { + margin: 0 0 5px 28px; + width: 300px; + border-collapse: collapse; +} + +.fleet-ships table.data-table { + margin: 0 0 5px 0; + width: 280px; +} + +.fleet-ships .ships-type { + text-align: left; +} + +.fleet-ships .ships-amount { + text-align: center; + width: 60px; +} + +.fleet-ships .ships-power { + text-align: right; + width: 120px; +} + +#fleet-actions { + text-align: center; +} + +/* Messages */ +tr.unread-msg * { + font-weight: bold; +} + +tr.int-msg * { + color: #ffffaf; +} + +tr.admin-msg * { + color: #ffafaf; +} + +tr.alliance-msg * { + color: #afafff; +} + +tr.empire-msg * { + color: #afafaf; +} \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/background.jpg b/legacyworlds-web/legacyworlds-web-main/WebContent/img/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5bd6dfb26dadf0f9aba4c700350887a8f6abe34 GIT binary patch literal 91318 zcmb4qby!qS)c*oYEu99>4yGY18%9fS(&?AS#o>Xx!ZDMY^}Ie5t^ufvj7zU@lAOmqW?JY ze*`4?kCOs{BtSA!GP3_oQME&2xf0g`SQDRaO5>gO3 z8TtQa`Tt`7J_8sih#!*Fkr43$h#81T7>NFL12_QyA|T0)X8-pc|8XK>5+Lb~G8CX2 zxiLL}h~!3NvKw8=NpJL}xe+q}fTWB(B4kQB-Qml-eeba@#zNvlRdr|A=-4Am_ppQ~uR;mkHsX>*e#`!wns1vl)Lw2D=~(>gS=ov074M6H z7T1YI`}vZkO|K9s#JJZV5R(<;3_PabA zlI+4``g+&GiTI(rnA3=~v0WVwPc)*a;k&)BTkAh$GLT3z!bsPX)d zIrPt$e1B~FVa1jQZRYwrYnM9#PBPZJxkn`aMTBbB03@tKxaPYTFtC02$SU31#6+T| z!W6Bf9DEqtZU@+Va^SJ^=P$m8RniTUInpSqo<^;C!={OYg!rUCxGaQYDL zm+I?30ETTgzjKtL6X|Ct@~)9J=vH3jp#m&Me`A2~@L)=39`rm!+96kA%igAx4Nc}1 z_Y)bR$0w~O*FHiptuD3`bUiQzQuMMC9m)D}ttx3Qj-K2M^G~ouv@03K21V*gT4iL1 zGUjg+F04=$MMMGl2dGE{bg+rnbvQ+FT zSx))cp~mJ$XZV?_`VuR8)amg){ArpvwS z-=o;9Z;Y^B;j8k9Wcmre2;F+TeMlzlQWDO(faNB9$>G8(j<^SJt3^J*X7m>5*EkEv zd_BV`aRz195j^L=r0*v!c@;uk&>I^9xtnEPRnY+&h(PSaw1hccdNd={~feU@ejbPb}?$4Tb){%$_VDc4(+}Uu?%=(g5?t&aOQbxb&Eo%^nC3u z!}c|XF<>s;P9;W0)VU#6MFej3$WY6~@H2J8l-bD(NJF>}k!S!u5TBbwzob{zm;Ovt zH_v93n@&J{&9qsgZi`5ySlM0YkmO)26G*(&4QYDoUJUwfZ#PUCi(N0DxKoe*<{`0( ziAHnW(ZDt=&R$oS*#~S|5?5xT69GkRpI7@4=c6M2(>hOvtl1IK(9m}19gKeukhDeK zjSIOuE&*Br`>^Rw>DCcolbds4N~DVUDupU=qkUbu-5(y%diy0xQOx%~LbeKbwmgi? zS%~=$w%{8~CY(6@!kUSHUCBnE+045#npoo=cihTPQ8e7E0)j$1uZdKoiS%(dms=mPC9A`JW{5;6S_L)W2+Q z-z6NBqvm)}fvYl1Iy?oOl!0_jqx>)yQp%%e+;q?KdB3|gH`C{5pS~mHJ|EG@Y>cVf zqH;Od?Ry(TAN>PC(i;=Vqp3XpE3m{LS`(w2!A$HEX9XTnIw(B-sB1@El^!IHpj}15 zk&N<|M0y5peOy#}`JI+bDb=9w>_*@f6X}4T{FrB;L=%#dDXtAYuOi)hqc;#&b3_WWB4+X}hH66T} z$i#u-+bqBSFe@S}k&Tu)ICyTHtNhYLTKf-ZbyzDjPTt$tNiD#6CY(n5B#L`iq=?hV z7b95ZN?2`lf!?ubwNiy{lAz$(hDEp1=EBLctVAt%fROEe=j%b_*r^vls^?6HSP_lL zN`NcGgU>>8%{~mww(}@57bD_SHR%p7#<$#tZxh{e^p0GDKGScx`Jck_wknXAUv=R7 z8Nq`DhUJ@ljhNd%*n(Qaq&KlDFL zIe7yr=6jW=p@iuwE870eF3=Ju3Gg?L_U zrjp;YUFB77RV&K2zZegz3yI5-qrInEV1BTw#JjW0rL1Q?id2449D4rr!|J|{WW+q* z$ZlF+BT1U#0jW%^A^b=pBJ)*?F3f7T6X&jT5_*`%^_1TUT~~ps1VUQ4ziRxtK~C^H z8<6kvGy=-`2oeH+q4*CFr7AXMmH5U_ps)>$%-O@=Kc)eYoI)wTD0k5gV@u&Rp25V+fKrWhSH3i?v?H54 z5So_n>hNptvM`tt;9?!R^&)fy=UKd$-iSn|`wuPM5+XXLr)xEE`o(0fI4{xcTIbH* zdy1G{S6q>F!N-kRTGOK~bXR4^0|RuOy$p!#TxdXYFfidxTBf8yuMT=fy$F@D<6Z5J z&%AEKPsj{zVS;A#(T|=Yz}HO6T-*W-Yn+V^$0hqX570Ldrzu@|c3-ph7fa#aQ0_0r zp(M87pFT0HZ`{iuB9yMO-D3skWYfzWa9)h>Hrl!GG&>h-uyDs0Dtny|l6sa=+1;C0 z$CA6~rER?{qVt(bfqxTOWz(U%eBq*KzNdP6&5JZ7k<&)8l=R6jxFt5+4 z4zRB&{VY9p78|e4Grp;p%~QoZF>U0DwMPwPKcUfX$Wb+U#?$O&ih_O@eEj+RT6eQn z)8b8C|9oFRwupu}Uu3%~i0~w_6USNCD5yb+{G7V=*!#nP?qJ!k-BX(e_s2n6ZIyw+ zCpnEi&UP*&^{iXir+nRKxC&9#6{RB0#yTzQTZVXi8 z@tD`~>u70L+wB|^2qb~j?xFkE~%&Xvs@H7%m<+zqHkWnDL*)l#(!`J(L8-~GXQDT1!mqQ(z zsH`LxO`@~)G~4LaswGvrRgh0ZLMkkFpY9i%F8e2}M)9myT+uX0(MaxCYoQWW#nn)+ z<0HTAqPk7rb~s{vWtK@A_IG|_rLhhROC5^GGmXdJy%fZ5^?N$cHn7;Zp>Yb;F1;e- zfeOjbm;xN!r}SnuOQREMI!iP zSw-|Aju;hUNR4gK(>%AN5sajtQxAqR19J83gbS8P`GP)h^71ID6oa1~82oi8zv#of zLw>t-V<{~UG~o_u%W9D$SJvBPsxCvZCsA|2LOFA-2j_@pfvN3n6t>JDI!nG z6a9+Uokf~}jLMl4A;Akd%-Mvmb!Is^^UaRstIkc#nF`OQM=pY8e2Mz(L_hvI-XY5X zaORsx7@-G@9r6Q_0ipl!*^ymECcim94rCEA*|yYAf>G=tc{y zr)X0xk4Zj+QHD6vB2{MG(R`=>0XvY#7d3R{XrQteCpm=9N2!l{>xQVZXksE zGE2{Cu)iD3JN}c2vahoEAcP#A=(ud_k<*z8>jSr7c|MaXi-TwEZ*h9y1$YX^`x2J# ze?-eGF=i_ZfE#KqdwJ@=Xa56u5?0}#ciPy=?EtxYxs!F9{R~@rR3InYDf$S;;_z#p3Bg3`89Bqhw0&P(# z)&bn&X7pvDp=&IxXs<)+kHs`akKgCY*wZc@mCJx1R~C*GM03SJ=;gI$j+m6d-E#CL zCG496Jj2~`@1ppx>Ft14UBR&P!xJe}&5NBP*(*8I`@<@7!yz{*Y|Rw2;52j>|MJO!mShgT>V`YK&B|)jbcmfLc5<3V`^R^{oI+i zQTn5HJWS&?NOIbJHFmCnW0qT0#Z1#rF8fwz?QEDW@y^)V8pHdUOeNC#w!d` zyWz(wnkPefzUtI7awL#3T~T}BHH#lZ+k{EOn4n5*uA>kPFGXFb^=2MkB@bKX+814I zx`XEtq=M?m;^=mLQx`&*?+vc3?7g_&wt;G2fu^$Zv@@j(%CX6rIDLq^`a}PA)|?AQ zI}U_l-ys$kJIhJ3&&l}OChI65 z-yxs7)cqc4;}$Y1jLM^pHd2Ze&>x#rB&gKegVeRH`s5JL7qwo0`QTxg)ZRM74~>Qb zg17tENJ%hHN`kR`Uku;NgRB_CoaR;TUR$uU9i zO@@)FRdtF+7a`pLnE!`1ta1oeH|+TfYfYj*`QlpV=$bjUDLT8U;^P}ybcj!!rGM{2 zkd@Gix@4@dgmR|F*S19z)YyJ`gt6y9KirnFk$hSuu!vw~?}TLc&@B1GquC2rF-mCe zTu}9M@TFf8Z6R#=pNMP|hpWQt_EUs8@V&i_;v@jv=!^+bpAB>4}$K0Kn zSimwz@=0W9A$^DIJ#}qSldMe@OvAL;eAzvaS_lPMXwR0Q*ID$AN)(*4*{DZW>?__> zvpRE)!-rnDOdnylhz1JK5aV+1-Fri))5hv2X7edFf|hFMTRMh!X^x{s_b!4&bl+)| z%jJFyr7|X|emb{p-J`4W!>e~wOOE%eO1A5!)N}f@JbFDu@xVc3yMT}qT_OS&#b?r$tq zO5=4_xD?U6+29*2iej`_SF%zw;_5xlQ~H}&TLgc?ud|D8N*{T*ZAVAf`KniJ%Y$<* z&#GHItfy}_9;6bDFY@L1xSX`4CM0YHr=RJ=1rYsMT~&IglEdGfJS|Ho7u7aQVdzD` z^|%9)N8&v(`SjE)37iouT*&xs*&eQz+!}_aH$ZQn{ra|o_)_sX+{`p3BoWxa%_XWZ z6g)URcON&_+kos&oma`a7=tgD*fp4I8OK@TGkOzx-a!ZTpRg+rffB7cOtgaQF|mmIuA!PlMJq3i=3bVWrRHM+2Yh!Mi$kc1-6 zNW;@>ai-i`x1xpP`tZ~V$=OBG=XVp+Q5)gm1l4Fk>9C8NMM=0MQC>1VE*v2GZp5Z{ zldSabCS4PKBK3-GWH2)70PMQ+goLweH~ksbN;8LsI4nqJtZipGg|fbBXec#3x=-@z zp2cLYM@e0VP+flY0H2DOwf`7+O@7nR^_W|oVx$AjlGiez@efcYjS@`SZLIJf30(#; z;yi=AxMU)hzn$pZpSxz@&K>y7C7e(wgIiMb4}(6b4LoF!afcw-YesbM?$Ni@YtTdu zg)?x5Id3W%*6%O!CHFf4cM|t^o;K-i8?R3*I_>6cTi&L#mrv~VL6ts=G!{0JUZB9| zcP*3TaMNq|h96C>;=Y2+>Eao z2Z|_mg^v5}AHv6@{BNu8+*>Mox1}A$^@m><&CPEhgs!I-mu6-~NpDfWyGIO=B2)%c zSh-O`hy9YF_9tH2R@H;z*{1Fp9k=BU;{@29kjSEYfd|0~e2%z~Bz>gzW#rSZy#h1= z?Sr>%8U?YD{YdglzK!_Jk!xKgL8;8zxuj^TS9s=BPMqXPK|}I9$NXxL%XQb_MvnFa z+M8Xquwj$2)kF<*xjohpuR9vZj2(FMF};B0BKZ!`F`wrN@b+dUXZ604SY608-(=?~ zBX<$MwAvwC!lq8a!KQHHBR9xBW)vcJFRqw-JZ52;^@W!gm66UJ)B*8ld7@~}#(*vB zKWu_Wu`SPd3@wR)t6NHQfn@^R`y7T;UbN$xoG;XLHc4LT$iB^2zaLhoFOJp@OIV{; zC1llFnYmbFI>$%2qab+vyXG1SX=t_;5MKU{c&PA< zAw}R7<0F#MvVh$}inqncppZ|6c$hfJfZv3J*B#|aA#@;JbX66|pRiq#%7Ct?0_o;< zm%i@%UJU>6#}5Tx?%e#zGM_(j|2FcojsZHMDKcZ6+Qv>mk^MVIA0akW)t}8T35Jle*cF!fe_n`bmy!-d!6`v zX}$92-G)k-*2|n_qCV|s*Sc3-yd~)hvv!kQWM5f2Q%od|;zj-{NV_&OgL<4? zdRd9n<#qZ9(z$FOl!O=mbT{`k3A~xk=VMh>^^ynJv=->+cH`QpXkOj_PLt4{Y+i%3WvmzzSUIe z7@IvG7nZb-G+%e)IF`AH^EirLUDaoD`mF7rj?0r2Sdcs6_KVq|ic~KPInHrc{blPBm5C2PT5e~WG-*0@eI*X(dmmnBDapHW@g+_oFmkdYO0w6r!(kg5B zd$!V;I24Sv$p@A+xT-!XY5bg3>_-sETzZwjb2@v$tYMMDs?MZH6q?>`ThUe}?hd zqXXxff-24t*9_YR+08IV-o5Xnst6so8&usfpd70cQ;2$vHr{CAhMHn$M@G#?C$O$)l4{pTL+;rmTPOug~b z=Pra;o>Iy!klha&tG+FIb}V#EG^g-8>cz!&!Fa(AB$C5?1#&%>7P?V0lw~czZP@C7 ziC7?i%wtX561II1kIZoUPSV^~i5CAuN|e54p$&!O_nUH&_l8!WRP=-o+ja44HrV1@ zk;QAxm3mM{WiQI3F>Uj0#kI^AjS|j8cTXKiWjwfJ$gjYY1WBuvHC!B-B#Qc!3USX~;>LKE zEzveEK=_g|a!AV!?VPy_O<>)(#!o1_$slsK#6*f!?yUgLTbfN(lC!TD z+nTz3iDc8^?rP6SX52GRW6P8a=5=$wU@mDnP`AKycgB4MM#T9JHX2MDLD95)a*f!l z7;x}t`2phDNHHfb<(4?)f{6LeQ-K-cc>|wD^~N+em#{w{6WH5c6DQR~D&$8{fCF)P&h8E`^kFVv}UUxTzGtZ5pG z_RVVRtf;AT;&ZHM6X65V*Bs4W*DyxjZm@0W@AwQX5ogQ}Tt*xf?caAiNUV!8BtiS^7X6A(9y>17>4XsHp-RKJ3YW7V7#81h;zW7$>(y0e(wh7k=?GPjd79cxwTIms z(ye+ma10bcz`uli?wQw>pC3{0<+}XL!WntuxniTa#Zno`tlz1dreOOG{LSe0aTexl z*}k!k?z^0rkhGCl0e)xhTpb=hiUDRT+0rxZVlwcICU9-xm~x+L`_G|H>gk&N-{Mqc zhMMciAz^1@c2POIOf5Z0S<$pFj#=)>i{16RUyBra14M~4eIkuzq1_>=n;EnTxx^tD z!(8mC*QABWgrL%ZP47m)P&=|TKX2qztx@0Q1vyZF(>0CqxG|5Ous$UQ^B|^YIWEY8Bx7Cq)mNyxZbn9Mp z6FfwUPRYWn=T#)7{LCNniREl?p9M}HmDKEUDqS|0_5L-&eQ4KF=(Gi^Zz11Iwa_5O zrFh5}oqNaMKWEN`HB~`j-yewQ5d=pF1F9LA$X25Wo8u^2IF3^LtR8j1Ka=D8-LpKI z!4_4>1T+0ul`yI}a)E*^>ZmwLFcKWvK8=R}qGmGY%i7#f-4r3=nvd2AR06fnw z;t#zjBRS@=>J|KGRi;lr&J5uylZzq<_}B2C`JfDqj66td<}3$`)IX@~U)^|iZu>b2 zf+cBiKw?(3+JP*ccVX*-R7jrk#HF478&0(3DGQ0cowF6|N32nZHTuI3&A;3rO5Mnp z`k(nUb5~wr14~c}^I&blC|Q^K0P~@$hvci_fgs@sFCXGB0_kC@E+>0zum?#4$^^Bn!mHYkS}&=2 zxAzKm^|$^eIWa)9!B>{PdJ%IT;4kRhyOb~u5Awj_$zb}~P5I7DED|*SjZ_6cL~tjw zTc>eNrEsiE{lm;bCnW+siM4-BWgO9a`9+O^{5X1>Njez*iYtAVMm$)epX;(-$RwjM zgNCjgPb+lBGubOfWc!%FRFJ-ULY%8opVW4bK6!Rg%$|Qul7C<2PqPJf1 zVsh46uCA39VRxWz`M|jM2-CXBQGx@n`nGP>W?2j*B*>mT&s|& z3sf#{%~`i)xRtow{sH~n)=zhW@Wmg%f%CHdAB!rxvG_zo6Bcf|jx>-qigr;2Ep)jy zPMoO{bG_ZWy5gB;vxrO1TTMgTGLBej(A7`tQx{vB?6x(6>D4 z$>?PX1ki59TJ=wkgVvPXzF*V~voxoq+Pj61Y_SiP^x5khd5~6}2gs)%iF_h?pdm7c zMeyZj(u6r{`$r_&xnt|>f1!pAb#?y$7R~oFMj3Z#{G)$oBXZ8ob|rS`Sawx{rTk(W z_#%#Iw)H`%SC;GPfo{*WAObFEm?bGRW^%Q%KS{`W?NV{557zaV_f7 z`J*TN&Emk6A0@~(#5aaN`+>m6UhAbKTzW=qz6?)irfLe>gKIlK;K`pmzlXc#>m(z8 zous_=^j=^k77|V(8e$=7LXlgL4A9fKC0;>2%OYzpnoEUjQNII?F~wpn%-H&&&@8g9 zy7@zU6sb&6XU?IhLKIn^GL=0DIg-mHAg$r&>*Rh|9_{hFXQnI-x5W^dxOpago)TQi z@0vp%;9#|67RI)t#Ib(cm5Lf(BTzLF3=AiN^9j&a0@&iq$l8COewLH(IjiI8mU}*Z z8NuYl;X(W0b9M2gB!H%Is5bUjMNRXPcJL>r&W6|Yh48iV)#1h&1n>^3FANv=l0VVo zb@wH0&zWF^RCc)3ka^~({n!ILdTW;2KiTQ&LV-W zVVP}Xll9(lUhWDnZwL+gP5vZ{!(;w=z&@2n4zsQ_V<8)*doYLx@)>hG-h?X{K3FQo z(1INjzpTwqii zGgyA^nQke!9n_Db#&d)%*Q%ba44ZAH(lQGukiTw(LsQmGgFq2nKsb z?3sOPF-~R9SL|aA+o0TBFMIZjlgfl>@VGz;Z1?mxephBt>G$rRg=TWysr??XQ2pZTyhTpehl8DJeI(U+dfT~~yf3Rv zEKXjXxb{5jYSEl#I(vzIV1oX_xz(;8&UL3Z_hE|cW80#roK=p3zlF|!2ETVUi|;he z>k|l(PLA&2>}95rYmW0Dio32651j^@6?Uy!_}-FxXH%FDXpK(a_^l`E5|%VJm*dBW zYVk|4)rGh0&)>3$g+EJXr`X@+Ku=VhiUKrzVz$LjB3)J^Nj-UjT~0Wc?wcD-PS!b* z0`hq(<5&vuerdEuvxBUc<5hK-$FB=f8m~9G5}h;SP8i;uMCf))y$$ICDMw#UDIqgS z(DZZ)`*-dhmfCcw()|8m%We?)Vh-UF(xu@wR8_0w4Jn|1Iy2OKv~Kp)bFstU^^0lp zOLn2D!D}|FC}_yr2d!-dhUljum>E`-1e`fxQ~2Zq6^P0$vX485PT71UL1LLzUy0Q^{iUAmv~a$J$+KkocYW}E`@F5$^_08Ste z&LfWPU5Xx;a`vA)BvEH>6Zr7u-yun#sg%Fy^uI_1tt5G=HFV7w4<@}LD1H+vJqm3n zXgX%Io@{fGnP#-R{}EJ|aziGGF@3Opv8A=Bq7T3AZ4udU`p#v6>+2t2z;|k|p&HZc zDM(=lf9ZDl3|1+1=j|uB;4Ue_LUKP{4(b%fcgmKi&>KclrD_^xOIuraQg$<+I_bJ3 zIPZ%TJiL5+w5p_hAk(<0C+Ma~uh8O9;CUS6TJUIkewfyiFCfzJWpTZb`SRM&su6UQ z8mXFcpQ85TEMtuy-4Y5`?M`R^0QB-bndPp}N#2;2&Gqg5;eTs8cnJkzAvEn`_cX~a z9ZpL8#f{AB2HUM;+4RvBlVTAck+q8*l?gYIPAylyo(i*09HBp3(|^`W)K7Y)&Kpnp zj<4>(F}h6Pe)8IijULwl}cJTD$1oz7$LRi!ISr(mG|g zHF*(J*tVgj*VKVy227C0$4GxE_%uiL+qv62>4DQfz-^032PH$MWD*IA zj}aRHh}}k>L+#%}PyN0f8*+6d$)0zDI)HkPZ%|q#*<6Hx&Obm{aA6)oZcxQL(v-AE!hlT(_M`V{d&<$q`u-kSg>l`1 z(v_OnX2Gvjjmy>WZ~Ij0=7UzM07(Nn9D$8SXwJiwi z)PEYEc~M`R5j)nGsN?`u5sT(R`d7nD{p2%j*feQ>oIV=AZQ^fL}|r49tB zislw%(f}0#%#ZmV1YyX-=IRqw2JXN15c7(yR4{hBRuszSs}KY>92&; zP&L)fUCdn^Dt$Qr#&B3vy7-~w*3-}xiJ6dxht9QRtM&900#vFGZj5pEdh?ZaoqJ`6 z5Uy?t?kv?@f~$TxcSufkO*f1@C6u%MtC3(Gl6_#lE1FTl5W)Wf;sjR?xwu>1gwV|2 zj!xiwKo9?*b97RGpP%8gX;T9QDMCWGq%Rc@KK}ip%t}d~5VVTgt_$<^D2@;X?ClBr z+g%~Q6>(a)$PbK23KrvLX<(9A^6WDoPXD5(e1)EM+@W|rldIsV3(8{k#t_Zbw+7Ui z#y**&@YjJY@-X%%C6biJR-bv9gER=fg3gBGboC8Z+W1*0b%V$KGDH4rmfMrk@!H12 z)e@&keISLfI3=fKw^wPgmQ!v&uA*oU*U|ahsW#u?Wr@TGIym9NpxN< zU#QmXyL1_ytYD3%rS9tEH!D5Y3n^8eoGK#{u2FsWS^yppAkKWdIo*?a&C?VZM@hv8 zysF;D43htDvTLWvOCh*;WI-cp%nu4kuzS!T=hQG47QoP>UJ(Eo6vhVQIH;Yc$Pc$ z!%2SGNsn3-Ek4gt&D7|LYpx%(ElA{wH2Ibl4`87-0{AP(Q*N2Vg)_`y|Nm^U(bi2O>WTjH>&c>p=9M_fb1W2A9| z5ANGPMngvTg`L<08_*a9tQ`~ou=i26Q)1lTU-rZcKMSaH2sWx_ofSXbPf8@FGMkI3 zUiUYTJ+TC9HN84wK$}RvI6a{R4c6?%}46QFK- z_g!I@I{ca}zJ&LE`bUXV@^e~fBJC=*R~$sVu9{+-z4hgXC+&3b6t}7BK?w8-c)+1J zD+|LENsJepqQnp*6(PsJHv)>cRkV3jn~c=%gy=1gyo#?FDgpe>s}}LC3X6GlmgAGX z&RHwc(yjh#o@ZP&EWW;B_Nt{wFi~z=epS=32Q-^!PCF{X8EBO6+sY`^L7mabnjash`TTeLqQ&cc>gV za}E!S%5T><8sY1L(Dg*b0sPsfe?OYFNh}kG<2Yziv=39H;sD0P$h zMO5rP6rw?-!bB^N1BGiQjEq};_grN$?V-nN zEl{)APXA?2qcobGSQV$0aQG&kX6n9oSwHgb`z;F25Cxunjn;dCIsPCo+YVU(m z5;nv?4z?xXb6xE#@vr6HdqthDW%I}t37OXXLL?`#D^7P^^7>?2jC`%-rDrDvnIpFp zLGgDft^wI=+v;=C!p5e>RSH()YZ@2PV}1FzW2!QA8oK&87%skGfT1l1SHqJb_a^It zv9~@t63YqR36iJSJ}7p&@60+Uafr-BvJB^}r>_LqZFkS$II+UuIJBJI$-~!{uV1Fk zfAFI5^42_13X#ocOxf-~$bRll|KKPFXT3b%Et$q#keEr*C+&CBTTR9F#K%9N=W5?| zSBMImzCf)3Iw)@YdoMf?WU6BpDwAak48Mp*lmv%HQ;BF#|FMdn4C{`x%zED1qOXadPSt=&s7b4yCFu2`sQ86Sh8|5S8%_hywV z_i^YcJ4~M~TEgURS>gMS$7GaO*EMe%tN^p7JpC`3WcWqF_?R0QSL}CSt4kvV%1P+8 zPF8P}tB%kaye1ve}J`OeqSCSYAHOhEvSYK@K!V~#6?CbJSRC5Nv+ET|Gxdr3+yshcUqdw-DDBvsN zSC9)5O+?jWLhtiVX8+el^e^0jQ6$G<#0hMEYL!_~Mw? z7JPea4Xa^)GT83fafx=n6n$ zI4Sc`cP6v=D#ocD6^O0{s74nWkIK_X3qGl&DdN-o8m^|VQCRdhzM?oSq1`7ONP0gA zQnzf=wR!g{vJA*tTw@kasZ7B{1c{LetskDvk1P$rC1cBxdi1mx=LzK7D3ewPx84BO z)SM9gQBQC$c2`rlt=Y%i@cSnh#-hxQo59l_xc9(>Icbhkq|Nh?IIDn1*|+CudIW0~ zdUS?;&MM&7>#!KzJ=iDoba-MM5w2!CneY$r0sSrTxWowbnX6Rm?XiJE%Dtcl%`woR z<3&>jPU)D$y!~P_$EL-*q&u7gPe_UJ`Lgg+?@KwoG1N#OjH=n9JY;XR^u-uxJ!9dU ztz*oEQ-y^4PI>W@R?4H^f4FKky;A`R8^NVkhnXkk;-_vJ-wLJI%uJYYx0stK7XP zHX5HVzkK@|3WkG~_`oky1PpRyv{N1txy^$l_KGB4*(MV~4KlV=+Y`x|znGnUdoECI zG0Q2CRE--^Qp(o&mT*|WGyHBR*U9tSn+-`Gdh)A0g>BQZy`hGMcQsqgyvSdYNp?}! zJ8x7SQT;uz{VBtFT1fmB*x4>;$tv)UaA~4vN3_7u3#G@$nL27USGK3w#k+-!v_yB9 z*+8-GUniSQhggFjND)@a^$45rCWmd#M8?Y5(GUi29eOvZRPEA(bEb8ro&~cnDK1py z)2^1B>H?0jV$$NA?rR2raI;T3X5o;U)wmoT5m5!3^4gi*2w2iTKxt+2ELXUZ+Paub z!0TFbjhaeMyL{q`FEgVW7aYS4;_Of@f4dxVtn7ct(lq{kU@-d${<#f$vQ- zhM-Zu)(hJhxZW&@QmtnCN4uB)Ks8Rq;e!jz-*ZDs)9h`E@0xulMnIm@umaF}c5 zeW{8XhwW{CR;mFxdQ=-4sSAF!Zu&N)@;-vq(cJTyMZF})9J6>vpAHF1)E+!C5g#SK z1l3&!!94gK~i-qa~AVy^X0#^4t|>N<=SJm5R^=-C_{gLe^PUVQQA)5=CbaRq`p%t zXqyTV%z4Bf87Av-_WLKb(`?lJv)X64^Z@=nNk)42NTbs0Vq~%^0Hn9PJ+dJkQ{uP0cWYTJq}sL1KvF8;k|M&X z%mj+|QB8%1=`YvsbiQG5!l(Sz zcE3Z+n!Oh_av3P&R$BJlS*ZFeuWC%BB1-899C$3wu4Hy$vohdk-UE`Se+hO??)Cqu zPRn%`yDWI=e5t$(I=TLqti-XW$9K;w4#?%ZOA(PBAuO9ul!tuB#VyzRL|Sr>Y0<<8 z%5UN7R1EaNALPUWJ6s(KW^1|@E@zj@_^R?ZAY0jtk@zPL{?60F3|}OKr(T{tH_+iu zQUfVB_Gv4iq$huM`~xtg-0IqAEO{%HO>DZFP_|-xGC)kQr~P(!fKHz5IIZXP#6Lhd z_4Ccyce=rQnZr{aOOu}6omo;L(L&-r-4T|X z_>CGC{n@B%N$-Hg(K`9MWi_`2)?_NjGVp^XeDTem`O(pnuQSfS^`hivGIs`%%BWY6 zpIf4Nf!7P4Z=aBTnrfeU^jpWha<$!(x*dPVZtnJqVF&;vbj+RA=)WPkSd+ko&FXa# zyj4zIUcN8%SuGW%g-KL}@^6|HMr8TCBYnTb2g8!U%^RX2_-%Mz;}3^y`l)|_FLd@2 zk`hz)JHP#yzXCfl;Hzx{#F|D6v#!Nhy2;5e7R>sU3AD(B*TVg7gb#W&h2n}!j7+pB>Zt!8w zQ`v^_HXQ%ScW|F)=22m81gff#0t(h<{`%*dxtKcNt?!M7!-7M~@c;#UB^$|Um&fxs zR|S=qir6j+-P7H(<@KYr0!dQ83p=a9FztUj9~m5@L}2GesR7Gww_|V>odFu-2-`Zp zZNG3}g2G3A%Y+Tj;}VH2+B5y1q|dn~1fOW*YT4_=8U9{(Aopa4c2zBlg5k>UaKaN% zWvzeEV4spsA6|fYO&*w{AfoepsR$<2&_}_4@-(uSgnY}ktCXt_nc!6Q%buPpM6#l%R+v`mTXXdq$C=Gin>RxR7S1Or zBfy6xB>E6U`Q;S?Rl!5c0iR+gfNEc~t zCJ1%8`H??bYMNyvDGFOaj|+@Dr1@|BKRUer5U1KE&haiJ4HB;wgV#_!{{YI1P5s@# zA4xz-{CSiIy15S{Gz!{o4}e@I;Q)vwu^{_sf7ZK1i(y^RU7=}dCKQC6(dr4;(@L<5 zR0VgbN>n3U!|D{B2e=grtTOgsyH%629&JRbIqE1Wp6xCxx@~Q(ME8ZI5DDsImy~*% zdnMu$$-hh=!W>9RQ0x1u_KHzzT~~aEl;*#(B*&2&>DMXsrzM1-s#PS+rD8LALH;xr z(v@2$E9qJ%QI!%2>y=s`Q87xE?Cv4P9cgl8WmFmW=jly$SOF z07A!ebPyB(3jX&C z{{WQ)YJ3-tW|W1<3sO=~pimn7X;J&zeJNM$CdptYa~LxvWgDc{e{<=`M9ZOy4Ms$sxnF&1RWbOY8ZC)CUD9EAl%Fhb=Dk15~spoZb(sX6bh zN|K``&_ahUU{B0{8l9V)Oo1)97T7wa)A&6IJ|CF$sFU}*MUa-%WNMCnlg^ma4d1(- z-K3WX>?HSV_DLCI{5tvRG!k7c33Mr}$s=H|5HZnRe9a(Y$@GA2)CmLypzYQt@p{EI zPAb&PjX2px<-`=9bI5s3G+m|B4WJTak~Amf{71b6f$N(@kcXG1gGmNGbn@KNBM?H= zpA%@2``HY6g#w?-qI5n~mqW-wCoGecnB)lG8(#_8O&sZ;Lj^w5Q2zi~vt+G{cN&N=l>kRV zb_98AOZS_LsPL%@C-DGMxavm7(1Af^zq{Rz>DOCX&;shCDLlfz5`Ago1N*8)!cyWR z@W=|w%S8@n&VMSRwy}k~odJuHvPc{t# zw_)bgqz5h5b%JCcG7kK%5v$@dG$`U zWvoTV)LXkLQh<^i5uocjdDB*&@TsokAqt60qEdO7Jg6Wq**NI8#Bj+Y@V?T4-=?!Z zq?(WsWdhap_hiaJ1b}@M2%kEybBA2Dl~%z`k~D3?N>n_${VH5J*DZ>Z_hmK+@c?Bq zc}UabC?-FnubTa12}1Ja@0u|lQ>Z7b)psoMi*E{lSdC#b)1cH5=@lX#2yncHM9Gli zU=hzz%gFx#)^=5yB-@3g#;p$!KHK{W3P?rV5~hGj9w3kp%_mQ-PnQI{{Zq{{l^Bl+ zM4x>lq#l}7>2WSYPO=G@B_=`k9t*5rKP$_Q%5-F2odriM*jfy zs9tHng0;M`h}XUGcz?yAK7jig20Lqfw0G8kJc!XLSX2)wkK$=8Z^==&crAr=DKQ>X z20Y2Bkj=Pry)LPR5#o{I^64Icesy@X@l4zX-2w<%{jYw0lR=EVal{0!;?*l`8B4&0 zB>EEopUR_Z?#Mcf!AM$+Cn|_hK8lRq)6Od{?X9PFVYReR;#Oiac@xa}YAYXgZEa*q zSCpmF0nFSa`oM|@j7hhNVde|py_fOj9MqEpkL9&OyL>9)IoQ7l0LeVr55DJtP>PQfjkIBq%n#i#-w|JhGjA%v9fWwrvGXg4`Z!ISA_~Ppt!8VFf_A z!4hCy7-ZiP@Nd;c|dG9;Z90+k?mXxtS zu%HR{8~mbzcP!G%i}sHf)0IF-Y{@eJCD#!w;82&VZ5tSGgKYbkx$W#?fFY zl{6HsQWYpaBd5<(R&DLARM=gvBnG4m!c&`=I%s}=wOZ#2#PXLIZ7v9()STiyHzs_A z0Bx83mBR{3h}S3!^warus2^Z97PgQKiBp#DWjb{S`Tqb4Rxcexxo&NhnJL&3H22%< z>sFMuUsh*YR*8YEDn#|=@5^coY2lk3ep*9LytL&}OH7105Op902=oGqFKqZh>!6Mz zY1f-6%!b1wHf=Q_N>9>vqJn#Cg|>676!KXUl&7K7Pe3WT?1ASKO>OL`Ex6J(Fp~i?eKkotYpp~dxoJe<&HzFF z$%ir@`4!OfyZ$|<-=P&tQp5wG`jgXVRoH;G(2 z?n}E;l>$zU#GZO|^NO9f#nKd9v1#_k%58a82Uy$MC>VmJNw~Ky!I1MHk*7T%k5Ufx zB3yOTovW~-s4|cs{zg5$%|m9U+9g)2aVaKCZl~XIB7Fr}TgbTuVS*ewl7$JMFixZ2 zp41G#L(a9|I@l#6M;e0>>8L)n)BA817-zukmlImqp*Kjiw7GHQpasYPfJ}bzU(&fn z#lxYeSuJMBjfl#$js6T)c{6FTP$tZI9q98Cef0RfC{__9JMfY_pBY&gXYanSls3$Xj^wh z80HSA+G{=WhWgX+iP`H}NhmgISvo<44gB@_P;z`Tv3>?~4Ql!P0kN4Gik8;DG5qUb z;m#D{-X3h663MinejtQ}0DQFipYpDo@a5QsG20ghKa64ALfw)q+%3A>%oikv(y1OH zJAtoS+<){n#V)elo;0#)NIJOHxk`ZN`+G*Q(u0wOTRmSTQCr+@TBh*i=NcIqyk(HI^N`&`rN|WcjoqcPo@UO#; z6USB!Vw@k^#v5^L@)A&4V5usRFb040W366);NKdxPkhH{cC8hpC?s1FH!&cupjML_ z3JxgEt|4xcn`E5GB2wFv1ns>22k@?w@T!J!&e>bSaeH*FwBe5|rN;G4EwM50=UXZG zIpRRUyhj>Z7f=Aw(1}r>@0c(rPElAtg|7C~;%?`Jt`^#^aLg*{7X`JIB!sxmqnsTm zIj3vb`sG1%t~VYtn&-SH=o)%f%`^f zAP%!SZ8gxYz7{czEmp%D<9r_0?eu3h?znsj>zY9)O}!{M7YX(+!1#9>;JAhrgtUvs zv3pZ)OJZ~P$jh&ut(*BE)H2i>jhfGxDJuf|SeC!x>{`d10~<#D$DE^wyWQqZ5#N(nk@GbC#}?Y#!A zfpAw1U}+zru=`fjM~Ns*1MMG7r+UmYZQiJ*HtR!^_}E;9c|@PAMM&ITIhEzMvLpi6 zg;lOXGYd(-*?;aL4WL*-NM^x+J9}X+8}%2cO~_)>)r}EGcGnBU?N;+EwkGgk2T?%Zs&sBi#6QnCt% zUErVf)}pn$#Tj{4$x2-UPjczXN$N951La7!S!@G!Y_=Uy@To~DC(!iw{!|RVwg_6B zYSlqe3M`ToJc#E^LsoYULftL6HI;~uDH;LmSJDtz%=@ZZRk119bdkTey+*rGq4IMR9a2Z=aG;s+ePgNxU05R!L zOO9M5mN6Ee=%|7K=4YRhXZh6o#v+Fl-O~xkl4WH%(hpKWlmXM}wMyO&-O2;3Ta+xP zM;TURsC6J~>_DJL9l5mqbG8F0GOz?eC!e3G_N4D{tEC3pQrU2yz~qVZ=ts3k9=Wn? zcZwQ~{H;F99xu*4swAZ(=P8bP&}ZsD{6J7oaOhKngPlP5iZxVnFnm$zQlQ=NoxEw{72lyzs8SALx6E(lzST*^z8}h01Z?6Ak@ZE7@(4kw^S0l>CV6&Vg-e*(K&wLHr~c2h62k{uNL{r!f*c)ms;( zCKT5H0P?H(ii}_CTYU;1hCV>(PneIOtb%TE_DNYwjie@2pbC z{{Z-^MYoA}WCbNtscmK^2P3wg{129}DSiY29c!N0BL4 zfvV zKOs;!l)MzM!om_J5CM-ov7z>#;tW~u9VkO&rBkD3bRXR_ug}(;z;b*GPGDd;oS{?F zWc+~?teacFtdFJdF(l7I4zuokDLdB?KUVl&=^^cR+)ji?si1BBrORs<3e3{MoaMM6 zo@9-WteRD&_fivf?1DcW%#S0XpEIYGShZMfAqq;GRQOVoPskCh`g_wJ!!CnmLQ~_n&^LzT32pu^C>RdNe6UF2|Tni0Hj5!1xj0) zWJ01qJo?Af{$SW`yon8=#K{trIn&7KeWHRd(k`ytprubCCrLpINb)H&9{${f2o~2R zE?cQ8BODRF`9Jw}aSi!_1G{7S4qvdZ(ATH9gIx+FMIWGT2^;Bq<>J z858LQRaJNGx|F!W(q;po6^^9I*Xnklaj<<$hHsIWp9xH)ALf0j&RZ3>Q0f%Zh(C;I zC#fmZ=~k0?hnt6*ONosZi3iZ>srIU_uo+o(m)t@`N_PqLjlD<|3SV*qcWO%0q&T#V zyw5LcoyCopX0xDB%A!cyT{Tb3=~UZO$&fD^T!|=BVrSB4+#0gnHpWE)%1N09TPLqH z&&q-~E*ra9wo9$PkbEsX6DQE0KTpn_Sq!8$oas^5DwP?%mHf>z@s+%s>bFavrWB+q zN%Gco=ci3M(-^sRrT1mm7L)jrPF;rOE0MHl4@v_gZg?%91xI1t1fP-9-ll68cMnh9 z-7TeXd<*au4}A!wRgI0(!}l%(ke$@oNuM~-dm3NR!r=urcZqNx*v*(L&neW#v=H6h z;qI(9{urhfL?iV?BztTF$C&Htb%$>FJ z)AFh9lI5JX-N4jOa`+P-atG3Z-*>jOQk7~{l&UAYb24X~r2hajwGHC->TkFYAxa0r z5>Ao1f*^ZGtqAVi9pV{FYXioV%uguZK9wtWHg^NMQo>iwB^i>UI!B2%zW`v}XlBuEGRBuBgoflWJa0WGrd%`g|4B>4m4{Nj~2_KHzT z3+yR66rkn;dZl0M%7Ryro1u}G^NByJ2QiIxgW}i7ky!WHOKQsHsFR@uQS+D{(?2>_ z+-xr(xM-&~fXXB1q4pzclw!9w8S^-MZLOnMxM`p1D;Mw=#V>({2Ong}%xjN}^Jx z;Zf2=AEaqPBRG}ivi|RJY^YYc#2;A$<*hmQ+H{4zhABh>3foaiqnSQlLMkL&G_<5N zW2g?O@tm^q?&^e z`^#!6U9XIO+5rm9>C8u+T1mriR7zBYx)rZ@a*}+>f=|3tAGUQ3eb(eJ{{WUq)7Ph7 zlocDie1L8O+yH7pl9BJQtB7fLr(1NmW5T4Yq@O-|c?zba-8AA9j}kXdai|?;bRJTD zDpW3A%+PTw2+T_xpYIfyC*Mj0QXIE@_ii~UnM=Q2M&C`T?P7_xQ6;xhjdg80eFS|e zx$iEO-TnQi)TGJ+ybb_7lmR;XdD9!T#O)jV%c)Y)I;jI+DHEvlGeG|UzFS|O^@oxr zTaXY6y|gFL)0$%Sg@+qaXpIU{vGUXW{b`J`X#0lcwIR0^{`CZce2i=JsS?%tT0PNF zjhtu#0P_Q3?fzjtd;F?#w)16>7K69S2O2EZNm~D{gB`x=f zKl`-<9;wt1K_;WR4<{>O30gmN>!flVs=F`Sg@oO(Qyvt&(Ia2+4gEjS3rTDQtq@@* zWl8)#L}~%@iK!XAy2D#jt|e;;Fr^^LNa#e!^wZLw!Y%+848Dijj|!C;hm`X5B>Hu* zmR@~~%C}KGl-gu^$1hzy=qn=n*5RR$CR9N=G=tQRe7SPoo!%+HQhZ%f;v~%Of6>~j zs@ZLs?$Wf+grp5mGyZ>CnKvY5K?#rnNLk8bs3gRDpGpUpUj|D(R4D7m}3OF3R+GE#giY{Y$aBcz&&^@g5s2U-avK?^4-=@Y5; zAbC>TCA)R^POZjNq`=Oiq>_1c_5wWl&{l20>%}eI0m(^mITi;w>Q6!{McQA20!mb$ z*+ED%=p=vTH6`t$GRx*r4vR_x&<`n!t!T=W3u?JRL~02pKaa@JSuL*Ng4>Nu7=Wz8 z2a$pY&XUc?lH?cLSD8?Q>Q10VN{c(2X8Zehl(d3LN>mn+@B1}g=N7Y2AA7Y(a4SU= z#QB9MUHK6kP+Gf)CCf#ikv-s9OrKCs)caH^fAvak<+Ud&hGMh=0p%)AgMZornv6!( zq=2^E2~mKh8A>AN+F?;f^Xd^_+&~|n z^-8t+MSTr**(<%gd=}yS0fXXfvv+lXHkKZ6lGuN{Atg`=$|4L&jzrha*Y^02aH7J) z&8;(=C?t-DP*wi`5k8ep!{gtypNAe2bAWAlCCkv$i#T=TNX?NdGZ0F4Cvl`{LEBft z{fYb#@N#kP&@q;_hS4>ZEU;SLi>+dp7EE7 z*eM|HbkuX+YnOa@aNYLB?@sN0aBo!A~~m zNlKMDi3BLlyv#r!Ao`o&pNU=n0I}XL!)@F{Z`zeU*K)ZhI|&IqziA)pE8->bU&YTB zaSk%p6WZn`)vGwI%S_w2QQ$&dQbILM=rq>5e**T?jeIb1LtIwQ3hpI@-PieR zT0xMsg?{X-%Uav;@3afxJr7*oyV+%>waf0U*W(9D6t`BQR<3hd}4tGr--g@U9frDcQ$p zIG!1q5?e#ZB%dunpYZ$Cx456iRr0f**RPNOfTZQva?}y|S6tvbYpZS;wqo?DIT`?! zq&ShFkQ4|b+@DIwxoL3QgeK9q#7c`sR0k~tDmuuZ<$N>SXU6AeDHjXlr!h-nk{)X5 zuyX<Q|8=Kq(Rv8W`ixi;2#YnN(m1xN15QCbo?=nQ;?R$AXv z3TbM2ZHWpl4-;qiWKT`ME?J%e_^9FEhKxew@m~(Vb%tLh1y@ZnRJMvt!2)F`Z9MBC zjQycM1sqd$tWy=?B?r`lE+vB6%Fi-D1~${mgA>>n#lAD})y1cVIQ7>qI7^=!}lKAU%ci@wQwLGAOidu}xNe(iqq2E8=T08sPlz5N;%1lHj~zRTD-L@hV(6qe%9G*Cpagzj zO6+#5t;O@4N4!R#s?EZe##eJpU4lOIbwc;h_nF&@Ea-XVO{uAe3aFPb*lRA3T;dfq= zEA2e^a=Gz6k6fi<0#>Xx;ZQw$yu;^AA8EJ4sw5+bT^#51ZPxz){{So>nXfm>^BGd7 zPG*p)Bb_)mUXHKrGx&L1#Y*Bg&Yz3)ea!s(ux6D%X^+FGGUh&95vX1fatZfKVAq@l zam(vTob(kAUXQ2kEBI?@lWD{^R{F_Hb{8ci`geL%S3hY_!@bgfUBpf)M@-`jxe6Zr z+{d}EIdh(Zlq{Y@=R(Qrv((i`brb=$HXB0`)oG#!f`ABb3^8OV9KGGkD zHk1o|NpO+MFzcN^`n^Bbznz6@P=gu>+JzOQcWRIZpdUKAiS1sI+x@4X4=t!E{v~nY zye|s5pPzTHywe@~OuibQRE%}>X{c5ia-lxG-29@v-%6B~1tmlfbRg|XSJocY=)<3B z55r0oE#uE1gQ#y0x=21z-RL}~o<7pghl^yEo8m`^KaICAtBk7iAU7V-?_P4PMQSTn z=Xy$>u=cM(S>|Dl!#g~E=yMXgOLMvty=ScWABHUxvyn$^h9LXa7ZvPn*($RG5tTeei&h%mG)K?a+a>uY_a-H%1T?=HA8EhC zdfz?I5;zpCCEPaR4_$k)6%(In&%=WJ4&$m=jm8&qr_G^WZDs?V0YLMiy7YDLw5Q>z zU}eYO5v&Y01f1zPlQ5Gp zsStehrqMmC(R22fd^@-acNtn0`^;h2B7FyUA3v2$&)R43>e$GxB7I4Z+QTkRoQL** z%Dm#DhqZb*=h|2B-h-ash~G-L1-vrk3G^-U^`uYQUGVO-guTR$9eLq*KmL#MuQ@2I zrlpTa751BaJf&e){8e(3Ae`8B(I5TX{b^tOOnx1%TOnLXvSvnXD&`61Of?@vUT;AH zNZ)Eyswx}&Js)H373>MiWZx?oS`nP34kpgvY9nYyoBrtEdXYb9{{UcDiWbKdeQ+bi zVEK-)d$4|UUT}AdEr$ETQVfL7lT$N^UE8cJmoktb5Gq~kg~u#+J-T`~{{VQWViuuG zcNB4LguyDYxR5$XKqKWy=h{o~=<8uB#cpLOfJPqq_8+Uzdsm$Uj6vkAIECdk260WeL z;qPKM%;EOxNL%iuv=yoVB*2r%YgxV&?Ee51$FU2R5WJ?(s0#hV!Gd%~j zT}|naYbM@+IrfKk5U`xM%gWndxV{W@oRc0viiv+{cVYQ}{WR*rMyPiVc%L{q0UpM_ zBORV`qw>>yJmJ`wT6Fr;M`nC%vSWsyAu}aBzO>a()W`E5Y~B5${es&b{q7>TK_&uD zA8?`R{hov8MW@a5)M&^T#56J?1Fw#%DyFkvYt0_1(!Hd;O5^!I&*3Y(knTM2B*`ZWxIg|* zs=M}={5`C}$5gR0GhvrfI%*pSk7#bRX>#h1`Mi4e9eV)cvLZ01qw6JVfC;%Xn?dWb!}RN7LV@oa!nG z4U?cUDYVo*tI@OeoOS|~gZ(2~@{yN56>~nb-OtvTue7`2&Ge9XiRRBihg`?6_FTNd zuQ|w_4KYX~YKym`zxS8+2!arf0P~Nkn(f zHHO`za{^(w`HJ(6yLCArEg+6W>T1IlZ3N4pm45FkgtomHSK4dX1MGK~7~`%2KM}&N zGkX-bq*frs43)xYKGO8)@bCD^UV0a&8el?f?U9QdD-BntE1 z?(YF@XiH8yL>%rdLRILIx6Iah`x@-*;Vj|!V@@-8;PKu&i7CL78)XdyfPH7qiR~lq z6#b%IhA=yZamU*P_?mXb^&)!e-{vYu{?dPk)(7?6ZNwfxS==lG}x8d9j z1YAFfxcD%40V?!~{OXQ9!q^?^)a|)j4opf6h=Hsf{i3d`KJvctvinTF8w0)4@%50h z0q-!okPolw{-pa?U+mkq9?JV;!&i%NFB4c_1S>1u%js|-Tf*RiG~{yEk(c~4h}o4X zoVN|6{w8FR>XWbV^Q_-u-LY|RVZ483$DAj0u)B9t_q#syrMt#w#M0xD8y-do)Kp#9 zugJn)LyDW*`xL4S*(sIxoe2(<$CgliXsmt-#8@UXfmvhr*o}?GAAe@e(+2Y7Ga=Lk zpu&McIS(m1?go@mrdrwdLUSr1Lr`@}zr;V3njBS|X)d;mjq?crr(HD@1L$fn^_{|t zMM_C9B}9Wff!ipkZrHuGT3>XRn;*1BQ|zJ3`A{Q)pt!Vk#uOwZB}NXLBp4*0Qaq`N z{ZhZJ+G&~&g*x<*1fOB+Obphgpg_M z-m>CAee@|H_(>p%9SAyl%>qSJoTxqu_m1wT(nBHIaidE*Imb~3IsN43Ksdph)5ww z$P_Z``zN2C`t3!(3t%GP+%ttR!pv>+RJ40ECK(lVC<; zem}USxiESI*U->UcZXrPg`)8Ll@&Ch0jq?92b3%Fn$$6$hwcl+-BafTw^m|Gf>o7K z*Tg@8t;An9Zjv9oL+Aj1Y5~jcHu;)racnF@Xm~ULG6Ry5pDv!Hd(dK{5&#q4Nh_dQbV) zc5g7XkhR^28j^e}>9~+jnIeN9fOc)d+$nfn!R#19&gn`Zf#_h5Q#Fvg;rtfz@i%w4 zRJqCo$>=$l`TA7<0H|~N#l9fhshtTTC#;PpmbD`ogAA{^@6aUZ+LRJckP3}G4F!u! zW>i#+FAxbW2rN1KAH@TGwWeI!ph$Is(EuLtrAlM0Z|-J?9k;nsQqr5w+~i7!<+((8 zNi>LfzP{(aO6RM9#K!#p0FRXb-Me=QF0*>usz~uDsG-CTr2a{&IPVFLAYjE*2ljoa_tPbHc?qYp1xl79mCJsf?mANox+I#>&%g)>A4)YprOOPoACbt z4XtUz@W9H6l>~M4{sL;J67VJwj6K|94L0^ut8NHbleVBAXce$Ejau9!w|jIDPvBh2 zObsLai1eqfK)4{{R}czQKDo zd7$dBMv@89O{NF7;QdW)YPQ0Vq_~W!pTrRV0AC_~JpC#2Xu`^WNfzXIvxuKlx7LG2 zcd)Jyu~vIrHMNc8qBQjy{Ocpby`S)=2XY_7EQPzo=tv3x^wu@? zYg&7-e$8(W-j|0Zu)RZ_)`a?r5$+F_ZkBkBuwF*-1V;HYfdiL>ojs4WPoC2M^W7`3U1xxY?Zf|A1~e$PNp{%%<)bY;oNa5P9uae>W=P|*5O!n2`1F?TzU6R#ZG`xJ)3?eip7DQVc>V#M{{XuSn{@vG?H1su0sY~+ zef0CL_<5#XxM$(G*E;p3TC=RHC=zxX3dmmJ4mL>$BB(gZ+c2SB=2GAEqC;%MN zWX_RD0U(}~QCDfYDO*8tVE}+nH7Eh|G?W5CkxkSpl#&t>h#*3Y?q`4X(vp@{1nI8y zF7OMh^%mLO4r;B2)!R!n25cBgQaTO& z>lCY}9XhH2J`p+!k%c)R5x&t`w{6L$ai`WKrAJ-nr9;iEMtLKZV$pJ@(+ehf(3_Qi zXqEGVDk~=OD@h=Y`BpvkErs{ZIzgRbRTA!Q3xX6t9ON*=Y_yOH5zku5+uyd(2}`j8W`kzBULStS?Cv>BcnnzCW)=My3n@NP_&Rn;L-@^^sb}Y zZ)YrC+pmcDe$74MN$;6JI{yH9Aakx>;zLFhp)sh9k4mib8-EAzhA)cY2*j@Lo42-b zpS!JQRJ4LYAP$5^wXs`Z91Vi3D;B$U=|fzlSrUDQzgp*Z+)0dB**9q2!n=gec7k@+ zOmx)KZ?XI9_Q6xAYr8%aAtqHjl6}6kmrVLwd*QreJXeCL^tXZ`7L1_)1f?(u6C|Ez zZ%xZtee~?e#6C;+%TObDpH8e>7_$^!`PjLn8Y7#1(Lj((CSsMpfgk2S+=ej zOJ#~-XPBpF&Pu0Ky$-fY1L+4Ux6@-$n4JYyEQu>=?8sfei1!U)cFwfXQ;t0IM372g z4aDuYsjOcH@NPNAIEURZ)|8gf9sRp{4~9wJ2EUP1tDaa8qHZ%B=an7HuQaH}|H|S8}03)RQ4bYSoT4iD8!t zxUsxi6rlvp^-_v%48weR#Vv!A7H}Dz4M?8R_{};Daqa&Ada#BDnjbn!dnThij?p-| z!dB)!v=pF}$vz{rY0uWN*tZbk*x3gXyHlhYl^tr86#H*&OL3Zo3Rd$*b#M#2d7*UG0} zJ#33a+cv>b34=Nc<(0~Q*|%>VIA7nElv%@ETC=@%kb(d)B-U|^Ck1N^Mg7&&XxEpl`2W6l@q-*q#D;wd*5bJK?E2yRpOQ{SmM|CaR_bY zWXuYiJ63kb9k#zFB?<>+ooiUE#sc>U+A(i;i#2rZ!fwxc+7<#ktfDzg%$@l}RJO!r z6?Cwy$W$4f_M}b*z94(LYYBGYWbVUcxzm>Z^H<#M2ZFG)pU}K2+sn`e-K4qi3e)LT zuRCqx=a@EjPA1usNe!|xiR%MSRd{E4d`GMOjo{b|J%e_8hjAtmY*%Z*ctc4zlL|>e z7EFSj(k4c_&rwB5*e4P-W7r30*uE=*-rXwWfG|wXTjWsAY*|q{>`wc8(NWowdFyLt zl=*lqDM=+!1ZmD7?bd7O?}-d=UR&`m5#sz^kKOS$KX|9_FJDuy zxS~#{kez@K0OSAzY9+dLjy3r6?dysz+;a`ZEwHA_$!uFN7PO9qOOQ{VQCJjwV|+?B zAw8*F>%7@ppZ@?ST+v2Jq#%vORJGIp0QAE6lV#+s?$a&~%E~P5gpQgwrj#q=FXCBC z&O1}N1Q}2DD}6uuy5=YeDut^kgRD(8N&=#C>CSv)d`i9jw`x}kkKVDiKmJaUKN#N< zO&L#WS0hjU3g7<#(bq7{rD#5tHNB$TBT6il(o^w?@hr9GM`{-!o?^z_fB8DIZSiaI zF5;wip>jOaV{8x6y3i~zbu5nw`Bu?`aC(d`@i`OInXY+fr%8)#vG}6+m%WBhX?IKV z`<1`{0Hdt-9ozSB0U=nQXxAzv&P3WUK4c=bi%dS!$&l5$0Q2T*$`FKsrE|AB+?dAV zpNNjzN{9Zw-9ZrrruFsk>rOuqeX=V>@zu#cycuXu{!Ob)E&`|rLDGd>G=Zvw9jb2r zTGaeEX8s`iXKg`W)4Q)`+tdF5Ee?D^_OeOM#_#$5sl9*l)`;cEGm%nbU}`0$^{2v( z`IEI~=alKJaK`rNBjO{rB#8c=J|$EAlSY5?)NA;G?QLqzc-8T*i1#hb{{YKcD{S{C zI+Z3jnrlJV$sh!z{c2qEUraCbZnr-XU9PgAyIwoE3m>$WT9NOTp5Mf8Y&VRS-s3xm zKX@sIV4wLbM_wGI5!|0y6?)#?473t7Jjl{(GWl*@w`Yc9B%5uh?fbTN_T#&hr;-b8 z{{Z>4_kJMzVUV?P?aI$H+_k5^S*=j5ltz+yMy7z+e3h2O1F;ot&*HN^FLAoD@dMi> z!XfTGx>y51rrXp104+?wUR) zu*yLGoLxrb1R@8vTIW`LFNEQd_ja8L14M^N9=b(bU6rfO_o2sIR#=waBk8qfT&DT0 z-%G7V_B(RzJ+Krky?Z><|Ns9#XI3OeQO?6QQBK9EHaTp=Y%{|gQqF{&qm*Nzl*8sc z$BoS?Vb1lELun)pb5;l;DLVJ6_iwMy_xH~(mtFSUWxMS1-2HHU-0ru#N&hDJ1HDq^ zZwTsnD6QJFb5-na6EIr=+*Q9DU~ zJJwRh2R|P@HlX^f>5w>dQ-{jL^PBTcjwdHaJiE*D|9u{OmPtM(vwPg5yIHlHewuFu zNULM-UOCHLc+k@`G}ig%^kk~^+03X${E}+8j-ze=8~v6Xs_TOa!!JyIsS^XA)-M#u z?=pg{eJTuB&Y#sDiC<0F+v;B3eh^;HH&$MVd-X5r&o*`J@^M!vaPJr}QHq^+UYdyxVkNcQ`M=cM_9Z(xF ze_B=jXG&@7?Nz0}RMK)qsNg`VBqcf6)FJO!Ja+1JoN8xjcjQv}n-0^IM93A1y37kz z5hqJ)sx(J(k*#j)&|Lb?;_1u;40-?}8Q| zPsiVTy>$roxQ0D?N&oLyr+21c)6ULqrFiYHS?xg3jq#{+Rgw{7h95?bFW=Gn^~w-- zYH@_z{_v*F@YALhy4oL!&k;D|O9BNhPK@8^xLRRdJvsyurMm0(-2BmU>7!@QM~;}d zu{?>|gs3$<+0}i?U2B$tp?Jx5JdQmF{{Z9up|0FGs&>6@C}`rZ;4SrppU%2Nx}VK8 z{s%Z1Gul!EvdC`Bu4szf@GQMi^58uE%?V}wR8Oy1PV-|93802DpbCxNYH}jA20cq@ z{4*i#1z#Amp+DV{+B}!)Gv8~&2e>c;eYwlDS_l8WL@V{@?pQu*b%*UepCApmYSE?RvR8lpS_n`AIDJVh9vR+4*z#$xbesyE@S>-z@hXG1@TLiN zxOzIvO4HIw<_KZ@-ZS&j3HguX-5EnHABx081Wb_acdsgWB~&P0E+A-(Zvouabh=Cz)QWIG{KZ9L>U5r(e|H z9KA)gPgyx|>21TH3VHtFiQ<*Aqt_*)RjIXKgUl(ScYg4#)(x%DS2;U+M?$yMP?}&! z2!0%dw-T@d;b4x1gGuWF7L#crYLeUopxSu<^`C+vG9dtfBrLlS_(q=xce zk-jT4nG-qA!6Uz08S`56Dk6ZFmLG6Wn^)I^p0fxwpBAv z@NTp&3^NdWfZ(KY%~fA@y%PZX6_Oki-kfx1=~4)|HB@-1ouoD`SWi7*>otmYE=pg4>0;PTkeJ2PGh2Xc;hSDea;8 zHAJE?Fx+l1uVTW3`SBg9@YsaEC?5OqOO8>je@@LZ^XvCV?ly;8e?)&+{BY)QK;G;} zQECT&S2pFpbKAeiha=8eWIq11x2mzc-^$QUWdwfM6-I}nz=yw!8c`a>X4aK2XJ$PK z`|Wg6-(08V?lFS3?LuI_lA0q_JbJ0TcP_5@$KjxNI=dIy#XAn)+>#3vpw3^iXbya0 zvJm)c`=W4|bu`DWe~mZ3HGkzA&N&xw49x-m{AjQ5s6C`VmYc~gc~MUcfXbwucn^K= zi+zZ6)j4Q7q}}t`7baYrqwe*`VXXDa{lcMO^RrkbEB{aTk0#JWe0qqo#wMy`{1)&58@ZUv&mYkYu^v+-kMYL-#pz}htScvmspJ{$ zhsp|w4&=yCRZhWFH;-xESZ@s*xHc9O?x?(TA0C5Rab$oO zA{^jj@7&Hf*m5HK*zv%g&~YeG{Sej(S&&Vog3{uw$U!?;$e^&KR?wqhp$?yBIzca;UWIS_YjwjX!o2-J@qSH>3zKel52tmVbf{gMj8$s@ClT9x>)NkBuprlw z2-nx&kN)|ly4Ua{+Opja_H*(F^6&eNt*EcHmwF8b91^~$VHeUggA%6vi7D`?;+c@< z5fb@=uA4ADLQuWow(fvcn-)CBwP#ydgFd3XxBfo>!`)zS^Q&(-Mh%{^<}4TS$-V8h zYN$U=zuwwHlb-DD5lauLzT(w{fM<>tp*e5dTNciq3DyHc0VzM)l3_OFlTgj(T;zla zb8@@5k)9R}4k1vP>epKwPQji<6xX&4prYJkA+~g1GB*btRa~^TffD1JBIDGCG-cYJ zu0t2!YN!(9ral@zajg6zigEFr`^xC(v>!`r5udcb@TOgwn0@f*setxys-L6I6gfMN z`19i3{(%RnCi!iX9|MPNQDk0zzyD`tHgemoKo7UVaK)x74%7XVpSTfA*b#-RS`U3V zTSO-OFjOOl-WI2330DhWS;I#5B7s*TCikklke^Ma)8AvP+kT$;wpRcr=BRFu5;SB5 zmNq9TPcxQ^UtQx63k1{A<4K&{cP+gSjSQe>!#qCazxLuW$(s8`{GbWek;nQREAr{P z@}tES-P@tLg+V)Q_XaA?_nJS!+l4p?DhB{6Yjf)f9ZC(K@9PyzR;J7vwE(3u&uhT+ z*Ja7iqxq!}>CW?nQg3t3Yax%0g$dSnCjj1EjTZY6M*i9)^q?g5jPIT9-ae+S{|U*_ zGV=8J*r$XtaA~j8J z=5-a_`iVQaQTrQdAC2#VJ3@cQbUqQ)TM{pO-!5Olx7>X&+mPb$?PA8f`m1Bh-*u1M zclV5x7_VvGxQ7%9sa|3`#-(2hy?fW#CmblEvnk4#IQ>?6%3C@2d8uWOvF<$jwY)K2 zpJP*E8kE!9uMm|mf8c;1!fAlvxIsTu3vYe}>Iw{8oYDUt+nTqeFCn6xlX%GUdZ41y z$ZBG^`p9T?R~(sTPZ#<~6Zks*lc#dH|KzDR$5_BCg|sB)}<+&EId^x4Oc zkV%yQ+_*idbtc$KG}=rukWgm9z@fe}e4As}T;`jqj17gtXc}G&8%%Rs`kwL85OO)= z^jMatT-|6^9d0GRjq_LolYs)iU8y}l%E~|FN06@#U6_LrfKwC7fJgge^gHW4!zogqIBADb$7ICDT zJ7;>&D7d?+v_3)(bY3e=kNEIcGd@Z#8Jq`xt!Vd}>~)kTc~+@aiZRmB^QK5^BkTno^Ajm4OW<5PI<~yOS9ZFcFEOg0*AC zuTiCaG@}$->ywu=p=c~l&~D%GvB#@iHwo*U4J*(bNI=v<*Jvp>Q~ZAPb=N3Jbplg0 zMc9$))*b$_rvhNQuV6@zCxD+8W1zDz%t1s(S=1mi^D54KD|EmH3Pb-lE&r5Wk!zP{ zPpC!O#-LlMbew!1Y90%hr=MmBYa3)bnp!4lSMcosGw>FzTH2%bR$uSDMnh(WKWN48 zGwOBDq$I!6M?lPt-6b)BI2qWBIA{}TXU?jkb6hdPUCfc;BqdYI8IP)P$KJWbUq9o`{-P($ zt&$ie+7s>j)MdPRW%GBP6YDR+LS4E!y6W$sK8V!)n$EVg7oIdpO9P`KiH%0{&N*Z_ zxo~FkhwISW>88|FI-(GyJ9IkNNqN2g&#Ga!b~%UM84W~XET0>?|6b$SyBhf~fvTc& zu%8=Uk>`@D&^dG)25OEni^hLzunE<+&6>ZUW@Q^oJv8Z~+`cQ_9cvrS<^m?cZzsf#OrFKL4gZVx#wjhJ>Rk%lt`H zgLdbY0;6fF)8!QeTJZtAwA0;``lWuyEb?n>%102p#?jP&!w%zdm2vilA8IcVDNqFr86ge#^?gt=(=6eMjX;IIZCT+aliqh=Jk^h z>Y+t&-BEu*q-$FE1Y2C6RK4AA;{d<%R7`*V5?jw#1_*fL5sY=So4*UZ@85VKVmk?Q z0i%wsf^wqOyr7nW4UQ_k7&&UEGa=YCYJ0U{zG_~V_X10gbNskuk&Hr%eY-aaA(RSS z;xEZeQ~NOVTtI`@wXa26f80UR4aHa!nF{0g+38;n&=i?tW&2>x5Cwk|I(!T#r zlAlnpJZ#4Gz&f7La=z9$yU@J_I>Hh|Z`j5ZDEVl%pv$Z)+oIobh=r)hz(%|Ng|s7h z86RM4QQZdR>#M8zcTb#XVIPvO30kZ(V|{#<`nAq^?5QM7G~}LRVf62q6w6wpj}EXr z!seAO?|(+L0-OKBe!`DvYf!u>f|K059KtocQB0`nMJw7Gg$77>7 z)O$}vg7Lb~alYpu3yQUYH&nu4@04nq+~~sn8Q5V#v~tSIfq2aRPSGInd8B{9Wh5$;QZ=Q)cQ|#kn6T zcN84+ZJb>dSr69B&$<7a)*JlPu`>xGs8(552mZUg`7Kl&71#peZuDCwo2IO}kFalY z<{x2x+_^JTVx^Ffy1h_V{rewk?B}1xLs$2%ZG;b#!+Gup0;VIDtv&D(mj3tZj)~m)nnPs!rhm3I(b`0{5f03c_^roto5!T%Vnkjd+ku6%S{=oltd!O&dsmCf!BPE4$qkrGFNbmR-gL!l*hm3KXNQAJrU6s)hfcM;8$rIM zY8^7oD2LWxp|$Fd=x*9~2pClBGX+aS1+kZ%^y!LxE6{toSDF?FS%Re86xHZ+$3KhPX+p=H+SUAj$U5G{PDiK zMh_5OkBgsLIcBJ}y;Y#bq@%1G`Ny?zp z<^8E+10!3paPA2GIdu0Y*UIx~B28o4^|B8D3FF$~UhbV;x2zO{R|jcYj_cRCZg z1d;*GXo;(1?=%Vp)ao+S#9av}mu$hO8ZMI&-{~+NSHc+mg^`4nG6kpSSYQ;WkG6uK zps-ORRU1PD7sk|PVRt&u&G6>^u;AdUDgRMDH(U8xz@b8z%6?+Je zkfQj#%6)BR3WXx07~q>nVLb0^Mb%ob#o|SOy+(ZTIe4P63azSk>0;{7`|*wlVHqcB zqkTFHv?AY!*_Wdyrl(6x7OmTrf8~r+DuD=VriQ~A>9m`~4lkUA^IOuTniZ%-uANPG zRc2zAR)#(Z@9b5Tnb1w>5W=7|Z-S^Yf@rf%`=P~CGGL)6UkEHsEs0~#Zs)QWu!;K2 zS{4!p1p<|9eojE$!$TVyhtOulW5o-#B0`TCHM&4cKb3UUH1+JGA`z=TadnwkW4Nur zeIi~|%V^swG^nB~^P-ezTIm$C!-c)=LN zoAaB=pCfr4T1hVky@&5`yWBdiglGKbTKirH3T1a`Ih=>3n^FxL(Q`R^)Z>ZQdBG97 zjc*;ZmF%qx0Ajj2c9bfou3tEMyBtN*`b$egYdj3pfkLd23W36iaiSey&PURT&~ufH zCDyvoi+A)$pQYlyT4LvcO&ya=?Lm9}Fq6unTVLs8;?wzkB!l+uRU=|I{phHOsjAL% z@C#;7OCw%mc&g_#2_(D5YIqS6w5D$=c|yYB9I*~-k6~{ZUm9g$i3p`2yAxe#7y#Og>BbYy#DOLEN493WVS1ESU(HNWJ+ zjKvlwbCx}SCGiSZC?md>VGOqurClQiy#~-|afKI3>Onr{Y30CV)j^`axi`K7jwCs)o*6~;P*k-XY(#H?z@B<()}&zLX8)$axt|hgdRKD z&-(UBcTMo6GM>^Gvj+6_4$SF$^WEuF5HT>afuAwGK{K4(=jH!Xr&SM%9o(PLv}L78nhZFApu z0UcVOpMQXbx9d9#8;<2o44+g2na zuD);TeL#NRy&3pQsB0B17qd0JD_ym02Yja6Q{r3!ppVfb8aBG(qdslD42gpNHo4+uCvq#dF z7v&PAp23<)&P2HyZ@JQ@pIO%)P0RT#h+*AZH`WNZpT`#H{hLMdh2*B~a$sXobWOIP z+%ev*;_YiI8p7=k(aSE1u*T)-;&*URP3A8h*<_&IQ*1>1wRxr^YiE%1=cjl*y-^_K6)?i%= zXccd-@anl%}nuY zz2*y*XOHs74%2r?^AXnUyT_;@9kTg;HCHszxtE!zAA8j`%yr5xYXw1-Q>T32v*i5N zF?B6mLbUN^r-Fwkbdx$-f_r8Ev~VpRn5ai(wK1)==v!nJc+(@%`0+Uc!=eN>fq=bG zzwYyof6S+==G@7&2q;m7;d5dl(oYfCV^wk{RQSkocX3g}!(D>dN7G}~ew+!Rmf#~p z+&l7nkz{fjHekIIE?^cKvt=!Nc(CcS4#VTkIrnh)vAzgEgpikrt8a$yv-W?_$o46= z#Si@(=b-tC4o!ukFsa*3C4CKU|DI2Uy*0bCKkR$qQ?k5GP0AYihw6u5=bFu$;_h)JVi83=>(`ft zkdj%HmiX7YlS}R%=R)<~xZNc&Yz^#PTU_kAANJ=I*)YzLH}HoJyB9QNzdk=(A@mUb zeBz^$<1Tb9wAzRxm`QABGcXns5;9e$K#X7}UV%N1eT2FkRRO8W6yzfT=!aOPjjyFY zRsV_?Wu4j2^o6w`I0v6+#*b@))|F#s-z^w0$skaktgvGM5K@(7fkc}o-nXG?f^Z=I z;IhQTQlWsB2&xDZG4}hl?pwSS$O~_YN8lgxU$4VD${Z>*qEu)}z^1da-UFCuEdHUv zY5pmigbog&Dm&Tti~lkFtF83HMD42M3VDe{rr!u4P?bRV;Z5+*r%;=GL_l~~5!iWY zdPRUAJ3dHL1G(~T6Zs+=X-Xd}CP-Soc2u5KOlrTwDP=Rz7(%XUu$Iritd`4KRBJo_ z_Dlbr z{_VP=Q>OCaKx=Kt57OVYu$b$~Qu_zkCky2d{smX09lAI$5?9q2bL>{Uned0-utv1G zK=N>Gcg`PVR?3_}Q{r;}uFTja_Ay!J|Zx6{=(uV;2dp zkysCMgWltE^<-pe{$*5|GMHv$7c>9M57c;M1@o{Wr!^!L-8MUtDAZwy$(AYnNz|2T zzQKCCHYxiUGwpuDVBHGM*JzR{zQ=;jG>}Pl2U9$wL#WvXyX5D0PSo&1<(CozL6h2c z6L`%@XrEkjEyJs*@OT<#VMUpc>j!;`(ia~OwO9KWJk~bI6!CH8MvF4u_U5jInZLC~ zWJR%vT(?u3*S>0uGEl7x*3f2yGWLU6rOuMwv96mIDx0%tb?qw52FH3JJI>_Rr&WAhyx zYD_GHN3#Um6eruy0DV6!TMJAQ`)BLv`F28`>Xi`-EjPOma-uk`QmZ<3i}kJ-zUl7PuANj36-d zdmSki+i5UtZ=K*At~V3SW8}lVDXqC{7!2t}j^ac)8E7{6oIa_vvNKszVt{@7rKWLV z?cAY@@Qp5$=)4%G_60H6yn*RgIo-v9pez1GXn-PviWUga<}hqoahkAXZ*o|cy#2@z z&%m!N0l=1Za%`Qmy_}{sn7-}McD;*W!R9nY2mKKzU)bq`jVD4MULpAZiu)gcbZ%*x zmx#>OLLaYNaXS*UD|kC9Ya`rculK%)rSj#nJMw_=R(=z@VX{0A4Ov*u#RxG^oY+1m z4Xe>ed31ky*Q>Mm25d@dFn{ti?(aD#Gi=owRQGs&I((ls3%dbkX~3gMIqGbamghQW zPBf_und@J_eHnY{!Kv%-PC_JP3u)C2dtVy^-|0$8cNOu1dt&nXC7w6uB?L__&Z*{R z8;3vfo(w&^eRt)XCL>oQ;n0!1rE_5g&o}c6f8nS)eBwicz_Mj2;(L`kWNr1~98sxN zMofe_$;sZ;qRKRd?ZgV9Ntnt_w z^_Xb2SCBE(7EidB8*LD*D$@mv9*x9Snc~z`iv-P?|1al7NIk;VfS-bX=@(q420|rFQ9v1O zzR1_H_yz(&vzJcH_8~A#YX^lT_*sLWBmqjJfe1V{q(j*ygf0j9kkeH&E~Boo^k4e4 zNEcBzeuKe4rceV_zo=(RpOIw*MYTS%0ugEKc#vaB_>~5exylRP z_F8sB#xAD)$(4)AqIg4|@vn)1TE6=)z5YUHeVAgAik#)UR64vmN5b7Qq~ z4WLd1`Y-h1_7YH0qQvn&ee`3uC?JIK|IfnvNXO871Rb@>dGI~a{o@t6vT(uJ^T@p# z)h$1oFyHV^`JZnh(P?ur0<+UgyG2}E(4FMy3~SJK2h zaBTXjiU(L(&uBzymF3ZS$IKfjFB}*~Xhj@R17hR{_+j%{-ZA;X${d`_T47(YvhI*j zRY>C89t+fGU+Sdf%CY$GE3QHV&{}1)cpT^KORKq&n*yqvwollKS_TsnO?hn37Y;Cp z=@Umz*?f&5RlyiUL;M=gQw1wtndFWHPbMik)c`>P&akR9U%SIB);!rFc7v_%(#^eJ zH^Qmvgc62Ple^f<#BBeY9#A(7a2PUA3wrt7G&+A2GZmUXB3vkIht|uT9se(E=1i>< zs!kUNUsV#8*mVCe6;p9h@@a|qP@=cwUBIB&f6SY??#=37E*I@JJn4 zT+6{dmLAXmz@Hq{JQ9`5Jif`XQxL<9 z)z=;Y&&2PUvK9hKVMl>Dq7Z{5jzq<2J34r9g%W0qw#h5rb!+*5zKbvBr41CpmHo=x z35Y=Sy`G73~Ueg9r*>WggEUpO`bC}pQ4VsoWtN^NF30_KdHl}XE(A-OG3(z}(WW8lMQ zA(x5hQA?U}O{{dGu;7`qfhg#|>R!8qm&PZ4*xlhM|GC`Gt#xb?u??c^i84>GkiNy< zQ>N-Th*V)#oEWI7a>|%A+s1xV)aQK)L!d=M$OEk0_AU2Lw&M@yf(yLjId}Gf0OG(e zQ*|p(kKqf;fp{5nr+cIHzWIkV)W}GjaDxmkS}Y#h<{I1msvEeI7xg+C6wbr)nt7DOl)4fSE7g#gIJqf10oVC;h5JTV&dyPIXTImQ#P$Yz#J{;m&s6j_&wj5s!Z5$8jf=r`K5wMN!=5Tp&y3tj1>%&l-iqI zB$K#v8N0_hf@o!hykUZHts4Gfy0oBoc+)@IjoJ)Qw*`goMr|qE4CfxDL8>YUlvELs zWVAsc97muR;#9vFQE;&P-ls%MnHWrs22#sjlg~i$_U~bLeI+E2K$UcA*uN}+6r)GW zFEtWayNe6%mF;h$SSPAA&}Nzjc84My9(#;WySt6CHZ%+-F)jR4p5XwfbQM(ua41I> zjYVvbc(t;=7_Z>Ry28?4nf#qhcuX!*3}-#1edQYlQq}%{E!wiF!2=f_mCX>Q8c{hY z0n7K^35Q@IAYh(o;M<%>H77J-sdY9QhaFI+F>~|}@ryHT+F#w7L;f*4tGt~`rSiA* zgxxMr$M2$|#5*Xc;-3E6Smuium4rLB%~CIm2d~yUvCfvhEmG1a%r3|w zyQ+C%bH9ATnOjq|EuS>Yy-cg874hvB=mfvn=ZxpCo}UWZ_#xzN~Fc~?S-NeJyAFLmvU7#BNxeM}zfTk!~? zwD(cdmp;BWYd;f>KP9QE8XDU$v#{*TauK;XbqR=Zq^jGKLOxUoYA{?d+#IOlkju*@ zE?Bza9Dfw;M>RQvEq8p&Xr-#!ibl2OyT851RAbx5k*A1!q?q?4h2d|nbpSb`iMlVuTso@0+fF?}{_Ww1@S>VN zrR8xV)CCF4`Z<}^rSoxOG?LDB3qua3(d#UM!AL|(8G826* zw4u{9b9aSdCr-yRw)@wy6+er^!WtaEiW^d&F$?zR4e-@>Cpd*$T;V)d&Q;#o4;d&e zf)+j6zXuS811F;ooV#5{^FnHw^1N$byo*f*`0TTCX8@uvzA)!dsKW0oi)3pWlre)k zg~!Y)v_K{>+`MJQVn44Vs@w34hNh3`%;O&?aqB5mWTC1c(XQBP;e>4VCOq@9V7iWj z9=oLGbAC+A7tpoKvBfqdnPI{NYpyb+kANZg-6Z~|9!VUj5Mo%Bx*oc)>82pgJ5&3; zPDAzBS0-6i+Ic#lR#ODgppe41ee(oXRS6-xygXYri;@HL4 zLC9#a&Ms-9$pplo3YcxIg`8e6pJKaq-ha>Gtm3?WI=YmOH{D8|*yW~N#T-iAJ{K+H zbIm&>y}`9^H|w{8s4}K-RD4v@(i104d#?YJh;&ud-75|fN0;?vKK_!Y%oDmxPOioj zNtJy9NqIt;Av_gS*onhjhD0(b>);jamuZe0+_fXNJ1PyubtKW$)_eM6;3TL+ckIPw zxI%q?EXE~mD&LJhRodn`b?utwmz57^#BW^4KJB71c+8}?~QKS&sq*yJsR@t zDD!ibn|AK)is_>(2Sl3p#@nO`RpRFLQ(u05uK)Du4_5J2H3Cz zNydRwxrK_f73!5nDfwaHByIKN+Y_BN+{B996{7Ibf63cxh$i?d2N>;Z2?oo=01zs$ zD@R`{Dn|t#3+83$%kn{yq76-m=DRL_$cQcnhN_`6#Bd3cr}-%IRU-@}T~U?zQ1eQF z48JlbNQeF4d>@t2oem3!g#Db5;Kf{F{HB zJ_Cr^vh2&>mY~V|0j7@qNlg3?7Ken#GvgPNmbI$Juob(Hjh~BK%A!(PZqD#+V|7G} zEO?hKfEfix)?{0+2U?`QfDd6NT`s#5kM7k&)lq_V^U1O_vh|e7H5mu0ww=cu#YEa* zB00H3d8IxLQpz=Ei6%;Xt(9w%(o}uwblwz_7|Ro}NY0Ly#Y*6b6@!0Z5nR$FwuWvI zS%2Xls%1LP)Ovn0tF%R6fom~IKQybztw^QCW)hFLRE~J#*GY96Wo@l!gO0S@1w{z0 z1_m_j8Mens)DuFSN^R&7u1BJoMOa7pPeMdR(Qy_t5c(NPrUgJg3mS>$*rxCv?%Ulu z9C*hXee4T^L$AX=t72cpQVn&e2bSTW=blv-88g@!2R3=ZW?v{lKk-ENJSs5st2G05$we&@}^!bMUA>plNiDRT- z$3VgikmD$vX_J>DAXqxFr|Ip8jz~-sk^5-G$g?&0ol^no*RTk5BUe;F#1&;xTNE$t ztH#W9)%ArO^+%2HSW`?|CtI$Q2J<^^C^4xVeE^2a`7@hItHlE>5h-ZN9TU9Er@BLG zaz~Mv%*2IY?4(7`1l1JbdjRn!+!?L+ARtwOX8x1-bXZ!h()_2BJL@GlXN(aNQGVoX znzlp~t?hd%y+}@R778T9VE0jT)VjE`s3F}zyv5TpGI!hdOsh~euCkI>Hhe1b*%W@- z!bj@*#8iZ>mq^Ajg{F&o-EPrpfg;K)#q*Ww5q9^fKq5ofI3UT=^0WRMZ4infG%U2A4SIQ_#;xP(A`)ldjdyhUXH~-U zPLMZ41loB8mBZgGyD;y1E_?Mok{o%BBDUd3Qr`Q<(Sev&p^n#=eydJScmr~px4#f8 zWOBdve}MAGQGW7wc5?T9WawKq8!pOc`k!eId@L-`y&t|gdV~F~aXBIKz9)Kj^`C*e z3muEyRyNL`??%k0K8IH^zA7;f<_5L z4N&7_&jL@+@ev1VE|bKiK7=husPrQLf+!*&>%4Q5{}tMT8=lx*(-Fh`sIoT7f2^J# z`zsA3MujCGz=0V6+2$k!r5HfPM3?+0>qMiiktJ9csd-8DFSkaFlUirWB`~b`uA!De(CX`U z(@|T?Q;>tTCu0)P`V|?+3iEcGCOP+HP8+@LTB-`zf)w!rs(?_7$~bPeakdytPScXP z4WFVVX-S%1wlXL)R^im0*N-T9icS{8}2*3pn%IR*C+ zL?p9;SGlETGeU(#+KVwx`4K6}{N;1+FN6q&5|QsxcmF!k$h>!VTBtq0=ya+w!l_>P z(rM1ijEZi=RNKiP_oMCHyM($w-Ou0#GP9%PPEdOdTE1|WOjAJ2<>hxM5eZUNT#8d> zlU9 z?@1v5k(UuO?CRp-KJz%9lVl6k^sborITal1q}#S}o)I{T;Z`AVW-oom z6q3UMXIu`j+PlqWI~(Qx$|}Z(Y}(yiJ$q?HJXQGb$)KDn5JC&u5%ZlCR>GIQ&Zk5* zApZw|Tgn|S1a?ml=H=ZZtX=6>eDSgsyy^pKK|Wt<{h;{F;x+XsC}16%Gwe8hl~IlC zs$1rFw%Cv$F_=Bp8GX#t3SGPYssWLC*PIEU!MR6br^}{bV?h?)KPP&I4IFV|GBLFv zmW`>5DRHO%A!RcG{7#>(gTYKyrI85ZM`|l-+tO-@G%M^Ti&3)xG(~PSVhWI^F>-hY zB-EINBjV4(2AjVR<3E+h-v|Gg;^d;=a7(2Dnr4%YVK!>J@{Yq{SVs;~py^Sg#Vl7| z^`&jLBr?zS?lTUkqT!uAlqdCt0U;u@V(KMNrL}{+f-CB^Ud5@i4Birz;KUs;)KeCl z(6lKnbIwV|^HU;ColzX*yJJE|L!4ubYB?opI*Qn@vIj<^W$ZC~`vTgYPSFFW_bUie zEcnhYN~Y_8Y^`S-&mD)y-2b<##(HAJ+t^I^waq=vK^lK|DI2m2w=zZP9)0amtjmmcM-=oQAD8Pc(b1|NhV zvW)95PxT9j<=5w$eG=FgeP~2iQ)L!G&%<~oBl8Ly6du*XHVY;`Gr9Pb?1co%+Wj|} z2j65Cmmj(c(l|BKSDfn*a>Q&Cn(52iiFmcFFUBA~YwkG_o~j=q2l-c13utHM>v=`D zzwk9W$7P%Uhm4@D1eP`rK&g()H70ptH^_CHXGkpRL?$M2Q|Ts^8Y|tOUmG$NpSpoQ zV0#yIFuWy&aDcyDJR$?IWw;Amye*>?d{Q1kgeNpqs(Y= z387Qm`pJ@M-NmpZE08$NW_XG}QHC?cTxq8;n7C5T%OBl=oE(IB8n$?of9&udNMey( zKc%P}ul?WCFa*v!`zs@SRYSUEGxkQYM~2*I&$|wh@#{Z8g#*K$7f3I1mLWoDK;f z?5jaIIR%A^l3qInxHyYS(2%OQ7G{9v21C}%m{oD&@<}Zqe^%= z=2U17o8R8?#dMK-qGu{nQE5_B$VOiMkJ z8&dgoJ|=2OaOT=AzV3}U|5RAxSBg31j_6~rKr7oB@BH?Jq;E0KnQCnhTNk8Rhv3WB zVV(LfstaN8T#bNYzUZy=&<^V6EdMCtdP%8qM{;LUWlkteY)gelK#JM7?>)Tp@|oyr zph|cGHQ5kk4$3usZ+&O!$=q)z8lgx3DW#ov=u5`KA(em6K0g=zSu+1{bbM|zAvKFL zN(wV(`INT)Yu3jrTvGmKuCH2Rc5T-!e2}rYf{@i1gZ){O>_2Ywn>6O`vI2=63eUmh z-?5v2P%y@3^d!&Bl|)h9JFPQCWy&$N!RfJ@K_1=5M~#4BxQ%^DJQ;(;Vf0OhYCLS8>cvJ`^8n2OZe6|BlE)1ZO>hANW8_uVzVbpmur{g-k z^;IBD^2pLg4=~DlHp_2S!%-)Q6K>{aBhcKg<8pq^Bvwfy>=vgsGF|@&z^YRh{LCkX zTiUa5aPIce{%k7vRxoTd>T4!*W!8~#r45%Hg(g0K?C&zK*A?}B&pYe+4ZWTW)^Ee0 z70Sl7NYf=HnYhCn8&0@#skXUzqIhPYo?9=&PB^hR-l-xF|2+{5)?Ugs0err(^`-ws zWFO#rji!bPPVOjSug_?GwztRS@^A%2!gN#+=GOkGfay#+Fa9o$$iQksbsN$okzzs2 zV?*N=wYtYpG~kkALXcI$pK(F=OaCn4!OxrJ5)K8-eEO(!#$J6OQ&;3`w=7i$4u4bZ z^lJQd=BIw=+}*VBnvXlv3gZ!s^$Z$_Dy?DvJfExM;q-VJLkKsaUb`C-Bpg@9&RH&y z3%qe#-`wfjj&g*ayRSh-`YFUlW0->OR3vBijQqzR*Oj04dpv0i4`E^o7Ny;$O9LCv zHXJ(I?QlIfbpZ-f)ag>a@zUqilhZwYADq)W2J3G1JQn}|XnG62rvLZ-dz6&a7)UBH zVk4A>ff53;(PPvIN$GAZx&$OPy4e_`ltw_Mkq~hpDk&%+B3&k*|J(2Hy6ymvQLi(O z<9r?gtUcOTT*lEDV9R%H_P;(N_h?gn61|l}1Sg@!b;CHUHRRHN98FyPZ3Kjex~iXU zxeI->4}5?*ikWYNtWU|mG8&B;%kFC6JiDq#QF5=)8Ga2D6+GMqKxFe1zvhNJ+V*D`G z9;k|SGni9sxL=*Dj8;TguBQf2+8-SWeF;#Flj(v3@#=;Jb zr-j3P=GtY~+-spRR0VTo$x884)#&xt7n<7*S+s8U3!FlDhMoDMr=+<4k>MLy=BAqzIuExIkHF*yR@d^e zcvojiJWn6-h<>`LF-8}RoSq#m<9oByQVA84*RRC#bvq>Vi4G{%Jxt)9g*&mcS6Grc zEqICJ6Cz6Wy%JHcE6Xfh=0108Yjf6AksIAmIWDZn8~J!Wx5HeU{JigZ@~pSjgGpjv+^F#lkan(MEl6RV|I&Uj-w--8ST(%& zv@Q@U|Jv@9ry>*Cf3*#jf{Cxa5gkhDR)+UI9|-WP(E$RNC%tb}SPP97j<2@n9T0zxRH2VE}c#Ow*_j|PkY9XLR-tDcM zvXuK2I~DcYSd1^E4)XsOwSUS|g%9Da7P@xB9784HjMSD7<g1$_sw~}kv-bLjYrbuT z{_oz;&r4dH9KObKB91uz*U{+b{_(s#G0}ND@`KSj?4UwYn^utFYs7ljTp_`t2x}K8 z<0t0ikLRTSqFpns*2(>La=v2gNiPM4!luntA?1;q|6iX3>;cGdBOsj`3=JlbXz|)o zAWpE!%192Qm3dS5Ed(uq5nFZIGXe%~b7{O7QpQfmXpWic^Xsx$6~Q3iB3z9~@B z217_w|AD;1Iin)_Y%G*(jR%r$e5959dN=uu-t$E1kXeBKZsa#Vf5B%_!|agZ;$ZDe zxA*g!o~C@7eHyU116F>QN4dX(YTo-Fz9%cMRZNBoAXBxKc`}K!XAiuzKIYej zOT0M5wmbDMeM9|sbojyI^9Sc|9T)Qjv5keh<0a{2UZX=Uz2O%Q!k=_Vw#!YD@}FhJ zS0J8=9EF|QNULu2bJz5)ah)A>$8;^TTjJOampiQ<0@5$>LRPHZGt)@*X#xVcH}o

+T)(=hCw)OF-v`uH(>W|(w6MlWir3{01+BR=IEQE`id3|+kiNXl$`k89O*{^?# zu&%{P$14(%P)>8ntl)UafrNK{d+FumaZ3U6tH86=AZYw}r4ABPM?g8Fuh)e?4=q+r zQP-1l6fTr72^}C)u6un?uT=``E?$*1OH~r}$w16Pj=>%dWOdc+D52cR=}*Rk_bJo( zTYD_e5f)YkwDr+0j+n3BVWvwghL;!v|Gw+{L_aW-mUuw+Y1qberkqL z;z*vbR>qK}QFRY=Z@g)>t8qPzK74l}>L=%}_pWK;`%Zq$eMf~0#){CcT-Y?`5lXKQ z_P42BB&Vc~qpQI_A_9AQGOOD!>_kJD)02%WAw`cah;xIZx2<)A?v$6>yJstW*_>s% zh4q1nX@x?h2I+L7EsDoy3SUO&`4hT_T5eWww4;ciIlwXn4^x!Jfj-Q8VV94y?!Z#l zb?(8S_1F+SVMKYf7pKsUlJuuSzyZsfX2WO{->Bov9AjjWi?`#;XjJ^kD3l7E6PsaF zlrXCF2{Q$uTrpAa@Q=8I4bdvg)%Q`J@c;`Cq5w?Yf-{MRpy1`k5}swlx(mS(kl5bo zx{P76lbB`;JX8$nGtjJ5>favR%hqyq>%i#-~nifQgpA`L?JEjT=kuGt#z|?+vWO(TxsRbz;-syASJQl zU7ETMPA+QjT5hSRL1m|F6zvXDZQj8>Gtd7r%vNY<+cap}TwOLza%`~aa zmjSo?D8cE4m1S@HYpmwnw>Y(!am)9xh0OF`8Mm&ALYj-SR<)9A&ceg$*FoBU8{umX zub8YV*XEnaNO9e*S}sItP*zpAoKjFH;m}pa?in(APJ14fXJ{uSRQTF-5`t1C>UV zwNa;{(=xvt6DS&At72#guc`=k)=~yhe$pu*Ny5ndeL9A=?ug$~9$f0~+KLzV*B2)# zm@VLMZpujQh<^}%ZpoGq$88`Ksb#Ve_4j`QAE3Aa_I3$G%LdJ4QFB22+L`a8NA|Mo zb5j$3iIP_WC8f-vDbT+8Ceh^PlLCFl@Q3HTx5sNt84j%MSKcms5HURo^S*&mfq;cY zaJoM-%Pg;-@}@YOJi4bpHo}c&FszNcg^eq1j<_mP7EiDMvJ)UD!V@02nH?NioI8;v z18ee+TJul!%W(?mrC0%RWnfoDueKR7zf~e!TqSkW5IKD^+I*4MKb-C3!tQP51?KNZ zbeat2Y=m+5E%(<<9|Eoo_Q{3>*GXQfc2dLhXJ`mRZ1}9M~Inh`0Q8Q~3{T zgxBd3$!LoXKW~u19H2)ME%PB|KT+De$ZTpDf6xeydnOU;i*}mT(@l}^j)d}FXqoMH z4B#Ic(OG{J&G7?$s5AO%w&Ta^blhzxtKG4ZS8(m)={eQBhf3k^le+FH6P6wA!CX{xb6GcZuS~U9d`-DAd%W~AOYEv7Rn5s8jo|Uu z4(dNz4?bUgq5emK)hW`hlSyAN6=v`X1zFQit~?LZ)2ySFikhor>n(n;4o^6rrg?}B zzF2(~@ApPZiA{OkZ|GZF8uK>ex`{1K9@YS+WrXlBHQ3h`%{orQ@-539W#z7C(7S(R$eL8he= zsT=7DGo|=Gjc+O-S||_M`f^)g$*^ui0l7+-#;nS6jUI21Ocj&8jiflD-Ez3p(FvKi zOhQv_W;wP^QuxrXiZ3cuxKxT(Jg`;$h@lg;#1NzgC{Os$kr*PqvfRa zgwsBgkPjsZ(KT7xIv7}SKfPyP=OKWLD;=v5rn+U)E~}eGwVWd}?)yb;V$;NYUUA#3 zoN75{A0zHIgZ*@#S^+oO(-FH2TQ|sE1xKtK2Sw?dqsM1EtK$<*0<3J%5hCQOV4iIY z`F8JnbtZF1+~DdJ9)txY#^6GI+e=6(!s7Rz`ZyoEke+W`G%%|iB&p3Rmbpf?#fm+Y zgioEzxhd8E&GrUlkIQzwi}LFA4>D%0IJ8M|!hES4Um@wIRPxJSVlkScPUb(V+s4%y zEMRlh!W!a`)S0V39kOICkk;%sQ+!Bk{=MLn9p~gMzjPisqFj4KCLvTYV;(Uhf8?#7 zqX12%FTIvEj$4b~v)Z$7g)UJBj>HDK{#c4+FU711e8NaKbfv7=($2m&M0)GAPp5Sk zEdW`MJRhh~W~Hp{&_r<6L-x69e4l;>-&KmEiI+Pop&`J6=&4rxwMtKy zKs4T@87lQw798)gnXR`#-zWCi8;$N(C=oK{g~`bLSnKQ0HXxW zh3K$~e+FZSnQSoFOc^Su-~DhdCqvZlz9(?p6C)l|0W#ve9BQs*k@GEwQpjio)5<|Z zb-zdOpF6mfJ>RKRIWQeOKQB->Go#xR-c zNb+f4V1r9m0P++aq)EA>Ls;RNIl62aEyVOg(HCZqbFaF+FbphMu6n+4nT(%oiCl`5V>hKK8rLc+%897?Sjf zdrn2wj>SRw6{^@1rG5G3HjqRhKr^TTPZZ8Cv>U$C5VjuE?y2^jKC8jw5^$lQaicXL zX`}l-jjr-NVaGcSMeC35cg?8%a`q)%4IK0w!__{`xltWG;JVZ`@9gx^dE0#x9apGV z?=G}8r3v5oqc`&73@oGb?Q@T3?#1?svu&HX9a&5N`nk8i+N8x$OnhL*%l96S7uRR< zOofgINpL-({3`EGZ-;Wb3&OSQ5MZbk3ug76H#dxNN%k>3^!!EQx_Qgq(-BF0#Mnttx#wa|{KES$iyVLb$#U)-UeNQ0VT7 zRN}sRlBrXGg_z*54xS;-YYgKpCE|Nziu!!BUFTvdNi2G3$IOW6B}9ocsHIe}z-%Q@ zN^ql!zRSnQ350matfVeFG16^T1r0NUhLJXTy+O~lLD z7g1rh^-4%reX6`LMsWxWzLKJuv_k?Lg8#a_sB+tv5)#S@ljA|bd4i~kTcT*3ud2&GUO;IufOT^`xHfIX*wsP| z8M}_MMnvtIQ)?5=0R`8b*kM3(-&pOcq(E|XQ@+u*DS8ZC^nUP)L~jdjtVV>X|K|+G z>RU@LQSxoHpDjT2)g#n4cy+=fecclSET>li;nXPqA(P3UZ41ldE@xa$QFf>3;HOiwh}?8THE+L8(DUO}`bYt{PJGOtoay_1#yJotiJ|O`MIzuxI085)Tn` zJRfb|z+Ba$<)rReGDfeyOBp91z7yDFbsBCzedNI`HpIIqW`R)+NojoNU&4PS;)H3x zIp~J?z0|FrR+jhFons#Nz~6TK-a-EYL#oOujvGBbFDvhqXw13GwVuC|VbGanoK7ok zqwibivvk5;g7Day@q-JX(UubqNVDn7mZOY=Z@(6c$;x!-Lgz_l4@5=-I zkq!=1)zmf~>>P2)uaq6Fm23P^%0KQxUr}Py2`z$3$UO8kH2Ff33v9H`XBX={L~dtI zBiu*YE)>>Hl8vSU=D8H~WWQEVmckF8YL6U^4e^RytD2qem^;%RlE z9+rau5;eK^^Dx6s&kP;I0Id@ZKwxs--mJAL%u-3w*lPRdXhc7ebc0uG^ z)<_oXJYY2>!-0o}L8zY|FD6aIlJ$+oDo`M3jM|B!xz@UvG0z^@z&tDW+O6psPr&ew zx0O#PyxB1pqtauKHrIOAtL7A-FqH$4I9cFx_O{q6j9XvqA%qc?AT#W)gS<`$PCvq} zm)887%>b`Ohn69g3uUck?&2q0CeN`U3}Z3Z>!IMg$0x7cG%_ytO%zpVOjE;XmP zQz+rW#c88LjbBW3X4JwKq;VV>IJD+Zqz-{c@M%3R2V5{zD26zO_t}6DTJb!&o}T6W zxrx|o33;95+IjfbAqSl_zj9tvXpAOs9>9p_#=`{Ofy%weHqFlh<8efZ(~JvVs_~sj z7FDFxG#3aM7@k}MvB8TblJ@pq+P|wi>?oXSX8aGNV0-D>GJik6&cUK39GgI_A-vL< zWTcMEyOQ!Ud8s{gOl`r@B`5T{l&h(i&8f)Ue0xKoIOak7sU(^Hg*2s?We=ROr^D{@FEp-k4!A|$xz3BjIYa+R>?cn_Z)46Y}DRkm>bzq}!!Fs>({S_8O0$&$F+_px1~@ z*S*ihlAXGMvy>K{4#UQh8bs9AoKM4)QCRKKdg8>`OCP?BH5vZMn%C*-cMcmYGE~PW0+b20g6K+GYxoXAnE+_B%xN-7srzvT9FwDmB#Her zalIK}*tTAk@KC8huz2->otX49ZOk4ADOTxMRo<0Ep^)%6Wsc|2vNkX>$F1}=mpcWp z{y%wodUf^iKT!M(00>*Sr=50ffU}S1O6pnO;*;aMH`u{#oP66*pG`eib*6`qjvo)d zA4JOAhYbSKtAO9dOG5YiOYdE~1(%YUDp$W>Z`AhY4v(B45FJTKkK?YW0?Jaz;_u@p z36@nE_g7D!ay|T*#0vC*tYUYlFtL9fKf9iX?FXe&(qKBT0C(-DIB}p}d3wX6FmLN@f;C?=Cx+fZBs5rIj;#8jH`!i0F{%AgX`)1THoH=O5) zOhU2hv-H}Er;Axi^J&F^?I@!`(D>#uPI7G16gA|fyCH#GW<4(KHPgFxIVpXgtZ0jV zJX}di6oapeSMG7rrs*_HS6W~lc7)*i)kqkq% zAJx%$Bd&0KgS&h{9kOK3G|DZe2tQ>?{RjgahrNHoYS)=}H(~#`R55*NuOBU!zUy>= zBH~gLsTfaHOhnr)5Y{lRk z|6Agy;d69DnUkK+J?~>&MRyYKvvD3QZGEtM z(xHQMFwn}LDX?8vTIQONLxx%98XP^v0sA+-CO|DZ(X-LyYNR%C6zPm@qws2Rp3%%g|I)X zqZo_w7q-TLJipV2A4hl^G?uWdjiZ?u_2J7=q@gB!&GnaTB~3CbZTG|9%fMKbtMHXN z45E1XZZ@A1!;e6OX`Ae||8E>Fa>N?xeRC| zIe^2RilLI8;37##4VbHdS0Hm1hb}3kyM)s#DvU+E{E-i!-)4wQU| z8P^SdH#q_AVw%teDqwCp8cGl`UAx8@`vuNK1yjp$%1Eggmq;29C}|EpVS2S{5cD*- zmTewP75}2*a#abC7}xH5Xm+wXUMbIskvZV+aly>gAPW)OXtfL%*3sxs7(bEbhQA~Y zgyGs>b?Nnj!F>$@jih%eq!F!z4phBM@JzxF?8@GyiJNH`s2AyU%Xe$q+}5lciC0xW zz|4ikMGPKq8V@!5Oq%cirF=<=9dA56E!vVhKJM9DEg9|6ecprY><9aOgi#raaNp~F z-fh*f-PHTyU=z|VIG$eQC4Z;v?_fR?s&oRTVv7 z^0gXO@af66hC+(0OfjQx%T+M9hz9o6oU6(0ybOe{xrP0X^x{m7Xwtq|7A}Zb3A2hd zE-ytjQ4KV6k1nfLGexN(sVJYWJ3(r0U9Zo_Jc`zJSG)Vvt&e#7oP zB#@1HRarJ^*UvCDK>l+3vmhj2y(!OZ!B#U@wT_OiU{uO{@yd(U@y@);>DnUfi0a1x z*%w9|7Q9U!zX9V`thmoZ){w(&CNvnG+Z9jb%`|#8X|%q+jnvbHm>WD9@Z{G1@YZ~W zLSBA!r>r;p+9*r?>RxL^MRC3x01O@@d?$<~W|!qj?it8#YE5Zns~Tf>r&IPK*mD3HKLO7(Qzw#ZU4{Akp6^ zGcvAAf%eSkycJJKajaEog@*e-^q))aQ7ds>iK>|`9H6+Opa$(5@?PKTF0|7MKxC55!8<>!J8bLu8U}8NYdUyr8jzsuqbVE15sL|qI&Dj z@J&jhWPy-X_;4oAnvc4=E@Fy5(mY#Yh_EPK&gysXy2P7OXaB~PmM#b4j616$Kyy75 zDe7Jq`%?Hyh!kRi>b3Qlt3;2Bz*fCp*Bo0WJh3O$93SHn)|Ei^BSo{P6Yb`V&txSW zFa;u#Nw@7~mxtf8E1^Og>>fUd5?p<*L&dpjl)Y!`>sM_3w3BDB6uXGg4;{hB4K{JJ z-yM3u!YJtd**$&vA$e3u$g$P+I1?7)uh*QE|F~RENyn2bb>LbbBD@?xPI@*wqpQTiiNO3hw z6Y;@DUtYtB=G|qB7${LQRsFZsSp3HiO34b3#6mm*aq;1J>b%7av##^kH!G)iS?)xx z_wq)y$FtTGS~8#*cy#aN@7@3$=78EEr~(w zQnK6!7jluGt};~MKMa0wKa6nC$P|YeEDIztOY%;9X<6%Zfe^I%`lc< zq%?G+C~NG5Ee>H3`@VrRZ?}NZ5WNqmdyeCDR~tfk9rf6@56dXe ziVYwUDIcOR-+PtqZye|^t}JHZz9+DT-Cw-Lb-ursKLYY^ha|r#Ck<*%Hymp}`j^Ub~Bq;7*yFsW>1m5MC zijgdn`L_aJ|FO8}Wjfh$WWQRv8Z(3R0fX%KX1Cgbvqlg&lrIWRbf?X_P?3RV+ti|s zleo4l^3N|UDFSTGfn}yPh>bl%f1Uy$KZX4SzNFW<(38evD>y44?D}ia|MMbUpLK(Q z<0UVcc|3R#n!>`~bX+U&;$l_U(IM&i-LN44clB?$l>3AUefwj%C$+Uq7J0NZ8eb^p zT3=Z1lo~u91Q^@y=o~X#QlE%Bu*k2SFJio)Jqu9(Ya0roV@d(K8=k*_(;UU=rx7HK zv1c6`S49N>a}ODa=sSy+@JUwO%HoScn)K@ny?I~Ci(8xh7J~=S9 zx7=p!v?2p}8(WWdFZ&-5fHKKZO38xw@@&K@W$NaBk!j)|d(E z*HB^f=GP4L&|a3Iz7Kt?Pckh!e;48l6v^Mk!Sl&rg+k$A`jfjEv9s0#__O@^@yh=| z?jNK(>3#upI8hn3gV`aYDKy=!wd4zfo24mg-tWEu~fg6?zaq71w9)>DBMVLywJ-jJbu? z#ZQ{M*-naBju)3QK_vr-*I@1(lrkX}N&lNW@xEONFk2*sL7i!dey_JWT zEBM^o7@+Z|%r;X#Y_1?AbmIN}wXC*wK4KT8$bZ%5#Utt%f=Vtg7X^G2VmLc^$i%=j)8R1_sLw*|N5X8*Cp{ z7(aVy5B^4WhG;~h`z9rR6SaP0R(@TbcaYlK3BnJ*jAX#F3Mk%i)jZm^KY!0RFj$Cx z5L1xyHG1yug&n?y{ulbYnArHQuEZpq%q7S%;+Yk(c z%;NH;pKkx@%%pUMFt7f8By~g7ydCw&VSU1hmob-)PHVd+$!O=j*5HqK_OLYduz|g^ zlrX)kZQJPA0}>b+ro~VMhs5}`$UM=M&niAcLH61U#mSbk8ov`!=11ZcVRT89weha-*w<@UT!3|q zISj_OiF1e3>R|(DdeDcx=xqLYrQ(M&lWrxVgU$C$8G0^#2s>)j&`_IhVMMMgeNa^q z80bo-_4@;RC*~;^IG8M-(|CeT|K|4QM)X`l$xUYOCF9Nk9yhWMq^+x#?*wx^=WV2! zcJ*n*Vg$or;P2oyEpxAUM0Bpj3eVy|cQoY1I+alUwOnY*?AAD2qjOhh;(s7yw_Go^ zMRdZC+|KCiS5xBxkDCwQy(BFfIkNu!Np-6lMidAd7QVl?g&+H4Hn01e%Jy^tZSczB zw(}okQls@Fy~g$0I3nRkwNc&C`i_lmeGe~0H#4a?EOmKJ#nit0Y}+B#dQU&=VX2nY zrz;JJjJ0P*Ezg!!!`@sGIGDH!<8C2QYcJT6grl^Injn~Jjc@OWt&cnGX$BbR-#A*5 zUk7yxAQ{LVY4UZ3YwR?bYhvldJn#?>DTt_MsL^%#Z9luppe9vb7db0pDR?B>#1a}moyMIgY-`E+(jjMsXQUA zt@=o&clrV+E_D`tdyz~?$_BSmM={Mc1gty_QHM{TLr)s2BmM*3eYG!?#Sm{Vzd!M% z@OtEZ2xb0E)%6y?X{e;Ys;*Vx{1tbT`Wx2=^PI&{@bI^_i4UVde&<*4 z#z`*Nv#3^RN<7h*=YjZL0%>6*aLsm|wLbC}Lm&7u#=PF5 zLj|b9qBVcRl_q8Vnxt188fV~sBeUo>X>H_JPhLG>VCS1U#xa*hsrQabPuWs{*s=Lm z=r)q@kA`5dTZ)V#gW}A{V3l8Ke$)*@l1a0uD6kMvNQKx9vJq+2c=*H(b~pXD1ioC!J>ia| ziAxp`1k4(wEeOaJ?AmdX|MDsRCq@AGwrdL|Y3XA^TjRwfxh*Y%kPtgrB8cA%B$QJj z>O7ai>!IA*h6cEtw$`8JLqWN(ysm5$#nd{Pb#X*-?aRWNU#FGR7@=dECVou^%(o+B zvxNrmbl6yu!&g3l7#atH@~HE{EK4FS5x#72dP6BJuEIm~suReL?LlBT!Xm!K{RBAk_=V2eay` zZ%NE_iF*-OtmodSlUO)cZa$k4Q(4y+I~8_V<$ifEoXe#Rn2-a)OGIDDhDXJH&3ACS z^6jFJ^tbA7bXtU&)npz>v$zj{z3AvF>%V>idr{94UoBABwO27`)G?Ig;KegFx*s%$MvvE3c4ArLO@Ck zgx72cdX3xr@Xy+!iCXD34UfWad`o^C^jS)Xr~|}Kk%cXY8q!08da`rgj@JGSvcA*# z4vdmE`>J>Y%bV9!YMSqLSS&TrRi9m|J^kvf^~fh-f?1}vyswpTT)v5H?=EGR&Q>sO z?G0hu11~rcSB9eE*NuLcE;z;eH`5j_3U*Zbb$_6n!<7sgjiolMr;mF-c|4Z?=&G-U z6h{|)&+OaVDlICHe1vOw+|FUbLO!>)c??ox>|7~=c~#@?C8`Pg>&~sMQ|Yy*5)ZxK zIQJ?!5BjL)!BR=R4EqVs@KC`~3v9u+z$r&lA3q=FW^T9237z?8i8Y!CuiYFY(1?I1?)maqBnhu2E%N1ZGzWj$w35yXava^n4qCHBj!H;no{JQyS z9GO{-59tmov6v&$BpG zk`F^{U&*eA{%OtI0+_*4*DPr6!Q>Yiz6b`m{VsqR8CMLu)h z#3klU#l#W{=E9nyKfKTzL;JH^+z@!Zt8vn38(8GQzZdcRN#jXZRVM^_-B`ihr>4g$ ze1Z4V2DkOE>wPUE=oN?mKt8D9wR|3Bmtt!HG{avc_MWF^cl2Y#CN9Tsfj782r8Oob zw03Ua;G}jU!Pm4@?me}>Nr-J{Vz%JXM;TmnhL8EMgH*T#vN4zMZjbBLsdhVjVt1A9 zalG{?@1di)IqluIdf_4ed`+lC+By_<8-f?0CjbW`G0S>fFx$3q(DX?WrUC{x4-%Ek zy7;4=ntpRfYrbgiz-o_PK82cr<{=^pF!u6l#dh&e-?52;C);xACf+~MbyYF|-cGAey@0VKnXeJYn9aVyY_oX)&vEq#M zC5Me3R2>ht^tksRknz@$k}4lnIkEph&M6)I)*|J7Poe=_kHz}o-RMuhuiQLd7U+Gj zY`bE;T8R2yz}m6_Ju-m~x?SwQIXP7hA2?XK*qkO7_d8~ZAHxwMdXW7CqW{@13f*&W z)fSb4&e1Xo;mU3slntV^$;>K0KFd^XkQMgAOC?Y#~s}l zB5;FWVOR*dt+by%%`d#ZiE7nfqd#kBfa&&4cNrIH33wjZiHoKy^A>jFkMqaJocs3{ z7Z)N%#~n{r0XWzX#B76 z$tTj>&@T;2UhRsbp7)z@hibv-3|1=TRlePazy6cwxF*wViQ~g4BVw)PfNtJQTtQ5;3_EVSPht*tPxyQK>u1x6SF)^?wv=Xf zcGqQ{wq?m3lm9^MsD?lY{~ZbIm&;fG1HC?dKUFF>WgXu&5&J_k`FmdAlt|b%j-(R0 zWm5EAi?h*Nx_76Cd_SMbDv=rw?Wb>)86JFZ+O&SMft|&)>ms*}$YSf1kK`IV$l$`z zwaTG97TR?)y(39J;amF+tVj%d6wSGi6sPSn{g9vZ-Xorh*Y1JLm&i1ZThU+*iu29a zBF$arED?iU@8;<4(=Axf&f`k)^m?on8QNdH4eN=m8FgNhvz?br9T%Iv{XFSvA48Aj z7Ggi%L8^KEnopHRE z?mbcPMM8Q@eVA4f@beSJ*e#0O-{aV4+;y{rSZnB%OA;kfG>O7GT)mg0=einE{<$`K1u~hd_DD$b(gReEj-@T;|~4# zWXH{`=I+)0oWwB=gR#f|fs&uC*Oa~6cfY@V+Co=0eoc=&RC`&>o5>XTB8%_)F)CAu zz%%&oCHyCgeaX>NF3S<2s=!KCHOtn*h=Hz~CJKC*yMlVQVpS;Evrz!MZe)=yVg>L+ z@gp0RB)X{t%jqIqL$-M$2T}IEBHwJ~SMdmd(GXUf0{~b}Q8lE2@5h271ZMi1=3=(S zl4|MkB$SvDn;Z&*GwIHcUUbm;X8ys-NQlIK)b(b=d*;7CZEQ4rux@=d{)LOhw#K&?VndN5 zl6THe49zbqfvBt-0x(+Qoniiq2W72DS^u(bTe}3dU6K~?AHzn;*9j*#?&MT1BMdmJ zqGyQuGg6TQ^v@mJ+x-{sAZj1ug~qeMu{2p^w9$jGN8z(MVmf_blVf^eeK>8y=IjxX z8HT}l$(O#a3Ba;fNd zIQX;{-21ZqRut39a%;y6bRumbjfJ`WqC7=GCVFaiB7e`3q1l}!ePaJA^oowBKKHxc zdUjj85%~&1`X|`gk$bIvKlCj^9>mz&cs0&wwp-ZRw)%hMtF6@`5!t%h)e5p}_F>QtPa(-z}B4wp3`AL9a*pR4*)!LYuDRLRE*Z_;32|=N%{m3bpS_b0EI1;+* zqa0V%3H)+q3=@1HlfU}X9P`A`x%ns;d|{x;0$Q~;rFQ&~OS&}CLo7Xjees)?y48#7 zLfyHWyj@cO2W$?}?W`ow(winJMCj+(*7N&k9s~aP=^*G@;Br*RN8l^F_Toq>Ob4Sa z42^+iDHAIG7cfM{?$WS&_I#j+q+3yr*J1DPM9&_^S2~IH7D4)R6$m^OrE<7;OZ+G3 zV>t+a1gqmCz3!DI`!GXYVVRNhjVI57(iVwG6K-6Maujxs81E|k@kX3|Tq25#(h<@8 z#l`AX2htFZb$$;a(@=UZKjgL;+Yw*!`FdW>yn6i1_DQDN`7diX2WDJ@4D=EcKkOPK zjq|#lEQ_zcVBpbY*V7~}7UAHKk%XT#jZRPeuWi`6?mn)vu}P>d*zmcOdEnji>0J?y zJ@*H7^_)wq+?&@P0^+tm&hzZ9E}h>E^JgBprjXPbUv(fh{TOVyS_M&gibxg-qW{_~o^(G%0t^GxEdnXxC=<@@Kfv7ppCsZ+I4#2zwgA zrz1IhgHJ{sw_LbaZmR-4j+D&{-XvF%yykTeMKhvh+GQ(#4e1JV^_N}2w0`U4r3AQ)d z34GSDxa6}dJ=|C^zm!XLdrbq7Dd0nib<`N70YW^qax#oR-7evvj4zBQ`Qq|z2l&j1 zf8BT5vxF2_?!?3lb|W&eyRiv3-YDS0cIqDofdfoRX8yLC)2-tLcPpn!PBjw;HdyLm z(Z|L&EH2@x{zs4eG?4T?-R_RyTfJ6I*0KU$3hW+gE)m|^75`!GPia??NcTe`O%szR zYmInNSxRS(+H)WE2IdV3m2flEKtyVW#O&0vUMfFGE}V z+|73vXZm{~7{_)_Hu~%1F!*pj`G>Ke;K!jJ`C*xKymMFL^MwZnHWr3IbKZ|PM^5-X z{ON51V-7OB=?p4lyx=;4^@CV_gqgt@U(tr}1JRwY89QPxybEF-Cn+ ztU-T^2=THjEdXiS)aA>h z-M^!Osm!mJeTw}$Q%-9vvf9MjD_ZbeR7}wEu=NW!LbT@pi8kOING`1)3&c#L{sngF z{$Rm)jkvKqUM=KeUp6Af>$;=>B=c)Uhr%6NS)*7=F-nW$LTIHVdQu3iRX`mJGYd;Y zVOTu#33W`8%y3#H$fQbh+d=*RarM?wP5*D)|LE?4(luZkp#oBZ3=m|a#{emjlp5WF zbce)7w~X!%Q7J)Mx)qd`mJ;;yo8SAK-+j(~4(9;paP|*pdtLAA^?W`aO>5M>GOqw_ z8_vFzc87b{wWq6hL?eqz#|I&kY47ryYc0&BslSgn2S@xA$#9D>vz&8iGhwkphEf=1 zh6rb5EYC*_Ufy3V#^!ibB8MTX-!IK<7 z7T2%lovC&0;?fAXVZYLae0lX(o6mhZHi4|R@s>4meSvo(eI50c78E`02`HD9RBh+H zt~CxU9cX+E!Zt@0&#{F{sKN7B1dk3#VOvBrK)dcN?R`zp^04!nDbYy-!0eN%=hnJbbeB>Ma(TN4 zsW=)N&uSM1KOh3>wN$cN4L4qjR@_g%ljRBBQVS!?n2Q>M zlIur8^jKqdcgI7Uk>!A5MjP!Y>3=}+O&Bt=8dQh}i!v3J;KSY2cHvBTArdpcuMu@Z z&AUQ5t*5HAX|ldPrJtNql{<)Zzo^Pd+p`}T{cOm&eFUZati(tlUl|D$m`3-sC#{~7 znff)Kdc%ps=yaW2)(@v1JbL>2D86Jxyn*u@k(`c&;xFG?1QtR$8c81z_t`S@d_;pr zeg`rofj-hVF|CsI9pz{3J7G!ljd~v~)LUH@&PnNeJ!|$V+D%(Pqje$N7?nrA4b)ia`Q!o|IkV_xFDu#mR7OJ$R(~b4YZxVZ-@X+KtfAfJxsy7mg;I zcgeW7$3tAKU#Du8#tfk&5hqoxBhj?pe56R60LS1F!|-dYa4uQ@K}pr2I?6SDlk94) zALxQib1N=K4MNJ=r_7yGB^&@u%mp2O4jGwZ!qGkN>b)rx+fwzBo*FPMn+zPg?Q9oU)KDiZrs*%Lij^eT{ z&KUd;;Qh?Eeno6D`XGMCgQs;PP~wNy%U2JSUd1yxD)DXfo}>c4DpXaxsj(JY%9C^i zB}(wD4i_-v zzoSk!8An`U$y3m8M>d=sCe6%0VvhsAXlKGOM^<@z^2zEx{rAkKzhnwQ_ji6qVnWz; zQ8wb#*Smc3+gSd1F_CHaylu9 z1zwZ`iFoL}@{)4qy;LrJX>;|7`xb)A7SQU#ZYAZ^KYA8ivbTfsFOY|#ZgcztV1w=k z)~r_D;kLnJo%!eb4`&ZdRHV8G8tIp91;A*EkYrhh7Gvj^A`eDdCBIq@GPE=guz4)% zHqm}k6^3CV36%tOWT(e#tkU-zSy^2l=&>?B#0N!dOjSEMZ9iG41T9T6mOxljy|!r2 z;VUd_tF5!)8%yxxW0gjC8mHJZ$4wL$k-ge>e%R}`?wi|=eP981j*u3MY#s@XN{RdE~Zw5D(g{9VYN?I{u!DT^S zT%~b+({h3F7j?YqKikOE-KvA(tOQR|T3QDA>*n6m*1dl`XHa9F{;i2MxTNL@pCTT{ z>6%g(hDwps(mE}jq;>=^#T6|k8OP}sF*-C_iwZERY-vZkpo-rThx6r!sn5)L<3xda zCL~aJW(oVgHpPi+3n42hXu4S!SAjmh*)JxkNvpM6=C_#`Zs?9d<`$$Hw}=O( z-!ERG40|;=N1v?Sr!Vn?c!oo(C-W;M@E#MoMRFrf_eOX$wW$4v(m7$1NB+`R(SVok z7xUBxKqQG1Y0ENCnE%wICME2piKp@xrF_&RkXb0tNom)Zjm=H>5u4pF1IEY{Z7PmE zfcnC8Q$D8HdC66qN*)W_Nc@`HT;)%~H(nb~Lim>TE<=2fo2NuB& zP?{N(+P|1d7>ga{KczMqg0db>Mbh&Xk5c5$z<)TDPDh54I{YJ&kR(~^=OapDdYAI@ppLAgJc9l1@Gr@H2^%OTP7@X4-RjO2McU_`gM zP+ngpiMGWUzLqJWY$QknGpc5EH1*2hph>a|`{Xvzn3ty=hL_EL>)d5B4t##z+>Aa` zMpD4ZiPN?M3`y*49RXXDPAv~|HghXj7GZD!A#oe!(Cbe#G33Go1Hh632ErEsNIi2_ z0OJciB~Z-nrYa$p89=cB`^OZIo#Mj>g&=y#)xHrCXAnkvL$g6pKYrar*w;PN+i15Y znT^K3?=PO4QbLt=J$d1>%aoHbTapU2-?8F&x&r?2!@o+5kfkdA&E5@EiY*fXhNLnz z4=LD-Jo|oU!4GV^GFElc+>ix5CvEg;-)!0?fF5F`Z5;)KZiO<6s+pN3(eJ*ksQO09 zJ?}d-vkkaAR&=pw(B<~kfkm1+Uf#d3uaaS{?B-!W((~U&%#Ifam>(|dFP=QvH5R4? zneg5TNNPcT#;@^@Xr8xX*q^)~Nwfjb7ZzIfXe#(F!stddbV(4dqH1^{mA-1s8XhzLE zFR}}rtfl5PzMn~3E24iHJGFY5u4*_fVjshe4g&6;KlIZ4Ao@&d`5P~sm;l6Z{#JbP z8FfUmzQV$M!E@9=lQ-H8ePrU^#=xu9Nr})Y`o%2lLL9>5_>d^2e9544_Gs2jVhtvd z!jw^7;pZ|pLNxenuv&x@u`pVQO{KRLQ2bQn{CPZtv7zGG?s%Ew`5ZgBw=Pzww~0$s z5C?1!p(F24*N-vz;cZ1!lTebmCw+-$)_s##{&=U_klWdbiIV7QZYyKjYt5%dJ3_-RT5FecdZ}YF9?z1 z6{NsKN$yRPB-x&4Nq12PB`cDO-j8|Y2NfNKsgPuM+)9@^I(3zqup~Cg5ufjq!9gGQ z)%$|>E9@)yAH2daZQcxdLrA6%uhsDmj zc-_Tsd&`-HAem&^UYLLT8N37l2mrAHktHSCHsje&4Y)r#p5nDAW{E{{_jz_kGOnaIzK%wv)P|CUay&d-XrY;u6}~1y}r;Krc*Xi z+RZRq+mbIIYZ&)43iZoKu%P+2;4eA~U7yA_-{k!v&feqTT~wq!&IvAQfOmDe&;@M3 z5OkNw0B^ZpaZ99BDfQ=x^Q+UTz-358T5EV&2`6du0B;m3Vr2>9s2Dlvi8HtJ=F0v( zYcmh*`z%$dLF1tX!!NY=C=)(T~?3dBV>{nCb#ic znwU*Qkqb^h07LT`3nMKoPu>j=@@joSK+hOy?<1Giu;VzaAKh5IM{ejrU1_lU{)?iC z$CA4?hL;jP>@og!s;IL~E64ooj=e2+q}FbRs|3-K!j1yLH#31z&&DKLbeRhWWSv7y zL(2S0(?pVwsr44$9|XFIaV-9f4?SAES$2`_@zXW`#I=Y_f4uXB0^e$=yGEEDW48J9kkBwzty|9a7fQgz|> zr8N@er8Ag;QtG&WC{#*(!axspTRoVt}?cb^f`(M6@IQ zc(&70A?x@rkxi~qtm`uD$L1FTo(Yil2b1So4GMY3rQF^&GVzQiELy$UcB{&W7octa zOxeQVh+or1mVT;DV<1`QmW1~Yhm;vfJInK`wEMeI>$iNY>!T7!wfs*MJt*0^@Q_z? zVf{gw?Kr=Phz-A{I5g;oEf-K|k}~H!J9bxm#9vO4@r0K4FG!?5x~Zr>4I&;XGV%EB z2x6v7bpvR=C`>C>puXF7iSZLqx!R_%rhVm@Q_OdQ#AB@3KZg9Qe2*#$)sK$XG@%R04uT~$5G9jS2XLY zGf&uz5AbYFOo+oH+TAGXU;g*;JghY~6VWvzFK4XYa z?t2+P4cK&_jamsNS27XLz%5h|Mnl=U$Ay}dKA!X>Pf`UP20ROyv8!eH+(vGy`dsnE zrVg=foM_n=yWQ_867tDuJj)&MtGt0nD5VS+Fh0v@P|Y-)uwh@t+D}P%o~B2VDk)hM zu&+`Q>4}FcA^CFF2zc~8@#RKF^?X#(6QR@cvyb8GI4rkTIhPUJ7EZb3NY52n60sMc z+al)20Gz7#7JRGUNc(7UTCGzrxR01Ze07`(2*5NU{DgbBek zKb91Ni4&FHApUnMk|32eNx}Z_WnFdqpWk8Z& zrexzMWQaaS_!9+}8U!EPB~)i5&KrY9832dw`{E0|)lKWf4x{*pke-sbeIdjnx8sK^ zgB<>M{Z#g$Vw|v47L1Ln2@%ERzP3&St}f^$ZJwuZO)p)6Q^I*+r}!2UaVkJQ3bTta z$ZEm+S^UR{GCN5$kunA^bSdRJZ=$esyC57)=dPFa)tJ{5Kw~o7*5FD%MD@ zD@cg(KRQwwGg*DOVphmlFCo?aVZ6yb17eb8?l3}$DP+VkGD_lsX{JdEi#O7gM{XI9 zTG9yKURhrS1yvb!H}$(=#Xeokv>HCyc4keAzBY_>guJlDduqPGVL#;e?e*=w@i0eG zo}EJK{dp4(gl;27hJ|z(5PLoCfJ73INbsvXa)MPNrxu)KARs6izdDAQgn^4eP$&1* z(LXvQl)lZ79ZiDJi@@>0A2z!kSqJ*}Lo~iq-sDj7pI?@|4LUF*vdMYaG=li4Bby%Dy_6BrO_Z8!`*PV zL-szYsPR6MR&-`0yIrq(l4GL5{)dz*0lRJfM7Ql1E2i-*Uq2bHaSe|T^SUtnrT4nz zxi(T-UmNn1h}MmM)|a?^M$!2W<~E_5D*gtG?!RNMvpQnT&R#69IGovvNfig##!@MN ze(bI#)H=K7v9SU+tB;f-ML{U|{{w*ka$HlIChZVQ4TpG;gZW+chD-Y0g;C<{wi?D+ zypXZ`zEl2T&=0}EuiRW}MA$810B-NEcRtI8b<@yaJU(rr1d~8QQvI*JaKh+_u(rZX zSxn&LZS0eh4M(WQ;idqdgO@&9KrroI!Bl5{tqMnnSq>|^&_}I8Stobh+I5N~jv+BhCzFQ6M1%KaDR1;L}`qD z5z!8mXhptxS*pdpi9fKnu);B;HdABVinen}6Vrf^YF}{x-R{oK(UcUmW+fM+fPk^> z+S};ilGo#_E;2dRD-~8Ot-mPGla(%kvyc&Kf_AjO_>j+nvx4+Byzr(iLZl)7@0g$3 z)C7h9Oj$(zfUOgQR_B{@wGaW-HcuKWaiQC%j>5t{m%dWnZ`^D*lSBi0xz|O&TdJuA zlz&TC)Rch=zvklbgtLZ=dVw#Cc9dp36O0ng!N-@}iux85k6cV`+iqsSvT_0@B}v8a zw{Hv%saDg!eFmv-sKNLDPPoro*A}{)96?CHUiOb{kg5hMqf9?e}K)u?xxlpqKn%Etzt6a^h)jO;?auFc6t5|tHqxG zo@?q4s&|(XHymfpptF2(h5iq~%H{Z1&!jikv{Fo_5eFWQOGtHO+fF}9@cFc%WF2`w z!Xzft)1AsgL5kaCrtU;jgT-&v%6I(zx;ScYxb1wY5|2@`|ME*u)ov_2|CcW8(HCQy zXDO0P0dFGkSH-{Z>+o{u98**suuFsWRGPoruT+`%(BWV`VM$8NJp;I)OTx1AceZC} z|B5W@g7j^7|7xeRsnn8j8yr*rbv?f<`%PAb?@OvA+^R;u;awlrxQ>^RYmf^)`j-BK zO`KkFoYqdO>BnM<`(PY#xB)G~I=}>GqluiPmqXfeLhOt6@4WLW0~D41Dj})>vVqSF z>3t;ij9Xz9dRq7VH?@j$$s)tG5rqzVdO|fajLb|OcvRIxPFYgzQe3=Ps&6P7c%Q6F}@I8yJ*zl;3CN{RX5cL_9G!stMNRzQs7*R`-`nQ;5 z^?mO1GV#+z=;w@2scCrxCfs;SUZN@y0l&4X?2NBAq_Lz58Z(;4^P3G#fL|y=(-<~L zpX?4tlmN@Ip+vBk76>iAmrHSkHA|~6IhW%AZ+Zh}5nu_HdD`YeQ)4c*MxSRn31W<= zS#FLjkx#e^-2`@RIe$;~feVsQ zpXkW9z>oJ9wWbUoMIrJQca$T(lnn+v=02C zKmicCAUI8Ldw~k`Oqoz;lq?9?ZO;o^>k6hGKqr>opNYU$lO8e;r7`>mxbxV(z2BmB z$KU7910OgU^s4N$P=ZY+#$@6np1|vmgBD#0$NftuuGAl# zqXl@^wj~@-vv|(74|LY6IWLb6j{I1z?~FC?`u@@wPfl)3O)dGm8(tDOv(fHf>Th|m zYDgCMimLyh1{>#gtmhis`S_c#`fjGf+4Wr1K~Agm2hV}K-l>s&L*U3VbFT+AK~y2l z7t#Z?OD7uR>%5JaB}?hy!@1*O39#^S$3`+w9_iBDy_VOb_ce{Wk-mQopR|I5Qh2zbw90Ad68lfSPXc9hkKE+qYwb8xr1o~El?Bh9vsoUDD zbvaZlp@I*`ef5@__Mca6etPV+{=WAWVnaUuEE+m-VzF4G@?pwI6+O>X`^;7;bNX|f(n_EYy+mo@%bGsw!)6c%RT@eIL_H#yCb`u+*-x!lb3ST4Xryk{@8aVsQ96$mh_}!U4WF~qKRG$SaqYJz>g0p zk1xiJ?v**?K5oP*CE7TrFm28?RyZt216jTxn7==_SYr=}b1IR-;Q0BYD5D%gw^fZq zA@QgO&gs1jl?b(6e3B0;9v_L3VM=KNk^Y)^qm|_C95V<_!0oZ0^6z4thjcN8$8{z6H2xg_(yv?m~BPmX8 zP(6(HKS1UWN4v#OGra~*&LhMWUey@};$ERd_WK{w>p9qd6s~MYOVbLN(9Qoq=oE`j z6lG^S*=tKXMMaoe3A<1e?^jP~{W)LCd~nBHJ(#A?+{FAbNsTOHAWqkMl)Nf&-6#Dp zz1rA;SLpcxfKW#PGQL3NE798Al#68sU7@^h;oAyNxaG3VE20`Q43TBeUTofq@>Ea2 zQFOPZDR%|JLoG@OzZ&BcxaF83hT>qlA%mzolfw}s(e%%^!UY6x6c_hvb4yD&_d@)e zOPC7r(m=TZ)u6?X97?g@@-p1QYL0ztm;c6C+N&7O7x;p?y&UDumkZzUVEPYzNR)an zSK#3n=DkL(cVhH~*EK}}YDl_O_6GuTZ|YhxdQ)Eb%MOQVx^*+_#S12zzhXJCajE4> zuNEli{%?<-$3fb&Cq8!;x9AsG+I+cR8GD!_Y{m2ZiRvsIZ-frS``MblaX^38vq3*C z!6SC+W)yGR(jJ~}0~DgIMmzkzI|aRvWCn@p|Nj_0e4oBLWI_G2D4;ZeNzJxY|dDp_@6PCZT5=T;i{H zwM~Js=5YAPnb*AUR~i% zZcI*JZjW$F_FA`==Q>#JAKulWF`aoH5aa5cB+>mMR!kvf)$?+y?P1# z6cVQSE2%;A_~d)k=H~s=>&DaHD}J6_OAW6D4ZfpuZG+wMAzwo*0IXe^xIIx+8)Qnx z?#_O-c^bAv4)=UVLHseLkZID81P+?Ndu}R)2J4Y(@zPtxQGiR7QV?>wvd}4tsw*M7 zjTKcNk@}qHCpLSiLd+YaSG8Y=cU+rg+}HI;wa=$vMb)ogx8!!WTwKg?<$v|nSW)ef zf7*99tp2B34+05O_ztKc4gC0ZxIqK`Y21h&830zb&|y9i_Zd7=py~aPrMgCza{_*Q z1^-{w27lVu5j+N=$wWa_dzbV&iyzf#ulNMswH6a z_dh`I9=|l*{E^d*NA&i?BnF{)gc~LqMg$1c{D`1Oub?Vh_?~K1YZ=G zkYk;I#JP*H74^+}s#=6eUV8t?s^+@71dsG!dC_u>WW-^L%+M#Eg~Vm>xkv`KY#%m5 z_~e&7J-Dhl48E@lMCFhu@Fb2=JaKezaOr^&X9D$emY>v~`uGAkK&BE2I1kM|#@@8DiG8bDz(&;;JvDZEfrU z$B9+Md zn_tOjHo`zuBVo|;AEG=%aqrZIeca_Wh7eT(7Nz6~=Ls*D#B7<-$YlVh3<**rM}>#_ zxv^6JFzA#XxysoHA_yg1yk4{1p=h)8gB%(N03=f+`pTE{Ny+J{66M?O`=SQ=5XzI5 z_PSwdlS!y0WTv{|3ma$JnTQD<$xRsHlhBC(aH7!Fmw%~IT6YSVwo&T4&uJKLiX9u8 zAj#4%NNJa{1j&-$Or)W#%6a|}_Ov0iu@JjxCh;J@R%44+qYZ^ITXys2SUMMZ2l}3T z5skPJ1zBanj{FDcM4NCewXOdrRZiGcIw*x~ykdC;3vON~aClIZ{Mx{sN@Ga&X^e}o zIySxyJq@taIm{kE&S3v;b}#tyClSzRbrxo7iOc}}D9I!LdS&=d9iT;F*ss0|)EMcs z?5;l6agai%Ya;eEU<3B*;tEZl{o|LTvKmBS4hz6srougdYb_mZY71s=-v7X~R$YZKs5(&>X z7BqHQ*;~7jn58tuNXi+8U0e`>#}UoO7RAy`RBN%NX{*z<2F^1@q^cBZ*)p?vOmPBEtH+2GQIX z-Z4Z$QTOPZe2t830#)U)$@~1n!O)pbyYHQQ`@QI6ry{=`V5w5-uq~8f^hsPwF=hM& z3=yY}2B$LmgbCAyxufw@mJ)J`K%h)kDENDO_Nc_G2y3qU*RAa!K<+6p$Um;jquu=2 zv3{Vv{szsjo9;>e4#}=QJFN}tavpit#zg$OgB~-!rKRT?BN`n} zA>2g(A~q2>qhPxE-kbJAGr$mD%d|cK^AGoR!w&hZ_wIe!&CPxP#gM%L@zuKuHWjBS zgG;sHQo%8Y>0d4H5>C*mC{ZDm5AQ$?KeWf5&nj0*hkt#(QgJtm=XyIO#zANW5q&$G zCt5K_UwZeMGKZWrpg^{ALI8oJKZ=BcFcB`+w;kR~@xol=6b{ktV$+UmLGela;zOIY zm5OqW=`;H-;wp}zm5&hd_aCUspg?n-d?G|U?4;2 zmiwqNu7fpw_QSq`{I*EH|A3=ko%0+T=e)k4X}MrW`n{#E^v|1-TOf94?%ojxB}k%xn&yPU zH>Zke-V7G16VQi`lng88A@cfzrC>L6?OURp@#{{lDi1%*pjY$+9C5!GHU$xIUE+` zXnRU+!$Z-@J^GXze)yY_X+*%!M_e0ZlqoLfSt!CP=|ZBN3T|!Xj!nFOlC9cfP3(rR z_Z}ne_=s&;B!t}Vx_A-rAHYxZwu&y+$7oO{K%<~A!);-{yGhrJ+h+e)wZz?gUe`a^ zrB97Ys5u?l@71n!ZlZUnxOi+^=v7$^Irm@In2WscUDmyYo2c_IOgnkGwmdyDVY%uP zF)z#nceiO2Afc$1#XdLZO8JS$%ir!)wt(7okZ~G!S zB}kyF%L*vxNO#OE+#R#=bNSD==a3(XvyMY<{y!^zqgGt3J$7*d`rTR%w(bGzE~_1( z!g}{HNhNszd@lZ{$JnR$C&B##?F8E5@s?STM{sCpp%9!;s>U@=)a5uq$xpnixiJhl zY3ETRWXn2JVBT77y?L^Y{q)>)qHnX0HC-QBWnM?q;B|9=Zrei`6L&!dlQVEckk7qMYKPi08eLqK439fINg zEZ7^Uhjhlzeh-JhYjFhOe9dBQs-W6FDg^Em^YEFLIP|6GsefASfoXKn(m6{@8>Z&K6 z_~OX8>oJGp2?6eLeX&|anBs8D1F2pM`IdWpscJb~*jJH$#-koTwu>R`XeM z8@(v=HrBa5Jy^w3RH`glyy696`nzcTYr~T7@jfiyE0G`G*@1^}tWZ#zkvkXLfLm+$ zyk=M!sjXCfed?2*@S>{nt`_ACXs3P{Y(c-V%C9mehTk2*h~ub$3l#!yBVoPpP<-Us zL?g6kg_(qtRHe2P*~6AaP|}qp^nf2M7n3;HEzResyu@QGgnn5=rEU@zLXlR#fcnxI z&$H(+*09!@-WRKFOORy;I1|D_lz;?Kz8Z=zOX=;HM0jo0z(O09`!?xw zH#_+~7jA0ovsGNj;Ti>|9DG3Bvq!F1enxYbbO8i;yRUpQ>R%V4{jV17rj zb#QUagKSAW`3M!3oQk5glw(b_evY@@;g`|Kw_Rhud#&i!*YK&*e?hRf>SeqTT|NEK z`&oeSid}pz2apEPUv3SWCU;PiFK1OX^(5+NCBG+yxs0LGl%b8D+}-U~kWt3|dAq@{ z4g}g0hx5$gIVP3X_mMGc+UMfvgUQ?qTR!>n2WV-({m|C1;iRPj%?q;FrT0}%T~^aE z_e<_63-c0XR^8h$x+8@)ULmgQ_|m3+67l!v8K;mVHS)ekDzNMV@2A>eN0399IL06; zIO5nsT} zWC@8(Iozc8$?v@K_yr`(nLiucG|sRr552$3FRG#MPde{60!GRgH}tw_q^c(ZJbA9=$uE1=FY)>bo~ksPan;+X~CT& zBHb=1{HA>m!7_Up*ezov2iBf6a2BG4&0fChL4-gqXXJ8+&{o)iC$fYSTNmS6`u!PSt?3DsHpDQqizH+9_!3};p808= z+BU=aw6w)`(LDv@RaDR2Vn+nJtga>SEC0-MYPemLXYKA_n4U3O^kZoS;zGUSuL7O4 z#{52*uzvQ++iYoBbf9^Abr~iq@B`bP*Fl5gPdOn^e5o1rG7s{usoT((op9A&SG0mH zIrYWaqtne%Mj_iv%;nC0OY=yDCZt5DcjM^+s6db3Eno*>R-rUmcDQ6p`Nz~zosV|1 zVt?qy3uC$bDoS^(4?4aS9!E=$<2Bj8j@_=IHnu#ZU+twuHG7iF?N*0rr_I+8TQ-}3 zBbP(M3fK%-pYpxTu&6UJocij=4jqjsHFX9v>_MEJ`&>k#&p;H80WL~;l6%s>)4Od} zi*uCCeGCar86Zl6u*8p#bgp%qoYKv#V=a$1-4Q{#>riyRBf+-(`Os_U5sTy>gFo{R%g!3ejM!_$Im{s7v<#V?-h`wn^QGO6 zBi7QarZs(H_04Uslgas9*x@s@E#{mXVp^MBlkzM@F~dY*lQ>Q}{U>E)Z@spaq?P$(BRDE9-R>m|MWYobt+ zI^Y2MVC{<%wv#YsKO}3ToNNbo%&m=7Tk&_Vq#;-)Hsqr^7s94|8M%gTWj3UxxarJu zE98}Ph`Gk=@0&RcQs~`;)2BxDp!#zMRfgjRd?+{2uPA>0c>jG&z&z($BrDrQ!S8U! zCy8W5#o^ocT96m7#Cr^zA-o)j&xEq^PH!wKvaew6W_l(`C7`Po8IeeO3PNGk4Kw@i&njy}k9m1%KCbfrZAmI_ z_q)C8ce?T_@T);V0YxG-MlKEkuANY%$1fhFJMsD6e_#K1;0R$uYa?3b^Q7W@K*iZu z4;-K7I98TQm6y>bkA&BFQ(xViSC>>UOQ?p~28Gcl#7JgKRF(%Z3PQ3l{!_a0jGE(^ z=GbJOIAiuPyN{@Z73gZe{QQOzalnl6^jt{sTMA}x(%rsXqh2x7d%rCsTf707kf9@{ z>W^~To&7Vl?m{*rP?}@UwJz@BD!lwIKWgU3<{R=fDAC{MK_-zu@7Z$#O&3im9xUD@ zF>%Lzi~SEUYE>;gkSpNsHT#wBIHm!~0}*>{j)-bhHxhksP+{5rC<81_M<10^xuO?B zc2fSe9o=Rauaea$9tn|4nICSe`Soc_q0?0U>Fb5&4+AoxcWt|G@ciKzT14nJpg(i1 zxob_}V}5`BhxYaKT26oC^u1d0(YGC;h1GZVfw?#}yy5~FTB<){Tw@&1B=X+$VVnI< zGplpE-6El6q$B@QQTqYG@?h8eak^3nu!IT9NxrBu*K!{A76M}@FEEu)M_u7qa|m=_ zPoYgIlZO$cl;jmp;snL#D3JiN`{Gg@$uvtT;rV895l`Yv-Vjy;XLP4BZIouVWv|EZE2Bxpi65=iC+V-0zO5Tg1##Vca?=&Rw|N*z*x&Y^i?mkt0dFo)kHlN{#AGMdg;@Y}B_Eb+F1V59~E;p~A+* zf=KbvEH-}!MW~@J4vdN5r~pNl()}Dp~uebADzT zokR67jN}nv_NT(x+`1Y*E1sbe*D2*XkBNp1Hk2N~cBro>VfVLQmDGQrhYNssh-y#O z%3NL{i+jI70FrcB6=C=agAb5e11;2_9+i(eeu*WkM&2bQ_^k`(vWxj4s|){=O&Qf_ zPeA7R6arLFEYGvDr{JiNX1^`xi3vsc>r(Px!WHZnU`rtsOBsAUw~8hJ^(n!ej4sq) zuODFsWl#etN?Q|d36*5PW2PxpVOm?idzacXpG9MY0{n&^a$HV3X5iA&d!jcke0jkg zaAF#ser|r_9QoIOSJ|p%zDQJ@44%~R;=ruj4-607H8A#V6zbdThK~Y3`L&VGe{zyq zVl3zF7HyHZwx+jZLIwHwYO3x1cUGU53p%VIrgZILkpi>uz+i9dVEhFxbD{Buvw7pA zGR$&0eJbkkUQT?GC ztny8-kI&f7$@C4MwY!5|j%Ys6g0Ir2)J5e|J=OVP#qjyu{h>s$BUuFG?JSQvZnGA0zU;EC*`oUYOru|iKOVH{kHvQEfpfpS&XGHjI zRov=Ht88#2uBvsxF>_OyGJzjq8K%6xhcul%=(e&{$W5215?lRVZq>NO3moeJZCFc>c#+G~z8p zkKZ`1(>=a;gEh#Z9U%nv!#;gCF&EzX=tWsd_E7p&*t#*oHzQ$oiVo6ORO#XY&O=JZL4em4f-=9#Mz&CklAI?(CyQ^uG z13v>i$mXuv)Cm`zj^NoX`|fmX}O02`6<6iNEQG#>9K8o zr#0ygto3D#^IY_!dW@W|ovC6(+Bj|6cwklTQ47m)Q1{rt+ue>9f35a#un99Ux5=Wx zk`KRccn&pUQ8)+^Va7v@J-8ZFXsfZbH+2$iPsJ;7{A; zA>43v$7yEf|AN7WhQ%x`aDI=M!>Qp5T>XAIG(GP*Z)CLj6N4u6C*1BQolMSIUXuDC zhY6#vJOjQMJ?1*za@UD|KaM`Sf8!hW=ur=F**7F&aOLg^g>sL4bGRzmXn_+&n~`m% zaDv@@EbFX#82%%AzchO3Jq=G{ztNha<1xk0F4CYfCFq7Bs+jm6E57>BX`PJ2eKW({ z9f6F6A`?;rCZ+PR+ELkyFn56&tf1NptP=nHGaPbK3Bg8az>^9mD$~Icm6zfI6J=Ou z@W3mGUg28WyVDZd;*ghEJPG4}Kn%ML{CL4tkDoOxp5cFD3;W-=@&7D2@SS=oNj(_+ zQ8u_ZR^+ zAV{L9z29}1CR-+-^=plPDIx|KY2{NHF8jLtudw!?+HvAVUH|;UcD7SlZDK3${EVDPHXwksU0y|)*CBJK*{y; zgt^NZnRbNh!k4Er&;GdXeib|UFjGP_9=oZfBxK_4>kpvNJ3;Tl--RP!@JVh2KRj8% zo)OOW3VE9Ot7JOB7zF3S5XetJVK)7@U=vHijh z_(V9rnY6^-Dmh%TFf;b89;}eQePKG}0S`Riz>{`8pLc-VAd2=TRbFovzK)n|bBrLNE<-TZ5Hi;(!LVQfK&mEyL@PLQ z!_R~MkT?4AM=!3Ocb~Q0WdFYa{2c@0i5l-j>Z3x7d(*)XOqu8^Ce~9Ksq!R{Yd05M zbKvy4v}%K>tJb*V%xL)U5=2aFD<0VKW;%2<5>hlf9cwP0+%rcNVK%O`tj-}o_iQO= zDolPY{+m`U#$5~~snsh$B4(JMyM|}>j^t8ZhS`NS>_9szw;p`0wDEP3;)NX9PJ&`9 zC5K`}kl1*S5I!9VBbex~&b8FIsmw_v?=@!9?<&FRS8J{tjk~GDQlRre)gKTAQL)@k zHpy0C846s0Fbr$N0I7NHH77SYZZ zq9ag6SalghB^rYw59L~(Jx$gxmRz+HIl|ZzqFJ==)Bx2BBly-E7s4IGlBU}vpr~b9 zkKxv{t>P`TGq}8TX`fl*l%1-MYhU5MRF#JUd zcHZLLw)z}UAw=$>wo-pR&ayOITE&by^>&P0mx52@$pHFlYh`}iu<>b5tvO5?(2pVx z)r#V4G#1;wZ*VfMPX2Yx+k0XhN+emgcwP^V>(?A;nTBrqYrfn?Dqqcb#NFcKcm_3=2znO+9;>?0KOe_;rp{z zu{C!^9h_jYyIX`dwG&})qJyvubrZhvMF-D+Y7Y#*k9GlX#J1`SZp#+5yUdZPO46p2 zKmPzYSDw}B=VnO5{xtpuEO>I}?UmnMaL~eT9ef2Fd_vhFv^u2qD{Z&5jTAPoG`ORN zasCV9JKhrFoF&^FOAWbQz4fEQ6w|0Mq@G)i#)omG1qvvoTGryTEk#7`Nty(uN{FPT zN>WmyR|E|NZ$RKesT7&iQ)$Xl3ZN24B19T9tq>@toCqR<0Thu2Q}0FGI*KTwi4nCF zQMCaSxlY7;(n*;#0!KOmiYaodr2;|eMJXx*A}J^eD58Nuk9tZdpeaIROwv(6QAHF5 z6j4A?MHEd^9pWiyqKTnJ6j1dPQAHXej!`s{r5F_ID3pO9ZZ)NY8KXn7pc&enU3E>R zl{lh=l2U?n1jLX$;C!ghbkHY3PY453LQ?{kuVtd1fv2rCB27qvCTmd-0t8V-NS0KR z3!WKFiRV?DNRa}Zgvpu`B-86sG769oprn#d;UMk&>4_j2DV;W@bCouw=oI!ccYwGK zQM^+sMv$dKP?AaH1zC6jB}Az6JcSfeEWoLt2h^0Q2?>R7DFpi-RHPChi1n!H#cC?d zwdRmDCTi+@1PM}=kPS)FlAfgI5-F8C1rz}$Dexj9uMjmVC|Gejq{uPOty$kKyH^`p zrBmVes=)-4;sONfccB1-2D$k#nPaN!;qvF=&v>3A_P3=IGX#N1MEHr)fT`2yD=nR< zIvMh%q)JR~2E6G(5x6nVfRaX|Y7U!G%X&3BO#zlhlcgl<6rd1dX#fCiK&NS>B1JB- zF-NJOB<1?iL`KBWXJJ5!AZ~pq5_B}CMw9{$u|Scjfgbdu%+R6+v+Y)GFkDv(~6~HdJsY0$@@4Zv42t%WgfdmxVBBJW0YhM1F(85|R}KN9^WtCI0v;nkHCo@5P&%C)$}ug-U!ARTq9m}U;^juCFljx6X%OvMI4 zSd;f&65s*=0b382+tzmk;m#MiD1Q^WQ?4uVHm7nY(@lQ0tl}2e7*bMik=+HRQ#}6w z&XWq_8(S;HTxJ9y>V=III#lImwacpDw|pmsysJDW*_&&GDi*NZY11&7nv0Kd3obh0 zcdYHpiMh8?Q%*R}ZxVJ$B1z4*n(JEE1a^mj@YBydiZa{ib`~`gJq*@j%eVd!;iX-- zhw$p|*t{TjDs(3x=g9T^tF}0J?mM|W*?By(Jxn&_Z(iLvGA&V*>;zStOjl%FME>_G zy^2`ywljX^#sP~e*f^q~#vqu3(>ioNAxO^x@rE&cw6$m-T9T!y^Kycfz?0)Df=^A& za=MR1<_6uA%2gow(w6}QPqjsL!kkfpFq@}s58@%ln^tu;00vY9#Lv*oRYq}j0uuXv zq)}z8t1h6WC@B&ZDkr5!dKq!U-Hiy=DjRFoR-offjKh(q!i?%X=!gcIR!4>H#l|q% zQb7&)%*QWUqT@svNYK_pgzg!(#~MY;i9#L)vbC5ACt`f2D_CpZZ9JC#oztXn?V}iz z>Qk#vgbb9=A*=vJ|10LS{ATTHWQlmd+61Bx+PnnLzyO zqT1rtw-;`0;t+y*R=38OV{9SU+e9U8s$;BgS@L-C_1s?YUp&E{K|8_w&C z{ZeD_4nTU>Mn(XnkGx$mk!~=ADN;aMMuK{NYBL&ExxrTUcDGC{fI$f$t6ZWsn(7wU zR=28XxPVeb10S{ibn)SF!*R>%yxDuXmuUT+w!AC!#l5myU8xCJPc$7qVE+Ib<@oKI z(_*_w5>^Tc-1&J|(mZIzrW?af+7$wBR+igLa+x}8GzVxJ?OdOY_!8sp=Mux&ORS|b z=x0)oGB+N(SDWfQb1Us0-=O-7aMoYhoWZefAK~sDvEg0_yl6I1kG)+sunW%+Gc8Bg zk=O{WBeq+6g~OPYy36gTcTeSzq?wUFTEIMuoITIgI;iAE#9&BCFD7iGsfmwz?mRbRfbiB37~ytp5%-jbU%pWUM$&qj**w2HcQ0TH zBfi8Ja_Ivzk2**lVIx88E7PtXdF0+&)8>;LsZfP1kdib6>YzV5>zsetj|StQ-|+48 zc9-iUmQV_tbNoO_N%I|cu2+lT_>Kp9s|-%qwBmUkK^;NnDmqKGYACM1@HO!5i2O-> zL|~jI<&Jy{4ShJD68cFdbDnGJxF-3g4_MCi1aR&}uS@5?AaTC^;*Lbq7)Vp;j!pmq{ zNF$I^olHRg0Cuf(qJxNh0(@38@cYM(@V^*clyJs6;(qespXyg2Wkd1~i6g?lEUNv8 zKT!N;d=TM36_`4^UhHi)>~XsmsW01isY@91DM$$&=7BGSfD*MpPys3+1gSo5*LV0~ z`0ni+upw{5Si;`L_)#2yvb&;Z7&uP9wbG9x}jg@VrvN z;??bi^98qATx_JPQK1BN1QDUEb$WM){8IcDd|F_(*f(r=9}8pdhKnqth>)8+M%)ky zLr>;y)c*kfHzG#*X)V{;q4s@o_-gwHwd0H-3q-cY0mQ7hk|tq4dAE6M)bh>iLFNLI z6A++ePMoPL)3f$P{0Mhyclu}Aq#%&I*!~zYk+?t9ARi+K%B24Qx)0!2DJ$ac)zT9g zm-=rFDHEz^`i7D=>&k=785v_J-+D^)~9VLd6W7-K|$t7By4Fy!QQ<&bL@=x4sDTgIM=mRHL+ST z+%*3H{{RM_nwm>bvNPaL^pk1D-K)F?;jDKJ%sofw{XGm5(ut{FWYJ!nGxkLM3*C^M zJB&M3b#wiR$8gZIr$b>;E9{#15=VvpD(z*Hl#pD;u>UYoV{ zN&E>sw6cyZ?O94vb0D{m;i}A#B&ZL#Ob>cT{>g8E+jhIxxX-m#llv|^j^UvS^jGNk zG->8d73rPt*)i}dhg*xQ{v_>fmW+P6Sl${?XJ8fg2-nu5Z|tM^1zX9sJayWVTyP%k zwPVp!+1g1u_>urTwZDfvW!iPhp@4-hZfQ zJ!-l8C;kM`_+`#6?Nk*BNc}m7YC8V_ux;lQ9%}0w(-eGDUYa-dN&F04+lz}{DD7Qn zBl}kI+%;+WiwHkGDx<$;hrkm{46lqkR||qlKThGfpl))UJRi=9Bh75XEJY=HVxO|B z?Dp@|Wd8si_O8vshk>Ut+&C#is7b@Zi1Y@fPuVN*7W#p;Ed42vLwM;F|0X4 zc?~f6pD3v8zRACUtW70YXB&2-a6utWqlj?a$soiZ{61!RK%%_N9+c#xnXgOk{>lFU zfebxsH{4m;vjGdpqj8R5$VgX0zqk|w7##SufS``L(FlHYOW!~6(LB+u+j({kbdFfk13=dWS_vI zl??H3YR*8^BOSwY4^*28`g5XsyvZhcP)Hk^^ueF9hu|&em2A%#_Nwcs61JPiu-xe# zNc|p2_lj43$=`rZ=sq~>wL}FNNqZf`QYZI9zenXK%4od2%q!_YTGXEIbS6!DWarr} z@G8`WabIe?>P@ZPJHe>9R_!YPf1~{*^cbjzu#>+VN87fHJrf~g0=60lK?40-sanQiy z9@WDC0QXAAFyN!;4j-?z6IJGA73rD#CVm8qW!8AJwRcg;ZDY7J!w7WSss|Zi%Nkg z%Z=gEV|f0dtaK7-to@Zg0=EIe&lmQhvdEW`oPQ0L$5nq&@PEY>edf4NOrC2ffJ~$r z8hKM|(-nP_9|Q?)E;+=#s)Vdc75ZxqAwnic^$nw0rk}EJ;DIcgq~raoy3i7*7{@T> zWgcVh6YgTCwmLmBd7_lb@~I$Ynbvl%Ne9_q@FGY;ILEaW5~u)U*l1Dm2{r;xp)}R~ zmHz+(g6rgw$ltXQ1r>>f)W&zdb%AAEGQ!~s`l!a?vl%wpZ_zGKn;&{ikXc9`lP2tf4 za)0psHPf9n&$6%JL9}N6nRcX*H&U_8IE{9b_YV)a6@8)Ulg*NVg8@LuohXqpHR&S0 z%8!BgO2-uTrck9oTX^OipnW34>lHnp*+cLhdXl7ZcWS_o#0EKsC=YRm>Fz1GdSvrZ zkT<5K!LZN9&7 z`U#=mvcup}g`lg7`&99OQ=b~c;tx3%2TJDZ^Kd0mFm>i>03u>5(>y=yyZ8>Ud@cSU z?JdQx@FxEN8^gdO%leQ>^qS5)_I3OgVe0)F zZXxz#dyeLcJqb*<0{Nms4(dgSA}i5|++4hb2n%n+<)bs{1Ye1H0bgd}G?9 zD-kGr8^eLuZ~cOU&EY0=po!AGCI0}ryWmtQO{a@{QdvrXS9OnJ%F0hv{*TN(Vx_VB zG(G_E;zPLKXzr*C`R;Mc7)pIbmRO##G#+cV+m5I<(h7;#BuO=s!}u$TF*6p}JD_e$ zuz~*onk&-b_J8~pVZW;T-)Od|R3$2F5wQu{bSbhkroNiZO=a*Q@J90n>8>&D5ly6& zm;V4xVd`#r6(-IB@+N$!Jma$Ln-W<_#BpXBC-xdiSsuFzvv1k{2Vsh$%Mx3zw)l&8 zR-%OG8>E5MYBl6*(QCi6`{3aS4*vj1`$H|QB2>;q_rH#0Q{h>f4d!0o#^NO$rAg>hf z6{rncr#S|6+e-U?5c@Jd3mnXw?kw$9c~c5onB9VcPUrssU@@maW9w8N`!s$7d_~?j z?LD)Y%9W4dxg>ItVF2r~h?)+xhYKkb%e%v?(-69cK4TH zFr(vbv;-u9w^PvX{Oj+Vud?gla@>Vo@t1003m_#($FRX9>;%|B_B7-6OneDHoe%M! zYe{jr&eNFY9F-(_gNKiEwFjK{JW9eB-k0+@H(bhw!sPeB#kJ%US zB2bqR#a*owERcn#9K%!;M&bq^CON=05`M{VfQ7yHbaAh0%1{K5oOca7Zb1z5NHExrboaHqedy{0<6v60+s4k-iL$3r@Gto_?-So-gL zyuWJ+KkuB6?xa><58-Ra+77X1Qa^oSE7GI(U3?MYD_zr=hiPqPBQl=GY+)0$lVu5? z?-5oV`#63L+FUCc?Km8=3C1ix3D|@87>=4nX_uU=aLx&bTYdW&zwo3?m1R$-Q&{X% zkF9Ldt6mtgN)w>(oKNIGoq89D{g>YYxSh(K#yID-r7kmgvFtJuo@5WWKu?~6kbRTi z0Irsl&l>iqL&NnUIQAPZM)CguhspK^gUt)e+q^;Zb9->NTvqB?nu@(VYwU{n6Lmm0 z#ht7wRg@%SxM)#6hQnV$CZl)kl=up5{{XulHSJV51gVwd*lJh*04lKXXgtV3Y?Iz7 zfd(>(*Oegv7zTXn)24pOFMwxN-HtWwTRBilQTlfclB1{*`ae=evE*r~`z1aB*5Xpf z9CoDkdC1#*MTTck>H)*#`vXDdIEmENj6W8{aJPfj7mhYT{goIs>63qCf53C9$ln)s zvQ_^8yExt&6nzKWHT9?4{gFQdcMYi)TuIuM$x$R^;v6+DCoJXw8wfsg)0GFn7Mx>% zUOa8Cu0^xxAwB9~p+p^FVhkR-)=Kk(EV1ihP{Q?Qt$!pVy_HA;Upy z$w@eTgXw-F56G!T*U)cczIjnA@g;HJ#? zPH{(TXen4p2Oh&1Haywq`WmzQ||n-}oxR90|AM9@NsZ zbV{+TIE8s>W51UERgg!(pTScpE5731)R5RvN}fhDhp8zfzy>Tq1f3&OUaWqj4Qjl3 z{V$W-cO~Jyk*POR#8D{AS&6FKsLzwifzSFdB&-h;3J=Yr>#echI-pxR( z)T=>XVqX23Ujm#$vhd@6(_K;|EH#f|`I8^KlVO=L&OnK*V*bki0D)KD`?9#twIHOE z4XYf(fib*IhQI6EAM!3dV_LsQJd^K_jB$R_-r|fy@90unWu*TAS7Ah*2^{+K<+rt5 zV;Qu(VWl;6Q0z*ABorAUC(~Uz*V*__*<1B#xka@ov3h{BhET&bIwC3Xv3NdDp5{c^9nuYSxwfri)jo7{7> z>mV|R9cLQD%XyB|7AGk?Km*c{{g+<^jGw+S#r>$Hw2tt+-aUuqNFTMBSolYoBDp&0 z@dg8rrwMdgyKY%h3@x?U#+4;eNYTk+W<+@KMdr$Ns=E1ecv+}Ebh zFtZR55e3b!<*&;ZGZRt7Px`@Fe~_7f@Pi+G^Y$$5f1R1e>oZKuCn~32{g8kzzi!G}-yk&yP*S`LOY(5pG10Pd#l;`0^o# zxr-3Xd7~-cgh+<%j#oZ!w~`7GGk!NsVSX|nmpYCU5t)%k8hSqRpx|+L$Ac#(5z>+d zjWg+%|Kv_Yq)N;j>(h$UOmXEjJPQjEark(enzxsUSU4}<=auKlgiWVMz_TB(X--5W z{QR=N{pLe3i%6~Yi>G@P7N#OhVH7s+Be9Uma4Qkr$UL8mNS;RA2X``K{7)7VJ$(vs zOuxXKS4dL+?zaAk_g}7L*f(9QoS9Yle!uVg&cbCl^@xZ_w-3`!$IL`Dyc%uh6BEaL5yX&j;PFz-Bqh>t=VL+`j0jIJFs~;fe~W^GmoPU!<9XhOkHA|~ zF!MZk^G}u_rf?3+@Jmc2+9?-{B=11O+h%1z%$AFnT(V2kvk1VhZq) zu=ROzV*HE`*r3y1m-mg~_@@Vz@xo3p0zj{f%LBPl1QU_quNQMCCP93V{NKSD@o|34 z;C%ydjwLT+hA+Hp!~$&Q;g50PIX@{gsl@4_2XM-`ht~-{PbQ_KWhW96apEw?i+%gy z`NPXYL~pnIZL3eWsv;W?-=TuXls7?E>^I=(#ro-tKOPyooQeF5Jc(?_;WZ2I)9W!$ zgZn!pnbX!^0~lIx3r=GK7!eT}etP(`e7Z5sktxVy_<%?RB9d-4Vu6luX@0%}%Mx-B zaAS#>1k6VSTnIb%>Bl2tUeqOMoQD$!%qJp(|F~HBdLI`VG z>GT8VgXD2YPGe25i~H{9IpOuL(gm(ClLwg%kTy_NzA5wKi56dQb#fVhjNORh{Y!uM z@uB3MgqfA%=YHnR@i=(9>FrhvOQNC33yxsi4b_1S_`GSj&Y%hNct&-zX>{ZMa6XRw z4_StX_W@?K(BIA0=?ec=E2mdrJ*^!6LZ#HAoZgyeU|M`+z9{EI%1^tX?dADR2tm^n zfD`0&65$E%=TFjbV?hh__v!o3Ec8rOVM&qa08k{ID4={0$Mp9MW5NqfC>$Ja?8DTi zgFHh-kU7VKf^a5%rqOARiE3c$KwM7bLBb*9fxy=B1M}_NDLgV|5Awwku%v$-IbsYr znYWRK1D=lwAwm>By0`xB`Eh5bpiUGK8;8BT+?m2V$(>axg4ieipO1ogHF3VM6a$@e zOtv8J?KN0MX3}_tm`+%UILL^i{GFlttK9EQN$Hc6R0abhszrGK%5j(1lr%4$W1$fM zC21U4;w1%{gvKimynyLgaQtcX)2|PwKI3w{^5yd)Vd?`UOe@K6#(6$Cf`Z-8XM<}F zn?^~jNeU$%3mnz)QjxbPkK#DYCuB;49Te7JY=X&QqRg?Rxf9jIOdm&9o=$y&nVGyA zMMTn2P7y5A?t@qdOEd1asxqr8b)T7#6Ip}>@v+~&`&|IB0VGH0Q=VWvBNz|ph=b=r zc_H&=GU?zOCYJ`giCB;)0bdabI|s8a0XzQoo_*Z%#h0_NsvwPKArThl0;H}gEJQr> zpjXIxSl!})afRamz510A^cPxi2C~&Sc=6OMueh_zXO9cyp-V_v;LzoWP7fsKflS+_ z3C*v;a3xz2C4k700rPSN` zedh)0Ox}F)ou?-{&xR0BZs%&jd<9qYpU)rhCD29!9x%il#LPaD(KAHw$&liQ$2rOC zhZTBc*g1b^}I) z5emrDB_j?gv+D9RWkxW*_#mVr#zCY?Kt9&VZJq&U&cekRnj(K7u3j5Xm6f!TNVt=A zy+7SW#1i=bjcxtHy{s@j!MdEDKAH7vlEcZmFrC@zf|q%*@`Yp!3TO8f^`)O1B<5=< zGV3W97Y;+zlS~{ab@A=Y%rPy7mV9(x=fZn%00#%fLN3Z=hbrd z!M-FafDk;h$t%a0V|LA9b_GjO`d2_P39!YJFmyHNBi-=MRGe?BGi-^0sJATs4m{~;T58&6` z9shJWDa1t7dw2IzGTX*W&37EpRo0inzs%QEm0{*VMD8(P!OSF&P(}<-vYsP=oyVsz z&uboG$0LL#NjuyJCO3}=78a5DyTTIVj)6co^KfV3tUh>*$VKKRqVuD9%=?^qMTDbV zfZJ%6=fuoL^@o@_JlsuyHHpj(pAMfzn1jOHDTtX%DegAz9wSW;6ns|d-rdcELPg>{ z*5nZsWGJ^K$ENN!gSBVPg+zpi+^l!Qb-IU}5m8YgqQ~R${{8!}zxu0x_vioiFaG@B zPJj_2jPoXz9*0gonJCCQQ6O>8+ST6*!2I)n{?C8ww|?vAfBxrTuf6wqxiD)Vo?|sT zBI>>2o2At8osN4w?G?XLN)eIXJ50;cQlobh5mlXPh8RzMUZDpv8yPQ5;}rQQ{gIiu z*|6>q(eW!0;ha3@$bf=GI3mKs!_!@;ggeXv{67AKHJh1-Q~qLJ5)Eq$3e^&hv*E&` zD(b>J-WkBC_!j3;(RbzljU$WS6PiG;lqD0|A5zZ|5Cm8p*A;crEfNcRu;q)?- zyAz8rdAMq!^`J+Vc~umJX;n3|)|!sWPF`ma=+|y$ZsE?%q9QD2&O8h~DBSVXn8>=} z&fpeNIHg$=5xsx^?f?B}|JVQVzx`_xCRJh~>+GG($(Iy*dNYz3=FWd}TmQ9R`?Wv% zqd)rPU;gEYIF4iA_v1M5A>lINYo`O77zwunq`R5*-px!^w{2tQ`IGagz+zOj)*2CT z*=0<_1MffpxSY7F?)oH;AVN`eGU&% zA!2y<$y*6AjWgzM9!^f8BC4uNk)PPzScHk))9W(}j*yv|oerLYEKEh~wgm#ddjz3q zdWL-w?>&e_MMRnTo3~&8umAI(e);8>#6slMJDDf3bTRjN@%%S3cl^Zf{_gMo;UE4X zGd~`W$K$c@`^(GA^YinE4fP!`+|Z9`8O*5qw^lS-5YvTTvzEaPtfRp`yKaz$u(4 zRcWn@uzN5Oo_$bQHw0NxB_f;!TpNyYDMdshoLGuxy~cxjI{*prGo=k%=m%_2xt0Hn$MbO zG7n*95k*MsJsmtVi-a4VX(?4jM1`2${NMbm|Kq)T2&4Ax^2MLKs#o}L|RH~ z2XjK|T1%~4Yt4EOI%6V?7!NxkTEwyM#QgMhN2CKb6&4v01CbGrTt!4xMDh%{x888* z;lO(D_uGBDZA{#I@4ahL6>YuYOb+}*?r|Ik@C-B9R21qdD5DT;3#KNbW)|UE>L|T2 zF%?y2?q+80Zh+Ud78NlM3h%vJH&HD`nZMFiuWm5tc;i6l9i=QbbwU%{;=* zAk%=$)KWx~h;wsA+T-4OcXv@OBIbclEzBMv%;7Gjc<%@r2@XWYxlJizdXxxeGLK0! zmr^_ou!ltke07ncLP!{FL>3Vhp>{N4QW0TsL!PBiggcHmP;V&} znWBgsts$t+gd4!7_g-rSDePwEfh&XQpd8#lk>OC%~ga%fT@4))^`<;ne@4YuOpL$?~g5LX9tA{hQb&Cis zMMO%`-a0JF%!FmT-NL=wNbf|EJhXO1(CxM*FaY)-Dz#eg`?0%wc&KW!86wvEwr%j5 zZkAc5dy>=4rRX@}4hS^xF%>Ov_NA2GjhK*FyBoYs@5apc`;9ok!#Eg$GeZ=}K`8>K z)VcwSX~rra-b0Bi-TzU70Z8j)1BPA{7V|Fw1TC1u8(MFK>3A>0BTVE|DC0m!tP@opW`x7vT90rUJoLQ3OkC?$ zYOy{}rU=xUfS41N0SMxQOiHwrB7;lDH!XnpODRQF%##RGRh%o_jpH~XqP2zt21n4% zfpdvCxe75W67J*J!$GQY zElNbzJ3J8)W#lmf2}VSv-nQE|JdVRgC^;w%G^r42DJcL#v|+}BhJ$OpnVX7K#PDuN zV}hvGO$(Ye$jo|c&5Rj&5wmdb9U!TcO3bRt6y1yh@xgoV=HLeEH(&h~kPL*QLnSuK zFCG_jPq+Xr>JWSVi+}MiBjWAbw?F>zkH7u)+i$-4=J9wC(VI7KkZaC98y5pp7 zFp3VBNJGSjsicZjyjVY?N){*IQEd?o^^^P~iizi1OVb)vkrPfl^ zy0z8;!3UGz+g9-bEjySwSY_L)_ZsmLE#ck zAtFe<++DOVQ8yDfe4*YNFbon5^FYF;rMO#b2k5C%O3^IKP*CgL+{u00Zb+Hjx_3j7 ziJ7$22yaIV4(mn~^>+WufA{Ap7(RtjXTdJ$>fJ%B4lM$S$Z!0{Z~W$O{^o}dAHM$j z>-X>9zkB!Y@p!<+n2 zRz+mr_x(7us9Q2ll=LvS<8TjVQc;wO5Oay5wPXC9Cev4Hku+I&vI1}F$w@~-3o|Bi zk6NpHnDu?%A@kK*c#^rQMOd{&c<c$-BeXFDJOSpy)onMMxjsy8T06=4C}qr3WG)#Bn*<&DWa&B zT2VTfRSqq+l){06hPT#vlys3{gY#*Z`AQ^rIiWd-u-Fo}QjSYxLeHdj&GF_x|zY$KLz>eixB;96@xy z-&GYc{prmcO+fOu@QmMMt@LKj8QKxPKUJ4TKK?1v)V(5z55-?oaprS%r>rB)qDVJQVa zIevxQIx&SiV9bE;qzaf$C^jP*0pFTA50REUO9+o)*-Go~c#rTvF0QI9jPGPB90bya z!n=DZ3c@~uKs`Z~5EkygPifB7S#B;80x3r?0|PGRH}^R5a<{-^)+4?ceU`0m}i zj~_oiKR*MRJUu-DQ-VOm?M7sWFy`s$$+LRWr&MO&kKP;dzbR$8-EKrt>sD$F_m{`R zJ&^0ojJb>o6dZr={W#j~b}K~@&Edm_eRn7Uiz+eIQiY|PMZ~t<&?~v`J5mGH;%>d$ zZM%tZEKOfp%AiMh+cs6Hwc?R4xX-&yHjPviaoMcbT7g8nbsUvaii(<9>+NitLZvZK zSU_b5Hp9%qL9O=)7nM3F{3I1P6-V%(QUs{a-9g>BSpbBjN)?AZ5E23U!`;Jc-B<(^ z3C$B|9oeC(^ejS$XkpghmIqsrPNxO z<>lpNKMtZmUOy!U+qMy9<+Zo=*dHQViq=|7Enr2{O(HT9K?MLx1az{yZ?_F^ih4@w zRU*P;+bT+6)(sO9RK=5JN-74V_2eaS^1%p#mMx_KaYn?pRTWj$-VJcG)GDIMLIxe} zV3wi+ACD3hdUoOQEOoo{E47QK@EW-K+5RIM0@Mz9%fJun_JORYlYh4 zICggjGzB77EyCQ7h6JG2>edI>q)g&&%(`uxijqh_It1;opHeGeSVVXbY#Q=d1jga` z$lX25=d$t=0Hw&7QOPb_RaFV1pk|$k(SQ!T8snM`VkYy5`1;HLFxm-*Vp(+b!X|C} zd0Q9e-~R32dHeS5H{X1N)C!FIbmZ<1LJhVH$c{i}y@z}2ecLv`YgClLb{%*^L@EmB z(OUzV3bU@IFmr3|I2sd`T52iyEexeemN4SjkKTJN6>o&_ifkBJ0TZ|0ML5D$GO%>( zusqK4tuXV`niuv@;L#Fk?m|*xDDvKaE3($Rj1=PV(2L%yp-bRa4leCh^QZj znNb9A7qNs}&tJ*e8Yt8DZn*8LGBk!f3LXOXSe zQi_)Hcs%yUP83h~n@3m{YX!O%(IPA&u9TWLURvS+!5vkt_FQ+2u+kr zN!G^@6naN_SVUyRbLf9Su)4X5imIrVT16ECQW+hhy_-iciFG^L5fN{{`Vx}k*PR9; zBvMWd_9wPJg9WTPBEIvT@9g^?5g$H$08p-_9Q%$^==|aO#TPgUZQt?0_I-yM>^P2( zA3vhbis!f0YVO6cE=NaJa)*T@D|6hgR+LfMZ{y@-5tT9lK&;qrByBR8!By_*u!OQ}- zbu(dB(wQ6~YlrUHj|Lzks!AM8CEd11xHZE_79s+3A|h@^9L6j}t+(5@)mnFm5Q%hj z9-H;vLrZawS_*H1#{o~&yY=H>(NfF(elK6>(b~t4&u2D2LyLo_h0AF0(y>}xDl_FI=+Gqu*B02_J?0cG*>^0MzcQMBG# z>$O(gtQ3m%uBDVxzW2TFK{bhgf+>IT#TP`>j>CFKx+%=o`*yqGP51pEidrg-8qJ$p zyLBRdyu3t&s5nLI9fct{Y~YZH*!PEO0bO{%-M~!uZo&lCB70rjRrRqyik8;;{dO}q zci;C+lyPQ`*759zP@>`twAPSBN>S?uETKg!>gtYatb2rat3}Pah#W^tyc7=O1IUgD zEp-g=VrDHxdWUq>Rb|^Y+$ax%PHxEWLYa{pfFno7DXQe5!saf?b+DAe#6AXl^oBBs z)Vh7~#TOLO&5q-U@LFo1c*Gp;d)qPlKt;sn$(|nbjk@HFyLhidvMU zwAO`lAPq5XTNRdl--#(@Q9}%yS+GYbg;m2m1)Z%E6H5`{peRMn1!`m-xqIZSt7XjE z_z&#^Jw4s;cN7T0IsvBRMnLd*?7Iwzzty@Q$2fl4M?o7L z%j5B=wb+Y^=(cT7_q&-L?NBYfwNk5x*HZW6_|A8}@m zL59XX!kMJ?Bj#?j7%xiUF{P=}i3m91wM@jL&`fBWv;J8&|nzf2@BRI+-z z-%BabegQxuO=OX6+hz+0icq!IAS$KQ*mJV%001BWNklbr|7Na&`8W=w zL7+IyY_jh}v_Bq^K1L>mG8;8+w_B}stCbc-B;F4e4^9nv=ly=yQi!>=wjT%B4=tsQ zc95dQ!$q|Z%?TjTko9G21!UR#V+UEZRb;UWDT`Z2MAqzh3Nue&%>)~Yvlm!;Yj|2P z%2F#T4frN1ZY7-}0kq)GICOuULK9S~z_Gfy)>1@LmP2gTSqO2@&1&6rJX%$8%WgW% z6J_GQ+Uxw+1pgTcuU+_q!G~v)($$nQhxRxm1w!t=_inu|Gg9nOUiI+p3xO z-q78@-EQqTRJ9!kG1pql5XzTY0W<1Wg{AlY@%bYYYELB0_brR(6u~TjL!w2sZ5sg8v?@pv75D`3XwBnT7g@2W|rISu0pMKb0ZFL-Vk8cT92az z(Z26+hbU}3yTLv1Vliy*MX^T+4s)(*V!{eDMmJ&xn?c*q>|NhHF@ z(S-T_^aQ0lEWWkW!=%>5I`|g!ZX#l;NRqv1CSdNpi^z7{M5MP4QNXbuFkAq4xOT8c zsm2aM565vFxDjPcK10QRGEuVuDtTp9H-|J*2Ao7zsv_auS}Ub!sY2(dl9Vc4XA26k z7J-vPQz8VqaF%eK5g9jXt+iArmx#F3qN=@hB!Yl6t+!HCwG`E!jIgLkAL@J+G4nCO zggvMz>LiUKN-e-|sNhObcy1;dYJM)zenxnBDK$UTIhz61fX2eNx~Z1ldpjD7pqmNU zCV>v7U8f9D^6 z{P=NF<^b_9=-cfUODiEhCn`|*pO44m>FH@!pxk|{8~Qb8f75N-&;|-E04}c9a75XylFN?TXW41JLz*R7)KG(4qound(I;T5IWMV6x}T0{7Uq zE$7;}r*MD;NhNd|ppRN_$G+q7Xi)@Q&0NYA^nVIP6|zl$5*dn4peB@9K5hBfA*qAb=s5?MhzpU9{sDG{5Sn`OyD*ps2+WR?M^%!q=eWcxPq zmY_f*k;>?5joy224NBl|zW$QU zvn>^Tne`589Ejh{?)UqfH*dfscsR;is=A{o&O-|de$ra&y{pPrD-thsX{gGZrzc_V zW)6`pQ7N_7f`6SedZ0ZjgQOQNU=?Z9^J?8nQ5`ut9GK>Wvlx9+q$F0IIWT z2z65)jkfN_io{YOS_D969?2E67W7kPi@K_6Q8PzR6N<8^U063FXPJfCb66uP9_9{0 z+}+>3`}#8z6on~>-F2(wvwj`3o&NJ5{_yeG-@kwVcs%d`K&rsCKOQe`9s`^J(Chf> z9fhWSoYjuf^!xRZMemvs$igRw@pNaXnBT&GXNn*kx08c zk9`g@=LDNU!$?HvlZwHs2vojI;SS=Z6os)m<$xeaJTMygIGRY-bY~$6UMyObo1BJ!F$>WGTzaKaw0L!4~ZkE1zZ zR7OQxow@T+_+Y*TI=+4OvTR$pgN3Ao$mcK_=3{VLK;3D_vG?97Jlx-X^LE*`uuKAVCl9@CRhXaNyoofL zIgmq$=pX#Y|KNUqdU<()Kfc{=lY8+2o4}Fdv88OoowH|$VSFXCq*3J_sv8{c9G^4> zFh!;whF6&L#+cdt9BVNpUzsv8ms$YlCYXVaWpvg^3gvqTvc%j7W=_*7$}FYU-kQ6& z`Y``tknTcgtklSMwNM@3+drwG<+D^UG$7a0>dxU;0mwSx!M%HVqBp zWnxpf?Wd=E5Vhk#D?_sN=npXCp^V4Zgtomk{BTyUM6?t%xzf~CyGKy(rrAZ$#2Jf0 zpMzCK=T0s<893Net4$&bSA?DnfKF5lGH^$>(rM9SKaS%N=KK9#iiYP)0chc8Fy9y@ z(oza0E;^*V7?CMpqYa!G0_naV$&F~4UEvslkT?PTjVx}q??)+c7J;HH(1nQlK-fgl z%_6935s;O{=q$IeF-eck1!hw!HAF#K92h7ZDp9i@lw^NCzA-Kj`T`!}R*FDr0z;J$ zy)glRtoPd{%x0MgUl%mQUw!%GU-?J>shL3&HV0*aX_<2xK;hw^US1x+@u@cgJBGsK zw#|u1L)IG*c+7?-oF#zcq%w%ia;hWbU;BPQLRe~f;O#U`92Ka*{FyXIL2MzS);d#U zw#VY`_opX#FJ`{o?li8Ag&~*KqV9nycIZEtbR-lp!#$rwA{Y{ttYf46IXpQ^@KI|!csI9h8*Yt1|W5PtlZf3YlyxQ@AHA`gA@w2=tWEIHGw zQM$M7_A}rA{%oxP1@`px1n<5-9{HTyF%oRFDRDavP?mE-*zD~Xk6*!~9s8cQd-So_ zx|tgYf!S9EtLoj*2c)GON84^2Pq8i(2iu0lYw+13*%ePr_xtS}FUnGi?#GS?rm9D4 z3W5R($1&(eXR~ZXHmc?{KS#p^w3*$kw}w1uOhm%mkqo{gQfY!T^sNU-Ql0tt?S6+Z z#Iz|ev!kld?gjvfZe7eU>g^CMn7?-%M-GSaU>0<;9>;;iP*_E>+&c;sBG}yrTKeoF zM{?*78Z#xACnP_ zh^nN7IB1en@QV-yb@SfazVFArAMIe`m*9#DUbnP&u|9m$faGD(EPsTUO{ z8AD-x&YMWLVunG-B7$KEWy~)a5{97c=QFbiv`C4z~|-rzcd10h9LQ7+5ge{pn5i7NTOhA3Lz=?7T!1-P|HKh@grt z6E|?c58#CXZo>aAU1RK0~QCO0Qn;m18&N4$jhq@E`mx(a6Y`fjG)OPH>fuGG{!x%Q* zvlmGe8bG*zW}%FoIe)4YEvhg8H`k(&%7uq}$EiTqX)u9~EGk6O-FnAhl9~h9pn_EP z?4IGFz7{wOB(-ShM!{!4j>pT(ejKxF{+qX7wbm~N%*%A^u^pDb|1)pq5GlTFCpx!e zG4U_`!+-ewzxT6fPJMcMnvNWxbM}8c9uL@kYwfmea7Ca6XAq~6!fxBvTkF zo}TUi7#@K@4ATT9-&@=F-Q4c?r&?<}j+fD;0qN{kw{r-(dnqL-TI<*@1XF`pm&Ul@ zl%PQqyKTL?do-Mc zoR$jc&tN%ZY@3Wx$Mu{|l1?4+W^{^_qS*@ATUI(#YQ%NPKh4rJMwgpwFS;JJpf>Uj}|tJ(3w0H zlJzl>%25VM!okt6d}KR;$MeVc-+c3SY!sw(pV{2Q>Q3D#g1`6OHXisvzuZYq_8xazA{C|$T;ixbw+nW zcm&;VHx%~TI2bu^e+c*R`uGlRH2T=*E-?qI5Ydii?x2z|X%!jOIikZu$Hbcf3Ua0& zvT%rPP)&S!>}a$@Ghrzelm@ao6*22Qmkw|(1rxKf*$-1!iCM)u$_3ybbCR=rU~B;f zwrH)IqvicLcBm529OUL0>wu2{A#RFqnSjo;sCDa5h6*FKg%4tg#&YxaSoJX$+IYCk zesLxyIoeTFaH`P>4x5@m5BURbgIR~fqi%K1I!|davxR5k83BD8+HZRUVagHl{{6S# zy#4xIbd$U79XjuIzxHD8agN*mWL492{rrQ!_xFGH=YD=xg65Rnlw}WD$edUWs58et zrgtA$d8Vxdbgn=&BCULqF)ZhU{uZ# zzLO`1AUoS65@0yiDByH4XCa0KZd-)i$-G;4Re0q&Z~B}!k1Nu>k5!F?*&C6&(Tynhd*A(H1ud89sbg*3vY(Nd=s)^}U%K6& zQtCJcJFd1k8sw7aK}`xM5Y8>mYGRfHv*UAYs-d|_ag0ov^FacoZ8B2uTFnP&`+DW*P+ zMjD;%=PKfTg}EcV{)T)gZ8;5Hi&2iGt2hIxf5%JIds{R`28RJ z;EOlk;iTvM8XIB?ao0hlbD0dz!@0J6ZlRz#4Kyp&=fKJ_w)46Mhp>i)MnXI%S<5uF zxqEDkibT4M^OMB+Y#7bskhygV15Y(yGHzgOV&QEQ^PtwqGH4k;EraH2M?uj*hj=v? z-Hd%Q84q*CqR#<18HL8?!r@c0xCSaVkpd%Yw{dqPhhMvo@GFydrn#+VEXJ7gA(58M zyOfcW7=0&%gG3as(K&lJRtXPba*$@Izs6jxNHI!jW2=v3=;$`n3BL^0U)C>HH^&2ZLDO&#wt4e&}XJ!j{^W#K(AJhr|n$MMqC$C zp4*M-T+uc+yAQKI7v=G#xO?3pcy7w(b+_{H(qrA>Je{xB?#&f{F?g#aXgT+l&W)tY z??&YQH(yq7;|%h$dwyMowWRxWZpj>b|0b-&Bf;Ni?j*vP9^vOI%wQsSo(m;$b1>UO z=8k0@_rl11X;2m#!zji+dp_kQETlrBSHC9f7UuJ=js<;V;h5*E(Ygwka(Vo+WHT>s z1gLY#Bu2r&Lz__;%@XvoK!{lLB1M_vVk!yH8x27<(uExNE&*UuUTt_>w)9;o$#}iN z@$w)CEaQurpHF=}tm~r25wp)!<#7j|d{>mdv6&=Ni)0V~9^cfB6#XIg3!Dh&+t`f#Rc#<^%ahGD^!@#{h49c%lDot&UEE2#^29ugpF3>(*>$3OIhx2qTxh=;i8_uP*!Iq!xWyTpm8X3J25ZBUfu) zi&wA01cKCAv`Y@2dy;3cm01tsr2T^^gie(t@dbcP z>*UwLCmSs7%uVS+x|E;3hwKwCe_GoGvhWIWcs!9<zuA77-2K>rd89aH2%V*`!WCWjyim&qiODr9u$K!%T$L`?K zcyMAfUM$}8ud*KW>FTa>u5_Xpx1uz*s^(^DTT1S^dp<7ZNtt+Z82#`LITHtOp~G#j zM-P|n!*+RQJhYs1Kb`JOoP-j@6Nd=1&TzT_T3*sHxvWZ$SLQan`?;?Dr&xNdH+0%7 zU%bHuPhC=h>%#KOYc7Ez*5*P4sq+r!1<4gh@fwtZv74QjewsLQVv5V>idY5TW1rNPRL9pW=k`2E>^+%Ydt^HJq?8J_Fd!zx&nJg2>M_k#aI9v!t_$ zo?yTvG50(e6X_wTIA4RQ!w?;VyOT4`M%zVykn@VZ}oJfxAW`b07j!D(3M3!W+SWqwLeU(T`az*q^H1re>x zutP>Ma95t14199Jbi6Dk&7P!ISl+=&EHIHW_7)Q}!c|}x=lS$~q`G{RyPc|QRyVP+7I`7o0;OOHqGp(7)2+-#X#3%k@4G1&SSR>*n zOf2lmz_MUGSy+d`z2b{$PW~Tnop_p;&oUAf_i*DGb5CRS5k~lOATt%87-{JP_iEAgaj#t^^LWy3B57>dR#!g@C{iH|v)t$|6 zUBKH&FCc}8G1rQ6_jD3=6vUdj%1VQrcOVvsVy|i8^Bn8x>_tx=gUqe;ykxQ;kF=N(`dKwnNHYeARShR;faD>0lP{ZXfDS|U_MJwJcHFjRp)sa&xLh~ zbz^~WM!L_MyAVrx719T7#IGR4D~A1Ay?GU;V{z_$;Zm+Z_X?ik6`Ofl<~&{e390|; zOD;n(iR1MEhIu|%K9f`q1LMiuyIk?#g{BPR5oFe$NQzG(CTpBtnJ?Ef*^*i4I=8F@ z#iwNcXRCE|<{m6(>NfLE9;LUK92AA-ejZvBCKoa+62ZsCn+TT8axBC=UqjI9*jDl& zosm-*L5{6*I;p{2#f74Xgjj1(Vu|U-~`9vYb*Z3Hja$&QxhNOU>xRQp(t}Qu?T4yJhoqt-z&0htw#A2 zBu3abAKUwv9qnxQ`@JYX71m6b7ZORvf3tKoOUuk8g>@jPX%C`jwx)$xQa`h79V0G( z3v<7ad-M6dQc|ufS}&ut&mqHeN6B21EmQND@J2r2=yL`m#wMjh%dLxXstgwR#A|cb zN+-Y8JD{82PBMGcYd+zdP;HUS#@yG+!Ky^aS3YmIQm!$Q&#?93JZ*3cb|o|NNJAgx z$w8A(K9N)Zq=k7QqudsjJw>n_*V@IUA~vX)kx1~&HCbn41TmWQ_>4tE#&sr(Lp;lq z-a)g!@bk<5_L~pE3|aUWPxmS;OhuT&RuqJ})DwM0H?qM;&ET`hde4}a{rJejIbzAS z2RU2*CbrHOBj#1a`>CzZBQVUGS94e4`~AM}I}4ZL)MKz+C)$X!wU*DLuh5vEtJBif z`3$%tw(@lCCm}F>XOIkk56OxyDj=2-UV_8Vv&Ty+NkT|pX+VI~>nScg~VzKX;bmCzY9rd1AatXNzB1WZlaB#|5 zmDCJAJft|`95n8a5DQt)b2T<(ER4HwP;33|w=d5xyQ~)kyM3x+ae(fS>001BWNkl$`7>X><#quEj6my>{uPJI@ zH%qRjKak|Ps#3Dahh&rvYN=0e-aLQ&AgV=+%%*{hxt!k_7*2-ipOh9SQ2~8Cg2OOK zu~)^K3AFi>s^M8Wp-XUBdG^TGm{`AmmJ;Qa>ZgVe98V$aK;?DF~0ViomN_1&vHY z%D09%9h7#^lFmxvRL%%~=9JbmKB$gg^d%H8A<`S9|27*d3fQX0r(6 z6vlaat3^E(d{*Na8qUx1UW=UZoD8F*pF>BF@M`p+Vf@p$W=A{BUQ{IdIkQifmps5|J`4XA% zd{bt6Evk$7L_-y$jmV8CK0Nxj&%2U$5@uG4zyIB*_Gq+iy4`AF;UOuNR39(^kIH0Y zV&)-{+OIKSFPp^O3=7r<&y-C*Ln^~3v*#Y($CK4p=Kk8&Van^Yj5$C?=j40p(ZYDKn$yo zpQNQg=#69yY4Cbs={tRqwXNEfwaCRfsF-Ps@_GP}Ei@&VM3qDfvBm^6#X!N5<{nc@ zl~6)Y+&?X8G8j2uk;pr+&?ucQ)m&b(lc_TJT!u>IWM;kp)wj<#ateA0CZZ>fH$^H_ zXr(uAq$=m}AX1bdg3K8d&1vFHJY^g)2ok2T6FuDRXqeFCPGh=#MCr|=*n zk`g~TC7oUz_Fc!WeQ;RY^WUu6U+; zCqjjfSt(JJ;!%M2Q~UmzdgolJ94TmfE#e(jKp#2cD!3;e8?e?38^VlL>dkSfp5-RQ zS7|F{(tN7kHCY#brRH6-XSXvc=d&=tGEUdbu$iJ;zLbpDN|~-qw{)HpinB5m!Dm*G zoY7Uf=j7gH)7FBh5C_qn<4N<1>vzA)$dTOGbBf3{s}iCB5j56Z3ucxe7xJ-TyqkM% zo~zo-+E8evKGm0&4Fo-5=U^_M!WbS%ecJlAZQHip#@GFR$9HnFscLRQmLyn4Tl8tC z1HEK3-dUx+sF$bJ1-%CJOFIysEs|#+?aXgK$(mE%eb$!c`gWczm6z7s_`KBf!ur2@ zvrkU$8e2aVnxe}AZygH*h{fD%C_~$BKRX`soCp)ih+PQk3t-DeKDwL)oJ{xETG5!T z2u#Ak7juu-tq#PW7up9AedlL>@cjHtX2yc`X*Uj`kf*1oH%~ba^(@`UD@e+?yg|04 z{n|Oa)g#QUdze`}n)YU`wFnWj&dlK)ZXByVD(lKj;pJ0XpMD+I3`2jqe!=e3&0`W2 zW<$$ah@XavMm1&$KFhKE8VTYXo)11w^80lM(`lWtHqoy39T)xB+3FEl8d^>kFa0H- zSn#R6i0g~I%6+H6>!e(g%<7Uh1wjU^|a zv32yxr5&B#)ai&|C^>(zQZTqofxD9X+$Ly~NPiehpA%dCy z|GwU>SF+^D&a{jBj);@zWM&n`0m*4$nlBBhpBhB}|HqMjfb<{%8ejws&`qkUm{pk( zvEALw=3$w8>^McKNDyT5oXChBezD84^@$X?yZky{$6CK!E+0O8czu0+dwY9(dwYF- z#s55?&#$kqzxmDg-+%v`*Vk7Vv@a)?gBb(Qv3!G1>hc;`P8)09o(~&ijpf6$>shun z?a7ntTjqh~>ro!iwM`1UXR zJ0$Kfih>vRdIFf(pT=p)8i0Yq@)_U>+BG-0Vx(i#!}MYbVdf6RfVriE4S}Xak6vDY z`ASIuH+(vL7EG7JhYr|7&}w1OxnksHg|f~OHwP*;4o+rxowQraSSfA3aV+{gO7c50 zn|!G0Nf80#d{`;nZ@25WUvA&N^{wx%)vexJ*IJPgW>uEp+bA3uJ?qW|r0fBVNj{_*3-kBgbQ-tL0;{(9LF(HI?nSV~<#pCj*c zz2a9E=noU`9(lrzVbjiP+3&osCi%>(<_pvGx9}C_Ck$x5hKSBziFBXK3Rk8C7>QpT zA~?DPIFgYnqnOkh_=wB_dq$ls3mwdOQ{YQ7vxm=Dd$iNw2L_{+hnow{dR&A|Ym=kQ znI`D~4#u$kNV9`!b6{>1a9~|7W-;gK43)`gc9PKywqA}kXO57BVC-0$NMYD2>g?=9 z@J8)F+6dwK_nrHX{I;>@3O@k%V7z`Dc12pQm9k_o zA`C(uY$sMcgm2ExS-7Mpx-GxRVIV224$Y%WZSH9U&sksXy-#mJ_6VjZbt59PG5UBi zd?bQdQl4$F(MmU>00#kXaIo#gF$T=74WrzgWW!)l^tj*Vp1~GM!;%OVF&irs#Ogu0 za{2JEuqHdnZNSiq(dS7rFcRnK_kzwR3_K2PGh$(QlmAjp$IBSta&m1c{^l-BoS-$9PQUaw!j zeqDZGSfg+Q#vu*-m?eNEjaKT0Rbns@Mamn~uV$H$Ns@u%=rjh$?PZgT4S;AW!q;`b zT+JT0tp`l-w$llQi2+;c>?G=uus|O|Hf*K<0KTT96P63`0TI)Z ziOI|$)+nldbnvXv3Lzp3FItHS*oHZ$pzwK2{&lv&k;8&JQjCp_x$PXJc zI1LJ-LGXiWQDQRxy4sfTxt<3+vv59hky6Ss`upzR{2!(K1f@`1&NL7V`3M)caN-c3 zPI81o;?-8Ovp zu+B3xSdR7Hc$T-et=78TZa3IT6VddDe0$I1IgLZeVaWb9H7!6!}*JByx*=$qitf79LX6hlw&QA1NacHZ#~qX26-b z3YpJ=R4fL9hny1Q3PP%Y2gwm}Z-(>;QP$`kgcV`#S!)QHJ^OucS`{wADsp-Khy=xL z*l;wQl8xS=lc8{kj;2H`^;?>j>gV(Mk)(e7_}%C4{`99mjWND{{rct0mmh!p@!Pj= z01K}$CcSneT5H$qb=$VO?}*`m>0_qWNB{N>qR-4ZDSH-3>}9<75`$IKHyO%dJP!U6u}mUKX!;51j^+wD$7MMbrU7Ev|W z+nS3?0(?gAGwRh+r@tS=1vi($v=*S~8C5b1^RVF_2wKJ%F{Tb&HL^kJz;2A*Y~olz zN_2CO5k@zNgkox;gJ_J##J%VJsai6$hKFPFLK0z%LPaJ~1P)vu(`-dmMK##mEuEjW zL{J+Yo^F9kp@gVVRgM&dN6qFvN$Ef{sxxBo* zWDN7&ci(;f{Ez?mkEhe==bwN6@y8$k^uYdjP^?JQtuQ(K8?Yms&-2HO7z+la0 z)dDM3RWFwdVib>t)wu6*@5x^^uOVdU8=BzyG)@NJ}mkf`3;KlL3IOEw*dl| zj^DX+BB;Tjz}ZY6UwcJOHssY#?(g&@_)N@&w8b zbCtC*xc4?omRt**naA?qoNz)*6Io_0H9@vn$U-#}LNZ+*VOmO-bj?>>x7;?z7$6qb zt-|JajE+dH7NCL9QOzO-b7o4w=FohwfxLji9QE5^_hAm0Zrx5}-#y%XjA7=(+yYH1 zgAxJrTeJSSZQJF1etCI$dwcu%>C@*=pFVy1^zZ)NzaL}#^wUp&{_~%I{`u#>{`Iej zH(p*|a84gDhlA~P*|u$2-D0KUV}nB!)2%mxM(?e+Z9A2sD`=UFS%pb_qDD)>HEm-| zc8afU2L5^b_Zr1xi2@Rl#bjKL?+YOeVoc+i(t;(bKWonMNB4bHN zJ2GN{!#d~`g;8i?s(8Mp@lGO3_+2(E?lwoKv-w2RN2!3`1O0YlWYDxcNXf984^wP{in+IB?TC zQCK&(-mwaXo0*LO2s0v561iGSrJPPDEO*o&zx(dHKm6ejU%!6+@y8#3`Q?`{U%mh- zjGWabvlD$;X1-i5$Vx%=z-a;S0V*fR1@XvEr<0)0DxzBOnxJ|>VTlUHu`IK?od9vI z<5opIP2Ux$rruj012FQ_=^Wvx+0QQ0$VNsu6B|5iiAyca(%Rm72l_CP@YqqrWAv1l zi^hV{u@FV?JskmHggufCD3dW(>V}XHix{LT74{%=N8Pm6>KR1-#wk>HLnt*}$J`wm%CI2> z3QM?Sd5_a+>#Yr}_E{ev5kc(X#H7b06_Nq;P!YTT;SYa!eSQ7mhadjsU;gFGmoH{^ zxm*^i0HhJ1sJCq!V<4bEpU+8LB08VXz^bU~QWiFsVzZnt5E`wmMA_d`Ssvvm@W z-cgH$^fC?DCK+N@yFn3BNJNFX)Vggog6{XdwMN7VzBEJDpHXIF2rLL=@l=YQPUmgg z+->xZ{z1&D|F&(yEG&Ht6ca$hOHgn)6a`t&_OLMk11zPY3L&b*RJ5QDM+9IC=)63D z3UuG_*=?X+F3U=QnS=8B!Yf4hutc77f+KNEM1oWiP#^I>Fm&ApFsRtYR&S$=h2@1J7(a3)_`zYn8|YYB~b-GnWiuX)MsP> zMo#eh#+Q_1o(WV00t$<})M~wT@XChS7~K+qnECWN-4V>Zyu7@8c=`C2E!5xt{`Y3~ z(@#Hr`}Pe!|3J5?>iK+jw*dmlVa|h@_x;{llLNa3Egtj)f!;<4fs3#A=H^RCp9ob| zckjKSRcU6eb)qPxZd-MKphlrZz_DFx#fgqhF@{|(=dEsL*4n=Bdr*M(N<^w6s*`BI zs~w{%5w4|drxR$Qi^4Tk5|MRVkv@8@l^ALT6_r{_o|h3KvYk$&cTm%qxj?Q&!7L!; z03F9nI5|C>na8l8sHFl+IMt4X)t?q{rEc4X=YWl1W>`u%!ohaL#+!6@And$uwG>4d zoph6#A%oJ43hewZ1}!nRw+NiAl0z61sDwND!0#5+C&E38j>KWW4Zzr*fGfko0dO2~ zN7D3yL`92o#0W1cEQ&v0u>*^Qg}Y^wF|4<}fuij`Y`6`d&BSuhqU4~4icXEYUM`m} zU%uRKH2Vku;r9jMOY7_Nc1tnRyQ{!@j>q1MyIxefdg>y7+t2^ zFNr1wYv<@TP>klO%Wb`>tEg73tJi~HboYoJp=jIj1YiuaB$}$a8Hoyuh>O%Qa6AbD z;&AtHG={?scEBZ{wgpisRhSwG5gsgsD6Dt$1QF*LBP&ywyOYnUp2SH6vAY4qjH8XU zEd3|4;UWp7z_=R}GGsZI4!AlW1_fmup!BE@5tcg`9HSK}v`BDqv zG79RwgG@q90LoHKXlbx8E9-8Jw~e(h>xwx@3+V>?KAntqDYcxo)A@XQdHL}6_WJgQ z2>#PgKmGLAzy1{~`|H=QXl<-E{=yiENQUXm;cjDu`!GYzK}1&nRYmi_V8-|D9;5dq zd)l@QP5v=@Yn_QoEwz-^J5i_#5&*>Cy>%N_OGP0FVnC4Y@X45R=|}iVtcML@E~UbD z0}tkWxu9bPaOP^<@>0~~xP?SyH&=KLX_Z1jy|?f{RW!m&Ex=iVEhEW!?B>P@%dqjNw`W5T4meTfpBwTLR?>~G%pQzvO_`;ws5Rul}w{PEY8({Ts zwR*&MI>mu*r=>*ir_&kh<9^=}Urx4JLlsa}96Z;3cXu>aF-D78!F}JE3Dj&L=hrm8 zySIG@kd@dY;(otTP$^0*KE@gyfqFzqd5Rj`Lrba^08vBB{B%0uQJ9U0Kt){PVmAvZ zT(YI*y)(>W(cob!r9cFPi%3O4)x?pBN+mNCgEVYx+g54?+a51Yt9oc5THK?S!XoZ5 zM#o7+gsVwPEvM5~UM_u%+wBg?T~YNpWHWlp&XlN73R z?jSk#KIuZJ;+JVz&2z0IfQJVV_1?dJ{km$~h+6=0-}jv;`slrnS}Vdn1nV{iV*igH zKLVv)N=dSp>W2>>h^V(_V=z=@A~wc$I-%yi?`^G7oD(m#4jV+g-|rEjMM0NVk-BZz zirZH4DEIxo*sJH$2@29N3=@Tu;Kh)q?rkqxdLQT0$=uw1-)(`L5fs4?V@mcPbnIHU zh>)T-45Hkeb77jpX5kS&tQIvJNZf0!0u&y^z>f1eB!87wMw<;nb5#MUoLHPF+O;VMs5({1MDtkxgj$-L8xwAG1K>`WTkET$*LzzK$yy7u`kJ$yVe6`p1Vzz;?)$Q# z5s_^>t&fJKHpZCtCQ3x3wNxe|TP-Dm+y<6`)&f;}mFm!?`Z#STEL^A;-E6AlNm%Ff zi4luO2&WDY3!qz1=Vg%yhc+|Os!SXZeYmKYIR^nzk1jYwA`t(eA}=fq@$Sn7OAi$&dZQDG&)`G*BiQeAc zY>eJJreoT^6H%$9Na?-1nHGim1-F%(4{N0q6qQwTcBGU7jqqvPAY*Q=t4iJK=!2Qe zM()^ci#6k;Iz`)5N`>T51$wG7%v#$Kk``68X=iI0j;bN5y^rYKBQ)dPLc~ScgCcy) zwsBC1>NKxmG+GcZp&Vo|eWn!pw|(DgJ)KWxjuxI_c4;P~EIh{Ot*3`X(M?N49iva* zE=h|ZBG%$IBFMrq01HbPM1_P7L!#wbgxv;<;5eg50QVS!h>MC@AbWHRFkEM)1qYwG z^T;Wa992L8A3ALTu`I$o$V^pObk0VlUjKn0xqL^K{LZLUjxiv7XQDnj(p>xrVs!L<%)QiVW4ye)V7Kh8-S@pM z-n3}zq($9)D-}Z?=8;h>F$t?m5pnbFvZ0p(9!JiLnM0t~duI_A-D-7@-gb};f{0vH z%XTX01lw+4c-Okc5}~7E6k)v!k!Vp8qX;t=v1vX>%;v5|d1OFIL7Fh?NBWkrX(?DMT#}dpeVL* zl$Bs_<~Cqs{sE#>9q15xaIL(tND-?nY56?JZFt*9ay33n-_ zrC>ORFyIk1dKZzc7I*Khqhs1yL#1ykW!OM336WKq#UFG5+rDEGM@yN>XSCKqg2urt zh!9vjyq03aI(AO-3kZ$pT1vRLec!f?MVW04!=iOQO{h4Bq=-=faP!`}2s??}@L8@I zql={Y;(R_)(6F)ZyRg))GV|zz4rK7XTUAx6%-qe02)(w^G4(Gbk)`S9VxhnLrv zmzU4qeSaKTLIVf~Ibsr)`+cs=qdI-OJ+P0iL=slB2 z;#x}|z4s2u)OI>;TU9NswY>5~wi#-pUWDs{Cla2gclvhPFm)Op+3HfEIdd>@!WFHx z3^QGmJ{W`c*tTt2zRwwRmZ?DuGpks6Hd@>9B_R|cCKXW?4_B1`MG(KyeA}!lQ_;DM z>fIf(;AteqEL>}u44c46c-wc*>ae%g7xq5A9w=ICkX5E0KfH*B2ZDbDSKx;sd}pEo zT_MQsZaG`ZtSVA;w)#m$(0HDm-{prxvk@*3tgDs?7fPLTK0{IH^5NhBJ^S>e$Z?sN zlg>;*QW#+pvV@?NJU}uO5kX^&(R;UHW|z~}+TQY?eGD^B+iOz~+ z1mu2DiJ5!GIpJpH?h2KW`?7*X!+#)q4(h$*qE?mGc9_o9TFnM-Q5zjAOjL#$laNQP z1!dV%Yj2%7FsQMeQnfaQ1sKz4K&nQNky8$tVx2f9#inP8qt`*qX*ZDHLRnrcDOsB- zuV}h#4o`8BsE%Poo=qg-h_K$%FI5YsJeEf{&KHC&Id48gdCz!#-Y&vnOdcg|9Up$K zImL}VVKyM{z2ENJpRZpi49S!6ay%WM^_zT+@ZEsqXh!I1(p(H0v zTuY5o!+i|HKsOfRNp)|1tCd+wRU5-ShV?SVtEChc8KWbMAHxvwqxnbSMU_i&GoBjw zh_I0|U@Qe@#({?hzKCco;XcOb77ON4R0s5lHeG8F6pbOMGceCu4V!yWg$Ptt8SiJB ze2EH#wKj|=hQ0NXeSd6bNoXp$p+mfF;?q>bM~4}rmV$<8@4eIlxyQW8Ej;k!%K@4q zoIQqP%iti!kd#^E_$)Cq6&1{TA^Iv1mAH5Fhj(=l)TzRvwWhOT-hn>Nmrz_zSBID` zBnwa;9=dHMeZWfDYCUbI)9HM^oG+J`%gd$KQ);SIQFPz;J>R;>Gpsfix)`d8^J#_t={C&VJJfA7t&tRWC}Nws&0=V4V+?b{ zg##t6hnty}f=V}n3Wy78DHsOFTnsbSZF3K_LZF7-wv(13OtTtmA_~EYd8qJmO`%zq zM*4;A3gddwc@evFEJuyh{nH#vW9G8e@L)~b7SY0o@;n|((Gp>}oMW2K)KaEHtFx2^ ziNNo!7B6JYke?G2xj7Xj5HfKZcM#)gqd1~M(|($mM36yY91#Lfo5d@cwq?Q7q$(Y3 z;IxAXV`BPLGgfqSizv)elxI;(aDD|L+*%H_X4YE6c+_dzglTVm-}fnt>}Kvh!i?PY zv{e!L@cPO`wNx!-J8kFl<^1w;IbTHhdc9$i19lpy9wHXcBS!>PNM^>FjdBf+d8mS> zS8$!K&c1>&JprHg zfN0p6=Y8mA!h+K0^5Wy^2DY4!u-RZE9^u4fW8mZy)^I4pCeD~;xh5T)FnM^&ak0w7 zgPDsKDRU-^h(%%G$eM1<2+ttvLRNsm7YZ`7;l`16xXS_&NlRua1SJ>yEVe9%Hm=Kp{GtMoDPQvaBIEy{^4>q8~6KtZ*6aT>%+#F15HHXdOlTA*=iM03M#d1 z+v#*ZUry)KX)9XpdwW#1dtZ4WzQ1`urd+I)a=Dy?sJ9jom_4nvYKB?PQyD)+nu_xF z=sl@j(9z%htOnYMrrb41D3kkcmT=LSZ}0FK&n!8 z%G{yNP!VaZ<5np}_xnx}MX|(5vJ#K2z_2bt?J0%t6e@~&8TUAy&j>u2`E)wZN&J8o zy4G51@xYifq0ot?0NpI*EQK!|6+-Z$MJM$VeOYusB?X&9gvT%zwJc7DsGd$Ij~KmS z=Wca_h746<+<2wdjNHbs2qsoxQRs)$`y;Zvll%ea$GT-O1)==dYHo~peXPAe&6r=?cQ4JqmSM^&9j0$^yRYAbU?_Iq?Edqt=4UW zY5O#~ zk$D~Yv<*_#S}JM|s~Bo-HU>iA9Iy(~^hkm+r9ro-MIm{$F;Eg+b|cJ$5nk*HGsD;+ zad1XQ4r$%$YI}sC2G1la=r_Zc9S1}y1qK9g6clF6Do;3E+F;~JxGFK;DvLf`D$>I_ z%-!Wc6^0lIZ6!ozl3GK>4_H`uXwjltR4tRJbc4d4BM}PAZc&i3sIuo>i*FSLbj;8Q zQw(#nvG03t4PWBNx3}K+`~7~u-}n2y?K?W?Zo|!BBd(Y8DMiNlrK(oN4AE9=t@ZWw z^~;x^QE^8n4=b;=wrv|`I9h9n?9myyU9YX}U}s_jph>jCo^?e)$qc_S2#FC_-0yen z2;{zNyaTrZx~=H5L{KdyDA2PMk=yMyt0Q@9LtH5=!v<6++qS{pZTXqC-b*PEJ4}DJ zG_B9RrrGqiMG66$QTc?SJg-dpNZmKGiq{V(t4$R5m@afa9 zSa|U5!GR7J@=^+35{|H7VvDefN)~g?BWkG_LNNCr4|6!S2}`LOgz?CMzl2#-nSv}Z za|mOOf!agc_mM-`ez}}$(fz*PZnyh=zwh_H-^YN@gT)vGACb$cro+VKZzxMa^9d(I z(a)bg{lEYHzb|PDRy+=SoZpbvpt5gf81WvxLq|C^Rfa4U_gzjN5kUlxZ})sYtr{&e z+b}54E|*I!W#4x*7tzc4jO?wqhENK10K`a_mkUB(xNq)lhhQB64CYI6{wUKYR#l|A zkVR--9o=k*XsOG1l_F5x@rREy1-f9^3b^7Rn1a7?dNWZ_kh!@TG$dp6G$ox=#(1^m zsB8m>0XkpKDl#CoNipe+jf5S2j(LdiWFq8nMI?jT!j*a3Hq|ov4#hbiNaAh|gV;#- z6x;x$B1{sKo`J6$xAPc%3=32wRkQt;*K#(X0-FwU!(g~!Kth|z)l4ls@1Im(V;*Js zr=}Bu*%+hse!t!J*2XZXxjub*YkRxh?pW(>Z>?ud1|F+mS?c*zr{9`j@C31!N=chV z)${56-FM&pxBvG4U_s~94CJ-FuUH%hb}8k4zkmJu74G0D*IcjHX1Jzf-`f~t+v;@12<##lIn`Qf-P{a~UM=NxK1Z?`qV|qz$O{wARcG6Vub~%g30HI7`}T?Xqh2kwY!* zI3a~{ikZhla^m;Bp>c!4aZei$A&T@$h;R=iMJzn}X!}l?@{0NJuvsr2Xk%lT6|tF_ zkKWBgr*fo^R8|l7;g-hSa9oPOcuLQ2(a=V<{Kx;zZ+?Tb^?tkFZ`XalxBZSU#@!MJ zFs3>BB_ehTI#l4&X*6bAKqR+e)|0B^XJc>KY#b>^QY_e_J99}|A+ts{U+3B z&s!oAiyt=_XUjZSKB-P}=165L4c#EjLW~P}V&QvmwiFOrHb;~zXRFD~?3Wr?(!NGitO)v}vr}iTI@~!uxaOw*iwwNVp zT`eq9n1fi91zS2iP!f3HKq7?2$P;aa{U1IIsfuA7&)vWO{(Bq!db{4feZBtj%k6f( z-}n3V+Ixo>(#*iuJ}mbjnm1IfbvtdB^ZCPv*SC*g8GQQm>GRvik3{sJ{_}tSAOGY3 z%K%`8%bM#+W-~dHJcK&4x?(8f9QXop+zdzjhGw&dXUA${nCCB!F|xgn^l^GE!JBgN zp~eiEv=sQaWHaAvxzQuvS~J3Ulek7P`L>v%)1@9-R>G}~lG$_@!_=mjqjjZ3IS=*d zFrjkvsAUM?52alKyew{PFRe%-I%Zr5-7-bUMd@0bL^ zoB_GPiGY)_NHIq_!R{2*+p?{~8+vF@sT@BYhw`LBQe^PjQKP%l5O#RZU= zqor#Q`{7=_&@?bJf--K!-wL8+=_T>u^+lLk zYy16nyIpU$+kU&<@3*$!M<3lVSY|jL9*c1WGmqJ7Sa8*C+qTQ)`~u(W*SFW#*VotA z4=*n-A6`%A^Ov8${N-Q&@|XYlKY#e~M?~rm2Kj6nFQE34OwhDAJfdvU8gAOneDuv==0N*{|}W0j#LF9V;-| zYj=zVGrpl^#I-)-;|Vj{R1PMa1)v)iIWTJUI!JDws$_A0FzR?_t#S=y;Bry4z zAiU@K-h1rKiQhGS=F(PKJTdnnUK5e2PsWiZ2?)Tfi@B8h3zg^qy*7sW`Q$DPB z!k|C`?6oARY_hQ2oP-$^rTMW@;uyWReZSxD*W3Maxoq3^Z~yK8`NzNiztDh8F54oS zKLJW7(f8dWUfAym+KdObjvk=CXa3_8J#R8+o?e=tAlwH|)UWa2@xYF*H$0u1BaU>- zMb>`6{o(+rJD@Ei4glmM3NRL-o9TfUMk4#`PYNF0j zG{YmM_JRLS4@OYie?|YCA2=SIFy92jzBW8Zfl9;59jVYGefefNFzy^rBDW6#&HAju1}9LR|enw2rfj5uR9Q$}n1 zzTfWq%jLG6w$rv1u(Q(`j1OLzeB_uON!3rV(!-;Fzz3P1Ad>4@A7F`#5k`NLEs2Eg zJ&1cHrS$Z*9YB`zB!1i>haY^v6~mJ&c0|w7-~NZ={a&>M9N}PoI`8NiR?PAEEb+`| zM7X^6VH_~vOazf^Dgnb|04orq5svYqhDd4X+m_5x6tH_Q9Q>Vzvg9Qxjm@di;B#D13CJ*Mi%Lp55(g~ zbAF!I{+Ou8!u4EV^JtK#^%N5`o!1dQlpUT}62vHdX8Z~F%0i+fdc3ygTT1D8t~{Bp zrXYJ|oFKXS-6rt*@vG};q%C+n?zF=VM)@Adc`3!rDCG~CC*gBCtC^!5**XY&z3umG zKDc?#rcQ?N0@()|ZFuD~SQ`zyhJ9m%|lSom)(?@g>I5+N0epy`r1(V5BJMzJr*iHR&81o}DhgkXuW0CS59u}&kT!(Sc|qr-D- z?U`T>B4hC&o9)uxx_ck3C$%JNHgP|^pq`FHiS~St)SDrxX$6zKNm-}OfF|p>!?T2xC*5rraT`i`2(Bo`gYn|6<&VwBP zyr-BJmLr^4DNma9s1eLC5l^d&#c^=*wK_G=^|=pWokOB|Du?HG@?;v*bf?Y~ar%Ms zB5~(J7dkTWA|63Jy23~>m;*(v2uRS(92x<43!s%B|9)O>G*5TpLpbw%{h|sM5pYZt z5mV_c?Q>Dr(^-C@VBW=#bd)V^P1qKH`}E9)E-%gXoV~;wdV5 z4})hSAaLX9>fm|$uII-GMmxp(RPc#3f8cIY*t*0YfA8ZUpO5b;j1Gz*9~mg)jL$@H z-JFLLnGf;zy0fr9U~~`=i=2m z+LMLrkLd64v^n?c`s?NBJCUDm_5~iffptnF_PH&&qa2d(RD5baq$B1OBUW`tgaj$3 z^CK?zb-vEGGY9b=aUf2O`S(H?BMjQb0|&mGGlXG-&%v`+6A>P>^SzV;$EfIeHBx!X z!QL-*UccZJK87&H&9ZXL{1_QHo=EeXh^MqH^?v?bo_Pv>=7Qlv?eAB)X69tU$FTqD z2ZT{PULFE*_~eh}E>GuQu8Gw;prhOhhZe6JepwAZz2M=_;&+c^?v@!#J>H6BgustD ze%3dq8uRha`HwVA<9$OKF{BH3T&RTe@s!9up8NV%yI}-N0H9VwuJiGfkY|7KJ5b6z>_1 z^N#>e9+mZ#dZKCduB;wJ;g1#n>-5Xx{kjUMQDl}Zq5gu%ho3@`yu9P7f9UpnbV~kQ q1POCU-dgJs`SdE0`QIamfe>RXEb%h-cx?D!4E_NOnEwFc1Bm~C z5dQ@vEEpkVzF^5{Yzr9Ac)F@@Ro$w4&R#1sBKYuR=E}AAzFlhdy?38|_FgMjWaJZ1 zJQ2a4zg!6aMf;O@{NH%x^e?=^cuU0Tmm?^~`{Vo}{iA{?h?tm(ScsUyiK2f7en$Om zK|y@FAU^&crfR9JuCaw@h)^226+hH>(m8nX^@LCnk!B{>El3xD3(MZS`#IF)i}= z+{0Fwf?~Gj_M(sL8OG1&SK59cqV|)%g5w%a7c;#!eJVLDn_y#1Ofr2wb5Kykaos$B zWVg}qW@pTYCAF^)reU=n!AxT_^e;L7IM%c65Nzqg{QF~SZ|eJ*`LJ62n8(Kx6U;jL zW)K>C0Phq$Oc@Ik%>5e1Q*#QUaC`-pr9H$T@@Sh}`g%?afBt*_2iAm#DN6(qSzm>- z*ApV_Tnm!Gt8FFQ=kVDoj{k2f5KiIbK{9RQ;aSE*VJ7Cl8=Trc=}#q?8Q&<90%p3PN`7z-h z$F`UDO52>xE3|hq9VXtM`?RXUMA}ZLV{=mT6x=q3t~pHr;k?C}ZUMx-@p5bylvSOlQ(h8dYW&c1-#R`Ibe^IA{)^SJU){Wm=x zo=pw7-%0S2_iLazdOHPvXD@~&3ZC6DPir`USsV{nl!z#df@yw;K}3{JhwQOw;&9IV z2|U2Jn<8$Gce)7&=s=e7DQE!;m$oTKm=))5x%+S;jtD+2-}wyX^A?&tR@_}MH8jCz zV0QaaZ5v0k59yFSg2;K`jlNZy6^2tdhfl5qmM6DB`R1$}8w?H}&wFMHnirq3Q}^r9 z(V9rZV=d|(fig@|XaoR3cgT_(Ogf#5ewb;yk?zaen#f^PExMb+C%^HNJ&*&GiXN2X zRd#mn?w=d_YOv5w#|Sx5Fi&w&H}{7)dqSu|_tE05;d75L;=E(|428I(k(<@zv)gVy z^NelI;ltg9_ycf$W7vZ(npfdqV50e+IYt41;UjvCM>JJukY)m*+xGw}W6>ih0wEi9 z3nOMA&;EetMA5e75<7N;8%sUZ?3pr>XpT28YVc)mMX)qAraq`F% z>3N4G++fV?3lAR5TSPH}FgM~L<^TgW-%MMCIE88)!A3;f;G8s|e{8(5)42r|!87zt zcSt>MJ@$iR=AK`?3ohvsex4D8#VG>jQ?NHYTw`5s5PUQ*$Ma4*y!Hr>TBtM5_LHX{ zV12}15!0rc<0-%ao_yQ{jhK&>iJMcAPpB_q0>{G|dW6tWcpN^P?+!=uY5&COdIpu* zqQj1Mc|`5bG007u_>Hj$P9e8J(KsJsIw%MAJO@9=GRP^W9P2isbBWW|YGg4!!aGEe zX=~lvk%tQ_-36~gVa-&Tnt{;7E*xNHKEV%%6ocwJ_;7yYVdE3KAV##vhu4eFHt`AB z-bJyKFO8GW9z@OECY|EgIMMTTPi>ye_w3i>#Oeeekerx1fH}ErK5g_fxhXP-n>{p< zv+sx z6U=Dg_IIPRV`r?)V>iyE3UwasWVFYfAO7`#jpN1R_=-r(sOLFXymrTEplxM9_gl z;2)XpNMh+fm3Cf@$24}AkB2LW>3b@}&u1y~aT4}3AIpt zC*7h5K8Iy9S~w23AmV@XxBlY4_OJgNKmF-X|MZW4{O;X5W@cu0Z)XG%a|<8Mtn;LJ zT4Cl9VP+yCB1ELBZsrkqv#Lf!tu-PdLRImB{quboCw}Da)$HKmBF4A7TMTG~i~|J) zdAL;zTvZT@;BD?65kw&@EJ8%#K5hXAoVnvFsD1u0Q~+=?YhQ|sNh#rah{8Q0JR&;X zO+?}5L{!cC_cAkw1Lk*}e>!-XD9j8uLV=GB{3@)W){3=_2=`zj7Iu#*z0)#~%8z$ZyLq)t*|PXvWValB0Qx$?IOlzrv7Ddkb!+WPzVbyza4b$#Dg~>W~`)BP=tH? zJtrq~V-XeYsnrN3cP9_;zN0y%My0s0RBOiCa$FJ2EW*Un7OGZUfSF;Ft1zB>t(93s zTDmo&ZD68c7EuZJ`CK2=JmOC5ThL9>No~j7coj*AFjSaXtlG!#zx%)c!QcNs|K8uj z`M{uD5qu+B=OgcaghoXC?rG(-DuxGCn8A`T5&ya0{LTOL_x`ir_>Dh9M5UB{-)pV4 z)>2ADyuH1uD2wErvHB4XLt$n(a=hMG9FE7CsG8wNcpEcEIJ1mr4CAv}HKp-Pf~b_; zJ(gwZhYFrwz*8}ii1gj%A}Yenf-MD`ODO@j!Pz$|R8>WSNSMtG=M1)P_fLu|KMpZ> zv&zhF9uaU(xGE8e=*PJTQPgURV=XBj@Ywk{Iz%+W&5Vgz_}HZ*(DsN35f)K6^=cOG zX5PJqBTSp_+KDD^Si(Md%yRe!??F?`}pzW+uIwwd#$y*vDmh4 z+qPv{)^%lOhbu6H5t~^`iHK?`Z3l=5x3iL2YAM6_t4PY3BFr6LB&B57VOCWKLZDg- zekJ83EFEw*$VAL3B~{(`9kGR|Bu&_a+qU66#R{2Otp)D0Gl7Dwf{nCqn{-Qc59#4Y zQe_r*4~kkVPI*xUMldtgmc0iCgF`N*h;U9xRo(H($=&yDS5=$_P9eyvN0`-NG}S!Z z@P17>CmksWqNs4jjSFiqT$oigf<)MWKiovr+(Z?pVwihac(7_ax3P8Hv0npNg`ul( zb0_y8VwRi|5tUklBB_Ea90$I4jew903V?_#T(R0B3OGPy;Y{LIiHNnu$l;z+5|NY> zkk9||zyEK4@b~|(E&}VR^pVvNX?h2@PDC<4;3CiA-S7Ohzy5dr&VNx#DW!b)@Zp

e@Z*R5MZQIs$t+m1;MdZVW57r$v>>gWUT^H;otF@ZpxOex3P&9-7rn4*Uu{!_3RFv_n6l zmcq>2zPnjomSxE}3RRVvRb<X}65gG}%gYNE4(JGYT~*9{ z-!>w;JY6CHc1cC6Rm8_Rr6XEkcK6gHT}_%(?v_NQl%Q~TmG%ZR%Q?4{shhB9Qmf|f z%nXZ9Nr`CN_gZSsIVe<>S+Lu2bR^Y?xNg^!QqrUf>}w({nyeIH6%k3AoPvq1RwttH zT5HNnQW23-YJ_9wyI}>pvvpI|WnD!iJj`l~pt`0?Qz9ZWulp7hNpn!RSvALVF?Vcx z(Ns$zCNo=d2D*cjGOJ8PB4Ng&EqEhhW&=hYX`mi8F$)w)a6Jtea-$FsSD3k(MYys^ z(r^nW)<$rJxd?eg&da*4DXC}*^WXow|MOR0eR%|`5KTb0Lx;*h*CjoaaZSNH{g?mM zfBnT5U%b7&y?_56=KlTn-+%b<0p1JV2u?SpwC}sS!=NLg)FPs)ij$#ZrKqLsr3ike z2|<#kviAvecyA=ovvxzOG;^37OQsMwo*z;nVEsJ zVP|G$Zkm)CzLq?~qk*MxFSVGN2)8&gsMZn`IcH$tpit3hey$Nm`?i%@m=N8GszS96 z++S;f-%Tmu#CW<~5MJ(kA&Qg|QMfyhG|aJ-!a)cF0D|(8-7P$>+m=!i)uig?950vj|?tW2&VB5xE%=i%4EF zya)IAFldBn$_JMeopo^7KF(DUHLo}d5RHHZQdNMx@UU801TtQ?7K!3KFQx8fhf{m^ z*$@8k|NTcj5zM#BfG!5pHRnex?ZM*wt^ee2|670QFMadPH?Z|@zx{UKceq<3T9)PQ z?X7gf9dsekg^Ey+s-~2Ho*NtE4m8r&y%IO}N>u@KaeTvc`o1?aXXc#JvMf2J58r)P zN>LFa7R0rk+ga9iSr-J*1skKQ7F9GTN-5ahOU}$})%LPe#JVg9wcVRdq?DN$*QqKg zXV?}oW3$3PEqST6G;U59o)xz(EJ-ye-rlY_?#&DlbIzHF-3_20H(pD@_7f4J*h?h} ztR5()by*|A&Gx+{)n!?TyD(o=1)!f*Q_i`X*Rs3&<#M6M0yiHoO#5EUJSA08cds6} zMePLz#dPLhd?>PokV0=vanE)MX0I>n^m*62t*+w!qQao)HP|s5uP+f&opBn zn!}Aa;_s9*P6G>96$R`xP)`E)QEO$DC9Utj`fAcG-lKHlch47oD3R^&`S1US|MB_d z<>x>D`5*q_AAb1o;d;Gd_w4(Axm>)5q3-_n`U*RPHNXwyBbQ|voHsKA(%?cbmrJd+ zp)`+b6`Y-_GEudfQwAN0BO)aQoF!tg^|+W)%jI%WP1MPI5vjH2B?AR++lFffU(q6F zGdBy0q)C$s%f4^5+OjOFLc|^(9<^4F5N6P20>3Is4QLsQxVZ?Mfl8vzr5*%p%1yFi zZeVX!gqX4UBPi#z?>k^pXXm4{K!*3gt?c`Tt(#J&eq@PAPPzKfnt^zX5m1%AfF)Cr z>PGH8TM{5Nakg~WNCS56`(_@%T||`g!ab&kGe;DzqQIr#A3UO#D#C7tBTJa8d4!J) zLU>h49v(qvMI$0vOJ(0*jB4%CJr_0l}Z~L}w`<`=F(Pdex`MzC6l$e(#Be9n>m9p=p zxQEpO*tRSg)@kl;4ri~TESyrhZr2D>)qO9(T`A|J2_}g56SJ_?S`f&Ne2J*22-X=+ z8RU#;YKB;LGn1riUV^BWy_VXPkHkpmL`1Dt&2rM5lZuY~Kp^_`fR0NbEF}t}C1(~X zWsiuI^O6^witb?`;waW-A!1Ph?P6A$B`+Dfw3?-qlM1W2nTI3I#-c-=lXB+H%ZVnR zGz%gsB34T+6_mD{HFzWqD5+5<+DNAQ>R5c|{NfBbh%i<6(wbojhNi{_eRR-a!w#^B0@EZ3JZq^HWFBWkSZysa1irB;T0(`)tnL$@1+3c z=ah-L>;*P$EnP`WZ06Oh){>Hn3Xp+-`#WkZ5C|r-N)b!WBod9G3KmHzrJR5sap-I2G#q!GbMgqQ6&C7drBobr!0AZF zmwgwJpMUiw-y~C~ikx&S{pDHf62J1Rzxw_6-y_MgZ5uN`KR*LJ0HQoSJ(W^kU*7;8 z;7b5<_I+R1MOX@4L_|tyT^G0qm?>P;*cHpNfE|B(eap)NHhM2Rt}y3}D{=Q)iib0C zUKWtrxTC1q6Y0WuTv$F5C>>`?SdU^Lk#8%6;ZSIa> zH-f@UL;+4p!Jc1(^%MyFgs{ZbNU zwpt@%-wU&7l4_=^E~*iwl)PlKihL@Iq@-rnGF!~tA1J_(n+=Z6@DxOd$spDQGaHR+ z1oNh<3A@WEf-HiKL}*!8ip8v&2dHXds#d9`7TB%2TS^%Q3%p-Kx$1XBDiN**JbgZ z^mO?~NmnRl3rPNYWN_#E9 z_PQ*k6zt?uYj`Z{65(dfM8!SjEF$pJ*c8C-%)IY~BEWti)B(ebBwJ^+gqT&=ecOVf zY&#Jl&}7nZW05Qi;-yk6=#O50?BQV)N!e-<6?Yd^&I!ysF(Er)W;riGu`CN1SPQS! zM9C$>jyuBv!{ zS7I|jj&vE8^w1OG^klWBoZsHwl8SW9fG|K+Jvtp@{&CxuWdU$+Bw$_^=9W*W)!dS%Wmyad zwnfsEQ;u*EuI5G#N*+8>>`(CPQJAVMaTUI|JX$mD~ zDrFbZeczU4L6XRs-3>uUZIOVo2+W#AYb|UZ9fG&bMeMaO3yYL4!62qmtEwH)CQ77i^($zbOE}EfG2dziw)#EI<=3F%{gDM zS45>t&SuqJYAJci+GG`)H7^U*Qi%EO^;MG+QO=o(o}Zp7m@;BycK3bHOU`-0J@2J7 zNoFY?o-~Q7xrIkcx-3gd8bR0X`ug@NETH7Annz1Zag#J9cdOM>QidW#L`1tlxGp&} zlSh2~_z~QnFsGE=ZCMvLljuchL00w%N;xG>;D0Wc%ix8W1UyO33q_P#YW0+mlwe}A zpnAQECdd?*W%Y20P%&oSYvNiw7;MSgoq5S`8267XYb=888Y81@DQi zq{%&MDJ(3kM8s)vtF508@C+nDMl}o85g0^kL zlTIloO?|gmO3BRKt}L8W#_a%vctp4(JRl|!etmsK!t343J3xzl-`pcFIcp-8S_(6T z$L=Mms7kG-Dlv7M!sBaFId{$(NBjmbBP<>%rCJM8xg%RtN-aC&MqLaOl%QARCj7x+ z!Xl*<3St#z3U?7L`=+YqAxy$7s*+MfT-HmqO2pw_OHDZ;Cg!H%qX=X?vQwm#1L`qv znOabdon(VW605j}2#MsLBm&)(m`H^qTCxQj%OL4v4iE#aw?`B6K~BtFTZV{8mG@FL zYxUaD^60~J(yq5NPM4hK@``g&5dD?E`a55K`Q>-teYfvB;z$4$*v-1Gm&+w0uGVoFI=uoxpN35655zm!ur@*Pc=UrGf_fE$SjQC*gt zQg-*U7pqm1PFi-TTs$0kB1d8vBCVz|CPLO!AeJ4iSt203!F!q_#GOUD^q}_A5yl2% z?)8LlcPyep{kK5CQ#i5IvRe~PIpMr&Sx5uk^aO4PH(A`miLsQ_M(ja7GHvT97cZF_{j z|ME|c^7*+8D*UE+??KZ6823=cz?5^&a5<%vx3{;P^SUl@u8;{dK=1BmD$0vwT9Eb^ zk*B9iE%kbRTb32c*6>uVUbl_VO@J9( zpA^goxhCmFY-Apg;G~p3etexO-_P}vQ(u=fgP73_Y=C%GeSUua`s=T^u6oTm1F}OR zwk(UayyizRiJ%LyC@Cdqw%mPP*Cpp_b>E9HFUyMO*8r;~VF5?x?)$dwJ44askVa`D zX3p8&t9vaax--^_e0NSAFkG?`OE#fH@?O;E+vYRjTCxjTyj zE@GXB2w8-}*~4?rEG!^E+z~OW>as5GUdmH%dl?azoM1`UB4$#Uv7ozjgs&Xp6 zsV~0xqM?YcazTQInR9M>-Su)AB1AC6mvu!^ zk~IU(!d$IF)rUGa!Kd}QJJr-Gm3l-4jTaGHt#BbU6^taPS~Xo0$(FrHQb><9DL|3Ck5UALun6IlMU&vCDw8Ti5gi5Ksyt6$8bK}NSRd@UO&wh5>GiFrWilk4JE4QXX zDJ2NGkUd4wMk(d>^%Xb={LJ(7^SB)s_1&T?ECKIZkAGp9cjoE#jcriR6DQSx?_|!)Qmvw>Kt)9voHr8}t31f%Gt6N5v6;w{3r>y?<7oRjFj z@2!6)>s=qxn0QD=s5&)>JnL)z#((f1Uawd9?-6L4*}ATC*)@teE|&|6Jb-+VlPaZL zuUD`iPft%NC3h=(L0%R{56M*RMcLKNJ&-~d7Hc5HKqe{{TNs=ys;XN78sxYssmRi~ zPSj_J$hxeEdPRhVdq`cF$lTU-#l@tQa5&al_p&R{r#9t@hp)?`qSx)(^bT#?Q-ni} zs4CmGyL-<0a#_LUgV_XWn^Q)HXfJzH&M`w%Rp$NQgH};7GxC76mUm~zXu3bV5qKN`^i4pGHGk~owo>_${*sKNxj!hJT^!_c;nijVr?t_{$_gc-| z-hcVC+m;(VdUe6vM+cd^&PjjmcmMjg-+ueuci&-wMztOMIye?QS1jwtj~@XQRP}nj zx*5!OQ zq~L0HF!x>m4BzSQNQ*4X+S@>ZlOWY3B73Q&>_m(N#nD%edy28u-Ur0SDW$w*5MtoY znFz(u1JxiCjAsm<7iJ{PP`8isz0oq^+)K$&7?68GQ%Xrh5whbHU6#eoVIUCVLtY;q zno>@QK$Mv?6Obw&S@s07t@ZJS?;=PHtP!lzOG=w_;0Ex}GOA;Ti1_-;FQ>j@H{FC< z@!r%P=0v)46Cw4?(co$tE?-wrX{D5PT|vkI|1>PIEZg;p6DqavJV34!(ev|@`vsxT zw(ZN3Q%cmT)PhJU0`R&E@cHH4i?Hnb4lf8jG|Fv28o+kHClP!vMgpE;ngE2MY={9E@SYpR7#7>Td{~+&Uwk% zBHrHK++$hNfD_D;Qm?Tz6BZX)*W}@4FF}-4a1KMCN<_jRc9B8v!f z=+eBk2C?uMeOVs&yo2>Ft>HC4O0M$1{g?mp+uPenC(Yes0L|elmSq{Gbf{)}etrf= z(FMxXYL1vxrPgYVD-eK_r26)D?cxFf)>IKuMJiWQVy11|;Y}}3PY5^ned89f(cJQR z-*(LKxLhtNsheN7tDAT6X@iEUiiCMPbHQn&lNNKh3yZn+ZV2RV)a7n0ETYl7LBipI zmrxyIdPkWO&W2j+zL&mH6Q~tw;H0sfV9HZU?ty={PO1@*=(IL8EI=~IEhLq$@M#;k zH#{RSq(NlWP<7ENUxQFZHTpq7(2o-A(O;HXkjh_jYONW1fldTUD0x|zWyx?QrIc2D z#jJ{ZMbi|4ztdLpq8@G#>U0TRsdey`stSoE1fjuTJVl6+vom)VL37ShcEo{S|NP6F zhWnFvhKIS2zJF5-KjOde7yi{{UBSi-j%>8efH#$9A#D+dj$qriaED#CjsVmmQKZE7 zeTSq>MDnsgD8|g&bu)KlVNp#7K@>CPoR_??h}C-CHYU1Uo>J~5HoXA>i!4hfA{D)E z8_?m?GI}_z)d47HhqOv!^x~eeIvgF>O#i6%`7KI?SCt{|{ zdO_4Xx)g2OM#Sr~Xi{jn`$9!6wX>7!+)He9P%$^0L2eGs8KNLV1%Nwxfk0iXqL848 zD8#p~udg{J)UCS*G`&5a;O1u4RJ1qx3PhYeE~i>+PTE375Vt{%zNA1!BBJLAbSYyM z0Tnb_KH;brW)+1r7tB8QUcyWS5*=F{%~6uJvRI}7>k2V2JX)}*CirF!+FN5RZarke zRTF4X>XCF4CtEeQoSJN{lv=DJcEpd-!s_k?oDjyUP=K0JjyZQ9WR%ahwKo2W*iSy zmz+oEDYJ_77V^8;b%Bzorzb>aOtftqVkR(*X113?5g@{;mGFdB1LFaeIrySlng#(B zC$IrFt-F_6wRcLR-cJG=Zti`yz;xsNKpWjS8pDk{MN&d~^goUc^vqDG;jL*Lurj4q z?kSk?=rkf~AW_pTDP>Ix%P_0x43l$0Qi_>#(&27{C?|Eu2%;D7F^yJD4aS%^(gqR_ zW=%;&8HHoL90!$qFqvAayAj7I_ZdwPP@xC8JDvzLD~q+xaIJ?2v!W^m%bRm{vr^5> zQcjB274Fa`lv>|j-<*OxzWwI?_4;-y${xo)GgIi&O0(lECTMT}^2?w73;*K3#LU<0 z73H2IUAnGoD;JNb)zB4atR~XzL-*Snj!P@38It!_?~FW!sF{IXdAeLci9lnBbSX+1 zdd4vjwC($Tyvi@fp2So71k3J}{FDPCrD(HQ4@Ub2c*GZh6pgYs~ctD^qBsSmg}uXjhAmv(=` zsMf_k-}k-c28hw{$jz#^GZt}z3@Aup9!%tBUJW8))iesX5p;p?hky#>3^gTmI)QY` z-LKnqyIxT+5FG#XpZtF(qJ_@=ikXmAjYo4NTkMyY@yB9Pbsim}vhThYw3#uANVYQZ8 zDF8oMR8mS%rvcLBWdUb`gk`A(y}nS$hvrA4k{WbA7&T zbmwCk{WDq;UIonb%>8fMX4O#dEiA}(wmwRNHjgc>Xw@hv=hP~cTl%x{$?dE_KO<_^ zkMLAfQ4>Sdii}|QXsyE{Qz^l+2ug9EL#pdA%T^}=1yUP?6FMpHY~aH1U_vX*7vOD$&g<98oEe*B(K zb6esxm6Ahq)<;u0j?SBZ{6~NElVAB~p@eBEJ$Iy#AS-~~V?hU3gA}awCJ&?gDde>P zc?ej2v_aDZZ*<+Z)=rQJTtr^-<#IvfF1@K*UKS)W5c_*?f&~pG9L&D&t(_Qk3UbN7 zNG-J^yj?duer#PdZS2ab#`89kL?Di4&|a;DW#gd{N45W<0U3i_)6~1{I*tWRDck^8 zRFze!w{&!OK;BwvEhTA6Ik_DTq*`ZzoO@Y%#8D?P@(|1-U_!^@x3+%5==dgg}MW0ag8LK;Mz5IaSybDailg&b;aw`$aoTg!(8xv(;z4~kQndrwRWH;>j` zHFd9PwLr1M9JLy>Jw$Zfwyn1)#V!6ZTzk-I=Es--#Y99+qszB*?&v6OqDl~P8I z8f};Wkg8Q?+4q7zClmo82jWXnZIV|e^w2XiXa-R?i7)`y*?e?LD1n<2F)l39XgG^- zO<8+J79_@~I6)hKBUHCc{}2mA)XoI8emAm>_k>AS_r{z4viDaz$2mp!w{ERuWzm1s0GJF zKmXaElzl(V#PrV0Ow(KW`LYr}8jQ^+)!3i?=l=Ph{Nz_e1cW+l4r!*Gv%B?aKi-eC z)=HE5c?zP=_x~x)&p_0T4xdL2VhwUhLN?Xpb>*g+0hIYo}Y;`m}O$nquLq~ z6Eo#yMN+1gieBuk8d@PcAz{*#$(@ADzB5ZuKm*g84>vVDb&|dxAYRQh=@{ROuop2j zxkDxptxa0%)S@CD?HIw~)YvR!TbWta+{xSY17vkdt>j^D@CD5L-8Wyq|LRXB6OKMG zD(0!9ZsBO1a=yQc5Y+Qo5>+d7AFqi?X3VY3v>d zav~~wL0vf@&FyF)ChzT}kL{W?ytRbBZdc~s!&X{tQS`pP2g3~PvR)ztg6w2rFY+m8t|del&-r)qC+FWinh@R*R? zSuMx}NpI;&K~8Og0OFR`2LZ=mQ$a$>+xp0ga^36EC_K=ST2$Ctv&g19AC}mQfjnA^ zrGO3`8LnCl?-$_@@8AFY%RlKo*>BAKc2YDyw{Zr1JAUtemI1|&e)ywb`e%OGJL5ho ztdCCZ%nc#TUb*LwW-FN^8}unb>W+ISH1En%>-7peHSz;A{IH4IqPDiG4%i$1~8}S z(mIdyLBT}yg2_<=-=vq`I)cC|%?;h)lBPbd!7*igoG@cB(Qwe{c-k6RkM8>vi1?2_ z7;?PVtz+Pg1otCdshR5+@DTOJOc*xf2rsXXdXRfO9aWkiRPcbWp)Fs}DP zTY#%$j7LPvUiG$;C~0NklRTA&`(SHJN~$Uy{J`%4EVag{(=0&v+TKZ+d)*rMPLM4s z=o`LS;TW{UV>sWzO;J~u0kg?W=Cv_9;lv!?78(1ti;>zalF?b|n2g$`S#54N)I`Fq zCxu%r_WJR|w_m@X#-#O_m!~o7V^--gAwDRGpPw#t9&yUV4<-hmhFs1w9Q_#d&L`gI zm@pY}JHZ~JyLn>cO{au@79ah&yHuag4Y|joIL(`!R^dDf{E^D}7{kWLq~KFW9zG3{ zZ*!TC1>qSoav#t~^E`<-PsHxyvu|fd-26F$j=KqmEP(aLT;DN$ZeGKGP3~354-zI^EH_`h*$oo9Uj$8W$2d)f6&*jEcSFo+2R`JGlclxP%QwN|41>Fw+Zmby*-49cqn)5|W z2t*Dm8N*$(rj)YCJLQ#$^CHV7=Oq!Z;rZzWRSKs8%5ARiHJ(zS1|vGkFQ`p?^}Mf zIl)!TN6;z#c!wD2(JkKGE}v1>>8|-4G2TEFnT8uP^WA!mI4a_4^DCZpBS~ovf z7P=oLet(?uV^1kJmNdhyJ2cI4witett~k9YDT^jF@jBwFn1DH-ES32jnM@bP#}&!} zna0D8yYfrEn{3Ww;3(gn0x`q!+dTUX5T8t$@25}m-3afvKb-k=@wb;A#6l$fW^es3 zot#3@n6!M_NIa6OV`NP;_eT~#MY!|R7e2y^!z1!tPbR))?dKSHYOT@?yVYA~Ge56*Wac-M*6$(YsMq0h?@XS7*GOQ*O*`4CNMPo&4&2S6 zYhHx;^6oRMHLRXGcFt*pVZ;wNXYYx{JoyodTdy=ekZ(MFoW-v5mB(??O=S>=^~EEA z#JA@+^J5=#Dvpl(p^ni*_T%=u{C&a^BO>RSbG-Ag$9m4t?PMA06DATfn{$LUBczBp zp`r;1o|f-X6xjw>5uiRO@~qF!`;$MT@IvWzb9+ z#EE-9j|Yw*p3FUNcHP50I%0yjF{L<>DExr*n0YHvO`0&8;}s{J^B)=36px+K+r2v<&#mC&KE4&L74#4}eVX zc03~vpIrWVED{qvzSP@$xWS}zJi`;Lh*OL)Vc=VHKdmFjC*asG1ar3*&$9%ISb`Xm zSj_DKgDe!%a2nGiHsaIEdq=_2BS6VFVG^II48CDi=u{jaCzo}QHgR@)CnPHr&rvT? zgGlzPFPHV{C0{Oe-!a+!w2|Wcy>S-l@gwSKxJJ6;E^mu4AG+uJF!nAm?Ex#_AN3ER zYTTB^9l+Snz=_XW=Wswb2X9;Fzg^0c*lbF^ z9wGCi<>s;BcqAZ?DHBtwrDL@dw!F>ho*y3%(n^{?=}lfwK&|nigMi~x2;P!&F}N_k z4YQbU2sEt5kz0^6p(~SEkH~|(4uC{%onr|UsI|FrT~U1=b{_pjKeD#%W{F8o9Hk10 z9{0%1?&Q`+H3<@{#1UlC{z+(K$0JwJ8ImEUamW(LY+3@Cv-B(JdXte`X!NTx8sg#C znMe|0#4*;vyx$IZeV$zP96C$|Nh;KaCzBagH76k1H3qL`TE%-3RyGs#Klc}~K2i;)vn z;fcPO)Gw3onN}svdu;5GQ>lBGav#s$iM0KqTOa$$L{1_ka(tQ{lc*2bf;$POLUJcG z2H+MxVG=&F`dCk4^r9P-b}v+oX5xoRf+ue}KA*WY6|Ef~qyE*}W*d)&N_%WnbQRucqa<-<1S;u6O$V~NhdQWD^pIRE6`(xUp(a|=|EW#=paf> zaSMB$Fdj0y!sO8=6rHgg&ypJ$7E^n(C>;)Sd^nNF)K7gn?AoX^r6AJ&rS0HS675YJ zxD9_r2q8?Ym}uFFUv66{oY)(K(UwAn{Q9scVWKt)n2krQ7L;NW~xjPx8hn$EekL*T3`;aeVEh=Sbu++aEG z4ZF9QW{-(=SO(9@PCh9kxOr-6Lf$iZ&jI`}T4wO5(l5Af5sB~gVfNCcWUW*sO+WA4foR&X&mTS ziI^l2oT$%o(blG-xoSecdBiY+&QfleOHmttIqC|I)75Zg`@O6*f|mDE{p&fbciG4AT@6PBlnl@;5(T7Q)>(n-^iFxaLg$4^`_eQyUmrE#OY zJ@J?N6Cp08%)BV#GPC@dAqBB9qNFNB(5#nq2*Wb!rG{ zRalGcRbt^&0){T`FN*;wQJ#}*%ScXw0d+_1UoIIm5jRAeOZt_gv_kENmgC+Ax^>LN zFMqt%^5YMI`PfveD_#A*}tBc*f z^z5fRM0W_?GPD`Db|dn&(9_Hs^Hl$r7PA%#(J#gYH&}lb2aj|}v+23atq|GS!#T}} zkl-Gq_E`D@Qbvf>&~T*wj{S1_w&^YlcqgCCxyB&&kl6DNHX^_F26mdgGb5^o`=7C) z^x`^(cM{Wv*r&hePWRC+TbVC<9LhQY-gs{%{<#f^SuDt}h;pty{<0=pH0I)2oC-eV zlqss%V)Yw*`;fMy1Q}#9=eMPqMQ_ z{SeY|tFFCaq0+NrX@_f?*j$it-!EodBYwvwBPrdZu**UJR zrCWEKdQ?3lS{q^ECxe-v(eI?;a3LoX%gb;V?toAkraie?#N0I9+8y=Wh_q3*YfL_T zmnIZY-hA&@Dk{-RPuZRm9eSj~G3y}1KHSrdz)k46#oOol@IzzzA;A|7rU{!|j;*J2E9wqXjQ%fS(3 zbLwjIfOv0c#Q?i&Gf>?PS>^ zk_{{Dw@;g@;cG-Ch)D!CeGpm-FIXkM6jRR#8K;bwc2h+Ow*}~p;etBOuyw?=f%V+3s>|vdV>*HSH&9J*0 zn1Kr~+gr^!&wo>gwSy<*M%+2?Nxuy>rg0v%K^<#r1Q%xB9$;Qxm3>0SA@p|ipgi*C z{s2itx$m8qL5A)bP8@mVI`E7@ekI;Q{`*flR=2Ih&0(lSYV$jy!}did+FvWS8cT?$ z%zS~;f>1J|CTa=Xj8D}fC%+cQstB`Bv^5rqwxX&(s3a3Yi!du-<39manvn*}mtFN$ zvtGm=Eb2}(`(t^wa2aCbF%+;!LB(+;H1{($%~IRg6ZYAD*e zSNhzbH0=R6wCM9DmdXcOB99iXet1%x6;*#|_P*UPzKdBtA73Z7oY09sgMvf^ynU}}Q`GLD_m9kA0fFNw2$DN||VHN*TO0z8z;i?`V z{;}?GX%>l_v^hf>jD!fzp#}W>m_66Oi#-ON=-uV<%PYJYrR@^c4>*{&_lRUaCm)ID{+2Z z=o<>DP_rX-J-401oz2a!t}VSp^rX81gtE0q$yXk>P;up9qGv%{b`s(WYg8pXZjCcODsvrv7rqsTULXw0f53@)R zqwM#YV6kli=&xpGE=S4)>+_o2ra&PJ_R!cjveWcR_9G1(2`LL2c%P4?F(lOrD4Vmf zK6ygtN3nEMj^Xw)=p*NMs?@BH{$^)Up`wV=x+KzJz!pu93%}GUv%smv)3tW=!_jvF1uBJ@m~;Ir!Sk;mwnQdS?f99y4m@v9Q?Vs467w-h;HaHP zQJnJg=%<%y%M0DeI|x6qU5sW`aSGyxzLgS*P;kcUyZT11I#4cR=^A(C-#9U{pLdt? zzhFJV1{9-a^7%eRJl`K6Rn3^Vp+H=@N^b2ho~$4nT$^>sAVZeATJOnHgD^8MOr$Yv zA8)Z|?X#*jwJR?squWkB8Q_u92-1<4$gLz1;>{sn2AUOgf1UH3DnKI*Ce#>OkQBX>v zuIB=yJb}H`GfYWX;H?{T3mbtwjgyF0ol3g@Gv}ST4e6cfAqacJxV%z60`tCV zB(7fL3h6#J7OGfau$cIev!5HTU<(dho)yefmvt9LpQKV68PD3& z%r(epiyX95Cj55r0AVWsh~puHgvtX$p; z=?l8n)Vk#jJA{mN&(7@1H^$glQ9R{fOvaLK4bjp^3!_kW2Y2xy4Vp*;T=3JsYXnlb zyoyY%T~Ei*5JWxijLO2U2`Pa%Jflpr|0CaOU0nu)Y}mgm2yyxUUgxEOhrpNT5b%aa z*ZlwD`iPv8BA<~zgB-70L%lZQR{iNtt=1{3?LL?0t}Ps6uWzBhg%@HWqDtWcq*JP3 z8u+>d)Nqb!h_pW61*B$73CJs8sm}EkX{&;6P*-{`Y}u3!kxJE!NJ+i&rknOD{2N~T zV^*S9bXU~bfL27EtZ^5Uc4fy2oaRwZRXf6O_ZM7zouwkZQSpI~raw@{#Gbk~vd>0# zVLBbHv=C@G*FrAsqKR{8Lg=fsHi2WUWEV5HV2a*>i-Q}JyJ}6Y)J@L1NJ2(ZE%U8p zFjI79)!4u0+vh5hEX!{XJ<|IXuFG{(yUMcxj>_Z9o$lNjJ^;Y>oK2hOQaQH>H42vc+c})@#fezOm_EQo*qgWe_LVl?m zxufNB*(WoyJw^3%g&KUML8=8~i2YX}RGe>ff%A0f{(M$^^p$$hi_caemAG<6C z0Qq+T5-GKrU=fk&ymv7!2yQhz99nR`JI(zdz4!shjm2M)Qc95+yGGa81>uoaz?Yv= zeC_cwm+QdmONW8p)YOOvRN9D5eN3jtYb3HN)9?=T!-}QTfw`$$DbC+FnYCU>@*jyc zI}rf$1|KgC8y6?ZTAj?2FDW{(yKrZQ!EMffb6ARp_Apw~UkGD6sj>L>Wc_##k^#B_ zwVPN#f4Af6s1k%1a;j>b9yb3s zP7$lkrnTU}5vsw%(!&2|Jorj%M$qm9g}22AZ5WxPnBM-huA0ETH75pO{*zHKHfzap zU<{`Y75!giH|sl2#)PGtUT@mBXMu zQXBC|KD-uZH*wCa&xowOGGFe9T z3YIdNq5#OwUX;e(pyOi*7ut2dh8AC^+eTQK2JK*WD+sD+!uBrw!XuD#IFj2y{J(I* z$2Xs5H^c5P_K1-)*}Uw_AjerrQrkG1sUT; zBjK>lX=J9qYERbXLLV_D4zkPs-uA&r zQ9^#Fs@rCPa*>|z<=-wK5Yv-zzRf;}{->yJg}x^&p{kmB(wqgnyx#=>q>mX>c66!J3v*SU{Q@rWVUdTTx-PkpcY?IwSGs z5>XcJi9;STbsPE3Vv~%bvL?o1)Dr;!`6Xu6UCEXLgD3^NXiSW?g0Xi_acTk9>f)%p zn8}$&L2i^7WMV!;-dnXL)}C~`O_N#WQoTaCP4MP^wf7bpXnP-XUsix36O z+emE2=&g-jaxzx;?w?=TiB~FpUOXqtK{rvgvUob&JjII~PRz5dA~8p*B~)+4PiW zSO~`lCPLv13KXg^jwK>g2u|fOF8Rj)JK-KJD%eP{k(z#@oytj=87nSJov{(}Qm&?K z@FOc^TOJ;cWnA@4MN#YWLunYC&S8I>=au^G{1%Kt>hwOO(gc*Om!!)a)rP`9q-I z+gB#qTt{jtqL=Tu0Uztp@c^tgRlCz%tw7xqnYr&)?8Hh~Od{KM`LD^p@|fZR;!k!x@$wYI@pcx7zWB1e)mX723OJkST6y zfl20AZLRzrJEnM)CqG8XCQwyp+SGbjSrg<=)QO?r1H|GN(*I>J$>ra+QFJ|4DPC81 zz`-1V823iHnJ@3;KfWg^5*HE8H7PpurWdj59JON#M{r}X%6o#p6ga)bQm14>X zp7{+1h5Y068%Zn3*{iG^t*2`2FeI_HZYh|2?Nr*zQqQ10PTAGp#m)9MFi6G=na2o@ zc&cRNQIY1itG(&}IpdL9aKdRE*YFhtqXW|Oz#|sN#$FeekL{WqCPT*NAk z0^QTW)3cdt?|<=V?3h(T(GZW-h|0LDcUP4D9XgVHXcZ`#j<-wQRt%uBF|l|f{y^On zq(>?7Vd?y*x%+i}H{;VOE}Nvy(^^w8s*EPfco6H>hfaL_9kIn+^DmV}Mm4z`)TFBB zr*QpFh08}*7JKy`DnGOtWS)G*?g2udRTD?8QC7oX4{4KEz-YC(y#2j!%EA zUZFNTyF(MIjpzI7mAxpzC{@A5_g=ZCiWZSc5dgopv%`Lw5ylRP?S_mU-om);cR+{7 zub)NrHj(%iIls7i^qfj+ggpWzhLM?2v$Mw&X5y-B&ZjWS>{O#TRc#G_v9et@@1ojU zo#oAc1Ndxa$1WFv!i!zxup#O4OD-kP0Bamr$aNReeYGLIEkfWFY{b?E>(uD+Te1oFV^qZI^0E_Oh3Fbp2SePbF;^5%G(NC`Dt2#s=;6xoS$3?Qi!t%)d}@ zZ?}C;B4JaqFaSE863&!E-L-N7F@is3Xyws$?f!t1oZJcFzRZ6!GXQ{;!r4r7xwM%| zaG*$^Azf1%Kl9Coz@GEO@R)n-mBDhd6&{JR&K9O=rr;#b?O)2D&N|jAnxB=m03EkJ z>s}ux)a|;QY>p)N1*Hx`nE|b*4=@<8RVnc9-@oK4x})lP>i4N3bHQmPaic1~%bJZh z%q;{QkRdtqrUhU~;~vs9!i*BT6YFwMF=+O4e|Xa#Y9O7(>mNc~?cbPIR2CWQDUw|x zhw@N}xFdT=&&OUW(%duoRj6DlqKi_?TPKckyQLA;4Ws}t?$?Zr_xQ8YM&-GMW z$$*!9F%+?GNZt3^#%Fs+Oo^=EUi@{28u{?p%xva#;R0q6tf^U1$#9B3S5u%%pz~6$ zRYquoa~L9L&(=jm$_Dg?!e;VWwYL+RzD9k*BZ_bRtB~MNV8=Vdlb!kF9r;g*349M8 z()}qnfp|B84k$j%b*fe#hK^txP`W5*GdJn7S!8VsxBq-s%ZZzg4$o)2fNp$)< z)^EMGd2yp5-ELruFaG4#)vy56zc>|V^d0uEAmy*+a~SEw$lPoA+f<{NRhE5uciaLv z97@8F3U>?LMo<@yLY3uIo5Rc_6vnL{jXoyomGLx2;(_Y8@59{F8d8W#rkXN>F(uxgp~BK7gTAV1 zFrN^S6C1@>YcNA4M=SdE#8Pfdlqq~e)lSUF^xca7p+rJLbj3lf%X;DQLcY*ltH5te zFIhVG8uIdDb;@VA>68t*2bnlthBnL;AEU=&HECP^T7A0oilrkVRY({T^fyul8~?!-xh-y!!7JVw1;Wl|wg5h6AnP!cH~NjBk1^b|*0dSNc(iCtAN%blb1k~z zxUYdeS5br2Uq0qlL`_%!DUvQD7d33y)z5(4T;jiyd-XGrKtAbSEMUbbg9UY!%)6@u zACH6L{_Nt%EQt>IRFa@$m0&ak0-I*T*X%l>N2=|-QiM4}MDb|uXnoy{wU`2_tmbeR zFtFJV+(6X$Q^a~Q74QOgGF832b#pSf9!zFN)=3gumz({n&)sn6(UCwoKhmO)i|E5Qm0bW9F zM?aeSjQG6Fe{2UKw8Eltlie1o)&IDI#u{qXO>y+ThDxWKQ>F3}i?&rK1yxUowr!YC znb~=9TbzcY+yujT!N@HPV!dMCMjk9VD1W-(9z9@=ke9cAa|j`s(?Dfp_5u=-j!3om zPC^MS(Y^XKxIo52pSVs19loS@-!#n?cGBHyCz@s9&sAB9R^)iM(*g7gHrZnWDIp1l zqN}-MZxd~1W+=lm-y)ShNJv|l}&mluV%6xD6JogJ_3{5AXGO14sRVfXpy zPi|gqQ!(7}O$w_w@uePMtH63AG?9IJsDug13SVAl#IZCR6Sy2_D8Z&8^MJHi&L??;fc&}_kwnRzAYV2#Fqb?Zlb<+PqkwDaV3j+7YXsDZ+%6aQ5CMApF5V|b;jX-cGSp$)#^j{*`M_xNFoCFcdS zPv;qtN(YUNRyL?$`L>ic*@MT6ix|Nw`fD+wAR*L9r(>Ng%(ALRoYzNK$|W@={5WeG zsA*q&o#X1!Tt;8TciO}?_ZHKb;A=E&NZ2$8n0Bw`_bEnkU0AJN;|ekDZ-jahqOX^p@z3&+$E&Ng&;uTDmshjHPq1@6^FRH-Ou1p(&D&g|pBUiP5=~d>gApEw&QsO6 zgA!Bn4E)@5B)`zjzPQ>Rn;`K|Unl)mbPa}JIRU-#Povs4oUE#NJ$-#tPrE*RA))aX zCyk1L-eNp#)a|PpJ=LU+FpLBOLIE-~6I&&{sU(&)+-AIdp`v;a`QLy_6f@biS=#K^ zB;9KgMs(8&?x`iLOvD~Dsc}r7iI|CfS**k(@O0=z$kaSZ+3^wUA(sL{+m~74-=x$0 z@~bWdjndk*QS$gmTyvcYievuvcVbjf%HNpG{S0I<8jrJ}*^&Sto8aqwgCrSM zc}Nd2St>De4N(81t^s1{GN)zB5No)=Ct(e%1)YD&++vQ4+58LGBF+=0%<-Qnv(J=( zSn3WMvdMOxkoEESLmU%@D~Mg&cfQV2BRhLqgaRWRCKAKC+T${u5T_&D;9!!s4ZVdS z{lmO4`(htS4#62Q{ON%C3=_eRXDGsU8l!z;KOF)|+F6cw~ z#i-?W2e%-qrvff0w3DEB?JSKwT2?v`ezbA|4h%d$0BVk#rQKG=P5K{mV{=4wg!Vf& zijB3W>tpvfm`%ie9%^l*mka+TFsNRuw_=F&oQjs({;{7(*hl3!ybek8LLe&+Q2~TPn}a+dSW)8DLDs^smn0Fi(Us z>%p@5?ODkL+Pry^S~iyVoXtL@h9ycpQT|4N@FxBsf<*rVJ40Nu2h~^ie8RmTS31mC z(v;+}Y#T9ZL%J|4>{h%gX(x9s&I61^zb>Y)ko&jX`O{cD3|@dk0;&3;m>UckG(fJ# z*!c;3{ezMtly+r9;PEv;TR{mrn-sSqzD7$fY;ps1sOlioPp-Nx`_bZw1Kj308H$ou zYO-e(YT_2J0qq`t`%tdeD!W%Ay&cfo0bMZp%IiBzXaDyHQxN6?YOeGe-|8E=kf0<2 zBq_Pxp&~a)jTci%z(M8)vgU2802jDs&h?!VZ=0ZG0({_I&0T6aWzeaaV_t~*au`AD zF~^*L97Bf>Fy9KoaF7z9rA)MSg;&mtbCFA&NWDvzf3&LJNiPZtG6Je#R2YA!AaGU_ zMR}3?*4xehpXDHVpsy1S>euMaMl13;CeeSkMve8>1~D(HR~~Xg0yoVa%3}Q$f#{v+ zp`@a9TsbT@+UfEI|tmIBf;aIrRx5`TaAn@u=6+m}xUELc%mpO<=Y)PxcH>Q>@*IZOr zT#=3-meAq%RBf!*ylarwhy_^lkf?5VqP6ST3997?rvS^9!Pu z{NNyNB*fZ1f7&0$D}DfTj|>k7uX|`-RV%74<#8xc57Vmlb|-wpcS98w1Ik%D?vE-U z%c}pS&&@y|DBpcS6QUaM42R*FSe$}yBWT~PA@P9uDQA>=4A(e;4yeOU4k)}m*YQT% z$x16273l7ko?s|9w>XFSE1RXpitBz>mN(}k>*Hnu6+(p=?EJf&Di%_6wtq>&*ze5l zKKf$2eAHNst|?M*8k2%IOu7w=1r&HL=CY(Q6dM`kn5jPH_!gmKsB=4pUYGb8xU$sp z?drw2Dx{Ka1C)bI_tLX17rvomGUzZ>X8tl0B@fzJf*gtDp4vgrsb>iBb@fTcCQ5A` zY(|Y^;I31@n3ni8#V6x5u=QM@0${V!Gv#0NL;iM!%cg_rCG(uh7YGeG5A~#0_POc| zE=+h^x{#~k#*Pl?R)rt!xXp|QOl0?DNysVuWT|9AFViZ&>L{VeL4QLvBVIhdUYB|K z+Q+(bLoz|WvdCB9@?FoTfT9i)t*};V4X(4j#&PQtd)Od8F~eY_Uc1Pl63OolXj0Z# zZ2YvZdEppX3U_TMf@ZX9u3KVWis9pm?6NdKApPS$PGbjQwxQTu1TC3BBW6`Y9`k;- zrq-eiEe&@6vSh!TJuMNsY6i|HX^@LeaxOl3J;cSj;1o^PSO_wMI^r3KuDU?b@zCN} zBp^ahgcRY}G;j|mi%au*IgD-jIytQ|t&HMODaw`bS>bh?MPYI_Ru&w6Eh7nfxd^pq zN72wLja_eFt)f>wm6kG?Ogid3#eTMM#pGL7MQCUh`3_Tb$I+?38}hDoliTbMyQi3T zJ^CYHFZ^0t`Z|)c+4GqjAr33xYXNmmi)c(dtglPnq)uJdelgMI zg`Xo$XH4}*W(cZlaNX{|*+FKbnrTIt;LtQ>U^f&mh65KrmXHB-3xKfU{bn(xL|->!HlJq_`hW;)OU{EWEqYbVg}$qk_|e3=OH_2acL}lx`hU(C&M~7^(FSg2*kY2&@fvA-G_i9fEkw2*7YWd> zoMSMF8MSH$`$xV(N?>i`PJ- zwqmv(5=OBoJ;$vhKaqp_|FDnl4~k1x2|C4^Q=XcvOPHub{V)|=7(Alne9H7gh>=kj zzrwzBa9D(#p7JoNd3uRMaV9)mK9% ztL7H&9*(OYsvUGKv@BOi#F``P{~)o?$_z^?fuuddfbne0a-OdT6>?AGe z{T*kp(@QN`qt3XY8!JUL%M=M=&CE=}9FH~mcV2g`Qo$>KE_?b{mUv+aI9L|zGd`2w zX$8XVY)WZE3gCl%9!g_)%MuX#*9sxpRBy04$-Y0?R`7<`I=3YQ`JKdD+D34N2By6q zZD~gMRmV|2aaL1<@C`wd4*MZN9$zwTdS33Q;IjGAjHTXQ5BzMvN_ z*D#~xoJi%4e$Vbgsy#V7?EddD{b8`jdQCHSN}`96G!K5Q1JF5ve9c5ZwMmehI{U{u z{0q1vBh^E7CnY@Q)$)4>`r!SSqUfK;nf(3Th0ouI<74+t&;KR)jho+Db20+L$&}O5 z`#iQF9XeiPbz>xT_*_)>c}Mn{<%+f*mH%zgI_cFwdu>bACmABYbHfGlJC)Qtz4z9; z8=$H=1UQgpi#Wx~5cTUE7hOmC5f485r|IFzrkwvW8HpiSlyG%M{&DCAPUDc67 zrew0^bHV%D4Oe%R#{6(zfzO$);GqHH09=6&yE*L40mz)nKTncZwXz{0 z#Z-&ib34S&kQz9neZ~isY+(n8Ag~aD8Ro>qPQZi~ze<%|50bugUx>CL77L~_`*PQy zOUNm|7~`vp!Bi7dt54MA8xPAOMD9)_R#9mt{qIT!H9r8Btc7N5Lb5WXmX8$ZS zKchI8di7>tTt7C`iOvk=`)xcX5O1a(+T=o+Brs0PmX5~btkKbQU8R57f52`S2Aq8@s^E<o&h`9%-dg<)D#^IV^m<=PGezU2cIQDjiLPZ{7Xx5Rf_|7lKYLT$@{PSWlrUY%;dH zH<~I$vep@hU5u@hjd}z;!tC0(RqGrCMvbna6i<9N!EWlF+8ZTe_=vQ?Kkev{rI*01 z40n}V>TxM3|8kaB>X}j|i1ULB7rCrSMs0WqTlw0Gv%ECafzsS}uLON4lCU#9TU#ShS>xDj2x%ni>6ZVH@4*x|iJKbtdy1ZKkz({7u zauw8No%Y?X^p|(9936hU#TE|ov**LK4+v7d%OiqD@JZ0jg?JXNct5OyO;Mo zoh3_q14>E1pVZ6<({>(QlRlOFCK%FWRjFD8#nIEpDA%GvVBfbhDq0(P3uOgp*d^eT z>5rI9EiGvl9Cvj+b)MG$M)t@&uEj#!!NutA@?N@J`uS>c&yz@TPYgH?0 zB*+L77G5&tbyucO)#Ch`e%o@b&lmDjf!N#Tv&|w^GRA}3qq2}0tI8bqTUQcVuhxLy z71gA=18efd40PQ`RR&}P0(2coZei;4AqrX>Wc=-=(mq9g}(_f?q@8Z5;OTqhKz z_aA{cj+6&;dgf4e`KA?<}d`z9o^oSoCezT$W*_iDQrJE%BHS3D~0lS zJC104k0AJGDZkU^XWj}r*G@g*8QFZ=L?s_pJh@jwb}r6#oDD`4)es~fL%w%d97E0B zLG;*0nka0p(r#M}`$(eOHj|Msn0TFy`ZEB;hqVwzgJdtCbiwwH-Fw~G@*CzUFDJ%D z!3L1cw@T^0%s~qw+^2a*Nvh{3@)5mR{cY~_d81GAWrpUuFh|TcW9AHZ)lZU1Ep4xo z4PB0YVOuF(D7Y}*{zzAi5H4rQ?0`a#ENr?)x#`IjomW^n8Qkc&NHZHzc2f{vQi@=GD9E_fMKj6qjv^ zf5-;@=N7_eZRMjZzdQFvs%#%tK9o-^Z~NvYZ-ejl+$Sz+w|_yEd&{=}+}7*j)Vt5kBH)O*+kmD4JwDiuNfq2~gwBIjp2ReM`Eud@9H$)7kw549^vABiH+?Q| zX^$o_;}cxzYKFBD?8aWm++_0S?M1*cB&0V|Z&2^_{jM$hQ@3(aL)OS9V2`L+PrRXT z?!Sqr$w?mB$Iq-{A2c?U=Xw)QvesDipZ!({%n&_B^R7>{ps)zU`Pl<8!#gtEwDhda58b!d6U22ZJeNU! z+P-wZtdM`r!NXw}+B(;(JN;tFcoo=bSa~aX`Ajr3WRWgUc~ooc(%9ivM1%=Y0y>-b z&1d*ziL2g8lpebl%>9QhG1~M#Pbor)(($D~ zI4A5A_|#P!=}Gyr^D{3tebw5-ibJprdiNP81N?kLGRA?QcC8}rAyUq-2+$d zy*Ft5$ySNQ&qa6Vvu{u;THWc%Lc>)up1O-^=c* z&uy^Qnj{#fu0e*zjYn07IA(m`?*y)}-QYl&THlX1Vd&c+{fuj^UNiN|N}e#!9r zC-jdgC%bMJ+Hg6?>b(BIj7`}NA!?!B>KZpdZnN&gvjeCf@#ZcZ?x$lB`Ij#^`XQrZ z;cv*P?AZqSxvlk0!AFJ+Od9M`QM&S;EMLgKuWnKdpX%7R!^CAa0+xoa`a^A4eOfm5 zn1SyZsh)(92Jk05`lfM4dBD}q?VuoDNLbDRc3J=BW5L{t9SP=cG|xVdKnbN@J#oED z+?f=V!aKuXHXQm!9C?IXI*z}uCwON8fv~cf8m3H!uq*+8l9N2UqT)BTc@=s@s~~5jzVCM^3ht5RM=j(*^|d&q-R!m9{~XE zgG^Yb@W=?O1`oMBN%f}Yf2K^9aPKY}vD3;+nsU##;7c~{8+OcLRquKmvAdf z29ikpj1mi474sB-p*ELL9$uv5x2a>*G^TJ^eBz{L*S4E9nyC#AH-Zk`&+*q4+) zTzua|5r!Qk-rjw^2nh_jyjLB2@(>5zCC*>2``mh#14aKL*;pUPtp;$ z1k^^lk!xQvG~@0)x+h+)a_(O3(mu|NCk_w{-(8t~MtCt7&P5$$8(X;_3D*fnW4RF7 z-90ZkyqS=%3%G_~CV3_o21R8KbkCSjc$aI;WL$fn3kC%+|k8=+$r3+U?G;m+=Q;?Lb4zOU80ZvTF)a)<*dL)qH zmZxz$4xHLC^rFOZIrmw_edmFiEdYtTxU9OuX?-FGPP^v_E6Kwf`mVF2Y2_B0@wgO3by^cC8>Ld`HN3abo7}!}xam zl8N_Uv3+T@HwRHf`&54?k2jAO+tvElu=MZZezh2vBVuCN{c7A8b2x?HJT4u+)1Sj; zCKC-!`uSIy=UNJhuGg2#hYx{ENxyR<4k8NT{!iNd5yz))x3qu2{-!u=0N;M_c&VFJ z+TMW$VItqI$;=ewaeJxb)ec{WTlAgyaNm#i2)?_aVBcSvN&0j7_}pGRn1YCc@pm5* z8^=Z1wP>}C;IUc;Ono^!v)Pv03+=uKjIZ-f$9G7R4MBWMbCi=nq zXC5oH-%j4$bzjx(|Kr2s-^kRE^_xRH4$F9&yM6A5i#@ys+gema^291B&(rDT z?ryceFSgHf9Bw7}6U)AnQh9XyH}AXIsk>X=4o2)2e~8Ye5q9ew#Ctiu*@cKr#caYV zL`-rx=X>SF=Lo$WswdYw1DK8}{OFN$$=g5pkh z26<2+F2t3hxRrJBQp}8)Q_j=rB%-yf|}bo%kg zw&!h+e7E&+qZ8tj($lXVJA--mw9MnthLxqAg&!-lQ&s#>K>7BjG$rNDIL0HPKE4#2 z#vKPF_KO~&DN9O0;_jtZkD=6q+j|f4!FS5_cF~!MIH^oYRVAsWoQXLgC_C5Veu0kC zaM12e!QYGfW?TCIBQ|3pyz`^_xs9%5;^lNN_W0h=jc4f&>WzbR{m+&Y>q$z2a-1vkJe{^n#1`ZNcW{C*K-&KjlgG#L)(L@}7Il37; z?aQ~ecP!CxwOO7MzY#i3>CI_Ar4*tfI-j3Km?_+Svjcqe*Li4+o!Z###zEZgHD%Ct zPd8qE#378?dm{Hf15*$?QK_Y_3$wuK%%^io*=oV*z4xB_M)L0In260iB4lU!9)0#; zb{^R085ryDNpQmetIKG-JNdYY^I|H;p1j7?=-|N5a;HAZu;g%pyFWeiEia% zXGRWwKa-o+buDF8O*v;x`SkRLDQsP0GjK<7hu6Dv3EI8KPUSxmc)GzFsH(FZNLm;g_v(ZXPGZ}B-ap~)k(=@tJ~3scmBb?4B1*}^3-P6x zM-Xvx zZgpL*UQJUYTY4&wg6Pmcz$NYb}o zeK|ipg?UOD=komYJk6&FB9Vv)cXuOlD0SYJ=0@DPtL{y`Fy9#Caje^ie)u#?EfL{F z%1lA8!B?kJ&E3t6ttKngqO#^`D$8=XQtae;(2Q`wpg}# zFgtsFaFc_`Dcoyat`{QKlv2vm`6U&26Y`|x?fj#r+DdBa5shGduQnYQ4Cc#b_Wj6eGtYB7`Z>raTf<@ zv8guU(>y)2d`z5k&eL4VDx&l0lv0|fiHM~C)LK7${CK@wA|i;w-Rl|=N7w2Gq35H} zjjy}&J(-iLvdmL1rPi{3B{ne|Q+4|2v`7kK_vUPzyv|;0n(B0BVX^gkU610v1Mk~u zl1UU~!Av4ab#nk@$g4wf^3DT!h!l5VY3KVzaF9+DO|yt-S*uwkA}ibBACGnq zbvJSEjtUF2G{<_#gFAW8T8x*SH-$}1A|%p~%ER8pE&)Qs!Z#4h<|*+GR%zm{PfzFh zd`>Ah8xy1==kwFko40S?er9IO!XnV!A3uIn)#vm1d^(-xnIfLf=a<)4cMqbnt`VUr zP18)w;qf3U+N}HWJRIYXoYI^pVSYZHmStVdin|dzu`#bC7iS}KcaKn}9G=5fn5PqI zTGo}qJ^YcI(bb4>%P}1+WIRyheDo$qR_Gz%KHkHR(r*KEI4IJ#^yY4*tjkKw^XW95 z&hyi=*J`y^ck>8j=U7-Yh&{sGorQIHP5T&sQ?j?nG{?c~#p8%d%A#4ONv4TXW@Z)< zQ3*4%u|5#V&0oJk)^`x?9bnQA|LtvY$LNOhCfzUw?QnuF@rRY?TcwVreULCoL`3GI z^7Q;B<@Dj*yOgtNilDVRrD=Ma`SeuRV()(u5!Yq0T7UG_SHJ)JzyDW%`qQ8MmA~@U z4}S3U^aPJ0`pIh!2D7T-sNh$s5kT9O1RvkUHE6lDHGxt(pjnDic*R z_aF*k9{bzGz=K5w+PzQsU9Z;A2Y_|OZLu8 z%JcK*U(BC<=4oC&d`L{E&%b>8JbzgH_5H`?`)~aEF;COq`@=u{n}73f{_uxCgmA1- z>Z;gjEE(_imAWWzKBpOrj2#+cIwT$|h`;Z)kj5dwDT2wa)yym<-KF{4x7S*kiCL0r zbGIUJCuRnThu{Q71dajYx!jEUx8rqphwO?l5l6%g>M`~nAL*YZCKeTDv04K!5}7+i zJNq4l3V5TtD-(CWks@#yw)4i^gpvrl1`FH2+TBB#qx&=X3yVMzU>!i~XabND1lp`w z6bV-r5-}n-H#Z_uO--8+u}HKd;ug+CB2A;QurNpa#vmfAuo596qKXf)2(?Y&ppeE? z@ZAC4-8>T!z5D*%zxtQ|=fC)qKRM!ryZlt_a>I>XBBa9el)HwK^P4wc{^g&fH_u`A z{WrfXmk;N+pOY2N^Y!IrdH;+5^gsEJ|EoX#;~)R{$7Z&!Ybm9aGE~C4uKn~ggcbXS z?N?QzfIJL6lu|luZP!@)1B0JhYf6bCsu>Qg4E-m<%m%4Ohi1qYJ3tws#J8_Z(X91ms|9E^VFIcF?LHPfB0!4i#6g}bP#h`U)S zW=>2Z>Ht!L%q=`9f<;t?h=hfO-MyMokgDKq-cE8iN8R(NrMNpzEAmSe@|Vl| zU*u_uh_YPV?C<`azw^g`{KpW->-GBb^78TH$IIoiEK4Z`Vh0OeO2NXZYOQtXBr{W0 zJfXYSTA3*23>R^T_)t7uYiz#CG)=WuI55%mw1^Oend7wVeG+Dxrg>dgSZYYSyHilg z83z@9$WU+atoluwu)yw*I89ZpS`W;ah0Pp}rJFY(t0f;yM53SYp&IcOsvdU{%jI&pT-?2sG91}ynqUx1DbTeL?%{M| z2eHlYg@$=eDM^ov_qeXRGgB!Q5}BvT%;1MymjzJ)bfH-dkNGsahgpqi9=xiWRc3Y% z5rJ>OA}J*tSEv@oyF2>iX2c{SW^T0-lbNTaIcMmhQVN8GMRHD7t=3x2MEEqHRMp(9 z)|4_cSE~?gNSmtET7?B*YM!!+n%g+K(7~HE>;ViE-dG&?9*8WlhP4!IXv2piaK@|_ zGlx5oG^LcP)rhcKr)k3b!d*21g$j3OF17CcA0pPqEF`N1$KJi;P!Rx3g2K$0Xqr!u zb+c;jIi*r+&S|)*?$Irq!zi(^dkjry?nyN~QcBZ2fkl!uiAZ(-7k~19{OkYc|32_% z>4q!XPXWZ8HeJawh6)!pZLhP*AyvITrF;%@Fi5$2XOA*4H< zP7$#zi`5FJ5RPm_q^4k+gh9ItOR3e&;7Yk09C20cdZ>j^5k5^b9xB{n5a32uv!p5_ z&}VL5&8$}F9!<&3N-gWUp5_@aZY|Z^k)nmiVs7&^LsOWU`!E_XDK5g$^jN@lPrEP% z3xz-7+tga|hMW>&Tyvl2Nd+-|5VM;t%Q94W&N-#Lt}8__v#1i2l^PT&<&j}_H$?Z& zEQ825q8esc4>&&&RBP3Qh%U@5r-W#>lnUdcNt-Je;pT2e!f^fFDl70NVrKII$Y~w` z)uw5h@|1E$DF4s@mw)!n*FW#5Yuw=eL+Ceg$CY)O=6QxD@LFqG-TlA)@BaIr{NyL^ z-@kwN?%lh0@4o;3`wt&Jtm_Kw1(J?CK1_X8)JY0Ei5sM2q+E}%{f!Vx~{~eDJK;K%9@h9*J^N? z!Xv^}Q&KIpGIP!eLRqW1*)(MqK`1=jMHR)Zs)~oJriMOuwE{7&rKY3^Ho_z21jMb@ zBBIhM9^t`E7EZwt?q-q_xsyQfnOVr)!%2iGh+&|VMLxWL|Ihx(|9ng7p&gx(nV2+n zzI)13KAqAuNlL^L5w)yd%isS8|M0)~>wo?I`}f~`^Uc>^fBlPJ{NnZX6)Id+;XA4d z;wPNc^ZAU!P|f;wR@J1crIck^mSw@;_ZAtBtkr7O@-zuct<~IXt@AvmlyXYujzxn( zXpVb7a@7ps?=($0rCM!WmZAUJCNVudotb4odypPxVPX-D9YGKKk#mL+5JjzqgHf%* zgJkJ=3&ITMob!~ksuFW4CBikOd78}Za=9+cBBH87)L=xY1~cEIJvjgH*HxObS5>f0 z-NQNrNgb7Jo-UKs%BZU0h83oi7-p@kZq~9hA~=xKG{JlGh*}B>CzS~DaCc8C^E|uz zx-Q-$)bQx}c-EvK?uR)E4V1#&aX9mo!=sjBW}5Rz3Qf}_z*0eqR&{rk1abtkw0OHK zc()3-z2R4YGb7v_*`9B|`TCRm7bF0l&gWp(oHZqZ6H;rKSuIv85&aMU%_ zZe}9dKtt%tl*|m@L>-}0)mlxo`LQ70xLd6?=L}|HP^gG|xSQ3=A}X4uOc98hkkKrnM?J1?K>x%sydRIgcuxzE@ zx=lIfoFZslR~9z2q{_`k)Af1W=+;cJRW&N=7g?w8k#xkb>BONa%G*np29*2Ce>Id{tj zB~#lOR!v=SJ$#xbxG_-YIp-;-@CN?oX--LTw+Nr$*5ENUrJiaO{6E5pB57(4x|y^P zALt6RD9~yVrH%|rO4BqoG@V&QNm@$Z+=aP8SP{~n7l^7R6%mMI^FoO=C9I^oi6~w~ zJ{}%_Sr;gKR%Mo!U5IdVi%^l2^2kE=KP{X}tsg$T-+1*~u}=G^K7aO^o7GYb|JAZb zyZ`X-{n3wq{Nr!G{r2mxzkc`b-MX$h=V_V{M79X2yG9V5p}HX4DW!RyN9+h$nWhOc zQEQ#1>G}CNr36<2Vx4n7olfAQ!Ij*hEBL9v=H_`ufU?4EP|Z050TdQh)s%!8o>EGx zDfJwRi^!C7PDy%#Oqi=xVB4aaR5MU~7J!u=!3|>-xLZk6LsZPxHgaEX`i_Gp;OJSmvlCXHV)k@HIA}J*|tJU0_bq)8V zN-dR!Q>PoGs0kP%lwYkiJmz^KoOfpK}E7fdSu1V83Uw=LF zsrT$BozLgGu60@5>M>17MD$00^k1qfa2UAbW_Gz;rfI?k;ArKPQp&@PX?XU)Vcc;@ zV7pcIdcD9N!ILpFH`A2P=kqj814~v_7MZ3g=QLpZl#(z5`apt9MKvWDlW>1|eT^W* zlp|X-7?5Y;!xGiXg9)3Oo^aYi95tkcKQ}#f!ZjvgI99 z&d@2q$IQLd0wtXhBSthcD*`Mv2tH4Pw-Il6L;@Vy*#{O|biqWbi3y2a=~}-@aVaIK zu*j6B?r`zo0*WfP7@eTCMLTTJe><|N?j9r&WNsYfK}?*p3Nr|ENPe|QhUn*i{GyzxRBDAslyer5^ZDfN*XwmBmb{iy zYZc~{^V8Flh+LNihbpI(ayF|#Az>d{qO@ZpKu&Yc(5WdWK;vM2h^UHyPL1q0B1MD~ z$nQ`@$}Od^E(_z>FndH&4T@=+9gvQ2gwxL9F>f9h3tKgBKoduJH0~j{%!4}=2cio+ zi>l(EwN|XBFc&kcm6 z<|1NlOxzP>hx`H3T@fAH5*;3Ic%XcOk=aE`p);&NMnF!Qg((Q;tkg^xb#gfgpf1K8$kemU>;+>-9Q-;V!Rvp67L42hm_S!8iOF zyw1#JU8@;0&+`l=ts*>4?p{kV_jRRtot88p0ulssMke=f#l|#HIlnuE>~d^l~X>IQr7E* zJaW!Xp^}LVn4?*ZPM%q8fz=h3pb+W&zo3z6k#0}iO(=l&iYie6>2h;wzC6SHrZlw= zlmc8|Qx*}YC~FZFoY-0$mfHEMeCW&4S@UU-kPz8Cy?th4Qn|c)zb@mmQomCd$!ZJ-$M7+GboiY9JWbQ-bh=(IqI%BR-IsM;mL(-U&8O*UE~S_S{0cnCa=k9g!b~~m z^ZC4%wX9{O6~sVnyqg7udziZ-V6Byi=F^EHRLP8LU9DQmDT?Pjp~Rq?L4^TBgf$nH zlry!c*ODfkwA6~s&ax~iXHluOYD(dLI-QX3yk4(Uo|VB(}oFrl@$Sp?1V%t>l3 zrBr6qq)8J9Kg76)s4XIor>7_H6jg1IgIq5cVu1;b@YCsJwGi>TF2p>gOiZ;@cQ0nz z889P-7ZGd*)ZfUYIVpAdc{B!(DPS694Qzgx?C<`2OwC1r#1eBzJwdIEK7sT zAfPRFNjYagio+xCn7xWL08Uk(o}LizBejHTPFNNA9&m(!*{^FESRUSnU#ZAxo=dIE zx=O9WoTm(xdAVFtN>9(vwG@v4tdvqtIV0L$*VROje#bh^^8~-SS{0FHxr(R=w-`4^ zSy%VCUa!!9Jr&rp-$?EfQ7J2y0w{l}g_!{|fba4 z)jVaZZa4}Jf2{aMcu)Z5p-Qb*6iYz5%-w1M)Cju=3mJ{5M8rLjFL5z%IeBzrQmtl?^^{bE-MpXMno?>svhWetuj?wJ%=C1Asz3xw(UfX5 z06zC9`Fg#YJF+LB0YcAJGpd2Y(ppwxw$-o{jgG>cl7@@9f%+#bRt-Q%&N(_;1B$Sg zq6y$MV$jS?AZeAdw$*5vT~bZjNg3$1GV-q=okuWHST&bW6>u1lFfk9{MY+Kel#+@H z{GzfJxFVtw?&jg)$m0T8LL%1OM8rKbB_hTN0hMpqgquFPf1oOUK-VTU-7})ztZ)3h52r=m+=yKl@J2F7EwXRTf*HaT6&dR ze}n)J315MbM3ZtS1w}Y_b^t}NoGzD3PH8O#y7QjS66RZ{zhLs5OP%5QJhhI@L zQ)(~~VqB}mnN?FxDOBCBfUribvWd#e3q1o2TjS>i>T6C(D&!kGw|?3I{({7 z$ZtLCi4`1W4aiI5BmgMDM@lKrPfu`EYAGm07_7az(YDClR0OE}vaC6!r>7@)8d$GV zRtn8I;~XNrGpZaSLL->DtfjRE5hOzWT1rldMUdfwRt9`SL~q`_DW$xbXT-;4UEDq8 z3`)$pE>Ld`>*y{phz1Q(2-2i)(i;$fmupiKaOb9+&D_J+WpVdBWmR=&5A*Q#x(Z94 z@;puM4uQ@okI)4q2w{|SvZ}&ZX-Y&PZr<+K001BWNklPw)I>JXMD&W=OM>T`WlCqfxfuzkzg_zCjU?5ksph(0?6BB7tcSl`@Xd*HuGIJIw zrNCK-U)+G#0PxCq7IPC#5gtsntVrWK*RV6Z#gODT0->R>>5_k|)<#nEo`*i&lX zXC%G-&EMkFT#D7jmXGh)*3t6Gy5 z2TU}hNuoP0h`WdAgAyDODzYpK9uldUoO47YU5?VV5i$1%A1iIX4!qHgf zrKrfdEYm#0my4|s$>ILwDXaVWbgEXD>#{BjQikAllu{{Tn&+IeM_ex#M29#BVArIS z%;@>e^STzRby-(fwwwV0C7fQO0y11;5mBqPmRd_?;VDm|y?T&no+cQ;wG_~&8?>q# zjgJ-X&>?~_NmN1nnzA%Mfym8rp3Dq^rgSD_M{g;oL=>76XpC^@z}w-Cf;D(@?jFdE zMt4_`8Uq)p0TO1VxTu!WXkpVd!7YL3!`u)F(x&ffEzx`)73NwErfixfb6eK}TaVn| zvaZ$4N9`p)XdM+1>Ft{{sl2ebkxnQ7@CuS&-PK28V+Q>TUIb#DQN0159>6>^!`q>V zj~_oGjXF(JXZ5rrjt~=2015@bL7nDVML;iW40Uth!9Xha#IjR6PR6~cR8@oGd^%OL zT9>4WIzKF_dJw=wO=(#cBsD=-0Z(=KxNy%>%F|~vf|}RY*R3{GWnJ6bPUn+V1N$w3 zdPEWKIcGC}0(j+KYr$7UuMEVRFiWk4iF>sxF|mi^Hge8jm{_gwCFW_OM(m-WR?uWD zsqvSHnDUfUWE57p$K`sBhGO z#xw?F#_4oEhgn3dYeC}-Aa}>MPrEi(LByOsUY2P(t&6Rf*IE`c^IA0}oT>qajCuk% z0O#`=0tBxS3Ld%vbYFM{rIef#xHQoEpfQcL?pS^#RSzf9+H*$8o}NzUTB}GvZP!{~ zUS5(a$})0F9$rd?m25SgL=kjZuJb&JWbn?3Xqskk9!_Nuz?~5&T#B-mJ#`xi%gg10 zB*QdMR_mMRXPj`TU^8c;)z)E}N-gk7R8!+HbbBbmr_&jUB(n+%io2UR1-uc;Ij^PE zQd3UM;$#4eMvZAs*%94F5OdB`gx69*5Vu;HNmEKBs0jq@OX25cOKn{jkH{&rsE2#4 zgd;so)R~M(W1HEstktRtTl4#=#SBDn$&h0|Lwp1w?Pi;HF7jCLFm`U!gB{q37==AR7Ym9IWY5tLjnfNNUx5v zG+;XjAMwg{SrDG$Jt?Ir=TZx39K@_D(=@53QdX-~5ZN@k&Y<#3&J$b$GXtG?Sr$O3 zfT%?^_d=?XCr?R5#KSL_>zYLga4N*{RGj;mzJk8cMCNEGXPs{f#ugg_w};jeT!QB-c?x=&mUxRn$&3 zV;EtEI(inC(Ym7pcU5{AiA&XLR%^-`{?uAZEro)<{rW%Lc8`;-)tKg_%f}DP>&N=~ zu`U->3!KkqGb`)*xBk}O8nDdea%t}PJP#BF=*kFnuGj17bUK|*I2A~V@3f}iR16x~ z@VvQaoi^-T74EyJF3T17fY0V>8f@~~ireXQno~;f!cl58XsAh*m{??#uA=&Qo+fL_ zfd(oGxA+ek;?cajRpRh2bg8A5g7PmWKAlcEX9{wUTFX42ng?RGF3V_0)(X2)Ya-jr zxPea4JfBdsUkmumLJ=&SG$F}l?m+rHS{*7j0;I7#<=oQV&3QwaY=gH0_;Ud9U=bDR zHNer^$A3 z{=pyo!R2zfUayzS1zw7oy}Z1@^5RsCWD|ndeI@mv(6sDQJC~cC1rQ0LG;2^aV4sF_ zv>Z6pfn2Z4vaYxq$bCQ|p{fyyB2L&^T(l}_TsGALflIx?C8PAgn-Vc<+zgthsd=}6 zn{xIDSO$=d;c3)Xz-oi0KTk77pa?LhG|i~ot!P96YC|LCHloYMt-!GZV-#r+vx*vA z5zZ+`MBQp@Rp1*$kf@-Vww)+pqV~Me8v&uaa-$XnIfWZAZ(r86^*(@G zE707*%qj{B(7LYcvIw)NYwR`^xUEpif9o#9%06 zkFZ+ZeC@egAP=}~KWT+JR)FvbdaKn|GiyqtCa~7(;b5ns@V+%g;?^Q&o@NzIDMxtD z(`f185gze$K7*AB6Q?QVl%sR#M{AuP{OCZSp;Jm}XiQF-g_mXNRf2g?sd~R8PAQFE zY=9ZUBc~(+(l5hHES>3@b5@bo;>rU>5^$bHL~;fOieuj?uC2XCG!I0EyD(2PDh;le ztE#4)RWyjezw%bpg7!GAh67vcZf2Dt1mtz|+AJ!wAo6aH6_EH{^KW#pF*6EU*L5i? zG|snQf8AjW*>#z2%mPhGsk_%L@f|U`-Tve!Kl$>@FCl7(AV=XT@Roi12axZEmp__m zH70FD&aD6sK`rW5Ypu0fN(q?H$B!TJX6+Y&o&)J%K$a+)h8>4~Rgu%_M9j4mWbX&C z101sx7PdAAz|P^q=A2N=(+d>P=~dvIKr!OLN-u_P-i6sTPrYQBRTC8Df?8f8klvb2 z1CzO$sKOPQaz>La5YZ^27En7`Sgy;}&4c1}I-{upcoRecBm|DRiu9HlO(0M>>yGqf z29pQe8&$1M-?y$O%!2Zi2FnIwjK*88jmnD3`UcdxqhY@!6?bDM(KOFfsny+=bxEzV zq?rwz2i$KXEyGP0W#ZOGfzS=b&1!Unhey+^QMudest~7^wXEv`i+6o}dH2g-wl0(V zVMJrlMqAlVnb->}+6MlWpZo+&cW?()>EcQ-)a}3b^&tG(&I)@>6RCPcZEmW~j`7Vk3%DDiZtNEiznS zcngh~z+~pjvbJh@Rp2V-j@BA(UP}dnnR7<9Wi17sLr)J0e%0oexCvH(ps8{KU&pe zrEpCOeT7kS9JEPpfJfJtamR|k(3kl zzB;I0z~)w~ED{t6iP+xW(%q9N0@ih1m$miw`sH`uT(7S;dhpn>!weS?+ zG*EVwqSj90J)O_MdDgXbyP+c(h=?g?V#2{w!0Em3O70#u+%WW(VCHsoM|~7XOz73& zzLrA7^E|^tD`mZ2mtC(Llz!(y=e%Ao5J9*ogV+pW4X~G#6SOJJV9uF|yn!bmbM}C%FDtW85O_8xS=}m{l|L!Q%ArTB@j`flMO~F{hM4u>!`gNxhZKyEcNVwW`I| z^Qh51fYNGe-R*GFz=QG*yS1t(;Z^`Hg6vAl2`pP+0i%UR!`VbzXR=-fq@D9P_#MKM zQi79NOKnp#dPSAF0kkc(x*1~eKl}Ipj&8bUA3LsVU(zP-By#%Vi~RPjsH`uq;c-5n zKL7mltvbdGh1G-Ti@&4JWAp&SJ5`(9BO#i4iZ16IL7=;ob%pNN-X8|11-vU<7G*eS zR|aLkoka*3M?~fs1y<}RDu*V+*}cc+s4f2^C{

&imIh*Qrsj6;wdLoeL)7am#Cw2WmyYC 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 D3FE;y literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-3.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f35a722f68f63de5aff2f47b66cfc7af40ab5e41 GIT binary patch literal 25647 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

+XlBUTAm6rVe}oEgl{oQc4dG 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 a_P+t8MIa$qj`?8#0000e literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-4.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-4.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c95485e2459af921723bbe84f8a14cb06efbc2 GIT binary patch literal 22337 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-5.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-5.png new file mode 100644 index 0000000000000000000000000000000000000000..92560eaed3248f6d2eae0ed2cd95119e341f5566 GIT binary patch literal 22034 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 BjEevO literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-6.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/button-6.png new file mode 100644 index 0000000000000000000000000000000000000000..81a8a9271cbb10bc296f27a47e55b4a9d6607893 GIT binary patch literal 19169 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

>t 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 KMNUMnLSTYrSIlt$ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/1.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e84247caa41588ce81dda7aa9b9463008f4b60d GIT binary patch literal 18927 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

JSU_Zt^4tyea8IOZ@WAdG>gX*;{kPN%17 zI;CuJai-a_t&XGXdfT!?OA(APdHKahKl$`F4ZH)T_x}HX{_p?4e`!?LoDL4b z?c7}+pAVBj=;{q+XV&@PuH6F%wHm6mEQ?8=T`kxa^#^0Mn!)%))56u7rRx?m1JGoi zApk&#9*R3q2vzscDK2OvL|vnVu{nX zgDK@Je44vwXrrCWc7)G?uz`*|$Yi4Dm`o`ZW!d8dIU~aYJNosy1tFwB08NQQ=gqGGLqXrOVx}*$-KW-Up)7fXHK6U8$PF13O(@=S&k=9Oy7I3 zmCcnfCIP=^?qu?ZfB720`2K@EQL<{~0&h1a1S5oO8zF>TomX9U) zwzhcg;>GjRz1^|*Z#{V7%9*FmjL*#UsipeXmWnLJH0sPq5wdLCvTf8l(*T|Lf;hPq z6DV|3lkTT>yLagHkh|?wlx2^mmASn;uSVkvaME$u+`Rm@HG~>nsy3#9fX}p0 zNvp&n{;saL&*xW*g$qxOCprVulLO-;$+l2XH_S{<`*8WQ>(9x)&_vy=`8+;R_Qb;B zFCKjvZf_eI>RG!(nb#fk9~rxvE}eY}bg7N8(W(xrQ;ykZoGHrrVKr`TW^gug_y6q-mP2>sh6e&J>_1zx3RhZ@>EVpMCxE&VDu? zILOtqC;I0B0D|Bvs_Sc;`ppj>2oP>;9{l*n?=CLRegCb0dj9I!lhdQi%S(`A!_awG zD5v$^FVLvPLY}m`d@OKcZl3Koh&hhXZon2j9xuZ^o@P->7Z(>(sg&ctC?S;Dg_B}n z(46&kLqbd6%JA@TsZg;S?5ocnKAb;wPRW+75tladBa1_h@QzWN+_FLpMKM`V>Og6^{&`=oUp$H<67&vNtNpe#^4bnf!nL z-zS+|$>$Z;9%r_8GoP>SsijIZ?7KJ*K3Z8mHFb^M!}0Om!M>5AMt}AnzX|x{bXxhh zpZscXH$5=W{oQX}`NeO=L;L zgmy&Rk1}eZSV^bTQoczLnlTDqK1@1+2RV#oSQxqTds! z>u7WT4zN-``pM^|3M!Xt#OWD1Jj_I60aY`1Hori~1P-soI|(7=kJjw`<=%oThpWL2 z70l{g&WAZ5LI@T;9qDL1M>}6NC;LG#Zd`%8_4Ugzp=WyMqPtG&YiSwwGkyr z4p1skN@ZD&ghPZ-%d|RUzV*kMbVeOWMj_Az(I1Ppdt`a(x1VD|1_u&%f48dZmd7Je z0#vPDt6L?lPAM%{%=NA8^4&Fr>~MQqy_xB#pOuy07 zISv4jWiin`xxV}B@4PVi)BjCVN+`j^#y#D!w}1LKfBz5fT>sWp(=@g=H+Tr=ST{?O z*t-$9^M`G1F6OAgb7dZ$Vh00=lO6-^wg6|H9Ly&U#esvt;J`qV5Zv3_>&9^Yw{O4w zbL!0FacR4O$cbx3#!?FqVcXi<&rnKi8-KBuvk<83=Et9G`2!@IN>2DEVSp zQ{R5)762d?Ym0Y=$H)38C6r=H37}LrOiD;TuPHet9`pD0#MDw*Rf~cs`2)e7-Te+< zmQvv$bC^|f>>)j3uvn`DDENKOZHhuBTT~R)vh1&2T`ZJz=f*`*6c-j2u3Wj|Fo_Mx z0B6PxW6VNT+eWci%vlV_iZ5)D5#sAtIrdUYy1KfUiHjbOm$s;nx>Y(gbuyRB8HO=F zKAuV)_4V~DisEkVeB6pbJIxy zlDck<xwR`sb~kl#<=M{!$VO<&RdE|9$yKzgxK-@%Fa`qld>ExoqatA(O|aFofWHo0A9GMSy79d`!6Ju|Cwall|pmI%R|3U#k-a_Bi;wyLsgifkm& zomz3!rW7bjj(uR5tSEWlTF&zX^UMSu3WeCh8%F`IfJ_Kd0KGC5L`jlFt*o;UC>Dzp z)taVNWm&4#4AVpyQwo5EFa(eh@_oJWv9STmLg{o-Q8cF5_V&QyQ)5qGnE%;3w>o3( z$Oij|MF53^RIyknEKCH>o($Nuc38|8s@0>y;quyl@1{Qe>Z$LAz}_!Es5s;PfY`Rr zBX4aUY^?7^qCQ308yg)_6oogLaSp}_fq)}@rVQ>|nq<+l&px}oz2(#cnloF##f$=0 z4{#+K4ajD7T~~xdqS1(97%p@6#@9fYt9b<|Kg#gy;CZ#YG^de-7qKFUyKxlxVATS+ND*D{)Fd=YcxVNLDeS0VK z%;ou4zj3KM(eeJR`;Rsbi=`T}(Z*KB=M^8W9rpJ`$CKj3FwItqyZKzjFsi132_|+8 z*cn<6-MUw?Z9)mb2oa1^huN;q_M@ZRg-e%rx9_J@2kyAe?cI5K_X#*8gs>qO_T|>r zW@{Y9w>Gr2fQXDob?E@G)8wkQ6Bf)oaR52kvNEs3_P~5Tuc~S*7>FzcvWW;G^vEK{ z)W(1vPynIVNsyGkyjmGb3^&)04tbEJEs-7h>do%nPs zs+OvjiB699WikbiEDQ}K4i2*Ud`^e!nv*gEYa zxJCc+%P({N^!4?-5S$}#1Ah~VL{Cq5G#YVTx9R%1&*6a@I|yEx0t#hG92!c_&WuWu z$ZpNF5T(?%Z3-v=K$an85dozXV~TBpF@#iA%S+3jiK0YsJsgtPH+HKveRp?%V{?x= zDjO33fZy-^+rNGz9xBg_Ng1`2(<;YW89>=92V^LUz&C)v=!2{HtfJbsL^&*!bxYP7i=>D>Rj z!+pt73xtqbmI?HuCD0V*kJa!c;Woy-0Y}rqv`3{rR94*udiCI$D(a1 zf9T=LdbmBfFgG$cJ@jyO$1=2NxK~x{f~P~2x-77-Te}p9wqo+{`KbKxv5{je{Xg=2`B}CBFjX`GEIXAolKa(RqS*8LDRHb+zbS*lo1Sv z!6z#yp+hwJ3;>Pv%q4p!0uu{f(3TJcd-bt*hk=eWPuH`b`T)RW@9^sWygsb zDK_Ouu}O)f_!`b|IPXXIOh2n?KYF^RW~BOIPjz>7_qn%D-MUrxQWi!A?iL=Ut=ZWb zUDunwd%FlYPCG&=3Z;A{^!r1zj^a!BoZ-A6MTn;<)Atjc0agxyWZ=yI;|6PXXYkmf~>hTneBDu zC=dXo$YAxzwYOLP?r*+PE>&N7^=*VuEFN~8Cf`fqgTsCLz-fdlsOWeE7`Vd3nd#}% zr^Dg!n{U3!uk;$1hp+2*C7;Y0V}KAnJUp~*Ta+;JcVw^!?D_`)SY2IJRn;&IQQ8a$Jqy-i>_u$)ven?Db4aNHQJ&?5EEMWa%IO;pI!DImn&mP7BBTJ%hAVh^u-o6t>X_K+$7~Mggod4^!trsAdI?> z!%P$Pj2eI>OL%%J8jVJ3_3l(Q)~Gjh-PN?-WJYxyt5&NnE-qP4Ae|aZ#3LQuGHl{f zRSpCymHM46ZDL~l(z9ppZ06e?g6v!y|ZV&{>JNUI0q5eJii76 z=mriLfT3lpkwbAd;MHSJYG|;ZaER>CeFYEVq(JDBgY_Um>A5ND{dFavj$?Y6zhoIg zLD_YQSeD&rG+M3J;<4EeZmwxv!`riR^VVjm++N?& zC0W84mCBWi=N2)hU;XUVPPNhKp{mwxb`9OID4{`F2`Pai$rLl2|M5SKfBEmjO0A{o z`jM&BSUmLHGmp;YCNmSU+qXZ?=MNELre!#`$@;U_frrt@orwxAE};592Z}4+G7Jmj z^`f}=R)&F-hYP^(B8V|W$RJM~01~66eV@4C0TL9%B?_SfYEuI!l^#3s(2;Jp+tm%m zXh$P12{A-xrgO)SACE*M@pycHzwnoT{ZG5Q`zKH200YJV-ukrUrGf*~G*|w(`d8mf z)jHeNcB^9;?Vj20b{&Ucgy%C0x$)`K(`SG9YW>EaI>fQx`OW*aYBd%KmP$1>0Les{ zG55zmzGj)GEaUZ!ylr;xTLO4+5fx3;Ye8>C4j4HGgpkZ_Cqe6B#IE8@hlaa|u=+Dt zON+%~y58khkS|Vz5KO7Oik+s6#1pE{(UB$xPJXsv)*Qm<>oR^oIml? zy|;$p?SsJa5LlXVAHE1YAB2Zxz}E?wk1!heR7GTcAIN~SY);&28p#o>m2MmBGp z-~`&|F3On1G{cSsWW*Tt{(p?BhQ`LirfC{RN0Fl+e)xW;(>ZzaVT^Iqeu|0W1X+EXhGd)}DGyJu>MWb~L83dRH&& zZNsr0N&s*)oQMRXvg~~8bAOSHO-`he^;$Wa$gX^JYjI)fxr?WkfB%tgnwDj*-P!o% zude^${d)^@nR^?1jL}M^@z~>wAWN-Uk;jgV*!W@*MgeXb4Y3wK&A;7K{EHW#T3%k} zmx%#M!{Q!7f1u!KNb5aQY_RCy|juGeeTNF){r1XtJdnq~mT6RAk4(vGWIcG4&`>orZQYkH~G>e;sKx-;WPGoghS z&t08Mojj4dP{`L9!^vbOm7eZ)wP*;ds`SFMXDZcJr_;W2`RV+A<-dM(Etv>!Zx_?4 zxNAGMZRhtZNa`IP+$Aob^Z@^;VQXgq1?Sjdw&797gDIPLyC27hyc(IqE%bo?IaO6{ z+a7tgc;L@025L_F)Hxzgh6brUnL|xk3R8wzzYj3WvZB#wHanfm&D>qzYIh8fLbqsm#XOoDX}dtvHCrL_~113;Az)@Zq* z0n$$`Cb#m{wq^$usnc#<{rm+4l4%EQOAjz9)OhNf3!Sr&H+A%xoP)&rp*l3SlIkmK0?mHnsm6DeQ0^3wYHy3h#*8a*O# zv9Cctn!`g}^wxTfFfZjWU%2pIZfYvqZZ{D~5@t4$3B^d1B?b)GdvV7h7_(3iFU*AE z<0-=e2rB#KB4RY61|3IFMPu1m`o=AMP;mhu8dhZq7fPDv!LQczYPGt(y;rGq|L?Wy zM$hv8J6E&SMT~l@S-RF`2qng1)48$DJAW{HZLUK|FeSNqF+X7uU!**G^k}VC6HI$1 zF!K;$aCm)ue1m>O;HOTVT3cJ=oHOFz@LysO96K0|e7T^Z%p=U-3c$0U000o`D2f`8 z!6Y$$zak@-$^eo#-wmpGE{h`(*&((P$|PcGgiu{uH=W+mOh$rGp@Q!2P=o*j1Okd> z6IlY=ri@aL{GwqgJ2|$!Q*&%0(g9=W(MOKmzO~K}8XHf5q6CAjy^WRoT`wc_JMy(` zxN!9ycBwJGxGSLFKRYl({hL8VUlg54KH?zEzl(P(=m+tDul}RqR0tsqie(!JLYOrb zB}AFZ5GE94up%MUPdXI_%AnNHu|!+dLsgMODE;-Xee2zKUN4nlt6*CW!T^*a%8=tY zfG}|oLx>SCa2Y-E_*~DRmT7U8WsDtNn7MG_v>L!4f3(2>Y}d(T0(W z0Rk+kqDU1~g;2^)`5`4g%E^oWKvGHmLz2pW$iMN6?LUAhJEe+)K@tcdbil!J-}^Pw zd6=Eq**z)qbi22^(_how)6>(#?XpLvn}vmiD2gzv4wcKgQH zUw?Ui*6H;IK;*fO?|ZJx05Ob`O4Sp|S*QIPDBpe^hLJ7x?RGnga@R$nRrIeQe;QgV)r zA$d+khzO8W5(?*R>66uacOF#zSq9tz7P#)wsSxBvQ6xkn(?rVjqSJqO+N;ma+*qtX z{oUq2|MBNv-M{U7=zC0xghcvy>+Zt`tBtyMdU{S$5XpxR@BZ;mf4IIL-dt*NmpgnI z4lbk+(~jm>UwvhCj)K<&D2b@s?P^5w=nxULT21ux&5x!KK!|0sM0F+X$ zu@Ig!A0w@fOtyM1DMmV`VpV1wpu-V>yPSkf5y5pG&#g?xW0Ei$^j*egJij~e;uxf) z-t|xlK`LiLlIuG2jk$*p?(XisaGYd3ij!0<-&z<92EOmiH=N7Mi*LSp9!1Lkqrd$1 z_j`LUTCF+8y(sOq-~Kclbd7}C?cm_R(h5ev$;LF7!^~61r%%5;IM^@BG+5*Ut(P*M zsbl+Kx_diBVGl9WThXXa8zl2e!ELZ_T7goDPF;CEo)a_V6%RPC2pIzj$8n?7k5UeR zkm+^=sfI6-1crF;-twJ0>#oC=mRg=y`}EGOzyIxDVK`Y`Z5|$W=H}|%t6p^`c>46$ z!%;U$c&%~cKYK6Q$NwD-x>h`AdQOYhG^(Ixr_eO7ViDPb%Vd!&yW~2R0ZX%4+x!~k zXoJWKMQha7#(c)1dR$pq>Gk?W+m(Az1|#4A>t%viSP)#FmZ)6^EhLF zq{7Lsc)stfuHIT&YDqC!Sy|rLSiidJuHK$sU)$K*JNAA5i!ZjKIDYb*Uv@69j^4C; zBkFY9C$Ij^P^4*Mkg(~csfM8Umm33Trln?ZSmIlto3XcLsm$#JnKfb1`OHj9MEOk< zo>P9Nf{#epB4Y~+A|y#NGgBRn#+HGyT{AME5P^uVxmy<`5m^{BWP~VFVu(N>n97@w zL;wtt0Fh)6_)oU)1G1yTqxpt+badEkHoyP=yIadEYinyi{;>PmXZIWP3+?vV(b1dt z@88eVD!?j^=$yU$S!5x%9L*0AivUV7HAFPW3ljh{4yCPPN=&tAXwOvv08kxiW>+`j% z^Vf`$Uawn{@gN8$lL-J;t3k1TVJ`fbS3g7h-;eXJO#PA;0swSfw-|L`*1*X%HOo%v zG?meSC@agTp0PNQ@xZbf3O=wd3q-dsRbxD0+*dm!R3^FtDey=Vq$w=6nirkxB#}hu za4w}pWWEoxHP3PQcpNh}bA3IYtyL#s?6_|0lSPpZFW$cn#{+D4A2wtNY802c^X%EPZ@>L645w?)Q&BnrUDqq_Z_1UvVSw5$NhDR8t?5<8 z7;F%8O?w(1YFYNJC$q+#IwEsiM{OPiRONbrA#jeB3X5ZyOwvYUrWypN?=Jzc z(QsYYy}phCICD7TeDUV3*%{~L%|Y+-G{f1#Q7uKx&d%y=a3U+ z>I1;dn>W>=d|-+B2S(s?>%iL{5FoPr(4|0Wy2U?7me8nok8^%_ebC z8 zb7|pF0C9PF<>ch;+}xb9#)b#0tE3F#`RmY|+VnUV&|*VJ1eTKmGx}m|uWvxm6A09L((<^oDV$7_h-4~-kRp*H zm9kKEM&~RcBI=5qg_S!ktzguPO@Yrp|LwbX?{x3eds6c#z?9)MKgxb*spSl?@XWCD zJWomq*0~k7U6oSB+DaeHrKe!)EecMFAu`597L6$lmHbs*ET`nKp*4L$U1x{ebpJ@p zh+=pQxm4#`=;Y+B{;NdF{D?-#Qy21qUaQq~LM@s}l@TesIrfE7FGPe0YS&TG?2wTZ zRf%hg{5gmv654~H#LFm(idrg@tb(vvVyj7*VMUY`N;NB^rA|wqwdR9aFP7gzwl`;9 zQE!n>K(+t_lSpXuvUDK4O`KBu9{>OV|Np!^gdhL_1;9x}K~$t&OHUg~5Uw(Y!3=T` zQp^#g?17cC+z<*JHk`O6|Nnx~I?9R&2|>UJ46Z#?SJhWNc|hU_?pvsbLsdR1A#{Z5}3le}7l;v4{6WP16iIw_VgM3OAk17S%JJ^q*cBY46%iojVrGAT zZuBBd3CPuJ?19l<{CR$UjwQ?BX`-Y&p=HzQ)R9iZhAJ=tX0g+qtQrY$vk*|ej(zIAOFy)K8Q12a5S!&ch>@y3QiL17K{ilO!7!IK6TlDol3=CFT@JpBO;$Zo%(V+-a^y~?RqLA)js8+@l4J%KV%QqrH$AfQ8Tm-mdrWd7oLDyC|)BoghyD^K+5&QoA?|dVv z_k2F@_IP{kv=7hqoDhHX^vjp8?hihH{?qOz129eZc!MD9OR3ZTSeVTg_9+YayuB@8 z?W9O_ zlt`31Qm(4*Rs5nZE9fWk=;-MB`Z~vQBJd(>g`pHH!3iax{wa$JmxvAz4{vU6kl^|d+ID<= ze0h24r|27aeSO360qRf`j(uaC3}CB(W}!MbfCg(gypGIGqQ8n17*=1>mg?8>lu>;u9sUcS78t z8Hy5XsnL)$fIG*S%A=(paB^~Tc=-EtI?Vz|?ZT=!hO3}gtf~pUwhp0Nh8Grw!pwJf zcj%?<=S5CX>B~hsO$wf$;*rC41Kstl;Udq+$U`GU_|S7zo#B zumCYDmMnbAUN?eB$+JhgIOAHcKY6f4F#^=V9EA|V0@Okl4q+w98+EKI$xkex`v0jC z=RW`d0RR89V}IfR00m@8L_t)wUEfa|IS`&%(q`FHh{!zzL{CULqJo4-F7QSq#9L2F zw*5DGqepvx$5rY{NO>V|z?BO1QWcS$d=Flazp)n*?$i+?`@{Bl#^Z0sYp++f_%H4O z+$*efII9S6*(}-t5H>9~GS&x<1N65Qi(gB&*qFR|^V(j}ctSx1!A|goQ3>G#6jDOq zFm!s=A+ju+=PgjTDye)VOVSzq1!e-29`tcJv{l;LTC-G}M0|XF?39Q*Ltz_)jZv%B zn0YW5%EbgeV}5paCQS=~fDP>RCA)JXm%ya7ymJ+5Wawkv`{PswVnogd2&(#;p|#d( zwN|TDsZ?B$;1i;*iTLZ+3EDo+Al}^E$j*vHG#n1)Wt(TuDsGC(HvltjZ|~T*LJT}& zio21$AiZ#RclY}GS}TiWmIm{I!&pe^--8ln&hy+>gS1}~Q74nh`T6JfK-J&1Un%hd-dI%EmRa5d=T{@#CM7 zn5C9ooOiq3MYZ)EXlZGw(r#~!MkA20q$Pp_o6HzftyX8Vf5zjBASz(@xfq20>2yX! zqtVE5VKH7v#zeHaxoP)E7N+>0l<)C4292R=sYO-}gNQCKFOl`))Mzx^WXpf2goxh1 z|DF6IY}x7(MxVxR@lRIHN~QSvp)n-e=|(OK+l-00)9GrxCF^SE8(aA^^Ga!2X)dboJheoVv{XXk{49@0)A{{wE_qYbtJHm-CL96h+(MogZF zxcHbC=EHCWx5HLW*#6{setLQ;X`XKHJ`^TBCUB>V6sS^jDT&B4&GQ^8;1euB?94f|bk4tc~-^N}b9Sp(Rj^Kvc|O(lo_t14tG*vg`*eA29(e zz!$o)v7vbi-#KXZfcDF;`UUTph?&zgaLxqLn@=p@09GJI?e)07-(%*BiwkG?1@zlR z>ZJt!6Q9r#94L|Q?!JNHGZ7^TudlC5jZRKZq=H^6Fh?zQwse0#6^7W$k;P&pt*El> z?Cekw1!2vip(zEo1bopbJS+XFdS+Q%E`<=RK2uoFFc}9Ii^&POVkZflf{4QBphXid zFK6=BqgW3+AKTwk&s~yz6BbUbv`B9x3`AFVZB~&wOWUVhgc4l z7`WvK&k?26E<>>$Id3KsDk0-?5o8Vy4ggY;e!rjRukY@@dEN;cG9st{UnGRR+OP*e zp9lo={vd)!MfLg$L`THWpI5PK2Zk@kj)AZw(U4F)C=S4f!2EF+CnAE4J}9uM*c#m4 zb~qjgGAfJ;N&rFRIMyb;e7Wu3XZB-k6E3kb$TuSNK)wV^X_^M_uKo*5Ve9b9kF`bs O0000Dv8VCL4p_)T#z+FvSiKeJlyWveP>sxOl@t=-kIs! zeY*SfnI&Y7e30!7AfN#2nyUIw0qa%N6~A9QQ*r4M`xG?mb~iz>Pc=wF0Vs5Y7O1Kg zR8LfaVtz6VCdb^c-QO1LN;s@g#)B|}^?nP!_`YsLC&B)Y_0`zp5J1ys@&KN@c8!L$ zkOMi80vW&oQa>}u95UxHhs^xa?D^}z1P4cxAQP+v1Tv69nSnEK0EeC3>yROCBlh-Q zbnHf`BdDGXl;$TWlz}8!laYYdhKqJ9c29t!6=f(;JiCAvEn{STf^uMbIqsLE4`A@B zNv_zfLgLBklLR6_{_(x{|M}Hdlz|*5LJ9$jfI^Z6gq-|*LJGjeVsSB+sA~gj#+t&K z7#To0Jv{{!kml^9%@G^=$Kl4LWnz`DXw#mMD1YPP}>$gF?efy`pL)Zc{{Tc3E=qnXSXx?C;$QQ z*T4MPfi691dJcR5)^E1{b+})8>BW`C%ozE38?7kN^1=((D{QKx1ye?pF*(p$yPTh& z+10KpTTfg-N9XR0U2|2UW9mu`2U@As6XUJG_Fxb0bc93-JKS4`t;!JK#*G_*{_6E# z0~EKYD@|9SN$9K*Irh}en{RYFL=nNm2XCj62g}${{ahJZWpJx#ra_`jm70HvpaRMXchT(^ zH;y!N`dFp~YDV_<_8vTV(5;gI_V@R{J~~Pf?H23WYw1~0ZDzY z?2uC86r>I}B?RLDBVRBg_yjWo-O6`Vp<{!H=#O_ib(c^9~6;gs0ca$#f6b?3lHM&*s6zEVJDDT}TG zJvW=1TSnQ@uT{N>83|z)zOim0gLfpn_L02xMvpwTwr=Aj5r*d21>^@G{AtbAmU@Re6zTP}Y}RAz3HtgjBv9gPY!y?nwc z3*%TAKDP)5h`W~|$jU8c%eMh26q0gqaIjoHPW@bY%Q)@Y&b8B%lV_g!#rgSJ#&`Sb z)w8p+=FFF0e$ji?PvhxSCn?fJxQ@X?Bf4a6jI7ZR!7ynLu~$<7sB!_H1*8&&KoL1k)DIuQ2|0cQ=fdhATb^s+vnNent8OWofqo|&kaq{+^cK|FF z3jpIdX7oWWmrGoFw33&#(7*fM`{3a6prPFIX0@ME7aG}lGuTsW{J*_@JIip@QOkvS zll4h!?V8jW!gzjn7donmQP=fBXi{yZs2pOT_10`Q%evW%gHS~&j~;z*|De?STjrWD zb$oB!y!plFp8@)>Z@vL=a&i)-xylw9baXIIpr;Jr@WX$Wpb#=|+`YZMy<9GHZ>OT@ zM|2wHtjK}@X7l;Q#Z%8pd)8-fmRPFx?}BBk!Z<$r>{THiegE&sN@7nd2p=Kd3i*W* z@iq?U`c^u@NVTU&0O>zIL;tO}ez$zQy!ZFNS(mrjyDE*=0Mas{5o}d&ZR_++42xRp zojfw5lk;Y`os-cVd9!w^VTUq>%o(;R8EBc!hNtJ}DUcX?o@pa}QZzE%gi1*v6#wTS z4Y|Ovov3Pgd4GRvvAB2dAI-Oojg7OjClgWB?CkFD4#V*9;dcpW%Xuh^{*jpNo&bWx zY{7|uiLi4H^I_`@#!qYzG515IL1}u1;T*iaR8=p!OXS9U_})E9-O-Nc5lI&FrT!DU;vF3UVKW3^c9lDfo7S> z<>ATfXCggg`}69RD=!XSL`&IdjVtuc1Qqs5e6D1sQNkjGq>7A6*F5L*&u*)FUB7dAWPTLkM;p_djZ50oZgoWsOiceOZc zD6U3qiE%;-CTSJ5fcXUFU9pI+HB}7)XQrC3HJQmc;Jno|FCz?UZ7B0Iq$2>LcDqx~ zDubR8oudPQPq()I^YlqFtr%r_dAX{plan{bxJnhN_f_vVNRDz9>4B^NY5f`(p0nj! zw{G3P|8G$Z;c_7Q2xZQ!2pTf352Dk<>TYyXg+ELDMd*Wmg;?!K;X^I zPxkhnL(?ey^fGZvrFCORmSg3Ydfe!?XF)L!s3Vf?gYyAvCDqn#st`oApZ^%=3WusWs0T94|nVlmaW0c$N_H;Tm z&`-5R*&Jc75M(&uTzWZ6?qZ(p>)Vf?Jgz@C4Oh+T&z2f6U`im@pPN5DJ&n%Ow`55y zZZg;|QkA*D zqH)*Ri}mz}^+EjKd({l#B_E(E?O83JvdZ|t6cgj|n4B{@ix8y>BMN9T;7%lCeHFx_ zYQjdUXqpra%uz&ywPgebd`KjKK`awyqug~1(uGWIb2YtsuvQ7$OYJU_5)5W1Nm{Y5 zLhFXT4j@_JOmaECWhW%Ova&4w9B&l2atQ>o1Ea9PZtBnVS60`;U^&W7IKl2*8$RS5 z!PJldC_|Q~BN5~xAL&2gSV2EX1nAndb?CIDi;bEH{W)T{E(19@XC5LbssYZNP7c%* zl7O>mk;ORh6}Y1F4rXbaz9G@jr1|sFt?{CLJ?=7f(BBQ*cBdYpf$iZdK zwSrx)uCI?qAEb=3n$x0h%Sn0T)Tn6$H+F99@9z_J z25CXIbrroDgCcL`v$AZqf0M%%AFOoK#p~~Of=|gw03}3*_$DwTN#h||oB)t>F3Vg# zH{XB%{+)A~_m!_oX711RPfy3mJ*Js+1{1=cUP`%8_ocp`2nGx7Rn_w8U;D#qSqOvk)hkz~<@D(Auz6N8-bF?~;Kt6)M~@zvEU^SA zM?#W9RikU`3exbQc4scnI$7Sjc;O@GI$(e2%Rk@S-L3pAZ}sN-ozZCIt8z3NR#jOP zAIfrEmgBN4LIp>)tpUtXtpyKXiPtIZnqf#a;t8|SKWMNBBbMdJ^NfhfatdH|b?w!w zp&GDmeE^(GdykTyGm#SJf}5M0dwb78c=2)=h#{dQGk`yR_0@O({7yC*pGK}luATfJ zi?V>oq&s1TneoQCF1g%gtt@NxdKWJa*5)rPfBp4ee*D+n`MJy6TU*`sZx9G~?tJ;f58o4I0KYmsJY#)BBmiaeYvKT;2qglj+v^oYacOa} z*Xtha@3S6_s%b63U$r}knU|JVj!)jyMp1R*GLvK?p`YMaqU^$8^}=9fFj)EM(zV6K zj~5r#Ka59fOP60AJzHDqURvn>;rGAwp8o!i@9#evmgO{av@qySrmmcpzghiwQdaG} zljk@*{CQlQ93AZ)9z7|ir?c6_m_z3lA|+9?5i{SsdGo=;2eRyjniPma^G3Y_V(;wi zJbdtz$r#uV{}%uN|NrA)_q_lB4U0)cK~#iWX^dUxS$@CoJNKTu&pvZ!AKRJnEOxxa za^j_qy{Nu#!=No*Xv zB(*cKJsyu|pSk-v=brW3_;J=57jdN-otbm)S>Ek?-sgP|A{}G#P58AKB31{*GpxXH z0fbK^ii{l*e{d$7bv&9F==%^btdcR;7!K;Nf)FN(n#-2TgL8d-Q{CMYh2pSHd9ztD zjVkA!>zbp(y~E`qNP6YkJ%q#FqNuvjF6L5uC(2i@&J&_afih~gP%QWN zjXAEiwRvlO;}@E~rE8m3|K*kba(eTt`lex{0;?^aK;@J6UG?9L`sN?Z!o<~ zC>6p>0$_{~&gMEtM-T7adwO8t(X(g2oKkal7VkCc>yBOR>ddAURxIY8|CK{$PR-et zzJId3XRLev&XVJ@!w1J#R@Xe&X=$3?cDg%DMq9HSM^SjAu~w-pW>q#kI5|3TmMH18 zTA$UpK>})Mqjl+@^_*x=T z8V&vx8Y{Vw`Ztv1&BN*syIGWEID{K0DFI4`Rj4wTQevW{(z${D{X@f#j*TAkaDSml z9xN|WYAFO-t-9d!jjx^m@x@;(-e18;96C64aAxS|mp)U|sHIsTX)N5yc1z z!HzyU`S`Kvlp_D_-+$a_xe7^jlsfl4az@v;E4BM8%O7jnie(u>@ZGl^K5Ur!Nd%RA z(gcFq(H{A+&;QS!DUy6k2_O+E3NB} zNL5wW-C1NKKcnc?3E@-iQVIls5Gi$($H$Kk4jw3WP1g;_^-RyRD04WqD0O?f3P`d> zOZQv{AtWUuM4_HNSngLa-Pmpk&LyC}?o4-Qerct~1)7;0y!F{aE~}1?lusO+=@zT%C0B*XDz4L}b{2O!+7!c+>x*m!u ze_wBpWwsLn*iZuk^11UbXu6!7d~$rxll%5RzOcMPnM0Y)Ii;>CxKqrh^I5XF-K5k5 zz!LcE)aZ8Il-x6I$7s7C`Cz$I*G<#%o;f>vXJPfg%;>o@hb-IPuC{E)t5mg)l1d0G z6_iF}tI?w3N5?a`jDV2cBC3X>3nE1-$fjxM6t0#VlMhx4BFxsD13P4gYNivDFCF^HiBD} zG90lAkTRXldR}Soo|7j}K5vT7)5p6vwyV{8Q*cJ9ErjSSWea)5v|IpD$g4fwg>QZ1 zwGS@es@FA4R3X@Kx$_Gr4mx&wyVA;L)K_15_Wsfer9#)+&1Q3Rt74h0MpIi{THD&L zEw9z4Cx*1G=bBIS}&M>ni2#{rX#0R|&v?J4wJ2q##WceKggws%NjKL%9T?c#*}c#6jJ8n`+>4jf05&AK8AJ$? zB4n15u^a&FU3EW(LzrM8ewlCvfS_~%0)!IfLEJIwdZc~yMY!^pEVh1|A_Pc|{PidF zO?2KcApj6Ma`cIrnbYIrPk-gYg%ihfMw@^4U#=~!Y=7ske&fc?)vk_AM=`y=S>4!b zRO%W+uvuwk(&Y75zxeJ?Z&a$y?#>h!Wk3opBrxWV z4E8Q8JOB_}AkJCaqCK7I^{p1?D4R)3$z0b3>FL_Wxw9{3a#PgP+r~CyUeJ)@*zQr2 zJTTC2wDlb$wlLSF2t{_0aiYas%6RYYI0l6C{SQ$ENs~PU@?!!$JW__)Clm6U5Kzfr zar2jJq$ujXeWy;G_;rehzx~al`8>S!&g#2AyLt2TWkN8cUM8db@$Wq?B>wi_z3q9n z>w1psVNCXp_bsp0zy7u7o;*2c*>y_`neT87G zD5$r)gb}Y)o31Bjr$%ng-vtl|5J-*?9vtY}ecR(*Ya zJ%KnAR+e&jXmEXft+%(YR;vUL?$1becM?&bFJVXE?*>H#DVgx-L_`NyO>CeL!|bXj z!AX;^If#%ng%}Tj^sPTIFg-o}49QRb`PU!o>;R9!dlwh~>+-x5R07Us$RE6ZPBSdi za{uDZ7i)FHv{)gZ**7t8YyQEjFP};gNGmLtO}EW90(#}+8w>aDw@vT#i31;9nZNn@ zie=eqN>T=z)^8xvq0tlT z8}~Q29tgp6`2wXhpUYFvg$RpFZWsmtluE_6VStp+JoClHdkX=*5fM#3B8n0s*49Pw zjb>-(e4dV=R3uA**ko}B7_ABrM}&W(;ChKwHy$p=?M5KvLx2(K>D@au_0-hCuN;1~ zb8>I##jpPJ<*RGDVQp$J+%+8E0FR#Ay z-baihj1gxnML-HB0aK4nO^(=>U2kkUcEfe`p1v8z9NpNa)CG{#^L&ej;T4qicH5AG zU$}7o(uW^7uIs-z6k1;faSvj55GOv>YSs4y0YweICMAkErr2FOD-eRCM<3hV*Z>sy z31Vy-kjW6!ih(FY0-$`pdv@;W>DiY~o){S%$bWEo{^srVYD2FzG|s7%(!Xunb_V-9 zHa2Vj`X86{wxj9J*hm-W%rNZoK<^vBe}Q1sXc>ikuHI;V=O5qSsu%!5P07ve`e(OS z+7=xe?9=qNoZL^urr4P@RuYR)F*Hi54$=|xYZklE)MZWdTum0rX)dwqE`^LN8di%2L zaU?}5g@pjdTnQM2hcV*J1t5~UiUM5VJ!5^FTNTHlQZgwRLW*QMPIXGwR)}DpONf%q zmJmsyR1pBy)^E732>?+i6#N!EfZ72=1M#k?_#{!LLOA38-czSffAryp4>=%R3>Od- z(*`?^*yRHVd$Gi|<1`5;SwcjKi7*)-KQ=M(#G8Ner{DPNA7JdYOb6G_}T1yKIBs_l*olzC$S&}nFNfDv~ zPRUfxakNI`0i$-YSk(0vNV#Xv#Qntu@ZUE{kc?p~uuE*3NP@VjPUJyQArL_%6GwDp z*=Ph8yCk5W5{Uv~$BU#C&wlCId-oOq0g7_a=Q|AX zM%!84sM?N8DU}jHijkr2%UAE#8f_t^X?h-|fB4(yUjNN=wQA)bzIXA&vArWhef5U1 zyjB4zsb~8fDoCyb0Nk&L6rEp!tb#0Im1aCHKp?ETsr~iKlXICKa{u3bxP>^rOn5PW+ zxNs0yE)N=p5gI;m83ad;KIS;K>$vwqk!;v81U^y}wOpQ=n>+v9g)dD{7Jv1r{TDCY z(c4ycXHGYam%n^$XrS2A?V|_Bf9-|i^_FRv)HKa>3fZ<*DySddSh{-S-hck++QR+K z_kZ@u>Uwp3W2^bshBl%9b^3F8?P+hUrD9#a6hIz<+^@x6H;)% zDc!JK$Hq!3lg0`blzNOYgg7CHQ(O3oIZ3gSDHgMa(Gbj&l7(;R?-ZYlc-`UrxoM@<*RNYIW?XbOd8mEY+76Q-AQ%`Y--$^X^u0 zYv-)d>;ywYj$=`VEX!=Q+J#cR)i#8{mPIqUTBp;Y)R7f+C>$7x>#bHB%RyO2Lt(vE zt)x=PnaOxiXEReHv(pm@p-QEWB?*LJ)Wir$h;e~AwK(U55H2{vDgvq~5~Umfkc5yx zjF^ULFk(<@dNoUbdHAuI7Cnys*AgiBLv* zv^ZVYyG?}1tKk7at=345uUx+T$E7B%HEQ>^j)dSld)bNcSTawLQA-HU8KKk?J@xH^4#OjH(=>XEF_`4(3%T#T-((IP5|Z_PzTk0( z$E__)PEGf767E7Gn~)ww0RT}-pznXWj|qpzW@euZCZ09zR=!wRoE>@Xm8+lMJ#Kf* zpa1k`D5(DK(>+4yX|{TjDXlI|s;acLo6&R)ArL~Sii9zmniwrtnw&X=az&QbE{>PV z)%E4^T(P!)Sei}`g+p4U+LSO*#{dwea&vp<;L+iErEXtXn8=-{{g=2M^O=Eg0)o!&pbGqhGfB+;obp#-UICXPG9>hYJhS_sB2b-CF z(0gXq_w_gEA_*(H$B6Rv19vBNYe54vQXk-Kcy8grs$I<5Io}x;+-L8RP zTu@m;t4rhYSm3E^vty%?P(a~=S8K*;w!#JM>}3<9k;VDRP(aQXYr3v?j83K6WYh+P zIkhQcnQSQ-)OB4EoCS3(KpdSE!$HX~?e3F@!Wt#iFzvI`?45fDiwiRo>0}}iBaWpg z3ZWPwC6~(vg8@REQn^kknVd*gt7S$UfmB^nIiubD4&{_l%BkbiIsOzU|C&&{(7*cX z9~~S%65LyZZ-U-k0FZSAUU}N{B%$wp_FjJ5i~D=Z(@x!}*Ef9tO2u+|V*TREtCdzu z)lf*sgb>UX!FZ^Cxv3I zV;ID-hKENC(-h3ca!4>sRUn;=Y6=Dr#d7PFm!JOL^OqxGZF~2GGe-!<7+;u6wVG`% z03mdIoIzM!zqAAZrfE-2O$GuQV`6q@a&K?D*))ZK>({TJo}LiO0XQW#0C4IEMkpgf zP|m5ZLI4A~<;Qfr_i=B3&sAJ*aEiX|C1EAxi@XLXE5a}BJ_pGYe78xVdyg+zaIXmj zXfwrlmes>u0#NeIN5GddD; zh+|m>2!XK-2sonvoKnI$>GM8&t&`sZy$3oP0Poum2`NGFTivcb=n1uNQ}pW+-A&+` z4b*27^?w9O^4QqI!u-uEn;QqGg(o+s#)gA`^|Q^bht;RAO$g33Rmm0F|MV~K{pQ1M z({eCI)dsa3er0Vu5RB;I#Or@}IT9JVbTOI9HI^2VOLNJ;`OEJ=u{rG5>z!EWvCckf-k zG#QlPFW$Ixc-*@EAmcdX))$8eAYW|E%_K`ztJP|zl4E-(G;NeEn|)Nuz5Bs~y}jMB zk)a0<%E5s0(I@w0St^#Bx`vNVYfnG1ytJ6ER;!NVOiWB7tjA)}FYg|-SwJvTfMj%9 zh9M(iBSCdNaQoiD=H+?Y>FnYH!=^3I*x7Z&F;nXC{30U(4y zaLx!un2Da+`4++N+dl*V)k?*WzN)AW@wJ}&t^|)G?_-KTR)qlM`?AYG>5YV-?RLBIn-6YVmUVJ++-|p3 zRZS-1C&&BG+_*5FieI=eml%r%1G-=~XBI1_>k5W?LDfH0O2>VCln&==yH(C@C5SX;Z)gTzB0UAVC1X$ai60Z0vd z6lFh_zU#naDG$(9z*orh>dDZLuys8=J+=AlcVGI?|NgXX7%zW!X>=qS3IQb$jmohI z#3P}9|J9dVDCdRN@oB!@YDS~sd@lRs^{bXm|Lx6R&Mz!~{K+khV0bv5%^VBC1YiUl zVTp4FfEY3E+&|jgKbc6626Q!>%@9h@b46JVO-+v1Ypw6x*uV$~vDa4SRhjHP%7#M$ zS(anb!0_-`u24caU|WW15dmBvO@I)>k&%Qj7G0_@0Hd~VV7=jwK=l~_{LV0b8X zZ3P%3j1fZU=Xa088mKCCY{+Cfx9{&KMnj!;O9&ARXpMR~6x6r3x0;RGSRx@SQoG%% zRI7LH-syAN(06ldJs+~Cg5FRm}$bEPskth|*18XdLk8yJ& znl_}Uq0hbo5Ii2yn$7mF-{1Y&PoJNgKn)8*;n3gx!&?#t&N)Kxz2{ceS0?}QpWl%r zdF^7VlzT)RVw$Ebfo;R&)YQrGkqm$^MuH{M!$_8EwL0f?XeiujHsnB{Ty97>8Vu+T zVcR&S7$=EjH+ z>h|uDB&(C-kvD$u?6r;Q&u{N$vc=?B^p%%36&Y3Q#^PM!^fcS3m4y&8H@VS{nVHFYz4kx#{@j9&}-l9i+mq6 zcL9`e_ooSQdLmq}*Sinz5`>1rVYlKrRuiGUR++qC^9;_ zCTm!c#pm}9ZQIdQX=g8clBw<==AV0deK;DhZ2OrT7p`BKT3=3|o}GWSlXVFD`@elX zpsT55Y-)Vy-S@tbWkr@aV+={Uq~OVP>^xs{9NV-w=fbu+oN-1h0Z38gx8HgH__PGV zE>(X6_}&8^oHpA}u7cnoXt!(C%LRF^ksBFs5RlDgZhd^q zjnF-3`S|FVbEXB=FYcdpY3Q8Ug;G-pL5SUIcj7U5eQo3?KfL+;Q}h4&A0KAV3%~tj zHt@)Xej?qySsbexhTOepKplB)rB-u85 zbZ|l#E|;sSs;@53{N%^qmy}R^I1vsh7<0i*;1o$}FsLD{P%cL!0RRdJ31$Ka!3mOd z!5GF^Am|DcmL$e#myFdDZCRFm2?n>Vp_dOsuHX2z$q>-rLW6xBI8qKD~k}SzeVp+BAi2?{lEXh zL-*~zJ%*l_uDed3{X6IU=N}+p9G;Ht-@xIFJ6;BcY`A)2q=s>;r~&|~63_zy7Z)Fy zKX(4=qbuKd`OI5yZ&qt2=v5K5ES!s`Er3|(zHh)0DXQcT6Yp-Hcs+^-;R zdKi{k;tLQ)^DAMDN~Laj%N)c^WF#BQ^hRjk>IRvyLrb3qJNDeu zR{`XmyL$k*wz}~03r{V~Pd|L_)Gu7S%pFCAfjoO zPoKK>$fc!r*ZZaC7ryuXAJ5L1ot{5fDbKl*Qf_WFKDc!slr++M&NROLt!LXEYpznH z1bS9?x?J4c+@7l#SHE;&b!BmNWoc@vLzU)#5BrZ5dEB7{msT{j>p697Sl07OY9h2T6Oh+0Ym1i>RN zID+C)C_zfjiiKhrvN(c_Ng12?Ua#kQK{9BCUs>3CjHGRr!mzKZ+c zM#=$kmnM^M;YmX0uaMQ<_EzAwd{= zp1WH;EabEOzCBekc@%cK9oz1g%jJ5bIWs-IbAM-VuYPxHuV*nKm68mR6pMwlK~|QR z8ufjUOo|YYD#@jYsFp&2!P*EZ1))@mNJI>PNF_oR7K^1YWB@QdQ}O)($jHZn=lc`M zo8f0N@<}Eu6B#sZFjGM#=zFy6IpB)o00dD2QA!Ts8{%Mf;7Fl{EqsW;ncwX+Y6rdB zAKyB8a{h~#=AXHKUL)Zf|8;LLtmOB8^D77)zEX=ZeLWX_}2@V{`L% zt69Hs^G3ZHavl+4D8&&|k3M=S@SU0I+=&xwySon@$4TjFN{o<6LWq)*rZi9>m6V(V z0i~oulzcEMm-PGg;Fq>Lov{*(XgZQ>R0(S{OeYMhgd@i}ybA!40@a5YZ)9-P#Fs%w zs@?Ao;w1zaH@^?BjE@gNvr z=lR8j+}SgWzUS@iY+JpKA23ApJvRv1bh+#}ZmZRrE|*%ZW-65;gdQB!W@ajkg}c@2 zYybFG5QGn%S>C*}8wBnf|M6b8XTAHA8-}h4!TPq{@4HdNI2YNh`NG$}dgsn(&wb^Y zOd1K2>6z)vmoFEKxqL3`x;+*KN=ZT}3}QIJC69!Nq!a*y+-Qt`NAnbtrhF*f$;u$c zu_#FxZHVE*1R$VD^@O}b41rag+fV>1Z5W>CCan;R`WR!H$4FfQs7yNDY&7TQP76AH z@xtQ!A8x(>;nvp9!KDk!dm9@e>cyh@JKuh`(P(YlJ*e*27mrnJ$DtIhUe|T~%IsXH z)85+NDiw=<;OF!CbLY+<9@Lu6Mx|2O+S>YyzxoHO9|F=wqt&phyWoR0;v* zfb*tlx~@BVo9{WGsAJcE_vI(+R*MkXvqG!i(~*7o%E|g0A6>lsXsg+pnVu>XOLpJR z<@36(_jaY@u8`XoP|9dA?RH{9 zaLOnmlnN;ZAvR5EJQ7D?6hfRjgBSn}*zvi*f0*4-Fp8RvUV{{gHa7G_Ua5paz~uMQ zjfo^gyeuCk-l4MDDKodM8?sjKlnQ#g)18?ve)jPlknBs3Up}=m)9G{^+tM^bDeZJS zjH_0wk;oG)v_j`U2MJ(v|o!g(@5<)}~Yc?8EDME^Xr6l0-iWtcR6=INvnFhbWaY zj9fN*V!s})F6EzDf8>+fTi<;3+MPY?iR)kd)o)&lqR2E&A(c`}D%ot=uH89x>J$<} zC;?E}tZC?}y}bk1b)twjTb&>O!IJ&M&84;puR00}^ zVCZDJoO9g}i2))+nnt35l1qyVh$NrSTRkgd>fLT92z){aA}XnnqT~?}B1I%cBzZL6 zasWrvPr|F%qaI0)jfgV_2cxrOd^-;I4*-~*opr}sEgk7}92>q=N|#b5UO#>rVp9AE z$PK4Ti&AAbw{|;SCu7iar^}Yj{E#mnGcBv9>jnb0+N~&xG!0DC6jJgi+St6~dEQ4K zf1(?i!-Lv`-P+H7{>cws|L<1Yvh85!!GU4q+8s-9M(JQNm!^OaY7nX`1qe!`ibc|O z!*P6pM2R4u(-)4-UA%DqptjFgaBN}W;IKBz-bg8c5CkbACY7S8lmu<0LV zfQU$y3<02A%Cx(lHB^NG8)i{^7&O<^M~-C5^dy=%KUP(byjV0D9f-QI-M#z|EUC{?FqR9F8ww z%(wc7paL^v-1y-A^=oH4UFXid>Nj3}DwEAoE%l?ff7b0s2Zzntq2)MMd8%Nf(00We zKe|0#GU`nSK;7Qh0n`c6loIVu@8t5_LA~4UIS8^aHM_Jpo6YL?wpvm`$}o8pAP}Xv z6cIrvmlt}yzLbKd(uKS+RWg;5&6efbwo;rD6cUh7q*N&>gpx{1Ap{Gg{3&mo{7>rsZ0Rdor{mTyqQ^PS9 z|51ls91^Uqt~id@Y-_W#`MuiVcYpiEKmW^r@q@5jGBTM=t!^!!m|uVLg5;r+N{Fyt zZ|>JRy?)SWSyBN2QIZova;A~XWqMt!-RT4Yql7+j^+K^=uB{$xHd=k#)hLYw)ig~? zK_N&PxnF+eDMQz`wjRvQO@)C2N_4t*6b5~(FNKeQ13ZY74kkhkAf(_-as~)W2_y!R zk=q>8(ahx{7A2^ku<1wrFaqFMCq~py5IpuUpaAg6C$Cql)ub;S&@l|d;gJLnE?m60 zv%M{)%omD`MH3bL_}%SxOVf;#t5>@HPIYhZpMLn$-~X*wfAIQGZ+vv$wz?;dPoF(= z{K5Sl#=_U%{2-%qT?45!&vT>%Q1a@PbKPzi6sH8+9UBw_)Bx1di8(}Co-zr->9u2@ ze7fz2h$;XiNOXkg>Gdz%zrU|Q)*D?G2EOMrK{*S2&jA2b0+1>-tg$F5fgmU)1?Mb4 zEhVB*)6;5VubYwJ!+`pg%B<)4~I!1s^{DNya|_ zt!5Jt8DoeEw&TzP4@TWknljDlVqrmpMru1}ee`o*D zBZN?boJUG>#l8DGcRZgT92|PC6EUt-1j1D^0#L)LE)Y?oAyR~4izg3#!9$WVB#)$E z5-3t_Y!y^ex&a{0{{W2jBZkByEHyGU6Vy-kbs_#Q00030|4*P+y8r+R(Md!>RD@ki zbKJ%e?w$d#%YBIyU!r755lNetEI-OtlCpD4mE@{8zT}o)kyCzEZaL+Ua}G&WE_ULF zNIH@zQd;gV7g#J_Gu@p7fCaG2RB#}7@mOHK?&i0SyKDz(Sx5vROO4Brovw0YX5uwsV)|w0e$%LT0 zL=eZ3Ay=4$jj#o0AQYoJ06P-^DAGM4FKEhSS!}1{@$S9p87N9Y&7x*HwKT6-g$ZU zc0Ny0DFG)D~n2*#M{KD}zV{7$pbiDwWt1@bi z<1kC(Pzpa{SzwM1(ds@2#zE`Tj)|N21oEC}6gT=sIFagw61Bnxxsi zJ2xyroX~t8-MhON1W^#ih@zAufT$d$RIBB^v$y{4{`Sr5+4}%v*Mgignk3X!{XUuQkC{Jo_s+8W{J?eI0G?@v7kdJwo zzWnv4uU-$C5rB=dRCOC zmutMM93H+K&FAHsQYF00>W&%!?%ls%))!qCK-1De$%1O3C`15tc{!|kp2dZgz=*Oq z3673F=&aovjn48MJkMoBHT6Slt+5Q8p=t@RumFhG5XITOJAD8&#E#<;CBnv7FjgJto_7(OMo1y6slWn5?tr4Q_0-T5h-3kD^d3h1wB7AriI%!c5F0 zBB(Wk)6{XOwW4I$CHi%4T8gUb0h7ttT3Z>Mr4UZ}R|8pxw59o)E4@K+E3$xJ-DJRkIT4-Y=pjtQotot-U{M&qjxfSFN19L8fk&71T2d~tChfYtC*ZR_=VaTL{@n51b) zly0owZ?$&DlZ#({{;_tP;qcO!41o|G7A1mY&DLiB^ru(-uKW1tu2wSjV-dQwyP=Q= zgP!NQahwQcBJ65o3E2by0%EQa@!4tvp~PBW?G_O!MAMj0jrrvfTvHN0l?MOWCi_dTNXf(U$+unnulS1Css;< zySuyPWI&}A01(H~(jI1;Wpm#@-`Rf9ZuP$T_WK9-x3qSAKg#PAFr^|)CYeqHN5koh zVKAGYosWbKh+S*zwYECH7>6@o*Z?5gxZ7=;G)6=rqm^p4R2YVytFtt|yc}Ik#^doQ ziRQp8Ab`j=V>Tc*FHk{bi`5pKR-w5|7}dvO*hFxNVlJZ1rJA0eo|Nb}Xzcp>dXgmh zwPh$`$vLbJ4iLMYZW;Gibph0;VwyK=dIbRhFgDrS+xDlE+j~b^w~tSL%Caa;LKb$k zSR%2JB{P}$TI+d~%x6BL`sDG0wKY#EeDdidM2wR-O)^j}Pz(V5eg^=wLZ!9mDi$%B zna%tpPOW7Si)D)#0JH+7S%fK<0RuYdxJ9dR(S#D;3Uq8hQnAcDZA)!#ZpCp@SGXFO z4WTAU{PfwErzgiCISpNQ4s{t+J0CuL|Lt%H4fR(GxgH)KP9~EkL0&??_&OO6gWw_z zhdbN%`-9!-bVQWq)wY1GfMOA0I}d|?Z_QfT+Fb8-l;0@89*O}VtzD%Z5fO#JBxG$C2~+;+op$?-T=8kFtLlO{Hf2y( zs47`n#YqkQx=R26fTz!%4d1@avOJL#PLEH@;q`KXj^Z8<_V)pl4r}pWzI<6N;98?l zwMuHGn&*Wn7d=Tz)u_{_+VfDl>EhrZ0Po5+S(E-3x{nRG7tdOS`d0cu`FVOZAu@5|PyN@P*FM<)oOjalrP7$@E6*DV^-ENPF z1%Nq+n*cbs`@+m3;CeYcgMQBs{HE?hQ-2W^ulg=vvT^MD{&}kfgZ|!=&%XBD;Oy)bh)Ob>WrkY=^ z;WRMTT2O5l5+VW+VXGZ43a^NSY$}4Di^7bEBCM5bE#;xp9CT*GOw24IqFbU+O6%eK z({fl-e@vNj6~_2R{gGFI`w z1h9nus`Z5Wpgc)tZ!Vt4@pL+Ud+XLOHa2d@NhH8zGNtr94B}*-Wkq@{izsA7Krya% zEp~vDZg0SpS}P#LO!-1Qh)8V78WASS@;4j-Jw_I>D=!y9mC|#Kg4erpBbvWxT({FT z#w@q-8kJv;vK0cT&|kt7)!n=If*=4yL_B_e%*?eHn^w**_AmA2ngHsy6^ix}WkK*J z2ri;%q?G#TqhEV&_r`iFj#Ah4vdk*&Y5?X$YsYgvVnng1wC4!36s!(GYZm|&YHN)p z0|1s%5h5}S3P6Zc&R18eltY>VSU6V!kZY7XPgYwzeR)Q~4;$t~0O0AfFHcWS0N~c% zt#C2xE&vEe?;VZD}o?ryp6-OoS&U9a!C9&T-J+`7GMvMfte5YWhoAb`T6wYG+Z8H=*KNNiClvZ-*M zbU}hboUO0lh@!B#IWDQlVr-uyw}_qP4=Y%I)T#|lCBx##=U;qrR?Mu(!NFlJfN&Pp z&)wYIjN>?tqyGW`0RR8zPLt6900rwwL_t)H9bHo!H*j^fFa9KOOoD5MHg-CbhNpJ= z2S{hyPD1{3^3<2m$y4e~(;>7lG^QOw0RzU8wh#K+m1JPY1GaQ`TJ85rCy6J1u~YSh z0?fQ)P|3i6<>lp*ld!)lqj>bR=sg#paZ@O-)f&y#QdNDmS`AlMM^!akzW?PPyRScg z{&RZ%kAR{m>PlT-%L@=fV4;*!awd(PQP)ziKsOyM0A@y_*k>xp3kMYW^qMP z*x1iSalLNu%nGjaTdOn{iHA9qDwQ{h(tMuF~&D1W~58*>#0M~#J&I@1CXf%RZ zkCUlLgNXuV{URBzpzr1q2Dsbm^}3Xjt6~vLlM(>gr6+FQuAa&oAZtYJGk1arb?zb?@}_KdqIK{iR;- z^z2Mf^7%l{ARLq)iR<$I7Hl7rY?gxnHvyGl08a&?U`HfV0*jgmyNMIG!E^T{$ffcg zyc=DD;3;lU_uQgQ5OXX5L{Sr9rT~Qy#kb#m|Mu;#fS~mp%_v(!tZO!r>N%5g?l`1Z@=iY+o93$C5YsM2M;@)4#P?lHqc%Ibh};m3rTT~Di~E#Ig1J{ zyngk{)ZeB7hyXActb3%*A}_OOhV>-#@q3wScbY2Qc0X&c004G&-h^a=E{K4z7L>@1 zW$n@AXgZw|iJ_;b6Bgj16+#HYJ zhb}V^3wmo?6pS9k{~}NXI_>s!dJ!>zQ$LdpK-4izFAG3?FUCF3pw1c+?snmW6cI-w z!kR$oOLvD;3oqvOdnjIp@$=H`u zxHS2qwk5VU)k<~DR#aH1*Xw0jvUS@8b+}U=5GO3;{y1_##u6XqV=7Y%;nAa^4|pu~ z9Ueiz1(^;aULl}JRnRrv?e_BO7`rH{2Z?^?L1d{908+|kvw1^*`Ir{kF$uj#&oHCk?}sjjry~GF zd4Q=)9RLxx6q^hYV-FQ>&$bn|zaaL+J2yXiY_@o}?_wJIXhtCS#(AQGbmV7YR2BtW zCd7O4PL!_i+DNwbCK&3(;g&a80a%u0-pQS$l2d=ag5~8TR&>YG`JbDO7fO}YvXU1b^ zgIX(sWbL)b^PaKSs|cX68A${tY;{l@01~&K(($J@8MB0RT(6O5U#8$n&LIo(e%_;}nBbwn|7}%g^QB@>zI7=)quK@PQ%#{vtLV(A|Yob;LMtBG&+}_>* z*z5_LKUf=hLI1IAY-~QQqC>{8oaZ?J6zKS}x933tP}(n&(%=GwTGdERZ44N*w)T#? z3TbTEo0D-^u;0FYEq*?&R$VO*ZY>uUL576a&x`LQFv4*I01OKy?BD5h4h|0d&2Q%C zzaJjTuGsAnCxo@6*|B2lyASV+CHiOH2Fv`)ml30OOt|wfM^!0F)MP&_e5E>ok1kPdOrW_=z@W{7NXdcxLam>yk0kY8|Rr`4CLq3@gZy-RF%P$KH9ZoJT z{%%F$!TUcnpGKo0RD{q}5-VWz^wgaioG#t&+mn;u4sbq@@KC9`)9D-?9Wg-Mzp1I` zY+K4GAX>Yzx%qi(O9@me=>|%EJp|_c`ugtfE&$-uKc0zj7YyHm=b9NG25{wL8A;qe zZ4Ds}EddiTT8Z}_o1NTP8cCfYjkw5ShamxqZ7Ern;S0hzh-v*3F{*NSy32?!KFxYJDHW~^HmQ0l#)9?2Y z22R2Nyp%xmWnl}}PE1VP-`%PCh9=5OfZ|O7^9T~a+sKK{&AtBl^G6I3hW>(d1ZX3k zmy%5A3hsc~!Z32EV(dRG4}l;R&4dpc^^Qs$5CFLpO2`TCtlt@V$*<-+I6 z1#K|1uOk2e5C`@61ut>f7l#1Fu!b zTTzSmHWlw0H2}=R@w<%hign=^)3e4*O--NpXA5bZlxa1pnYRQ{JyAl)N>;g#x-;%p zs}=)d<>uyQXJ;n?F~3|cu#YIDQB2|NDTj&=Y5;tCPJoeR8N)p~j3%H#%9HkZkD7r} iqXPF2>?ucxpy)5>yD8*k?+I!E0000gE0ss&xRsuJcZ|uC=VHN@X7*-lUyaa(joB*IrC4SR-`v}7+l z!!jTyB6&N33!DhTSsKO^wbtm#Ki|HM@&$l%F7P7R zO2u5Qs1rE9GA#&;pFVvWF-=4R1k#9{i!|=TKL^2uaiAJ(879RHNgBcsh5>8;+%w)K zFoY9v^8MYrAZh)2z_5<^!d?{mh(ItmJDZ>v5&v$7&PuuXZVc$i!u|dI)3dW445z+a z5w>HV5X{WXoP7Qq(Jxbk$jjgV$c9PCGhSn@chC0DoAYFLkr1j7^fN5yNuO$9NB{-^ zVL&qRorc3pGco%KB+xVF5oC;#8j0O;^3(W}lpZQDsR1m1O@XU;Y&?D1e_=H-8jYfU zl}iF~PEJm;pCgw;kUCuY;*vNKCn=vKz9&70!{NOj?`2&@$p=6Lt#tfJ{t3(qlb+Y4 zB}ox^^5h8!SVL=Gy?Rxk6CzlZjfhcFPs)+rCYgPs(Pt?<>S?UGy|EDz1G6*8fd$a( z_s%EhmHTSBqOzn)d^HQIh$@-o7e9ag{KaoCDy2Ka`Rc;egM)+H8yjz4zb;gZ%Y5<) zmDUFHXec4(5VB3IQ2;zk&`64;T)HG@_KwH{yi>EPRV+do+wMnN;E*&RV9+#8%!~=* zx@hRvNJ?}OE3f+E>0%H>B4`Fx=zD>i&o*m{86F%QfOzxfwdc;)D=X=hfWF_<6unpq zI9e_&Ee>a96c0q4pov>m*j4C9o<4Z+pz=Xj*3Qpu@M1YkJWE*z1kFs(=g_P{;(l3? zqO92JwL35*lT`GfwXA$&Y3bVT-d+`LbvKDAEuGK)hVT&(NDwkZa8Injq2+B{N{0P@ ze=?b*9yGT@?a^j*ht*NBs^LlToxG)dZ+ym76QnUA=UT!Vgs{jhknS}})|xT;+|bwC zSX5QI3@K6|vioi~21;%f%04|Pc6oF;Ql9DW%EHw^i_+lSqD?^`z~pQq&Bf?{b@OH$ z{fECi>_A_k6l#(QeAmp#{{hQ^1r=(UL_}shhr?mxnqo^0XzhSfGd-q-g6{M^Wm0?Q z8%o3L*RRiCxpH{;A@4$5TUz=!{+L@y70R)mhJB@pjevKsL-7@g=2Dn29)GIOdcf() z>GAP#VMWz7Q1>#-XMz$F1C^4h14Vy0fC+8&+2o91KwJ}61WxYWxs&B;ucR&;SXf*r zv{WEg=u>4C*ns{IKi%8@d;71gE&qGMVtaerV;CaUBsl~mRHG)M?~jd6P<<6e%!{&( z_tyLU_Z|F;&@1aA^f4g6S-qtVw`OQVCxANRyT&0+W|~N55C8$ez1_XIf57GOuaA%Z zJvu%*LM%Ij!QkZdq(~qjOllq@`ss*dvL|S``))UHAu9EI0oEWi&?b1ti8vvcP8FdG za%HwD8f)Dh7MUb@<^Iq2=jZ45_xEeJRM4B4MRaTt06rcb7Vp`)LBLn{ow5AR&CZR- z<6=^^fLU}Z2C1S{hp9@q8ads^ral+ps=yEg#YxZF^U1mQ6T$qzD9}N|F}~DU-5*?B zR{;R4tE*dETOB{Nn$)7qf(4tqGMgVJ#ZfL~lHkL5JceL?H2Q9R9U`|@SAm$|+Kp{! zKwWM_wL)5(ifb(8Fy9ks^Fmc1zFk|(G6UBjkepu9rARtJ$^W5GcDSP7?*q61{Wu;y zdQ{_}jg>C+1>%Huc2M_}sgF#b(+=EaKy-CPEEZ2060bu2Nh+PK)CH-K^xwqAzQ~iH zi^U1?e9hTz@C!AW&BsN-(aHVvwM%~Wy4J*m0^sjGQuk?M_i6o%@y9fp+ThJ+o63%| z2UYhOUd__z+?FwAe^p=sEH5voBwtuX&d$ww$UN))^#;AvriznB?f>0RJY*KjUmD3g;RMT$DK=TcR+RfE;11khXJ}NB7LGfK2Hi zjb>-MdwRb9x_8KaUC3ja1u3$x%2m=Iusf-EIP2tb3}JknIh?t~n=}C>AB4Sg1blRX ziVW@T?LBz#AZ}h#24{fTkeN; zQ&{;Gh)uRwfc(f+JW!AcmJvs&6^jTU-2LU}^A8_}!=W0cLzZI>iVFLfN@6wF!T!t9 z%Oh|7%wX(GJ+TOS{rYuB(nz%in*tHpvMH5KIB~Dq;s7R-$#^{0Pem0voz7&U3T_^C z=3BBV!4-L;T>06r$;})Hbvz2$2E<|ULBCqsm>&0r@{>Ii`s-&-j-#9gqPB&mB093=+<-+@fQS~pS{M$8zEg7y z=e*$PBt=n_Wf^5p%1uxNG}B7NP5pq?_Q0E)EA2T*d?6(fUu6C4U*(_({uICGSk#zW z$Enf?Z;%i{kGU*x@5{KsPI82qd1ZM;A(iqD1~cEfdF#&Zo!z^;3@*#ktL`jS#itTV zDm}XS45MZg_YSV&B+ME|OcO8!(UtG6gy*<n9E#JxhmK0vIdHE5Y=s z^@%`asbzL{cKW@(nkbYU;y|^KcQgVB@87?7tA+)XYXhgJr^nsn?yGK&vq~SL5Dm1I z<xMB(-hYJcR zkh%yQO{Pv2*$|VVRtGIDFOAAlS2ceB^N+`mAA?YqW$xOHljGxvoZ`H*tS^z@_h0-i6tOdpK^%$_Uy!7s$ce&&Mh;H1x@$~Pf zs;9vwpD{hs4NhkuDr|1AtZB^3dUV9&v?uO4&~CTKAIG!gXjTT;+}zyQ*m(Hp;nl6H zy_4SH-2lw~09oo3ozZ9{t5+!vQx;FGqv&ZvV+L?_YwPgY^9HSfwY9bW>wY3LW>{b8 zR##c4ZzdmYYSAfz53}rTtoFG2;#8%hkZpHa^my_y-WlMns75Q(CS@2T-ILNX4YJ+E(#Yqx*=!F^d@UylOk zX#7d*XORg2QOD+FKdX#3wn!+sc14N&Mhdgc5I?K}4IK_%6w~-=XXnY216P1^jMfuA zH;^QWSTxNe!!vm$b1^L}I5?VNa*BIp&T;gyw zCW{KQ)NF#FEU=64sue}C_uH>>>p(}orfDs;tqX%h0T8AD=Sb5d*T2U^b{Yk%DuXh}4BGOVlE=hD;#vL~_9|7)-1WphBn9;SeVzxvS(g zVX!`F1j`v$d_CDRR9Jsuz#5NlguGJg<_TFkPX*-@v(_8q^5u=c4i0iFb84Jfr9Hq} z2P)oUw!hzQG<~QAby}iiIMJ@>()xP8--~1h0So|qySn5p4kY?H7@z%vI%$TPb9#7(gsXOQ4D{^@aF@V3ycs+g(PI@_N8nTUAwq zY5)N1t_{1rP1mKtVBq|G`}X#mH*d6LXM?2NT05mF$OOrJ#zr;kM`jX;zV{9*w`<85 znlogLWOGv=PW^lgA6~r0^Z3M^YgiOTa@C`z#Q$qe)`v^_677=q9{>OV|Np=ZpacK_ z3fM_RK~$t%Nps`I6@IT501bevW;CN^Mk9^Kvw4XVmv=i}Vpl41a&}dIS}OS$smdwk zq+B`V5}%y1=vgd{c1pxXVrevx16Go`5VIfN~XIdev={!f6CxpTpw$t6vtN?FqZMm*HC$p-yxhmHnMQsEkYPtq_&L|^< zXq*!yd7kgw*$%@nQ(2y6rM^RZoC}xbp_E#Dmj4I+I$zXS&8wQL-N|mAO zv+2wfLdG&llBqvU;<(%C{jfK3TsMi6qP%|2`&=MH1kSlkWc`@K;qdbEatX49!8fN| z)1;J*v8|cB{$|^fwcDw4VhboQ%Ag|O=CW=M%T;nhh)Pwp1XxvnTs4B0H-@k@Rm(P8 z?$E8RTVWgtQ|#<)_xruo8>`#vTaM#oq1@cqkeQ0YkP&7I5hsaKDwqbD%AP%c9{B$L z!3)pzPL5B)Fj6vIM1L9Fg0BfF`TD2OZ_A*~Iqj!t-?%UbYM!j`ZO;IJrM7A(5)lx( zy`JxTjo(t=TDchuG}~k!+X~)zERFly?gbDG!{`lqcXqb!zI3;1bs~2rh)#5B8}{a{ zjq&-|b=@e8IA?@XP187MQ5c0`l&bXh*6odrb)CQwU z$7f}qZS)yuS(dkE5;DfKJS#6-rC04~M>$-V~GoP=SR zmtv@Koc9jr9G>RXb=)~o)k%(~aJB^+ESZzG;#b=jiW6FQ`S8)hqTuVQya9~%Mh(7s z>y=e0%xrPCR)uv1SpgvCkk4* z%5Wg1jKb*p_3NJNl}hka0l_lwUr9S{=;3E*r^KNol~(;3ts5PW$5)`gU{!Je07_`V zEj7dJ?(U98qx$>z@87??ye!4uvLTJ|0IP7dj8=tZZfveUeDw0~cX$8!*RLnz$?EE= z@B4&M&-G^0X_6$AQqwXSXM_^lw(~5DqBxFa97OO;aupOw5ewsJG}`@gx0odWa527UJwsK|mN!q*lxq_p zl&r0y7%(E$FDpJg5d1*Ol4V9Y6nZY-$ow*5#M|Ny@P`TKwK=D#f7<0 zAyt&MVZCv)@UTf;{#{VeGVD-yylCa~2F9|tX4;m?mU4e<-2$|vRr;EEczlF}Y;SM< z@>g%X_2!%Z_}kYAm}ObN-zR_wsA(D@WHz1Yx)#Op_V#umT3y!}qqFHO&vPLJ0;H+3 zJND}8Dr1x}W*DN=?U z0CGgqu{&`T1;I3mB7!6g!-7o1Fq}2JTcp1qPqy$+-JCq=z=X*d1l7fQj!M( zL_*2xjny~acwGj`@!>J#fP|V;DLj7Oax0lu^nU=Uj`T$eB24n(Def zTp2RPOv~b&_4|FLvS~2&JwHuTLTD6)h7dQ`ZX!ar*Nfw1e15UMxt2-^d7fpNl{iaw$Cd=OEX;+?nO3MT%uC(kvmC2_3lhA>Smem;Q^jq@zaP17U< zrA)isPMjozLI3c@p~iU*5X~aTaicJfqDUr*lqn)oO5!-lRHo9@b=~Q7N+}V-=-3@i z(}Zc-9m{ilDN{f+bX_U6d27=!4A1q3D=SBbN3F-lx#z9bv{7|1FYpai{rGMC#R2!M>yM~@y* zBqs;QS(aIrl`17np_GC=H-(v|spt8bQkt%tme4pqJ3luJBMhT34DF6R4W=r~Y}+pO zI3l89=t+{uMCN(UI732|QYua3IAM&gZLH~r;X3Z+#e{Pn$FcAGNKn^w!w@&u*Wx$= z!0*4`%ksQ|zVcg4%aZMy&iW&Si}6LVT#5vtNR^Z7H!6zXt{|kYYpP9ggEj(1dIjq5 zfAGP<{(hzRi=Jq`_bibzP1DNw%(c6Dd(-#)x#V5>hub@Mgb)|U=K!E<8fCQ8?NCZp zs$?RQM5d{Vqd1NeP1iW*p6?4G*4NjAAn<*^)3Hs{vOBgAqSNV^mZ=+tX zF3D8Ze1NqN4HXZS^#+x_r35MY{I_2`d;YwrU!I>;Et)Ck44EsjE4tX<-|u$2?ZiWK zYs;%yG{P+t;(7jDh+nlm7!HPmfee#0RYC|P#4z-tUQs5}_kE=l=L`w4J2pU$h*_2y zhH-j!HXIBnqtoe>bFS%{A#|nGa5!L;sxm?~c#T9oI=SmF0O&?)5Q;V{x>gZ~PoakdkN5 zpEY}XtMmf^^!mMCuQ!{`u*?p?{{R30|Npf1l)C@`3@b@QK~!{HYj0yma;@s>?)&CL zBhE;+$MG67vxzrAoP0@OB)h>Pe?15gz`-V-IN05+HCARMjUE)q%lqnQKJ>kpm%=PR zi3CN0r>joYsYkOX6TJPX1;B6q`8Q8qAL~DdwTPn$qzTq+^xvu6_fp7T{na%ttHNzrsYH@&rXC8Qi!%`n!4GSRi0-})1IB3 zTj!i}P1`!>xe!g$B7&4+v)R;D4FJ1cDW!aT+^9}Bb<=g-=P$pQ&1Qg5?skmfe7XGY zAHVzZt1tilyMO4RA53+zTul5Jds7SZHR5m`4vNq+!hUNC4`ekmf!6x&?rsueCbgg` zj|0LVe*cFF{D(hqOe;SbF^-km)O-*y%QCH$(MD^-7y+WScC|WvTt6CPh}g5!Q?0di z)_I?#2_P~?-utSmnx;j>Jj=ZEb=`2z^CD-AwN2Y~-E1~<&UT%O<9I%wbHR<)&bj4s znWTx7;`5g;i&-H!=R(Zpa{%w1=R&Bi6G9Nti?bJLmaf<9@4x?#egSy+efh>QUaooY7ZIc)gl45K)*#(LksV5~WCk@w(%jx2ZdvN6g3R5g6HT3KhUHAMW- zZyP=V2kSZf1_T7;LL^DT7(>RKwL(bmy;6!ZuC?~wFPBRIsOvh4q9lp4EDJlQL_|bU zB#G$k{H$pjDFo+SYn`U4)+Wm`51w-Y;9q|EGE_1+=N^0%N9UiNub!`xIMJQ9*3K8R zEX|5pUe`^%uK-}T+r>#Dr8s%^?9H23|Mm9m$B(zpJHX>=9R^{AY|L|zP4oRgHN%Q_ z|J%>b&dObhBd{aB1F(eCJDZ+}z)$uf0P4C96Q?7!y*So}TXa6@X{NgphF(=UMjp_3M4PS4wfgPft&)x+bD1 z5{S@t-TC>s5aRiZ=UQuPEOA;cmy5-M5i9aSX^jZRm?TN8bz18@Poqd~9=CN}anAER zTP)^6$cu}M_2arM_ke@1_l!DZ^!-E(1L{TA0s6^iXV}as!o21aS|gUCtl17L<|OQjFD0j zQJ&{q2mp{$D5b2mo5xKYM{yDhDLL`^eD-jEuatJya?Z6eQi>2lk|fRZ>~Xyr*0{rW zx;TlWD9*C)FP{JB4{u+by|}%-9folRCB-MDg&?&81u?|1);PlN z;r90SNK#CT7VPjgLf-FaOx5&={uf_-F{wH|k%=(*7d(DC9&#`Fh?9&Z>0W06;%aqj zjoogx#uy=`_l}5Xc~&>g>FH?{M}g(%^ZD{*SrmoVS}R@dcG?)FI;B)zw)|OwQm~qn(|d?f3h`iwpsgOU^jOJVNN}=~}6f<_aOZu9HHB+)Al#v0N}@q2KMn zXIbW)(@NEK?YztLjB_5vk&L1wNwiYl`~AME>)JctbsaLa#&V)vS+-4^W@%H`i{+wg zyP_zN;bK0IqA0{Fr8FSBySAwy?uP-N?ewev2HlQheuM=yZf%~thG@j^CF+kXX}S` znx+5!`ya1wZ(f|A?W-!-c<_M3jT8foeDl}8y1%>YIe<-opYnwtu4lB9y0-`KeTV@^ zBDU??r)2Wy9-}rM7_IMx4L58IcX0qGE<6ztAX;OMF$lmp=bR%$Ap{~WPL|8%5)mUQ z+qQMqHcex#i{r>>t&|EPBuNwRfib4FPU6H`%ZM#c7HO6?ZELM%J<&s`LNmsmJv-@R zuTmbMs%r22cC)>_e7{;fyS=%~^E`^;yeNV}v`zcR_ZL^!H|x!MGHz*IG#=J#9BV0XsAmbz zC5iB{-Z|ow#7T$^TnG=oD2gJ_g%GM!byYiK>$)+&(nQbubc z3dW9zQ5;25T4RZ`qR2x%PAPSLb(7_p^R8*ywr!(G5;1KI0$Ag;(ORjdZn7-1))Nr` zv~826skJVMJ|ddUX3l%g+2y>*#AoW?$_|ic}O|-)|!@xxFYisP`g9b-?iu;6}5RnTG#xq9Y zFuij^Navh&F3r*;O&0U{SHJiL5!;u0?>!^pg2!>3rU@cgYn^kPxCbw|Km;y?HAZP& z6a@mz7juS~rYSM9*2zeM2d#D2wOXm$j~}BrRz{~;TGut_6vr{=v@c6Qe7;(BT^H;v zPU0w%^ZC436#x3~|8~D#4@nLJ!f*|1OKmYqC1@!&5m-o1MD%2^8xLq`R?-&d8CGBja~ zHptk%+;?4Pj8Uq~i=1q+OAuzPT&3Xt}IK&uxT3WoRkqU zR#lbYyxi}bx*xlFw#^F-A(kh!N3dyGfE%X_Y2P+q8GLcduT(D);*kMVxcaIcu!eS`2g1+wD$k zb$WWb+wQuqtM*mbw%hGaYi+F!_hV?KPfkzX{N*p(wz>Xr%{ga`oVDJA5ZqX+l}^(X zynlRrlp+#>d*|NWzW@31(i%J5X2Hg+Ms<2L`J?Q947SdPk+nbyhfeq)<>2@La8z&u zlfbZD<%_)7@AsbwATTl-06@7LXU&dJF$8hzi6|)h@JZI%K<-H#%P4B!DPSpNL;<@x#f*()Tm+LOB4U*1c~<1s*yYKRF?O@Qz4&l>@uv%C{XiNa zp>*K!fc`j)?1u#qKkUo~AlWd7!r2t}QB3?l00030{|zqw6951Uzez+vRE%9&ZzRca zj*QH#`(TqC9y6TL&c0}|wpTDP5@7pjy|RCW{67sCumlJ)Y^_!gvf)Em@6PNF$r-Yn z-CcK9UVg~BNX`mQ5a>pCRk15FGBV=(BBF4X)HvqqOQ+^8dwV$ud2rUW1JA_dG+UE` z02r5q1JiDgZP#@|v`xbpYug4Xa?XPwAcTDP=DXY5+tunobe-pMDW%rR%@C#Z@bC~3 zd(lg&0HCRA+4ptbIQ-5Je8%}iRDAUDM|qy5Y1;R)>x64H-nOj}T~jw@Q5Hq9-S8!ce=s$6thln;ItPy|8F`LC$E2XK`<089aMI;@ z1F-k({=IzpDHvWv#jAtW$jl6ThP7jFg2i=|QqG1eZ{JZMv=tfpOTaH2mtJRItrM{5)131J9xv#}|GWx|Mnj;#vFOujFZe8$(4lasosA4X(^0J!ey zk3gY&NXXQr-8~cnkRkv$Cxjp(L1T2+wVZRUwNf&P<2a6+rV&EKaqRgXQZ(8)!q!@A zjHZ-Daa5I6evr8c`Sk20NmJkV-3H+MeiVk;K_10X({^DP?DxC6ZaC*isTcTB6vuIV zuv#4*t%T?)!QFnJWtlaG2K*oY`Jb+?u7^aDr8GuE|H+R(S>N8;aRoS{aZE*_2S=-_ zspgDCGB#IU4hzghLsME30b-||tHp;mw>R)$Eb&zfZru$l;8BUv7`G4q%PoSssgooL z!?0~yqnYRVZQHsEX+qHRJ;oSi=;#`2ZJMRUzMzyEW43p@G)qGpTCm1gAjI>1f*8i3 zHP!)etJTW$J!36n)Rz(|S_>ZMN^3$0Me2E8lBPiz?DtigM%(Q^@B`6xl+v;+x$n7J z<$E@Hf)gzK_kaG^P=aa3`yJgIK+<$A<9w(=n_|`bicN-2FHX=SCNvuK1t0Y2{14BB zy=R49zI^H4SYtI9qm2u3-LEHvXr^*qmElXX=gB2qj)KDO2>DYx5QSyoS;9G#w? zG)>dBZ4mgr=P9X>q675^fb&6(HJ<0czkYvtdAZqa%BnKfAmVPjtI8@%Gug{5&*LO< zth=>VDY@Bfs;bgPt=Ai^R2)Y_h$xOQ;dk4ulFDi`^p_rQaISf>t~DSGnB!pahfaq| zD{b^WG0qp5r9{!EQ|y$cspt89-#^e_r?n5I|8O}GC)R2I-QI1Nr#N2~5h)^!wg?D# z&g@7@DdQf$cz&_H+j^Y4zIRubS7+y^q7y;j8)KwWj!^S`KS>hCC}TVdquqXIj8Rg0 z9=FCQsYEXbQbeSbGRFH}WLf6>p0(i8b+bG_I5^1iRBIE*5g~v`DWjCqvMAn{>p%YS z>&@+EX#71%!P>Lav&ub3Lpx0ZAjAs;L(Bx1j)*jwXeztZ)Wx8#PT0kJec$(e4^ub{ z3s+~3r2oVm%m>e3j8GCq3T};Z1^`G90F1GWQXzUuskNr6>(i4H0;DKQ#u!Ch9j=tt zTI)Q^lv2Iu*Xs>q6e;F;uC-QLJ9Z@qd`CD7AvoupdxwXI#u~~gB9=wD-|xdH%n$Mx zFP;ZsXpCW;8e_9O?S*jRg#~DvR*3$l-u&CYekr;I&^EThs)}-cAc&JPB?cDKcc&~Y zzEk<9PoF*Prsz!2FaF^d57d1W?`U=&>i%@#qbVI-v_(+tQWzl-QagmC3 zw?9^UTQ#P$PuLfoD{3jjv-9)Me)1U^J6PK}LWZl$%TGW3bkg06=NAMCMV}Q#`M_K} zn2rzg!;@R~!DX;qMgRaqC<{njOgt@KV~o+7GMeZ4#~;5`Qgxm1eJ=WWv$(9ciZjm z==cb%l~Nh2l~hXUBu<<|%oq#u@Rz^&_0{$DSba4X;m%?p02W4?-WmPuAn$~z>gwj^ zW+9>ZoX`LE^Sisd-EQZ?y0WT|lxdc_U-ItV zd&*dx#Ej9v50p}(>w>`F7X>2C^UU}Cq9~0v6!Gx*kRsJaA08dbUTUow;}&e!wrQFI zSlLU_iJ~Z!(w^_dNqlvA-HSd5d;%m2BSMHZcDvoK4iCS%dGpnmzn6VKcbk|jDgnX} zA7o+?^5RD?in3UW=N^GOME=l;?!m^n=$tzNNz-MlT^+0jUjBpY;IYKX;>ZyTDvF}1 z8y7&0NbKMpIA4eWG1i1ZFzl#ET+XxSdHdbIDoYCxhT*ekPm8hy07_|==Uv<8c^(A* zZnsO40ch~QY)&wz0VzAKny{q)&9tVK+dd)q~ zj)LF*_IGc;e`}N(fE{Z`4gkko#98z}fZ$NEw17TGeq{jU$eDTH5y6EvBkKQjn`RUJoHn+4H zAqp?>v@rw-b^HvXaljD)tu#RrM^RapK;YTar&U!ct^2+YqfiKegm|8(lyu~K97k1I zDW#=Ut_T|uqbQ7%B=G$p2t_Z9Helh+n>S@ywN2Buos`n^yryY7ArSHC_(%xRG|l(l zeg9{F@#lua|NQUQ|Ne*nFv`pi8XNtb&;If!x0|(tLk8+;)L1g9*{qH;qxD$y?yI+N z-_kd4zXxj_I1Y=ypa0#@<0!s)fAfRV|Dl-}$8NV92!q8zT4{pFC`F_bm_1lXO0?F5 z5Un+%EC_?HX|1)07{$@*aHXVFN>ju<&pgiSs%DIpWkrz4Ubbx;$8l9xVBzNG_RX8` z&Q4D@n+*UkMmggatdh#Ho5j93Jw2657P~zF>ADUn^3c25z5mUx|D`T#Fm{F(#u}rW z_3gO03HeY)=ZwIAQ014iLI5nh`su5YlwX9}PWQk0`kV2|F!#n#r}_UF_o_-@W)7Uf z3_+rMX6u5BCP1{&p6{KVo%KSLMJc7s^PB+my^N!%ZQIMMtJP|S6ou%sEOk7A3pG98 zS4t&GLI_FIEX%Sej2t(x+wP6lKp+T%>>vxnFbu*pOV7{GpItobdw~i6@^@do{^nb2 zhRobWM&h!o2_bmjXfLhqLqk6XKw%qLX35HZOe}3RGvu_Cvh^JzNIgHZT>VF zoRc6Tma1fwMNu>wjW`!Yk&i~BG)tG4mOalKCkbQBjNI$>gx~<6N~N>{t%WC+7MIGh z41z!wg$Bs;0#GAhVY;mY2+!;Fdfje!ZGCMrnG|`ky|W{wB%HoE*#7T-elYq%<5r`1 zb>rH|1p5Hycr?%BIn!wn2-Ylc6dl@>vBQPvUy!To{=B_*pRJF&8B9Z^gI2o{0SP6P zP((Dm;`Z&WL4S~?8E9=dOj(wG5J)La>h3~s;qI4ToSvL`flmqLLR`MQZup+D_~STc zjE<8e&kIB}%?^Sf0EFu|uE(dtlamvzH6RFIK$nh2$==Rhk|Zwrh&UPz!8$wJH_ZiK zU0pp(k`~XYmoiT8hT0=!S-sNj5+&^nF^2{g>(;-&xO?~D-8%sI>Z>pJ_YYcAab{q( z&&u~_bPTM0H2kSMKHS#rT;UZiQ3rD>5DNs`3za59;^di6>OF^orX z97|ao9UXy&FbwlN_kG{eZ{mco>=EWt7UZOqQkK-1GfXm0Cluw{U!NLJ2kb zqh(nxudFO@tUY-AFg_g~>>n84jtS%fIz27W)q1MO`=j^GyBa|2bduWn+sD$<(qQVa zOb1V=U(m(qH($d!Ya9Ro4*Q4ACP75RPN!p%+FE3DeuQ$S$`Wd=f*=7zt*h#ARVpMz zO6mC?C6rKN#Hm@1oO2DD3sK~S$#zN3l5W^NJv|M>uJ8G2nwkJZ*alFlB5#^ z0AS+JhNzpLeDsg+AH4YS#rE5sN;jhjgmA&7k~kZWa&K)4ePyMrp22g*8i1M$!BmZy z^;w>S?;HZ)Ip{Z_Pw8jX+gGk!8I49JAc~A=r9f%QsaBP{f)GL(MMCmC?|snA($o{4 zlrk@hvXsVSk);_RdY;Jhyp%HRbjq?E^asNC_V)J)A@Oin6vcQvj-sfPax^+)jGCQs z>+`J#j~_jI`h0))zNsu=D9%H_?H`4zO41?M6#Bpa z=9@u(P@MrWMF0nSuv~twiZ*MQKvnu-kOoAg#H8Gq=nAD2!JcHL$KweAaL!FFjZ!Ml z3r`3D&{|I>lTyl}kg60K2qL9ScmfCzB#bd_GNJ%{-#4;ba8XFf7!^VwpeZsiDMN;+VHk#C zCq9iYEnYf0I*Pgxp%_IAi>r&5HkSYXxBEZ+^z!!B*2C`~TEo!oO#D<(wCV6rMmt##pHoB6OoD3`12VxXUa{J>i+2qrd*$Z{EJ! zxqtt==g(hcX_}lRX_`6Jjfe#A-1+RVe`u#y&Dj_$jxj&wHg2R^!-p>kohWrJ$w4JenTVHoYxqi_27&%lz_RSKn#b`T2n$OV_1id5HX4( zB!n|&dNy@}AkTB(^C+bnVB_Y->c%?y^!4jEFaP&y&>t8zwDwB2QLZ*YEe}ZREywLV zgTCYNY5PRy>OT$o+P3pCudiOaw(GijTG~rZ09XBTKQ@mN=q`4s!wL1CZSIW`pm^iv zhugc`)rV`Q%ot;YLYyNZph5V;xGN|jlu~0$8xsKlj11`Y7J{g=`ir%-jrHO9Y-eZp z=?~A7vm`Ha(9r30#`ZjdKKRm8hEBRdSYdUP#%Rd8PhWuUkU#q8*?c$4}J- z(;^E!SVa!?Va5?jz{sZXj&sWYk$f(ueBFM^a4N2v(|Q> zRc4INZ#&k`QAu1z?R>Y|G}TPbCqRqKJBT#XYHu*Z9HAbx7S3q5i)*%2XD(OcR~4X5 z&M+7qbV}n!4TMn6855jxCOknY@dBT5#s&90FVFLi-`U&U8^*(Ql4=cF+xCHA^Y@#q zDR)gc1gI(_EeNvXYsoTk01e$MDPN^5rT$pY;e7Y}+WH4u z2@RQd)UI3MW0pDIXgH=SB1>v0c{Tx_zV6zK*3Kdn0dd2PVnhu`cturZfMQZ##UnCDkoNx@8^7n@5ivl{GzM2IJay*X&lT zF1An&4>N*YuFGkyO-uZaK5~}JRA;11dSKey%LGm*bN1xE)NQ+e@*s2K(xEFV{Kpt zRUzpH+0ylpg~f(#(zA3uODvZ&b#33Zj_s}Ot*tFpNh0sZjvd?B_()bo_KMD@6}*1P zSUaJD002M#`b$wRyXRsI!XW4lXn-t{2wS9~u49qd!MjOznaTlcC^FlfO#5jO!toq> zX*Q1#4Kh8G$3@-x?N-^sT$nYp>2N5V3Y!OgJ^ZV=9Yj6kbOOd>w&-Z#g zE~fC1JmG4BX(tNxYsN%jQ1ua2xlB?MC5at7+j>tq3BeeQEWabcwnh?booMlg#b-~S z3B6M^7s*tx#pjfBVU3C^NJ=LT5tU?67DJGNr4QI#Q!p{rCMFaL%`qhan46n>v+^cb z#tymvs=PK(QMcRO+1<(b;J?wQ;IdXZ`W1-iAO$wXf!D3iFtDq^0<)QPhF$bGfq-}K z-pNJze6M{cSsW+@8ZNrI2^l@O^aK;FGRa_oaQ5uC3kwT>y?-Aa&>A3Uf&hwsr_K!G4crsV}IQV)@92! zej<&OstBfyVt5(@g!8@ba5x3_<26 zDo|BjoV&QXy4vYuEj{r=mx zZ;7DaP^Fy}(YWxxgZ)!40V?`JfLioZ7yOnfeVf0mg4$7~uawnR`DlKh4*Q8cJ}g>D-V|*X7*wR z-y}=Rw%9%>3V91H#0v`xFJHXO24T+h4;cCl`j8_Fa3tN2n`o-lJl#2c;?&8(>cIV5 z72@A--(Gs~KsubnElfzH;J%DS1eQRi-1b_-J9UL5NZf*_+0|zuTZfWU( zx@k6w*@7MtCqVoFx-i=#qHedFU`@@r^T%BqHm0Yiy@x(aql<@%L50*xiEdrPyu~m8 zm?7kiFC9t4aI`;~AQfZGy$cu8F7nJNktx7vx7$Jazn?g?;Qi;h2aO zoz>C@CO{lf>4`c=R1q2)TTH5gSo16&jOEkPSPZ0Sxo7F=wHD~F?akoLBbuI>UjMj} zjWo&a$lr~|Qn1-M0F)a}p>kz5l*FT0Za9y%*vJR`3jhHB{|uxaXfZr7UNRV;?BqI3`ln4Zupg7`0 z4Bp_~o#N14ubwfCtljbUW4i0{byf9aWO=#+yGkcCDj;H26i{tpg3ADvde??5l#O%5 zQUU7)6#5*j^-vHajo3xF*8)#OGEz$5PqM`p6yu^smPp== z4*7JR@(a~DjSk#2Wi6}@38|ufzGsT6oM5k>81sN}^P`(aSq5`?odpl*yDkJ#;^(T` zH3TH3_4u;jfnaNppz6|kI6fHI+S){APG|-hRHS~-1e(w1H7>Iz0%8~GWP@!W_1txh zdG_r0qE9AIAi|x`?&J=ODEK@y?(*^R@$T+!lTYDvlLyHA(J%76v}g8tK{y%_a8>;$ zG*U$g1PeB?bD(&xA<1}MzH-F~p@TL?K%sPEk%KaklBu7Nx3aW$z_1eT#^GUk7mLA; z?|!-Y_Q3>fZ@6hT#WNq|A6EO_H5%z2q>4bWuruPs=TbLE&ML-3t`|K zm!&d9(e}>v*_lVSdd#fMauUiK5^2FnD3&BkmhbTZfd7D?QS0I*f-nmE`FKKfjBY){aSBuPjTC&R^b8Kr!xTbvo*_@2t#(+5{(67J6 z7jnD7Rhwkp&@QShhoQsrW(AM7G6TB8FgDA_DntXTEP?zHzU+fUKnMUfw>AUy#ZRn_ zr3-kF+w;SB-y0}MZ&IMXtHM+K(T|U&n=iE-eR{OLy=^S92k@6)e`Q4ta!OSs?WQVC zPMw>ruR8+S@{{Y=4*+`q!w>Si#;h^YTb9qwtv4~grp6>&z8EqP2y3%hO@Ct#y}Q5f zB+20tOdtw8GQ&S5M?>MkCwRQpg4#eCeJ|?BOsE1A)3(zZ{ljd2a}8Ff|EHN}a5!9y7oc!mY93ix>b$n__OwX0!Qx?j9|f zE7Tg-qn3Uy8}mErXLr)SLBr{hF@T(k7)EJ^2^RqcJ+vK{i(VD=+C-EQ%U(NGuK3lEU1OQ}0|0FU20D6%DC;|WlC?W*_AOZmd`d%Oq;M(=;hc8|Z07U$2 zeBw)y=KW+CP%Y6vBnWg}*Y|xKNnl1MA_F9C=lT>IlgJEYq9YSQTU>wyBoe^Ze7;(( z+)V+B)D?=z5X@FD>KJuOPypK8`S$j5xl}_&e>c!joH4A|9g&Dk-1+>D)X^dUfsX8e zj`cSqXXO6*^RvVm(GdwqAV~qffB8~fBALicruu8ptbYiyu|`6KIARB%zKQ;=53W1< z$+p&|6dD4VR0kD(-z$+blD6Y=wHicvkzQmF^nzZb=o^JtFbD=)x$Yu0Bn(kWDNQ`u zL|;je&*zjXhyd{Yix*)CrLwQ$n8{2MSg%(EgcNhNh{Paoz|FYpsZTVK{%a#Q`6Y67 zvK)p%jU4?Xm5iDA%fkmR4i6L1k;yZO%p@$K1r^pJ7(95E#A2*>8w5BwI5>LsD%$MY z0ARgdM};`megGeT^ilFm^lXLgN+8+$q)Y@dFz>olmlhwXyrT`%xf%GwXP+grAZ-Lj zt#m@MjS$&b{JYz?-8`78oSdBe`HL^a7~pwRssa4l?iT=-M$=rG2&~|P>(`GLi=(5XkzrToS?zOj zO(a59wPW*j5UfR3r7|e0kb}FmwY5As5y5W{4xWDdt$&T~O)|7WpVLnl_xJzx_AL#1 zM?bq%0{0)>|MKf^UcY{Q^~#kb<)24KRv5-&TZ}hWKgGF>mbor~no@&cP^{ZJY?5^* z^gr?N{doqIL;z5v2AqM&iRe&m5vkU!MS9UhuDUsjrh%Js9)h&*Y38Crq;DZpUnW2iGEvy>(k3ae3%fJ6a10beL*0fD`wY(MyI_6j-yipHa z&wN0N=m$ne{jA~xB(fv2jfYLCqGA0)%ekcDA^dil$I5_WhNe^F{1er)G(!lQCg~jru zjD_Blw_3J5If0>HEEQrS6frG9g#sLq(+rPu1BC;i?G!bM)*5xJ0doit&P@n}Fr{k1 z64TfLQ1pxGj{sWO8f(uEz$W_2n`>9E-nx17=!YM8C1ik)NTk@=uclthTy^8djbDFv zcvwVwD;}vW9uZ|-WdGvDS8v{I*cmJi=K6oOc`$m?CT_M~Glytx3XWP5%ZXT&#Jp2E z9Rw22z%H#5a-g+DJoV+2uhu?PNAea~Dn_Hk*CZ8yW0R}ps{m@y0K9qoR_(id`LakE z`o5M*TW2<#^+Q20>v*wyq)ULKHfs;jnY&ZK_&sj8dJ`(Y?{YohIt+ZnwcM0%jN zhR1Ij&T1SY#QyAT@7%p}=lSzP1OhqqUYrup4I%~g4uy6Xlzc&fplQ6~-eR7=J~|@n zQ8PNzuh&}oV4Yk94nHFdK3y#E6!BDuKbWKxsU>>6Fc2(PD?cl7bS_wHlyC04Z2G3} zz5;Db48!qav0N_CBEGjd3E+O0;t209?5v9-5>bfIm*9NUjkFC$?7N4y21X#_BGH*9 z9&J06*zB%#Vp4u~c6R=|IBri>92*3`Q1fmlY`1xMoES6x6NFyEC*qWbxT;0ALevqn z#2MLz1TkUd!+ZDkc6VpwJn_n<_qGzZ5_b}}6Ss5TPMjyEFjuc0a|mY&N1@Tf&E|(7 zarg5-vOU2g{E4#!xOM9{9`)iE45(`PpX1|{XJ|JPyK)$++F&iR7P)cr<|HY9B1NZ4 zXzgNh&<#Mn(9CwBSzAhdF3*x3XGBBj%%V{vg;dfuBXNu{fnLU2tAy7nd%5_x!o@+6N2p>F+=N>YJ~};zU6Ff@ExOis_^? zWO8IV#S$AoNd?!X3Hh4)65Hc{00030|Gn?*BLDygSxH1eRD@bhZyZGsebqg)W1BeH zwTTU^Nup!}7{rN>D~A9AaYh_K;#VRd$sgc=Kpcq?2yDQID8%d7>-EkQhw7@Xo?XOf zWQ}KgX1cy!Ro82JaS+X1GLBIwmmJ_qc~gayBrM&FD=}liEJ~MeESN9d%?{i-JS`TV zC0ruwONH`H0s=tMMyl3xUNJ#b8P-bcv<9^~o4!mxcPEoa2M6rFXj&sTxaS{K8X#)( zH4_y8!1A0`m7ylolxpFGP}W!%w3YseYCo+f6)Qz{iL$79SmI-$DY=~mLT+TGp#>-f0U zg-j2)$K&zuhey5pbzLtmFTGFM_>~8_X_NC-Djy+N>S)`_L@vgp&y^JiR6jl&LGxKI zgv=ckOUii?mydt+;RoN|e-PxiK=k3g_X}**>xwWS)aoON6=Ga6=IUq+gb>)v2E4et z8-aoHXahaP{r@~V>a}+OOePasc(Y5SU1>bF@?1Wb=tJ(Q%m%l>+wZ)Sh%M750l;UU zewq_IrxOVYa&Q=DWvrAhRm@tfZA~+$jSoO2wo!S%x&NR8XtGugeo8s-hJz> z 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/105.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/105.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b71f3bf4600d8e9f28b13a876ceec0c61d7676 GIT binary patch literal 18127 zcmV)wK$O3UP)VixnXLul7R#|AHjHfU+Vwu>+WtL|GC^A8%$V4?W%6d-URfJM7-{ zbXQkb_pIz>0U+p?{zxJT06tVZ+%)`)X6>}FrmTtYT zA~i!vFj%%U88CyiOf-X4{jNl{P_l^F|8;8-2s-*15RnWF2?HbvvZ1ebH0%acvT%$g zKu=G+gr_S|YC0uSffNziUM*yrQ=1Wb0kR+)AbCCY@REq$8d3roksbLAG^1r}O#sEXX449(LTbi2Mlp0!X%8ipT&Af?1M5kVG0; zfkHq=dKR(}&CsbtAqvpE@&pg|_m7T_l*J6x)+OpoGUy#yU2c|p9kjq#Wl0uEN))ls z^y$?+#tZ}9_txv9hadgppZ|hw+_8af z`-;&}&1UJi&jeyLlKKu{E07cbD$mxs%tD zTr8KDZN;o=Ex&*7{pT-U=+j@n_ufygTp9B4!}(dVB&+os*RTKn;lsnPzxMj@wysS~ z6VRrtsX!$!h$T@}mx1Q-h_{e&M(~Qv+6jS0sj4=GxM<`2v%a~pSe9yX|LV=#lUJ`C z8cxxtjRWdcOlJ$-cv2q*y&BYRnt(y@r$7GT+i$WIr0>g@C$g0~EA{?twzgbe ztjqwhvPR-N<@=UnmBp&enjTAguK@M|&MT&nHL#vxa_|HLXtdRtLVcl$TbTy61SJo4a6Yp2ri_ciifK$$v=`m^?VEW+ECmjD2 zV%fN8T#$>#W#f_<);DU;Hi%3`w=7 zzn$8?J0umN0v~_;s9my8;;)Y%&o?)6Kwp5FV3tNkI-48&xHaEV->QLTVdE2agjk1FuN{r&%achp?30Rnq_ zd$rcGT*3;``Ju-yP1~x^p^M06lKJRG5;%DBBx;dI{p8?)r8v{G;KBV5o*y6kNo}Q3 ziEXEC;MU&W+HCFo{9M*09Db&2qT{=}yC)|vV-`%~R?lm(Px_-8Y?6d%{mRN(4>e8Q zsK#Hvue^KDQvc4YDHmvEvJ9b048{a z;hiCu8ylO8AI{BMA8mcK&=%qeTM0p??)j42@4WNu@G$xV>q#rbcOxqO*`W^+Nr+T0 zZ)tz|mcUVN5e76>TK^HT8bh5 z{{Oz#=NWJ5wrISrUAv|y4++eQVXr7`XtRiySE?R4qo%L+htLIm7PxW!`qA;R^m#^N z>1&btM2^6)xV1tOlQfElpS%$&t5=VGbLC@%?XR>r{wM)ZpC~HhheanDve?O}TDR0C zoAXWezSipeGT%mTCvp*HGoLqH5?y?M`{03vU~i2=;NFLH23ecUEamdM4?pxbgJbdt zvG-BQUe$Rwa^ng`K_7y9&oGz%4*&rF|A3~aaR2}YI7vi7RE%2NZWKolJvFmCE5lk` zY&l>av84bJ$^#EX3h#-OuOPpR6uu$`ge?WUti6}1JapIT)4fZS(a7@d&Qy1wt~zz= z$^tBcDpgxm2h{E{U0uEHYA)D$_poR!wKA(TRzBa0bI~gerHyei4YL(FLsU4uD>yYBj zENqrhAm4OkesLCX;-l`w$;nASnJjN_&(F^*JbU!*iUM`m@ zQlh6cz_;5zgp*Fo8d7>Prc`BL=H*3MN-2C~YC~t}e){Bz%dZz7Kh9<|L~uQNrI9A= zmtgA6re+gM)ocu%P0S`{z1h{(CAC3ynIw>ZVv|JLBV|0`(GQQ_y!my^I9g}c8|$p) z?twlx-7;zxLw6|qN9aP2M4`% zi*E~yiMrUVg*%~{>$}dBM1}AuI$M{&`HV7@yQ! z$xAegCQ?^mNB6$r-1`si-`w0ZGi%|No0rSqbgkE$^=94tWX+l-Hii7{qEMV8-7t%$ z)wg>!9tiu;_Zs~)dY=r4%{wDM0igke9ukb4ot<4?U3Foy8h|E&eF#itt6>;6+btVs zHnkSGvKS%FhAZ~2SyA5mB%KTOS~Y?l$5KrU9YpjFfhu;i*rDPE>d11W<;g3gP^wWE zt|g)N)AJXzVfgF)d%iO2wrN{1Rz=V`49Uj=dgj<8nbTo|@s(NVe~h)vZK3r2D z5Vag>vt}2gxqhT4rj zU3k1$ef3zXWaJcVygHnGWB>U15Q} zi}GHyUUMeW=Z~(iMel8yZLrGysC=x32at}Aj<-=aD?f#1 zcbXG-W-nj7m<4!>ZDt(|z~SLx zE_ev;%)nD}x7n>$mJWftd7K=skH&WynMM#q9wOEK)gvOL`MY!Gt>oNzK(srMx z+(q9VT_Y|Hxn)r^u-ko;f1AteB>|YFpwr>Nv**ugp*((}WxicGBe01+{wRpJnOkSw zWOR4y9-p3$z=uztwvcweoa}R8I!qlnJ3s&N*)yKfNR5j0kES?de6Oj~*c>O|A(H57 zY}_|{;}rSm@rncg0ssL2|A7CHnE(I^&q+iE~rJ3Ghky?O7=dv92m8@gN7Zo;;!YE~`J zCT`rD5}9wD-(fWvLJVqbR%eU>Ab@9|edfLQKfr<{N?u9!A%r|i+tAQ~<<&G6M7^pi zEx}?jM@-$&D~7HTL({7&qo%_-ju7K5F{?*sMwka3*%!Gi^*kQ zFscM&zJL^qw)%b5@qy_7=H&FYju5uENx*=R*wY!tthAcCr>Xf$IjfbknwleK)fr69 zy-_ckd7j{Hf8^3705CBze)Hxndzy@~#)S(UwGIpo&o3@CNY{pf!Xj=M5dXy*3*%G* za0KAn1loFH@v)A5lTRHBYC;})Qt8qLL#9VU0iWFB71{z`Me?V2*iMNeY^9N{c00QSW;guO7q(QMcn%Nq;APSUo zTQUH@-#6>0mbswh*;t5kde~Ds=;?pq_)M9ZZM%ntWyCdWx|i z`+~8aLmlzKXuIzBuieY0iJ(`EN{df!@k+5^OII)wZt=!~Et1f6;ab)tz^HA!GN6<) zhJb>A@c2m2%F0%2K)HQ){YPhKAEcPl8o>f1hE7Z!ICiO7#!fKKWvVx-Qd7V@C!{`mg3-cm8(_Z;epj*pE#mRK=vBsL6#*tss)+T<`o zDP^W%u5acaIz0H|kDt8o;q|$%m(;ReQKgR9m^Tohv~1`qvNu@`OOv^*4Bpz_Q|7py zx;I1oBj*x47%|5nv7_PEJEu>dPR!5S;sWuEzz>mc+Cu-^Y;CLxilXR-;Zs7lr6K_pK>qnH4cXiJZ**s2bYpbsHc{DK2B)~#zO7= z-EERia&4Z_#Njc9i=(3xx!k5?t|!xQXBjP}s+3Yj83Gh*55Dr^Q=eQ}m`|={b7f*O zRWkt44^AC@^yo-$yrVB3yYTVcJMVp-Sl9&0PR&j|_w4jv{`%3yOE-KzPgN%fV@dY< ze0TFZtEFt3GU5!uw@47NJWS-$|$ z9)sqa@p-+nEEh{9*;(u>v^Qv0W0T5%rDEsZpv(r-teEzoc7q8yDy((fzETn<~|92(^R@ZhI z2*3F0)5oUvudU~P_N&+5`r99V^ZPea8yT-}dwKCneka9T($zhSZ^j+%@pCWSou`6~ zcef{v?Q&6+2BXaxugBvd^{0iQ*+Oe5#55_TN^56V-xSu?{feP8t*0xT-bi?n?iGEh zZFXxZdp)6L^A*D&)TE38qs;I1T)sM=E2xHUGQudKj541`T3gSZI(cj}lmFwN&#$g- zoqB5OqmSn#Q8+R=oLF3Y{P^UX|M~Ro_pYVZcZLSL=WgA9{`9e`PH!i60^u-YRjpEN z4F;>#DnH2DQV;|u3gRx`X5xHEiuZ2S>42I87GsMQEN3scLSVbX#J)=@+4Y;+1ZzGH z+vETMgt0%^5sD6K<*ku@q4mOsAeuU=rN9uO^vbnFNv-A!>gU()E+*5d^iFbl4T$(4W_H5 z9n;kIg1Z5C>_QyXb2=|Mn$ihu#ff}eP;Qs_PUZyy3uI>V!uX*>{R0E%&YyR-FplU4 zs8hVC*-ZxE@dmp3A1)L!ibP`}U8kmwNGKBV%P`c@VQA>w7ZuB#XAA%dzz`*jQRwY% z>xzZ4xys#zHDC~K^~ZZUPRvZc_NTXp20A7uhA&?F$|K8LnSAXu0>T*MP&imDRuIO3 zFv1915fF?KMxrbughfd@F>`op^ZLd2->hn-y>JHr0b}d`0qPz#(~&&0Lo}+F*Pz-rkcdtOE5frA?cL2mo0Q7sc;+;<2&Gv4NAvM{nL))2r2A{`|x%FFki; zqW_~$zE0lXxRY4XG`&>TY{o$dAuI^GZX%2kcA{{AFz)M(o_YG=lBx~%b(G55z0@`l zJN3$%rsgRnJOaGv_}-Z_3k&mZPHzwo&iZg8>E4Rs2Kv~mskXW2`eBzozND%uu4PGr zSc_$Xgh0lKza(ts2Y@0=9_JOc44+~q5Y1B0>CvqvS_|Ne(x z=JM*_|MjV95`MZI`hp+`SP&3GmdnU`2nfY{+JEx>nW@R4o41!YwsMuKAxPp*N%V-? z*7^feuhalVfDxQ}=IP|plHczqhS8J&O-a(QCK`&fbNW9300960$%$3e000cuNklhqy-WeaoRe7gVs&qHb$BT zXbUuGQlKqRBtHVffD@od(+ArAX%feV1sQ1+N3ujpwjxooC{m*MxP0Av$@@N!-RX}# zXYV1U^2hzbbIzW#voqh!&VDli1VvqneoVzfT|0JE!v+k&F=41uiY=^2%N&ujpjQt< z3ywmwM?@A+wl~lcLNd+)kdYs=&0NOc@SKKlQ*oQz?2UVM-rD%nc zk#QM-YJb66gSHMuO$3{vB5g%mk<+-|hNKM9<+(->tW^9WqhRqsD5z%XeP;o=0 zT9wr5vcopVgi%*P07ghKLJ0s6EGdMnF7;XsEF3T_nn2WRhKLdSpvdQvX4NsHE|D?m zN_1So7+8ih8Lu=rfm^IMBnXC9qhXMgA)p5%nG8GH({VdCRaxxr>Ns=y@W1@$c_10H zt=YNN-2*!b45#S~@9qD`@4R^a*EileJ3g|n-!u*3dwso~BqefeI_{h2CP*C``2Lq) z{{ErSfoiQeGrN3$q44c*KKHF}eBs8_LOdRuxPC8@+>uP@e78R4_SI*fIX(9Cx5o>` zaKxxBKn?EAhVIsfX4a0tAxCENc49mI#21gJdzBot@dyo4PgcsaHrL z08rUMz20m~CmEs;GLy1;yEE$>)ogoetylws5AQ7f@hh*jWs-A?>jvka`>Z{`SPEWC z@S}e}zq`L@>dt}+Wh4PIK+b}k8zN%?-PZHG&d&C^d;tKD9_W)&Cbo5_xAoL(8$t>d zjA}HA;tAV~x6w-y;H|gMYL$-?N*FSIG|du;gnmXl`l!#*!DS%yaP{=B2&=9o06~iZ z39Szdr)jzDM?BoB9ahccQ78z zsTg)`rwzl*?eSLVOPnfYZ0bv9fq9wgYj~p>nvBKuu9B90vR*N02@`3Lqsm+Lu zjg4*Ph()<}(ewJqc0y-vqhv*h@MJV-0zfX8(`^rYU`>_;#B@w#67E{HR(D;_7(*zO zMO!ARPQHN1wv6^|DZ}8dr>e~1;`p>>!Tdrozf^?a{UoIVve(=3Nfv^fgjr07UzPh|x=t%ib9)Ie0p6MFgx69yG ztM^r?lnlT?{NVlfb%INWLo(=Vq5^P zNg#+;uslGmRTj=n+aQmFZ-N^h@&gC2(r`RqN(mi_L<}rX&|JQdOxP+p;y7Muz2bSk zR)DrlVq|#Wqlf#I$TaOb+n(}#=R1G%;=uz$>dqhi>sbIQtyll{ub+?E76J5hw?o7Z z2KzgY9T^%O-UUE}s#04POVvOByZ^X(XZ7Ob|CU`oGSI$fXgCV`7{-(=0t}%dk`KCZ z!&cEh_@|%cafU+3EpZY>s%-;MQl32osIbTc!|=2py#Q z{MpYuIW*XN`O3{^(`__8A;>WJUwz~AL%X|w|BFwbJpSlUett=9(hwk-uyVPK>&eCC zlH+)Yh@2gMboX4o(4Jo1(H*P!{KnkGwRdNnMpK%sW&0xk+34qO)iY&NTCq!q4N_{9MG_71y*08&*tbMOI(gDa$Lx;{fjL?-91 zj{syabUhDQ;K&VwStf5mO|d+@w|_BT2%LVzXq!#<2mk!W@h3;W{Cl4U0A)9h<9+)d z{_XLjL+@U^@n_$BJun)QQp!^wJBR>J9Npu(9w6qjX(BqfZx;X!cKVlYUzoi68`o~+ za@*AlSlE11Md3088P%jwgiVSbN>hwVDT?X}_IW%!bl1*WJr^-LNW@|yWV&JGlHLd= zQ>nd=>{(k~Wr2o~X8Nxc3NA2YCNTpMC14tBgd~7GkbuA$i<|ax$>5w5K{967>JAVb z86DWw-QINkTFp@>bz_h1XW*49wdIwK)(pcP&+Ob%M@QS`i4SM*FNHdQjw?<)xo;s~ z{MD~-QkWX+?a7`P+q1K``!|#KEz3Im=)lp#Lqf`hrQ*(>9HTl}(@#A5ImeNg&Rsva zf6v1Fyv_j=wW#B*j>Vfrj}NHkXV0AZaB34 z_}$MxU9Z(Y{#&ERJ~H^yA3SyG>eR~G#?;;Xv4aC|UMP1YlUJrLbai$y#xGyKq*PRf zl`tZTIgxgmTZ9ggul&gyZ)mbRZN3^D$o#*KqP5j(C8MIw_SDm#z>vPEil-DN>aa=% zvOop`fS73bk}NyssVp#&FJ-CT>_|zcQC(ZfH=3?y(7r!8=ljAi_(Fc|R~IK6jYelS z1Dh0x04SHuAi!FoboQOg)oKHP;xSWA;N*!B#&Ks)r;1dRgqGLJXMb_+nNJ=&G&*qY z`tm*@Zh3*SjZK~#iY*>fDl8UMcSnb~_+=StRPowjU&Wyv-IJJ`kv zRY@=@s+>@Hfg%riN>%;=o_I+rm6s&sAt_#XO{$VA0x1&;14Rfj_`)_|S+}g!v66PR z_w3HmUmj+rcUBV6WxLk9b9Ddu>+kNbUCBzG0C8GNON;YCYPh^H6eHjC-n9>$r`z8C zG}~1M$X%*LHZTCxgiZhq(XvHQ3o<|=K*!(`6yz8VU_2Hxt@{23)3oEUpk-RlDlZiE zx8J>~D%>|l0)U-NKDD-e|I0=BO)#heLb5&n?4=VI&W-M5vabKpGZRArm|aLcoLfc4 zu3o$2j)>^t!Wsamq2NgO;~#x-wOTDXMIa@+w*`F-t!4lS5fpTEe?p+AP7igo$78WjA`u!H>NG7&8UcWSjg#SUz+9n%3}64cO!7{%EK9Bct}&EPk+w!=XGefGP-1pX@(9Ir@)xZe2V#_TGngb9voc!pIl{M6Rj;z!ille5k)8wUM<1D5|Dt z>i9@_Ba0WOjz*i;{`lKBvs=rOn*C@>L3CiY`hN8M&FM>LN5^J5t+ckb#beRT&Q7UR zLV!plQmIt-PoRgg6QM$B4WJKt;VESPUIKs(sM)#&1b{>oV$2{SK@3pXcEun9LaUsJ zC4u7xk!f2?>xEcUl*&3Hi^qbwLUndwBOFcx$!Gx(Kro=zYBpm?1bw~jt81B>VX2y; zY08DO#|^`}`1C|-WB1d~XJlZStBx&2o=r|mkG24jD+(Y0(EWw75OjQWc`h)^0e& zBeBHw8xH^w5V_(OW^f{cOyP_(#uy?n&KPH^g0>(897q^L?j|j zQ-T4-CO`(N$~!t@@tE422(-7wP1Ee@YTew*|KTtHWC{Zy#+kEL9se0qSUppMGh~1W zS1!cE0Yrp*sr$N~H)~}-zK(c%{_^wGi2ip%@5dcISB<0HxY^OnE%e_Id3MmJ#>h_n zS?F0oKA;(ZZCMVTqHpE}5g~HM5K#eShy-Aow#@=W7>$H#H76K=HPc2!m2=w`0Km|3 zA$xDAhqD106K>uT_H?xz8R{4x>-qlqvB!@c>S&8bBGINq^rKJi9v$v|IKPI>-3!Bz zF~(fbIU-}6yDQ+=KWm>l7XI(Oa!W!P9o@bD@p^V^3A~aB;MQ@D=aP)Tc&xEJv>^R2vc znVDOini|XHN^7%^c8kVFdaJ!Ps;TPQ<}M;Kd7=c8m+L@}9qCE7@Drom?|w4(%gfEJ z$;#FHb}_eM3(F5ZG!njS)6>)FfiBzL1>v(~y>9@Ww3LnYb${6$+P9{_Q;p;B8!Es_w62BvS$7mE7)%GShVhqJpmg^44>y`0nKXHVbzYAM;?w3gmw3I_mWEEv=T z0b|G*J2Ke$r`LXQ>D-BOVNr!jSBLfH^cR7A-<>-*O+)t&{+J&Q~})N{#VJw-sCkOYlPNs^33#MQ9P1A=Kb zQvn$w5@13xdb+!Jazy~JEK$*oWLxuYzT!q^007`nNAt|=BS6_)UgXUOTV2oSRdZn_ zed+0mnqdoJN5aAF-BKhR0#SSBdndo1U0q$z_VuCIJBvRt;NIl~6!)^PB+yAQTEz^cphs zRoy?Ei5+E(L1;A=Q1e(=;`imX>G~n@_y*Sqx$+eE{(X?Nxl(x zKlC!O0RUX5f~@+w2Rr|UNI%@NJ9XbD(4Hd|eIZjMvK>=Gz6yk3WCK^AzDJg}GWp(~ zcFya{R6HK_tu6=zRPXHs&KY+M6;Q{Iy#j&TekM|MkOCA@uR5sp9U2Gq_WyCYP62)_XuHtj%1Q~r8%8==Uz?5&+hlm#J+E!Ua`jNjSh_VdYSJ;@(#amTk#?EiR>GjqYSy^yFiQFPuHz+8krf@>LjD*w|?A zu_JvgEwT4MxlhQO6490A#p%y(sGJxYRZGNTK}~^{<`^;rBxE=`eCWxO{a?@AO{cd9 zlH>WZsZl7u*{7GYwQA8B?_2+R+fVp=X&EsQkE5@sVLiL25hwH(M`n9lLhs4|d4*p; zZ4keWPmqboRj(BCnWo4_xx8?w4JSszUoMuy z;iw>cXSWOhlSgB(TsezaEme)?rndE+wZm=g*FRUXncQ~jo>46kKsX#SO-n+*m!c67 zz_DTR8=&`375A8uA8H<8IMCl;$mJwg!p1wla}kio`u*tprvcr+KmeqKNC>F+(>WT? zomC+VRU3zj7S0U1L8A*@`!cy0RO zqt(UZhjw z%h}?cS*x-;pU5UUjheJYn-obLv}yWUphf>wpZnam{(%BT z(6<(71H_j&wq;S0br(fZ;+@>xnVr*z-5Ji3^n#$o5vf#W%jI&f*Tc|Pn2J?V<)AJUj1t+3aewbyhn+oXM^IuDZOIF|-coQ6J5 zps%O5+6#);R7Ng80q`7WR_K4ks#CdMY2Oq~*hk05jWYnTY$8NOtpEt%_Qv|&?q1w6 zce(OIoo$AQkwfAu4umS+XoQ@Dkm1X%{o~U{AfyZ<#~%@qaTZ$=o$JjRQ$)>n|AY0p z2k)t!+EJedU3GcUYYCE#-uXA5{K;h{rE>Xl>DA7^1ZCcw?Ei23zk}AG)m}QkXzia| zrChi;e%fo-Al|E+fF6?8aZ;4EFc@%->VZ%&{7{hxo` zy=YwaydVfS7jM1Tnk(hp`Etg^pmX{5=JLE!%0?gFfqrykGZ{cwUt2dSLK}lPuJi4; z-x~MSC>S$CMF3vOW|S_56S?q=u~5ZIz|KOn1;QwOlLBPe+3qH~Ykz;=3_3c)Nen4F zYLEaBvph(l6r}SoWxrU=cl$Dk0<@!<7bHI-G8_zph`kuXT*)Jpp`woGAwV%*zQ6it zwlbSmh3d&xy>m4TM7!5{f9Cc-{tZ&dPk(mr`RlihR;PCG{ps<(F}Yx2J<3P6_!R-7 zpCP+yHc=~?k-gQf4nksGi-^#Y8t%q1#yG0;-mO~;*OtyN8cBW|af111Mq>+LG@-MD z(zbBeR>T1jg6n`xJ1Qg&fCS7ZH&$OjLOEW){pUaa;n|BVGMEDZLYySVFxvT*NxQLb zM5X|X+0^oE(c#qde4!LaK;)b`Z_ldx^*yCvCY|eFuDz&+*XD|xp~K|v!Rck~)qEx2 zYPIx(B$Yl`ng?UY&M>8+$4Kc)>pt70s>DfaD?K37{`SH04Rm>#$x%}%Eot3UPAmU;4BJY0y54WK*k*B?)%r$ znf$BjiR(IuxUpJ%cr)k*!C|W@l-~>dAPgC@kW?j`yS=#hV!LqBQjhMgJiK%BW%cyU z?q0KAZC@UesYO4Iep1~hm%z|s^U*vYsi{Ca;%jSbXJ={sun40kiX;gUWS|^lKFsE>6r)ghN_ZhSLP(=| z0DyD73yd*`5qG$Y!@DcEFoU-i!*)Mt4Lj{Yf8dK~|8OW(-c2tROU-6!??fu4yy5Wt zqIq)OxU9YITpd&VV=8*ngB>lf&>Uk;gTC?L(IUX)(QGy&t!2KA7v&+z{uEO?5sZtk z)3@4vM8oRzdSr>^;n5KSq|)h1W!99VFyu6;-VAA=GA;-OoHO7IIa1D%Au&PRS1c61 zkSZj=xN>nMHi(Qd#_qhoRBQBnKbSAkd?_UKyWU_R8sAw5oq+y^BO?e1ny|RaAaV$`5j?mxNYosaR2^AqY<}Ou(Be?m~^Z^ z`y>)^yHfqS^fisTCk@G?}%{ea@+@Cyp zFjvW+)en$zsT@6d`JD(=5K2NwyH3h+vTkZFpMP_h8+bhOKGK;isBWuX9rl|llx92( z;KudqwOY*<@x+5C&$1C2w5BpoHBAmCfB{A(33u9cFv01wb90nTj-w>{qjt2nWzIZ& z@W8fLHjT45Ok+SKl?nl(B`}E1IY#?TX%uNiLI5FUnt2&M+ixv)f( z>3e~cL;0O3{R_=iEaK}y;x8xcR=+?<37jBddxtcidt z%gdm(NTdc*t_w-dwm*(+q+Km#daoMR=$$(}l%YM2v5ig9V~mAVBRy9tmb%>zL~@Oz zUu&~#?)#8Oy=I7vBS19!ipLWX135D0a>%DuCMAbMf!w)&@4@!=oAOMhSSh|e-Ep~- za`{4enX}a1Nig&zA}f?;L3#c5N$cWm7z(h=nC9Q{IGBNc@-TNfj`QK8N6)Mu{W0o# zOpxkOUw^&3yXyx&0&ITxVZC0r zuOw>#DG)9Mf^-dwSgI)|Lu`f#f%1GH!ypL5K&gOa{rp^TDMN4A@6Kj(m0T(9REB-9PStS&E~o}Ms(>q|?uS}k(tZL?mhM~dB!;74r2-1fQTs?0tul=Aux^^$6da$Qg75;4%u|N?PWX>Wf`zcrntUw z|6uQjPV>0mK35ZrZya@--``~e3=4C{9L|Lh8V$73zjOO`b*DOh<7ggWbyr}coYm+; znvfJ*x!dvumTMnREA-<;9CYvQo$c-IsE09%5&-Gyq>%i|T%Z7=rDMsmj5~%BIo9j@ zQs-R&#EB}*;mmbXh;AxVkmP3aWhH%o*z7jX0>4M0fMhTELSdlmkl4^q(>LP;7}Hud zGH9V}a8E#L5f}?RDFN>w0NCuG91!Wu>R6C1`L#zmhA#jpqSe)#hewBCuA$K`d3#=> z00|vnoX|lh%TaQY=%f{e3Xma7GY&k(7z5@op5jg_@OpvY^#*Mf3Q}RBYdy%HZf-t# z`gEl6F#+P_Y;>x1d=~-6?uy>;Y;06_b_@;B1mkY5t}ZMrjP+-+YNBs8t&(K|eVkw= z8fzo|FgG`A^sjcP^$AT#27o}I1WAuXpS;V^>qrsIS7t~`3>Ae^DD|sf{z6DG9JD*l z#)N3Fo@(^J_~P@aj71Xzo&v7rZ_vcc4yF;nwzik1>Hh-& z0RR6uMAVP~00qfOL_t)1UC&QjM-cwTKO#!N#=^y+q!K8q(kQf-(juB3(x`FTo?7*f zZIm3svH1fU5-GkxL;yDi8?Z32J?!r6%G!}>W)O41h*Ur0=GRg8Y}#DGcf_mM ziiyj4ZryV46%fgrDK~`_CRwhUzlY!Wm!KbOODoVM z_e#9nFiXr8g@?wAPi0Dg11fSV+vlE&g`%#6h?Df4Blv8rIB1^MCtUGRgz3>oQc-zFSS}NWLT#NK`NU0=7|XkGjuaEGX@7~EFP@J{G3X7 zGIQ}E+sbOf7&0%pg$}0$cv3-sCUtjp|A3H{JY(!lDo>4aK@H zN|(rr%AUhYqIHAwiI^IFva?%RSy6>0KJp*?@oTN27cX8C@XM1YzLJdXX1azufk|h| zondZ?5O&s>pO@C18MW#$1?db;qeamV?kq2paa?|po>Ek9``VyHNC^kG>bEA7i+a6& zHJPNDOARzcf6uWX4uDP-BJO<3&jDBQ#i8|JZ?1qofS(^fezm;~ zMF)t!)<$4G<4r=|$_?ndjCEs2%+tl>0zlYZsU(JD^ht5nZZDcah@5jLF-b*)zyAD# zVqVlwj~+3pB#cfS%+vZv%K~6^b+zcq8I9cQ`roVVZN)Yc`rmJSCuMxr?FtT*q6u+B zXX&IQf6zk(UufQ?K#MKsMvN;bLVI!XsNWAxi9o=QTU-CW*%=%Uq}8}MMY^@Q`OoXu zp2&QoF*rU^{@OXt!*KDAawlcE_X5-BWsXIwN2VlX=tCpGrY}_jpjNB;4W%AFc<^Rt z$C!Vxw%Zl4-chfY4>!;XknJ7t`)|Mg{rtJNwY9ai^RqL*XoMR%4y5s;mIe`s{sDwK z4t|M3!H;tn4OvVa33VM-00(?VXLfdWB$nbDK&SmIERtpkeQBDK0i^?qAMa+?`FLSr zVLTp_R=~;^%fq1>hrI8-=hMMpFgiUYovH=rI2|5Bb4HPHDbljE>}1wfSC0n+0N<{! zw^|GRI5Abkj&uw(=I;Sy2Alc(Qe2H`j()L3b#&e1bADI>T$0|!v%(0~8jo+EKUJW7db+nzfSf^sNuv`EM;eQ?HLsN)Ha0p-OMAP!hX)7!exKsdNY*ob zg%4Da2cC7iy_i)`?aOq>!xClP(b^iUOn^etRoE*=2?2LJ&7|A|963IG5F zDoI2^RFz%dZxlBW{$}?s$89cm0g6Nwkrb$oqN)KZk*c9pd1x!4(to%72YJa$(-#UV z=|jm?6zJt5E+|Pk_rdG&c*c84{BYV`kL~f;{$@P>aYfd$%r=8FjFKsjA&8NOu|^Y0wIos-qk(NW`ANz;zU`^>-UqpBI~WaS(T#Q78e6RfV7xUhvTm9UPGSwQCbnXCFRUTl?JaBm)Roy>?Bdx-}fm zfqu)2Yzcm*1xgx6F%k0$Rz?AIItx{|doY6Aw>xgkr&|g>o@)k|1qh$;VgKf zTER2QF0SiO9fYG6Q%Kt|aIZ%I%Zb!u3ws;QY|qYl zso@CV_~>}DKk<6R>VVK-vOWZ0cXt<|g!njjs~8mh zIn;y6fuFy;cQ2c*w9p{50<}q(E!(^RKzwcReP0Z2zMBYVrIb%b>gFv#T=Q&+J#kI{@!Y}I{p;rI4Ni#(0FA=rdZ9jV~QW^wC)gF295fNdzQ_7h{81BpdFq;oELCLzr+du4G zkQb=RFLIx~FGhAlAMW0{^Xtxz6(83+J|h!o?rT#Uz=*d{5kLR*7{G8ijES8)39c*K zcNhfH*>C;O>-G4GZI`B!&sh|bTq@l~fiX!bE2b?vu|~u}N?!%56)a1#+ytXZ6RUhw zFQgVlB5Q1f!KhcF6Ann*=Dbn}B{IPTs}T9U6bWZ3F%JR~u;$EqjyJI)C~*#Ao@_fW z4{=c`)|a}ZYs{mbP`mrW5q?(8N&TnwzO5w-e=7^T=A^!tj@WWc2> z7IoiGcUNdma_DjUv)jvqfhA_?$0UuenS4dgt-(Wx5cKBXw>G-TRA3o_l3sateLc^g z>vx<8pH(92f&EJ0IRJtOWQMw2dS ziO)_P9tvQh7b9H?xE6nE%5bL#rEX5$$J3KGC9u?6TpkSm9*tbE_j!TEx|JM2W%PwP zp_aQ<^*-3+!8B^TUS0~wL#`#zK$P}Mi)=_M3-jzl908e?;JLsTu|6dVK#`OtJDrT` z5BiF;chl);G#UU-V&m0!ihYk*~Fx7+Uz53`oZ>Al-fWDwlYT)Fa5*5*;Pw)DCI zr1Yik&9Xv)?wid`0MawB%oSB&S(H+u&S5e+P^tXyv**t_wNeQ+?$5oSS)7~51OhIJ zjZ8X|xoDn^binJ^Z)`=*5*mF$S>_0Mu=zDY3vF#}vC5VFDdovg|9$wtTxwqVvIqmv za?DBH-UQ-6?Z=dDAY0-Kt#a$`WLTW z{lomd{OhH!SijdhIX<>aLQ+W}AQgv|l@$l~@ZooVyx5IwrRO`40zKy=^G9Qr^sah0000I=XfZKHLVPIf?o8+5oHH|5$akw$tGjb&=JYwI zyXSJ440)MBAdw^h5C9+`0pQBYbiP;se)GbG3)>GK_%H#0itNYRw{L&<&+j1r7XU~Q zOyndX`Q-M2{L_sk1~L&O5+EO}I-z23027f2l8Hzl36d+Ru0_%Z)1OfhiXhn+6>V;A z&K~VbLIGkkD$=sp02E2FNwpc;rfo|E=qsv>f&$??VZf?}3{(Sx&(a>K2m%1okV+{K zj#=KOl~Bge*X0M2hL?}83kWjg0U$A8t+%?XCd?vCU`iM)2LQ=Q;y@0G({%dGA6C~^ zcOUQiI)T9a)c03U8{?(Xga5l(uijJl9g zp8{L2<=l2w1ZjPB4N~2T?e|;TMI?w+5%kHDcfRKe+l10kWJeNh*vS?X+lB|JA^IYadi=stQ_8ioD zms&%RBzg18FOY~KSqs+6USC_=-JLNdPKXJS2(Y136!3X;7EBKw{`UFj_wL^#Thf>! zOOfOe+%&O!?gDjFtkQ~VAn0y9; zgv6RELq8W}iy*2eJJ2?5i>@nJVZ>3sz0|d7t6EJ~ra5QZaKo@Y2&))HZxKV+0^K;9 zU43re1s&Z+NdUCSgTJA;)6Ln1((tdz^P7oCoJ=P*7yu5FVS!jBk%KooQ_vl;w!VJ& z=Fm1RCoZW}Itp&FRvtrd-PZQ0wpWj=V@Tgp1bE_u69+F}9s$Y0ge4m)I={8Gv$Lb3 zfs@1|SL#LJx1m3RK07Qc;)CO2bKbalV>X-BVI-LnTy?uVg%U^#u^MwD18xUJCr_R_ ze0|s_X)#|wjeM$vnn)@KcP*u&#*oH}@sI6^fza00*8cuJ$qI<4t*e{2^S9{GVLcROSx!STrz=gzx{S~eRbd@HH&9voCyI$vz0pNPbpUw$#0&1l+N!dzJq z1lcli`=^~;GPyFex(JPJ0#M2Jw-QkA1q-=2 zLQV&B@$KN2()P}_0nL;+Nt~ox|G340_MJn5Jv&L94jj@SH_x_x5-LTDQs(*N&2w60 zv-|+IceYzeS;2MDjZZn@o#cVs`S%aKJF32%gLfoJ<0mYoMK1HKML|(m!47?=II>dE zbY;3&ELzQut-bl*qaL(s=9s=}e(bnpQfww3gp>QYh|Zrszw^@$%~n^N+MPn14TFx@b!y5GvnPugJceeM_Cx zhZV$l=gDyJRvQ>Lv}7YfoY*+=_U*i70;v7ct=%P{Bl2FdsuHl87L!&pj;_Fo14-`f z@5OOJ5Rk0`=&hZ|A#w1*0B+p4F?%wzWiMU2^z7*`HTa_e!v&nc5jLnQ`u6aD6$BNb z!2M$Q(MUmfq{^-p6I(hCbQ89D1ZjqPF~w zAM6d0fzWs1SAYNN`+t4kyFP!Aa1D5u+((@A?saSe`V(*WW(|n95h-wIynkqlQ(t>I z)_^w8Zq8;ipK<6;UU78rw+kiSF4%D)ms(FBZhrXq(Iac3`T`XYatA#Sj-|XKW+65a zoylxaLVz~v^U&D%e*OCOd-v}z7IU9-4C&yvi0jv{KY8+`9&LOyaq-iO!({UM_3NH1 zMkGjpJol%MU%z^#u>m!;X_Vsp<4z5d9a6khvypE>#`@~o;_dw9ivtu9Xvz$b$)U*( znG{~Te}OEZ=-|bRnp7qNbaF>{U*Nsz%5uJd;HQCb9LLrcB;;oHJTA2FZX-z~uCA@- zoIxBO9_F0eFap5k%a_+y*ZvOx0RR8PXQR6S00$6BL_t)HTF-A=MG&5uefA5D^TSS@ zkgDZSDgALRg7(x3xD+IA2#FK@*ZNz(;o-K)4Tz;cQx-91vl&c+8tglxGQN zV8J{Kmy6639>!p9Fv!c&dsUgR+`sP#q1)h`TWkqO335dM zRXt_#(S@yI7-?o%MXA7hu6E9>OEX`|cnZ^3t1dZw@jG;%taSxlqD- zW%d^G$pS|Dow;@BvWx+;t4;+Uw!l>BHvwwY!kb8MdOjhNpsZAQZ6>^kFi#alfjq0s z$!1Tj&?b=nv$d0Vrd{L{7 zi$@V2H0`Dap@6{jlC(4R@9M|N=_;moO!Mwi^9n_JWt zn~Fb`^|O2u7531Q_1SF;DB&h3vJ41~$S2edjztnA?W9pbr9&YXaj-oC2$=9++qR4O zqTlaNCKJg6*7`tsJ%;?Rm7WCoxBA=D=`JTO|vxA*mOJd z#R3%e6wq6rznr?*8UtC+FpFpqsBsSu4^Ky@zd!rcbO=3{AO>AdDa8b8?KAK7$}HPk z+i(AVi$)1Gbz`8W+bocCR}OR)5sJ)#PPMkAL?1MH<&vru)kL=ak=sfbTCw{qREGS7Rt33px6g1M|Iib4p{M(2+qEYg?t*r zb)TGsr&U*OubxTNU?6WA0d|bZjux;2-cy3Mr!xb<-f(#Q*PD5qD?bDgu?WqD77oHB z(})(OI-!gq5rAPK*olFa$GP}|+=udEo*PyF)AY-`-%($1l~X#b8e14rqDLT-yHc{X zx(E(F<-+E85+a6;E+7sD{o|99f|8s~PtxK)x$)`Gj~*F&tXG>MrdzZB+l}>JFR|zp z(bfCJMh@PIf4md}F29w4r+ivD6Vy}&OHq$`)9(&<-y9!1Jshnq;Se2wWj{q3wVY!K z+-eL1hV9l@m_nF~mP(z~xC|K|Xcg#2-GG$|mhfLu82CSJXDjjZsH!g14hDa)tSYce zSt!T5wN6n^A^`ygQg)*0NKC1mL%P`-smZxiZvvYw8JMHOEbO?? zhUy~0sST?LRq7mX^QQPHbvv9sSo{(}7f6Zv zVMEXuz(YX54t?|8w;TOU?52KPYT<$8O|!lg;V5{dzdL}2!0c>QA!#a|{q+RqB=)r& zgYKp(K=cm;fPTM!^7cfo827Py2sxY!2?hK^tnhocWjosD=ytmAlg?fZW&pVU@%5)q zo{q=kGq;YWvaChRWlM2}xD=?EoMpaAwqvf(PulI)p~KwyGEBJM>y5|b!ihzTn&=zSiC{v)!S2p9RIw_SJOhYw$He|{uAkJnpAnbHHF`d{*K5H*-x>KIf>4MUWzg~+ol@9`6+(CO8co01|ozlzJ;=Bi$uzfG`=^ILhtY zw;%lY;L@c_M@L7%41rJ!#=ign0RR6)e)g~c01PBaL_t(+TuX3U)fxWJy;qX0r)A5s zB}cX#+wm)j6UR=%D-BK|l#;eE1qNp53|+Le-7u`WVbyLr-E>oCx@|j2Vg&7J2 zGQ=h1L7caZ-?FWzt+%eE`#7hI^SD)j9w9AK&-={|R!%I{_GYu07PKnPk}!QuOc#I{6_6NFu(m0TASxYw zl*}hZ0FWylU_mWE{eGt3f-Q;xh)I}D zTgG64jze{Zx(dYt^Dm))S-cc@3}O~NY%-F7f$jO^J7K%PVn84ki)|$mK)~bk)~eO< z@rnL{flvPX$HB85Zag*5Az{;eZ{Q`3W1el<nS{C6S9~W?UoYKQlj_y9RLE!)#j09#pUvJ1R{YzuPiHWchKeXNU}mX3IS3o zr8T`?ETxLYq*^ayZ0LHE5Ns1w3ClU$#7IVtHm6~louSThxon!I*jmd?BZQD5;E)Y* z@^^u-O3Nu5pGX7?q_jx)HWx%~L&5#~w}dTg&Wld5Th&bB37Z?;N`jUzSa-5$ql!k< z{s^EaZKn==8H(a`xjeyOUw8LlUv#2>a7@$P{Ub+1T{X9-Q7x5K-5CjaPd_sA?#0hD zsdTw&X!SY*U27JS$p?jEGL>3t)XRpcGat4SE6N-}2z-Q9T4X~6B2Z{v+V>K8hT|W$ zb`!_@<7+FcVmpEg5c`lQeMZ}GkbMrdx-CoGnD;0+rUnq0n%H_L`}{(P8RyQO`{bjK zS>7jBc46KjdLTCJ8;iv<>0Ph4Ga4Nq9X-<-I?xpvK7DHV!%NpSt@h@x=eD-C-EGR{ z`PHT6R5;vm^{bWs1Aec!&FNI`KTHOL{(#pP^m)~4p-@N>D1LeMgF-2Vi77M&K8i|x zhb=qY(^D>$8jVH^FB7}o_oAkkC6E9)WF!F)7#bQ{Sz0DKZqdN)*}_JL*jKnGLIM>? zfK1(B7u8s`S=;qi3F6HD^+vSUe`k~o<$j)9bC2ZE*5=VXrK$0XNgrZ$Z;TnjTaU|4>5pax!B!qa!#!|JA z_zB1k1rQ)H@yQD#03d<_{%~L4l0&rSLPQNmy^X(6`R;JHFuj*SJhK9@$H@bV#7 zv4oQ~{&&Ct^tPITk!Pw$&@PMCngnYmP292~o8l%3MRAx|g`R-LQ#j=zVlr8@6Re+r zg)T55h6NkCyW+9FBWKRO6p0P4ZEpPhXXnzHLQ^+%6HZPKy!Zb6zdyXyY-;g=?xA>C z)3k?+8zV!JP*90P!uKC0ilzF-Mp9Ml0l%xKCz#3X{rHCyfq)N)b75g|{>$4_M~}KY z<4enz7Z*R@%Wn}0C?vJQmoC;mCjeFgL5O$TWrP&QjV#L6iasqj=K&CjM$)M?O$Z`A z5KLre*dsiERRUgtfe?@+htpx2CLb~9;Uq$s2`Q3&8_biqjs(Q|J@x@W+!qJ}Buh%H z@5t2AXJ=3UWbjaIbR?870GYp@wgNjlIilj2kU;n zr&_74Zx+A!a%punna&iNO&uXaZ`3A6L-mGs_1b!|r~>GZJ$5XcNo;N=cT+oab1%Am z(R!m;s}(RdX-sqX5{9rP3a~d=m?SJpCKWk|K`9PlLj}MOjQjJ@&~P@JHFSd|49tlU z0@)F27oc0L08uP2AxW07#1hsMXU`-Obk34}HWd!~g{m79XD&-_7Qji-=_lv;#JdZ4#nmMsZARot_PAB0zSSVblXd+OcLtk3 zS(y>Qp}6Ax$KwNMfBCC7?mYM=nNB_N$oSj8eKoO_dG{Zm{q?<1wQAllG{6uJhnZGP$Zj@AODI18A?N}CqRs~d zh)ze+d7r}~KtOx4Ey#sqZt($n7_zh5!$%FR7-SO`4z3x|3@@Z@1R#k{4FXv3-zHoZ>$SW77KE3kboxl7GV`J`n zQ!^(Hef06Q_BLf`C|s#lHWRz+8yQTnX&TiUE|lton1G~mrH;S|xY5+{vE#?aB$n1TU9}u?6H4u?Y1Oue37OdJp)fx;4Kz8=|kc=dH(~36u6 zeAu5fgxL4mL~slE+I49{BuVKG#ix(`==k(pASi!*>s~P69UG0k@z$TO%-`DDO6i8V zx3_ov*yzo#7wZkf-R?}LOAZBIe)05;8{bICG%*4orqLi~Ls8l!S<)KS?r?aZzb8J} zzp${dvQg^_`9qyPP1hrluJw&vzEE;H%v(3VQEP>2S;Y!VHWMLb8Mq zh-L+~aCbPYHdH>x$uBpHBNRlBIu#~9PiS`Lr_Vh5`g7kO{`)^KDKe~X?0hkQyQbE^ zy8a*#@HLydEK7u#fq>`b7tag~L^d{39Rbe|o}L{ai(Q$2plj8G{qB+BUQNS3pI4Sh zD%ZGof1^}s-o2N&adWey!+rYX*z!tpc_j(NjP&|*xl*ZAmlV(%00cMdrGUSyw{Ies zT~%vEp(9zk4d<1eU0romrI!zgj+ym2)dx)4U2VF?higUNu^kVCjx6)=EQE>diuqds zfDIWVL@&6qf5;5$+tLe&SW%mG`WBxH<7Xr6&IA(xOb$;T8#;J)V*I>e7)K`ia=Fsd zN@8_A{rrVfm*?-yot=8Plz8jSm(D+ZYHDg^WGLctw!QkwlMffSve~@b?YMURVJ4Gz zIhA+*^qW}JU8$561?3AhU2is!NfeDaBUSp*Y)mDNUf>% zI_&rPn~kQpJ0@@k?`9K3;Qs&s0RR7lIQGB*01nhiL_t(^Txo1v*L6PkEweA=n}stJ zDGoK1xQL=;Nwy?gvL&TaWYta`w@#zRX^jR+0~Bcu)J}mQZO{Tjoxlx>qAi*>MY`B& zWVdPB)QV%Jju-8fwOJ%3?i`ZC8P5J@-hSV`{qdF=I_dp2gL(Je!MW#t=bZ1HdsuH@ zxMPl!z9C@UA+ZPJQsHfv09=%F(tGXfV@G6%oCjRmo#Q-_$iT^uf9}|k!=HV6pwXna zCl{Z2>cLNc>QE%&eeB5IGv9c1OK<#Fo;>pYg`35V>K{M<=~yZ`GqZO5=)RLD4!r!W zSH?!SX`1}6HU@V5DZ3id?Lc1cV)2CnDzU^pFoHGgcr9b%YA3p!YLpu}RU?iJ~ zefzuTYxPzz;Qi7Up13!&^2niGfBE-6I{VsNfAhEhe)!>C*RJ0?dEx*ebZUC3H!Y0s z9LneOqNq*J6pO`5B;wzei6@hS-|xYOu|1m-o2~qMm1XFTp|qwN1gq=o)uC*(00LH5MIo7ym71c|T>&)3CJ+jQREuS5n44R)Y_ifE$LYEb6s&77x#e63#S384 z?yhb{mffARv~zsd_{PQt3hhm`DK=|3d7L&Y*NHjcq+%$wZxy&Pp-W)d_Y|E;4yQyh zVF)w4_#}p!IjYbN1~sFP$~8 z5fcKDu=mWLd{Nc((c!-JV(mNs@L!a)6b&Y)a}47xmKtNDLkkPJf&SQU{Q6OhwaZuU z1_J(f-n$bMx{`5Eu}~$%D3|N1idjb0bu|FNJ5vC&y6W0kzy z$c{Qtn%Xt=uHsVXHfL8?cfD2v0Qa_tBVN~+Z4Z`D2CZLhT*L02H`sLCJ~EF%!9YM$ zRO^9Grn>DNxqr%i8=*pX|DIh>oH~9qoeIBuajGs#p^)dmzU{sc?`7b^?X}C-W}kcJ zfJObP0MCB@o7wD8p-`w+s)a)N+?$u~+?hFfV!vU4*UOxJ{r&lcby>!>nm96?`NYS@ z1Ho`0=!*&dzP?y*Iua8?x<(3xVj>n;FH|;)mF%`;e_yg*R}2Fi7{H{FE}z_NB0w=g z7#ti}oV#x)m#oHGZaT#^lN7??u&(PJZbe7_fP$(jwzEW>s$|rmotp*8SrmlbNT*}R z+V?M<46^N1**+|hT9O+)+k7VgVr=jNg8cq~EK8Q?sbhAMv2Bsa$n0YEy~}t0`LCb; z)0f|wnOl4Luio(cm}7^BUwQ4qZ=F8!{2zVK>*ddU?U`CbX-PWE@*Kx$2!+FubSgP8 z5LXmM)3kV8h{vOasTzY2VrYL~_rr%KGMVcBeIs*oGqqZa<-$OVhYpTNvU1>|(d#!B z1~UB|hqBpNskG8+u?W$@ZE3$hu#9ttu8Fl;rIJUKA#RU6hEea=;Iu%5e5(&3#jiD4w zN(>SSB?kKT{PyX`U-R%4I=_Dl)26YNhhV;9yo1 z%Piw*HYhcz-y3ZiWt+X)oEfH$oNPRzKq*b9(v;Fde%;nQHz07#tOH(~rSH6r^&|rA z`y|!@Ahz#i1tabhWWOCH5(%j#*`;^xJ|PEusB@A!IYLa332|ZT#Kft4rCTZ9X3#2znGnlNE_&JOC6EUDI2rQ~K1^PZPs9a&eqmu{C0AHqXF0x7-k6=8VHkEbU(V&qg<|7}|M^Zb5s1eV)6?^k zBumZw+S*bi98RTDQmcOZ&Wt2AcI+4sVqN|H{X0j89zS_(a&k&m)L_tuvF`J6;c!%l z37O0Q!x2PSN--e>A;d7OtF6IckalM0DFB80)A#Ij9;KAf@MfkjCP?y zM=dNNR#ofqW5-!O?g!HDU1xi@#CA-#4-Hi-RcB*uA9i(Rg_s1WBV`5HD#4NeQNyAUO0gOZcOGg>9C(exkB^G|IX~) zy>;hk<|pSbj*X2b5($in&>gPV>x9r|vstZHWm$^HqHmqQFt9ao`_5EXSD5ELgb<$h za6G4L%Ia!PQ&j+1URpM=zLHy+nwn=>q-jR0)eHuE#&>0B?oZFnE>vq3tYQQV1x$e$ zSTnI<$xYXE_Yia@)19OvxI+I(Q4avLZ7y}BYB}Q3E>%{6(EREe%O`{Fe3kR43uM(w zrM>gcg*R&TNg|*~3OK>7^-MS%(sbQ9hHV;z=edBtdnkJ-mCmfK*A|uvxqK}Vj~;zE z^O>g}-~a$1kq&zRbO3+Qd+gDP?L++@9^IYFV-w%Lb<^kL=jY};9-d{Ws%nI&(P;e2 z)th}=;z0HN`*&-)cH@H&Zrz@&RZF_AX9l*8kB^5!;rsXRg+iglg@tqH-lgD~on0&B z3k>7Suay}_R#mlDZR!#QiWmmzszw>pFcfTR9rR8c+1o(xZh#9R4n%LleV`q>YX`%M zqFA9BHZaTg1YNcgz%c;el1CJE?n--aoRx_aIRgbsbyat8pZL7KSS;3RwGaYI(3aH5 z(2idU27>ozR|qBHaNtv?_I&aaV=YPLy&MbR0RR9KAQA~gJ#4Kh5<;*^@7!G!MNw+C zvfDDb+|t-+mghliw8W+)wUmuwnPd6sseAQW_2T83u1KU%TwhzS^ljOenT&2Bnw+p#i_YQm#+}Rx#GrE#r?KJ-xbKESAI_L#YFMw?6aa9*%{epCbT@ zK~zG0tXE@*?w!pp2nu%2elu)K2%9E2z z@mQo>E_*y)QIsbqSIedKp=<`5xKt_y0zOJRv1kd0RznC;LaeS&004mMwR&5a9n-xY zFE$MKE6XQ>wnDe*VsH*pM*zGzr9ucnPMueqkG3rgAWEr85JiS&SO$jywlBRixn+N` zSgJSVR3fsvR@QYK4*Gh#{grwv8uVI>)6#0*>kCMdf)G6S#cy1_HbsbuP1@fZ{kOAc zZrr%VAk=6y6-A=N)D18Ru#71+WmzFhOQmc!T`W{uqO!PHNhUoE!`!|-+0&Coh(@CU zghGc7?%pVtckLdVx_d9+N71f`)RHK006K#>(=-fCotc@$hUNgT9pbdhmO4S-6_4xW zY!;NOwNAJIc1HpS)>uyPgGqkjOM%$PF8%|H%Z?vSA zX{Zk$+IQ^e_)Fh>_2T85d-n_;KK#IyE4NIe<@0-AKl{>aub*!;WB{^~E0)W3-7sUZ zaG_YAnOUjVq{YScB_s*g@C)Kn``tJCMt^P%W8UwQr@(qB zmJu}x@QNfxx&&V%RLYd0$TSfFx#8$H6-4w;|}B17D9*q!bcw6#HTro+5Z6m0RR8n>`xN_01bypL_t(^U0HJ+ z*L6PkcK3A8zF-{!17aZvk|wxFqy-WpX~{)VilZobuq$>YsiZ1zNh<#*56Oe$RQW08 ziky@ZDM^_!X^RU;hy;NFhQu-h%!1jc*SqCmx_f#c<`y0>J=0y?-`USS=d>he!h;>f zlUESlPlI0!INkk`2$04%;C>h^gb*SUPR`H2SJ%T44ZYkdEzFKG&h9^W)oNR37sd&t zrfKN9P6%-vJ71_s68!4(Z^p)wi}R_4xkw@&O(mo8nD*l3ZYCWzOh@k-0Ms%%975kd zd-i&_0s;ZIfZGVGg7rXfENPb6W|Rn!fIFHh-nl-1+^ARvH}no64y9H!9wr6@&as9O z21Xb{KrD+ASfgbwkZ>=Mc;13~}?3Cjx$E4P1e>#u(H-qv<0H@qkCL44eRjBusL-Ni50P?8wZ_6kt9!p6<4Ey=QVRGwMVl zVafx0jOgfjw!2I%{^2UWDE!p|-(H5v_skSwS;fwJ%& zFX&HP@+Cw7fNk3SRGsj%;(pY?z2Ly#$PB~{opvRg4n0}Rr<0+z^};t#-^|aXdxo>O zUrQzBmFs7*ge}VkB$A0xDwX{Gqx{7S&5**6>)rqO;+vNn#UFk0?!@@S^mMM%Y0b?} z)ap7yNW!Go>$RH7i}g)FG6)BG4Z2z+Vp%=Laj8^`M&xuRwY^>F_UeX?#4?W1zD*02k2YMq`< z9P5AXZ!OGaG!^T*UM?S92mh&Z+TdKmG7Ozx-zT;=$*`c*PpNFJDpxC8GHC} z?biDj9zEWxRV$qFpZ@HV-`;;5(iDWXL_#@rYOGf4#^aG|*Ot>M6=A4Ws_mBDXmrY@ zDhNRw477(p2$dm<-L^yEj5A_c)Un_#>VE*y&DGU|gM*>3h7>)>vMdHe!h(N+8lO?4@u|spzEBBk zaxA8{J0|DCwyobi-g)oZ{LY)I;1&XwPQ{x6J!w-_Z{p#5UC(=iLLOR6e8 zd0IFum1PMx>aFpK(dW-LxgecpTT!G-m*yMw<3utsIhi?gHe0VZ8ueDYt*^d+eJ8(- zgabH)xeihk2?q!Q0IXsTl$eAI$|(_?`6Vht(0d41t5tUjV$jA0RJ;&kfVgLP5yk^K z@Ff6872pE-xw=5wsD4~`g}{{$&+`e!7ykWu`YIqazCCf*bndFdrC0=7ZCy7kjCi|a zm&?bFLlQCh`HND$p|8I<*xo+4|MhcO;;mY_(<7WYj8Omy1Oou#*jhMB2^k+xz1gie zgc-U{sAD+@1Xg79?zOX$j56t1p>S|mJlx-_^g8;*OXpW_Uq9I0*Lz(6B0$C5^v7Nc z2Gn*y;es<_8jKBF;9=h%02pK6#XYEM2F&i2%zAs~CnW&)gVjN$5%n7C7#G|d!{E;K ze)su8I6CtaUeMAc8#M-clknges)BWQBNm?uvkJ=;-+3_hy%tX6NU|5t65;rxJ<8%J-L* zkfLf@Hal6ZR$jdL_F%tquzzgZTnk4=Mx$SR@%h}s0zxtf32{px89)F6EMbl)4rA^x z>QK%(oOr-M{4=C&g1CE)u6|V@!srkF@JC*O$e_~jL@S1bRd;l8E|+V!+Jjw%K#|_b z7|(NT`nTohtYk^%jJZcR#N%h?x)nl5|?do^#T%MR5{rX|vbTFY3#^Swev#plyI1~fvb$iWbtJl+8?Ureh zg)=jM_cuRYUA-EM$%Im{>_7J!C5%0bUL~aVA-~!V9T^J>5xOfFzjeliiAUy z8m(6A?%kWe_{Bfhs`V$2c1p#fX>h?DBy5i4%a_kNRPT1}kb?8C^40ROV>+C$P(7(xFJ^CUMNM^V-Gk#(fK$ev3`00=~R@f^V7F}9M z9XGnf*5~KOzkZlMzcd+AwKuzEjFDyYcFSNKbd!UyBAOft%LvKuUYYJ0761@Ow`>-V zM{nFXcT_gIof;SP+1e%(l5LV)ZmQGiq%vvCqLeuRR`sxI8kT8Uj0#l=2`-4~U@XT{ zF^AcVQX~XYfLittTOo8~^=7eDR5i7~TN!jHWkq(#fLg9J_$uCOhV4uLfTG^ziw8wO zAR)!=uI%$KfH(QkUmS!G7~z$bm142@!G|C0?(Pn*HIy$5Pz8M_hXFu{rK*whODnZz zefeDG(#7nv7v;6}!=7&3x_PGEZa-OjZCX?fDKj%80&u6*k`PH3G0p z*U53|5x~JUpus>vNJx=}b9x{GLk|731Q&gZ?e6Zv@QTOc-o~jPlm`O40EJ{(vaDWq z^30_xi|M5D@X?-W(OyqKsS z^XDc`&rJRH;mi5C@p7e+%Z-hs)l*XwkP|Cbk+F94#drapY| zyLz?ZSSDi<2nLKz<)+)+7NG<=2x&+F;|^tn0%n2&2L^u19rfGOQ2_TLr@sG=vmwUE zE*SvBy-z-VT__-TTioZ)fE4tTaY&JdOzU7Xvk&PYp!JPOkX`^_JN6JkhSB%er=NZL zYU7on$U=y73pd+(HNR8VG+C0ds!En+6TTgtUY@Xk84k!ZdGfBV9wpU*G*IZ@~el1e8sU0z|y5F=kl*M>y4vSDvba&8nt4v zNFBfumnF(5Yc+ZfwUCSe1Q$$j&KaYW5Ze;K2K?(gGoHff^St|r{z1?D`X~DD1S#wk z00nmHkrylZ5(W^7M5Nmv{$PJ^&o7)q0lgt$2>k)^u}>s)0%h0K_yQK7Uw$hO0Jde? zjuDMcIxNhERX)~j%i=;%%0@DgR6<+6a5|UE{MT3O?_8NbDpxb>a5$p=`tyGkBFQ<^LK0^p5>aPPPdGMv@b$xbt*gqR zkxVK*5i1`Z5mUy@LNN&;j2KYI5u8(pFhUq3fJ6{?e`>pnKES2DOt6@S$|Gd(@y zgTXfj6Py^rvPX8Uzy<}O4cR4&(2^)p6e<5lKIAV8NYO@FHc}FzO<-3`j0Z4aX6!k; zd-|&Dv^$4GyHRi0Gs@z?^(JS}uDADJ^^g0l<%Q+d zR?V)uu4CEtDE1_kgcwEzSVRGlGiq3{w7fp?N9vcZlzp6g{iNM)=PzZGT3MLo+BEc2 zn+X6#70V)4&@3l^DybGghUWYy`6%%Ep1R9K<2I%$_jNQo<503{Ko|q zf~_o{zj5>0-yZ(Ey?^Ms&nl7e(>HqTXvoJ?qKBd zVc#_>mghK~!#=4t01>1BDJm7Xe0lrH?kmhGqM{=S_xXAHR6DmzCcuj4kBqCB@UoTp&ev7xAgiN9_?LVL;8Co1aSx5>C9l z*FkP86y=l8UihG>?KSl=s(F}xV@F`(kK%YD>GJaGY8VEC{_vN-xZ1F5PriM5@6LyR z|HmF;T&)@l3r)sk7&4Fn=aN!-_wMf8{QRv?uGn??w&OMH#uvZ7={e&t@B!rU(V$|I zg~jH^=IWzI|Lh<2Ia0@U7^j9|h*(I;CF7h^&RF12q#+cGNjPPs=Xlkb*Jew|+a+6dIN@+=6i`i8MWH9Oj6(0-r>*|&Ax&aV9ukQ!LmD4*v zzwzPAm#@G1@BVx5Zr=Lj;}_5O&!1azJm!oij^nPb%rVXw^*1(_0Fq=M5T4g@ zod6KK-EJJRBzZ*$*mkAc>7Cs=gGBa@djJT;0F+V)Fpx2dL~u&MLPC`0HUJ24ZtL7} z_lT&_8w&a=@rHuF5@(^}QqG_qlu#EjYv!q^tN2XPScA8eiObh@i+t&O#o zRYNHV0E|Zc@p#l~ovKtSC}rnO50O^u!Z3xT%=Z~e>5UyqVZy#UYa##u*REat`r+3JvUS_$QfT%-O@FFxsBRH8l+}x65l2XEfcCi_$IkNTbMEEW z5%AKFFAe$w#Wawd2O9bc0{{R)I^#~i|H60YmX|ia{OgyNg>}1eaPV?6nJ^ke6b=su z4I9p!*;rX#^*jei)ijY1 zx!`PJVIdTL*`YuHfcMqn z_Jx&;mo5s9K9c?9H3O+0FIGkH7Oh7Wi>E3CCkUj$>~W9v$|>Fcv~A zE-pCkh*6fD#xSZT5-9{1K9z<*6A=WDV~z|6W*SA!Iu!YzO0^vz#A|>U^Uq?g@aIw#ZS?BqgM#ZHTJW5D-yt0SGAZ_~=+dfqwa1m@503KK=Bw zPoF-0>bkBUjJ|#HFp8YbjVsr${bv99_r2aIj)*fBq3^$X)2o;!Lc|$CNl`E$4bCDU zCP+EovWKGqjVW>@(gXlTW2gWRB1r_)P%yzcO{$jVxEFaIgAihntP+Y$%0Eaz#D;A% z%5sIAX&z0S>-9Qk9I|hsr(UJ1sLSH7K$13eE_+MG9f)WerjP;vYPGb2Hc=Ev3O8nT zMstgeComv;#0qmk=)ltqzG zg+QYspejHB#zYE^1UQSOLusj)OqrEEOeo1K#?D6nWCoWi5uW)9HRMB_L;Jh4}s?DQP5-0f1={8d4U=g0fWAM4Z$l7feXb1x*W+ zB;svkEdf%vb390nU~#M_jZll#eRliyg9rBuViHrQOpxKL#sO2xM1jTB>g|=#FU^$$ zm;JO(wW25lAiKM}X)WOsx7rB|D7k3)3Q>Aqe>i+|)P3eUZ|{Ba+r!s=yFSNQM0sqO zL`u0I58a;;|ZViRNiGxZqlT3;+Py z?RI)wzRN+k=egiR3H^Lr35KdMH4Xsq;>C+e{xZ9uz?ATybe1&Fd*q8aDMSF6!SYfR zqW@R{&Ut%K`~fF0pjyj{;ZJ>}g%`6JmVE8gG^^X&I|m0ZB?>}_1PKI$RNmzhB|E0> zE#+NC4thD)0y=y0Uj>s2VZZ&W+xP!`UspJgZ3mLirz}8mPXGXO29ONOvfE}f7-+Cf5xLS0os z?upiD8hr&HgtDBKjI&BIPLY{SqU``pw`h1~Q9w5P!s0^usvw(Dt9-2AK4U>JivgVbEbm;+|2481 zIHHKgosV`kV?c*v7;|@JWx3UC`fTdTnsAuxyAaHigxan4!omWc0slmjGw~$kKk1(o zC>u5Mkm>K6WY`P^xXR}$CXpp313Iw!Wa9}@P<}B$C~VookLbhit{oe3-EW!75VZdF zAFnSjLpaRGpFh@71THpM6{>5knt-Y~WVvxmhFx?6`-5x~mCXxgxQ2)ieu4AnX1gNf zO3@ZiB)TNhJ(WdCv*&HLi_4QVA(zR1uxtyG^9fdyNT~23DI-Z3RPi34EE^!fdw$6 zlII?%#vMr5X8P>Wqr-#4lv~MiQh4olx7!^IPJ>+3XK^jSZNjai=u>TT;TjMNBwRn7 z6uQ&fN!du;CssDR9^|Vfj?*hjx3}V;0ZR$ZK{*A%93C8`ycuKc5UAK23W)sO2W{H6T1FgZm;M00af-ha&o9eL%Zvp5-1G9rk($$pbf? z^TCC~i+AtNhap1bPOn!cUZUW=8b4mGpi!qDd`q(|G#a_Mpu0c+qSu*-HeYPorF$RT z3l$`4HgwvCgP#P;9zr7joS$D@jGW_SmPf)Yx5mr~!e~|+8n$KMFkPe6MAgpWyjPg0 z#r=MNgyyJv>ipI3X*06DX&h}1>BRlR^-oVuPO1v4J)-I`euwh;cD0K#nG0fyTZ68u zHxvXJM)hN|Hm>M0*C?k;AehC)#o=E=3vP8ow=qEAiTY-%>RD;!_dovd-8bLHY(*+%&pRo#bqIm&%kkHacOGigX(U{;o5<~bN%ur=fy^fE(x$1{f-MXPi zL^E<)&CGB7UjjgA0GDT9J=@#cBX1x4bPC9TQ`{$&Le%Yct1YJ}0O$;flG>7bHh3Oa z_8KMwYbB=X0jd~clQPxeR0flic1`Y>ZYlsN;l=Fk0{1agOz4vb4{mij`}_NW2##(h z6BMXtWTUd=UH~?)fc~GP{~L`4KK__aVw;(=CB|T~VwkglpE*T#W2)y`ZjNCh1|cG8 zUSrUSc6z<#mF2f@-adb^xwf|EUIn7*_MJPyoAg>aI6XZ+J_gr5bK0_gV!O8!Ud8|d zXrO`RV1UzA7w}LsBS``PC~CGw4>tldl^E97*ZY6=jSeP_ssv^?NlBlllU1OsoV9@5 zETsNrUQWb?Z0@OO`x1LHe7cxzwYj4mG<&0Bcn|O+yR?Z{uclM|Nqk;Y_tFX1hPp)K~$|>%}x|S z5U%!T83MbqOG1`~-3wv#AQDMd4`NUh4;Y_LeH9M!2%Hc-xJN}cYETRkM-R4#o~o|y zs`&x!gs?l?Q&m&dUG-IWPj?L$RL1~eJ`&r28vsIMgJuBP2)F_KtNv^Z&ImcVFK? zN|vC(K?3dMs8M7diH1E?)4 zV5U7JmQJVRo+n9?<#c&C9D*_T*6&e;{$S8<&j2vLQ3qI93jmEqLl;tohwStH^>us@ zY>GT?8*#5L0~aTs$?5eLoPK`eyG`hLM`|Rw@t$^cfuFcGRKRKal zikghcm(KA}%*53PuAxQ`2;ml?m#5F3?(FRF9mY{G+O!TG8Z|&3_KiO=CdNYUL{qP| z5D0;wriiWKBLe_t>&e#ct6jX{_XyXXzoZqE1OpRp{Enn_1IU!30G_64IvS0DPkYHY z452xl?hH1)2$q0Ps`GPEQ4&1sk=&G*oX=;KsRFcC$XL6N)iAWMXg$FFzj^EC7nd|q zDUnq`M!g!%7;^*A8aGA+r+zhQZRm78fOND-Uw$H|TqMb2Wo0GHGJ3Z%>IAd1v&(7v z>(_6$q7W)#K&2B5*dreUZ{NK27ulmI2obMw21ZXwKXZ>!-t#Rx1yq#mX;J= z?viimohljadoc}TGv^t70QvJ0F}TeWO7;KiZyu@7$72LFcJ{u5~~}S@Abw3Mu)8v9h;3oy4m#nH~}PE#f)9^ezI>&cht=DQEUi`x05%^#Dz7#e^ciV|-S+nO z#KeRFTGwQKs~44>zHeN=0pP<%5$yu)%g6+ilaqN5==b{{-oLN7hZh+D7|^t|XK6@8 zS@BpD&HkweFcekP!}v8zXXWWL1irC*3KlFR6G{FqSiqo2^Z+{%!Mq2YPx}R>T>BR$ z8}TUoNr8qKZz^aaHuK9e3B2QN__tEMcKMidAke% z=Pw%%Hu6t_LoldR{2J%lHg?8dq|hmN8ZML%udEfuv0O+u5fTxHYQQdA0ViDz3;ThWT+j%&0Xmx^MwOO6|a z2B827KmnT@*A);mMI7|2=#zp~>y^h!JlE6bSFg&~m3I5G5g}31)V8uyGr-Y+q!vjm z`eS*olL5^feXmSvzH=l%QDB|~x#1ehaRL1L z%g<)<+A#;ng1Hv`qG;sMk2_-xlt(|9NP0=mlRPzw!nez^%v*6e)f}&)sR$|P2^L}^ zdtQ8wnr=kilB+6;%o z@pyc3aS>W2oF@LdI0c6_m|YP-1c{*OQ7PPsNF^Ci{%}+`$tk1&1!c)*r9Tw5r)<0g~-PwsjXJB*lOaJ=kix=awvmADp<_1ZF!65FG=Q!3zy@I41 zfL^b6G8#dw-@upKNk4%PG&ThB-0QUsMCL4ziT7MNB~hCz(;)-;d?mRy0V!=kqXy{r z$PGVkZ$EncxW>ZyysHH<&}y}$7ucP5eoLY=PGt-*m_Q7JIsss2?SW(HjG@}?nbZt1 z5Y_cB;`r8D3VXaxucX`Uj!sT$v@NpnA4tkXmC58R%mGBPPX!o>ogmE&W^(@Kb0c`3 zCuKBnFp-UNL@Ji4LK_!pxe#F@suYkr>a~qdPK>}0w{QEf`Qh|V6{@nvF;I>2@d6}k zS@tlqfu4vBRZ*7Yb;_cp5cLM+9`n3MqTgRzP2=toSn@ofx}#;Q>EE6_eJVYpU6ueg zHm=8JFOm}8o}L2u{?@GpWI_Fgl4~QN)oe~D6K{IF0o5-6z|6@a$0q|H-&qW{+8oTm z6g7ouO}NkHY7%)RST8a|a*-#_fA3BA@7*iD`{wJz!$WTk0khdGX_k*93Q!<(KTzbd z1(7)f5T4>oA5-U;cewzY;ge--KKjd?REhOfH8S*}I@~TqlwNX{B&@^XP-{JzOx~$3 zs;B+^{bKa@QHYn#z<{^UnQIWAU&L(qp5N38LSZ8qfyk^x`D4W4Ec1C;OdXMQ!Y$aSvRCM8 zEn7___-HUlMtSLyfk30tfKU==Y(qxNx?pTvc7H_FJJx@h~3}aO{);} z$H75v76N{M_KZGVE&ym|6OMgWq{yQvawz%AsQmG(FdTJJsZ;Ecbf)l@C=v%UtGI3 zGm?M?X21noHvKb!zR4xN+_pt+6@8f%Psd}q%wWrtOUiZnfyvk4XrkI*uQQ88u9_|zBztw6frG~>xujf$u{r;cF$6;5V%tQTia^o}zgJhCbXGa;l-Pq^h(x%|>H59MbEa1CduXo6U>C z05J(|g`SI8vjQo0Oa80mR;GcK)fE5>l?uT}anjpH5yW&d`HUrK3CyEM>hHXDulOs|?pqRpaFD)RvUeXYCQ z?uXM;#H=afcek<+?IP<^4c9C$4Ugz;<2K(0o9v)gtB$Tlq(I7)@n;mQF=AR3Tkij4 zp5^7`@p$Y#ml-2dx~cW%=B5TtPEWVK`Bs^*$uCPgsY@n;jUP=LQkxO+FdNQ_2Utmk z5StOuuJHc7dmMd!$irWm3E%waudb{VHkrZu9{Q%w%md6Eh)+U{rVlLd%Osg7MFcrb zE?JP^=1)|U=bHe8K)qhSa!*Jcx)k8`o@S#l7!FBuGKG*a(!l&Xo%Y%J-^hvNq0F@X zyiR6zp41aM63D>P-v1kH-nq22{Lkdpt zp#0tWpI={Rrz{!o-6=~?MFpfH@CNW zhR+8IL$oJzX8Hv~0FX+j;EDz9)m$rMyNm1=d`u(-z<9A-0yakwAI!|etVMa!=F#vAJL80kHg)`5b z&ryd30f}OZ)GSjQChT zJO((Q!dU?C^YeZmTHoBR66Zw|d?-q4R9e|>WD0XYLD!d>(J z`ubon&>EMQS5z6M27Kl7ROC`BmCXM>Im)5!Ki}CoJUk>#tP==6;gS?Wh^2C}ST41y z6-=%hi?UspU&N-5uaN zSL`_lkQ@Iqe>O0=@KvtR4o+h?Sv!A@4*>Y=v-?k;Jh|X*FMNziB2z0CZQJHKR91zO zDu@IZB~sTU2th$2Uc~A}F`z7BiK42;U}Oa}q|C5G$ER)6^P)JUEE(U@!!JJn%h!Ls zBz777_VMHSWE_~Yhx0qkv-~20laru}tlqr)g45_PSTbHSGY!s-CuTQ4$P)dMfHj$~ z6~)zxvR2nMK3&_`EL9t#S~@y9THF0l*DJE393CESi9*ypCaY^b#~gG|_Md-e*kRv} zIz!K}gO2H2ew3t;(!~|dm-G`50G<#^>B1#5F7qZW|}9 z_cpGWtrj>tS-p3^)jqV3_Mbif_Sp|F{&!{@c5vKtPX}&D*&B@*zZ1Oukw5+9m*0Hz zkL-r^vOXA?Gk|1NE|-HKaL1=T3mKp&itD;F_~3kPK3JqX3r+uw63p1g8M~PcrpnfH zWfph#_EbeS%^`wNB)C~oK7Ox$ce}dV)ND#Ve)u~oFLmvZS2Tby2a)4PydXv_@q^&_ zq-ELmjqC51>&u4YD@)5@X~m_ntW^b4s5Q2}{QVz(^Y9BcJT7pQa0o&`Yg z7g26mwy>bcMG;I@GZ0aSgQY;vT!6gX=;H2H&+PQJ- z&d(J^NdaRqU`fJZj35LF6CedN9GL@=!!QnO^(ClPj$Zz&bM)gM|Mchm)6vV*(a;TP zoXqI!M|bc3^Xb!fqOtJJBM;QuugnmhuSuS#Ja&^_k(n&!OgG1Q!83$#E~T9Bx&aVC z2xNiVsLDUvuHIa$487FD<#N5*YWFr*mOt3rbB!~Z5YP8yfmaAl7_F7`&DEwk=+Q8s zVdMp#z~MAaFvc|SoxYJ!#v#BQ(?2`*`yKD}6)rB{`1rvmAKmR9JmokHQegQ}lBD^k zJ~^FwS;>IAdE-X6*PF*=-qOAu>x)31VgQ(%G;=+}eUb{FnU)8AQf`j&C756;-46jk z5H>VvZ=?LH-A0na=Pip@^yO;h=%<4_*LSUIh-EOt0Wyrix(8|1|2CmB-t0-W1IJXSuaGx>gc@4-nbd2$xZgqk=2LNF~RX@79b#qC& zyIp-fh(sbWmX;L77z{%i|M0rCRne|BYAr8*e{21qZ4?O_o*q|aF^ZzZ>S@mG&h_iSrp^~b}b z2cJL6UZ%D-H_h>hUWQb?UV{*Yxl+Sbh%NIEgu45D14s zBFl-D@NP>PlVG%=|nuG;ef_EB_!m*7Ql2EC2w9Jm}X2~-lx0x&PzqdSw;@QD>e1goyOIr!ru;tWu;IiFo@D5O$dwZl!Qql zNlLR`vxWnL5tRz{r6n1|FlIQ3qbN$lklMp2jG~A}fy+GShiBijAn@!V^Ihx@nN%R2 zoxc8$5kf*8C~Km?wOc39w}_;=-IkQZpFMgUm@Q*ud134XvjKiKUWk4MRDSaPU*F4W zf!;~iu3pVD?dJ^OAb z*TcRYTCQjL(Q>J9DH#@TZ3P{?2;=jnhG!4hPJ4{r=f^&-Zt> zHe$xKa*anY_FSCCA_rAfMPUR(#~pN2fB;KH`>Yc%y;#J>a-~vY&L|x9k#8pmQ=@Zh zeKih@jvY8b{Kca$U+nMa!I}h%8IkeHN=CaoJ4U~sjc3q*OGJ~Q|Hd{DG)6XOPu~0( zW18Q3CZx$*`Apa+EII#DK-Ri3W~8q0HxLqs(6L>&>jby2tc+}nQ#4*J;FJX;ldvdZn2SToqWz1kQI0Xno-wz=sY;fZA&Pe2LHP=Am4E*Tt-#();%ggnQ_~+3F z08G%oB=id>V3OIBxu&qZIM0}xi80ChZ8$bHDAz4KsbBygt2YHjiF~+O*{G>szvzJ! z5=>G6t0fKljwXwM2m(x8+W`Ow1wHg^i-Idv?Y}48U+-Lbb$k@1ursn7x~@oqsA@R& zBcg^$f{8#aGXk(#Q~>o5M|4^253SV?J|Sw6jk>EM5D+4x6UT8;N{Jx2UM{wV zj;s_aBn7+}My#fah~vtNl%}j3FrCK~5e>6Y)^)waNn!*!C>30zvv%zU^<9zYHm=_q z`5}}Q-*E}yF~l5X5MfZzRYi)!AW6Z!o$aTGuM8_3df_~LGsNN;Q=7MoC_;Duzc#QL0EX05Ijq zx`+r&Aw(>uZWN1>oTlkd0|z8Yxu`0#)avy$MTUZO)alm+AZV3_0F2?tg=9Fg^m0`o z9F0OrmTM*b<;kgDt`r185xD(>SItI+i|OF>7{eq9BT1G=Lqim$Acce=3{pO&sItbQ z5W{r2p}#siGuNAv*WHT%QanRQK%{krQuqmiW4SE5|3cd zqd&De_x5hs<`AXyr7>D5m6C+%ij1_1gh0#^k}|DO@F;EQdi(UWP*hFJtqO2(dXkQM z5MV@o#0i*S1~9;QG;(C>MWPzhm`fv3mhATN_LWWBHIMt2>4tAHMDwsNFx~Iu&zSxX z00960f@$zk000cyNklt0?-7WuxGU;wbbfXZ?)dKx9*x754E_mQE743r~$FkZCU6rcQXbs||v(>W+VwM%O zw$3guJqk0SD6^YtHodw`xh%>mMC(~kwOTt9qs^6F8ik!gZK^E_2{)2b7P zLKEr&h~3$-iPl9XszMZHQRXsFlwnbxv)%#qqPiA!o(FqJ4_Zz)v>X22)$X_9K0G-1 z9#Q>4kq{Fjyr`4h&_BziP4R-g%vJgFDPoi&&n;`h}Pkx-mLzCi( zLQ-i$j3h68*G9w$kSJ;~&Z_-xGbyTm#-D9BDhW-81t!TgDa+Cz#M7l+O!flL_B<~L z|KewVdveGH`u4e1|ZZj7CAbBc_AxoxQhdwza)u z+qM+kidtS6rK3LeLK7)%x>O4>8CW*^*?#+1FHa_Esff9mk98lKo2M6)ka>deo$Tn& zYoUVHToWzn<9r`%D4Bo$r+@6Wn&)p%2m+)v*$~P4e1B5f4j#Gx7+O`(`hS;LfiDP{GZ<)Kil8QXUV(s3tAU?HuAc=<22jtcGB5Q zD*g1s!@TBk#XW|#kSb5K?b}`i7)=EDCLvyk4X0Mx7D*wL3sM4zbZSP;dURf1pOfxG z!Ypc9Tb}jV?_Up+GB3p+g#I?r>!rMz=8X}?WKN%+Jo#ui9L_(Em)vGyU00lPb0HG| zy4(}1isDrVGrT%yM(;Pq(*U1-`V)-MPk-`>R9dQeMk%-!+lu__IB5sINhu+8*SBoH zfthvK4jQiW^7WhJx9?h>_3PgsM+~O|ez?~=?hh3*R9#=c__|Egu!~pT0`7>_NBlWH$^QhQAm7d-cp+m1|mSrR1ExZZ;<&4n}ybuMu7G90Y;qNx|p) zfFhuHU3CqMQ~t%XmF5AouB(~h|@|KfBYa0Msu%qZ3YlR zOACxQC=EhL-OOEFCC|P$@w{)-_SRN5n-PoXLh$?WcbTYKV7N5o%>70v@s+x0R`>xDez5{tYlBD6-*lDnOT2i~wYzn14 z*WqQJJB?`f!S&^v&%ZsLm3*!@=IC!O`RC7{-(K?n@OOXz>iGCRxNm#V#3Kvb381y% zU4;Rb9CT@8Z^k3%I_PG4$uh|T&D$Olj1ZtqgMrcfu2xzq)v?W4RcE!>YDSi6Kka(| z_RSjt%C@X&t@1Ljxv&gFRXMi2N+F9P4=YC5#W;Q(n%|7_onGg6rx*RSJlyG?oL!Vf zu6bDqRdA`YG#(9S@lauc0Aax=V6+^|j~d!KHywXk*KV^TFr}uCOp}EzRm@P4 zSy9{B+Wzm){^P~PFsl~{)$jXXH=$oWe06+$C;z$c@B%L=KcJ-(uqHN79zR}n@YvX1 z2*HAMt^#C$)~Vque_~FGv<3ly(K_$iG$<%pDxKG&7ILrCj12f{khOd-peQZsKiO>} zYE~KprVZCglej^+WKLYGmxHlX`nr-k%^=S5k9*-rZ+GikMWWk%`L%7)E_-Q`uNGmmzNiMp8C0* zS8viU00clW&H>cwCu^XD00J%~0P-#K<>i1Y1yYtZ-)}{X;=B?q3t3nhfG1ob)A=A| zVELfri;KRsd-&;J{Y`oLQXo)O=^94EGQK)K*=vQK#jx#5DME%44y4XhT?0swB^Xhj zB?Vz+o;jAy3_~~(1KD&8Bx@v#sue8z1;|=c~uKR2ytw?P-rwODybdErI<{GDixRpQHI^4wHvl`!~W@? zePUoJhu5w_uHsY+9@!SJD&Mh=Hcj)s?qc)tf>RO%owGlYX65VK^j8BoVdYh^mNZQ7$rTuBv1Ee5hL%?D5a6bWgW232x) zeKjbAiO`q>30oG3g3EH2G#>r{w2aSRfAR9=%ZoTG`N}cc9Ia+6%d^|)uMijvhGkja zmoz_*P2$@(w7y~P^|ESAXe~FYCzaM3md$KdbKg9TzyP2%*BYUD{T^toxl&!v4qSIK z%R7N9gzNmpOV|NomV@2LO)40=gKK~$7oS(6*dan7ph z`vA~5=RPFv^3aki$qFg78xFrY!V%IB@DGsxqU{J z-)B|%q0vBNhO-J+^aD^`=;O=Etjw&;1gR0chODH)b^-$`DuP1A)Y|0I0D#qOhEcTX z-#qC?S}}kmNmi6$ga`%(KoH^pjMAwW9$01+g^H@DXdS!ci4Ks)$L68)Q z$OwWoyPB^KT9)T|3Su0%qUm|)Az5q4xF!ox&KPH&sJB!yMOw`?J63HtwZ(85hkg?J zoo1WnRF_CU;&n)c&=C+38XYL0|M|uHnZNWu zkfXY0`uj_(ZBQ-_g7K|=v;ri&%?&OqSFJgKuZ#H<5~f-!i}H23thsIPl+ogxao*kA zD>$az>4>6OI0%c`kIHfm38lJ7mVP8+j4>90A2iHq%w$PGEN^IvDoZqrfig{14qNr} zj@7?n=3VCwA*AtRJ$P*cJZ#1BRbA93uRunb+Yy6N>Bd%o}~6$L3z z^N`__re!;Bkft(0swBu}6m0YqxQ}rvT!sm$t~1qN z6&Ko=4*UE2m0KZA(^OPsR|CNqm)n*M_}q^Xr6NKPdyOEB{3P2m)uX0qXbMnzWU5i< zkLL@k(fGDM5rF$)R7d$>G>W6x8})<54MZ-Y+1Lpt!~QBxgQX3WQoZJ8Gzh}p)1Rlk z^O3!>qg1ZdNWBfZ84HRm35G1#T)_1<1@O6e)M>QqW=F<1%M~L6=S)-OpFMl1>Bcfh ze*LRo-F@ZHKmWY?`uAx{f3^{IUFNn3HrZZiQ=UPVB+4kOt{_#vMCqqPYxgMlzF&RN zB+Ceb1OQ=#2?kzPXyj1S6iFlqfn?N1i&b3~TBdd}UR;f)KmPbZ5QagTwM+vcqNALp z=`YR?9N(WT-F;J@J8rvC(>2Xa^B#&>o@)Ym??gn?KYI4lERIL7UyNsV*VIhR+O1}= zS|&M%JjHpA2~rS90)9D|PzI^Dn6KQv9|LDKO;Z$sh{|l#|EI6M{0K>|)sPn>%Saa9}Io&HdGLkl%@BY+UvqK^P5-HF!QSZ&)F>55mX?0^joij=I7 zaa=9}c)cCLqcrD?DWZrlIXm1NOlKU>U;OaIjnXKNo}M25?rM0m@)|OEXL~Q-4O+U~ z)fFd*25uB^@~EYK)xY_HrI~eWxbzocw10A@ih{JdSuGbe-JIL@B;f$8QLpnn%VyVM zoE)8;CX4Yb$Q{r7x+vE4xnq=CUbqW{s90X zc_vHZ!VfVKgZ}r-_q$H)EeDi(N(pL- z;AR^V-x5B%w1r*2P*whL02QN%1Hl*}5Xm}V7h}vh7YUiU{(fCw_>rNilygm$gE(`- z#E`H|a9vY4LUESIX&R+jOxaPpb=qrvanXO$(si2roFNYQ5wAW{qey0W)2|Eb_3ZdQo)t_(?dQMhp^nIdMbB z9slda$JZZkB=#Rf}F-8~_fvp$;XFOv}S0n*rK~^M;Y(MA&9e+s!u0LZa4$G*l%#^J7(!4|~0usvbA=m~umrCSGDd`k>Qz zF|jWPW6RL&G|w3iJSQOv24*Pa_4Q3%m97WxqriV)lHb1Te{;2%ETh75{IlqPaLV6; z9^E-8&DR7dez94F3#Zux|lY z6*x^9H)P2P;zrHHc{=waOf$>WPutD^zPM`YisSip)39{)-E?uj-*XlV+Yf&6?5UR| zmy>y`+mkVWZ@bTjGnOZFFW`*ns&b%{WyV^%scRe=gn%(f8PipjWr@-`uoRI; zVXILy1TyoNU%Vc_9Iifk{B$%PZ%~#biQXw(c2~+5?X%B*IUEk}8-q%Pg=nSIxjLOo zGiqH@9m>!-*zn5Q%-W8xK2UMKVpSjj&@c)p#{?GvMZ9uP#zB@u$~gi!ZZ$X|z*xIx z2nZH_#5jBQ@q;(lqwmIx$7e@r9Me3H;!wrxxLI@KROGpsg~Jq|>g4ys*-1^_>+KcY!UTSRcdTu;@1{$plb=9&OeDC`C=F8imTBtR$c+>NrXmqho-O7z z(@gW6a7Gz>JDKg*&4@CFge-|wlrO@prwGF^Zy5S2&H=#El{BaCmVqwI0_Hz?@^~;D zwwnzvPP=tuvhvz0Zd;8Mi49Zr{qSbK@SRn}xF$(ozJ2%mxAPk(g56f2e@pg$kF+To zMyTK$1RxS}>nu@AcQ@MR@owW#?lKMlOmDXJS9bhU6?#-ivR)Y&fPzp&IVsdw4xB?F z|H?n20gUjYUh~Ch9z>BQivTE!6V9k!w_Xh$A>j_ zlHt&Ef6y}a+O7WF9t=k`i9R{r(?x6tu`VJ6FkZQqp?P7{tQ$Ou8AFk83$i9=K@zyk zY}sKvaR=YNw=b{VIK5Zed=UK)bgl(GMdh~cR-~5$h_cBKKs(bPRaBkrfQ=51c2I^= z=0FvC&H+G_BtZ~TN*M>ndBOn$AiTExisii=4~DMaxPc%Dnk1fgtSF9xl-{`E-~RIH ztKm3|T1DWP7g^KLqq1^n)2u0Wn7u^Yx_t1Cg)w)8JAuKsXkkL;bTuDj4zvA#R;s~_;L zh=$530Qf%u00960xrfw?000U$Nkl{e~9 z2}@(fC_$@aIj$QqKJ<6a*Cq5Em05x+`V(hahyy5kmrjau@C|PL}3`_;Zh5Q>+$2q zyOviLz;_uTDA}x9^#?=IO;H75scY+Q4iZ8EFq0o(I7c0ti7wR5CguBwH(zG<~#ZV#rupmd{JZj=m0=vn)0w{D}Rx5}0vXq9X)NjEIj zw(XjZeV=VsZ2^L2AFA#)?4#4RW!uAu@04gDND%p_&hXpA!AXA}J9!m-{2=;QN+P$I zEpZgirp@INRuyZU|1AK%eD`ZG)l%73Y0c7s zr&Y^HkVcI8Noo-B_g4q1QHoODtX6z)`sRJ__RSreLJ;^<)SljKgu>f@?;Q6gAMm5P zYQQ4{DnT(%uvGDvTEM~>A9CI&l55ZmaRdN(_wG2O5jl!MR^Hy{pJ(AI3+0RF`=!oj z?<96Y0f?X|iVy+`3Ly%I>zFY0r|!h1ES~z_es}co^;UZ{ zJ{flY`KI^sWaRoY^4WX(^n5Xf?*|4vYZ?k-tJ%zALaa60$O0hqYZC8gR(`UWT4tUl z^aa3KyS>0gOVc~~r_pHoe!wAf7RsZnAZGLRkT2B-09{k+Aw` z=})|!R+BO2`o5R&Hz%hA#Pzb#9eZ_C({;l%jH9C?-x-um!!mSAsR7C5a6}@{3*$|b z64SJ-k{2gFi#O`{w^yAXPlki>+=Hqsp}&@Pu0p>^90ozr36pgx3jx5Ko-o$~a+}W| zzkK%Y_*h06C7bBer%!ixci*3#WrLhzTqO6vD5Ecg0Pun!zbY6PDj`T_x-lWMkwR7p z80TZpzq@m7;`t@hOc)#akry)!1q!aI%GmQ;)yn;5$u!J^cDHFNeV=tMhbTBx^tz!2 z{?yPkP1OLwfRqH2l4)3W<@vkLPOH9IHE!G}fBoX^e~$*e(Sq7_1(kmYeOx*H;)^d% zPES`UXrZ7QMMS)|wK?eb=fNIw0TlTb=x1`Gd6zD7M~X~oS=zHL1pzaEi`;EO@;eeB zGLunRS5;-Umk^~0v;H}o6BQN9+`YDOK6J)@P&Ex**A+xS&{Q=FgE(O<71t{|Xy(Uv zcYDrcQx$H^6orOS^6>VJ)AN21hg-JQxfooxwSLHJ%_irmL3xV)o9<-)beJfWcIUhZ zP``wJhWjU$T{wMHW`bXYE0<>?3LI2jp7Vk~tHl1>C=;_{`cPkTKoLCuGewFmt=|2M<~`be^Vh6wTMh3!9Q~idG>G! z0DDiKbh_Pqc(V{qTVkHMtwIPm?{>2oRPyt&lyeZOLbEQ3AaDT)NXe`rhH+x3O2U{Q zC6=ayadJ8J6as0=9^Kfw@PbefyJYH=BypVh)3@Erm@y4F6Y%M0pMqh%?e-t;Y*|YB z>~|l%>9k+<;_nZ;-BIx1!GmJS+ycal_`NxJvzB%s*ZG&E0#fydtE(y26;dFZt&iM$ z^4SmHe~-Bg>-oM(P*CPhn)A<-y}jq(y_gG02*@3cvf>nix~fnF zN{|p#2ogjkn=(R@QK6|R+s#I2F!bXD1XOI(Q0R?%#g7w(l6U=4vtkpGs)U%98H7>Q zR0BaxL)8U){LxN(Fg&{)fA@B9;Rc!0)f!M%&|fB{b+@dX|0)42Ovq%zp7Gd887qcE zVH62zj8tS)=*+9zQqAC9yu<<8=jRJ)@)rJ^M~^NB11Pk%+zg(PUMd7Zqy)3oPK=AG zA21ZS&@a-mH+*!D#>V^2OnxJ@n%w zy>sV|BQ3L*xn-%p%_i@b$Va|wMIg9zX?+hYdqot8r|ArRvY2$qJ3eax#oj0Kb_!zg zhgc^e=~Z!XaZ!{d1n_*jF`7LB7YLAYE@lp1BISY$jtD9x0C2t482iCitKs^=Mx!>3 z;+xHypYmHbcLea;*J|4h-SNDa@0}^F{d@m-IE}K$s7d>7%#m7aRsMe~uorG9%sBu6 zVCZ^bj$SW-c_z)o=#g;yL&l|;@HrzWDH!Eb|davGJ zPL#%9|8sD7);CM#A^`4qvHAlnSNw%bMb9UF?%umMa-8`;l2D4fmeAkY+VVUvr*XiR zLU3srjC2Y)WXtO{3a|h~?$~QrD&w(RyZ{GanPaas22I7n?ea?sX{VZbxdbuiAB7N0 zqo%4T1Qh}brG=YC-fa*?CHJqDE4I}gPA;eM$zXcvhK?79$r|JSTJ)Fd>HT~6c$yw( z%1|yJLI_`Rwq2X~S_+ayq<}oI0RWV~rK8XTK&r?~1_nZ?Sh?k@=M&QRl2B1%u#^h` z!8xV`K>;ro2^YWJ`|QV;FG}m6{q2ll13~d+zi`(OV|Npvq7Fz%S1qw+-K~$t& zO>Y}F5PjsX6j^pGrIr<|fCD6#s0X7+fuLx6liX|2|JvLN9ot@0pgH@HLlZlIS}T!Y ztwi=faX9>xixP&R<&s14aprNBOD@G}OA_M?r~a-B+(Uph0)8$UIY0dDH|%EL+(Q{( z`_9`>9pDJcu7(He5}F{B#xJTxEu|1RXxCDpt|WlFMy=MHyNyyxZ|pbH0}Y7BPXNQy z)0>-{r20GZ@o7C)tR%lDFM|%)t#6B1o}KIit+nnP9GJ^3n{3#EZI#hbz|&{XG(Y8# z84G{%GPplEKaZ-Nup6Fht8}wftGn%D)%>$;-v7P&YrcB-@$SwCK0w%aZGIB^#JB#2SUT#S)$c*s6L#A+snE$IdTw(g3xUu)o-7cc&J^M+>+ z7GTM`ZZ?}o{r-GD*X&GH0NumG+fScVbi8m~*XC2;Gynvy6#NHf*z+*SdXnwe(T^N1 z?ti5Iftx^XWeUThvM1{x+;2(t{LYOQ5eDL^UJ>-WvBJmsHCYsT1S(?IL_+?{Vg z?!Q4lKG4yi-|cqGqXqX&=se6^`dmCRa3t^MdNi3niT+@4Qb3=3OVv>&+~PyKLSj0Z zTwPtkQaOP4A3m5Jmpdq}c=lS@jTydU>fQ$!CntDDU(=x=`Bx!jDyNvh1;}Ng(v#|+ z9w&ywx~`=Z&1S<>=2&aB+|8{@wl$2@+^fu)`E)KIfV0QL>+5SSmw13$sQi}sB+s6E zwR;b&*y}K*HBlV*cASWaL*haa;aj*>;A`rDD(C zfD9y8Qh)_VpQ*efABtCOvM3-uLLb7}fCi+LW}h0#A|))X$M)3OTN*Q8;ZWH*>F9zQSpJUQc#{FVmz z?4Swj^%_36Os7+aAW+pc0^Rq|hE7_N8=tXD5q$C>c8%f~3R|VV9E}R?q#%IVY_|I? z!dtMk!&xYXn`be9Z~uH7*Dyx^hwr`*B*>g}J|5C`NfYzSY^JrIOePBGKl)c8fBpTp zkjKoK@>%n-K{M)Cc8bkhjz%N1h@Q{~?>S3KG|R?i2JPn-0AIp=LUI7evW-9X(p?!n z745aEWJr=vAW8$`tX(%THybp8LFhTNax7+Q24LBDo`+o8K{0V&-;^N|K{<(;lc{s}lV&hU=FBaXfWJsnR zoSgJ}J-Up+CG@MR%GnBK%+Ym%n(p0o;;iL)qQT(L72GJkO8P(8ty#BuD7zaN5JAt| zNfbxYNCGn82BB0N=iRxpx(b06GsI6g<&#-dy+>00960{JY+q000DGNklH;mm8e~@+T`pGGH_s2@e%`S13ZS)edo{n9{L{3aH7_ z7F&=}8~?Xx;Df=FKi|EZ?pVXDQYpTrDt4j?`}v@vrJEg5bPf#~wU`NB?CkiP{=Y4szZLNHN`1Fj9)eCh%kc}A1k{RP{W)=Ul=~bAd#kF~-+?PKg zmptnA`ZZe_nl{n|Rvte-9uC1w9Z~>b4VdH!=@6%(w z#{u1LPlVSrBes9NnJ(x ze>gfa&myMLtFN}x)9*Xap9cwYCW5GegDQiqr*H-7KBV1l(+S@6c)#BtsZ)6&D#OVT zGkpx^z%8B35GaZX#1O6TUS>TDXA=nzAi?d=OVwv;I?A5 z?Z15s;ID%N+@y|U6agp#*Zpe!m%!ykxqoG%=T+yv1F}w|=5zzJ{K+MQLb=54Il5{h zrm?R4DKy0Gf{UH)?d`+ELlMgd!`u*}kiEU#_XqFI_r_R!qam{|b-i5^3o)Fub6lC4 zlF?6*WwY7T>rDJ3tyZfXf8B)8pTo=D-H#_H{{9o&@q}nIzQu=AnomBSlu`W22%{;m zn|Jk|(j2__+5JX2F&SY?7u@Hvjw0Rnz~iQI=yZA(W6;uOC-2o<{ml$ zH6=mY0>IKELV3bkbwH!h08o+p0BUfKMhBc4DDEd%>BBEBF93|cjJY$}6EqW^8WI}S z@%q)PM6BLlDJT&uW zv5^0XUayOY@(%*zjx5g~ElfD~7Z(>3G;r<%_z$6=53tVI+;{*0002ovPDHLkV1iX9 B2uA<_ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/108.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/108.png new file mode 100644 index 0000000000000000000000000000000000000000..61791f524d58809d407ee9fc241712c289eb34f1 GIT binary patch literal 17576 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 P00000NkvXXu0mjf<(^!B literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/109.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/109.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae572d78399b955bc125d22df1530f54c674749 GIT binary patch literal 17039 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 Q#sB~S07*qoM6N<$f|A-!S^xk5 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/110.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/110.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6317127c82d5b30a15e690c92258061cdc9c48 GIT binary patch literal 19802 zcmV)oK%BpcP)SzyzJebojEgecIJ}H z4q*@gNGg<|0)SEo5_xD^Gxw_M#LZ{3Ft4iNEmZT${s@wSz;qmp_}(tHqVjJmq@M4e z*qxOo*h%gUdr(WC!ipjJl4caA*Vo^^ecRs{G+>@{j3}@auL=?p*GGu0T3*`#4GjVb z?gIB7l<_$24%HGAmPj|D>@92hrjt;KT5N@tU%A#SfQ7leMj<4}rLG`ayFpM872`uUTJTk7^JC;`QEZk|Z?@uOakyc6Ky4!v`Ov zw_Xtg6HgvLX=qG?J0q;=coP&tl3Ei210rUg$zf?69vn6x9>8}zK2sn<BXgx|T9K)6zRbSsf=C)|JA^3&v3L zW}WI7F>H9_*3FJ{s!^a20-(x?@pv3w^tD<%2oRIWq=QKl;S|gkpEmk7`D{4bys-!r zAqFzhY<`e*AjoCOg0y#$e)L{N=~5!_SeI@wHC*R+Sda^O?RcP9bo+kPhdTJi%^Ssu+43TzIryrlIkB{~w0Ql!U+)*@5YwY+QDrhR z3?$G9ITAR+kxov1eVUGRf)Urg`jSgRCx1TvD{@ZgenP}M#+8ogQZAGpZb^*iVMFzk zhuu=pQK7)FGR-K?WMcaUn>VeS`QH6|4<9^iYGUJkN9XjF2aU>jxTOPp?#Q5wOUOOitu~u#!RO6S0nb(=NC@2jf zz4z@bw*JitVVlFMndn8_BJQ$mQzw~4v%EqFo9A+GQOwj$LvKN#mvE^DOT!&NKzL?+ zW^ZpVZu0MnCu_o zVmlafZKu;24u^R>^L5Btcqsv^0Wh3n%yyDQsHlw8z&jC)vKmM(^xogSd-w4_zlg}j z4wM>BM#T((OXf15WSOb-o*@mp@&CYDLB!52|H&Yd$=Blezob=-dRXikByCu>fHgz=7B0dxv;<9 zH$^t{$(uKCS8v_idinAQ33n&~s^b)S*YvSgbS6Gg3ZfJYSq)p;H;;~vK*q0CC6jjUh|HcY zq|EZ9SrEaIqgA5hEv zWVcd14eMDs-#HUDHa6@F0hQE)=3~m}s%@LqryUprgx$TpgM$N+L-7zkRg7#roOzte zq3oTJMkwu;=zz#MDUN}Gs9OLqoI_*^63;mX#qN{yEFb{PcRsuGu2t@eh$J^)c&-G-NSQtdT)z$H20_U_m(%Jbr z2%qiWdG*~ZA_8Nr-ye-e%~q={%c$J%-M1UFoignt zAPDdV{aUjoo8|yBm({2e5MR$JgE$Hy5L1|zVt*!x)A>j%kK`YY$Wd&QvA7eqMw>OE z7=yt8s(m$UREkMOVu>h&m;l_kapUCVL}4Nj!_oE4>xYMjX^fdSQeBZewTjK8Co{(| z>1vB#5JV6q2Bj{e$BBSC zydfC_qYZ!2EOvHw27`gc1c9r4ggqo>G$~>=Gv~1gGF@V|TAj6Xa>uGPtwbekLs67f zRho;h4ye5a5TR(eqVSGz>(;Ho*MnI72$)X7Y*vQAA+U6_(HE;SJEd?Y-^LzB)MisJ zHUILWX2|FRvBTK@_@i&1KhJDyrEM+G*gObmRM02n9M+$*+?9pWY4+SoyHL|14it#f z9Q5520Q>vzO>XnK7M;SnvN#ra9j>Yv+<-X19w)s!;6cAzHmar0m!sz8cfX$g9!t` zdVl?g*KaszZ^Z!6YA^lv_rLr6AD`dczWMycb6IMhlAi&9g90KbakMKS+n)_*;RaE& z*_=!#nw0=@OT2b%?cKX~l8R&&njLN$wPhfE^M`}lr7@~5FQAw*D=RA(!wd3Mv>NSh zbA5ezfB)CT`28naKU*&7H#?tx|N7hRa(g@}FWt5A=wb<%qe%F^u}Q3{{jF2|NjxIF?Ij|40uUIK~!v9ON%7gbw2kIH=dbQ znf1)-R=>NEr{(EUdt_`hmKu-8LW==C5Hi{s!)yeSEE|IjGR6yoG2R$0Y_vD{2N(?U z!Z6^SjYo_;(^ji{s;aBAtMVBc&wJxOyok6FQ9Vjxkwj%gMxJ}lcfapD_m*87+U74p zuRnPGXCM5m8vu+h%@7@HL>4?RNB>iF@KvdN8K#LtwbAWli!cg8CkWYR!CLIT&<1AXtvs{;{4?*OYm?s!1HzPy2f+Re7#|WqDnnKn=?wbeCP3WHs`7F z%zRZ|%=1OeOQE3e?I5^w$J$&qf9v^-mzpQF%C(+alQ9&xT=Bu@-#C4Kx>~Q=aM^F^ z&}?!znZB4}jI`2i*%3sM71vEv&(F`B`?gpN=;-JuNs=aEn^#i_uf9-w^p{|?Znhmo zn~d*#<(;QbpCN(>!LCPlcY<3tw!ic4Ti^eqZ-4Xcw>=>}Z&(S5DRCG(Uu2~sBFl_1 zi}`FTUb=7Z-(QxTx zcaOgId%yYc%`X{|B3VflJUQnfUc011l?1JESOY%Z0-B7D`iK@{6+Oo`MH;SnniVf(uUC9=Q>uyi`GEMbFVbrCg4aqCf2dD?Y z2D84v+Eq602wH*K_Kcc000##LS(;ik(7+BN2(=?;N4L`!t(d?-DcRZaZ(ZB^tM7f| zPrv(}z43?_C2|k|8u~sXTOa)I$9HayF~LH}DD;ieaVkEuJN)R$*@B~+laWw{xr_$e zi^9Rtp-5MZAkM4ha>*DS1|AL$B#%p85sVDR`6i#AWjmu_|0u}0EJ|ghZei#4t=q$B zxSFpl=0M}>^rbAaE&@WA%nY#V#~3gms!MAR?4SC1TMvLkn(XX%9C62yuU@^nNfNsd z0ba4IvNU_^ciuWXeXeV^iaXe8$?BysXnV#8Tt@eIgRg%1weP+6^+#{L0Vpi$O^GT)^D5GT0? zt)$L{BP-4vvWioOQOBX{S;ja_ZbU{K&Q&E;?V~Mc^VNLW;7?s2t-R`Kt9I^%Hexlv zNPP()S_RO_(vAz&EQ{2>V2AYX{lC#R;pLrbV@3^MH*)Lmi# z41|Gm^=RSGG+YXLZdw~+ zZIDgg?m=EDBAeHJQD#izU0foarn|B4(|fnZfBF4y{P7Ro1C=|5s%%XRra~;HbAm90 z2NZLu5RobN_g3@y128LTm6`cJ|4V`3@sWaLKu95x+N?f%Wd&U){QRU5*=V z9zJ|Hold*>XuAQ;YR{Uo+f8;g-!%j~q+^^IuHU$>wXQ_f!4a|#g1cHn)@tmYqj%I7 z8r?XfHc6U?_dIg%*7#rk@z1{a=ppDrn;}vasVXe1B&kL_13&PgN~C{7(vYYG()n_| zaUC|Ayms-6|MHMvAe_B>7qdm==v9*M?Fwf#S}aYkxKZ7!J31SsHBu-#8m7JG)rzj>qZjG|RcqFr#F-P6@$6$Y6BnZ|zlOs@X_6TNm?~3y!qh8tn_@ zVk2kkBHyf{DEjsLuO(@*T*Y}=0icRkh#&%}l1AG$hBb3Oz32!5fa|$ZDqeCh29(*` z+uOvOOZ$9PZ}U&vG;Ic>DGOr^K`ucE9UmX}=q5&_H!arz#JwE10kxyi=b7!hu02_o zFv5s=^k@=&I7zT>8=X(^vA~&Oul{h-Q_vZTIBu`_JE$8QFEbzBOM^th?UyS#! zJU@PVI0`TzZ);Z=nw5Ms-Z8plj+3T^sWfH;VO00EdOqE!sS5%GN~-3MT7!XPlXPB7 z>vw(Hm(=!u5Ll5+kV_Es7N6oCe{X}{K26I+8;i6j)2!LlN#wQ%R5w2f+S?88-P!r) zpZqld1JIxqs0c)ADv4azC@o2dy-<{ew|`&6t7QHXVODUiwH9p0bG2k zdmc7~l%+6INKrk1F-7SVc*-czS~E&`StxB3kWI#=0x1eGKrpP=n{B3l{?U{3i&-@A zH)#n5s!D0DutyDm)VecgepU4C`Np{JFsJ@7?mp1J!z=b`eF;Gh>Dg($tZpX&bon7n z@91k`ggTzkS@2ymB#PMWo1=gIr$2YXT>u3TzsD4Ei0@_guOhDLn@eq z0*}Z_5`>so9mnYK%C+f=$MciH&Ox%8Ye0d=Fh+T$w+Ehs(ZFTT&*r75{_}sH27z1e zEgwc+$S_AC=h@C^uv#ZCE|xpnksl7SEDHlyDTNR=U<_Blur{FkoV{a2y@W#++1uE) z{*1B9DH;w^n`Ty3nD%_Fgc<3vAZYkv^F^(O>(^A>cWz3l`IHSbSYx@xuKM!d{^D=# zY@>hp(R*=#kHs`+}jvfTmkG6S{8UOJ3?0m8pZSCKn1V4NJk~(y-d&MY$9gjIqC51M4 zJl?*zScuBRNvZ){&lgp7eKMZT*IUD&s-%#T5^MnJq5_Agwi#&vFfOCH zaCc)T+t%T%gI1}}#G@2O;zPfoW z`jhYe4L}Au0l|S%pa6~rt)Y@2HD(T^sn~3E5^t0*i5F}hJHfClvU!|Gw;vHyq2l@W z)%#n!SACx-p2SH(Wf}~}aausRIzF8q9_;vA2ggr7zV_hJ`sH!xds&hWU7DBjqsPA- zPi}0Mvz^_8RVI~^TFJE#LrZmT`AAfl(AVS0{s?{^Up4X8;m5 zGZ<_GrGPOQ1QmebJTIw~=hLL*+;M${S*VvD!&(%}O+FY7$|6}`JmcE9ZdGJ2vn*Cd zQ%cH$8-S}L@0X_+p6l$~`oi?-hr`gHKKqz}Mp8^?>x*R^#|d-UXD4ArB5(VM^Gfja zU~(-_)|?AMNKsY*1|f_ImQpD&B^S_b_ifZrD>i!>YOBGRD2zl=cA0K0-E8C8l2khe z{|^8F|Nq7^u*3iW4&O;cK~!X1NsnCDbw2mrci&vErmpId?4~%0lqkxwYzIaJ1TY)| zMu0ey1=v7f#DS7svdA`@AdCEh?6S$$$Tm@&VI#{*Vu_|nnHo5==kBU{Rj=Os?wCc5 zO*T;7^{NZ?&}aI-^PO{>EdE!-a><({g@#6>S(e2VpI?@qCmA<)$C)|Ylt^HNg1~(L z2XB4v4}T0W1So+JAOye#P#^^qIdEYh&{^3Vgtfo}N^KeEd1;$8NejcISy`n;VtbB8 zx+qJjgtj)2NI4e-<1|T!abXamq#CE?;lVz^$hORJl4S+M7%KomutANuV2HXB8BZTS zZg^&vWo218reRT1mW)e0@3cJN?U;BC{7T?c4Jf9+iAw~Eb}a^ zxKvsfd1VA!TIGU^-pLUnm?qxrzDVX(*-I zKMJJ+JfZy5!3b#~Dl|pVne~^VcnYv*tbg|PxsT3t5KE??wz9MEpWk2+<=UWh{*qn- zmI<2w$A`aI8gDM{J#DpT!|PVv{)2B_ZmwW}A>=ubIsgXHpiV$a$V-sCU2_;}%H}mC zD?}X$0J;LF-B?+x6p07Vad1u}gG=e*j7QHjFZU06r=hNj>f|&w43ZBIvb^FNX~UqN z6SRYR!{=IizEf{?wAHx3mmumgq3X@{Fzn|AkE79(-4oBYY_GQ7ZMNHOtrP$N%Lyo( znl{3)jJkR;r~wT@t+w2tU4QNR%snqzd~SCQi@t0YrUVRhMv0phH#9k+H&4J9yTSSA zP8a_c?ePp=5WvbxbA8qR=YRNXN(rzEH~^$z)Bu7h6e|rCkCPm0UiF`qLJ`vjXC+G_ zTI&=*rIJMvn<^s&FvgV9B8hAhe8<4LP?`+XrekWNt2h(H079^Bn~aM*XMt-aX@M~P z>Z`A9iaLRD(vK*mM@L61J~rKYnP(b6fsto<#duk9DWy`{AjBXT6fG1xQ|Ol#bE>LZ zM$CS%zcA4Y#2sF`oZA@yF91Q$^XCi;1<>^%&>FN_j7gUZ+!X!g>{P-e_O;ep^D6tj z8#_*S2Z*7D8Y~Mi0ht0j1&$%AKvTt}Q)?>A2RrEZlT6x)@=51LNgAUJ0RT7G6K;7y zC!jQmGS8%YPYywH(AxHbdd=HEO&{z#scmi_&GgwQO|wML7Bk5l7l zxPI;0mtTAda{zcbA!fnNI7gF4Z04SYC_SGu%wimtE7v4lx}6Rnc>Tufe$DrM&+|RM z=11dkqf!6$XP>?C#tqkX|NJN4d-c*9D+tM>N?`<`5Oqw11n(UlRGQQRU+|pM08>*+ z;np{JnHEK%B$qt3OY9I@*&kUT?lc2nmPTm)(0YMB3rq*sw!VMsmgm~dW`j~1 z4njaEEArKDcQ6cn-?uDt9LGUDI66M@Yu@Dx8yEy4nn|RzCWc|6N-3I;dTz5_#+6|p zrW{+x3Ib0L%28}#9PT~!T3y3m<6O9qR%Ix1k(TKwj;T|#gAP|R&9c=-Crd&Qj9PA) z#g6B5p%6k@8e5i&6xY~BcKzt&m}Ma*hFA0BWPJYIdY)B|>o(eJC#RlkPlspN1&-2Qnv@QGi_;`JNt-aD7gkiJUjK<@7y$%4b(`H znORl=jsV;Q;Xry|)^&LN#77zzlxl?dH_jm|5#&dz(a1^^4vv{3w(DZ8StYw07e`@_5@jgPMU9$H z6c<|SI7zW#vZ~~q@9ph%*0%)btyU|`bK7>`xcO$1#HQsGg7rp&Fbuzb_+UQoo%jGF zEVTdt$FYm7m{`g*&8bEWFxQ;XylkLlod-=aKu`4_0F7o?paBrLuA681#PnNRoA18+ z!-+F&+XAg`zIpTWd!H+<9M`D@{)7uXe)1$v;y6o%6rNB1=7V z4MKQhk@!2OI*Xy3+n$+>qG(!mOymI4k ze|K~1ylonw6*6q4wCj0*i3>O!hK51A-L*I#H)=u9sK5Phv85P`Qb1A z{p93CN;!%5ZfEs*`fL*ZRaGtVat#ahVo6M0>S>KLNimOm1OPhEG61x;wt8}W^6q;- ze1YVCdH>6e%?+g$APB?ZZ|~l_apSe$-M?Qk)(;1S;tSi2EItDG_H+rJNRS4wJ_u!C zEX{`Nqq3+h$2I|hK~ly5;ViHI{-6Hs{rCRJY;@LC|G(}%e(T27(P+$ww_?-7)6p>B zb88LG$A;yMqs(@#A}>z&pZKmJgbW7>{LV$&c6N84U%Gs$(P-@N?{k8ZacolaVE-_v z)$ZTF|MpwoTw7fOt-~<<zt?VDZ!{WZSv=p}{naP`g9-lm&;JGRbh{R5SZUg?UbzZz1Rw!0Pz!hg zHii-q)N~pVgro-BG^0#VkjQYs3UUE|^_M?Bl`9YK{O6JHUtDhu2Loc;QW=!svSi2r zou3lLXnmWF4ovEJxEN5xDy}i5loE`oK^WsnoRwK|8paAhXkAv!c1_#yk59*S-x@`! z(i$5WD{2_z;iCsiDnRJyB0 zRPVg=`;P7GK70P?!K0JolXzPY!%KMaSn&H+q{FKo9z__IF-PypWrIDvEw1cL^s zBqSp#c*T@SNnQ$P^DW0zfDKf?QlR>NFRJ>F0u#alD_(|aQ48Eos}{ux*U(tI$nzoN zP?f1)Z(G4;lIz>I@3fmfF=!Nxv%I?c%GSwI@2e+=?YjT;pg)MxW~+t(DXpc{jrMw3 zrW$mT6gA&&v{p}healzf%&ta{sce) z_y7^8N=bz~Yy<9o`7BQJnrrWDw7+EYqg?(<#CvQAG=!$HUy z-`v=2wORKe~74u45aUYyMCF^!orV zfDMp(ga{F=%Bo1Q%(3Fs0LEqDm`Rck;+$YiZQEPD zN_eEJEY7PWD?o!~pd`t)RJ$jmU}aO4<185iem&@Ywd8DD5Vin zy)eNTF(%Tq^lN?;#d<2dDMSp6FxFCVA%r3ZshF5V$n9bKFYUmlEc|l`mZg@e`%d`B! z*AMo0_dfpUSL>S_re(RVv$wZ@{k7}OX0z35CP|W|(akq5y!R(R0AK(FAO?`26bJwt zYpE=oBHG5aD-5q9nVXo)oC#J!nJZZ_O&p7`qAH52*B`%fZZ&~sdt)a{B4ANJMc}R* zVmwNjYZ6Kg4VWN^lX0t28-!z})Ya|Pa2QubzIQUDlx}nz<2cn)9h`)%X3fBubD^}R zCW(`Rb3Xk$HDHVt=Ta-JL2!Wpm{Q9kbCzaBR&+bvJ{Jj zKmGM*Tj#b2A)nv9C#8fJtiL?N0RTY%4*&rF|A-e;YOQoSgmhM@N8)<+4cqlk%w3l^0R!VEBN}(E;ZZ2=UaoTwXDghKw z3g&*A+bQO+`oxbC}oA>O=o^y{z<}pfZrr$$B|VF~`0?X&W84Vwd`~Jlvj>y%$yq%>N`V*9pL((r^xu8&-P4oP zR;zV&{py`Nca9E^E|h47gW=1Ud%I7be)+|hU;XYY&v#c>Du4OO+W;0o55OQ)sfvu@ zgf8W2nnojOuUfj7W&&9Y4J{QR+#T-yo_S4O+X_$qXfy)q!`>JX+v~RvcOL%VA0DkX zz2P7PAceR2`03tijoO?IMsa(oPK=Tg(3!>enmW zY8G{Erv`xe$=6CIoXBBWYqZ*21W}G&#b$uxIJUEYH(4oprndOp~B9(!#>x6L<5!|LgN<64jhT|2wJ+vo#8WFTeO=_DwHe?oDit zl=}LO>!7584k-xutDrr|d&+XM?l+cgJ61&w_Vn^SBcdoX#B{;nsCQyB6ULE6{%G9o zgV^&`j9RTMH+m`Tp9Gm~31t;h*($xnOaHpl@a*v@?gvqG^-2*9*V;?RgXG$p_q@{! z#_4ja)@s(D{?F5)swgRQZ8+v=Ox1UbLRc0PQW9e*=U`B4O$gCw2(t)5gNhK+XtmzH zcI}Nf-XerN`ufp3_wMz&UDvGy!(p@8JUTl1?Qb6phXWwQ^D9}NlZzR*d3|MGEm&B5 zp~|?(qW(eXzq+QTg&2UZAMHN=m2|S`caH7aP&md8%eXvxm{i|# zG0gjizHf1+38S9pNU5K^=rmy{5G~8%m4>Bo@brr)8rv1m^;|=kA#f6;he6?B`S$fS z(Z1U`=^pm>F^T@^!Tv|vmwktOoc;5^eraMnFls~?L))=($99@)o0+c2`gN5ID+~#9mDNb&@#=D;;y8lX zQ5^eXcsxu7r^k6ImM>qWSPCg)fz4Kfg0^j*rP1Txw(oBD`~5|34w*qbGrR=e|KRP5$%2%~ua(_e00stJ)WA(KH*DD65HVJw$ODIW$Q1*6JD zXzf(EEG1#Q>bp^HQo#)cm&>Z}IhE?()7{WCFg$E8wGI*oE6X%Jt+zLVQOIqt8^kMh zyH;^*Bfoxf@S_jk4uT&dc+b3q7Pzr55RM*UHeJedaQ|ob4-O6{SF`HdM0S62|5IurOo~CQ+@)0mvSM*s zT|epd9lvUELyXZIR55uelChMO|X9HreJ;)jF^$5QDQYOOOXFw*QWm&$tbv2CAxFj!*2M$%k?g_Ok9#alyLTazxWRyiwoE7rjyBh}a;B+)e+87{{ z_FpjCAQ}La$^bz`QK}i~bJn%kYBeW>owZAAXTvnjyyo@20(i}5=B}?nLkZ!m{P>NV zp5NSgaR_3xQY9LR+gcaV5s1j9DAS}n6dn}AFr|!XL?KF`fPkDa8^~}FzC7ynj`use zk4oY+svgJU*^}L^^*SYHspbi!rG!V{K55n}dq;yzsI83^B~?*~_0{IVNr0#`0ZNp? zXw)B$38#m>@f3Z4IpK_;A;#!QBuoe?OEoKmPd7JnX{NhhOgqnhKj$osIj5UU#IUus z6$HVetz{Rq%KWt`mG73pRLYBYfo!aAL}56o>!exySAX#V=IQeKR=Xn8Qbr{)QjBxu zkpg8g43orJfAZ}k$8`vSQs_9%EtjJ)V1Q^7kE2d+?0Rl6egyT`O;V)OM zXPsd$HZE17EZPn4n`g(juB|@ZJKa0#cZ0aSR6pqkHs=Ts#(7!fwrwS8Q7Q$~Q+w9H zLO2kLTAq!FAV3TVp%*t>tJj4P7oE#uas zHhcr-PEj1tA)>VOUD`k1ce&;$P6uIJh-!VQdiBlV^5NGPJJN(Tr|NQxJI2uKa5vh?*Dvb*s4hT`6 z>D_a6t_#>t1hCKt@c(LeR`EQg)vIq@jOgb6)O?{a7oJ^6duxS2z_#$uwr{%zd*jq~ zEJh$I0l@e!&*QA#s4A5QhdacwZBC;kr;KWYN@^k0!O@@_M0c;R^~br=Iv6LH*IGdk zWmzGG%(5a&lI1F|xoq!vU~?9PnKGcj5(*q5_m2jf*DhJaWJQ^!d3O+SN|Id6Lj6hL zX(%-YwKfyIK`8|^MIp&+PB)o*KCfL6v)nh#MLzjgc~Mp>*0Y0ypWeT3m!s#M zu3vAY#_x^NYPIoV=W#5-a|sw-ajo{vkG0H<7Mw95l+cP&lH>)VS+09&QQo|=Vl*3c z2NcY`+gBg$c1B@Zah-$HU@(pyi}!}naGX@zm!Iq%*PG4twWViAqb$qrUSA2qjB{#R ztSBYS`o?k6{yA0C1W+TODe?uaKo%@5A?G$ZL-`z9Q!RF;x?ee|3%2%800030|4~6T zGynh!$Vo&&RE%9olN(7DewkUD)|Ptjv1c*1VQd2vh8c_lP7uLiU}g^RLxJGJiGbir z#4v!{c7xZ})>26&)t<|H9I7Ohq;^1Fx;wkFGV6PpZ_Ruu)>)&j2YGWfKt&!f*6;Uy z-|r9lYxFBmt{Udj)NA&``!{R#_RRO4&R(dTt_M20^4YN~^6q|DW?85_1#TEjYBoh- zstq-3HO^Swbv&;=S_n>X@t@uY?;TwH`)!zHzyI^!N7DrYWKw>3w%=*hFGsVzhNqNT zL@97lbNDopHKva`^=Ge!N|{XRIF-Q4jptMxzAX|fAu(WtM2L*BLi=2Q?`r1m;#8gN z72vAo(Mn*j_1nroWyKO+R<4bSon^7n!LrYn;N{sn!4(b-u&m>KDZkOzQqxd>b51w3TF9WFk*HsRdDmD{inbF zZGW$EvfsW6qLY(@G|LU*BFTHBz-x7Z^mHCOUOkwHTI)1TGQ*Tr3xdGnEY2hVfUruA zQ*Lo1vphRTNJu18vtitB!@c=8ZC0+93jqKe9UpbNohXV{v0kg>0pMHox&H4py$ zm%o1R;b*abQExO-Qwyekn8^Nc`ucLH^33H5xEPNH1dwL(qVId2ON3s{se4YCgo`lCvs*V01s6%Kg%HDjf4|d=;?$UB4l>|m3<5($W3Z^AW!$k$`*%I`|I2As zy$FFpk|t3Yty;3pWkdx5Dx`zz@3(H>l2R(A3aLLHk3av_=NA_j%f(nVQ7UiPoc=}W zcDqlX{`;~&`o+&a**`jPIZeis_qq)tohy29!k-V4`yU^J#jG_nu(3mhvvRox;#)NPY}_@^5W9{=OXvoOx0xo?<*qV4G*P7)+oBzYPwls4_A>(7(3+%LTw8RSuEUTJQ%y_=#yA$<=Hj%2A*`q!oO79*l~1i2p{kaj z{Pd@9-@MtV+EO(cd;RA1`WR)!1G@1%0F?27Z2`R&6l-&%Im&7$#bt zxbg$X7LF~3lQ|HL$1`r%2UmW*;c?EiA=j~t(u}c1m}XKLgR^;@N-a2m(F8!o7({~v zz!41-0)RLJ!FiUdYy3DBuq@j~#5~X6aqaLD6Skq$IJRBpHCU0MVpJ7L`>NdI8p&P! zeRg&hhGC_@9UE*{?h|OOSCvGRNsN+o>i2Ga_^rLV_0N}sh9kat{>F8=XA9f5xJjAG zQX}MSkmP!{vN3-sH;)V3^SOe)=I)Pg8$dbUD=Mmd)C;?1bgbC4jF ziWmTq;7n@L#vr0WBwz%L5IF-v;zDGJ+_ocWQ^jO}hyXj6K37$bEy+OuKx_0j;3^qU zB_g&4?t0^DB}}e+-46PzRk^vmw5BB0nNm?WZq{452Dk1WHeAcIb7fR6gD6eokn1o^ z)ayYY$OyGCGOM}Pd>+nYDQxek(}<#&12h}nB*ZH&qC+!73slrqK`sZAyomRtCt zOa)}f6!tFTKxo^RB?JM>Q@Q&1HF%XAvlVbQ3srWX!*)8cZ5?R?iYfuF1GIdc$aURq zHGgYB3;^KKk014Vy^Z>HUn_>jfPpp?#WI&FNamm1eP3&xYGec&gyq_cFge(7F~(Y+ z#YvLNx((-~)9ejr4cE%EBuUcy9~@pyg0VmE4X05Q?{`{G<0y-R`8=L4;%43Tg9sSY z$`oEgBGSl=F=#YWDGY3j15qZG%C7Om&~-kXUH`-KEEn8+aKF4Uq$;{A=->JFUE8+f zI9@H3gQJ6Pw_6h6*T4Do`IGZ)0uVv5TkBn=LV$j+zYG0}0;{!I3|AY>q|wHVgULa= z%^6G=NxNocxnhDNQg1MA)*RQij=HTEZ?FD#{>HP#i_6I(O20mT{c7L`QQB_S%Ki~2 zSHpRfwi;fy-FWeKoGXn;i~|!kq0t(R(pqbS#5uDB2P9)Km)hhA1UGNoSj-p25ZC_t zcYNtCNj|>!@zba0OEI|V2Q32&Z0b)--nA5yS(-&rRBA!zPtGfolh66B=xmkoV&2%D@Zp*9L_AJhQe<1`zgBEAOB1z+n0InAKNw*=j zVVtK@eRSi{bDet41)^`BUoyr7V@aBOjx`OU*L`1UO$3O@fElf|L9Gn~;GDaT!w5`q z4$`2>OaYUWN^8B2Rqalo>t@wz55&ZuEP-ENqg#51)`Z&7YgVn7ENIJg-o*Oa^8ER7 zzv7nu14}Aa((D3MFK;UweEQjsUcBth!}NO(zdyMel0hTfG>WIQP$_-;{iC737*9jN zaDT7i2eH&@ztePVF`CTNOyH3Q*heu&`^0(4<9Z+Kc0N?reJHGEP39zfZ z?38PqMO8@)mH2R_OUBseU;MJP-Kw4`0=MRkMx!jt(^P-`_lr17GnF0g)sR_AYh!RS z4O=y*+pcRwW_jc391!PW;#k6H6GVyYShGc3uh*o~HP4ANskIS;i{jF}a*tDy-jop% zX=Ah|WO*b}iOnmgTY8GwX}x(JY_=^Cz01%GX~RWy+;0{H%vl`FtvC#R>6 zA3t7RX#oK6@P|Jb4hBmxT!DUU6X_~4e z&(I`ss#{G@aGpu^@^XBz*BFfhtz?#~Oq$6olv*=_*&@!Qky_) z(5j$$V8ukbwpU|@)b z-D}k>i`%xyq$WbGu}G2083~wo+Y&9yQ?xpO#bLY<1 zf8X6h<)C)u(KQ+0xleQ>GPg0dir%^Ld}#zy<(YK^uoQrtLCv#1{NS`^%XZ5>+;7b0 z`RhS&deG@z1*gXy3qUIUsz1eYOocxOa5>Y_Am^NrkRXfX$?eQWz?B!6R-D$hLS6t$^Tg)}5Z0*(+G?g;Ge?XLUa^?1hi66=IGd;KvV z{>`k<_K3Tqb()`_OX5U$pR!TC&t0rKNJg8f<$G=ABTV5i~i|Z>E19x ze*X2B9qmML{HfwTho(>>9i5t*qJzCWt!=Cw>>s!gWCcLoC;))LpkL+tZ#~@F-Q8u} zH^}m7^*3SYkOvb4dyLJHLM}v6s5r@9{PoZ5{O!MA{(BK;X_`%pkG3Z3wFqk?QJxmV zw7^0YxhjT5bE5s>WRRR^X`E$Qk>^EGZolznFhYR)9Q_ent!85GKEJte^R$0zNnryP zz9zut=4QEG$;>q%9B6~e{iw1b9B~5KEH5wjdWWoen4B!{v zWBSU<_vaVqNt$XI)M_<;=_@m6-1{=OOgo$cPznxvN5iZboTaDzG7t2_3&(_~?8Lh$e)I%{5P$IeX*AjlI1+-i-keF-eg(9bu=_ zdHeRQ&GCNTp($tOa?CAQI};oc**zEr zF@aqzjD|6M7bfS9957We>hEcZV4LUyss!Lm$_fB{QTidxFSGUHmzL^>fKLheS1il{ zZ2k1m>AW#M29eq8$_cYhp7GpCV1na};3~?P`^$*(xlhm8)NX%%8TSF)%&Jrx2@J)Q z|6~gF@!j(BWu1W`)BuUr&8NRV)nBP7NfLpCl;|RCr$j-$UI%hTWa-TH89-dTeXDY4 z9DK}=c^G27P8&b0Ly-F*4KK^FisV*7)K`{?3i`ni{#@dRt*@^?fBxKj3oayz^yu;9 z#@LwiFnUzeJBeH)LpwqMrBsq6VtB0oUhfD1=H})?KC$3F5`_AE1h{(bs?K@x+Y`Ie z;3u;HBled#G}#3@P4#H?BnS#X!usf_iF1#zy1Lr!c4<0$md$Fz_1Rgy)S;uyjbLOi zBPTGSm}(>d>RO|aw{oe>=H&2!AG7JH!CYI*p>+T;_9IzfL180SzMG;!sSFk-eFu|`6M9u1@*Afn>r zlf^S$ioIsXybaKW*P{*5z+y@A-W*abQw)!|*H1;dkgX9h4^N{uP;~%% z6QfacH1AVo4n@Lr$wSEzEQy((ndu#h*Z4pcrIx;4dbzV>he{E;9E?&WE21bW@}l)w zD~{tNNllrDXjK}3&}=pb=7gmOo1;;f`$PlBeIQK3kW@$rjsSogfbwg(7Z3oTj1Z2X zit_qWb1$TE{9TeH{;mpl8waTAUY6x-HY0!TuXl3b`0_;uu*1XWl=~+|r}Or$zMV00W$P&_ zoGvIiK4$@13-$Z`2tgxGJ~+!8-u5yqg@IsowIF#7D1Z9a2LS5zdrGlDy9avod1;Uq zBSfCfW)K&7vQ{OIs98~zwtm{yW`7@PK2=(kf3aTFjMN9Njz%Lp+E;9OU-bV8O|H*y zHg;Zexxv(E5~?bQh-`>|?jnHQ}}( zGQWhf5@Ukn+1*Qq<@#$d9LBH)am-QFycV7I^Y9$t;{eC|KhWeMNf`})w{8tq**G}s zVyYs2dsTkx=S>z!6W?df@adY#!o!8>FjtO04+U(m#}9 z*H$qV*6ntm{`~aLhj$)*{wR|$6@q99#e^%?&N(=2Zf;6%rM2*c(gcIS04xDQV2_WF zxur;Gal*mJ2OxAh9Z2mT43Fo34f#DOhF7rw!1xk#H9nU^~axSodZmEc=%~`eZ6?|#%QhP%3IBoNhnqb8vI3H&x|o{?Sq^8 zL*FTH6L^UxQH+?r6GgTs75uD zG!nOd(gIRtWqra}+Z>(~iCaHAQ0()BYhC>F=f7WFUGWlv@JEYceP?GU&m=(rWdN|f zU9$D&lW_3GW**uQB7F^{D%xD3|M{|9W2XUIYY zZEbD6{O6@=i(G}0eYk?0Y^HQp9P7dIZ9GxVDK|Q#8rP!MLUL=gfo^OO@>>mmt*js< zH%{w-C)NytBx&{m9PA$?tMig3<4OH=Z*TYHG%7sQ!QhAeCC4rh_yKU_RFubZ$cq(z<ojpP)|Iz}yK!U*A}p{M z35RfzO~^~c1IRXkA4npRUyJyIAUOgh&%qXUE>48SLkI+6%ti`p)`@qSt~~T~Pj&Z< zh0OHO4%@bYqi>NICMsXx3PY+ zNcM#SZmz7XuC9`JTjm1;1k~&G(eQu(0u(t-`7Q=Dv$kQf(8&NZJ2B}tiHZ4p>EgxB z&CMVp2Ebgc*Z(~@a4U2)p&(SU1~lXJ?CkdA$LBVQ$pQWbPH=1`+63LQ+~X{>B6;hU?!EL^qLzd7 zWM(Zi%YIvk6x$vk3nd^=q1>vH1Ss}SPfx#i@gms!<>y~~ediAQwF`hI5@K7z*%=UE zlgNaZngb9WI6y5)63wi&ei!r?7Z%pm*JCAelD`tPo>&|m`dUz;iU0EA!VhcfDYJ{n zwKR9CUY;?-w#wY9&->DU*WpXJAPm-#c8I&3DEaIXKW8*MC*VxCTWE=aw`rOdq3;AF z13V}}-w9VLmDmvZaw%v1iA^`QsvfMZYi8}I%U8E=XU))#th*ZY4c`HmE?n?%h=XO1 z7-JmrinM%ah9W4+2(xvp<<-rErJ%9##$bOSHOjt}_2Hr-$mIo~T$KCp;Vw%e0y>>e zuh)a90Mh_sNl6;cPi^zG%p%#7GeU7q$S~Qb9Yje3A>dX>2$x05fJ%rGB1QDi{($^5 zbghh;otB^ns!01Gt+>nyj#iG09U*b8G*;^Mnv^$oU8hZ%-=Cg#=of+_HyZTA&gY}g zhoa9B`s|}m!NodqhJoZ*LZ+q^5!tVstYmDt**CcwGI#K(RZ@|?`20UOaiZVv%Z-Wjltjd7G+cafZB9OFZI0tyWx99PvATIK48QO8h3g)?P_f@Y4|ET1(JH8zR(0e$L zuyrVBWEGGQDufEbJWjM)`OU$#L83$)kF->%n*B%V-?L}WP8>ge$bsEhSq>77Em90< z=G5}I>9-n4Ilm4CJy4p?5MhSf&a8n)+uPERA#pRGnK@Yi9~Yw!aY%tPK`cgt${ChO z0SQ3?gMQz9aNfFcBe5Txi4}`;)~%dAb*fse!0!QtNwK|=4V5KnLz@J95=}crO9j|4d!sfc^`Qbxg z=r#EF9HKIekG)o{4o4&SIbJrBMCnuq)Ddq9I^_KP{LfokQh@w?JUknMK*k%5PP_fb z)29F$jq&}#{;ivzeRKD2E-$D_TFmD~y?Xxa*742HO#VMw6#0!Uhl7%PbktO zkE$#R|EtdPHkkhh00960h5g`U000G`Nkl!1Pxn-J^$ZrH)oQ1= z`t^0at4%?4^ZEw`;g=^r7X;KbIeRc!TC%Q42IRo>-McHJQ9;NEnTRX`2aEqh*prLa z=xZ~>E`3<1ViBp$(JNtX7Y@|@@g>mr^nTLS)%PzkRi|YFkgX1~!^1=C%W(4z07NvK z&Fl({O9+=`B_kI-u9UtW6e7*u!%(Bqs4UAQjW#xZKyt}W0F%jNIz4X*C}2rFECHj@ zuq-R@XM1{9EK=7DFxRy-IZ-dUT0K{`I>;=_+%8^FH(5!NND&c-g^P9?rJ%Z=q#val z%d%|uEK4Ze!$#w1^t+(#C)AMrTZ@G^UpDPrF)HQ@1~c0TxbZ>Jq}nUyhhIJX z>G9)c8tJ@t*eFsPfIGrq(W<9!`0&P!^^Ntty{8EAP0rQIaxY~UUnhl_)VF?m7Dnm^ zECRO{a+~C`j%LkVF-q{fM(L8e>}?=Wxteuw!eIc>|3pp&wSzPRCOxA6u}|tI>lwUf z*e>*w9zn7%)b>rqD7meXG5~@B8ESNW<)VCxe&ucqkkeO$xKtuP5EI8O(Z;AX_z{h^ z4bfwa0b(xG+M^32+1{tY-1pMes|`~Ebx4rZHq^a+Q#rL$vP-A9e3k{*M!zNVoViK! zDvltLrHJx>)S=%cnq1o#mY0{Irt>&z1=Zt>MPw&$-+KD> zwY8*!q<0F{XyLNiL@t?2<|?#2p0v>ns-~k)BDsP%zjq`r2Aj6STQYHFDzx`RY=eV)SxA%{?3=?%@Q;1@CUcWv}qMt-O!d*9Z9nAgR z9s4?)PX9VOG7fP~pB9Dd!z^Bw2sP_44QKO_wV?Mtk8cV774ro^xVncV3q%b7FdmOj z&(37uD7p!@6v7r&VdPhc4DwA$6?@R=91e&Yvq`?4N6lN2!Pg- zLvgxwFW&~wq4JQqev)cRAz*v8%l+s0;oaM**=ZM zYEMZNCzyz=tgh}K9B9u9;DU_BbQyB`C5nLJ;;$xn42lnW6#HNJnplI`6Jj<==95vL z6v#!Q@|Aie6CMEqz!(9IqfBV(3tRvdBIY9Df(jvL7g!!;1Ts4}$5dB{Flr{ucrXW$ z=;uNzdXxG3)cAxt>k++f&v6jw6M?3`f&dm57H+@%@}n@F82JpT7tl9YUI$s)U9=FA z6rZ)20AK`GHjb>k^(3EzEkFbi284{R2r%Mdq&{W;FfSrC*Juc%D@1nLU%P%?2!Sx> zLQusy8l#DNh?v^y1n!sD)-rZ7kV?}OAq1+=aGHDsz-haEdfJvFnBa*yFeT#&VdQbF ztO+Wv$I9>2mldpxWWYk82}hb`0y*y5TOo?U5JF_hA@Zp@4@v>3Ou7~KrQwqindI@) zPFH6yIAn>^aTrE%%vBZPGqm2^v#wQXVaR_D2IpX?;o_xBVHjGrLo5rs?rdW&O;dz1 zA{G>SqCp6dy;hiDjPPevP72E?S{h=|y|%*y;N@Gl4)*tnQh9=)RxWc&u~CdOuaL;S zm;q4stm|bP6s$}!zWn4x0_Bp}b<3j224TtoT$qs-#^=PI!C(L}#RdWZV{EyuSFOGI zy&t^u&fm(71;_K8azzM%2%%w^CNU;t-0eKQ_1M4u`H%4YJdHyTg^>IILSKm)6xZwC zOYQPXVKf>Ii{NgjqeoEj1e?$`W@iS2fmTHG0vdYCw?whnBGH!+yQR{2Jl4k3ahy0# z0Kimj$Uqm`vAJ-=69Pa}KU{za#%{Ud&&)Q~H%g89QoV8a&Krxh+RdxaG!ORI=N4?6 z#FQQ#G(T?bLCOZ0ob-BUgWiKr?~U3g=SL6cT>JjLPbL&%TE-fE!{aQ*t0U2Ot7U?dJ!{*uKsC3%`r4P@{on(kh@Jr;j2UB(x*2I!W^~o;QNicL z;Isft_W%>(RjT#%jptu^ZDwipyI=cy6s2?i%vmR4G+A6ISp-~{4A1+WZU+D=)yi<# zKRkTsdj7-1!;uh!lrEX^QT?zs!Iy$1ularf@K@4ctigrv%wh?{Al0;E^`gJ3Bi_N81-|Acq(MOr;-C@jY3zQEx)X%<}5x>z}** z&2RnjSHGDjUe$8PgK={wjzgBFu)O3~%f!Om_e3xrawdd;YOPZ8-CpnPd@#hAc&=Zs z&n9uiDWgG90#x(;nQPCL<`z5z=iPQ;NyUr;NLNrL;gzN%qWnXhna|xt1^vQYBZ)$S zGNY~aFH>SQj*ZME2Ou8KdrY(zBLGX=ecdf#gx69$Iw!}A1ftzIEr|lkM(NRfdzI?^ z=GHT>fAz0_{>w{G-4KazFsBK_fcIL=wV_eB3FZWI+X5l5W4i)?QW}M^=lV0Xs^>Xz zIPUkmQ4l0?9EG9hx{M|?ij$MB=gqp?n}Vj%puf^7SwspavJx<+8; zq)bW3zd#TWjEFHUi{=q3&o-XCb^8~;{PoYj|HIS$jzgg2*qpK`yr)iodF+#|5Jt0I8glUp6 z#wyiPtF_Cy@O>|if|Bp?VNj~il-D+r;hoMLjW+*=Kz2Z6F_{NSyY(vu?$ZD8AmEVM*x5cuGj1G0j4cd9Hi`( z%Ho=i9YV1A*hY%T=1Z@<{nqbZ*xDZUx?vz3+bNZ-!(;Z}Pa@xA%a=TiI6}}L@bQ=i zW5yUy61KhREG~K&3){9BO^3r_9H)d>mSrJ?Y};mx+LqPrwogw^T*oVw{L!FSsd(*! z{p#F;x3t`D-ap#kmwF(1UlpKoE+QyL|JB>KTYGyFddcaQ)>nh;k zxi-U+kfp3vb;>?IABt{=J-+2O8eSA7_wJ8ct++mmYc;aGL=KPR*%@+W-FFhj9U!NG%muV>q?0I+R48V`HNhraLEHn&Gd4_O== z*?5Eju0HkTS+_%qx(@*R5B9W3EOnYed;O?@KByzE5EmMH?db>r;%KT-Ok$$14UuJ8 z=0#K;7-#+K%7zP-xkE+h_4bH7+6V{&+i_lf^E*HO>Cc|q-V#XyoVu=!5f*@5$DW^e zEW*$oW|k8LY<5B^rW-9+mEAUGz@}q(ChWO-TujO`tv!Ayy3Qmu|bnDhf4-PTO5@PSa|95QIHqg*3cDnxbRiZEHD~x2? z>V=y(LESC|$oYV&WF>|CMw`BP@jn0n0RR6=#J*$z01MPfL_t(+Tv?AKS5`jf+do-Q_3#rWm#x|xA;~B9?h!>tlNQ@8~@c7Tssp@jMGAoyejO8xp@DLf1x2l~FsZ>^0M#kB{bG~y`5+SoO%BN}Sec0lKQIi1H z`Adr7p@dEITqzxb@4a|2pDToFy;g`Am3RGjDu9EVxBuX$Kl}T?{>yGt_T(fK4uM6O z5C}bzB2t6|-~k+wGDabKMKYaEiXy8w%a<>Yx~|hoF-w}JNs=s=vpi!`+8DK7uh;9+ zxgbF0dTqP*)^~5cc>W9}gdqC|`?IstM-P6fl0*@?YE464#fzzHEJ+o>Y<7kN^W%~z zj*gB6fVZ{ePB_~x^2H;6#)mQ&p>h8q?>!;nwxhl6w!eSx{g)>vaSgleLIbdf_dW#Q zM;Ntj5MD^X@%+|g`JevP&wu_mf0u)B@En4$XTZRY5R_6xCQXtwO-PCN&O2+2P7Hci zH%*-+CQaz+(?^TNf*AlPO;e+jEK6BJRc(CmM5L5znzpkJfwW1Mt5sc&RS<}Hkr7x1omT`q$qOkAVP%N|1FH;vnV-_0DZKV3->T8gXsD@-@Eg{Cx7<)AKA{Lh$0dZ4jurE zNqVIlV~WCL6TP>eE5xQLwH89Ow&}Xo+ODoQ)&?SllmJkFcgE=Xe70DelTya$a=j|6 z5&(mTBsEH#$t2(3-}|5c{x3kvvPqgIWmO{LC-;Bv*@ItF6my2`6^(pxmtf=B5k&2S zG1d#fe6fg+Y8pTM<4=F|=<$=j+piRWM2Y@_KU@U5ea$nrJbB=0ZKXe$Ntzg79uU^6 z)f7$+uiXFhpZ?Q7{zDK5)*=XqcxQW1>73`lS|x;rnOqyJb;c;Apswrl#k?vjMBQ~x zm;s0xnMDMMFmM22>+H$P6A>t;)6J%;>&BR5xvJ9CBuSFx#kFf!+qQoG>?tYLbzR%G zA%wG|7t*y5g2LTGu7YjHtuLDUJI(XlIv>Rh8SQ$Ufsgtay(HGzqsLEV0D$UG{^$>% zJ$n|SVMSj>V&n%9XY;57+W)Qr^=>6TN*{)bc87Zb6vBJI^YQmT`O)h)e!~!G5>3b< zaPWxey$_xd6jCCn+ooySrmE_yY6QSqcYc1pT$Dsw>y!nOBoPp6UEqL3MBsw2>zWA9 z&(8sgMZ6EBlt>665UDgZ^ZCqnU6yBU*Vc9IeE=jvP{Lw671aylUH;l@uT|BimxFg6 z0IpuWx@j7I#UeQh8*vDU-|WBi2k*Z7(MKPu;}_4Zwej}P*2@Nk$4Pih@vkDa7|8Sy z|MlCq%d&*1qoNU#G`;uZKmOTY{B5QX7zog4KoAxQAvo7ri+P@FoiO{h?bou5DTX0fFGd zWK!gl2_o9AZR&D9UpgmRCrOeJDd!vjGD}m}{n>CLEX*EB8?&=2*iOG=qaJ2fQnxJw zc!3W-{IH)PO4Q}evMe_Fiy&beOTK#WfC1Dc1OXQ#&!{~aQa{ErMSy5>{p&ycVLzga zd(k7lBLGzD+THK}>%aVS@DLny4P+UlDRBtQfQZ)OWRifO2#JXIp+_3Qx6WE3MTmf8 zZCBT|2r8wO(um|eBZ?wXN?B{aJ~^rDS}ELEFZ*6z{Dmxnh}&_5HhbTFvkh?l3X~;m1c*Q>P>Kk} zBN|O1cm!0$LctjJ-ixrX_r5bGPm(0Che z*PA5GL*T`-OB1g&2+MqS=DjP|tG$DR!^6YV)33K@eKDJ1a{s-%cbUWEf#4n&IiLUH z7xBIjz1qC#3&@LPDgf}#9~~ddaPrdDKn38|t=kd>83DL;`}WQ6eCN`eFvi4-6BQM) zy82%i@JSq8OuyAWPFU zO_V0v)y`R^6ao-onx$G3A_s4UL)&bQUOb!6W|MrfH=XABM3GX8t{k9<(@LdTs))+< zYH>b4J$ZTM%2i_$VFqT)Qg7E1;o+l4z4RHj{Di>?pr4sL7LKUFybbNe?Gjeo%e0*{;!Uq`pmjHQ|Uph8r%WsM5%eDTFcpZ+8r z{BD1L`%y#Y+!pY=uyJVzLUvt)ZC@IIMK14Ejp80fKVp#nMb|c$_O^NO zgG!Js$}>aTaGC-U6Oq;`cnu&J7(k54iel2X^?deC2)w_4 z;G8SVQbcL3g16qci}Uq*y$-<_)9Kr9y`ANgvMiaU*gFW`de@0SmgmdmqOR*K%MT6? zSL;>q!83yPkcgDhMmvXr zHIY)J2q}aB09u=(D6DN~v(rAcrfHI8N!K-t#eA`td+(n9-_x(Y`f9aY*L6F|3qYLD zXIYj{ifO&6R;z`zmWVh6t<`2z)|(9~#VpmP+H5KS;NV5Xv+!W}+iDQdvGh!}9{j)c z=9|-Lk!9HciKTz;m+XAR&*Z3T>ivcV9z1+_{l<;0FcInb^XK0xdib^mNM9h0&H+Ou zit)61n347`%vKGMCCR~!*Y3Rac6jA-)tm-O2>CQr~>@O*;@QWCQ^bFLq3UWAiyaQTFWY>~}x@ zxVL&OL&1B=58^6nj76ipOY|AU3!WG^-PF+01w_T1XnnIVtpgQp_j3S6;4C-?^+u|V zc<1uWZ|YVAL-5Y|d?IzzG>x6^?Ppo;y=|JhYunXo-F3EFSAev)cVLWWX68^X{k;eWW)8T6wP7Ul3|-W4BJ$n!aVep=-Dx5FeX5-J#y>sHM?>f8LwAQ++YCs@KGOg3)a#@yD+cegC zX6`zxO){BGlO!=odT?+^ioQNMan5ROh%^WqlNe))Nl|aAa=otWs$8!Dv1vN%?9P$^ zM8Jj6FGagy@-f=kc;jcY83WwEf4`4Q0eV)|ZuKEVMCQ@51>lX>Uyp4XME)ND0RR7a z-Aq0J019?VL_t)PU0IXkND+cB*|O}OfuKU+kY!0#`m&T)Wu_0-!$Hy9{Uk8b`p0Z%P@%@e z-~F^75Fcw$0Py)g{_(>PKMHxu=X)}w1VqA2DN)y@l%mmeaZxZ6C>w`?hJ8%lp3T+P0sZ&CV|#O=t76EYBu2C|=#)t=6l0G80k8n3Q4+Q7KhV>KFqH zuUGeNvn_1J%-*>{Ezj$TC(s}8k^Qsp)7d}&=hMA4AUiVbxzGU0I8Xrqog$vb{;B{0sz3* z*VlP2o_N~So|t2{kwKcyrcFBpNs7t@7^A-f_n5zrdmU7xalg~qyltAS2#JVf(|11( zEx-V(D4Ny%YK1D%tdzFnNz|PQ`d#y(`Fk}LLUlail*7EXA!0lB4JUMRw*va zNnJ;!Hd!d;LJ@u6r4)0k>N>`dQna=d0cI}C%DcX6n-ILxs;sIIoGB~`?|da9#uyNW zbo6NXNoVtU2*JlVgn|!><}vUidw7i7ULS4SP8}{%0J0#d z?@>TiRcXr-6c|$!h1tzqV+&h~2x5#egy4y|uIude^gg77WmU0A2>$i$;`L&&S#M^u zc~w?QsTh4>ikv#YOv04?=wnnfLtk&VZlCcmXf-mT(wKR`Xo8N>e?!ZQ`wGAq4SP3i zt`i93TZ~D1YW{%&u(rr)o*IsPAcOn>08sk;+wZ^kqmSR2KAxQ^1%e5^b2m4Owsp*A zGAV>)QsZ=5eDd*CX(0x$K#a+P9IC3W>&g_$xwh|n=Uh=(rNDdFwhc2m*BfK9jn+G7 z%d)I0%C1xI+ID;W;%lY#<<+AQg7>Z{Y<>n2VIpB+CLnrrb@l0|PhPxyInKU1k$DHz z{4ELcdog?99OKVDhRW>eHmVN&F#L7^^CUxYPk_vkwJ%Qfr#e?K|&GAHO?)bTzLk({-C%l#Q90!P>%F6Qg6s&1R#uan7~v zHl;{Jo6V|iJH$lH!rVKrwNXkTCarZ!X}wy77-#eOyN@5I6s@g@$e02E2or$B7!)Q2 z;Jp9(`ugzaC2uOuwzrB7h#uJTu>lMK@4x^4W?!lqMnGjP@raB^@6NG1>FVmzdq2MT zNKlU_`!E!xo;-Q7SS<1pZSB?ffAGO~o~)K_RY_skXswh=NJ?1%E{g1LW+J~_-gxIg z!DLcZrBxc3QCPh1w#~*E!_1lQBcdsc>-+U)-8SuPex70oF&2eQDa9C-(lLeAYK4f) zyW9Ka(wL&_TBS825+V^1A`>d+G1f!O@}lFZJ3{i|OkALmm5p+YNTbZIMN41f?N z5LSvscyaUM)vJZIld7~;T`6D?MoRaq`w)Ct+T1N7#uPCn=X&phwPjsTh%v^LQbbIM zNQ{V>QXr!2p-L&Hyq<-KDG6r+>_SH5Soodr12{f%G~tf-Gs?T-lW)4}poR_teLCH_ znMTJYN2cigXk;`f1t7b+45Rz*D==oSAqZSuUi4k>y<5I`-t#>})powJ*tImDO{deT z(nX5wTwvDBFqsqpe0g>G-Z#F%9Ov_Civ8W)E3GXvyS^tP#K=rBhFt2Hh%PQKjVY7@ z@4a(p!E5d0uCQ%a^Vpj1kU5rrvx;+T0D_NnAM-XGgHCsX#}g%2h0_(F5i zK}resvv}Oi@G2ZmKGwQqVE6f}QiHxF0M2_Pn$OPzb6Zb;_R)`Dz3e9yI_I|AHDa1f zN@gyM1|a9U*NX)a8l&dt=hNxgS6@AQ_3B02w%cvvyd$LL^0sL^X13NU1yx-UqX?8` z5khdTPcZ_B^KQG@#2A@Ln7g)#DH35KBH|Eyc0Vu?^UlZ_M>G6i?QN>g15Nd4#|-#h zUR;C_lsYxuh6}Q6{_OX^_uda8Wz2AnI@tT{6u|F(`yYBAx*831+y1iWxleHxxCFHuE z6xI@@Ot9Cl7uVOj=Rd!`etx2Hp2!n5cEIiQ zszX?-i2VKYzngI?5&(K9W%;8IKiRHyT@q1p-t`@3Plt0|*LGP;*=)8cp@53fgDSKt zKtWa3S}S9ebA8u$+ooCGEuC}O0@!Xg&322#O|$jhr<6dc!dg=l%p7760b)W-!puZM zBup%lMkU^Nrokx@4rrdJq`Acy{|nzA-)Fp;F_hz`6kK0FA3>}hLVrMiNW9Gn7BgcOm=qK#~^ZFmnj6Hv2Mse6i zp{a4C(yCG1_V~yN;!44ztE;o=SwCdz05FkY4AZl3ee0XG*4EJ3#KaJbfefIQ=FWyF#x83LDr}6e500030|DAf$CjbBldPzh z>-)01d$(T_DT(B;4_tC7Y0oJk9JD-&AHN}o!{H1Wg~q2FQZ!h9;Md851mVsl`288Q zT^5U?;C$soMs9+vV6DOo6n|sp5=K~a9$Kb6WQsvDl4sZjG&bS zLxq$5H^Ox1&Yjt87RFoj8$bcTZ@&EU`HL4vM@Pfq@Z#d)Ex3m<0I>3)42Aj-dYiSs zG&%GE4{6i1f`*z|mv_3iwgu>%{F7dK>(Q@%{rJi4;b?jx3ZeTcBV8F&F^p&P5<&O3 zVn8Yjk>$%mh{bZ=>!oqb7-NIMFiq25nnn?R|J~DX|N58te71LUpK~q*HwI)?RZ=p> zfHB4*rInUaYRyO+BBQk?DmNXW(qzcKCGDg?#$?)vH$u}a#dYU(;-^oaHiTkV^2&P7 z4+~RAeY$65s`_a zYl9uHbZM^nH@zGj9N2SA-@^T|{?ZQxe>S!rggCB zkJ8}g-d@f*xUT6~#yW?!bu`vRnvjMz%D%)=MDDznaAYuOQrj7Zy3C!Ei3!lRiDgkv zUjBRh}(pvnkIrp66v%a>0!;Wg!-eIRGGHC961! zduhrT%x6Xr=;&y5gXkt?8wZPe(0=>m$@AyW ze{yiJ%(5`vO7A?+!M!(#XR}%nz<2+eac5AV@9EyRrbeg0Rov6SqwiN_KHdbJ*M@`r z{Wr(2c(zRLzJK!1XXEjk>2!iXt1Ef3~t`s&z8&S^uicZ6lEO8QIw=gqv977-8p4m4;IC3dhq*@)uF(fSvaUuSo%=_a7b5hMu2Ryt{t_;y z!BJ%`rv~x94L+Xd`TYEJ^5O@vm?xvr_U-!sm@ns9mX)$X#sHBEUKB!VMP#BV0zf1J z($>09Yb}-LQVJ;#kB-Lmiw;8qgq2|dv$l~xJ3O3BCW~M@*VOU=0Qlu6pPZhaVjbdD z0WHKE=mP*IxU${sC5hGNZA5>a8LUaQrWw}I49i<}a3_X_EwN7Jo?m%H{Opa4MV(H6 zZ+~$6UT?D z$1}~EL9Mf{v;IwhG$NxIS3|~Vz3K?KPEjLWIG4kEQpNf**v<{3(Wnr@*VwesHvmvK znDOF(pFgZvDdw~J+41z%zsqcS|NX;d&Uqm!MTM-2N{UKGNwUncqA0t)?lN1Fltyc7 zWn;~C!vw#Ov zFh)c+{)@+t|M1N>9&6)-Q9tEwU%O_v)qDa^cydbz0sv>3v$eIwIbTgK3|ZXy-B(}z z{_C%e)}%FnyJ5)XzmW?!#<%4;p5+<{z6m;fLttzCY=@0Nhc6F5{BS%T&t|hM&#=eV z@{DK1Q0L$f62NO9d^23_L&d5IYh16alTeL?HRs&>9{cpn{Z9L%U?j+6-8hw>))Nf$r}gHlSPc7ZiC2P$zclAhqLDA9SQBQMw65 zb0%S=`)MB^6{3xB6YMs6SXL zPE`sB&|{e9cEwb_@Y z1AwM{wkY!z+1w^^683!&7Y=K}I*hT@O4L^3=kQN5r?TOY`8p1|h`|DDlEXKl8_%B~ zTwh;v)SMX1h3#Nih$rK3N0Kf1_|fC#a+wtvq2ophWtOfc8F|?VAl@Tgq=bc0ruNhE zG13`}jwYo&unx{+F->;^f)dFtZV<)q&S&O3AOMg4cxs#W{wmKq;wh$N|L z8G$sdY}CTd%NH+JpFeZXP^E1e?>*F-Ogvl`#z+ww#*0Vx=Ju9dI-t&lrIq~vsE z{r2MU$CpB8q? z*#RgGOpLoQS*TDh7EUtFSJfm13y3nPCCwqCNQS?w)k+lk;Naly?k?nqr9e;tH#CmN z=?)7?ujC{xno-CEK%*lS)nApjyjxdq=@cnv>4$mTD`%}LBn~|+T3dqJpdVJhdOsX& z)q~Y_-OYGh{w1eHOE&uDiy*dP zgJs{el*mTQr)?YGhvk<7=NgCzXq*coSglse zp%1l0sv8+Kr1C4O!iYo48!BoEVLqE}wp$SBJ4e!_#eKHfLN5jJ1xELuJzFdm;K?Yd zr&(&IJJccJ^!d zbZ2DAY!Veha-}n&KIcd3$-X$hlE_`@A|+cwg_%I<>gp<-L}hz3NF zoy>ETTQv7&SRYN!xoo?;$b0y{oOATwhfDo)ZYvfX(qW6!8+oK4y#DzF+2{}e{Q2&k zRMhlpxQ`0Yl4)lklJ3=qdlF4huVeqWxnwj(hyU%{Ke8MT?9#)Ry3xT2XOyk_>nAm- z?3~;6J$Sokh#NX=_~I$KPv0%~!1?)k(=>nm{m+hrZrZWP1OwHs2+4xGwF7H=V!?9g zLE_M42wd&V$jNt;_V@S0*Zhi!?B39>n`}2*<0@kFI=}CGct7d7?Ph~?y$lu2g2(&! z|7zFdM?oJ3Jx zPm>5sE5WBVd{&7#iuX{)M+?}+Fw36fyLbe*U~ot00960f)Z7U000GyNklVj4=weUB!eJ8#RUq zT&a1&G^v1x^r0;Y>RZ>Ji$|6;kuoNHl653JR{kk&T^Viox55-JP3{y@SOvcYFIW zUpq7Bo!w1nPxB8Rq}El!5pRS-NrCgqhwNy<26eE&nB$gyK?gP?Ci`{TU=bEO{ZYqLHk(%x{-*6!v;50c9FiFdLFm~ zur)0z{G@Hc829;hy$w7G;Vn&1LyTCE&2>RvdmBaaiS@_Zw{vrI2~}`wYisW2@i&h_ z6UchltR}0`B_kF;2TCm?2B6>TMdf-h9J1xNWECc+-`~6efalxWS)ICNxsI2uR_imu zR8U+O;AtL2KajzsrDn5Mt6g4RcDr5X1yw7R!C*l2zI24rM+6kqcL~78cTW!v4rstZ zfWTUtMkn6*O@zp?iKGhPv}K?uot#OMGcdvGTJH7J1}l}a=p_gex6H96g+K4?d@(=&d9@0nE~Si( zpsDGkb0(9?zZVxK8VzG8}5t%7~}VUC0-`Q%8<}qqzg5$)oRrk)9dxXfB{pW zD^=Z_0o`N{VoK9Ap$xtW0-fZ~myM15f)$5hf58jS|#;BOl-vU+EL+990h(e01N<3b^* zQP2`$AOWb9%crNO!0~rY_xpWkDlDn)n!x3?L4LvV`J;(*s<@)ZF=sdj7(N_~qvK<# zulTi4MAY7V`ZPqQ7+sUxVKhR1UnEQFOktMYx?(^hYyrM*wR9hkmX{9?53wOEyt1+a zfxY)@HPL&PH&&cV_lLsqRwxuibw_*}x093H(_db`q@t5wm;riQvf?INEbf?G;a_)m zeIrFO+a=!44M1a|-szke$KK$iN~+pKouAv0JHBvYa_o_u@k*#h8a6$Px2E1kkH1D_a}h z@D7K=Zubl_ki;tWFBfzs^6L5qeQ16se)XhfmW zZjV)x=zJk0WRIz2f#!T)GY)BM|Y06-uj0L%=8=SYvsjYOozD@*czv$LQT z2!g~K5+i;~nq>~`DDY)JlExKf0{kqPd2P6Md3jk8(vu>s3ju&5*L58L=c%A$FoQXY zl};s&1Iy*I*BnH$2kQp{95n$mbI06qurk}u9jg)9k|a?c#k$m7o;ML3!4Wxe9*Q`; zvm{bU=6otiK@gbH1&shm>p%JNNfIFXv?LNnx@aOTkkq8+q4ky8&4o(+EuC~?z zf>6-Omy(tZa8hxqqbD;U>WTD<(1MiemHnT7{+W%}+?71u1lm|6pg@S%ae&_>zT5%= z^Va?Qx7Tlb@XT0Uh)uEeDqC0|AqNz#ZQ5QcQanUtXAbb4Cd)JMuw#xh=@56VP~iOh zTp3*vSKh!~9SljH7ANa_Eqn&zd`<|6bn(w(e}7-=?vVpOJ$)L)j@cy~ylIT_N8?O0 zw%Ke}PhS?G5ks{n-66$Yne?*|HI!4wAri@oT%Zv)k4UQt`qO*&PESt){sc1x*kR}* zha_J{rvXRiDguC=-JO>&UK)9<^~+L1w`P@k($}o>iVPOkM#&_L8&gQJ<^8p_>*aN3 zVLAZd!50rsPfjh(3Xl>Ai^bftBS#D-rktf>)IOX&{PXqe%pe7HS?oqJ$kE~9VLqQk zGuO2@i3fnlRW+=)V)pS5kEfqZlgyc`DHi*1!%${`adB}e%QdY-_&+{6Qi>&Bv2fhn z+zduf#T9`&Mu!aL0;XR5@hX$*ESw50BG5Ymaw)0mj1t8H$m9Wvs7{-@g63I;CH^J}yyI-n`;UW=@$VKa&8EGKkG3PR@5d zTkJY37yu%2{b`K>OePbhm|;&?EEbBrGI~*Ni#}W%n&Kfj*SFt)r+6{I*xue&vh{+S zP%^BIx4+o)xW2gPS8+3SM2>cLcMR%=o1;;`ybQ@iCEOx9fg{zWnH=r@yaz{UM0fGG zx`iUaw6Y;;9kq@Ij#@Vu4Qb$L;OIRU9tJKfXdSig(Kla9cGS2V*wxM;oUTzV^=4&H zT;k#^e-za&Hc}~9ux63U(!fiz`uZ7zC5NXRNuZzC+c>o!WU{kZR%HRVv9WP>c6Rmd z%5uR?mu*u`)HJH|Wl=|wTBcT(ibFfQVb~p-V}BnA01!4yQ*T&ufP9R7hZDgn-ZE@IS~=xQBsg&Q_JkJnFyfp4N9`e zfkJQ|hEfE`Jn2hjPX)3TwxY{Ho55=MP^LuG9N+S?Q5kJ;e}jCEKxo=lrPErSo4iBb z2~9zk(~cO=yW;HZ%URpD!{N|c4fPZCZ8Di0JU_Vm@m;&P&-zh?t*x!3LS7)O&&R9Tc$Jyrp>Nea z<8?+Wdv~^{yX$oIsZ-TUHj<~S8IiC}h`y(wl*t=+Hja*ttc?T8>>_ta7#aR~ms;MZ zTU*~A92Vd9muFB(_vsjg`QG+hw?6vi)hjc!nZTgxMbGQ2`^<$9=Gr*PQ5^=>*4F-b z{n~5`1DTpE(W9K5MMJZwy@spPeL@8DPnPiPer&J__YtRAoh z1LzkXX6hf0c6Rpn_dVx_dbp5|q7gv_N>=U7*fK0CA2BWK zKyqna7enadofp6`>V@YSJ;&erZ0qpga1r_hJR6HqQ|XQ;qK0%L(FFRSA4uHAv|G|E zFxt-Jov?ibV3M$QmqlHa&OHDCoA);@R~9@|rGbm}Wol3fFne8wewe^TGQmD;R%P@4 zrhjvo*l$?pkRo&vbdDokk?Y7vICdO4I4eUHAZ|}TsaaA&y!LPQpFX8ai&+zts_yRY zhTh`N^&$HCchBp9Z0)y4QAw+zw>B6`EDd;d`Wf4;rGzCHkSR0PGTbquz4^e10E z`T3_gY(Hl!X}JHLrgRCITx;m;l7OIk0wf?e|}Q zD{!%Z#wDrf!g`A3^vh2)`?bm9BOdKM+W&fgxDx`v^71mtlamuahoz;Z*=&}^&8cPD zH2o>{ zDPUMwv)A|aNw1$p3(!j`ZE>wepO{Xk$1jhEBQS;*esO-=M<3Dg9h1PPaQVXzPG_?~ z6(Zj2A*7SgSSVhWGHo0}Rnh5#2M@9$rg^y}X2o}BmG$b))%kpG=bNL5t?CfD+sahM z-j{nl?4#w0bA8B(aciI}!(+$C$2r20Ob3?z95BYuVf6d_<}VkdeS}pg0+G|%jE-o? zk(05=*m3OqUrwA%948IsY7@H-c-1ybRA#Aw9wZuzgA0XrI-ZQ@^Enhq`LjlojNYhe z&0|rf7opIty1?HDbyRU*vqrNGEbT;_%B^ERR=c*xJeFhvTt4=WJlzYMq8BT!?@uveZW`clHIG@k$K}VjhmZGt{(Wkub%89ewsWolM8@xoUMgG8&(DjeDhLwvKp{pMct?|htOW65^sD@X zdGxH&(j8|^n`1kxjdZ9UXGIla@GH!wZ^()a3-n}}dTptDZj8ZZ{A9jUO z2$7tMsb;m%>A;DS7Oq{di)Db?+ER7E5Tn5>qo4ZpaWA=1_*Vp{{A-^?cV;=$eD2=8 z`{KomVoFxFMFao@k2boKjuZ(M|B=`GF0fGJbAqsD+0hBQ_b1Vt0trMiDg_xdz|jG! zA;GgMNVBC0*$b(*g1)+p!9}`I@q2D>?%Jp9QpG4`<<=$pfaT~BeJ?a~PMZlGbiz@@ zy-9jss5(ZP}T>G{yztzI) zFT&k+Ra9CKVh^am($afpXJ@&ql+eWRp8N}ahp6t*EMc0eDb>YdK}6s4e#7kY9(Mv{ zj(!Bel^ZK>{(OT@y_6T)qqX!H(qUT?bAeK|Evi%-ckUoBXhbT#;>U*%A6AKIMm$!g zf~*uiezNCBpKh$Ltllu{vlO7=B@j|@_Rm>r$*9VU!@{(InB5|y-;Xhdb}jnB@l*H} zvJn}Jj2n)eM<2cp;YCq${|?%AS4I;@r=6nh&?=kNt8r!qM+MRmRs0=C;?3!FIy;-4 z{B@FTFq&Zq&4ITWJJ9*LEbkt_yLf>%waJv04oQ zxhs@(6$Z>mhSRDv-cMj}_xm4zIC^;mQ{=gF?aI7+8wC%u)^sdFWD z|Nl8S$-e*q4C_fmK~!{GTW=gkc0N_rmzkdXoiilGAt_3vY?;>8@Y;^;l`X?qXV<_k zkcS`v@)9HuL4f?H1jtK*AkJo!ARF&$wUVv1EXrQVyi+DQocr``rtejG=*u)oxiJqj zJw2GJ@0>d4J71kbd^H7O&%iz001*HGwpW!-S^)8?Y(;(&xvUX7zjx*Qz<0U66Oe>6shNZ_{qor^Y6d34U01B zn6_=0n8Kjbqps&V4ln>OoOXa_*z)#L=+9i?yrxUU*KB;~Pqz~w9{a^9A~-090kMc% zgx~}uGn{f@fayQ72st=qG!}GH`gttoO5x8Cdhh-BKL7Rqow|Q!VlOS?&r_PvB%Htt zQX*F^Wvj((wfOqA>#f%D>`XnE%~@l!oGoGzoeYj-MWrt59JdW>)td{$-eAz_SrbF+ z$)>6svTo{z?@8wk9}lOekUwvsaDm1oHiS5WcuWM2VeoxFh&<7c!}BlkC=!o&F$2WO zOvsBusy?lF8D+Ift$lKGDr-e%ID`Hf=)*hF2!{0Be%c>Bfv z?c28ssa!o@VT>*>UwriFi|wtg#Zz(gL%^RpLhY^ReMWu#WhGe8KJ zNou+#w|d>ZBSXT?k#~5SNo%Yb}2$vP3nMWh2)oSL%pe~Km(+JJ6u1^WZ57#n{*+z45u^XLg zirFACfU0TJ0t!Jkmn~FF$x?RaQuFfq6-Jz-MP>`N-DjJXQhDXl%Esfbzk2xS(esC6 zS3Nv=v46CaO=L4dHYp~C?NKT%jdlIb2X}w_=zlS#@~{WGlgky#%Z+34bS1&CTnia%b3%S{Yojq!Lg23Yh+8TVfv$5SiZjUG9jFi?o6)RoBIpmFLf%`Sn4ZQ(Cq)WwyT2&)6VN_^qwAHcuRh**QeRo9T&%NaZEct>^S=2%)n=v%PY&WqD(_S zkAXvgG3GFEcq$ABE)Tm~I|0k|Q!ol?F#|@=wlolu5dsqF(;gavhhcYT7a-&hG>k>Q zDiVgEsIDoM%Z6e2Ur#3h002Mz^kcDhWdxYh#SD=Xj-jso&}6 z#6m($ID!K%8|!16Ssd`3ggg63YI|6itBBdOZJ5@?cuBg7+W;ZJAS-f&K5#MqL$IF` zf^7iC5Ci6Vj4}jpd3AL#8v4_1E;e1qwH@1ESg*adF7SdnQW#}~q{WbJoyydHmO%da zqC-3Z6A1MY77iSN=X%q2Z4{*%1Q=~@Zu(^lLSbbWUYsagxV&6jZCYt%ck3I3kOZll zuiVm^+Us`LR@OM4S5*0rM^BZ>(4$nJsF3uqP5^HYgcdV9qvkkWI2{VMbn$86Pa4nbjP-C=8A>-(!9r*rB9~y`I({whhq-OW$@w< zA|xa{I4E5yV;(CNij&F2Uk!8fbKPzS5L~(X%J%NA<2ndqALLG}t;n*UUkS+w%$Fn~ zwlqSz>EHLAHl0b^wtZ@tu|?p~)6@7N#uV`W^vv(~U(7Y;N5hfj81~p=h+&I!bqA%8V>>Wm%4n3USIYJ3sND^UxH$Te z2(1iz_>r?`{akkXnjz7d6Zy@4?v8% zsaS{~gLwU7+YU@4&s0}|SROtbK;t*VJDE(zwjD8@l#03e*Dmh&o))r&=l}S}#zJ#E z)SI)5wq-TyjgdS=Il9sQDn-)WUI$ZrX?gWU>xD?fZm$C#WLS2)yLsnFAFQlg`qk(E z(Le52X39^tz7j~nliXgns~Z|2ILqe{!`0FZrr4kchj>JhLoMbpW28|G$!xli&MC4S zB;FYMfy?tz?hTZ+0DXjfHx1>GXs;0?j0hnCjtKd;A(&NKNl)6$%(nlJ0kVk3zuq}b4j1@r?7(uctr|it-)z#h2U8X``>o$vv zD>JL((Rirz6C}B~xYXWm+svueYn_v}Ac~FZ>}WJ{9NV)!8#%RFeb^sij1j?nLU3&- zlA8kFLJ;Ojq$>ovX5^ogO?6No_t<2`WI{?x{azm^oq`@ZzHbah8No>|)XrkZ(ii}Z z)Xk}kh$6pdVN=bSBo>W663!q@2H`UZq4Gj~_Uh7GE4NmcSC<2YxlqTjqTckAY7VT{l0ymj@7x+{M?24w$jR%@|vM}u1f@NV(PD~UA=SX!+buc zDvDv41d)+8bS&F4tVU(_sCAex7Bo%um?vwav8w}s|lq9O*+{)hPBTp}Z?N;H0=rB9%~OHDGo;u}#ZRwQ1)X zkE2$Gg=X{nqr*_zj0vs~P*oJl&MZXZ>`n<|i~>-~JQle>03%4`&gewNLeVgc7-bA9 zgVUkuY@}k0wcG7*F`Q4i;nD_V>XYnpVqe)lI(cDH6M3*uU0hwe+&XFzjK6&LU_=KF zwxtuZ?DpFjFFN&rFp`?v4>>i#eP_AmeL%cl-QkZF4Py80mVY;_~>Y84b;B!_U(5cK77EHQI-@^Li%8TA7PZs z=WN^2Rn7M^ObBBX1i~1z3==T;vhc6z*T|WBbPk-@gV{SJ3 zs#dFYJ00KQcei$C8g+zGDwP5Rt>cy|jyCq5{Q1xSqR1CN`|LB5nM>(q)mEPN9(yUT zFs}5WldtC0iCWFn+=(+^ZI*K7H?F<8v$u7j(fqg1|8;wFQ_Lhx#UO|f%&j-CSM#;y zE6dwETLW!yaJ;urTRhx498HFcvrCGmSf;7ln#dB4<0M207-X`UR6aG5N9s@;t2)LQ z6YRJ)h#Up#F%MzvH(nxu=~D3DhZ)!pt?_XClK4ZXzJF$$#0T*I0RRC1|8>p6T>tl1NI{&AL#MZP~HoM6u<>u~QpK_L5?;-E?=0?V>=@ zhoak}MbQFH3j{4t6pNyL>O&v;QlLP)+icrKHb{2sB(@Xh;=3(bmSl;dE+oY}Im5Y} zTOY_FDck8lkSNY@2>j>Ff4=|wzW-pTw6=?=*Xv!;?^06%c(nEi2(Y`eyKihkhyH{J z9h^7_1gKSO2%%rT_dzHerj#^H3jm>M8s~g%WvyDS&YzuEqsq5l`OaK&?&#!kz(CzK z?1Ie!-!wNUp*A#$MJ%VGA^qs&@wa~eZ6?Io`Ilcfxv;gH-pZuH!RW@;x`GrA1X5t1 z+85M&isi!2*6ypXzIOTJk0OzXTX7xR(E^%|^`1~qsa}w*pi}(NcPycIYdnX)@RLbR%@i8gt*XER(nWq-fksn|&8BZSQ z8JZeM7L7u_ycZkoFP4gl@Ic8ZmKwz`ZhZ0fkN!HHNd?rNvAzSFsg+W-dVgnQbad>? zTc6#zbCW}%L;s)r?w^+{72CEy{rqyiQYaP*KoZ!GgFK|Gx?tkq$oSQ3SAZsjD^yLz zRAPitN~aDb%f+ey+$Z@mySs|6GD@wwDG)$mAET_rueDL8g!Y+VL?^iWq0T<_u@xIn z1#91}6=&cXv%IPbB;pCfFra|m@Xm~hz{ID;s=h>E3HT^K4$Uf}D$EJ^e`o$;t-QuO?50=x*2C4N0`x#{` z4_6NK4b3HwHb~>)+5;WQ<0F%%*>KFtxwBupar29MtriMJ6je!R2UeF?;zNm_y!&s# zNDv`Zsh4C$0Z7=cO@JFwB1?;l00LQ)u}|{3S|k)P4HHLDqIXd9>lSIaHld6`01-lr zGU^bhV9=$Ucorb7;X{vB*Cvxw_wU>@O|w$15-eutr_DyWVK)eJbSLoak&_>O zc4_X=+(vrcbzO>RHk)~{xwLq1(E<&lYMeaw{41v}RO+RYSsfpnf*ASqpep(D#li_yiUh`Tc&oZdYkV^Q*~`nOdVV|JIMf~ z_v_Gsk|dSNML~qFYL;UI04O1hP|ld{*BBISKF-5D9nKigPALnz#y~I*NHg>R0MKIV zT86l`cmUg=96*4f?Dq$k*8nhnNi-7rkEZqyCVm?X>8C5$s60O#DUH?Us;O(Sia zKlg}X!FVehw@WI<0rfOz2moyHcc`P$Lx@^pOCS&+)NKn~EfmxhNKY8(LOT~PUR-&& z0`_0`Slqqu1^|HN2g~`r{QbN47tWpu1OjuXPx?bW1AVcEThHxe2SY>8CFg6rS})Wm z4o)ga@%#L;F2DJW@2;j+Uq1QD?b|m)YG`Kq(5>6olM}OpkpbDSDza+Xrl$I%k-k*s z(V3Gkjl@Q0rVp*AR^)&TIN+2sMi9gt3rd(nZI`*UK_P<&Mu!>g1QmdBK{;T&WpHkKII*YK zL)3c5levTd5VbaJX(ta1WxPMK&70b)3&l*Wq)|KexNH+am0m{w3kLOoYI#KH(0;Y(Gb!gTI8B zN+wIC(o>`SRnc!Agi(V!C6P69MtV1mBT_sNPiIrIkdcfd(cZzq!OZS%C=~kg+UL}y z!=od6)trDZ+8gcb>3{X**TzRCB5E{O$s|W+j?J97eg9@q>$!a8u(?uiq8zq&P`pt^zm?F^ig(Ydw0{P`yhmp zPx`yJ{{H>Euz+;xeYh$l|XF9d=C4f(g%w*e3WbIzH7K$ZN& zq_Qd%^7)={s9Y)z4h-A2-5-yYas}*@DIv|pfVhM))|$v%2*L#wfb&lMg*{0Uqrss; zv(f1EOG9|>{Q12aIMgc*8I2fBAI`_(pwMvyKd^fiZA*kdlLgAC+Q|s&N_io zWiAf{55x!Jm24%Rhz}$N%caut!w05m{NTI4eIPdU?xmkMETcabTfX~13;WBZVz!t` zr_uxxMfen-+8gTa@9RHz@qB+gRxB3nnnNsiATbc?32QzrpU(po1Oh?Jwy8rYB`$G^ zYD z;jMC|^!(BJyUVx#@<(rfaqBbJbc8C3`NG!DcCk_{H;Q8;#%1|g&_1wyo^c?U{j&#}_-MT3`KKATFV z9@m|`Ni5nM=yF*n@LNj^#?3 zo$?N+yk4u@qQNPTgrj|Z{cpYXXK%jo{U3bqhtD0Gf9KLq5XGGGnpKa;y*9KMp$*&I z+uggDx?3q#s?`bpuWey|=6$lvwSj;7#+1gA?0)PA4-yt@^60$9Ob#?Xr zy}Q+Nt*>bOrG@$?5nTs#IeD2zp zpDaB4;-%}qI=^tisyFUGx;uVoVy1s~J`ACc}EiEnGTe^z@ zRy7qNeEQ77?CjxOHdn5esZA&$j4~`?(Ao=803d_}u`aheVLFQ+^m=2uB;e-neSSLc z1#d#w$2GFnS&Ss~6;XZK0lU6u|MA#`wQ3CjAjwi>FlL|vpiq_6&C-UV$lS-`@feiQ zU;Ow_x2x&nvnQs8ldj{A4vzirr@t)OdB~7ym@zFOh|pAxBR(-USuYtx5K3r&EQTQJ z4<|mq`-uc4!!fR0`4~WfbsX>o9OSB06&wmA1QDc8IO4jd>$<*|+f!Bb*7Y0ZN|CvI z{n6U|srlo_jwc2O(;J(VP$VI06V7?FhJp;>pby|qhjGUf1)EX{NG6lTVi6($Q5Rp- zwmphwKTEsQ!qa`dvl!w30{{U3|8>HM5AWEVb2pl9pko*e**#Dd#PJkc*0vG`zTmB(i zc4EPHY_GJJv%A_|F1fS3Ipo|&_e@{aRh1vZxkxHW|D37mL4WVntM7g9RdrV$(7t+$ znUW+mbBB&J2)&v_OXNG)^9CR)a%3Q3V68tiVAPGX=g#bwc3*$_jYKq+D`c-+|2Yne zzr68Zi!)~?#-=1ma+!N>`muWtK8^d5HKC$8RoieD<`(khoNKyoy!=-Gz(6XI0tY?! zh39YHy73>M{NV2GI|SPypBhpll~R?v+_4=>TtO8iEHlJZMI9SB?(_Lx`L$QCUA<-* zjcP^P*x86h<62cK7fXRa;KCCZBhiRn(~O3(A6x`3sFL85x}R6XxO410LI{Cr87`w; zI^BL-o9gip%V}?_Xa#*}%ll1u8KoFR1iUM@^hTZ8+1XsH(%YT_fndzOg zrdF3$HK^9|RYD1vNUzq*m9paZ#3S*{=C1B)50@Vv8yfxOlPkc0O4KZoz(CNg(`aAJ zv`yCFenrL@amF3yNFWWShVR_FC5uYKtP|H26robC?(XaoO2R&jsaB6XW zXKTAruOk78UPbVTUD7`=mp1uQt00VA*X@byEscoSq|5Pp&*AOJJk5%j&^rTq-M^4; zoe+##=`{dxoP(;|;iRE;yU1XYd&$DWJZ9qU^zCZ3Oe|-4WodG3>c+k6iEwfvIoV+K zh3V6O@r^%|xgud1Q+$2nlXKIL>Gir{H6%fHY)1}=4_8*c@Z<~Y+mFCOchbMQeeYJI zY%uIHjd=s|Qx~2QndtZUJ&NMkjwLvhaq2SefNfh^tvYgSJfF|iv>N9e81j1qgU5zT z)yl(1>8;JpL_EH^zTxxxCnhIP%uGMHx5Nm=L8TjwR@YF=;adXH<;$1XSJ#`+w`e}J z3S?c-w|=yb7zY5r&0^b;8r(rv+A_ewh|i&C%R`qfk$?iRKBlt2`}41V@X`0mg`#0L zI0vlYb5oB$bK$v@6Q|z)=-(d|9)5iFmw);8Ur&rqUcGhYnTyZGLa__;Pd&c)_>DW) zF_Q{f&LZ~T{?*ribmjYoW2`)UP+qTE)KtSBf#P@|8dC7s@sp-uj0}!eiiMyg3X)pa z>at&?HWOtr745HSx?ZW+)KNWNM%c{!sg1RDm$-<7R;?}FU#jbRe}8{NuZO~+v**uE zOiv23SSS>FAGWu=#W--jzP8>eYPI(iQQp?rZ0)RX=e8=^xc18E<+$}KHBJ0BNe?&DXZ)Cd^VTM z?@3Idh?*6%R;dx!i6vvia?OfS$Ziad9v58Z+BPvs#Oq}M`D}>;jE;_*rn$Yb0Upk6 zKpv=M%bYSn5IAk_VRkv=q9T`zrIqCsRaIxtoZ<)sEPVdrQ`u~`rfCPj0}gdv2i`hx zfweYb_9jmUq3_9un+E7!gxiClOK0wgKL>eEy`~M{|GR(i?zg`E_qn~? z6N{J98)?<60)?Mk{jpZAIi@2BLNFMb9h>{-@BL#i6j(_wSBjNXVjvofMMBX+HD4+g ziQxwQL5o>RSg|U0DwXtweQTR(O4-@P^Gi$jsOf(0sY|AAESx%*-dZypOAs&uZmn zdu(iE6miJs^ZQ*996Ea@n!Zna6If_xwcR!Lb|SVv7$HeG!u^k2R5=d>gFW3V&`X~V zFUSZyKJV1!h4Y`Ax2i@u^YC|H`n^-9=idC&*Y#oz%Q&LMicSs`@T%Taq<<~H>bC=o zaGljWg6H>t^N*LV-Isz=Rj=Gzy{m>*tx~gholDO@y)b=RYiO2j{OCVFlt8J~EB>(m z%=G!2w{M(VeC*1#U$}$}A3N3;iuNZ58jbp$+n*BGYG`#1Ajy*5a3~?N?4d5Dlpqi& zbr~?`GGLqoM-rCfegJs!*)Jv&30<#;gCSX#3x&da?|-Kkm3HZ{<=4=P^1K5P7BHo> z)6&5AZPB#`bh+)3mp>5bALuW)UjGB|e^dgR|LqU>C6AgZZzmJ+H(&m3uh;v-AAUGL zvruuW7*I{G4Idk>R;yHYtEDQY*e=<&WHE!M#Gz`bGJR^MuwBU2vRKBoT$MB&5Mgg` zZ>WEW0sYxWKb<)-w=j45#TQ-*din?>nZ50)@fp82FgJf{cIuR_X?wfb!J#4Bvg!>3 zkbn?(3FVY=%CIQ9uEROUSmK-sSmcahpNs?nfMZnx4%^$?$y91E*}uEDtH??)5F8yD z$rlQpvs=5#WtWQ6MMeOc@2xsK9sqZmUV3D_BZ^#(ZT~-OGS5EuY@v{MhywtQLlB_8 zV~IOUH`caRcXu<(kCy#?{?*O2LoK6fHjIV`D@Z{c*kE!{^oR|uA&IhWTOgpdhiiI6 zC&Z~~)mR`#8gyo2*5;;&WmWVIjSSDvE$n6XZr;2xI56l_eTHES_754RQ7dbd(n`6) z7|Uj}xoloQg4r;D0wc^NM8pzf`+J}TB)BdSKyZl*0^)>G3V6{BJ7yK%>6 zSX*0bqK^;)&P7>@4-DC$heP29n@c6Fw3FXXq>_3~a}389_7O&y;?gQLP0OW(Sgz|3 zMfA9J8t?^XPoLb|+N)?~F7RZizoJ!+4UKGVZut~{Fc7?P?YiPsl8F>XSd!$;&5ckv zcV(b;tk*F#il1N(kv$ znY*hrt($cEhXG_&85kc~TVEDrkr7w*dWq#Yw(aq%)5CL9Bh#WInYx9M@P}{y$=vaU z^{ovgp%ddXUhv(z`rlQnEQe%=IUgu!4 zJpY3aK3H2@#Ta`ORoC=*ERo&I#^MQG)2K_mUTU1ccfg7;s>Oa>|nf zDbulMr)L0=VHhW8W?y~z6#)wfQ2J4NadENvoPFWG)zwu_8T1hR9`3)dm9|&o_JCH% zI%I$&(LWTCqOquHng=b^WyMZ`6Cq0J;@Q(&_NaHJv7ugo2@v5H1x<-iT^9Y}r%*^SD1z)QWmlr-C~%HMzCBncvGh z#Hmy&$#`mSXE$5e3;05MRZApNjB-MVWm%FWDzZW;GfYFT)dY;&g0LvdvM388mL!Q% z#wf)YFJ3%9zc9Zrzi{HjiOKQFa477$?rwI^w(ZMLU#{!AAYi}W&l$UY>sC+v0l*lu z=FM5h&AZnF-uubE0eVDDv=8C`ViJT9A?`szq6_`$lQYFqsr}VnCZh)YCTNvXsZuV- z<4LP-4h;-#?{2>RTVKg#aucIdOSc~krG`qG;@J4az`$Tkj&EnSbxSiEjX*G%8cc?z zh+!CxWoxAB_XKrAj|Sp>;XcCLfG_B{#B3Od3DIZ_01XZfXEHk;k4Kaw!)O?W5svg3 z^?I}5g=L8|E=h7z0h9!pQp#LcQe;MXrj$)TO5ePB(=^RoJ|`eSQIye@imorOF_BiSvZzP{ z%Ft$UEf$Cuvc+H^P|)*p^YfgbVj-XE?>BVw*wCn|dO6~cR??y*>AFS;35UbYQ~n!` zx+r1}U>XK>DWw!R2pA&(=2FHO2ktr!M?hT{Bmv2-_t>@BBnJ-Mqj)US>N$9&+qGLG zn?$yU1$C}&Zi=9z1sy0Y9Kia>)%d8v-RSQN=dJ3Us(1k7!LdOsw*Wwrq`tn0BuSQK1_A-sb$tO}KAUq1p_BnajB$j3Q`VmI#376^MyUV- zctrqERn;YKCvO4(&RyajK{s3A13)+wwhWVVe(BPs&5g|?aPQ!`58(d*00960Au(Fj z000VkNklrNmj{boY-OyeSG)tvYrCJ&E2hFwSbgad>C?b#)Ibc!l`vAaXCVZb&a{*jIuc1J`-`%;ZO{bI* zEKBAl0T4Nk6EMN)>1kpGCAi%{xN=m4%@z$Q00W%i=dUJKv((N3}udX#oK&!dFySM-1tFKF?G74%m8$TW&S1J{6?iUJ$;3gf%HZ9}2 z-?vQD&`lzc6`3(ch>|1`k`O`&0Svg$NgyjKAVp6(j3l)z%hTyJ0WCp4?Qo@H_^FUX z2KN-zM;`_pprjtCx{y?15bnE61vuk1%w)h=_<~fqK%6NHXUTwwY|StoyLD%ErcH-u zgWY?(tw#Ip{U?@Tjb|fo?iKSTRaM*VPBCBVw7P36?epGQXT7UWXO&8=S#P~{|Ka7E zt9$$RrsGMmT$B~%`0%h$C^nkSx#u-ko5SJ2Fm*(99Y+XJDwQ0^AtFg)gh)t%qZ{mw z52+jpIcLRWt3+^nuQSH}f*TB3^h1)*Smz6JJI)6z zjpfk)f|^!LLAKFTefa{g0lWygX^O+Xc1w^n+jj@5O&-Gi{~Wc-?y)lpQ~L=bi7r`?l3; z&2*g$PDGAvm&#?=b$#Ej)oc1}7R(ko3NDCHa6tlrK~S$iNURd>myShEx7&U3^*6;r zX*d`V!LUC#?Y)Mq4oDR50`!om*^Hsc;De_hT*MDYAz)!?Vp^pTrJ=teKn+>)kC!Kt zG0vVqku$+SlBCZ4osa+e*?<1^4|`(%?Js{X70Ug~spDzG{$M;Dk)ZeAe`=Zr7yS6> zs8*|YH#XFqa(;f6Q}g+J!7y|tG2x3ssqoELUn7cItqzR&o~Nqnpx;+iMF?D9Z=au? z2h$)TLK0jMV!#IwwJDcXg)5jb|H6GQ5uh>LY3S3Ls|Dy|VogUUZ;Uqs1ssrpm@y_R zG67{MonUh-X;-`;f8xJn87@g@4k%s{BC<4NaB~D`?%huH zS=?_y|G~ot<8i8VGvzSLOqL?nOPUa;sXji|ql`pa@rE+)#%yJBOpskLLUMIWc%pr8 zE2pZGkZjl9-rSi?CXXIHwhZg~`f{bw81(zQyL-BBc%J9`o^9Ks;jmJvOtqMejz{B6+&)4dDAECm*onzGoB2w?x^Pa zmZi;!VwK6lx0Dys-%LSLczDm{XgbTy!_4-1`#rT9q zV`Zkz(##|Wz07V!A5!QO0b{0VGR7LKP1ki|E&uMpf$KPPZ=TTs3;tc2cES@FA(~^Y ze|DwROO@3c`e>WB?{nL>BuN_d2mO9u2wtzP^iEE$udWbLk{IV))3m+){octdL)R}Z z&Ku39X&9wa2^b4hGyo7GAt53XG6==2-~tI5VC3Lua-|zK$z`)Rr(1?p86frN~Xr2N9k?+pU z@yyXpRHa6DZDnP}cI??~Cad!1=9cey_uqQU_x;18Lq$;ze)*oP$d+vhAqIoNgNG0P z`NbF4*VioIDhf)R!^fDTKtx1==!=A^!j1z!1NW381pvSM{qIg+pO#9c8}m`WefH6t z(>L+kPPc2!ZYUa0t}U?}9%XpL0;I`*SyC-J1hE2$N>~#QkY!GY4eDq!KM|?9-1^>D zz0+FVXbXGp7*?yf`onkMZ*;rsosKv6G)7^dO6 zE-(O~a90;F5(q?yf_xMnCxHo>69B>X_V#S5Wh_g|I`(X7!m0dH^3^T4-v)XNeG)EX zELE1mmVTdAzri_-F<97H42y)rVoFcc1WS&IfPpN@fnS>RNy}a;Unuy#Uv5+j)pB#I zBgs;wwPI$t-VMfJB?e3$UbK7z1FTm|hD1#Un75y}755)PH?$ zjy3IkKtf28EUOA2F=X8F0fY>D^TeEsxzAmn&pqz?!t;>}6oLeP`uzFf%R_HI&sfqi zD*$}>;fLqv=fL2}J5L7v!A~u~jWqq!AI31moD>A-Bk~W%{{a91|Nrr9+F$?x22n{w zK~$7o?@|;;5dZbEXMl@x3mj#@z#&1QM5|0tULeUAE3c5`Jwqs zJi5KQ(tG~f^SXH$(9Ko;Es2SIVr8ZG`->O;;nec%j7e!TLXSa{5$O6mHgApS5Jjix zi|x_7G)k3DfdoY&3M>JR7_bNLpi`<@UD-#W1bTsR|yGM zmgVT|-Tpy&R+huj_V#v0*`VJ~5lz_K+&nos8TzLU0p9aStHN>~$LpZty6l<BsxjXA0r*n*0rsiN^ZBwVyG3V2>)d7}Qmi;jLjuB(uU#m5#k`F6xzt!4gnFYL{ z>#LFwY8S$42nV7(t0Qlt4FF8NNiyNCuQPrBKFKQHt)1IH-n%DI>Znemo>0$2N3)%+ zX7hc@a8-z_5pzrfA<`v68x<-9iHl-8%N-4_46mtsl7LZB66r1$kU6_P6NB6-iZPt^ z?f2gWmEs)0`)(y5imdy2r&b}Bt(EGfmpq36}b&5H-*8teP(8+x7vI7^Fu{t zw22|Cl(K`JgRU9a$vB%_*{&=#xCZ9(q9_IfG5A(b3Q~-MMvSE3>__X;0DxAW4~J3S zHULYPmR|3^4(2ej2Lxd2#@3^Uk2pT^oAQw*tk7U`a*~a{6{V^~10b63&JPBI(P)HN zDx-&)#P-^_+Rh>LG;pW;g8tB2;B`XG+A&f%k+maBHY9GgHflmdV}mp& zMQf9B11K9CR{@-Qj}S3!8shE!xBDa6aB$9TY;M5fGP$baJ0egwP`ehn=C`y3}ey+vU9wg%jqT6w4+e`+p zb3zCoJ`BS=4a(A2a4b?RS{)w$^4KU12cXyMwcBkzubbdb25Pc8WbSJS6ZDwp<%w9` zXPEwYnsdz9^&HJQGeMMrG8?Z3ng#hV(d^OjaUigGP{f6_iD{G5893QWXRcr}|ii3Q=o-~?o83)3bh0{EG{nY?d>sgb+@hp3B&6goO32&wqE6bELK8bpw=bh z@#@tz_cHH@*(0Tai`lc026d`Q8{@DmpU6jN!GcA>7fD_(rK^EQ2MMYCHG781iOPmV z$m1K=*Vmsuk<3VvcHYh`G8Lt3x7$a59kp8dkd*;Ibn%mme{zMc27d&?AGLkVzYR}i ziBgg|yULfSbKuGn-EKEkO?B9Z!^q}+wb5qcr>b_6mJr&6c{0|D*}`Y}r;L`CmzGz1 zG$HdK0@2fF&%!g44$iry#YG(#5^#~|mgD1NWEc)dtkwWH3_lE8c}uPAt=qT!;BgSA z8qa7*`632}@(?%_@y@%+AgFHy#ZEDtNhe?b`0{?w~&yM*xeR2u)m%mTbw!h8u-(qML|y zvD#U>1p(KJ;3V~XC1mxtJ@-+|m&uSSz7>g7g`?U`$m28|2`^^v!qQzCJ%+EaF$hlDO=X`Fa%z zKR$ST_~bAbR!3HDFc{4Log*t%vZRUE5=S7aZEMVTk3TxUI49XooFsF{ zZS%RS_so;1Mp zo6U^RWblbBP`1`gpW$IZ=Ve%d+NURrpleu{chIYIpt6dTsksXD5HpF!P`EHH;&So& zqL^$;zluuc%|bp-)9JL<1KktLOsgc-)@^TZpUq~vpAkfo1W5_8C@iC^uzF6*-O1~0 z@^9oeip8gtb&PUd-0I58J&;buAEMEC)b?9)qTZR_*TjId-L#*rRxYX_XC3rROkg`Fe2#Se?ekH=%VoE)~cwzRj1 zxu9EGz`GTqiUkz6y8Go_`wnclv_k(w<#cm;^6Hi0;1qX04GG?85CnMaKiGfz`_pj0 z$alQjTgL;?^FplfzMBzoeXef z`fY1gZEkF40AtlVgE+ zLx|rFL8DR4@s`iXN(Zp)fAwIcZI_&r#{pSLkzs3xGfHAloZUm@}JAh#$B(ukq_|8v?A0V z$^hrp!bD^AhiTtgd7QLOw9nDzr<=!r9V0}zH`;={=?i#r2HZS509Gc7&Ly+~n_vn9 zLyfB>J&IB>!rS-)7WBc-2gMx;z+^HJt-QXz&L1O-sFa#hpfL_d7v$AXnWGk!$p>HwXz0_5vN7C{*SPBhv@HC4(=_2t zQX~E3srY}yA79N*3TL1t607*qoM6N<$ Eg4=U(HUIzs literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/113.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/113.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b9820b4093e5765053707cdaae4d0302c9f9ba GIT binary patch literal 19493 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/115.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/115.png new file mode 100644 index 0000000000000000000000000000000000000000..38a979bca58ab0d81bbea7c8a4c2f2e15004333d GIT binary patch literal 20287 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/117.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/117.png new file mode 100644 index 0000000000000000000000000000000000000000..de6b36682c54e5e0bc5635ff5fe2a532e1fadbc2 GIT binary patch literal 18259 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 M07*qoM6N<$f~&?8n*aa+ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/119.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/119.png new file mode 100644 index 0000000000000000000000000000000000000000..9add5649e72bb7e3fecc93f733ff82c9245099fd GIT binary patch literal 16685 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 IM6N<$g2Uc^Z~y=R literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/12.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/12.png new file mode 100644 index 0000000000000000000000000000000000000000..b0843c25db71d31243f05907b37ced2c74ddcba7 GIT binary patch literal 19904 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/123.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/123.png new file mode 100644 index 0000000000000000000000000000000000000000..1250a130a230041d25e3cbdba4d46fa0dbda6a59 GIT binary patch literal 19528 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/124.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/124.png new file mode 100644 index 0000000000000000000000000000000000000000..b0cb288e73e616522d911a63bd9adb56d8f0e8da GIT binary patch literal 17090 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/125.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/125.png new file mode 100644 index 0000000000000000000000000000000000000000..a185f0de33f7a9ce0465219a7b0256285b37bdfe GIT binary patch literal 18013 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/126.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/126.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbc86dbdaf72d49da426c96c07eed84008e479e GIT binary patch literal 18541 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/127.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/127.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4b0a861569bda1fd13839e5eecebd7db92c53e GIT binary patch literal 15580 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

j+5-OA@*P_nc!epe2Ak1PUv?COXtK`AWH==z< z0Px)Nm+#-dZ!Q2N=;uWvF>CPx*pLvSQmz3Lb{TLBDfvYZDk^n8Xas2O z?&@^_(0Duw0v`Zfym)ap{%Rr+2Epc*Lciec5n>gsMP0e{S5x)!6zDi}l!w0AoNn#4 z6#v1102A6=dh!o%|MjWUmaD`g1c*3D2?PTnfB=FJIEV2_j>ZE7I1Iz_coYOt6miRP zLhc>x?*&1C5Q&5UiF$)U82HR$Q4~&ACqMaQ<%9R%cPo?KUKbM*gu%+{3aL&Z5EoBP z|MB;?w6V&`$!hAKjJZEDNYdwStU(d??Dc;D009607{-B!000UmNkle`o?+1Xut?bwbT2n0d|0U>VUA|!;6kN_bh1PH|Kg-0aB1OI^E#V94EHd z>+H_X^rh~Hhw1L=8P5_?>WAs-?&_ZJRGs^&E(>wP!N)a)yL^L>icGpuUVH5mS(Xi5 zQpo<&&MO%hdv>a`NE*zs{aL)ktR}-TUP0KmNm?{`~u2OCUrDjs&b(C?y0Ba99It(Kbj4 zfZ$v(#)y&-oH6EXODSosQi?+I6hqUr<)kdid{teZo<4c{`@S}ZAAQv<&VAbqvt$=~bnKpUPFDiGg;ftU_MdK#FyuRK(_pY2dVaV*I_raI zi{{&uxf1>EPxY>J!P(LEU;f}Hu0aeyLX7B^PeP0UA$Wv{;K3L|fOjcH0+@5&x!}D6 zm{eLy9iz|lvM98*6%Zz6Uab}n-+o}Nna$=>>gn|0==j>JuYNqsvWtszCFT5J7EF8b z;Qrw&ulC{DOcVIky zw!VoH0ka#oe)gN+-8*4|!x;cjqT@eYblg8CC<(2hHI#yo03(2kqEJ#X#`B_>OeP^% zr9_I>m|9681Uo!Dc>MmOhwr>igt9ExzTzw^q?AWThqrIvky75eb=#WCo7UI$7ryb$ z-ZI**5C-jIFM}``gWH{c>Ww$9pvNBc0dO{G{b1t=<%SX?G-~CX?xGe)p9>{`N=7Loj3+q(CBYK&no$Rtk9rF2EVQkKQ@0c$P^@9+ZS2srY<8 z3!w&lmSxTvDP>U>Ojbe};_>#G~4H2C`2XxyQV zjOvj?1dP>nGrRH9m%shp7{P%&0|=Z!0|C$sHbHO@Aw-xKt7XNwBqFn{DW#aARyi27 zRzxubLx~yFJb(V|?CiOB;pq69X{}OP2p(fdF#>6|x|~kuF?!B9r6i@y^Fna$ycNKc z_a5nT(sq%hz0m*Ptt)fi)3%h!J}qt(wHPHtY|*wi&w9}Nl|kzak*inPp!2M|xZu}c zd;NDm|E(4PhqcHvaG>f;8I&3c5P(wf0wMZfoRkV+Ap`<3mWW6xLFDVYuIrYu)V8*1 zT4%%2F?TL#r6-e_l(Md?rmn0p)9IXZVT=(%5J)NMtR==M#pofV>|(2Xp&tvpp=W2U z(egWr-Nrz8yold31Dqd~vZDf4VBl&wTzX zcdj3CAQ6-T1FEJocZm=@(mHdJCbCSj7V(9OcE!wb=Eq};%Rss4M2{z(!7@objxWKj_sXV^+`lmk!pPH6u z3W;D1f`^h_3dmZ%#0U_x)~%My7+F!2jI)%26r2b}nZNt+;c~TX8>5uYvZ85>F>O&Q z#)S7VMbbJ;1jbldPKe+CE;9j&cx`gwOOVQ4`(5S^A9dKmy^kSja`-%WmytY)6`Pwl#($<>#Qs% z);b}SwMHrxLI`!_oZr3o%ENcwAxeyhAPx=>&!4vcANn8K_Bz2vO^&4H5ZYv05`XN& z>44|hSze5Hl^i>vn9Wdq@{^RG{p#1HfDlOi=15w@86*M&)~Vx>zyQXfRo*mS2<3fn zF2qQ6-KHdfYOz@6dBK=4#wjfi4(6?KN($?2)6|?xLgbtaA%qY`QKXd4&llc%?_J$g zKDdK}1J-SfOGs%|Uyi=~f3z3b`siP8BR-i->(0BkmmV0xENpwi_Tvs)wsDc?CF63) zm(Q}i*M)|)vBRnMScdt*;r;*oTQUG}w(GV1CKf5d+O(Dd&V{x$A*Q0pIVWpPRizNX zz>SeHlJ~(FA0q=;wQ3Ua>7=yIn6?3sQVQN1(|Ye2V@*@nb(LkAkURuetya&^PM<$N zOT&IEgEmMcgc$o*Mt^|-x_$f3_F5l#4YtA_3}74d*(MKjBteI+UZd%TX6S3chf;T8 zedw#v8P;2>?mFH0=rz0T&Ck9GAO-)u@BT2;2o8@Qd*=`Wh_K#`Bt(jlLL?&c!I{>! ztu?K+);i}tcpj?C6NJ{BaamPW2n4Vgla!hgRaFy0V4S6ttZkd73O@MY^E?M|adB>p z(Mk&`Qi`TEmy1Q7BP`x+??*vR$2y0RTd(J2$S^O-le#IDKlL zJ~76m5Xgtf7>hAl>r88`_0IVaJQ0Lcf{TxRJOk2XS{xncmzNhYOzK)ZejJp_C{apD z2+6r1V71JN!O;c-~Nh#D?;;%hWyT@*OaQ}g| z_5}~vi}dJPpE(EsFWX%$aTYsNfL3L$v!xR6DjuMNg^rC12Qs;ayw?!9vF?Ci9vR_{G}bnDKY z$M3)IyyHToL_`#v4Q{9t-P=Y$k54zC?K99uOk%lQju!{O{tEyA|Nj}v{B8gM3T#P4 zK~$t&ZFAhV5ncd%Kj|b{k}W4r{1UfK(s4V}On*c^Ha|4|2kGawGwpPyZ5lVREx*X8 zm*XAZL13}l4?OaCCn;&C7|n^p13~Zsxcls4vF8B*c8j87+)#&MPh)tip)MMmJG8m4 zI7uc|Rd&Y$BzF<|Jx%KBlf#D}e(aEmAn+Lxi-M-p7C=ZzdFBoe6951pA*AOkrIhcf zqR@yfBF1s7Jn!OSVXg5zB?XoxdY(I`yx1)bkv%E4r;y8Zv=<%rDz>BVH zk8#st+;G*UXAi|j4{SK=Nu6t zwuq)I7j0WdQ4}X(T`ga{cn%EKYAF%X)ip9xn(9`wMcb{H&F6EpIGOB3Q51&0?|V<4 ze)8hQ4}bpCAJh3f=VF3Ug1M)`bj4oT@ys-&g4E_m00AuglHH9ojhYTR(if98nw69KI z0RSR5x=fY!Rr)k=z zDIF$(k9Cb@iA1(-aj`@pjFjLU$BFTM(z-_HuCA`q^r|z1rBu7qXtMu!A5066CW*b_o>pA%xU-k8zzpbkKQ zV8Mg+FjB}Hy%*!2bVd#{12#HF%!@4aqUCZixu5ufJUWgMnF*Bw--Eg_WtnHoEYC7# z%JZc$u4(jgnFWEGB$GzAS(YJk6f3QrMGOMWbJW@rS!>br5S{gdAP5vOTVuaGROx}@`YI-jpVT$Az?ri=ddz<}U8gJek=Whc{rk%owboLp_SB z%kvAgs61aOk68f7wzYX)wk;-;T`8a}3n7H(K{9ckLanW}MhIhV+qTBq7OgIeT5Da` zO`G%xEc@9G_@DS&wl;I(f)z&`Ii^(cXwmo z_mmQKU6#c%O&4$9ywMuFptPoGs;aT*d_U^2J3oIno4q#{EjlIv0!(YN%p#&O7SSMT zrL5=6dnc2+DIHoOw$@}>mMs@e)3n9_fRs{5Ne-QJKpaPY+f>)s{VnKkjLiz4{k?tN z>g!>EH!1e@nL!5(g`o4Ptr9AX@7hZfh9U7+(=@%b8Di>~nL*H|lHg$s^0T*p`R?13 zgZ&ThofNtF=9@q4?@jNY+&4z2X+{K1gHkZCBDQs18tbG8giwgiITwZ#t=}Z^q%0dL zm5@>@WI%Kdz*_5sBuD5BUR)MvjkQK=-87XW#~_R`)R8R)W+F#~2+UPk|0w0##$gLb z02sUUZ-Jh#f2Cx&*MB!m)%A`X1|A|KwkCJ?&kZ@qH^fd~XE@mzXJVD6Oq_i1+h6|5 z8J)zFA}im#dGq@9>*X?Y2+m2Z#UhR8SLFM~+O{gai*qTZ6F{D?f*{asrKDOemqC~~ zBqD5Eqcu7-#FiX>@L=csd}(c~b=fpEGfSlaAP52wB3mw)xWk{ja0g;+i*59`=;OxA zaf7V?^2;x~j7gi&Z`Qo_HYgb%z+mpKbDYVa{ruB3O+_b$m^&Di@WLmAT*+#J2}PB}aXRym7uZ`S9Vx*=zHP9c2&q(bac+tHIAUYK7z#rt1bTia1|10W zl&vb9PW@yOy*~Y6kuD}XJ6)E+s>HHH<HV-A3uDUWto!6VL$g*d+sM6+L*H2`fZ@?UryHl`$9Um4T@$j>1Pzf3Xt;^Q%iH(wfMv%v$Hj4?wpFOj(A; z*t&8}jbUVs!6a6T#U(NA?oNA0smQX{S`&s8h8_TsLk8Q_jkT?iVsC#Boz+cqd3jzI zMdv?ZW~<>vC6FTQy7@}-i=@hBd2eER{u&8<9ZXVcg( z4TFwdn+~FXjx{?Pt|hkC-8s6O?4s3sdj~=|&jSX`me%tekrRTN#!89STEvzCn+Btp zn30I0C}t)^V~jy(mFGMq!cZZavdS6Q*w*vF5gyz*P)b_cp1yi{b$Pk!GZQ&SqeKKTM@$a@1e573$0*$MVP&Sfe~PJw}$->KR6#<7en^q>J21 z@!-j)iSJpfnQW58L^jK7YX|^|&{}7WMKsJ7z!GCw7%#vg&%!9G>*~de@5{1?<3vgj z(kUslu9u5>7cx#nN_C2d{J{VI`FD;;2nj^Y(9L~^j-3X8Pe1$o@slTKXJ=!U8OPDH zXU}G{_ny}~jBmGW|0nc^qGWt$l^+APcR=>hspG#jpr3vA`6?APujNdV#9hjOE%-M| zcNZp|WpH@+?(|5o+uz@>$^y}ak<9bP7-UAJ*xJ?@62j@$Ifuk1ilnuss;aitTI)Q^ zh=_=V5X4xOWu7mswajF#6;k@X2f+V+{#~BuLdcH!uyd|czjh@|uCA`$pPg;>6cJ~$ z_t0&-xCz-fNpLgC$^QaA0DzLwonbB?9vwAx#bcSX!Fd@3oZP!tmPOa&p7yLO?(FQ8 zMF9YxJbk)I=UZbo5|IGFAAR`2yVI9+_jm`S@59F*J#2KVbrXivwl>Qxq9MYnLZ$fd zD4I@#Adpfp13My%))-UO6*DVO0YFt1*0gz1006Nwre!8#_xrqrm{5X>Lg|F?y9qw@CQDQy48FI)w zV1fHBuvlP$-LwZ}6Y=g^XF8o4s}7L!Ca=hBHp^mH>aKct_~pgLdCG@4%C>bpfBqXv z>2Nqmv*}kW&DuTB8~*2Kw4L97^{2Pr{P^bEe-KI>r#790gmBMOoldP@xBLBCtwt=1 zFcvc&Ng<*rK&4Qr)b>j#Z8YkRV-E(`qtVd!$Chm)B4=zC%qISLJQ@-pmgS(7N-994 z0D?1Ad3e2|mKz(JMbN{QF#UA&QwDT3yqKYnxV5!4n@%l@qEZGA(3sN}Q<96H&-DCwiPHI2r^2DmA${??3n~5WH@+M}rF?x$D}V=Xzd^u_TJZ z>2y4q_+dB;f|(FpNd~V| z@7{i2RJur9#s6G)P3I1nyE-Zj^@!*-TlbzlfAnC#L0!k<1W2pdCPX#r4Z)E!q?U-n znUd17Z6Vn8)nyb%8ynlU0;SDfQ#KAI9UMW!bLlAz-?KpV}sQk|?Q^l#&Y| zO2*{~3}&561L4gp6IJNXnIvzWh|&7G#-V8Gwq+?PA(tCki5y&CmnuzQcX!v%o#X(v z+nwCv{D-gpc=GD21=)GQjskyIj#LMc^h z0jAV)J&$wlPsVW^+m2&d76DX3NFfAgsZ%+bEKFZ-;lbk5yf>p(wKbh8t8cn3uHWxJ zJv{vQan9bUv)bLga_i2{N!`7B_v-ShJkih&2|;@iEL0jZN)9a?A94q(}@&J3E_Ee633m+8s~iC`w3%798aecN=Og}h>%Yk z5fvqbC$UAT6kG`*l2D2AS{tl{zTP=npkE==7wIgO`xTPSqO~5Hi#(X_l2c(|tdHwv zyR*GBnM~%U&BiB_FsG*{bK=D)I89T8mXP_;at$Dl!e_sF`0d|c37bN@Ga8P@;}J^| zp>Q-Fef;-_AebSd@B55%#(8Rq$l#H(=DHRks1%DM9!~D`I;UE7JHPzpf^5khdr5K&11X^ae| zcpM^1k;EwZO6oZwpdApJcT3n6!nyq0xDE~u-n@AOh+iHZ{qyzfIUp9uW^FP?lM1%LPU2c1S0&3?hkyugWKP%wVzj%6|_a~GP$ z8cF%Rx3_n4^4{yLHG1oAtF1UwLP*X4sFDhmlAHmdGKnN-fJ#ZOgv8wRy5e=SIGRIz z2?L5pFpPWspuAOYZcJ7>jhO z*Xxf)Ba;F92M23w-B+*vrpqbTqc9VR21gMAaQEToNs^3GpM2?(vJ|K?v!Wrdq2KRk z+ZR^6mhoU27gu7yGC5ojAy#`w>oWzK>4B52t*z_pYsQlF<&Te#U%q%zYRe^tdn^@IfKDc;s*_c4Cmt$oby&@aHsc&S*dHsszl>(uW<ZXkNq*cPLd;O|WMxNs3}(2*tPSnl*ZH zH>TFbQn#2qUT9BenGl6RY@iH^6?Xexlh;vWAtEG_He(tH3RFt5)s)JHB_?d7S0_v? z!rq{Zpa?q}1frrCd%X7Py?X`$lGP&y#KQ!^s5{duD>`PMNSdZ)w#j7j@%8H!-3u#e z(m4hOgF#Fzq=1H?6o9q0HCN%pyQ<7@Q29@D_jr8n6c5?Gy9_z-e+S=pVtcb!Y4tPuMCl?Au1MD*+4o~$6+&)IB-I9FXy^Z+LOzQG1X1kG;Ae6Re~ z?RL%1UK{O!b53lY(wnrV)gUml3$1hPRdZUAe8yln1$V|tiGs=B`aYG%N z=v(WmHb4zBcRgwwAS5q>>D{Eq{1BVsJ13!8wkDhWbZKe*rjW@?1fs#9Z|^oW#$7}g zTz@L4|MfTD#;M?gYE~(g+A<(lLsgnV7Zw*bH*bc|TPiJ2B|=`}1AuzHo|H!z>U-^Q z7P$O&|NfV0njRg!GJZ^8MVw#cO8)bY-x;TqmYfFlB49My4{$>FU#Dz8`f2ysGao0K zu?gDktSH8H7)s@5`QhOq8*)ATO0NmK&3HB*AWshKJj582i(%Mwt8LKl_w^g0f%KF%c2%zWB|MG2w!vu&PJopMk^Y6~HNA|X5PZ|0htEGMjHGCa=B!^1B zVqmuNnU;%Lpq84;WQt`#K7n#i8Ts|2J?)C{0w6|SDZdHGO9K zf#s8ntBCnLWj+GHs4rZgD*S06&;JdiUjMvt;}iY7l`}06zP1o(=|BaKTC;5GJGuYTPwLx(G!4`l@;?wfQTks zUS6qo?G=CzuU>^xyL-Dl(Za1;x5GA`kI&gIw%R#eV^EL5`g)(`d*?mZnfN*S{7$9q;si2Wyu z#lP)#s9Cbjp8NGeTVvqFrcIxtUU8%LBm>9{pk$O_hngJ0t_*|4Y{$VGz{R76tqy4n zXGOlXVu+QxCLe{>m6UuP$a~LzbzXZ zFZHd#?ou9)-iKG1nwq}6yzJg|eQh!8S%B$MX?%P<&Vk*>N#0jxZ&0w%q1xx?hK}h= z<{6S`iVzImu$01NvcG!$hS$5YyZhZr%mO5*h8?_;O4V8|AwHMO(ZjRzv+hmTCqi6X zdy&iKdd+|=@-bgw1^~SgPn0!Uk{x3-$P|xZyjP#uYM(QZQR%})9|#kfC`(IA`};pN zb3_0rP86>@*PTvhfQVk2AN7TL^H)>O?1UMK*~dHy1%{+UQAR*g2j)T}?l)Zq8UF9K zwwlc*S89Me)GjVA+%7I60CYMXe-T&U)4RUiHcQ#USnUelM-R9=ogw%f3ORyk5 zKzi|>7K0AfUCaXmGo(u- z2r~UH_nThttX6B)YLy5UpeJ6G^S$?0WL6J*Z|dGbRBWBu!V&Ts$zaYm=={-yH`&nc z6Z; literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/128.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/128.png new file mode 100644 index 0000000000000000000000000000000000000000..fce67de1c4f64f5cf20438e514f5df1ee19223be GIT binary patch literal 19979 zcmV)+K#0GIP)*ZXCxEJ*Q`v%Uy|=Kr$&Y611c& z1#)N``2+`$VnBZJL%zUyh(9RshXgWgIDmopJxBln5yZrS5K0jhla$1(xHDaOsIHot zAu|{(W@oymt4^IdRXx015duLtMf_S1@hdwLk$^-dAQ1!zkVqf^0s>?a0TQWCOdosfed7ecgp}n z!N-p$ljEafbg^bH&VWdJlXg1F4tiy9n^PJXN?2WNE^G`fx)~kxYjs4_mk#tecU_HA zF>rr>-#r0IV0n4@&p-UYu7~cA03f7{?T}o6;cz$^k2j{%y}i92*_B*Wtj$nQxR`lu z5_HiAP|s!vQ!YH*S{fTF(#fj`Cb9wsM7*B}nm<`YuXJu?l`frI4oNM=sYWg!e#bVu zpMLexN48}5B=`1q6Pd`W{2~=MkO;EF&@3fCe)H+48JNvxhet@ggBc(sN~pDDQ) ziQtlJiw3M`XUs`A4?#K<=mASTsH_<1l<9Q(?AbF3WG}8sF)0U#8$j&u=EooZ<*$Fs zC^;Jm>RxAH^Ou`{fAVBj*8sRWOs>KRx~!DE5El=_jT<-4&dy%$>@buy#n{(lch(2@ z?oDsqdi2dVzLtB{6L4R}O@c{kth5Lg{y+3VCgZ+qk;;x&g3uRmkl2K#(Pk|Pdi@qT~AS1Yy^%SLX0IscG+u3=Ej@eR*mWyXg z4m4(MPx>W5->b&erNnqkZGG_I{___v>bh=kntRELo6kBpJQQGSYpcAS?5&}-+T*Hc zvNPfp7$5-d+_|&6yW68u)t%z#PsZb>u4DKsRYjnpm01&guf{%oU>#1h0Y*va)h?eB_*6T3j5BMrZHdc@yO;#9VO@X{}x#$Y>ww=))$ep2SK3BZtx@ zu%y%^=X)Z(-GIHP0%%CMFZz@(;|0KbD=Ytf^(tBUJumbOhPH3$ z7BNSbBy79j_x+uVi;IT`2lO=cU;qFrm7}oXiZyv*Vd3E5plcl(ySQ|D;myH;bWwKE z&vB>LWq40i0W2*pym@=j8h?9!U@sMvrm9`oW8(#6G#Z_pp60T_!}8M7+qZ8JDq$P> zZt-xRqkTX}f7}xob}+=FK4hy38oXp(YO6m)|BmasZG9d6ibPjHVAYi^tkQAK2FSUR zo2Bg;r5rmo)4$1#)Zx7jiVA%ZN9*LEe)nil9;oMv!T5`og zC{aA0K79()y5D{A#m=i&aYbzt)Nuf(r|%-$^i|u>pTpd2%<(^b_0`ewF#t|SRb-8Q zpXrEfFEFu?WUq}4?Ic*4lda}~AsA;DQN91fe=%r!@I*7wh@xpXtS>dzqSs*nh) zAjE$0(xsE*<7|T91x7*!+J$wjYHk-At63Ib)-Hk+AOH3_4 zYV(j7BriDyeGg3ALjx6Xd~^htyOvDtHk(~p>!Yu=q3eP^y1uq1rkssYK7s>-LjV2` z00960BY3eHuf4W+?e!9nW3YL|2qlrMfD{pOfSZXF z?kN8Ph5VlI4to3WLcV_MFsT_K$x_V{_NgrUgJu_APb#*Y+D7EsAS6lMT1x;~mf7*x7(<*52+)NUh((8LiRz`z7k{$Q>10`o0DJrU>2TXM0F{2$S|MFQ1S?mg_cjLr@UF8YMr)%NnWd={F&qvjJ}4f~ zw@?6LgvCz#bTo3o;AAu^YF!n^#k8G$efr7AjPJV&$YdlPDVw4 z4SmUh6F}6fM+Tr?ujMueZls{{gKqVtURS>GTM|lDvM1=Iv8Xs}xi;$0E*Ek@XITaa z28!BBo3p%J`F+YpCuy33%2~bV@oJzvE-R9VsGAlhczM9VO<3t9=3IV8y;_8bWUc$7 zVU0xtszgx{CQyF+;K5G6-w%14D!8E5AR3^$4a0d<&r2EQen*G~u%?)X@^Fj=W0GZ= z=4+8(970Bl(e%5B+}R%G%o6FTeig!m04C z;`h~&41<9ZZ;Y`v*9z&2wYAkwyR)^mr8hupCbq93lO|}avK>K+0J@6{{r;{8sDc{r zs|QFdtl9wvKGp84(Ub}YfkLS;| zOA$veP+CPr@IA%6E&xl=!~4(&0KC+QDa`$W3uCKPp^`VG5bHv=--C$}Uk_4tjo}Ow z={&O+oJJUALQT3TOgQUiKzW5qjisd}sicVi3tX$Rxm-n8P&^g$5dO}I1l)U}cf(j_ z4v0%NUzD?}G3tE|V)V^xB~0bix*HAvGt<*mT;4Sn+U?Z~t3fnoSve=*OxKhR)4loX z`nr~4xN_dv*^vmWRTVzQ1wX5ZVK+#jZvn<(eFFgZ?tM)F=Pz9NU+4n>o=>87r{lg| zkdvi1fH)awciR2ky`ZV4%%{|ilPFXjGN;Yom?+OJ>Yfw;NdJ~MHejJnIPidwU4w zHB^%-hrSjp0l?W#m2!yVcp@m`bH2KJ*G<~og6<$M~{ zsAU^>#k~8HXH0a;JgB?vm`fAq7$`DhqR(#JNE!|K1VnEnFC;I`REP1F0Y*F;@f5MY z0~LNPQFo~)!P#mJ+0eWG6yyUm!Q97CRmJXfje(2>@5u*DtNDX-O-~%d@SPfd2C3Us`WH z)OJFz*Q4T_R-a>Vr2~XuYH_VmuQeLYxz=2-JJ;*ZpXs(gSejc}m_O5<>CBrX`TXWh zLWIcV{3^XVq0NhL@rZJw+js7`2>ji{hZX>$c+9=2qFtf zCtb`tSC7P^g}}<0YZJfJYPAM~fe*Y=yAct<_3PK4JbkKk(_2(Qcn&B2T?uFj??kz zG##dc-Tm}vI7+kZI6X--Yi&-h;q5DS8O>(%))%*a{Q0L+N@K$uU;7+w#aNklleJpS zQR@!SZ|>j!{?Q|SgHJck)+4Iyn09=g9^u#^=TRFq`n@Ti*@>gHn9>FqV;a*_&6(+$ z_H6r1cV>3x_N^~R0tZqLjojbwasnlu`b!SQ%}cyKVx(!-;-M@Pq4j}DIy zcl-UfyZdBm=kHf<_YSgRC%kkFR|jlQZhP`~`^>6uk-wH4z052wEcSQ%pi*jC@;?9o z0RR7KtD=Yi01k6WL_t)HTxpCP$8~Day1c%91ErHz~=A6ibd1 zz>cLLaNr+FpnnOBAaD-nhl9ik0tB!e1W|%Sh!xmUVkXu_Ee~;*$1cg;ndR)v5Ln!UR+lEz{&J6ly#^}Sc`z543CLBm}E>>SS47wUqWZI!_`-vv9)hxRy!4j#OC z>C(2rIlz&_hZiqgkVKJEdQb5Mv~OWwLy=QM{l_0T9tZ^<*L8#L-V=^zwI6r=0qPDXMn%C1y#*(q8+9pfn^Qyp0HII_ zW9-a>Z}sM`c_8fe)CVNwyLog7Wot}yW1F|f~qS0I~*K9W1 z?G9ng#1;q8b)8XS5lholi&4qr!`L)AZ81}Bw(~bL%~I9W4ZicV>4xI}GCQ!<)cmq| z6m3&{m#7ecn3M$f-*!Xp!jyME0RiwGX@Om82zfl-XU;socYeOFe?StYXe^$L$3;ov z02pIuB}Wb)E))vxS$e#lSSm3-KljS3uYCKPukRh3ZB%PMuXyK9P86i|_4P`#MmdW{ zqs+%OtaWsyTr26CzPx%PS1De(jD*5IzgJb1TB9zClFuV0XJzo!#bg-3`9>+H1!jJh^b-fU2s^b}N}oh=O1kI;E5`=J$HTk(k_R+a2BL zBLJ_@8|z6-F5LIKzw@2_b9-0UuVYgy6-rB2ujcZ31{8BEk%&ctL2MZpSFQ~A4198R zaky_V;PY=*iph9fq+Hdt<=d-;YPluL4Y_^x*=J^^rzoMppubWsW5W#i{lQ>hYH|Vq z{C@wPmD@v;qrOB8A;5-dVau6PJRY~Jx11RQz)(8f>2#bh!G3Bk^kJ*Ax)t9(z&jbu z+wP7KfY{>^9G7fEd^e#3bvJ=?GP2ujb?|eub9?sgW1RVX9!dyj%;)v$x~^)PiA@XR zw%joc%_9he(qt+b35W0I!vOfh!Qr{d=U#sPum9wG*Kb_ysLg}3d#*39G@ETEFc3LM zP^y$9QQ9>#D^g&DWb=2PIP&oRUGvdkh*8pL)Pck3;83MrUCU<)V+O|OFD))EU*0n_ z*Jw0vuCB&n(T!|Y5+zmB7-OwQBjoqj3#Cvn5KZ@+hCwW1nRk7gu>*Yo*onTo4RWFH zjwc;P-R6=V#oy8wA+gsZ*u5D5pl;5SEA8o?D|UJ!WJ`5uXz0xIF9d=C!_WyKwR*$E zSnkNCiQBS_vB@~M2)68GV8#?x)w-zbhR5R0YBY;)%%g2;yLLRMM4! zgN{2m92^)>6lLed(dVMy^|#&o>d#YrC;Lx~OM=VQ+@oS_c_6gK+U(i0r&_Jr2nq=O z!5{r`zF3euowh6+hN&ouWnn=S6-8;aTbibumSyu0gi<63A^>3w03ykFdS>j=ryhUv zo8S7&xBqG-vs#f$ld*}q*0@=_*-~1cUR%TzE2`oZynp|bAN~1{esJu*!xptRD}`h< zo(#p;YIo}GW)S%av5z>ZN(RP+b4}CpH`o1%XkwsOX?3uPx2d>eUKB;KcL3*GX<8TbP9>U?Y~hC9c?UTv z48S=TQy#%-;pDe+*SPM_s8*||PCa&OZ5;qkJp4$qr)MLVvki`}>j;6OX&y;348t%@ zixAT^F~*E@0L~Z#1eDT!2Ny#9$)|t)+3$bn4~d~wnw5_~JOAyoufKo&+_n6*e7&$) z++>{BO7*o&W_j%@6{$hZYN?(KBra!`kO$@J`PJO*meI~OH#N%`?n%pqo6+;h4!hWw0V`3S)X<1x13~WVG31VX0 z%`J4Rc_NW;Ow%?-fdj;1F;NgHvF@hh0gR1~$g=F9zpV(xd2F4Q?iqI%70x(kJ7_QN;Rr{4wXOJMQ zuHAa~qxXx|vSktmyg!m!&t(IG*C%=zmwlM^BzSckY~9klP{}M-T~eJZz%}ro_?LGD5qgE zkvj9@ivWNPCkNA{jPw&#c{>kl0}9t;E} zB#!i@MFM?&eH4?q$=UvB&%*3{z1i?e-iynZfBM0H&d$u9ICi|%Y;n$kvc7mvrjRp; zi6~0O;}h}za5!A3SAbE@xzbUvMSY@xDHkP?V2e?T064pQ($5zPZuBGJu!(Un6q=fx zYSe3Dx5(1j9K^CVve~0YkLL6FZ5G8X68n8IAqmXII&8aic1UU1Iz%$n`=!Sot=8+s zQn}V>M8jc1siG+LMnlmwKnP=tF=knWat54JMmgvGNUZ1a0E?btBPNzjd zNF|d?%gc+OU0GYtrjvvB?_LNqA5qv~??6ZG1VX`7GUfGp8KDB^o7G}C6solwkKBJk zZno5RhY(_4X`I(aW!4+orc#@KDHlrhdIW07QhY|rf9{^_6n>UUrLjZ?1;^$r6_08Fjbe*E5Bg=W5? zcCcYmN-cwYboJ9~8#gGSKEdln-r>Q)4=;TZi$>e+wn0pRqmH6TlH?BrB9TZm7!o|v z(zWaR_w8eh2gAX0=RZ7m{=>^FSEh%?Q>oPQ(vqqu6a6E%a_d9=L-!vzTq#x3>2z-6 zjve4xj8n!C0ud19z!_(RI-%$1l04#FmkW(X0|6X7c+j#eC&3Z`9Q0v_1JGQ-uK2+I zeT7nq-7P$GeLDgG2RL!^=UwZh(rL}9E zal`;ymS6IZhDRpC;~wTIluGNh%r7o~^yBycNyXaRKYvFpYu8tAF5kE@(9?q?ae87> zLdZ1CFMjd3iH!@ZOa7p**sNgPtk>&6d8u3$C6C!w6j@F7q&Bm63WWj)g5dQM${1su zaY+AAb=D21)w|XJOB05x8M7>|Gx2w z54=sIML1d8+$c55YR4?)OCSn_vOpkMs+8;Xx}xg?gZ=qRNkD?hDC3AQ#sxr}Gr|M_ zr|5Mj`cn6DbZ2a1E%cYcvOwzOM{5m9i427qEWh1l&k7~f)u7yxA~)!X0S z*Bgn11%wRK&^6t}7@H<%jB$ps2^;`8<2(=vO)cDabm747|IP1xdH3TBv-7XK^6JXc z<%<_CO^=Se`NQvCT)Wa2iDe2I$>ZHSynAVFS)ZT2-wQfowMOKCidaQtuny zwX0|L8!vxNQ`K6nE-M{X(?vm;oEQgyE1Bgxtzt5jXen*R8Ku-RtrJJSaA^1Z@X&BP z8r60ErL$)m)%xw+9hKphruanf%=oyXYnDaq<5w!;(3-45Abw2mLW!{^WGaPa# z?xbbevSo>sELoPfSZ;qfw&TP}lOlEOw6*KNje!~kiWV)<^hb-J1==D((-yS>*R7YJ zNff7vQP-9!JF0BirYVV9DT>>0nc-}2U+>Z%!x=tOx<80FGj9REbKW`Up7Wiv*(u*% z>2yXj^e9zkJ9m+D22d#U+0|<9yk4oeo>!~YY{#)3hf(5tUKo;)QiNe}_s-D+ zdv-_(k2=3`=s`u2r_P>RTwBWac4&saR$p6ki$`u7Q)0@6`76^GFJlq^^)ugl`mt~R z`t(Qt_^&_8sOkRx-e;bC>gxQp_kMk1WXF)EX>$t;mSrcCNdQol*auUm4(;2Q5tFZ- zek+|!<>J}d#ku>(?%sdP-sSRYe^+mDu}A{Hqod=(rAx)qnkdONUGr%ufhbEjlg(ic zi>qr$z??D8Id}mjw9V?kt!#dDs>$_{WwZtr#XYL>n~og-pji)SMOe)XJm24pI3o_I zeY<8{i8o+Dv#mL%_M(ifS1PGgic;!0HfPK!*wYm0MQ$%v8oK(gNt z{BnK$$uE6lbYyt^j=dA_Ph6XyFBA&EfpLZaKAD^>Y3tM4#i8N;Uw!;eCX-1el5XH> zu0c7E2~tI?`auxV;LN4z)k@iOd|8lz!|32(xmsPVtYbieAjBluGA&7wWkIxkZ=#W`3Et*Z-w1sKAjC0h+xIqKBg#P+1(9K2P9WNS1Q4+2!&VmTKZWy-d5kD1A#wB%jdEWN}gpdF@3_{y;NI>`P+?`IP&Y!{r~(qoP)FVv}N$Z1obhYhGIlbsQLD+r*0^k710J*Vk1wVOnMwgpTVm&VX}52youf zlkeF*aP+>rzwz*szFD96@WX=#_IDNv-F?G5x^k6zwX3J|#MDWP*bCO;y0dNuR%a&H z(Dl)QkzE5jFVD@`fi>JWM0~<2edCuudF9@8@qCYS;D{p*DK(i; z6LDEJ9Xs?$7=}%aLL8+N>2y3CEL0jgO@h@jLeHA%r-VZMtqV1-apV z8J7_P&f1oz+5Z()e1Odw;uaIsQs35QVzV;`N4CuXAV%jyw9C^?K}998ZMDApnJv+-+%DPSHJk!U;fkI$Z^?nt$%pqXPT{1m4soqLGb~k z8T!p5JHL7K3C8)^D;E~lmTb$Z>NU<8U=9QjM~W=_VKBe4Byz!aTn0c09UtF2+|zsd z^e6RtT~U<&{{C}k&xr^HoGS=>z?!|`n4>lt+ak!QMkbQU=E#_~Og4{i)Rq%9=Asgh zo3_1e!?qcFwZt7gfg^-k^bN{3NCwmAr-Nony+v3{rqZc=?(o6=)q3^J>^aM_7-OF6 zD6vGTR(|=dSN{8hw>z?#&gAXUJY>x{f6Ay?5VBCX)yux7iZPC~L+afJ{n~&9=?! z@Y%Ew0ET6?agQo%v=kgoVs8onA+d=*0vI0~t5&PU<>ltbLkACj^696nbxqW|wFR8* z$TqY_6Y!v2&}jV{a+>MR>1I8h=`{=^+mY1`{mi*(K@?v2+duZed-3V-{{68ZjtmT) zzkERyBq=Gb*D9-xHQ?~V??1-@!jSa!^aACAARNlxIYxqfE>Asj*UkGSQDmHD;_14f zL4tdscjUlfLpSoN?D%baWl?6FP0w6B@#!hxJm1lYCA?lKJ3)|7rESx$iV~re0T(g$ zIP(lcK#1_BYJq~W%cv{}ln}Vi0Bl3QZE&L2A4R$l+UQ4%h5 z&-c+*6U1B2c_UzrX2~N16#)PXIN#Uv+;h+D-*d;YW4{>K(Mu`y{h(Z4f9>Z#o+_RZ z5td}>`L8~ki+7xwKAlt&oPi`t!##r`kf$I0orD}0MX_3~zJB~CJGy#O@swlR9oeiT zNJ%9z+&`2{b#$aN0>_N7xEiN~gkdO(q6os?J$nU?0}={?@WA+yoBD>ja-CCWr(#Lf zv0VXU31eA__4W0wtd$t&9%TeL01}&}K+a{1eMTu|(v8rENMkT;)y^jLo!M-&dA8lg z(w?-@F4JQG0V5$6DK|#3c71>I_U$L#sP{g)zVz6m^NS13_U>JKZ@c?}!_@cA&zv9Z z>JNedBfPS@`uW0{np1o6TQBIAad7wkm*0N1p*LLDQ)5b2&CC?9B~vNKbrmGnjmCj} z`+xApzc|F*ziXfCx{@efzI??r4aRx3S{)i1qLd{PiAtq{5K>hY5VCD&b!}A?M8x2p zI}b~;EP}u(PsQRu*@{*|fD>xGGnbp4pEGTjP|7%q#EFP7=2NB$I0$LLxD*-C3S09E zDEi8`M#2gRg`U@T-EG`agcr0iuL?krF^ckjx4dH4`QdHtF>UpS*86p3W`SJoNg zgp<%G|2z5qoA3QJB_)pRIrLxe9DDV|8xM@%TPxQ%`7b{saP<1bnq3_P;Wl0PIzin_L7i=d~v>k&W zU&pnGM7TU6hOKdKRGtVR@;n5PNoT~ER2UgxaqppnUnsAwfBT6imzIhEkV|KCg^sJm zSurMhj;EPMCZ5tPjrlyIrvKn;zvl)1ZNs;I|M|b_Om@6J@l(^aCBWD+6e&Kw^NvI! zEeYaK@8A~>99fvV;&~3Gq`Y1V1M)w|f02r3tBsn`&>hRk<#LHcvRbWHt5pt=PNzjt zoS&Oh<7!e(7Ka0nG65N*@q_QnbUxULiU z{&wg$w!s@4+2*gJfD!PGmRo7-7=m_$6ZQ4meC(!Y-|BeVhraK}67j;WzQbc5@-ad5mN@eZZrO6=h z%9SEUz&S4D`w_yLY2~t=6X#Ch5V|_^AD%oB5dZewdrGC!=aZ9$VR)`5$7IUb!oq?i zORnQ8iXvfbIvBC8u3MW~3dRvZ4;^|?6fgj&$;>CSlY8vlSJ$s4XX=h7c#uV@uHF&DG_#(^d<`K444lC4On0gh2qKcC zxZ_yaZ0{Yr@6eNx8J~7tSB252ETF=x3s-*ezf2Wo&~w|fvrk_M`Hkgh@l$}&1SgzRUAG5|QPkOyl{7=}Z4s#dGRDk1jn z7^~Ooj4>yhnVwtt;V=K~Z~pkNU#%|x{XhSpm>Me;ikVbqtFYZ>%sjQ=IYxzuK-zCJ(&s;`qD@4H9_9&)GQy!?bZY(;B%5_wt!fHo%07*U^u?T{-03i*5(9?RdFD3$zv!fT93l9^?&o}ZfGzz63IwNn%4 zlV>JR$Ye5y9ri!voExRzd*h+@dS8C|?9271j~={p@6Mggt?gdaYkLQO_Q4;eW$F*U z^F2q{Z!X;(yGT{@uF|9os%Xd-m$W<;V9Pl#1h{*+R8dn=Vd~B|Aar zI2lP{t5aEjy(%rM-l{!cds=T-C1=&`jb^LfbGzMcH&mhLdF5Ie0A{DAZ(qH6|Hhqb zXD(crUX%pW6BGIDNUc(Fgg_$BfDk$77UQwyldOT|{aGK!3zCS{>-8ko1Jh(+yCVQ` zj)|Dk;PS&t_JIlXb&l>y3B@-NLM+VBZ)|Qd0HPzRL#;F#M1+rj`@jGG=FPN2u-NT_&NxB!Dr7ue|Y6Pm*&sk zo?fans~Ou_*<4MFbiv8Ad%d%{F}G3ODR1toh?Dd}@A|~NO53?Gs_gGYh;0=uj*fl% zTkkws{z}@m>jmeF6TO~$^Ns7}{qhz_JDXj3zRZC2H*tXg5QzYkL0}*lARPvf;mGv` z=vT!KE!y!al03v0i8@+<2gwN_uhd3NdZ=TAngY^~ZTj*hy%Czuc*O1UEA?AFEW+E+ms zL}4^DJ^kd>vyR^-B16bXjN17KpwjE^ciSV`ybwHPrM5bC-}gN?Xe#gewcGoR+T*t$ zmGZ^$@riHVx=Y&Fjve~JetDlU*6DWZop#`QKp;5hoJ-DoN(lxQ=bF&t()hUs?FNF-*~%LuX&!IPNjQ(FYTnK3KMT!xYcue zz0h?md#ADYqP*%@PT++mGDho0x86a-bWtpg;C`VgyNBh;wddGgodc{d)P++0nV@ zzkT-V^#)^XZRJ(L&KE`sbA{Q!4FmLQ-NxF^`kS}z@9veG-4;mF+MJzU5X3)T{`BY1 zezn=yeY(4>0~4x<5eI-XlXC}NHw+`KjFcjua;nYhZma5ro>m$-b$jleb64|Drc$Y{ zZEsvScaDsC@p>Hzbr>n5r4WsFTOa^{B?RY;0ffd7kk%$b;|M7M1|^jV@K5(WhoFZ< z;J|Sloy&;iqW=pAPYj6AZ(hURVAnfVLG~2CDmVe#qb(B$lFJOY9iak_JrBc1n2LNMG zTGFypo(WL^XexjR3`qtTXBN-SE{u%iR#smggznRo<(FHpnvG_?(dY%<*hs!ORxI!C zGGLrD$psN~qbSZ`RmLEZK}>OO%z$Mj0rzP+(t~K-NhO*@Kk4Dd?MMJa-wlk@F~o%Zg2*&qqdx{=a|u2u{I2}7+J03xOs7reAT4O@e!>9zGR)F1Rx?k{KTxD`a1;tv-C~ooDOIkMBR2pP0LQ`SwqK^Rv;^=$W~> z{hgX%GEjlV#!xYvUz}Sw=pF=N$T{y1nE}us*b;MFF#-{@10foN42c6E;owiilD}OF zIbda?Qy=|92_@F9<68m@Ac~^cn-lWX4*IwR-Jee)PjXeDHn8az1+Z!}lINTzR>=y|WwXP=RtRXFNY1K~yS?ziR9&jg7!3 z140PYh76`twr$%p#pzO^SZ_2qaL&2bI!=<%N&`|)sW8%rlug+S3ul;y{Z`!=0|;aQ z7(<1FVKc^TA&^J{V*pBPLnMF^kw}{MN!?2jSJ@}O9l#YMaxB!-M?ZN0fa-_cMAl9p z^7)+TYe+Q7hcQNcC_Z}fHUQvcGiNTI>2z9CQj)EY>0krrGTg#PqLL_kV0kiZP05FGk> zZHL8*iA}K~FDyCV2d`r4Q?Zr(MnklKKk(K z^CwNO>2-b3?6YT|XEWKwxrMz-dACyj=`VgRnRJ-F-P+bllfa#7`OMhd)Ai*jikM+( znL;8fZIue+rLkhIUJt@xZRd6SpwsNMr;3wlnQFHW00<2MBS3&OmKCKv#S3?~FoOdFGi6o!ZbnPAzplL8C1?iWInGKK&Q zBKA{p6_Fyad7mjcG515Iq!h8IG=P3`a?*9(LlF8c`L{M#E?;i;%j)5T-WKmYeDHc> z?jnw*S_Y>vs64F~Cxb6*{w9RQ%TR*^!3h3Tm?#i`lS^!EO4&dO~xH!sa!m@JgE zQg2?r+fm&s7cPDA>Peu(xry0x^JhKd*;cyS?4>g4daIdBjrd`pxptebHd=6gZSiuu z-BGCTUAb+i>{_c18e$$}mS)127FuLTFmaeh=a9qFj&vkv{$aWeV{zmM3DH1Itc64b z4rd}c?UKCC$I&MM*L7p);|tjFHGlyOC?$rVk30E400030|EbI%UH||Jw@E}nRFqvw zZ(PR_uI_%@>_ZNz84g9tawKtaWXbUYOR^Ohj^lVmf*?pPIpq-KoU?)af&7C2Irx$v z;G7b`u@CVQTee_GvPp>&C9X5W;S6Wq(re}L$j3Je9i>4K^WOC9>Hex-byam$H)}N; zN=g_hhg2oUf9WUFT0#01J0?t86jExt-fw^Pn}2@#VWZKkWGb7T?XAwv(?591p?0Iu zn4OxLER=V9t+!u!{bGIb`qNjhFI;(M@zS?zD_nBL^+d5ee|paE^$+~M0b>lh)Nc0M zf{R|z>-Yzp3m_!Uu=140C^Lu-vjIRFWe^>37-2?AC6zJ8AZTN_)&xNrO%OE3n$Kac zElP0kJfs(%e?FVd#v81rLqFqbmN8~AW{epUILBCz-a!NaW|SPoZmdc=r1+=NA0X);HgRoz;3md)7uU5WRfdp7JL1kW!vxn<8K+) z+if&{{p!z8PuCxAZiJjyC#I!TVH8D@OCgOkk>G+0LIE@oqz-e?0HZYPcs64;Fbgb) z*%r05kWwmbj75nuXw0E|m>~inMNmgxm<%Hc4<&57xwUn;z3q@~Oi0XRO6wuq6D}Om zC(~*YV}sgDy40%GzVDv|YhnpwDj9q{84zE2`TD>A^ZCm!TwB|HP_*+@v$=^`=Fr`} z=FRn6t=8VPXJ1^qw*~-4;g2pq({Al8*3J=|h9Wv!oiACrLZOgzvo^CG!y4U|R0=c_ zM&mqYMksYCYP2Y`m_-axLLmhs6r~gpMHDGxV#k6y(pxf&#aa+C$c>2;F(d^S2#j+o zoP<6AT)T25NgWu%no*kG-7&!=R(=lc0Ge8nESJl1%;6CFW2OHP?qkIf0<3(ug4%RN z^xRX=HMSa{V75}L6epMGE_}PXTFq878P8%Y2!hH~<>8}8D=VuT8yg-vXDX+Q+5E)B z1Xb|k7hhW6dN^4qt=wPJpmb!iu15^y9PjG#v%y|Z7_E&dX7gbXDXk3{A+*ITKqI9( z6dHsW#CZIS5@ifAs4qFEI~iHjL}b^7$DmqaF{|L(yoZ) z;pphN^TAeNs0<|sb1hY=IyHA{=JxuXYH7NdD|CbI*Q?*GZrt6vw|V3C zHw)*^ySCGAw}lk#y*<};qaajLDXlV@j3%a>FZy9{raZINXn3xR0Fo*p)uYXgUKD6R zqmf9>C;>v0)|3)Ts1Oq4leJ>KFb>{!>_{qQP@&Prkl1uT8f-cOE{+sAhHsGfVUX>T znzdTB-}nFY-g_T@{P6%BgWEQ;UI-h}sH zbG_Nvvt656OrgBDw?0>`SBmBRcH6P-rNu=`X*QS7WV~{zWZQP+hs~WvC+b<2JvUi% z6pj4Qu^bUdCA5jn9!7GRoXT~2Zx<;NmV>T9{_rNAI1@BXsIDC=g*zr zYq!TV3ShJrK@=HPzi@W`RP~pyzq7yJo+?*rlc!p}eLwQQynQp|p;7wL=0@Jj=CWDI zqlt1k3`5TOVf)@I-bolXZSiBnx9qDD~0(8Fzl4H~onxK^MH5aIyL&eV2xcH&N_jn%{- zHx%EQd@h$u`-IMP4~754o7Zs&J@_uxEXT3zzr6ofZlupcDU~+56ZJH~ON$q8-MPKBv;E0upL}xnCXe{cv(hG|VoOAzhk1L`85Rt~?GKhdIR{s?uK!y@Z zpx^J4LA;L9KVtl`>SCDMVkm8(oe08^B^-;OQmGUN{|rG7N6wJM13Gqjay)Iu695Q+ zwY5^ItfZQrm^wQsG7LT)1$d*>2~&T%|ZUGjVEqVu~7Q z@9(c{JZSej)VAj5<~G*Ww;pXQFD`xl#h140u0MKo{)u^FOuasHcXhShZtw5!`+Z+X zDWw1cgc1TIPVGlyY)V2QjnPzVM(Od!{b>*Z5MZWW@AZ3-a_KNeanK)p68cGd^QY&M zq@(X6z*y)L^a+3v;+?nNMl`LIQ)z5TVpWFFkH5Nh^{SF8e%S$l5!!2aI*q1V%1_PC z_6!?5;D^2+P)c25pFe$ercw<8?zx`d^KIrH^!wX8JKBKOMr(cci8HO%UKob0 zW;2Q+Db>*)4W$ z(ejg5UtPO@9{@-?EM)-7)Et{I%CM4fvT-oO}Od)sn>BXtp z8uodX+THGfGDd2Z%Xs_Uj!`-YBiptEKgbtyE_0Mo7PYie2*@m}xxLMW$Yygv5C|#b zerkgjpwPx9L@0%bN@)h@SXRUZjL3&kyEhs8XiXR*+X-_2@kG#IbIFrw4JY|fC=`+i z>c=c&;)?)W*NG1_iqq0%Bzk-MVb6C7*Mlh$D=EK34R@ zAPwGn^NsITSI5q}|C0ciya8hzP@?$@ZoX4nXFTO|8g+^c%E0U)z;S^ zki!Lka2z{d%onF7>KD#Bu4e)%Bf+C6K2@A^u9PH%2EH#i2Lk0%xzp{2QHY4z7zzXk zAfna=jX6sG1f#U$x(D5Zcn`Srpq7@FZr!;v78;VWn9_K~gD#ayoo+W#cpe}9(VC2& z!2Y96Ai&P zRHR)?ZyPrd9~J_-DJiiq#b<|&#WqE(AxVPIK6gv+`-=F;O*UO7Hmshv*n{Kyv{r5XlX9 zhCTpHzM9Nl&nOgwqTpYYIerjCBV`4r(pvSWtn4Q;dW2U^>>Gea1v0*-8jo#sijb*R z)@rxg-3|ck4fk*7i_CslUX`{1s;bguWsHV!Pp1w15l@jLLEHc+Aw{23GO|rT<9Dcj zi!GmG)IbwYld%S1d@#s+M*4iOvvrV5ca!9|fjx2MzAeke3sYbW92|@gy- z0XtaeKwlYCi)EaBwtSW1G5XwHqR7qY*LzhG=mWsv;en7byu7IHs;lqoFU+Gb;i%z` zdldul<#>F0dfLh|h&l--$8x!(?vSgVF;3qNe4H;_0Iw*58Ztp2!L<#!>|NzWtlQY1 z6`$uh7&Dzt8AhV^XfKrNC?mOs>#w@eI7h~008Ib=kbefOrWERJ(ait zaJ{CKTF8pTowq#%k$^{NCr^@Sd`9}e4FFObh$~jm#RLM1ML8aJ7zuqK zC}#>r!=W8XWl;lA*<4wX8>YfWQnU?1%M%!=Pe)(Ofud$>(YGv4j*owN{#<-2j9CbL zNQ2dj-)_NrCOWil9zV7WN2Ad@GL8)e3il~OjXskTH_@Ry)()jC*e2+w`r#CrFcKD% z0#KR4pijMCkH))68KPh~M)cf}IEn2}d$r!0|3ELl&ex47C~cuOmxT;CVP4v zYP5)Zp!KW|XNad|h*^F8=uwJHC9Y%xh(hCAzgP$-b%<#^9s>X-XBlIbJbPdlY zN%X{;=;IbJ8|ygZUi+QldZEmFib$+O(;R+NsJY2~JNY;0ioJ`KaA1P&(@2`Zen%}D z^uTc`&7d6}9i5$>#rOXM00960quq z1)QsPULxf$4=Ot<`Iki!{KgYy|UJH4$ z5aHI1mSqS$9S(W-qCQp8YTa0>B`%joD`0>H8jXgmLob3ok4A4yc&V`g4i67m z(cwhPL%-i&#;MCC+27rjRRidDy9nnQMoR|30-sM$_$PNqA;HSZN~)7Z-r(HQx>erj zn%)G#iL5_V&%w>U-eEn{PFDBpU)rsF2a}zk6Q4Ie7Q}{o2~vRj@0e zKA>wPT>?zu%YyDtXTt&X?re|Vyaf{l*(Q3$cJH6gNqfxz9b53JiQ0P>< zWxJbEX(^D#V1IA#_3?2sz3_%w228`_jY0+#Qy+O)SY>@X9LdE#l*J5CO-{~$Fa(K; zywm$XZf=ezla!84Nso$^3Z>Nl<>AA>UcQv?uU)bOP$`5;sn5xgvTy3M6%PbkoldP* zJ?G&deT|W^F(HPTKi*CT-vAf0*__4s4U|%d8~@wsbf(j(+VHr6Whp*RCL)WuzHvQw zOW{Z$VUP9y3iJKNh7 zt%-h}!+SoDO&(3!YuwNaAJ_|3pT7#r9OoI;W~=P zkiYcaU9a}aRKx(KYlxhj0X!ogbb16Wc*snz`c=GR z+sNtybLmCMm7D>_*oAvb?)k!!#ikof773qPwR*u0LzEJINd{CZ6}lr7S6z&g;6k1P zek^66 ztsk0Agoz8R!cMOjz4`6QuR*;A*x%cIef+nI5SQ*0-qhdufJ(Iid7aIj aaQp{-9OOL3gldie0000HL-CV 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 ACIA2c literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/13.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/13.png new file mode 100644 index 0000000000000000000000000000000000000000..e07462f57df91f76c8ceaeb7591905a816cd5649 GIT binary patch literal 18409 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 Q)Bpeg07*qoM6N<$f?id^rvLx| literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/130.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/130.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5378150c38505430cd8d4ce4419a42392b2bfe GIT binary patch literal 19525 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 onEK!d-DP)3gfnK0ZEn74Pm& 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 KMNUMnLSTaNnVTE{ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/133.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/133.png new file mode 100644 index 0000000000000000000000000000000000000000..418b6f3842c6d2bac3d5d6ff47639b4ff5be4f65 GIT binary patch literal 19816 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 T2j7?^00000NkvXXu0mjff9e6H literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/134.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/134.png new file mode 100644 index 0000000000000000000000000000000000000000..d41ef7e6c3d791c1257c6f2070c2e8e55d8b7b47 GIT binary patch literal 18704 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/135.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/135.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e8013b6e837cbf5f94332fe8fc17d56af354e4 GIT binary patch literal 18366 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/136.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/136.png new file mode 100644 index 0000000000000000000000000000000000000000..1b51e59a11999cdf867e55029b0ddc79e55a8457 GIT binary patch literal 17876 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 eIiWITK>r88phE;FfpW|M0000P)2anFJwdKygGm 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⪻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 e-?iTgfblO+bPol5M&qpj0000q;xsIKao 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 tEZ`)90hzOM% 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 KMNUMnLSTY$Z{&{v literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/145.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/145.png new file mode 100644 index 0000000000000000000000000000000000000000..8a86754aa23d3440bcf84cb5b5ced04f24d52c3b GIT binary patch literal 17425 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 Uim{G93IG5A07*qoM6N<$f(MxK%>V!Z literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/146.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/146.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe0dd5e4acdd79e89b0b174a3ac9e548aa50c93 GIT binary patch literal 18370 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 R0xkdm002ovPDHLkV1j^FG0Fe{ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/148.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/148.png new file mode 100644 index 0000000000000000000000000000000000000000..c261e2b6986d6756ab827cad726013e978be57a0 GIT binary patch literal 17676 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 FV1m~tB6|P; literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/15.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/15.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d0d26ea45aa4950a5e6d0c0e2389b89ea6ff06 GIT binary patch literal 20053 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/150.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/150.png new file mode 100644 index 0000000000000000000000000000000000000000..603a8459de9859a978cf205c1d6646414f55c4ca GIT binary patch literal 17442 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/152.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/152.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbb280e599fabf26688b2020221e5c5396c7070 GIT binary patch literal 20769 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 kiaYG_Kyf&-KN5$30TiG$Qqcf6g)@7A!y`r| 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 nxTE24$klS$EQD�{z{8_TP9L{mUT900000NkvXXu0mjfE5=VN literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/156.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/156.png new file mode 100644 index 0000000000000000000000000000000000000000..ded097ccdf1cc07337aa2fc2ea36d2a5d4825d62 GIT binary patch literal 16847 zcmV*vKtR8VP)Eb2 z|9uI26F~_Z_~iKb)vH&!0TQth$YcUCLEyoI2bZgr3=f!XKMcpo#4n#deg6EpPBJ4h zNgxvf(DpE&HC@~4SRMG`2OqqB`>zDrRs|%1KmX~EfBEa*bO}96C-txba3>Q$nWC$R zSid6p`sC#Kix*Rp&?8463qNVE7r0+QWth>S`ALcqmo%kap$e+j3vP_EDy>(B{0AkD~zoF~o_8X}KAKtpCS z6MujCB2A(!vgJ3G-XhY8bRv~PpcAx$PEbUzWm9BRq!qM+Tai|z73r+A_AHhVGNHT& zg+?lnfJ|l}6Tg475zGi-Gs$rA{t^wJbv^Dz|rw>u~0~4&0rA$ z5}7;?Ag#!)U{jWvUMlNqM;dr0bvne+&C^qErI6){CZNWmwMAD^9_Wkdg)r(gf@!#{3r zZW4Qqs+j?h6pJUHJlW=TQ6)n}c6WE*E*7m=id&XzYSv`^c%I`4rRS{*LXm+G3Ba5; zZR;HP*hs*r-HBjqTU%Q{-rOkk2Zx9MeEoXb=MKv;SxcrTDOirv>C`3*bN8nxJ1NZH z5clTu+uK_jXDVVN^l7n}g83k_Svif+^iTA)BwNOUKebw!eiY{)wKr}r9! zz;DI8zH%rZKYFyfxLmAOMMOQMbplM1qg;#tztbn;zhtjDd`C~8*+afJ^AO9UAu=48 z%uziIVP5UkL1VKiWcC+x*rbM_dPxfOh0D_CNXv74C}ujGVLnJ5QXEnM~xD zpMMTRIR&^ntM1G)r2_!WbS#)^Vb;gKn7MX>{9aC-&VpL`MBVgB-N8jbznJYvEB=Q%nIU;wE|+@oy{6(ZeyXHQl2r-+~mU3Skmr@>ISD}5}kQ%AhiqQ0jmf)%xblSm(-?=$Q5$yZ;!eED+Jt-{AKk#`zQoY_ONFECi0ITJHd z(?7$ji`ulOD^eyB7-h$wV_Fj*n&$Z4oR#d)|Lm>XHK0nR4J-in=k>6nPe3wQxbzFu z)Gk8~dlanp@cH$7YisM~=4OPK1k~Qurmq&XZEtU1uh($VGjkhYY9+jea|3EA>9r<$ zs;V?=pJX)1u!!umq>)~BTyHyL$eCk^_oz9evPI=26+!3EpMsN<6AYtOtdNT6OZY^v zI6+j=KRh@ za+c`DXnp(^X$x+PY(zGts=P*ILn8@NL=rKx%F<06nhmTE1Vwu2x?12!2XL>6G7ACj zZ*N~+U%MZQs}OMi{`U2HJyiq8eVPH<_I7vA7YhvUPix1iIZtmQ#C{Ak?;NWg)pRd= zqSa@si}XSu$<9%L_jh;SoS)y8`f^ZfWnaY~PHCKx_0@&cnu>s^JxDMKvtRM5DRtqc zjb2|}Uu(MQ+oIn+d*&6<`rqqFRc{y}TBqm(aP%E_-O%ajY3vqL>Q3}!c;SZOVeWP000KcNklB|;a)Dc00GoI3 zUjBET$T9(d$#~4AWNFWq+GzYM8MQ=q=;GqydOQg+d`=$IB2q+34I=R8r?yhU2kWQ_ zwRcO35&(909^IsX>+5Sy!nca;Fu>&3hllUqzvq_HNI-!3bV9zNaPv4daAv8@*qMZb zJqhq|dm9l=#&{d9h3Z_jQ9V09kEudLAOwWWqBTiu)duMG`%DiDH#le_RA*uG1*uF; znv0A`l_Tz@{!V2q1)!~aEfe-3%SU0lt@mF)ET1jiqt%M#;RGLT{!sVA+E^(8P;-*@ z!kQyQDrQ#!$bHrdQU?UFlc=gMOc_l|n=yK3KU#orQQYwGft6lBltk(-6{> z&U?gyI~P;BnoT6Ww-O1A|3Y=98e$8PWppoK9{353FAd@iey{ekM!q+HiQwV(_Q#JO z#qHS_0n#yB8hH2ed}pg^)2d5b$=Sa}kwL-&!h#E?Fy`LD%3v~{NZwNvlcTt|*s^0I zEc6w_OUOLdn%3iK%9aF@U8=ILsj3X2!{PAc^i;|2nTiVn3Cp4H|); zlitSrCjCa0dJQ8(@<;~Z!O_u?uXn6SE-=0 zN&@!N?A73-K_JpiYTgh!!?lAnJn~j|utw{uDq}%bT8FLNa+Sn||6Vq4SI;-;AQ`5l zVP5(S7pZw|ZB-8kJXyk60bqA$=dTYR#9S(~HPbzNvmxbp;eyVTfKb~I0fat5Fno>d z>DT9`y-~)D9b)KflYF*rTc}@*%=cYK5sVDBUr3z=K zer?gj1aNG5u!G5X+$4L9r)gY06;p@;g?nAJA&I%cfQs=&0#&SSY)qz8wN7L({Krq8 zoSlE__50W3aRx^6sKD>pYz8-=An5k85W86d6|uSNb9UP@FAom7Dv1SzjR`D@IzYxr z*m?saFPRg^`_uQsQ{R63h%MQ$g^Mp=!1~zEaOwZ|M6#Ie7l;*G!bov_oYC>&*tW4w2W{#S8Zu)>+Ap8xv0!Ak!(#} zDzKZ z<0h#Ug|oRD%03lGs`XeXqD%;eD@;Dh$X2fPdyO4B6Ty5oi!`Tw2xhz{qD&={MBrE~+lZQAxK1Va8D+iP z{(|UNR#&IScOnG@CRd?2%>3k{y;T%L2S(B)|~-5V&w6h~Rg@i6b1a;X+8Zma#*Y7-^=v ztGbq~C07pBm7QHZ3Mx7}YI?GA`QCfqd-+}#92yp&bqcg&n1Cun{X5rcmSTaY@r}&0 zW?+GcDYH)K((Px(Z74I`Hd;3Hf(-i7{b)Ndtq4Z# zs$k`&>o5!nYpXI>-g1$_QD^y*CL!$F*2RN^s;)M-w-Ltu;o$PsE7K^J0IY4SODPoq zRZX*55=T*0l#`Q_vM35dikvjDw(eP1;X!MNpjBIQ=BpDj{ijmut+%fI=fVB9>bp3n z1q=o1h!8BJuP@6S3$}O}RtDa?b?d9IzXr?V=|HcRafC*>0~-HrpHyn@?B*>@@$23! zj9tgs+TQ99`ft7S_V(URe>fy%i5+(u#b`JLLQFD(F$#k)9JoQhcm2k@j8l@4EJ?;E zC&y2p^?TvJzxo%gsg%Mjp|qnbWiYKd2e=GYqlm2lfaSXFi3g>p@oDafp%n4R=`J#69Ky}b(u7v8yf zBOLVoFoX!jvy|i{O;gSoDT>RN-pKQ8I++qeJm13@Pbbrj%?;OailVr%zt`{el6dy~ z>9eOt-yJ=CR9B@CQpZT9O{+Fkv@A<-J}-wEEZ@@3lBmvzAQsBL6ndV~Oe<(ZK?}lN zejf;~r1yZ)qmF8tF3mh`$1N|~FXst#B1~(C>-#&qyMO%ipB{Ys;PA~iAaazHc}@^U zRaqejXK|co8Rr6G6h%><6VG)CArJu1^MFzifU2s3AaGrGHj6*|;^SyCi^kJ`{{0_6 zeEs4IWCxnnFij`ESv2l!x|ULgVK|FtyXVgz|M2|z^Zy=RxqSZOfs&HsId8z4 zTRC`gbfkdF@?3L^sekbQeZZpeD|LUNmxeAv56$0ug1|U`Fn`f<{)padfR#BRBU;uW zfnz(2QMKF{fQ184%gV61b?%L;S3dmglfz4gkB`2aoQ^%$t?L>gw70XfIa+`6{dWog zjPYbVwk!)FOzWC6#yN)&Sr*0!0RV)QmTdtAXkAanW5I=xk}+14h41@yS#lxv4laCf z=g!~$^4BNdd^?M0Cgp-Il--b8!?B92-VdA5zseBI-|>QlS6Xz40;~Yqy3mEpnoCHr z+6=bIIAbXQW4yU_?%nrq-TU<~k!`(vc@j?}3{hE@VGwMrkJg84_*R+H2C*`Ae|!?5i&9v?)prP6z#kQ*FB$4hGGc=fy1B=gpwA zW2E}zj20C_XnSw>#s}|z`1!|5!IBh3UI;FH*A0VUb7NzDZImVnS8~`N*cd~l1m{_n zL4-(AAcS1c^@G6meJ+HMq9i3}6e3hrwN%QsE#LR2lL_YnV@zvGDdj?91Rp(oG#ri2 z?d`tyqt}j}JOPFUn7C^n2Fy%`VFArI##kRE(rY(6>@d=MH*UUo`J$l!Y|YaY-MyF@ z%*Q4`UdGlV8tx1cwx2*Z#urZF|2 z?PO~l#}PtwdVcZp1!!F(wjl65pBp>ICGK7cU^>FkPeJ1y+D?qTdJiGoJh%DYo!j@m zyc>jrG9zIxEORng8}9Dx42MGnp>0`F6hjE55RT(Gwv(l4mS^X-w;81pfU+zRLW1)w zNvpczoHNQup4+xkkG}N&o=H7(tN4GfF9!QV1!fsH>U_2>~n!F%4Hw zRV{y-A6?g>l$pOMBVIRS4cW4>A+1G-2mrtqgq$(Z0%v0Ps%UBz{WG1uwt!X7(H{;j zy?OcLpM84i%2mllo@Y=2%fiFqP)f;aTIA&9_&&+r+@P+D7-tpK2Py*657lv%dL zC=#;f9)S3$93;~^wYO*+#sZ|AQno6p6A$( zlu}7W>pDqOh*4EnK@jZj?BrQy+cu@taU6^>DTp5gwrw3BA2Y_vvSN%;#tK3>=XFg3 z-><4_YkT{2JPv!I;H)SL%dzXST3cVAj>kYLDJ0|EbzROGP(Vltl;Vsx%x)@~xpC11 zt2eqD`qiqU0^Q2YlH#^E{{sL3|Nr%zB9Q<93o%JVK~#)fTXQ2fc0LC{H~PklZZn>d zWp8;rwx)L1cCBl-66fl~8^5GBsme<>$=^%zBQ`%EdB|HXb~2vW<(aW0lA_2a8+V*M zG}&rWvUj_>R80tMc7FiA^WoqeuwLy={NeuGp?A@pZ=OEhtMk=Y&sVFREe2q#cltvy zP1E1|!%sf=*+)`l2^UEs21OBl2;N&`z4M&$Mk(h#B0D=ftEvhCv{E4inaTOh8~~M4 zX_D4A%j?-Z1h14@uT}tPj3JC?N6)E5Tr(1`>9xVODe?;$7<4GzYS-ah;I=RcE)JUTo~lSCwM6K5|Mv5U40Aq+kV4LF6TVLwCb=yUoZZ&OdqUJvnHXb32#r!e<$3PC zKR-X8OsAU;w9EJ%8F0a4Bm$6`G|t}(eRpWB_e#XR{^_Cr1E#n;b}U5O7kb;{Z2m<6 z0Ev`8divyGJoe5PMX^@R#nlxM$t=sHRCD8;LqN_L0xt%|-g#{d0)!A4n-2c#i_x#yC1Uy7=xp z#`%Wvi3l);NHH=Yxc4yzr4#}D*B4*hhB5cn@}S2M-iMaD8>L|v{kG%&@|U0e<~RTH zJ@^6N`%JxC{{Y;uJ7MW3itfyddtZ6u@#8=E^pAh>@yDi7)>_WEHHLBSoV%J%eF&WM zvMNWzL6Ri(YIQxIPbSm(^}McY)ig<(a?YEk5lK=MxluZVFrVKPWzhy7P$X-OvyK3) zwL~-;jYgw!2>yCHozLfao>x`HIbSZ9&3cW9A#BYmP>c}>ocBN!eCY8B^wEFo>`m`| ztLS!l_;v!^UkwC+7cXAyQAi(K-ogFm>1n%D(!IyKPoB)TxxTn}?grs@M>kIMEJK7J zz5C=(|KiUcKYZim%a;d-ht^r|JP}N$6Row@`uO-bEA!F8L7JqtQAwH{93Gy&d0JJK zNJO4x&U^2Dp686QbzNUxTxMBT6onAN8bbh0qgrc0M8=r1EZ23tyji^b_NB8f&vR?- zdbNr~6r-^=mFcDp5JQL|#z=$|+fLn0m%4yH09Y)SzUPF9TeA$iv~#bL+>`qqN}C$5 zUcK7jCFKV{`SBjg*RvV+^cKSXE(+K_L|1_!{Qa;0Hcivhx6a0c;kVy@n->M+EQBb8 zNU{_F@+=#VMgYK(3CFMKYP{}mSq-2O?RX%w5pel>ec9VW7I ztMPlTP1uzcv6mDU@6gU&@}QohVNb<$Io!8chY+r=CVhrM0IhY$^4&%E-+sg5c7v8% zGsUI=w>~dpj8f|82b>>7OR#$-_ui22rAqYyh222_TYS4_ zXuo@Sc({p2`<^>oTwb2Ob@oSp{^^r<-f7lr#uy+n&YQYcT89{J<~P=s9S*qyNthw>0R{iWt)2sjsWky_jES9 zzGnt_pZeSjGDJkP85{_A>bKQC|NL{{{O6zi;_=BtAWEfNESJ}_Yu%_}HHaa$4gf-M z*5zehRTX2bD$8}f3f?0i5IO6zJjj+Q!ne)YSjjr)QhERn$c*~ zTFYusc^}dw@qU9oBGX1oDZO*lN}x8;m&k{(X@f1DfA-mDlj(GC#~tX8fL-)|cjz|_ zzyLn{=}*7@`kM~iTkLRyc*o}bzTck*ZdZl34#3{Q5HBt+p1l9`lTUtsJRAYwvaZ*S zTCdlVC!_I*BO+srb8Bo_mBIQ%BoxATuU<1m!8j2y&H&Im=bVc%N+~&GtJR8gRxg&V zX>BJ=##jPy-f_X5^Q}%DAB@|@OUAGTH^wN0FxmjL5&~n4K7_Un7-H+e27s?#yy(#H z+fw>%(Es(Xe)YwdUw$9%9aV6S@bx#}bg`@b1%OWB^c_-rfju%!W1H#Go4Y}0#M*Mk z-g)ocKl$|2X1x}i&lijN&D=X*(`UX#2WkX;lt5rm=}f7dVW2ZSytC8 zgR$ z4IbPYp!V+DLhN$hwvV!0E~r--wsVtqtfVsY-lwT-){RjLB8|u6Ov;PPOJ|L-wz;@M zzy}Xb{_pwoNYt)D;&zrFV~8=<^@1hbI=5IX3RfJR98WH<)OsC49F51<^Xt~5w_Z1# zGsd~GmJ6X8l?-^EWk960jzl4ZvMg_IZbFC*aT60qL_kCoLLi_>UHZuF>ufIWqaA(6 zLUg$AUH{`h{qtT0)^~2)y0$y^=%{@2^SAMl{bb-*ufOY_277V@fGw&2&1;i`;rAGpU+JH7dqvoQ*)*m{rpxX`+p>&K(^c7ez4|42wKhO4ZAy zvsR|*<411@&ayNWj5+6!Ve5pb$|{qx&0uw|-42E3^SL#)X`1oDfs`q1ckXTnL90V4 zM2f_@;B2$0b02*Ic>nzUuKeDP-fjEm{dLp=`+-5g=|Cs&o<*aqBjTM+SLocXxNPTi3Ps z-dXFNFXv?lp{eR#uQwbG7xP7)XIv(TV6;KTWFlpf0Ki~4$dhzFFNNUu@82uSd9Ns} zHc6UrWZrqsIT(`&Nkj|~rAU$_&oUzVbaE0iaXthggtd-^Fuk}4A+#BHw(7+oA_77L z>)jS6?X>8tSFdj}IM*`C?pBtwcH#h*K6P_}fSb1NXlTv7Op?%v1_59)nc!-r(=|aN z@Xm4MX_hg@7@{%e?EK6alO<`IWp{4h?)Uq>ULlhtNu+bmQ$WOC(R1GI?CxTq)6-J` z*xTD{>gMjw5+_y89b3Pi6vNS8FvndK`V-w=%YR^%x$Ty6{wDO_JbpBr&f*y%I1u%U!aLhiM|MRv0Kf%o zRA58Ls%%#LY$Ud}Sl5P-5SGoMM1*+q>65YM?%v*yFP>#-Mno5vm(8Lggb)JxkY$-n z5>+=0u$s?R(?lvsKthOlSvu!snlyEdi09|$F>FAhqr;=!$;27+@#siMp&P}8@XiY% zq)hsQzSe4Ivh#j_e>|D=dd2a_V{MG{-unQ63^C@#f)9WIu%w~w!$##L`fXbu_vv)D za-7Rbp%#6H>mX_Ca@IwkR-L4e^W2y-#|1IV*LejMl-2x~>VJ(FzfI{a({FX`X4Vow4)zoH2HA z@S#y^GTB+o7qPM^gmCZPU5;2zXU3R!`}?%unr8l|;SN@;D7G3Px5 zT0UibvJim42Tuec1m_$PnRTAvdg!m&JJ7Rs279}l4S=@q$zpZQvbb}T{}90QXU{^1 z;dK4X7B$}Za){&cxGfm<&S|aB&d&h=Ip4c?|LE}O{Nmg>r;TQUS9PtFA^>eI2gVSy zB6r>)=fm;1KN$4;{f|dSS)LVn?yUKI`gu4SzIyq~`}YUa%c=K1K5CYw9I>t{?>*=I z)A5P5R!BiaA$YA->=16hZVbLcH2yIL-e{NHu(8+fa1Hcp%N;M@nM~pkqbukW0GGIo z!nV){03tg1^a;9TbmQHQXggFY7GoWs9K$MRNz&AN|KRJd9zT9mEfz6ba(a5Iv`(`u z%ky5ZH|P(H)=8RTTqzP!3gMlPDFMd${{H^X&Tb;*<#f8J7V%_%FvyF%C<*`?kH@`U zu~;nLzIhWf^2V5=*HcO@<_qtASo&L7Q5^z;rO_wyK1KooalKv;Tv59XeP7MGx0NZa z4tK$f+0Cu3l>`?EuxWGt_|s1x4i7hC;H@h+Pj%-cg7-tvG)Ap!iC_h1q4;sQc40~j0GQvLa*1) zi~R8L!*n{GO{aNLFwOx05zo)gwANBeV_l#SwKIm5h#2#Yt2_WX?-77A=2xp4+ywph z$>k%jq3^`YYm?vN*^cjgJ-E6 z4hGY*jIF$bUQbGSc{xSSnz}Z|)OE!GN5c^!8l#)KmQp%vwbm!cCtL_^j1Xeb?=yzh z*rUV4_wU~2MZr0bZn=%n*;}_9d^kEd z`1R#$Wwek2IE%B7h$v+O0Hg7!SM(r|wbmFry}ZAKGiJ=ktXzMka|5VK5xlb)99o)+$MoWoWpZEr;lSiI%-2?IdVd;}GDl zKmWYtV_WDE;P+3S{QH+*R#3(;( zJo@_4Y&OG=44k!t(eTfI`P1uH|EcPFXEZ{_@-)q|Y#=)Qdf1BWyToqee@`0St_kVAR(npq?9rW3;?aO!7uxkqPb@b87||m zr37MzV6~iXSI7VPuYYYp-z6F^UcA`f-)}+d;;Y+d8ft#0laez5g5yhj0m$N84pKAQQX?yef9FC^Zxz*{>9}b5ivv|I74=D zaB%C+?L|3{!Pmow554zIT_;(3eDqNWp^XVdzRAZY5^ImbC)X2G13QikAz z_iOay%)bvrtuKQR~%zkTwgscTg?qru?(?ELif)H&yzubM_XH=E7gynTCldAV53IkH7nB|?Va zdqr`4baZ}phKw~$W2|YEvd$@`dY6hfA!Ap|KUB6{Z+i-nMqAv)(7F4fI> z7wPA629yYhIOpB&)vn^h(q4C4ZLf)qU~4GcfPS~2gbUmd0CYrm?d8|Xpc|T96S=Ie zX&MDY!|~|e-X0L#xqojuoyOnLySTWp&em0Rba-TpLBw9K-ze3nrm5>JORK8loLlR% zECT@NoKo5a@2m@fgcRO6&bewDV+-q!Q<6FDCb<@D+FzkN#3)_~%h{x8tyeOVN{~=4W5AWWWW%smD`*1jRK5WLnp&LZU;e##uR=5n|IQ znIuN*ayBEPrfGZ#5x`|A5DktG%Nc1z1`yG|3O!tDFT9o?egXFu`fIoU0RRC1|61_| z#Q*>Z&`Cr=RFqxmZyU!Ie{W{?BB_hAe8>l7)o}{hZqYim3phd1%0Pk!Nb;xF{a&=+ ziu6N1If!HfPOXEIXi4OfOYZKR{V?3saCtZ#2-0eIb~y8UZ{Ezji&yah zTwLHRuAlc=Gb_7g5XT{9Km6whDR?c6YV}&X-4>iHsYYpvh|4R>D=RC3A0$b_g_Ke< z#*|jf_YFW8MV{|bQvWKf^tLv<1_PLzy8{`7KC91ip5+%U7F3Ny`bej^wzCggFymCRylXR zR9abpe&y-REz`ll0b}guojY7|(8lVtrIJDj$~;O5B1k3s{XrN8jCqI%#>BmtQW}JT z$hihX36)9_Lh?M9N-;`GDcgqkM&Nm!UrZZ7rj3?FtbjVFvWZe7{4rMozC&mQMI+=O*-w>?CMKx87n7d zmEmw`(FcHBh`s%N&UrbKN}vAl*=Ox`8v&%0!(G zjM6;I7-hz2M7(k1Ml$H9Y1)tbaU2JJFietu97`dP5<-aQdC73dC`;4S+TW!y2sYQh z(W(&rQYjlCsWl=BrDxc{oc_<;-oPyAOPS%$_<1t9d^9G2eP?-jNpL>xtZ30+u#yxr z(YRfAukDK`?W@41Jj+JO5CQLhvOO9O8%s-P?Gr>4Qf6spJyVEvI0V#6j*>(xJsc!j zYXGCQ5kmN$=lj0>fMhV>Tu{dHJhT3`R<%wLtX~i!m_pAiv<3rGsd?yEhBk3$4)hgp z@3&fyA3Z)iJhcCQ^5DVc<>fR!&I|x3nHT0ze(|xw?E$z{oaBhIt)$=YU0!;gzx7~S za2|x=hfXI=GlM`7o6WT#2oS;dJm2#vV|kY4d9Jk1a;~LRT64~$DC%Bb5=3hWNRq^A z*9juCkz)vBrN6ZP=Y~s(#we{Ss7;r}T;Et~Jb(7=@bCZ}jxK-VI6gc)EGu6W=vPWH z1Lk*PUZ18(<=(F>02Pvy6-LQWaX~4)zrA&N(bZZ5A$gu>X|}Yq)LdJ=ar4G`=R>d8 zjpLXx&ln@6B!rAJ1t5+_BSHvcj0>)$)Jma+o)APpK&7=YMo9$#TuLq#7_GF1$+AFD zjE7n5&dWPO@H9(DqtRBYRfc!ttasfzm7A0z+;465;@&i-Uw!#ybAA2z_}J~iJh`^H zxw-q7Kkx1Dy96lLbASmNjBTWrQ@Y*Lqhkcvd9tIVvc>=*xbOSD%kJKfKPHK_q*EK* zlBH>uWyToJIp;i#BCV8^5)9;7P6(ldSO;vQwRL&pLMW}dl%VxY^yd+vEOzYmMqTi6 zbcUThTdmgl`ME{EBDZ1Ih7bTgfAQkr@X#jo5>lc!X`)=P@{|+s_U+B%<90<~RAKEa z0#ulynD+LM&!|$0A~u#9_qMiv_v~r&`o`YgTceFq%4mISbMvR4_LNpis^M@5T2saV zKnjtiX;iCaX(|LqK)a|G=%A8PNNMv0X>CgFw07jkFP!nNKR$o{@9)2du|a0?<$2n-vJ9pond-Hg8)J?R@7JQ*y?b}N-L6Hytk7!R>&Gz^ z-*3coK8X9B_6bk3ot;mGR-Lnsl;Z64OiJM~mh=b9E6beobTm?0+f$ejf>J7#(prx* z1rTBYlvJgjUr1%N=A2uFvn!@4q2pv8{QPSVXB|lJqVv(65S3Dd5K1W$V%^`ARK{q*h0=<1VNLDhjZoP` z00eO9QLEQo0$eS1v+~7EFKP2ir9z3AMgQ9R`os)~YBfIVYX{+@YE^(Ij~{nB9V~?7 zez6#o72M>SSmY7H!ppjRD)Ri|!-vD4|9kNB`@r*`K7IP@orjI3`pVjBG8ibW!!Wdg zL!$7Sz8UG=;oc<>l+&npX@BH zEQe9;U;p@Lx7!n3q-koj=0Yl^w3I@KTD^Y$;XKPS>)kIow}%EOjDi&zi_;s;DVSzx zR;ET*sc#La3l`J~(0rVDR#`))<)E2*iU8kz`^~FYe=ne%(LXl@Jr*+n90FJ@&<#Sj z?I0qO)#e%^Hda?x*VmVtYkn;n4iX_m@8U8YrCe~%#mkp3U;XVBw@L^pS65c7W0G+! zR*Mm@U|j*Og1)Pr{%C9S?f?LKlcKHs;PSV#`MG^mZb>VxTy<+UgAl||A3ofF^9Cl< zy0~f&EF={I1VO;9(>-2|(bxqRFo;4zXc&cI6eh_~NSSB3F-8a>3pLsFj;o5r9E*xu z-@R$w;-P~6M5E^aB7kjzvPsB3fAJ#Exy`3u*?~=OezsaIrIfJRQ`^Wqy$a&R#RW`e zwsXhoq%lTt+Lo#=Uqn8rh(iM~@!0PflP$5>BM?amBZB z=l3KiGtox?djK>=)Jb)OA49(iNOAE$00030|3A1J&;S4hHAzH4RGeMiYaBNapV?h< z-b-u~`r^ywsA&R;>ERSY!2~}CQ_{EOpDg(ULSCE4=BWX5g|w-`Ib$$!4?}Foo%$eY z^c!h*omLog+LcE0r5S1UF?^$lt?0D+Pp8wfv$OepZZ@Fwx0rKDF*%3Bnn>}(#Wubi zrEo>O3mf^Bqk;u(xtAXOyn=&wGwV)}A<#7(H#N-cNnK^IdR-MLW~EP0PcJSmdbpq2 z6YfBfB9~DUnG^T@!|%4YKb@arTcNqQ#bYv=EEWsfp2A%+ewSdmAHU1ckG8h_>VgS2 z%d%F2p2GSSmj$Yl`<~`IqjV=$7qtjZFClPdYCO76_V(_M#|fa`(CEwm_2Gj_gQ)G1 zeBp92fuH24{`p>#!Z~HW=j7yMu~>AGIh{^1>%65*a|ELbrnVgtQPZR`{|}EI1vodD z?uGBNA=f;pfjPD7XLwt%dzqnh*qN z8m=%5m3&<{U*hp7bMz^w_%s@A&F3e$;AIMcD2;GjvK66lO|f$VYbYLs5}&!$!+9cF zId}iTgV}5bFjHh0g$xBhxhlc{bjbjTRc=xbt{iZxhx=3rz(1_A{D0y;5efIpl9@X1 z?(Qo4%N-af93A_c4hqLJ91eFLJ|yNpW;4^dY3_I5+1BATGiR2WFDkg{)5iL`>5WVG zlU_*=KeU@b5u0RYfvkt1n{!ravL3J&{$R(Io(BrH)Z5F|q_{0XPtV)9g!R!YtRp zlg`lrOtwv?_4K}~tSMWA{zvLUk$|(TUoDqQM|5j_-4)yyvQ77ejb?utJ_h|3qHWtM z?x)e(bxPN3{kxoeu)wD7X9NF)HaOdBu}QTolggSq{5$?><8oS z!LK0XT3TMcevJiCU3}bfQIwm*;ny^3HWv=(HNn}4*C7JWi31Fr%a}T7w&e8Z0eMx$ zPoWOSdC?D(hLBrrB*NE?idx0#1#0d}cPQ~F5Wg)N8&VEH=b`CXVLTomA0Ovdq?a2S zci#gX4F&^wM1_)apd>Z40h7s!ts$z?Vny_1Z_k8(b$Jy^al}h4Jcev3`x0SAuFn4Q z^5s8^eA7xQ?4z2FMx&1(=Os|oS<)(>*`KCq@LN1#fpl?4jzLvGL$H#?6YE~_2ZMp! zOTjQktU1J;^^MboV}YRdZ>q|h-e5W$H!#q-$d#& z=efdHJc|iqFqS7Wk=DjN%#;KbeMyEYd^ezi9m@rbN|~&r8Z_eXLc+m&e+CuE{D!Ai ztEy!ySuX!rk%YMy7&G5bUH-^!Zn7%0Yq|#Q-aT55T{B?|$`C4Luuz-M>w4h93njlY8oNxqw&0oEJ!$>f@`YBcKOnB-}RWrp5{ z=^ufk_e{jHNAGuNpm-)_?WCc#*f|NHl z+D3|oa4kAwGZ+jU9P7^YnI*!y5;>yl$u(lg%m`qU)F;`gTk z0D)_^Ug|qVp-^`QC{S#s3RGfmSOSmFDyqw#p46=oQ1p{92><~ zpHLeoBCSr}zIO02o*9$gQ-b~pX2R$=>bSl%C}|U|LWJb{`nn_W=F{zT!ueH58fBv} zqOE_9X7M^@7pRkR%A&?)T78!jCk@SH+B!t^-Tr=_%u>Z_g)39`$80B6^b!D5EA?uo z9?445_#hAPl7x(?oMp~?2cn=RBsic3C`O`LFAS7Z?qS z-?H^#nM4$o73)%nhNsi%JbU)DC;I&U{k%wSD|aymnYv8+Y=KgXPa6#@@`5v?n?+Z&BtEY%ZiZ!kso=7?`>>cTwVs4 z>&@n5{7)$&nL(ozFMH+QE?^B(?G{y3V>HyT0wV{#-tW(!BgJ!JEtTf-C{O%jtJUgX zT&PUJ07ZRTBK}#FUk}3)Y%k8^Mj${JAEniYlvo-pWX4ls%@$=gEIMX!?U#2#sK7F4 z8KCNrWB`tll03lWV(mg?;GAZ&If|c>ac0~zn4-S=wjBR#qHQtJMn0oo<&A z@k9@IcZ)8gm_xs%J|&br*C$9iKD8}nwGp5*kLbLqMgR&UYin!l*wRzkCX7<|v}Po6 z6>%8+kb_bX48$os-#mUyjxH`QLebgT8MgQ5%a_*XGCvc_B+*5yh;qlyX4zgu!4+4~ zEzWG^R#kh;m^gm=MA2vT;R8>0&ciFi;Vjm;eXL? zf4jf`*Q-~Gm36L|d}flN zxG8fB)%#&HBxW(fc!DM1Mkq;CD$ z#j-v@qXlrF1<+stG{Rs5EdUf!-a_5kNV*9$C`keYr82+(kS0Ya`7ZtLWVTm|NFzWX zK}jh>u~-p*_~5}eUq3I?>H8Mgs$J@yr~|fOSWzVbn&eX(E|Qc+#Ve&NDXPLZxzo|N z-y%h%1Vt!~S65|Ns&}5-_FId7^?}g_G63d>0|*%XXMO_04h{~c=o#~1$Tw9)itpXO zpVzd3He@RqK>Ninf3>-Jn>1RW4X^>Qe13+ELW&u!yx{oF*Ute14K$cdy@+2wew+bPL!=j*HyyAz^7-d~EQ|N#)->+fsX~tWerv)*<9l6orj->qXIV9-Ayqihiv|iGGnXBa{2k_+ z6Y_H#JSs`5xf6L<)lB!w9AW}VDSM^(7{xKZTCqz}X+*rL98!uv>db0HoCVV-pM3h) zzdReqaR$Zq_V(H7>00RhvYBXxqH{YY;0@{!_0*~GTjjG9s0;;%3zVs zYXU#Gb0-hWNF_kGH*Zx6|Mqvk-+yP{PYG9^6bnHedPzxXR2rR>v;Z?Oz!ok z#Y@FY#H$ZJ_>m(Zr99qm%Q3OPf6&YPJG(ol zr)L0jE-25NvuU0aa$ZBuxAZ9tU?8nL3sDwyDwh6n3_4aydPg2(2rZQ z^bEKgu9lzcI=XSe>;TL9Q_*ZxGny4K@hR@AVn!~A0$}x7{R0dw>2>v8{$GO9!NI}H zmoMQA_VQE$QejW6=sc6foC7AAUlqp*tkqAGcC>lvp3>9RGBiyRKGdi291Rwj+iL#=fs>P04-OB#t0+^Vq>I%G5V_n& z-z>~~>-Gv^(p3R(CBZe>X&%bX=pwiGSsCNPsMMkf^(}>)x_~VhhMd4F9AN3dQ)cKOp-wX3C2NMnBCqmstp zc{UZ^s7r*U<4H9<YJ-<-3^Tk1SPMNTcZx5(G=aQv)LlbkuZg*D|i3^F?RV1 z)t7alIX@mfdh{KY>kMmj(S%BTZ7i2N+gp-$c6JJ9XN4&NmbO+9l%mq8IBL95yhOZ2 zEg~2``|J-n0GlBN`XU2;hoO2f#fhs5uK8^ez}ymty}fs8h-_`$mSXm3<5NfBj_y#q z$>nb6BB47|J4f-`haZ0Q)mQ(TrUxw-i_6Q)4(S`}pSdTBVdyDho12@f)kO(ycFe&0 zhlfZ1IqFK-rZDqL329O?R280Bm!&DE>+)K+La#2cyt^*1Oe}Y=4JGXC?wr1Uy@on% zo$HBHkp2$<0RR7K+vxcK00ucpL_t)XTHR7yMG)?u!zQvxAZ3JH2&5`uDUl?UBsZz# zR+jQf%tKiENa~HErSSz!m1tFdgj@(hScDQNb_r*9+KZWuHQW_s0SMf_{T>^l$wO=3`XLUUseTe)~R#yB$X$e5RUJn5L+r733fb$48*w(nz$^^u3mE+wAhY^VrJ*ht+3Bf5HZ{BK{1!p)mE zH#XK|=qUXg0P(^V|G%#NAjkcDk^`Jbhm0I_{wIVQPH6725r`QC06@f#m)qZew<_B} z0MTnX*{ZO{B@(AJ4}=Yo=lbO2c_0HdSLe!m}A28PWX0kP3&*uj9QHxFYFU~FuBXJ^|@ zj!)~X{0?+Aq*xy}$h(C*Z1FLKPEL-0dh&#Oa9Rlr8y_JPb^^lDkj*|7=x^V?-PzqO zdcX)XFp}~l#Z><;NDxQ8A;}gvRRRD&@ANb|&x^iGRG*zig$Q8Si&9gBqq!28zyJbr zumO~OMg+bgN|x0M6h#XkR93dn(@QokgW0@C{I_4%)U;@_A;+LYK^R;+ML)c92$y#s z75oFEH8r!0dwjyuc>R0#@B0^Em;le8J!8bY;{t`+O49rF$qBI5ooR=Y8FFWhw(mo~ zKY6#o6=E1ACNC^3j8x`AqroRXDn3(YkwAk%KWbf2#%l#KeCqQpg07JL=h#;Qe2H( zamfVvM`f$mLmgWKG@H#jaLU*`m4=0F%w$cxC;9PXdS>S6@F*l(*#Pd`)&0TY;js(C zt~OT3!XTam(Z&I4L}U$@bp>19<3qGDhHoT1P&Ql=4a zW(;NOU;j2V{qSGWYEb+NZS^=cGqbh16=2xM)!Vw{m_&$F`8_gMfJF z?qa9YajkFgH%AbR>Gub9zrV8b$@<1CFcokklL+_s58|le8I^yR1Y#o(MH1WXc3F5o z(^^#niY+Ixi%Q|;TqvSfE3I?%kxyj7-HelB^_-=Ly&!p>r|8JB_-;skO8~eUh)yD- zSm9xE53DDSuHnPPeDUsLr?b1Wz0DIs6Ep#_1WH+B0-&X(drzPK{C`ZIH@K>*f!}xm zBwWnW(5pz7FP8!xz4h|tD|LPL=FJ;FAt6XE=BT!uDf(lHdxavnsORslc$ImimDG&Xq>zXeo zX~l$3Ug86E9*dyGClc<`{->)C;o#yGO*;yP{#-C~RQhV|#(RAdI`#jOnCOd(fptn|cuax z`QkZWtMazrYPEX3-qzNpye==15DV55^i}RYbK}OXTeDAo{Gr5@)Z`Qd2*w^i^y41@ z009601{r<1000TWi1Cd+uuwV>b4#4JU?U#6V!=%>nZJ;(wAK zU<61I1OXD{TyL=P&dxm=jVOwDcjtjuQyN>C2Z|!u-F1BRRk3=I*rRI9%6V(IUCS6@ z(=@uVxFE1~D0DqddhSkNje_%~-%1aFCYjt#Vc=qo5N?ui6URTYtHR5js z-p5R2opC}3jvkN0riig~<_EpslzXS9YfNmTV{|+oH;HIRc1GNIWFGDH?dS6HvR*^& zmAVF#MrWnql+;RUEww7NF0^ifwXTXeN`h8r-~X@flK{~A`Ln03#b~8rt>aTaBK;;~ z=wdM#lUu*Cv${6Sw(B*j=pTRl2{f%eCCF556KkV1s0b8=S00s1E?-D}{p+vaym`}L zeQl!EZLaI)RVVOcMp1t4;7lDvUxorzuh~fb^(bCf^6nV&nnkxJSi^cZqSQ+!x3_nlUSmQw?a~+;0TGEi zH7GN5XoCg-?Rnm66#}f|ehXQTwq6Y$mxfemZ^e;`Qs- zoAzX^welyU!`1W&Gi0viPmOHsv4Qn1^gnjB`PQs{uo*Bmb2pO+8IQt>cXj-?U7H2~ zMGzc|j|aWuy{-OWSSTQfQJM?}-gvxsKfm7=Y8EC1wYabVA&DZ}wvr@uZ87Ngam9#leR3Y%BmU#n0M*=$p8QvLHmw%da`%4GyPz1N^S4%`j!Yg zNz+0qr7%g-BuVe1j9AXlhE=AO(tX!*{h_cd$^^IUT;k5&;nDui{&eJ6JWlgP5NLp( zefHVqfK)>Kk+$CD>d7K?@LxP_EZV|usiy*xuZvNEM_0`J6icc_rIz; zYK=8TO5@d!*&3uP`ehitZo#@s9@Y)VaM(w{5&E8Uyf+>6`&6aBIdXq@jZv-$rHh9- zA=LHU(Rji+&(aJKUB@Ykf>Pq?JVQ1WX(8Mc5QsN$M4|uzIAb(jzCAm8`|kbu^(+V@ zrBv5bYl*BOVZ}kr_sR82P1$r^5LN;!*`3jbzq`A)S}hxU|Kf{Z zEQ4j5<$(2OhdMe@#4SQ!7bxixd*M(z+-l5$@jM@$)Aq zsPZU^<1{mSep+5@?j=G*q)5#AL9>+dy$~_*6AfcG^S)a8)rl^Z0sue?)HW+BX1)-X zvA5CiB^7QH9f8XCc z6tZ{-LfKTLE5<@A-U48D0Rxh!&z@02;gmw`=}(^C2I>8Lp#jI^kyhI8`#vL=;HBJMV(;C}4dr4w-CjzP zQMO9+iKSM#VvM`4TNH&Qgwnd4mQq?O<+?5-z&S@GS63H82+q0SLL;#pZ@Rs!;$^T( za;d5=M}UuBzPh`+uSIWm-Rj1OKL7mZCnqOYSC`7H>~|Q>THyfKf-LDj> zs0OH`4X)vJlkQiQ%VwDRpu=3(jyFGT@`VUP-+T4JaV+uvA<%$~Qo)7N+P3XXBLTfs zEFogLz3X|sFbn}82Lhlif9wc$eS0gFri9$yUT0Yn1j{6jY|91!sg$s6K*AYLCR>Q) zpa1xK6i19QBt$E9aD3of;%*)!X;!Z8_IB1}Pp2O8AbJeG>Mw_* z(XY00CEQt}WRcJ3^PX!9MuIT1EGx@$+qNguEy`G)XGxM|ncP1*X1ch&f5@b22{!-$ zgv+Ir^*@%_ApTvrua{|newL-i#jqALo<4nsh-HHlMZ&s7vp%kYn-DZO!+IZUnZvc) z$QFE(_XLV+hUbuj_X=N*tSI( zTZN%zS;OIQ83c~wYQpA`{6s9`j9k!>1jf0bj7p^~+nvwv2g9MK?s7>L5Z84XV{sh& zexDF}u)jw^zQ3B)HeH#Wly&1Cnsj~*ej5zv*qNc3CS-Q54}wJ$N9A2jTMD32elQQT zuF<9{wM(q2OL?-1Cx8uN!X^jU+S-nyRXNmezxn2`fBs`8;d&lCA3OIsbzL_ML&1gC zI?HpE*_0~M8;m{YxrmtK(=?u7z9`Z(S6P}$nG(WEoiR!|7eu8uLGTF=zI_+uMb0^Q zU6%`Saq+&_^HKPoKj56_c`lW795+o8*YhallgTJqg}EYeoYY8AMrMQEqxlM?(!|cr zPF18audK6)b?H|*1k^cGB^+9f1lp*2LR~&ZQxhM({OGP~?r3X`2&h~An=N1+=>x#a zSFbM4FUn{B;rHL}^(?9NL65!-5ed;+%R=^jk1);{gcDISDX`PjD z{to~E|NnnptsejY3tdS>K~#iXS&!sKa*m9=cotbl&())a40(1|yZd0vhJ}TtSHB4U zo&E#spRv#y2G(n7bj)=3%yf6DtBN=C^aJZ)RoB7<(Ur(1S;a3RNrlY zXMgbbcXt3Vk~VvOAL-#E;X}sf`*;LPwcW@i8uR^_vBob5 zWl`?fZpZt6E1=J*#+^}nS|q!-flk{NV6=8lR@QcOAnZ}7=MV%&N&!eHMbot2gEmHM zGnq_`F-aW#+a?Z#)lzEgJ*J%Hp~N{&di z)`0kTDZ8usAP6Q&bo0x4qriKQlrER|lSy`wM-~7)ky2*a#8aP>0cJ_tx_#E)Nj#PUa0C;@;lie9~XwY#KN&tLw+1%LkH zQiwQ3T^brpvN%l<=@7}Z$bPl@?!hpYWb;}6?VtZ^T~>o4+o6BL^5pQwOWxh%0(#wZ~%ydh9D&-yxI780zg8^et3H`ikuTE18dEJo%XQo z$6FilSUj8y^q!rkk2yDrV}0CrH^{{KVy=|h@1%By<;ODTkWs+>zbF#H=s;k`dDnFv zOVTv0s!D4;pUpN!ktV4zrtg&y!h1iT&o3@6gp@|9uIpqFNGXcVCQVZSh~s!b901z3 zwbmv{ve~T5s_we>hc|DcC{B`ubFNf7EpE6BE7vfQ8tVbJ`42}ZB-s#N3^>2}@Uf^` zvNL|{(5Q1@JJ?z52czTI4H#c}7M!C4kFEd!fTnJ?2#%fy;FVI=oHRt9b+wMa#{1c9 z_W5r8-9A%bpYVp zkkf}G%RhOxU=+RgmzOX0?{N9za+E=H+Ys5Inic^3Z(hINLVs$!oLdlnYqFmeK|37D zXbeQ16fm8@O$HGkTIUWDlMo=J>(%mMMG*h_pT3}*<=2itudyms`Y9mq~x3z#ingL z=UkTO!S3j~j#66chEN7Uu9QY3h}2s9_UE6b(`i*zQc7!#F~&6I&D}4~!+O2mA@0kv zcw}TBJk{ZIxx61>2!r5IpLxRgk5)NKN!!RU-FvbQgtsU!CQCHRV)y-_a&{})%rI2A5 z${=W)CP#g9|M2_Yeg56|Kdy^v%iB8({Mh5!Lk}k;0f24);Z6&F`Q?{4*XIg#M}EK< z=(8$xdxLZPpw*FqzmxR@2ySsFWV_MbA;Cm00{`1oyq<8Bc-z(TuY=j-7LT zubQSFv~>_j#sW%FX-x>xS_gq-j0qvTt~J(%VbHd16h+?qRn;QmKg_9>DVGtY#9CL^ zHDio(VT_eR00<#N?;)L}lv2i6Rac0JNIrbH&V)-5Xfpljr=ORr!k>UX(y{(;K)-|T zNZ{ODU+=Z%KYsDW$B!Qe42R_7c#G7NI}gE)QIGPTu%lfj_b1XrukTTzz%cN?Px)Nn zkCpj6V%~e_93u9;veq_Dn5-Umh0^&60$MoO>Ji(`*x*T>+>wLR%@*(WrP4C#z`WCEQ`Ve zShpJLIfh1c!EV)5kh+B((eU@e3xq#VMLGz2a@Ih>Jzbfjgss<4h$C1{`d;iTh z-+cf5cgK?XtOGPY_PTH<7{=EhI`GL!R(gACV~=JIEKiSX@b;7YzegSbfCq0j+B*-u zaiw;QQbLGQigWJ43nBZyud0f3-n15v91`7CP0KmA*0yb1wSA>b-?k2*t}5?b)#}ueXB1gX?h3}@6kVq=##j`F!Z=X@Brng$ZI#h z1A3P`r6XdFDYqT}>sMdz_B+L$LZ;67l*1pM$al5bhE0KZAe2(2j4_5HYON88v$iZt zV~kR|s%rvZjB(Bm=4lj$0N|Xjt7;mu)!nVI=4l#PYn!Gagczlmw~6b0-$s(B?NTs0 zRR#8aYn@+=Sc9%gcwm4?Cpx6*vAr|MKNE5S{QjhbiV=2X7vqFO$DVm|2EtrjT@gYEA|Z?* zoi8rhPI+A`M;w8ba-56zydgY=?*L4H{DGoMH zAmwB-(OLnJU&s9&$*W@X=EtAQx&`p3yGM*z{#eo+p#SQtuiw49I*NmxahUc5VDdO> zwgvx)fCp_%4%>&1^}!H9-0RR8@7QuZ001GckL_t)HU0IJD$B~Z6qwc=u)KHd4Sr%;254&2d zW%xxFU;}>K-G94)v5yNF`>-opuw_z~IFzX&M>EsYM_qZwK4f)uRdWQmFd%A*Syeq> zWJY{(WOPXXkM~V<)_7Q9+Q+0AAWA9syb}QSimS5?zxnO&`c`(~#1k+P5s`Bgs5N#y zJH2XKL{=09Vo*ow;^IPULjYG-uZ=NTmMX2Z(%w6z+OjN(Xg;46MX}jzWE@XvJC*QC z`A3n71;4g&?pmJ~8Mya^UDZ{Zrt9?v5z4X*EVinus#+_howG_Qr4(Z7p8Zb_4LI357`?h71-Lf$*EBf_(r-QI_rcRHzS z>4N~6=9#tj#pR1Ya64}R5rD|4&<#v*5%>}jdFL7DQi|DZc5-r3mSs^CRaG&Di}}21 znlw$Vb>4YT-Wro-S(3y?>$0qpBq@sG_~i76ndv0Yoj%Uk_4T?$S(M9C8Lt&i=O19R zsvC-ux~_%bO6kR7F-v8fO_L;PTO~LbLU7IiK`W({`s82#Rd$!AW z0w4pg!CA&RgdH$MfattOpp(;+NJ`bVT5D_Vc3U2w90SpExtvTU)9F+SVYG41YOSS= ztaHxU$z&Quk<#YM#+SCZf#MrG5u|>mS0}l@X^|PdG3HwZ(=^r~rqh{oR!X7T)*}x} zGtYC*84+1yymttQy8h~`um1k(yKNOp;ozf>K3XpC4$&V8;DF%_28?tO0N|&e{`%$1 zZ~O6K1?*JKpq9gL}PNV|voNHTkf4@{( zZ?~lo(tA$?MN#B=&KSE}E}i!>l0?+h6$?>q#_GC8fV!!Tv4${>BO4VJN?>gaTr&Hr z#YGxb5G|KW07ryMsp)JM#W5mEDU@o-6Ju<(yiJnSI_CiE&HZ1$zC^~YH2@IM|Mb&e zzkK;}4ENs097tjuAb>+5?HZOCQ0u4GkjjRYqo&eCg zi~Mz3KDYu;o_z4(hd;Tzd@;Z`tdjvZ4X+8NX~dlf5icG+Ld3Rd0O{!HxY^zXvLqS) zbQZlkiT-fimdbK2$U8tRiiuLKvo=lB`FviMC1c1K^WItOf@gAebnK!$WI&v=(p%*` z0>~uM#(L)hQ&CEDE^cpbs;Y`35tQ3xGDU=@S;tY@G)+_2T5D^~uO{0!KG#|^hJy3! z*H<6^;+J23`PU)Z&!0UTO|_8>VBmA@|M#=cJ{zF-@PQc52Kh7g&mVvM`R9Mck#?g# z`h*ChIldFgjwZ2=r}nd9&w>$vd~*i?42TQK8A{G9K}gOJc`0QQCr#UO&fk0Qy^ty( z?-@e^;G9b-IpcsBMN!b*h{(BUo8}~qX4Tc7HKo~^lo4l4NC^O5-GAVgH!!{NiT5O= znEiGyy3yQokvst{R3*M>2O zC^%Z*DLNvb=ebg9Hk}3R%Chv{w{4qc88T*#(Z&cNkuf2Jlrkhz;yCIEOqAGsA>!F| zIu$}7h7PnK;$phl-1GF^L{%)|Tuvowr9Mo`Iaw0XX7T zZL4MvA^-qXRrL>`KlTzHK)+Y!-F_R6T#jXhgJ+CrKOeBj0BQ8R*l(n|cy`)JZWT*xAtx}xvIF1-&p)xu6VxeHPEVtXL z*=#o6d&bZh8}elUZ~^sc1lwr-&LopEvbS$)>l-{qfZZ9-}|$;+hEaMWMemNXwWcz+@u7h)3O`#Cskx!{cRB#9qgTo_}V_s;pYZQ~@H6os+&`|ocMp=}%I z93nEtx7+P{wc2jWwrzek1wl1qTq(6!EKW~PomJoPS(dYT!fq+PzkdDN%ez{wt0rnz zAHi#eC}rfVy}j18@|$kh}x#H&L(l9wBByF zoO2@oWFD6m7~`Cawr!=5VX;L~lq9ipjxlz5yV;brb6#s>tqpODLa)E3*_+yVqJ_E3 zB(_8+rx%Zs`W3&Z+xG76wrT1~QOxIaQ?LK;PhTuo{r-^$&_6vr>pDP<{_4Sk*sqTc zAf@!}?d@CCs22e3N=y1XN3wt}Ce;lg0Q$uzpIr6*aQ63(KTx>Rml%-;078M@?Czs^ z%vtu_`w>43J;F}u01Tu!_~FQ9Z&CLrdngZ1x`Q!Xuh$13Z$JI9@9_|N z$?Q9lA~J9aF!X7~C>Oz+}w`!N&l#Eodp5_ zY&PrRNZe~4*u5qU_q*>U>YHB!@(8>E1OmF#?y7RD))6x6i6QeuS(-A2#+s8NTd&qP z%lkNr7K_FGdSk64@(h`bBIjJN1m1h+Tqweg<0OPp1?R@vEX(Su3e^=_o6E}=jG@*# zP1DoU^EgfzV~DJ68l&5Y)c^kZD`O6t`TY?3{pk=;dJFoYfAGN33E<}D_JOx{2fcNr z|5*F$I1=8D_5e`7!4G;rnaHVbGc2L@q&>8b5WyPbJaNI3IL^{^Q@6_4(9@WRIOkCm zX{Ce^X`04yQWSY83Nl(Zbv>C(g%Cn;V{BPfA$!xb4FEXnoOf;0L{c6fA4@5rD_;O> ztu8Dl`6F-}BM3S-^r>FMhJ-V@|`7Ddr|z4qSEW-}=T5dirl zNj-V*eH17K>(ZqW(I@#;CY_crkbL%_zZ$T)(qkxXEIm^sMUP+ zm#Q!*76Jhfw|o9P5$5~Q<2U=>Oo9ePL`}4F_3G*AsptDbh%8MLk*uxt5OH&30|1VX zkAomYhN(z{AOwJJ7#bTztu+z#*4DV=1VJ#H%~FxNo*RbUL4Tl>@_m0goe)77hOX==J+IZrsdWTI_cR*xcMKIk|Dt%f)uEkO%;b zbJAL7SxfgVa7U=&-{uO{h!MbO@#YeD`)r&jL=XhqUFSGan(|kPqR97sWO#Yab9_Hu zEU)hD93LMqlSC=S5Ew(!l*x=SHhMjpOs7B;FBWke$8qequIsvKnqF96UnYr^aT zo}PN1w^+muca)Oz`AlZg_q>e@!zW*Ub#yY;EeGx`E1=iwSvf1v)*D>jzLK8-0Hi{+ zLLYL;KEG=aPjb3j$nMj!#a~O~Uh^gc zuBLU-TD8T>D^;ls0l;=2ux#8)=QOaGgtaozGS|-cAW)M5ifRbfSzEEHkQ8MxXo-v& zq~xb9j3J@}bba6*E$KH`!u?6|lviNSR$&U+0W177N#NH#atkv{GsjjTxyg_x~3!6KF3h^k+p6QHg!cKyz)>%;Lu- zdg{ixSZ0T{H*a>yWt&1(XB+kw3#s6`m4Jk3bkxNPD4!)jMCLeNuGFOmzl`q)D)@mSX5(lDkeY03^}~Kt!pcXOncH)cw8nU+r{& zIe$A!h~afdFOuX(eec`JTx-3xwb|(eiAZ@79Nl$YGOMh7c?Yd5 zN)~Yrg3hu@+3K6I0;FX~)x5Jj)?}?-!(FoWd@;}*p7vC_fB!*&FogUdvmj75!k{ua z&NNOSn5Rk;86!?(7bvwxM5CWr#Br8oS}CpJCGW=~{cj`zfOGEqUL42KZ0h@-5Xs5O zaTo?s6wRaA)gC96{&er!(aG7ZRiz_+C|ewO>cG6PQ0w0Emf>NM~3;ze9t>RIVoyVev({qV7qy$=om6^0^mN7 zB&`a?c%cbAxD5bYH)`#6N$s{tSwdR~7KomuTZn%AE>*Q?u z`9B_?oK0KF#cVdMh0&@JDdWlbgAe}v`0=BnX=Z6dbMYUb z%wuiaB-Ibjnp_&ub-m0EosMYem5DY{AONfM0En2gbu0J;0w6W2up6G8^{$@gnvdzIXNV=yZJWYGjTIis7C|lx-<) zRsN|LYOIVmmX=)}K%POP=%C=a#R%-LHYTk3YhC4rc@G}^?&;H~08pylibYenY%m01 zdpB-Q#*@Oyu=tb$tEtRAa6@!M#|t!(mZ>3hL}W~V-`(lnz38uDdMw!}g(Jxr=Lp(i zaB+Rm@mx*xujk*se0{P=QquJa-mK zF|6k+9N^F2dFP8So*4hE8b<<4>_MA*=cX=IZW7Z`%?-$E!Hye7WMpW@fFYnth=8MJ zhz=^|c(>M_=aF`}iwGUx=L`~&PG-?ENzyc{1>wa;wv`4-8aHdoP7`V6&CqNugW-U* z2_d%HDIhojYoS=8Xl^ONa%6w{*=M#ik^g4RhLzF~G}~UkbbujCOsF1#`qx!q zeWm6KkpB+=0RR7XZU^K500gQ@L_t)fUCmA#F%TYa!sbGXh{C0){M@*as(A}~f_Ery z$C*A2$EuYe72HsErw4oNZ#?#HLM? z>XW_tzOJSzbP9K!ikh`S-gE(oHk+5t-_6Cvg}nH6s)%F;CEtvPd3mzExYEGo#tk9TT;T~F@$fh7Zr|*}P zczMpYjzXRPC*(%L$e<$dkNbNfc9nC)^a!wWV@cVRoe~jpX?(b#ve1PA@#MlejO-WC zh2@y8nPj9k%`qS0X%El{LCcc$z-y_3|UtYYdzZK^EfKL+O#h( zEH7hV2%BceY^~G(lm64KKxC7ClNf+ktQvsH!%M!eL!tgmM4fUe57nj;b{rx*sosaC z@<5lgpRWTELr;Z}P*w+QmJO&L1#=`r+yC`i?+9r;pC8tX`6!()KUJ1yu~>|zZ4??f zOPL*!ySe$kldNb7K)+hgnRDBSmEXuL0ho6`FZ0Wvq-ooOmY5a7F~7a34L(cN#QG8u z9UUF5*Xs)XFWPY3>zRq@<@vdmq;1c3C7=6qp~j zP_+|T)}b$$QWF|Kfn3I$k&K@YZ?CUq@GK+h zxOr)aXt`XL1ou;4DL7Zk zIvP_`?PWmOMNzCsH8e!-+j?Cp!*pF;%xpG;UxtZ}1hf-~X~<_NK4R6igExtzNoN^7 zX__Y7Nl{y?$~_2>l6<7u%1@gn5KdHGLqtCxA9c*ouhEWLl4A(9ZG$uyL)E+p|%_sYZ$W8O9#gt zs*_Zbf$ZKR2Ecz#0iywvBx9gySdl*LF&ntNywr>!g}(2AFN6r!tFHsOAq&bsgGovn zc5x_%j?X#2@IPRFz!8Wd;Dj#AI(gh8wTnZ3wOW0eAL`>%L2#vR*#=CHb@{)W_9gAp z(-Y)i|A>gLSF4y#8_PWW0{{U3|5SW<;s5{y)Ja4^RJC2rZ&WuB|9N?NTZtwTNwXVe zv&kkLa#;mY)K+{zWOwvD#^Wj5Xq5T7WM zGnpzMyBZH-1<(+)LF+Ao=fA)$&=l?M?HwK-rh6;zx<|S7&qzoBkf&|*`+dNywpx3) zZp~^cerdVE^}bKJxR|7ro9nXb*d}M!i(xiC8&7b{F5+l?as}-qvF7Rh`}eeNm)o2{ z>|O}9y)R(3)tZ?n=8W!Uw=7Hj3U)_K2l=pBm(o{BZ5#kaXQ&I!yt}(QnM?+Qw>E_o zAFQvhk50ywiM8I@7!Kb9Fb#J^0_6Hq<@Ac_Z%l|@CD4@rrPfD9I_9G5TZ6nB41TJn znUrCEm8EMS0{GJ$c1IG#m~m?x-sNDYDYNf@6~IuD2eT9Qi8RDE_i7#>+$B z#x5$bVJQ+QKQ-pD;V4#vP&AXYHC^|F+rrgzgQbUaik+~UP64|9{q^(nbK^MxdgY1< zm7^jJQ>p5&kOQ`Qy|+B=1T<=$6NQk%{;MEagZ02!4V;Z6A!UTq1uLq+2{eA5pAn_oZj~xPQ*9W~nZ8l34 zoZ|k7==k{fucIU5TS;06A$3bjOF#Ym3!}m)wOXx9i~%pzeSrj1&Q|fA*HXv~00CJ2 zVfDj@fBC1ND&LZ}GT{aw*m3h{$y>VFU^Uj5aT?fd|GHIM>46hE8=ZgN{S8i6gjmt% zm3e}e8loK9#`p^c`~7}*bMyBXFJ|h{{U&N4Pn4D}78X7y16M<16d_f)ohfpxKxDsO zwH&a$z5V+2k)La>W}|E4bJlL$SUw$(Mf%i*Awy{Fgu$i=SGeV29!+Tg6h%>mrzcCA zX)@|M1+_U71K^vF5*Z7!qQ)3TNp|k(>DXKMiAsbM2LNEZ)@on_0&ecytUj3!QQ|s1 z@}Wzm@+34t4flu)8{Muw-wU8-vve3|tg&>BTfJVkrON{;-U6g)pORqO$>Lh#DqT8N z6^%xtAMe}|P1M&P&yq}HIC3!<0Pm{vrHzTc6VB-X*){bR4k8_!;DDOM(0Ff%sbA4E zwZ4EqA1osxNID$uJ15RS6wJ1HT%1e6Z1Y5}hN|4YU)I*vt{fWxz{7`+Lah}JknKRH zkrqKApz$AS&w=9*0yLazp-f|80 znmgd-%Rlm2`RTS@VK=Y-d=*HKV85X#3XLSc3KY12I&tJv0cil1|B}OyR2T?~lnZ50 ztf5>d7yujHu0(5ma^f+jS=ft2aU61eW_OjEs63>qI*3dPmV<+Xsy-GjoLPB)MAnMa tqe7wP&5S{Qz9;)SnaBRT`1C0#_&k%62H{TJuwo8C{-5vd?>`ejUnCJ^LDJVE>V`%nL$Zk20s@G8 zV+6fg^YrOcmQH{qNa_QTB+`g9Qb&uRYg_ks)_+^K0y^?U2M|bx-9NwI>j;wiswEag zOX|(Ma8@`koDuWFmh7}AQCR;O><{=>H^b0(lnYqM0u*B4B*#RgZd`|_idc`n{yv^g zMXH|?AUmrWVWJCB25@O}^WlRB-|y`WKv!!dY$m%AQW+Y}#WLA@FOs?kum+i49czbi zFb#stjZvz0ZW0Y&M=GFP@g<{4&hgr)&|BP>FgBtuq0!l#b1q#M`@2uXSk>F1i$!<& zq}$uuiheXvsWhElM?i$Z#1wD`kel3F94McGERvKjQiEjxcL_@u^G!#zL`y6R=Y?}} zMlK2$_NpUVpf#^ReM1(KWC1&}Go|ul$~vI!UhM@@P2=FOdZ_g)?y^+75sGB`Ust127}QX4#k>*R$=knN`emki^c z2g*lB#F?TUEEOpn3!pXWFe&$d@Bmnv${!VXkA@pJZv6V|y8^6lY#hIRTWl)#4I+_y z%^0-@>4vc$*rt%Ycsrfu7b=5ng>d7Y;TNT%%KiZ7DF@*N9(O0qwkRVPbawYI3lT>BWf^)0aD8oUHk&Q` z1Jmo%!^2;El_+2NgC-5s#_3!W7od7tO3^;aIt&Yds460jU`5a*X+*NfN|L-hAX~I@ z*?A?9PO3oR!w)|=KR>^E^$)-Qe(noCdi3bUix*-p7mKHXL_{<%ywtBHxB*xyfi6Vf zGf)qpNY{1#`04FiZM&Gy=ci|blo|1a@B|Ln7W{rDr6(O=4)Bc!x_>&lgr(^H=_VN{b~ncZ45iQv-4`XD)b zdMsM%k&5`Oot+htiC~gsMZ^=VnzgmH^|!CTMnK;;ul1sr(w?%;XR}iCEw$W?bbfbo z^24)dJG(dLT`9pHy_ejK0VQyJd|Wge1ONE$JCBklPo9hciRe#OCIAi&{@q7>-Cz&> z0R2FDIXyk~o*9r&COJkE!cFuW!dnD7#~^J)8bKp6z4ph~uU_R)(Uw3)7##6@L~2-2 zmrxZFsmCkU^uT%|3kADF8aaNU=0uLeEcc!WkG^q?l-6}WvOc0Tu88{Kb|~}In1G~P z)simYQpbOK`}X?UTHHgi+|XI7Y>7gvCIJDCj$SF~%EXpzt!mV*4pP0s3Nnji5ddF& z{zadGOm_SjRRBGQk+fB6t}0f2c9zmTCcN|J<;z{zX)O82nf&AF^{525c6T+(b6|bC z2>sX|-M6{1p2OicUkaI#!O7aTeeK%O%a==~f|bKwrS(EDLIF|pDgX)!(M%@W+uJ9n zr^#Zov!qvo^t*#Q;_&tBm=(P!D$7-k7fx=HD^J93t~|?BWHzkV!`@qLC(o} z;lftz09CLB*(%@JHx~9P#NZFV?mjxNgeN&hWq(1T&R=x_@K!V1tn`-iI3TVPt@+&7F^y~}=D_ZWjf_3OGngOM1a zIXFeX58`o4lyU)@oJ-fqi2J^D9TKEJh2$I&h#DMSX-RZ-4&YYQbD65sV zws&sdIrE*{;A~*Ur;_!{-8db`OGqhQ7#5qYCQUKD>@;vndESt5njd>BW)F0m1bvVYPA|_1Li`cyAuX(vsVPVBU+5Dzlf3QL%Ipfiy%$pS*k?B>t^%D z^&8UU<#mRV-Q*flI-WU~GGX~hiXD{h$M%Q>z2iF`rSiyhlh+#z)#%~4kyL_TT3l4< zV@d+96gNsmw$%gf6vEdK=> zgJ_s%<@pH-#_4oM8EK*rz!M@#60q6%4MHNd#ng&$vJOzgKYpDNrAm+&fX?wlP z=g+UMtr4p@ZF%jM9}ECnQPG~2)PK`T1*urffJ4>|k(atNzE8HnBps!Rzb2=rWokpH zyId|O+Cx=&%~%%*W0p}!qp$S3UazBVMG1FAV@0{8RY8f$+pseL@cCyq1wW0z05b5& zM5lf1KJ@_uN#2e|pVOB>C>29DDa{f&s>aAu| z0^GiJYjtf6z?9|zpxf(7uxg4%FKkI$8U%2BZm!X2aNG^(Xiit~7v4X6_F#XXNQNjv z5y7$OgTKxwY0eS^yyPtIkMRj8z>%ATq77Q zfZhjY)c^pH%jMdg&QO_{iz4*F4xv+ux|O6Z(S|-9Nl1Wm=gzIIuY=9W!%1>)Vmu>& z=?*t^hLr7;+3;pL1AcKALTk-%`T%g{^5ussD~4fMpXm$j2ZxA(NmsJpc_@47(np*B zKHJ;dLq2o1#iiCH;5m9k4v2J?14DhaR!z&c4;`836kMt+FDGoy(VteDS1X7jYrd5% z9ieULm>u@ov#l+eGFB3xSPc99h|i3B7nt&DC|E^}odCG>;l<~*nmOcxSPa9>%}ovm z6_Gf>3V?7zR6w3lvQ(vAt#z+o|L zHCz9qzg!;nbZOEE5ClQL-*+^NiekkuY`0o?1Uj6QcqPu7zkRTfRF+k(jp8GK9|XOA z-~7V-9By?T=HOT-HZ$`H)2fAeJC&_l{dXke8M1o-yOo$v16U0PgRU0oFjxoo!A>s2b1UbmZ8d}+rqd{cTh z*HbGJxzp9KeX721kg=)e)$7;mPo5-9<;SblYPGttvBAw4hQm~l&FNa!BWo8UEvI_U zWpfLs7b=xJQL*Eyru`ud&g+LEc2I4U)ki`Sj+^pYPw703hMmvDxkI z9qJTS?K*V|mdbhNOgOWg4tH6KsNu5yl^_9bT>s>^2M=6tf`8_P_ThA2d;r=U=}1p~ z77B%SyG?62Gk>~NE>+5vjGrl&N^z3p^M$F&NiX98U?$_W+igVu-uL%jy=+jcH=yrl zM6uvs|M<$EtBmz7KQSEy*{N!2_n>juXi9*U$A9$)Nv9Xr_q(lj zG(A1L@%KM*oJc)g%aUv7l~kUaU#S3ea;`){gmpSwuA3N?ZRgFA`hNfb0RR7LX2A;p z01PfkL_t)HTUn1B*L6PU?zMDPcTW#zMl+;DQ4}p%lo)EW0n3OeQ-TvD0rC(}x~7#hk?D22oh*x^sH&UQ!5~RuAw*Tz{eD0Aki>DG z=l}FC|J=S0&ROtb&Oz2mnx^XKW^+ART`@1MtYmSrHCPcQT^}Ufeg+yxRV_HP*2hM3 zF1cFC)3O@Yn&7MNcMhLE`|_Iye|m8EWPf~m*3`9|KmXKln#i9P^zHju@>iCm^yKGx z(2$lfM1b|ROZ)o=OE&8g`T)SiOa$Q~OXplI4w@4)J%QlnTW{@bZyRl5W71Aa0Emop z#yLmE(limApACmkkB-KpaU4aX(Wq|f!Qj$&-+eouYSI#d2zNiZb9ne@ebrpQ+I?kf z@cP!qFW-72(eaH}HXRo$z0?sp0^4|rTuCLFj3Z;TNK*1h1mGO3_xkU>`PyH8{QeuS zZhrE?wIBAMXvsN4X9EH#C2?LRJdZ!0!~R0SJI8k^dDnhR=75c-HX9%S=bVU^(4QIt zd=cS`6fLXA3k>aSZv%jqLJAQ@u`vb^oO42m$e1k8CwEhpB@yLWmZs^+$;oTiu6_62 z_eC+9UIl?6c2ZRq2S0sn@amQRMn33A(WQP4jI9iMV;hnr%6h58V6Cqz%Yh4If(wSo z8TU3crAwnoDj|hx81s&udxXwAik9r-CG^_^ImZiBzu;#(e>B;d5ZmqMRaHwNdgiG(B@G-n1NNt4mA&34iTAeALE=<`B2C!K@YE z{`F^{ZEtTcVLOp=T)ePi;`!ToE(xb{qpE5E5JCU|7lL!1<+%`o08UO%owe3lWaz9d ztBN58@4ffld9C!ldtWk!z1;ll{i~^A1|vZ-jiYXs8l#L7M4+{@AuvF1y+poAw)__$+B1m3R_#7!E`xiO;tWUJatV2Az+}VC!;Ha zOeztYI!koY=_zl$#rNO1@~bFZ44r5KoJBr(D-i@O zDMSEm^xKxwlz{oWGe4={@6YpUOA@I~Y+Dlu#)v33W|A-%j|(CIz{o^IG#U<_b45`S zg}QEr!=cu?n8ot-7p6u)0AaJM2z#{Xv7)o=JB16 zZajJT{gVf$X%rc)7-v!lCB>lMdA#?GAy^-Zais*$Vskbsl;Eo?`O}lp;o-^k&4D98 z&ZQ7#S-ZMH9);+VOua(Tso>q0cTHpWH+s0EDJ#n#L-n1?NghWAy4^5WKh6)^&}DN=g98GyT&W ztM|V6;=6AiW=U+6>SnQ)k|8J|h+s4-`gs~csA_w8y;n3YPvfIu(M`;7RBFke9*?#z zbsOshXU>IQp17uD^+}4u@zG;rqAU_XH0UNAKugX5HDf%F!BzkSyoMk_vbW!R^RGU- z`S1Vvn{i>C3-ieNJQq9LneqVudwY9)rghus<6m_)hH5LK5M7VbC z+Oy;1$)sBAe!o91ipk#}e(=GgM~~(~-~~!9=;28YgoqepfvBu1XD#F0I@efB-iHvf zRP68XJ^pd`bW{P+cw7U(@mcZnn^%WLHR$Ka*uy8!fWr3f!MiuE>^wYt=lT{hR@OGl zvrg7ATkiy&Ipm45RWVBAh=nFN2Luu+5Y)9LYb8U)8HF&3QFF%7H_C7dgn|PiXbl8_ z1Xuv9-}3Scpbvo|`Vf4W8vWk;@wiZmBF!J~?$%YaKIo3i=E}y({<9$h zO2NB%!Z;sSc3f0i3Wg9z>gn-lW00LT%%fcGCN&{2^sW#(4am?Ai?id6Jb^$)iq-YO zSy6jyQ^^%FN;1I_QArNSP|2xrhyYm%LV#}oYG}&ax8L}~AHKQ&@LAnVJN+h) zrj+*HzX<({3m;lBiBIqTYGMK{NuK$}C7Vg}S-WWab;G%^dmaH7=>8 zdv)@Uxghhr$+99Ck!l+?kgYyBHYiw*3<6J8d03ZYe04=BG znL+>}NSqZou=lQ9`q%&Z-Py=GA8>|7@V?!Kcjx0jzyIU?_Tyg+Q_r!QpbyVmyOWc- zm?Zr!M3i8rZKmY~v(M5*^Q%shx^uUX5xEeE0uXucDFh>tY#qF(5VRBo$T$Ol2TzXv z`r}(hD;KD-&igPPm5EWkJn5!U5Q*TNn7sY^`rc`+C7czuyYYIydU^McpLa}@bqv=E zq#y=T^GPiw0@F$g#*nkRtRthC5RvUPk3XD(o23R;xuY>~PJcW%)gZ<=O-JVb%W0DuB{ zkKh=1hBPS!wmvY%BBScs-h6FyR5njfMqKc-VVNeT(}_-t>fqV%=;-Xu`>!3Hj(ZVv z-T_bzs@Ls2-rHx$FLx1*aL6125h*Pi??MPl3SWB!!Vt8Uv6jHOLnb)mQh4k5q!!RQ z&tk2FGe4y(rxq$gGRD4`ZlN`r!{xa*)uj!fDC!R|zNLrLa5-r)39Sn))#SyYa zQT`GBCB8fS2Ym9?J~$k*Lnk}TgMDy>B!YI>BtQTpNG!379qc^&QBNOwcQ7-%P@TG~ ztE;2G%&N@F{Hi!!rTbl@xU!jImAST-G>&l@n_cba@bGYTzg%}{4HLxx=R=HOCLiLW zZp$Kl{$koMbC$AmKUhj@eX2wxI(jy0s)cu^muUpAeATpVV>uVC%v96bL`iF%G0xi{ zJPXg!AyACYXQ^hQ+DGeyX6pPxRTdD^FB-&%5MV5bp(7;2S-3Go@t1$`-mU9}V8Vqp z?&5ZI;djQk8Hir$<*F(#>jQ9ddb)xBxpN;@+HKhM?#s*9x*oGEd-<_-=HaUR9zK4& ze33im3u27Xhv0pXQWRM-pVvjIo7O5Jq+n}YqNP&OI`2bZA>R4!;jce^@}0x$ZyfAD z_~O~?cW=!WO>|~|cPAk`pH*6l`J#pksg&M$Z+%m>u5}q;twRXjc|kCBL&1v>VhC^^ zAW>wlHV_OVSinYvfK-DBzWJjc|G}U9@NiJ-?l*5A+{T6BT|$4Eim)n!c)>|Nr)PFy znRWf{#JRZ+xYUAHryu~`c^w-G=+!>n{@(XaPEOwb{`aq6zkYmt41k$ZC8S^>D8|Ud zN(ul{a8;ZA?Xq9y#O!@sESj=N6D6IGRn@eu*%=fcfBMz6o&JkiwN)0i^NZ<}NbV*z zOR-qgWu7|ko2KO$G(jK=CdouZ&e$xG-g!+(wF)8XL;`>m08#K%7RYlTfEf}HfQb+S z1i4sz^qc#WnTf!3I^CGQv94_^= zh`{^rzyID(-n;kTpIlVq_N`m{d;8w`7iTYyPfkvbkGro6L5fKT?sOtcb?2MkzP5EX zS=_m?6GBu6gEZ%S`|P0mH!nzy}|E&<&q+ zvBwx=+}q#pZvXwGkIu$ttI~gZ^z`AQhYucpzG0%5OQDW1)3#0u(KOck0N~#JuZWqL ztJY+xCMF+()-pzX>&~?syThW$##P&fptTZALd0tNY&2c;ifpl{y)k7XMesMTZ+oKg ztZM2ek=*ZPlUbE%IbYO?Wba&}C4`u?4nBaHiWEx0Sa=|M2nXMSfs~;MO8@Z>UM~vu zv!DI>OH&u)*7nZrgM+om=*sq~rOIMM-(SjR)06Bh%}Wrw*W0!Q@ZiDc8^Z5e7-PE2 z`wt#0)qnN%)j~|!h59d@gG5Uq_~gax@aE2FytuYEXj>$@#Fsw@xS=aWBgX_lo#@Ok+ z8s@3q?sxfW??cCVhE@;^=Ru4}9bW|s2=dK-_S;9N|MIJke0VwER&_O*PS<{L)ls~d zF!+)HmSR~o!asWF9dY;Ya6BHb^>`UXpe)PQ7yxOK+`W5uXJ=^xLjd|m>{aI~<5K=2JgTO+>5R_Jns%1i>b`S3y2tR-H^~rqR3jEFmFgvqi21$pkFnErJIC*F#%D3J3)XumLfG_#glI-_FMEJMX;v z@#_m9;S}G~D zYMl=e{UTLTh8W5`ty>#x6X(yEu`?)!!`_$QjEr$vqKZ`OR5va-A3ISMS<(bz=Q!U( zJAo<@4D15l!+Gc(L=9I#5kPd7}R-hKP^x-nAlt!vxQPA6rN>NGhyn-ftlPm@&7DsyXpn5BseaX2h3_~_(JF#8a) zB5i^vW=A40(}Am0RPi@srBj-02fhmwVwD(^N=; zR^p4%OrB2Oe(NBRG}fn@O?`%>jQOssj+}{7NzFuA0>SVV=3~fROh1KpNaXnBOCogC zYr4R21KCyFH(^|_zjNo#vuDrDg{8!+M!+kUdB3Z?6!^N$QOuq1NJPvem;tiRmw7rG zFMjgFH(yLEAp|k`h^DoPV5LOenB&o8QPs~!<22QIkwZ!2oDd?<6EK8eA*I$*2qq$> z<#bch=HXxNVGp$z-z3w|7skjznAz8{yT%YOM{e zw8wtaxVAf3G`2DB*8bMkpol=0=(5a7 zin=m_InR@TSXV|1p|y+zW+EmKPo|YIw#*VCn2CgvA;!j7W_tR~sHf!K?jXrhVrE$3 z7iaUZ`|Tei7{3^?R>)Flh3GJT4CjD|x_R{UWNZKTKEC&V8;49RDL}j1+q3Buuh!bj z_F!4_iw{5C6u{;1&Z_zT-P7C#`T(*n+I9Y7mjH+nNVPhf)>_FMdqctOeaKU#1>d~3 z6$KxiOcE^>GZXcSG!hx(w)#Z`l#*>@d%d*irPI2aOsn8Ss*+xw1|ND^YONRP&?mb} zkR(qmwGxd9y*wE&8uBhvqHPTeVT{ScLMDAO3yu|}K-HYH+8P7zx+v~&r~IqG{<~^n zX_-cKjzhYPO3eKP1zkkl5+t@erO6f&>`17A%YIUIzR}7B03UMX#G%hH?#@NSSolM5FU>ze;0E6~+ z2ZOCVs=@K|XQ&WDWxXgfPKREWP0X_XPH(VP4$B8$pL**|YY9;>w@3j- zvW0ZpSr?_S(*@=WNQMw-Oq^BEk53cDuN~aJeEb0}LJ@JLGSSJa%FTbos(gKK4q1<^s$Nnhb=KEe^;P~N zzKHnZmCJy>QnJ_UCW*Qe_x5h4fCyz?WkRN0sic!-F|UduuLk|h z$2co%N=L?e6IiZ;HHCJuH@c5%zzIjg-Zw9<1AsMdz9@8l{oSYU&Wtp+_KX2BmL#UK zP#dTXaOS*w^x$3$@#6ga(Zh#y7mjU12mq|nzsd4RvkdmQeAzE+vB_Z-d_9>#j7GboLFaIg z4F_GJK(o_XNgH)C}%aoIY@ms&gB|~=;jN^hcL0}9Zf;9;6>(8G3^Sl3@=f-(& zS57e4=K3}iZA^AxYm&p;|E2wn*glD%WqL+{H{Q6v9%-Y0$E=9Dabv{@5kgo>B1B+> zf|GTjtj){GJVLB$bAEYU6xBR0Gbv*5SJMS&R2e&+mlWf8*qzRc5TZ7&EN!L|LCn^U z0SyP;UO&BA6jzg3PpOpIo3DSBrk!BQ0P^0jLkPqX0BY;X+7Ka=B25)fvaCN0Az-Y% z^8o;Y2Wy+%qt-4W`?p_x+}w>2n;qHyuBv4hEp71FS|ac&WXJDd7itv(8UdUmnJe2X>AA~Fb2d# zBCD$IB%HvfM~`iB>FXI0`q~6->b#TykyDK9ix;o{_xb$ldRDipFz+xxwnfw02*gbq z&{9G$#{TqA{`ma-+=qaOtgV#W2>$t>{itzAx5wKOiPlMBxaEghQ>y{K>A0}m2`?K! zA^^k)#=1&d=Yw&+iFy~M_8}Y&yRU8*<3V>g=$>EA?jH{F%D!?h=eSdAOGTm4?q4=>z$`yY}jl^U?8qKvaaGX2tX~@9K`tS*;h@X(Pjng z%l*2ltu@YVYTMQmz?P%+4&f6wzZI8_G7tfQAt5av4-o;7@OadVF(T4%(6QEA=Q*QJ zn*7$;5o1(n6P!O7bQVRWjX&t8!H3sZ*Mk%R@Z#0YxSt6jA^;K*!(c);OPvpdXr1@Q zq)HUpA`vm-2uRrJBrZlDVg%$NV2D8ALufKqfXE9jVxSnZPQTFhuYUYbFJ2bjhc#3G zM(CHq0NW#X3ZI>~yH_{o=jZ2jRc}UGrR$ROh6{E|ZFg+4W_`p}U_Y+9Wk!Gqv5C}& z5R??h;~oMI2c0yL)`iJ5|Mun0$>E@^^rN%G$#jt=k`r8A&o5t3CHhgnqXgqb&%S*n z1uOC@zb(2daXuJhLkvjZtrLVmtT*U7z!1Uupq;NP%~ekur;X)OfRaUR3Tv$Mw?$nO zFpf$n(HVVndG*D`1QDDI8|WiIOTKTQ+XiD_IpeBX4sO5Nd8OMl*uD;0)Cz(03wXdGg)GEJ~RdWmy@|MPHWrER5w%FI3d{0ytsHhZGtMd^FnLe^zmSfUQK4* zR6z`twne28u_yVkn@S<_Tqj9KNY01=z*-jpi8CPulOnHlQ5nIx!;}%K{=JBJyC|pg z0yz=KMO8;hrPF0;Zt-wY)||nlw9{$bm>iA$*5vsYaFB7% znmX+eLYB%Jx;z=6ofRfnUy)$QSfJpvCnA)JlQjMJ_ul{Iub-BcUEf07 zx$9Ig?|t<2;o*T2GKSdisO#I@ST7m*2u7E# zx>b^=-H!1->kHrzLu66IWyolf#4aS2tOr4iCD$Zc0c9@Zfa(KhIx&`1IAFo16~SH%~u_u1-@Gh-IDRlcz7H z)5Y&TJ~P%LBlJF%TqJ5y)DXctKOXfWN9`Tw6fMz$~(oay9C&g`0H@N_f~})u#!AGYGfk^H}$c&Ce%h`t@E!D z8P((9bGu7iB#>=mi1VTW^9l zo(trHA%OQ--QGr0%$I-tlYhBI^02k^#oa`(|Eeu z9-e)DyQ)rZ?>n}m7J#cK65?8jHQ;l$x)4E0VXR|}w6RrfmE@gNH3>zC7(*;7{rJse zZT&$nlSISQM`vdbt}ed1nHQZ-0!Tveey_tg^8tHZH5l|#C5(@}oB0p|V38LO9~?Wv z+gUL_>gQ#}7&-0JZsxqP+Pm87qT*4%|H)^+{NT&UO&ua^7HtcGo#PMx;D;9%=j-vM z^LHnNzK1?QydyVsJ;7p?6WQkI%{6W7YGoJgNdNU9$A$*WZVJoK5)mQiv|gcFTSOF6 z)U{a@^~t!8h}ZL~tQ|s>oc-sMZ;uYTgHG~#x~QrW8AG=q#6hoZ(S-G!eD)QV1qFvRKt7m>?w7wE;w1TE=j($p7Z2|9Wwm8?(+s+(Kq8 zc7FTqw;5w)QJkNjBf{EFT0_4}fW15_+If!vzyE_DY)!Vk+uC9L9rUr4zzw(=Aq2q? z0h{!L5W)EnV)P+4<&@qBV;v$k$&hKP5+#g_*M*lVf#{@QkKQ;u9QD3_aXrgRAL6|O z74!32TO~zN8*SXYioshUxpTpI=OR?r_IfGjjByfz5kh6XhoG&kOC5Z0#v_6;jv?vV zww#jbA+p5&_Qc-)}?NSQby7JZTb;m)P$0bcaUfwsNG~M+Epk00030 z|3x#ARsaAB4@pEpRD@kyj~qu8KBsQoJy-AAUfWqGU}DEn{J={<3Pgz@aT0jRpW+|z zf_MxPPZ1A*kRn9{@&Lj-nTW(D-c5Gbd-Hl`cXoREQkPRa^mI?n#ZGB7>gnz2p8e|7 zxz(w!=C;wRfWCL{-b~mLFJHP8;tLD&5&`;GuWZahHk=KGAHV)11dsrdS9Qx%)o6?( zBJZglF&+?v;Ko?VnI~UbYDYYujEmA7JUP<@S)n&CUpO9)t)r~eTAOY=R!Sfu=M1O- zMDNi$7e@*iI7iNsBPw&POH-*h@ZgNgi!w_~=bY8fX-AHnp-v~Z&iv}vzdL%8Ia@o= z003|hR3-qx?OQh&w8EUE&q@8f@Yd(6(=)P;aBxlC7(@i9*6gixc$$c;vcNB1zdjfY zsxv?M{*8+3)&m?I9AG_NvfVeD;Yqi6ERwP;40&?aJ$*X(=;P1!_EYQp`|sV|-r8P}@#_EeM9x{? zq`jV@_nYsA+P^uu_xQ1tl8agLv<5vuzj~V4N*2M~>ds zE&^6P?ZJchL`{t60T^S(I)->{3YJb|MtFM3Iui z(L_Zu%gfDc7e{H9=LY?>>KOpJ_c74$EbU+DXios1A?nOd^0Ep>8a~9Y?5Bji$W_;lSBH}7YE%+seC)7OQnOO$}xsKhvy{dQy>hiH!zXq0E z064%fG@EsLUAa|djkK{@p)X$OI`Y=KJTEzCXXC8jj@zwRTZ_PiVEta(I>$L9PXNFe z8=X%WXHs%0g>%kmCjhe1`0`p87(W|ltt28x#Y7jSmWne5WZWlz`{#cjJUMzY)wu{nRK({6{?1Hel!z2xf2172rHmh({4 z8bAaoc$HnKR8o_$t~#xuzRydue>Cj2Bf(i5D{U#A6nSYpk>tGBjuIvENs&Y<%?sx# zE6Oy>i9A^xk;Mfqs=_{ybzVXai6EY0XVn-qm3@-I+D za|+^-#;LCO7^D&aV4F%YtjAWs$sI=$5nHiJVzt)q5Wv&n`DmQK`R1EfF818{0TbLf z>Rs$U8H|!dc@OA83V{ewBx9vw#uR6Wm>1+5M%P>r)YG>MVB z@7>+n+V-R6u`stWErK(E^^wZ=A^+om8)4Tb1qkbMoZZ*!&? zYGd0t2)^EUpkcrFt3E2hDwU52$YvSSX0s4P=yzM=G{5n^>zf;E*5n@G{)643G(Z2@ z+dsY8xxamwYiEffCHmdg$>99yV6?H`Q?VkVsy-~1q7}e@~dW zu(h?bh&}{*WeMxh(FA~QuQv`Cj!nHtzwp)N5CIlOz(QgU>yxb6CKZ7NWTzGM&3+T% zTun1t=Y#SUp^67EG^H@$oMG(?Az+m(VhkB$T3g1@J9|7#TS=Tm>hwI_ynNx&&OR`8 zeWSN?IEbZ)Be}c(w3Vn>$+ZhzL=b{2DFtVYGbKe{YVgFF{p{ZThmQvPhm*lzeu-Rg z@O&w6{>QM~yiQ2Yp}*`YHBXtkp^YFfJ3>{d;rn;r{bqZ+fxgawE-=q7-o5b_nvXLA zs(D^)LtcBYSR?Y&;IW#7VT?(^s^CCtO(@b_d%)LjTpg$BaCkM2gBhq z)*&(rhG9WrJqP{fo(O;)R{P$o*4D6T2f*gFYsW{2O~SbXe1U^JR6fRtdiSeuj$Z%atEI6m zNf+080Dhe2&N`_?JBbkdt1n(2rjvhs@pW$W$sj*Gp4fT?cI{a#AvBNv^FR7|v0Lbd z=ZqvCF}%8QWs*%6qJiqwa57HPbT$dMWCL*C<;NOg2-MDpAAb1N!-oy|b@*zwlIH*f zXuXdmXN(~LXH(W`IO6Y7a);rpHF1HfzxljSE>h&L*p zO#@Uv13ggs;Ul4D8eFiz;b?GBa}w6N1wkvS=%i*vrGV9JJ|cpw*6ATiDdR{M z+A1mfZDkyJA^z4 z0s4r*5R{TcWZm@T2&Cjqb+6!D2+la;oFPMUWQm-$03Oj>Yx;e;wk8?(SzhiPjJJ2s z2g7`l*>G(k0KEFjD+tg~)Z%xczhDEN)%?;y)fO^KRr@~x00960T_8-g000IkNklMuEB}=jj66`K;&h)|dcziju);{>yKA!P-Znn>QXre&?W@l&b-n(bbpAf~d zf5SOEp4^W2^_e~tebdNSCQ^KD2e{S^#{Xy9uyk!&;t1{CwK)`2nvv=;^BUcnL6M#bp4{bcP8@&hi z@88_qteb;6>en@E5)lLA(sFosF?W(E_P|e!wAt5g_j=p1&d^@A zB^GnVATSXTgBT@qzkJhd7O&ryjYd%vD2Sf-`mbKSeX{gh#axw61i9jbE|JaL>~_b- z#^hR>lzc*c0992>Tdj6JIeq&6g9j$GYlbv3#)G4K`okg2E~c(TLfIX=a{2Q08#f{|5IiPEIMqK9=lvg(%ZMA%WV1+pSXdXxhZ-tU&&REP1Ljgn z20Fk5a|wJpJNN6IJEvx59z676qh&+8Ao{q|dHCp&>&hK?Bzpp^+*XD^e-6eOUg%~s zaw-x_HR|&5W3oe&I-PZi!<>0+>?z{mndCP+)y8LFDnkowUXgp{5ORbe!Qboa3_Shk z8Ptn1wM1les~*^ic<;V=%CLWOrGXoU{!6PQQg&XHm0!X-d;7bNPlw zFXo9H_QgA3r-B)29>G4OP7I6PnoC?Ga(B;B2q=CeDvBaPK!ih&#boBs&71y*!`CVG zk&EJz_QUm$dW31S8#iyl37_zI+(W`U@nhN7C4yhdTb{c_tHp^3@K2&kwWPjL$gwE1B1X1@}Sh!@BLA#j|0s=lf zGQGaGW=yUR_oR8&<_XT~9zFKa_Rh}c^XG7ARcZljZ-ZB{V|Ca%O>5&pna4s9QZXRe z-74?t8wHWou93EJ?nSNiq+ON{b(w79nta+}ECDIwudb~HRf_tmJIgGF{TG*(x{CUd zxJBC5c9nPlq6Y$jP@^%&(Lqg32w#VZQH89%+elK6OdlCh=fJjoj)<4O{34ZaIHpdD zgEZA{r>dCR&A<+uI(^{fPP+lv1}FKb0Y`G-O(Jp|I~DtI2N3t)ajUF>jVQ<(JFqbh zhf0HhR~)9p(b3j>ds@%BT|t;Ro@S`q|Ff=$76PP#0y}T|gyTQc)Kq(GYdb2;%7N#? ztQQo!J;~BM^hP)$0TP|7hlIqBim=qkiNi;#ymPA4?RGtsi24cVW*IgE+J4&UzT^yX zW}w|}kB#lE>x6*=2R=wGpH5d67W~j$gGMWv0@CJDj)D`4NRpkkGN&t3`$KA7P0o84 zQIJWpw?4T~eVw`E{$OBl!DiooG-h3xa+t3A_M5MNzkk237Rt^I`u*YXHNvDpcb!ny zr6-Gv>090cU%YT$!_K-x%rRwUzkwrnB2Dhiz$m&GwF1#_Nm~(S2D;`J?2!61osQVv zce7zMTi^fiqx6%Pm73%C?8Il=$gkCEr69ZnEG@5?jP_3~C+fpqcYtPLB&!mWEN8=o zUKw;Npez%gZYwZKqD291e%W!B9q+>Xx~=*`1x8^^J|nZIWeaQK!VC ztt3W_o-q#uv|6o+iSd^zcCVme2@wFx0DSW%6U;hxL%se9&jU<<#yF3-VC$@Ql}m@g z^x^5%b?ZS@%KI#VG8}DSY|JXjT?+=pqQ*LWEWGMBp$4n4F~T08tjK6<^yRCUDIwBV zJZ@0lf=ZE{ctVY17h!m-6`Ig8Eb#u(5&b+wBJeGBNOQlseY>vx zUoT%mTZV!xjLCLbx0KRChjbPfMBk!Umw$2q+_gcn8_^T~M^=9VFr5RRGRH#qVr*Ig zJm!p17qlnijWmVXY_?b~K#)waZ&5)tG&aFVyC zG06_o&dmPU`4}$JM+6o+z4B$JMOuz<|K`o*aw%2Y0(xd{6qYG{qyx7dOL}!@XU8Ps z1rJx6m3$*Gdo#{t!lc^{*~r7j9q0l0ULk8I4#30z{U#n?J=veg-ao0TF3k9JfW@Rp z(Yb#8hN%V<|DU&SOKj}z?a`(4^K≻ew?9aiQc^Z@sxR0MMax&L!W!yAX0}QJcle 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 Hu0mjf^0}f` literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/160.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/160.png new file mode 100644 index 0000000000000000000000000000000000000000..30b2dc463ca9eee62434b96aae45d560b050f622 GIT binary patch literal 18060 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 f8q7@T7viJuhFs6+XKZ%D@a@01yzFF=xv3dAWs3 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/162.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/162.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f0c09fd110dfd6b124ba5f5fc710be5f5eae42 GIT binary patch literal 21640 zcmV)#K##wPP)_X@QI_fQp{u&8=gy*?%X05bPj}U+ zQ+29`Jdi*#5d?_xPyeu7WcdjJAP|TEBB-N$m2yk`BEdwENFa&C*EU|;xp(jG-MhLS zAXy08C4r;}Xt$6>aD^qLpC zOF^IXZ19L0@s(Uq_Y6mYXo@tx4YIIYjA;}h{{QF?W-{I}f2-w@`v|_s@L4E7Cy6PY zfA<|E>IVum1ky__1@bgYpUpjihNpP<-3qa*~b)(!>g)l}t`c*$dDro)) zUU}u^Yu{aS548|Maz?fUEv%2SF&GRNpOFv|`hgeG7lGua=vM$CqBvAz+L4--3a2`v zBfG@J*`1ly+>-Bd{``6UDdM;V^wpVEbbwaGv{H)z8OVwzM3A7&EwR*qnFnCb;NX-s9vZe01`a|000*+ zUW_($>A8v5kU4`ap;#^c<>y}txdJy;X$z@YAFsic@UfrfOQ}HyeXiMB>InhO`ZwNu zV|#o1^y$<0{@78W&Vmfds=ddbKYr%bGk0dQag;~L0B92=rc|mcQ&Ke8^bW%<2mo7K zTQ{!X5Rr4|&h0(fJHC2icXzkmt!%h?pT>9l>_uzJlR-GJp>X=~tq zBX+$cfMdsw-M@c-hHh(?pTLCyi}E* zKeYic?a?yI0F$)v2_$EED)pB6Y!)J*AK@D&bi~>+F%iIt)f0dI@n_RAHu0-wxn2$@ zKSN6lD*)4l>63q+SOCy8Qod!=m|80WPXaqb0fOnm!jr%M863nsLn}r_rAgOnhHk-; z9`@*#{I_&5V+ikOd9|>g>6}BsQQxwqfu1uQ#(hrbcnf+qR$i}eA%A(IG?v*oC zQ9A3j=R{&GAIp3Oo9tkM`Ch1YK{mhZQr~9-(%XCt>Ph5yO|p@w1SjK>e!wc5;?xP+ z7K<%OEdcSDjWOsWP{1JYu~`z4u3MU_%9q=vn{o$gZ$r?#BUjpi!?hf{cDdX#=7ct& zZeEGK7M5P5H%&Hi_AH5>)^2Llb2eu~9ceBYZFH>#XwkPeVR)#vR~jczo%+j*zHuv* z9qkFN;uf=cVD;dzqFH8zHq%wK;whEu*^V&AO>6MQrMq2l?qm>tRGE#%e{i@(TPH_r z3(VSZIwM(ZICSXH4ru2s>m`ai0}`|JErb)r@S0Fw4|#zrQh)6fxQ;+faa z96o&5i+-7qNNO43Byp11B}|A(;v~UHS9&`ne*Wbb0IYWu$+En3xE!;s)RgPFwv|#x zJxq>uJI3z8M}b>DdPL`!w?)>)z4i86`-ZJTZ!)H@00JkLmX`h#eUg_xyj1VJ_x^hq zE_~q5)+Y|E9`wT}xxBo*``0djrGtkaK6>b>T8}o`Ap=0I_+8iaea}QK6t##$pH*bV z=q4dif~+;Qb>Q3R7-W)!9NkB9D<>Q74;HB@J5PB6z~<)W&d$!QUvI@OYvb(3`b#f; z_UWeu{rE~wGdPd9laNw*mr`awc<`Xq_lJ)k)lN-ifHg0ww_JQ~k%>o+9c9UzWaqB{ zqEonjiMg4Zlng+Gmo}qsZ{`{s6(`4Wq*Gu;q@HOQ=GPZ|S+*{1jTmOj-um^{z_6=V zuNL$jap-F5ue-~o zvJV7E&d$fVU+3OCEN=I0bknl9*x)%SlGgbpLO2y6BzVlI?;%%OB)AI;we!ejF*fa~ zP35iFp`?%M;R6mABs`$fcsk#5#k-rnBUT2CgESX_gwOc-lRFw+xhQ4{P6wz_W-7o>A_D2HFr-DjR636?%Wxjj%rg8 z0IsZEnO$7C-^;Qzra}y61b}|OH=E6y(6^c(0N|^yzuMZ`diCm+8}{*o2ZO`IC8!JK z2-{}9(G&mD!evjQ^F;vYcDs|wB&_X7x=*_ZT4Q{uu>Qp&%V+ahIyX|p3&A<1R8kDh zdXylYAAS7M4?p}{qS+*QHLb5L>VCg>|NhZnaB^}I2ec5}#b-JCOUEoet+^qfbvO4% z(XpHvUx}#{%c_JXGet$O;|h^wh9V+;FeeQxl~37NuR4UhF@P8gxv_!`icO?#9}SM0 z-aoan7X;8eKL8AmkEheAU%hpVbbZS(l{JPqtZrw2`0TT{Z{IfG0&d*A@#inTm`*37 z(a8O*bw79ec1PKHxU+Wk>Toy&L8T%z)JZbFXsP-6pC0YM-WQ260c>n+oR80abvJc` zT`nl&l4!t%-hG?|z|JQ-hYee9=sUu$A!OjGJ0d9F!WQG?qO~mo9mfMpMJopc=RFt< zj4^4RprGT)czQ8?{rb)B-ly;0y@R6G-CR=p!^6YjaOl4hPK({Cyqfz|OOf1vvmb!= zO+k|9Gt%c2WHn&G>@egCh2{Btsyq|89LCQ-&| zLsmGwv^RAL{K9U6ahR&|xJLv+%jB2Q2nr8(cYplPk5r1qW?zcVjgDy)Rj5)~z=E34 zih}8Tt|>^7@2!)r7!jx~09WBLE`HPi4VGaoU`#}(Nl8Va@yVA@o;`ck5P(zm=360F zw@^$hcj%V{Ve%4>zq-0Qab7N}h{IL|YpuIVCCP)+Wmjxa9j!VUG(XvW2mql`E>c<4 z6YE$2KynO>rI^@BCrN1KBT5!>K;rX9k7T0Y&j>{Q2`%24zLAmlE0r#f&&g zKQ0++y(?K;IwppVC;U5^PJ_|&+WNKBC`72@XytO%$B!SwS{AqZQ6{NOPal@81uA3b z#_P3{kUv%ory<$%TLIEpJX=jkS*%i+P|A;VE5Rgd+7Y6l*O7gu!wX8&n)@`uX7k?# zbCDCKIasry)_Ic31K|DN-hcV>B~Y)w$`sGh&_Ge>iH%l1ngx}&2B=IrVce(_m1$m+ zYB==T?KbC(Lhk0p6L3%EqxuYY?|!hqzwdV+VWemxNeTTbYn1VW0MPIE&rZ+cSGjHH zkef@e{wZe*?j;2t$1gyi4@T&{05*HVQG{SCua@`(+3g@&E4=;+E4IegPY}@&4%Y(K zW;&Z+%)A&X+2RnTx<+y!6-Oblognr08ioYD0ahLEG$wAD;f#%#)OaZY?S=ewJKhnQ>mrl za9{0qWx_Zs=UJZp<;h>8sE!5$VZ)xS)WsaSdr`jD+REB8+{sv zy|vq$Yez?;_4WSgXgnOgJ2^SOn4J%g|2LVQoQ;Ra$NwFVPs(a$OeL!u3F`)$DUhU4 zl=Q4od#J^Bn`VoH84P7n>MEq7n*Rp?0RR7H78{KK01fd;L_t(+TxoC|*KzKCv$L}o z7K>f%fnxy>1Obq^2%h30N|Y#uki;l<$+D6tb`&#CBE?5aDLZkJQhq5_sg!b*U5-^r z93`nFmC_H#EXsx|WEH4hzf6Ah8@ zJ|P@V?3{V1Eg7Aiz2T0*cs#=}7zsnFJ9z2JVk{aM8c1HB&tJHlW0Y|Skw{>$zjOXp zF&U3YlH3syG`(J_EEEbi#a3lwV_ByfqlUczZo)h5kP|0P{OHWjCW;|-CL8%nYJ1uoL(qYGRbf_1edQDq7mOlt%*p20_#qM z5g?aa2SiOX0FY8S8IMVltg3o45t*5u6eT&odShwvT&eWw!NYq`|L`^DJctZ^f^RA0-=DSD1gXuVIIK! zs&yeTA(0^3S&z0KhX^)im=A;mOm*gP4BMN7My>8f--HA^r_jb#M||-9Kr%V(7c$$& zA3kyX*+_K!#_dWf8GQVa(X;1nCE@{9GZa+|hWL6@^z&q(zw6-MEvfF1C~4(Nol>Aw zX8>ZW6$tW#&~l|ZKR@57l{J~$KJidI(YLxoG=KM>S9JA-2*-2nkEU0bO)M8*t7(LVpg6cTP_z2^7(y1GJ{bhppP z#z*^l(j8+XDX}Ftnr&564TBOwtJPXzWj-W?QmM&I&j2;JP5^+x{= z9bo_2Y&P#!cGhR_aTP1~ZTB9)ii5wu11NLb!e&)5O;BQEfTu2*zkvkZLo8?wY?;%g zj54MfW=oP8j2U#3f3R7oA%M>(q?6mS{j-_m?o4;zjhid0h031UEvjlfaA<3FL;TTO zm%s4T{=a|qXQJ5h^ZfKg?~VD@Jv;kfc<#6$2$b<({@N?Kd`VRmpn4<{Xf(v}ZRuRT zDz#-WG`~-045^{|eW>gF_OXFjcVAmw`QU>$*4D3US{od*$TkW$>At)57xTV=`%;_4 zu$QXdk;EPoAruO6zIYIkxF>;_>#v~;Rxa!y*qg%~ku#siCZ=d3t$Uft_sx9g>?Q%R z)L=N0=F?;eXpH9FSazl4-{2z zG^AZKgU_FOBpQuqnp&(hYqgftR(ex`ubkRnt+iVcU0tuJss=!ZhZ3n&To6b+7H+py z#*Fp#vJYBqIhGw5mz9R9v{a?dD79ws>^jK|=B+mOi2EJ<)h70;`B-2SrX(O>)E{<_%*AvTrpq>_(r5gdj8t@0oz|l?Bx z%ZkP*RaAYgP+Q2AUiU2Sd@R7D04kMPc5b#-;gZF$oUK+I&)L&IB& z#nK(o2Y|W9AI&Z2bVK(pk1exoAw@j3gU>|TavMyAX&$x$;5d#M3|$>z4yHPr!ge5R zJDM3z^z98~ibIc-wP6<#kq|E0k?u~6JoEIQ4#rY%zI}H0uHoN1bu1Br|9buM@=AHV zDgz1}hq-)N6lFy<+vtn|@H|lztyF2Q6>1-xzkT-Hr>pDL{=UeA_iqgb`BW;AOolIB zxVd9A`|LAEIO6;Mzy4(J?rpLP@mL2U3=XEF9sXi*V|A@kEtYrB9z+O8VpW!!jM>`7 z)2^^unBcqx0DvgAipAol=-Xvt{^oo-owk9&E;tt2+4yR+9Yn;?R0y(d1 znQFKWGXfBTCM?^s-q}-T{jqg`JL7NhSNH6Zy?FruV0>&g;2(J5D=%L^|IsIxuOB%y z9g79~dXwM(w>N(B&IO;3A0O?Vp4@uv<_ZABIwMzaf=n9&&| z!zp3wNU~gS&rJ6G&zt{uYe@C?o!3~z+P~=w`S-ZKg|(?mXijE$oYFBVD`{$ z4td{w_vM%KE{J>VHVb&EH5~*xHAjGuT5dEj0K**dK;k3TKCtMN`2ZM=qxTv=T&kB{~1x-Lnwrpf)iJ9wYJC6*OM^zs(_!S4$F9nl8>gj71+YPCkk#~5Sn zw(Qn@4}Y8S&mL@1k%et2d5 zU;g9A%gcpQxmqe#+p?-CG9nV7j8gNK(>wZPS#64K3Y@ANny#Tgs2H@~QUg3!uGWGf z;ivCjX~}9J6zt1{W+n#(fzRa&h5V#JmOu1E7rarz0k%0cY?Z00{vGZqjnZy1;SX zoz|5DS(NSDw{Inv_a5GJwx+oTKA$j{-F4#O-_RTWm;UmfC&v47x%|;1J7=ax&Yi#U z_1}Mz_X7v8Sdd=$qi_HC%?}I3vZ3n?n84!`k01KgC-0w`90Gtssm>Uql+_y&K||LW zV{~GyM^h9{GkVfdsVyHlG}fExy!GkY?|$j%fxW}A&hV9M%iW1cJQi%Xm3mVJAY!Y{ z`#=zcdc7$KESuf4QQIh278$dZuB(YQ0FbaV3|xV8HvV%<5Yq z!|wRd=+?QHzVXc8edmY$y|Ha0>2hV`@WDyKk%h(lcVGFzo;?#aQTy!E-=frb_~;Cy zMy1*`bouGe9XoP(GTIT$ua>q9q;mO6OH#y^tm~kv3Lr8=tu>T^o~S`-C=?nRh(7n_ zU&*gje7rB#85aCB910-eA|Wo5?)>EPg4EUl7}I4$wr}rvemP&MRDfV6y-gHLjrzJ7 z4Ob9sF7${filS>g*vnv14q~_9ZB5YE*Vk+|tuNa*G=s_Ui6Gb=S~J#$VK_9@F^H%^ z(aC58WY7{@nyMO_4ve+L765bZ<9Sp7$`FwwT(l!S*uQ7@)Gy6W3>FLZ)wSXmfBo3r zJ>&oM>Y2CR`S9BHrHxvBWu^QlFMh99Z;p>na1IfSn&g&mvTq;%D zM-FbIR1FAxE??R{Hdrp#HC5Faw~{Xqq8hq^sC33+yf0dlb^OydUpmFli{m*^%GwOSnjmX-^r z&-{F4t)wc3qUt?8@t$--lC&-TUD<5v^qF5Ynr#Niah!?$yQZ=e+k3CguMQ9Q7K_#V z>c*~_E#2`zAP@`)q`xY6eY8ufBXOKAA);qo(*XwCgY$F9 zbN+xI{TvD$@pI_skR$&O00960b6#Kd000kvNklF7)o)yncPd^`WUl`+M3NLlg7q3zu)c z@#{}cKGHuuzrvA=b2>Gf08T?ex7UrQXO}r3!yvk@#_Iiv#FD=zFgd;a$nm?kbj9-d z)ep}Nd%a$lOGvKdyk3u@=)^2}JRYA%XlkmPo|-XCJ>YL}yS%B?EM=sOFcqgR|Bp~6 zbR9#N**9>|TNDr$5Vl*h-11|qO)CgUKqB_LEXvHTzf5L7Emf5BY^-lk@`_F0Q>$XE z&{bt$sG5tiQ=@Pw>~%-mTkd`4nWqhdZ`%_2<*zOnhOwGeqLF~68whbMAj-(Lt*xP8 zAQ-H9`iXvIo_u^S#$u_Y{P4$b<@4Ic4N*xn=N4A; z`8+2ofJ?%hFbD=b$wXchJtZyE(tK}XWvry-);K=5DNNw@Y;vV&sOF*_>J149VFdPJ zE)F5;Xi_Z$VrG^@uKjrgcN{H)0AMM;WH%yUO(wc#P{sQBs;(YqoHJ-^=?R2(_Vz@t zT$}pAk3T#5U~fL3<(vfq?t}f?rluF)e)n?Mrgh!hI{x&}e}u7c-=W@*&RsopV8`El z|KCcQ-qF6kv9Teq81J4vKQp&-b9AzMYioPU@sZJmaJcrVC-y2zA+P9fzju{0kZK3<`t+VSD;^b3%DlZ;Lah7$(jL1yq!gme*kH!(#BYZytaC z>p%I?Pu{;aIREvRj||^jJolU7ubw{kP=CjlpSkZ_-#GQxfA-wP%fkg#7e)7}XTOtN zSzW(A^4hmv%w-Elk37(~vu$Q>DX-{#J3BRwWGxy(cdZg1Q28OohKeX z{r-i88n2K{<+k3nVN-kL(&e%Cmipg4wHp9DBKU%V8d+Glo&DrD*Q3$!#N^!NE2Eb_ zo4#=IYFpc;k&*HL{+|zI8OLIcAANiofJN&3b>R>Kx~sQqd3oiN^AquPyhW7 zw>AfRds_GIZhqyZ{f|HUce{IAUjNQ>vU5<5PZk)!o}RXwQ@1W&8VZL)loFrUr5k*H zKCTpsrfHajuV&Nr^)cW~6vd^bq;8NJpKEA%M$>gp4TKP*1|fWSWbVeuY_VvRG?rN{ z1pJ<4GLy~}IV}Oewk=Jeprq@%01yegM{f>K&t*;=>t9`6HH<${-ME=xE#Dx&7{!9&5cZnSAo_rZXRn83z5U?>-g8 z5KotaUI_q7032X3p-j)jr)HK`v)MvkSxzJ)kti0qD2lOIj1bbm_-aa}A_v5&0iuf<3L(@aj1rwuqN+L}9E(UdD5u(Dd^H|VZSyfc$hu5S)P7sE!&0XW;<46$w z{;2GU-m@c`DuGriB7n)6l}Me}`doe3^Tyf1fBE^lfAGr5zMUPf{^36kT%QPq!kJ8V z{rU#OFxRhN$3c*U%!P|1g5Z)dQx$gXNUzH!dA+_=Izy;@_`aTefqZ-}gRDNgSz^?T zMrwicOxDn~;`ZHJ8Dm$j+(ZHf5DdKp2nk4#MDxl(^4j1E2q9S#43o^wPH--l3`8lF zBq5hebI!0NiLy+oS(Rdf4d~^5ixXor>9iA(oiz{;Aa2V5?A^dBp__B;aA#}#o_COc z)k^|^st44C@-b!3O~%J=jsb9too4l)Yf2I(1sePd5i#YJ7QaqP&P6ENRmW|)i2{9Akk(ztL(eB5nAhM)#*?S^O-!r1dfR%ocOlNsymNVSDt`XL z^|#Jk#FC3qO3fk`5aZM(qwcL6T{8a4>EkDk@452Xh3kW(d8N2~JH-g$ROK8tcdieI zeV=|h1Rxr^j<9<*lk<2zK97{k<|!qNakZF5NaO-DiAIQ4VdkA&vts>fw5Vq6$~Ls0 z6#*~Ur5X|{^5yDK>}agZ0fakwXDrsxy}jF7Z~G-;AC+eX?Q#-@kzDI*ygHg}-x$7e zb52o;FFbp9Ys}Zzxj_WTXgqN{eeK%#(_gwjoly?#>z4zB8FJ2rZMDW+tB$Em;4Q46;+~XGG@rBWw6P)OrY8*+3l_)h+E9sR~-sQ#^b5TUC zEv>fM1QE)RQ{ALN&YW_^`qdBa7;TLWDPgvvf^klnXyZ5sWF1<>KM#MZ9K28{?A*C? zdTOeC(_ZIFi`Zf^AXMAb(t2=ROVj3#fTkM<`n#eY%m65W2rzJC_S>)h;Nqp>fx&6c zNII=9EhRYTx?#rZ!w2^DN)m5vX}q0C9y@x^Yp*`HvXXxO%SYWVd}}F@Or{datR+dgo8G8*xXjW1|gesfprzyI>%<>gfgBL=u3R+q`-uqgKJ z>P@Axnr;fnmTMyc3y4Z0-?h7YVRj*_WCY}6V48+%n8iwBa|ahx_Ire?V8qHe%h&*& zn>y3w2vM~y#Hy(BTXrw+AOHXm1<}H?sj2Bl9({CtY#c$kOT&Q!7DPs9<(N9S(AoTd9ag~*Vosps+vxvt4v(6x%dTEcfPS| zRXV#m)2Xy|eQPmp8b;+k4C*5hoAqWK7{?e#!fp5NdtmlDW<01Fqv>-84ZqDyvFM{G){DBxRj znXD>c$+xdk*ch0=+@p`bt z2{kaooH5QQLWsi})5l`5#PV$bCl`mR5#2lVQlFdPI|<7d?*LS_n0J0f)lCGZX#xUU zdtXIP)dm~8x{pVj{73KW@OoXV**wOaF(AYU2R$EsdNY1237kD~a^Il?-81va@BPIq zO^uOVeVaL_N};3~JQ@uxET&4Od?u4;_Ut=ljG6{94Baa2ftyy@En`k84cFCDLc`&j zhFIN=8mxpBL_MQBCWB*w8Axt)K1h;m7_s^J%VU$q zr~%Q4+P2#OLf5r++iE*x?d$>|`KSNz{*^b+zmQH|xpLli+(<-w`CR7OJFijdJ@_gc zkB{c_<=FVB*&>UJQ%<|>Q6x+Bz4zXD_%JJnB*8tvI>HJF#smiN9EaBHW+bBTAJ!Z~ z6gAAKE4T~5rl%8%A}=q`UcLINuB+d^cInB+Mm!$lf;o=qQ;=m9fD?yQDkaK&PB{Q# z$Ya91|_V#j~$0((<=|sM0a?SyGv)PP9^lR_D%$QuMG=O;s zQz0;b4AcZkt(41-L&9MtvpD@%KmK#ec0-DC_1l*g7bZtX^+%7^B}tMni$wIj-9yfN zgu+hS){T&5HGz4m8unaQmK7WlKKCgl)OQ1-c?SJnDjtI5JOBV}J>BY{-&6chNa21^ z@z%}pfCTus^1{HJjo@H-SPVTO9kU4p0C4>~*S9ve5JIvXVQf|%3!gbT5gC<>rP^d7 zQY;;5VHG0`AZ&-6o=e-56$<%8Vq$YU_pLu&`{c9x+u7aU{N@410wHwe%}b9TXLGsI z{z0BIfq(&$R##>n+qNC&^r;sL#cDXLI(8dGC%lwEba)A!dui#yg(V?GIP9lVqX+xB zO2sObnkVMdmeo8w%tm`6nV}g!gBp5tfKtaY84Z+&~5gJtd=Ta7IZEbZf zM~v9q?Ao<=U#-=P`+0Kr^Q}Z&{p`lmmf4t|o}7w}F$B7*)T~xMpOrvl z;eS8=`tY!R>-KtV+_-q*WUFNvBVo%TZQBXSvY|^yl~yPe5&|6_9?hiUbF+!lr)DQ7 z#}5yyfFuxPX=(0_Z=HMX@|vp2w{AUHT%6n5I{NCthV4*7+)}aBXb|7`#-oX&vI&B2 zZmw6VWhG>A<{P6UOt=oQv5-LGK65E0oU`<7x?BvVw;Y?r*|&xPsr0H^IAB1c-+Vaa z=19FcH2ogh0L@rD<~Ytk3aB3m0(6f<5e(Q$P|Mf3R5jz`#qUanOliB`uycjVzy8M; zN(j<3V>fSaZ0!{O{-6Kz;gj99)j2?5+jiS-z5C7^=gwtbzr4J9=EPtA#alZ&`I(t` zwPqe3(iR;&1|KyWTOQo`HyBM=uH^1I|dg!{;w%rj!xpL(aAzrCi21E<_!u;Zl zY1Um=0C#mGOo)RdBw?8|UkJXLU1!V_f(P2&dw0Pwl>K=aeKjAx4Te@g;0P(-7>hl- zzlvvmD*~np?(S%crjESy;&)%a_QSn{eE=_CXjE&hL~KM+aH(t(;sHWqk+4e~-3b5P z-+nJTW|T@thM{uC5rSs3_2EZ%Ez8j~xm>pNuypygB~4S$pMMnq{`zlzdi(b804V?f zf&l;snpv8uHQGpcZ(V);(@*Zq%*1!HIV>qc2&Zki9tXizR~K3qJ=o8IAn9~$JTY>3 zurJG@+4REtqn-3@d~biJQ|>`+k8|eXHl=P?09}IVLoCZO_5A^B2zcpOQ_XYH0{{RC z$#{s$ajyhpkWL1#h8Do!BRxp~LP(ZF#zjN!IBqqXIxZQ65A@mV? zR)zcg69{17?tw$yt~|Pb1@#9_43=#L^67i7nilTFER6Yv5sQv5TSSy9^{ENnYLi%O z^z6zkW88E7`4i)mila(Pma!g|M+~`XdN*!unz$e(=E;BcqX}r8y&v1@lbHf4u&+jA=X`U0GQ?yS5mMMQp1f z$;$3-;b1S1xP=i12mv7A1o>5mkmS^4Dm9}hittrp*&`97R;wTp0uG2GPB~}nIQkt; z=OVkE4VufvAo?Om_YaL}=p6|>vm_J>{Lmh4Q&lNBF($ak6&p%O$}A;*_1PoOW15O>+fzdF#q*08^UU&;5|SBn zF21s|vvc5kWPU#F*rui_2M2}q^}S0MPJi$FSEiDql}fE?+JungRN`R2LVbGi;@ZMO zJT`88{Hxo#9ySa$KCVhK@?3^7VvGV(5%_?^7^BlG%Pp&s-Q2@~7M7O<&{ngBL%=!n zeb;x1z>IU++2o?pC~-)42j+n^2KU=%_5FD&f7}8(6r$-`r*i%i=mb6ZrW28^#KLv(`T^ZPR^|Ckpg> zsKOLMf5=fV932G&Gb9fj=tabxxDDw0$X zRB+HVePKC0H9b0+jJm#;&E|^5vhTUsotkI25pY0Wv)<|q`3=beu!@8~5g&Qw)t7d6 zcd+aupa*-0NCCkFVBy<7^;|4t#{B+p9oCIwW3dugl3<$>Nj*pMI#GOb?HB7p+6j|RWSR$@}@nFjcqwQ=?0JBVIb~b)?^@VD+`Qe8*nl1mO7Z)*>O|vyOH(9SY z?%dt3RGN(X6O;PYtCwx3oy+Yt>h{idVSo3~ZV>=BGNMc+leW{U*Got!iEBYW>fl15d&LWg&!;$)s(!gFOTHvPX{NQ0}XmkxHGli60%)Jdc%*+5#B$X(XaE zCWvDe%jV8*Y2ifj-u-Rcc0e%C=a1J9&zzp#-!E=$eV~bN6wnP*ye7 zbzQ_r%W5~xaJZZHxFGXqqyUo<1s77!##pdvYQ^8Z}yG({pS}Ma#4q@fgKe z5G+w7f$)*Qj8n!1<&0743eJbZEBJqN&a=?>CD>n!ON;ed{r>;}0RR73Q;7Qj01FUF zL_t)XUF&lj$C2-z*~J1N06stxlxc~QMOl(hvXl67Wy^7rswCy4QjwBM)%~rP%D3E? zR4yv#l1psa*25A-5^wA-_A#&Sd;k_$@L^wNKCrgHo!Q-A&vgH$XQo?0tCQ0iLy=!A#2roJoRf;x_xU~D;-9PnJX2k zv^zeX#?$=dbT}Htqj3yaL6k(+lROwqHaFLLy;$Y(S6@7<)$5ZmPBUxCQ(5W>W()}G z({;aAR-pjn-%|?43kuVx1$e!U91EBFlbDpb!G2Rf-%r z(ne`woqx=Oxs(H;W%R;V0UnJ`819Z6cZ!oAbduT z!3Rrg5=%wFn={A~A@k*j8*$i2@Aj;>P z5rGjIh$x*#O#JZSqbEh+*r70;fZ z93Kz0<+rY1dGO(VB0Cz6rin%opkPFaNTd>!KG+OE0^5&&{9Ub*(P*&K*?RoPzuh>z z+1Xnk_D-+t@BjSaPrm%(bCnsZ0ExXIaF(prM2;n+5JqP_^F5qVEElRBE~|(YOFQ5G zwm|=qB1P3J0am^hS4PIUCQ4+fh+01rR`E{rp+Ph5#(6f~Zto2H`6s`4@TWiheQUGX zSaa=7|M~Ort+zU1I3)&JvoDpKpNvJo*LnLWr|<&qKHRe<^AnaM}DWY8C=mZJ;#yU7n39Y&cvyxE4m? z@<}WClzBKf_B>DE?hk(W-hcn$@xj5~pr6%h{AE1;u zd{LHLZVNN87z&FQz(N3kGk;+ih5$uG;pJAbG#Tf4-dwv2nE&Im*HIL8b~hW1 zMrXH%B3P?pXK%OH?J~G~?_B@-RWHvqptn{RI?t@t*AF_|JJnj%#4!;uN*_gqnT^&= z0AK;|@b+$&sqX7uqfxnj_~!A+aj)A|sdl+{_|6UMC>q4hIA#W)h#jG2CY7a*4D&g^ z8=NCKVhgh-Qf}zgg#$Cj9n z)bGE4r&g02>u5CZY*#%&z9-@+vX&7ziqb}1XwATc2yvW~qjr0pNedwzNdyOGD$xG@ z|DGNnbtU4~_WCqQx<|e3-Q75jq%YYZ)`2wGR9mYn)rwXb3cP#g?(xyr#O{3eeDdT8 zpZ7(dLmvRh(YLC5zzeP=R^`$G7!>F0Y@WXb;po*-$v`tO%-0_P0C9nSK{;W*<7Kf4 zd$~Iv=GqBSt29lj(?zUg?WfCWw z?HwYgwYJ(AV;y*Tp54CP>79;&4BHe?vO_@FYHwPj{Ynr=At1kcd9>5nnNFtU1Ziun zb!0FQWDE(id4Bxr#f9k4zGVgRviJ8QKrdbcxKIE^ks>H|CzeoJ&Iy)*H%hh7Un1^Z z*-NHLtJTW09OhZvie?vFwg@d(uhpY)IF0)0bh_EPvwv+noQ#aiUVS~O)vH@uwQJWp zua1U!l2&}Z-m28=LB+>@KW3-FtFg_2G&ps960@`9tX~Og4Ue2-#{H|?#2k)B%9zgn zZkkO~m7+waj8O_Ck+#lSMl|Wvs(c0g%eBqjyLSeI!P|Fk4~L`6(7$xLa2~g!6e@_J z#Hvbg&!g)V0x$Futn>^7#3V^z7T{}tqa zFfiH*3C-487*2#Ig%Cualac zpp_;AY#AgmIR<8rTyAf@b$I;sbEUEi(7(iIx#HXT7fPACuNEl+IaBU$zIpY74?lSN z>}joDbBi!2<&#f7`Q3m0?lKU+y?mSY2Y`cvgO@K~ z&aNd^#IhTU`I^kqY@YE*FK8?;I8SL*6q|g-$UWEbBIz1&w>W&gbxga5_Fbc?Y!AP zIkrYQry1ta)9040w3TmRuF^D(r}6Sj%gp@@(ElHiTvT^S+yPLm`2Zzfv?ygRBwD7VXc1TC8uZhhZpCq7dz^gM0V?J&pu9 zt8}V$;>kKW2W*tdK!VE+139fplFb$P2$F$_t#;NV<8T&DVK%?z!kG&Tf>5@3P+rR| z9krPMHs{k&?o}7cfB^v7?e^SOUnr4P757g700960F|>th000MpNklHJyj=Fx5 zn1D^R^&gSlKtyF|cYAx=or(QZ3uVzJpt|1K+1j9*04P#jRf)J&wY^Q6r3DqUDZa)N7Oz zF|EOZ1X3qiBiYE5PN<{3HZC5m$&I~3GP-WJpie&g^!Gb=UcX*TdDV0aOgVC*R;yFC zx}EkU#aM<8#To#sdK-XZtm}G*C|g~NlvfO#IZv4V;jWhvdUg`1*z znsk?COioU|w{PFm1dy8U^sa)RD_5>uy?V7t?xu?c_~A!KpA4R4$!E_14#aZOrN3)M zp?3Q{IuJbnz}$^a&v}H+nzl=mNS6;s0zwQ@oUFy)WUg0m-SR+!ZIL|G|MOCe+@8?Z ze=6TPnKZla+vmHpVR3PBWo4ytaZDVrwmCG9(~e(67SNy@GV1G$x+ct4N&bs^UHU6< z8ntLRA%T;rx?=+XhWY;7+Hh!2mpn-lT*ah7?LQt;yB=hCGWIM4+!)v;r#U|p%wYyrC6ZmMuL3&c2#kSct5 zgOFP-x$RG&Ur6TX)TvXqe!Hbl?I309YeFgMG z#fS>rO%kQV22j+UK0D?QiLiY3jL~;gTjW}+ak0Qwp?be50csOaf00`x)YC^`->-UM-jWa@;6JbbO_Lly@$rk7FR(1QL0bZu6DS)&PQ;LE>z(RL z_hQNdOwUZ~n^=g5t{hD_#phpsv9z@G@ZkeqqU8v9!KI10_|gU zLq$b+1}I~sVHb!4X(M4ixa|k{bXBNILCPMO4|jBM}{#+W+#!OY_s93AJmJ5P5yT7lDAF*XwDg zvQDS7wYim3U5#QUH)#~uE|jIyGcy}+HXI?WQb=qFW-Rqy9RUE$&Cd@LsFvNt$&(1U zn$2gct5~pSk{Tf=zXbt+^8uosk|!fLD_90dd!HpBgd$*pb*y))iWN)h@8(NrQvy=F zAVk>Q+B69dcxZlZeK_Qun$_QSfuMhdNU@92&!86Syl=T)7GK!^(lY1x2ve+{*VUmGx{=)f3j~)R? zBpk{j#>h8Rv|AxrQIvIE$+ndns8g834q04);uHb#-`b#E;cRqH!Cf(Ujylg?u;~u1 zcB`uEWHTA2IDJ$G(Ut_7|416L;x^*k3Cw0RlV;y{&ow58=pEL^6E|E$_F#7Ra1cQH z??J3<3;PxF{;Y**Ac`jd=usacA|5$nxkU$wI@U*2~mH*LXN_c3gwL-5~y~-^m<@n0Dn9uNz;3P zUbmOZAOKvzrIx%9FhtSe>Y8%*jKQs^-kaLf z>kXa^jC?){Apt{H9wh$NuFyt-s&i_lDNHqqHqk$uT1&=%00030|ESviYXATTheTw&0nveV{UdD!76wNnA{vw9IXtbrE7&QhKBPRa(2& z1(__B#*mN0!8yoTn<3Dg1OnT(?%dgX{o4J{QZU?h(Zstj$+Wf0zk8SLjynwEyV(KYC|ezx49#idmEi5C9}AJ zh^o(}eU-R^{fFz4Q~m2sY@#8+GqUQcLkTK_`Qgrv?t{0)vSs&7LoEY%=iXf!cM>|tW`NKzsEJRf z(_m=%Z;wLckZuXHM-*9D$6G6<$oLruKyJS}Ijkf6AaM2S)sxdx0F`Uv{zgvhWzkZi zZqZmenUQ_`@bHi{WVNWqIVb=ipSW-_yU>=$LaB`YPbL%Tt3snvIs)+XufNp!@anHu zdM^eT_aA)s_U+rmG@_|pe|$`Z2)J=`Lr)ngcJ&hkYLYT`(*C zlt&vdMkp7e@nlkK1yM)i&Um8<;`AibM87m;W@lR#ogQeG81bl#N|tSgIp%WWPfeRp zcFh&*T9_LkgVu&m9X)*X=*`}n!-GT5U~g@09rgX$+1YG13ks;;n5YXtbo1s$-yele zB~oNRCsLfo?*<{)x&G-V@6X;ZtcT;4gBBGKX!*+W#ry&!6Or)#@)-G!LE*{A5d1e+ ztb8rpQIe)>hzOQUS9fU}ji{rqzWI9h@7*S>wV4NyROX>7Ja9a$pn@0|8h7N3WvB|I z;%9P!3@t5A^h^;#`(j#SyFfUjs!sOI`-_&0N8^jx?8Em(bv8F|@9*!sj)ra-D)=j< zqj`ZXF&Nw1+mWDW>G+KoFJ3S+SAO#3X+RTLp48B36xXEWKnnqwOeQNUD?0QAWP|P~ zZQv?sFflB95fZlI2^%)R2!&a!TFj^@fu_`NO7OfZfF9;-@P^x)x9@*@9{}9@8~vqG zne$+o@Gjo(v=jNhR(ThLGUPAy!_v@e2^E~t9Ngw4VFs?@|syyFW4z@@1ss24YN$;$dP zd~Ijv`iMSrat`L~$6)jQ-x?aWfBWWf(-E?X?ima)e)mHu8ELgg^WyqnQJ=Hj9P9Xt@QeB2j+pP0Hpx% z{qbU68hkN>vAn!|a&lq;pd}=_C=o*>Cmq3IIZmI8SFpvB2E_m#SZ8M&3FKoAZ>
    iU5iIJ5J0^2M1^@TTQB^=ZdjucShiP|uD*zBl7C!P+pnvxKS+)#zG>(M@7=cTb zVNfYgg#_jO*lT5VHGXg;gAK#oJ$XgbHViPp*x7l&jHRV1h*nltJqC7&CCbEdgM57Lb4B{3`%aC!#K7EQ{3K%q|ru3IMov{o3(SU%_4(E~OjhbJ1c>j%8t^ zgCM+yMKO~`)=}6Qk!GKq9gxk3tuZ?p*~)fMHG!(cG%t_eCKc4Ow{RVWl@lKS^!VkU zFE3^@#{>31rr9J9YNsXA@7C7W`lCKp!2GWV*+M#lHKQdDl*XLBusbC~%S4bRi>XMc zQu7R`k;O*z%8Zn8X_PS1>KNNp8y|>7>d9dou^83**s*0Hi%lj=Db}DNNKMAHT2|Fv z2pn;B45dY|c&YTw-vpdGmO9!s|6t*Q_qOldxqCO_8igLq5G?+88)Az+DbSB9rm|&^ zs9~mUuP?s%d@`QcnuYY$p2EH}?It2~L~wXWgvVvQAXbNTirjbeZ8!00000NkvXXu0mjfQ+WrM literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/163.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/163.png new file mode 100644 index 0000000000000000000000000000000000000000..4c5bc1510ad30f2d67e076bd1208173783b3a443 GIT binary patch literal 18977 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 _qJs3r*%Fp1|d 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/165.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/165.png new file mode 100644 index 0000000000000000000000000000000000000000..492f117d62385972132665f8431bb0aa60137b91 GIT binary patch literal 18690 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/166.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/166.png new file mode 100644 index 0000000000000000000000000000000000000000..fdba9aee841da44aadf0c3b3af175c804abf4642 GIT binary patch literal 17615 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 N002ovPDHLkV1lw)`>X%} literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/168.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/168.png new file mode 100644 index 0000000000000000000000000000000000000000..97709e5652181f12c68ffac844ca0988efb9af52 GIT binary patch literal 17034 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/169.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/169.png new file mode 100644 index 0000000000000000000000000000000000000000..cb313f303e62551b9d5b96893652626ef6e7e8e2 GIT binary patch literal 19384 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 Hu0mjfL)Ms} literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/171.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/171.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaac00be13c0887df57ecb1e213ee62d8c20afe GIT binary patch literal 19817 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 UXz`Q`*#H0l07*qoM6N<$g4u7XjQ{`u literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/172.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/172.png new file mode 100644 index 0000000000000000000000000000000000000000..e7dc96046ed3bcc164960377a3a714f64ccccb42 GIT binary patch literal 16852 zcmW(+b5!JAAD@g3Gr2ZS#%3E6x7y9vY}>YN*Jiibwe4n`n`^T+`<>@Kqci{AbAI>U z55JLL6{XQpiBJIm0J^LUL>c-U@ZSd+7Wyr(bC(1Cfj1XZ5CZ_}<3GF@B0&GcIg87x zA|oTOZGYJU0FdluA!4c?IWC%F&hwfWX*YjlsXt@MPzS2siHa);Nn_x+yD`6DM&yuYuEbv!sPoTEPHYF^kfSLgRhEGN>jk# zw%W={IY_fQhcOL@@`5s?n9R%!{A(N{4}qv#*EB~553^=xW>!?Psi1LFf+>v>{Sfbp zQo=IX9!EzIV46HG-Xz(3u;_|Lx4h|ueV-!yfBYF2R8?mrKH9}%5;GXAGaFj4DOhpXsb}L@ z-Q3(<*7UzUCIhkd_10P~9(OhWRD%`|ta-)6&vjV7@Wor8OOguya&4|AN&4B_dH0{lYzLbd$9^O(C4d%$sJF>!^jh$_&kf?2VEhp-+EDY1_BdbSLbRsil0_5g$`*%&v*{0vKK(%}2-Cs@q z@^D~gi0H;J6@|%C4xa_8cUCEV326KEHCX#(WF%6Cz63IBzb3iHtdk{_=$OZJCCg=G z;C^wQlapgo&!3XBeC8-)$vq1PvbD4GdwY45?x5Av?M6`f_hGPZTgN9T3>ynOF>|q! zptq~*t zjf%Be4V|ti`7SAB@M3o;zO&Z%@gFWnU$H8H>1q`#Bsf;&{iRjk@6k2L4|C)ASl@|Y z0w+`;E;l!KZcc?3Su$^89Tz9y6248g5l79sc+G_kSDAu{Fkv_3ItNw`=0U-w5X_$a z31KbgIqWZiELpDO7Mh*uU72V+`4|onE%xX0`$%_XTA%Vj!;CV{iE(FS3+nNgm&fZ( zfB#5XF_Tu&LN(eiUpEHP3cMGHy4V}{_e*L|a@22rQ+6X05;jRZH`u>+9=dV`Ia+$;-f*ns2SEEzaz>y?t%FvZ2F$?QGTdnvNoA$QE~zh+IRe z6e=uTdzPP;)(R%$&(J=yBSUVs`htJ|_GkM%xIXUYenCQ(AEPG5BLV(_UbWa_Yh43f z80(nTf@bssyRzEt;o&AH@oTn`RygvL`8<)d1s3Yf&OkI%16pD03!JR=LfM!6N~7M2 zvyRECFSgLley8yjaZ7ut*#rL<@NAmk)yBNw;xUUJ4pjvc6EpB_V?%#J{L012i3t4z z;>877n~A9=M^p;rXX0~xVYJNNR*5OC_jfWe;txSh;gX!T46M0SaHaRbF4%G#-QLiR ztRg)$ema>eaBy%?Ab784@-xj#VacMxaCX8?xVy)H+eg^{{(QadIpdPwfygT}Fm=}w zj?;{};;iTtEpZ@N@H9?V*hjj2Pd(RX$)WHZrSo@Cif2J&xvs>ksC$Tmu-DDu!$U>{ zGfOXj!z<0|!omVoet*^X7G=35S25*qrzpRM>8`TblarJ8__rU;KvqO)d&O+(jf;CP zHA2OtkH5Rt#(Bxo74#DLn!yM_dIE2oe%fczC#<#vt=_J`{l8-xHBb+yDSX z;D68?qpk4eqb#uIm>~O0c<{hLL~6nVu$%gmm;_nhBa^G`S>U)mE8oCQXGr|Cc;V=%t z$8-%RJSSEx<4B6*ZJRD~AOXps6UkWaK0CoUeBRWT{Co|tliS^z)h$&C{0}L2*$X1y zi^DPT%;4bPw@(B9>MRA(m{K~azrp8IR=KoBjOoRz-{@|9@irwd1!kP@C7Uz&U7bES z7pE{?cUlIK3j4q9-reCL|72WSbhO%!jV7A2EDn)(v+PEfl!VQzY|vza^k3`3Ixqj0 zYfmU~#HUePUm=8f&^#6}H6@9aQs}sryiSk}EiC5ssdM-!x#lm(l(N8>kSGFVT*Q`FgxqS{fj;gY9$GYevCn1elYe0P+xSiL zD>0D0X!(8~m(APJ(ePy$_5A$YRTs$sivl?nuyt<1?a{EVOu}`{RSHTRF`0EG>0y6& z`aa)J9KQ;Yr3CEalQ4YT(8n1hwviOTMh$nIZfm6Epsqb9%-DiK^Y?#G_qg~9ff4~- zNav(gaNEV3J+jg#Y7a5xY7x@-@I{SY$ll9Kj*y|ol4~Y&4NHm|sVAM;{E66!bja6vcnWS|Vq@xlT%dorQk+}+uV{{W>GQ`A%CMIf5S$66Cf z(SY)T(S^&72>CMUs)bRuu<-1d*h}{48`YA2oVKH)eZ;rn!7##)02J&F?_sG09tVF9 z&}`7vNz(Y$C^e9aEh@IQuFkA+WqqB5TdLa9kpBC*`$p;?R|fwBG722ZU>Ne z0?=QlCMQWrNm@?0+AB*ZYzYW14Jpo?Q zm$JEqW0a51;@t(M6QUa1qQ(5rRzGLyYzjBc%cuNo#E%!5%w*{k=hr?>J)wfPwhZ16 zrZjGa!Qhnq&-)2tAMLpMaWIqDIntbVuL!c6d=yO#D%6oQ>1Mxx5o>22>T>HAAjnw5phC z!=0UFEAGW(kn`I?5970J2niKZfLBc96tFo=u zD{jTm$Z6>>Qyk>f)z+qu4H45e6~5%l5AI$)oSj|hxX%B+`LWrsIeUH0T>_)igxy&Q_9eas-oqU>k1BCyfd?$trCpv=37>`QmRJmoi!gXP zemOU;*mUbPMp~1!37YzXr>rY*Lg_&Mp+h!SCpt=cC}l~HM*JSsf2jXm?cOZaVT9~n z><#u;BRuj3$#xeF`QSTapQwSNwc$9U%LA}H;35|FB2Wy z#$7O5H4spmxWHa1>+UufjH9Mt`3?od{QP_p99&&5O?U=R#<&Pld*mH{D83tj?{>6@Z?P!fq*rJ}ejDOaXk7WPH23>$HB>;dN z^B*?&=zO-v9l;e=TUft;YPp!>MuS6x<46F;kAS4f zQg}z#r2_MfCbNtlXon3sTl;5j@K~>&U`xo*t`ugRBxL5uCD1WJEF4gvy2px3e7n^H z|B-?m?8;?-)Q@La0SG-MPnnvQ>659Oxk^20eBH#&oI-fM<@_ zbQq5l+`jvC%Oc|QKRm5;`&p!2 zsJ9jbvI?3g$;6CSCSvozwG1sY>1oB&;G=8$yNmHfGf6DD2R2}n*r4LzYtyrUC0Hlq z2K;LY^P^8Wo?zgIioS2(KMgFSIz&{X$J9pN7T(aUU)En!e@9kGqC1@vVOVM^WhfC8 z6!dw0a)qKFCuk3_nh_qvO-%?C>vfBoy^fcbNfRjJ>13gIpdD(55QYAGEErLALF$H30*JLfYxdBh z-_BHUa7ao2^*47fm1o6qv#>q{UF&g4M0ii=RCyPAuM%An9}>yyn+$jVPc8R}xw0>QPe**a;#&ekO|SBO8gI)8RBwa* z?nxek#PWkhR~89WBZ{rbE*-C&6VZRP$FIAX#tNDIh52-u(htTK%#s(hIoOh^Ax<3c zWbA%_|C5mUA_wMO=wf~XxSjUAN$^2nkEFOJ*^5#sk#?Lj^~`Hz4^W27@IgxwAZJen{9DB8}h32Egj~kiC|U? zVt8+t`@u<_o0kx^TAF#bg4@5xdCg$Fl9b@>OBa6qnl!nnTd!pN&_!*4rZtaN-kqD9 zTZgA!*YidA^?p{FnN82c7(LUr;)1m;$540oYhz<0_Ylii@z+o`Gl!Se7+d&hjy}9^DIu*%=NvO@D2-TL14vjGy`U-AMa|0s`==t@{WBL8< zuy40$)5rUO8@ar)vT}5HH~I0gof{F<#I2=Q-6#);3lCoLnUTfnH-lA{rGTUzcV+s3ThIN9UDOQ(4b04dqB3Cri~d~s|d^~rxhm20tT*Y`~lQ?0+A=ZY3JnT3tt zb^7sJ)8SiGZJrxyERZtLO)1nJxc!bQ_ebh<_(ZKqMILTvej{0&J^t&$9(whAf7rWz zbkeeHr^KWl& z=LVN&Jgv>#-JB#C;f_f%xcjCkG_Rnv1s{%RkO|~N?c20Fs`XqTIrEfb7j>kk?vBn>L>wr#W2ygG*cW&tb#=% zVABk96;PSH4MEA`i`Y}zHzJ$e`p3d-#+d647Jz)2iW!9mHypsh%j{(?Prl8e(uqZFJ#RB_=g0)es9X zE;^zwHFW@8)v-^rc*y#C)7nv*8rQNy*|lUE?lhfT_lOfdz}>wAxghq)jbBU8C8__c z7)0K*=!ioo@zE)}AV5NjZNPyyMfu4Id%^T0m3O!5NtPJP!ymq^m>vw#{E$&MbK>-P zgH&RgNSdGbHDY3Af2NA0yz<p29DTJ|<`O>)`6w+!1n z5#_}uDavxOAI2Vakd-u=Q>^T}tyUMG0TFfjy{q5qy4`cwY!!5u8X4;2VPPMDIhY%r zz`{mu*cgS;fMnb>ge^c}3~>%js!@!Ym#F$gjL#{*P&Cy0xTmqGy>RQhq%^2rrKYAP^EIM!DNNa@ z=9YpP?|NeyD0bU@Z^u?utel>$K+Q|BHxQkEaDZQ_lH<5CI^pL1qcw`{#<#8+dNwTT zH3tb$6woh?q<@v8cGCZ4ZH{7-lG%vV|Mxdcl9!j493JI+Oo=CM3efBM?$e~F)>A*h zCRBcoJe;q0YG|WO^wg09jB71Fkim8qc4|Mw)<6gn>qt(Ez6OpE_`hv*_r9NTz=9Gy z4q}>x#i@BAn+ytcCr^s3#}bD%C#o7txYTV~OMNR+m1DNMIkqiprM9_^mdOVRME&Hc z;^KFUClhXKuD+YDiv$_N=xiYXWJjOLUs<$9E)|t4Ph%!h*1CTSM)F$LXpq7RyU3O0 zATL|Nm_5(uon0;|_2VUz+B%Dtto(HFKdqNANQHe|e0*N~u{t_BV(P!|auD|6$OC>< z_Fv@tJT>NTBq}#6S8hNckcK=Bg(|v|va+%W4==Y`{%&oiv}-TED&Na&_1v7?aDuhc z?mtlRq_D<`pZ@VcH>OW}h~S#ytGG6OY`rYvszpt#bFI(ncBb*77rVSCQ7$IVT!Der zIi^*Xf3!fho_O92YnZz@vgI20I{yX!XZ;mNlKr5+?{q#qdU|#}PsdfWRXD;J20NJ2 z)+F+KIpDVVA#e8!!N;4WY}=yP6`PL%5y)~Q7xDT$%H1B1ua5)!j{~O2j`q#P$j{y< z$&Jx-(06jOB7GEq4Oz-{^Vatwmjk-2=N=8YP@w4&wskf!q#}G9g|62Q zp@^(X?CSdEF(F2O-0`#|@~)&&s3PY&>g{jqe{t$$9IK=ZQ<(Dab_4}*dQlTN{Tduh zHpOhRWLcAYozhThyV31ib>U5)>O2`9*_1=45|RKfr?MUMN&TG)!}nHZ<+hXk}I3m zrwU_sO0jga`vEQDJ$J3uq%&0+EWTFhUfYWcg97;OQlG&QbN%?TzSfFi|EK)q>F{vc znrNF`u&QUexSb)jJ;pHN( z-I!#;2@*Dt0cm5@gdcGUy@!QqW5eWy4v6i)U$XATU+#@0>*|Iu0UmauS!TOG$1*z^ zcKN^iJ?^uC!gTU*@Fy66P*K-dY!p+q;N&4BPWH0%Hc><=S8;t+bF#$JVq3&-`w1{w zD?PaB`OFUxz1%>ux9wcFVPR>>j#5qvkrmhsmZa zUj4bae!A)3;Uy5z%#A`6bQ%B-Awd4l)(?a|=o)vMr6_^T_=!vWXQ|+RHzI`f{KgB; zEXR(=?mmR`fo%06O})ujkVZH(3Q$jJV7!7kdbquIa^I)N=z5n zyUp~TS>x&mI(OK1FD3u}LyS)fhTLWDjj{B~_d=Pd;jb7Pu1FBM87nQJ`jP)22ghgg zBxzzEtIak?4+n=&`942-?~iE7J{r&FBo9=tZhl+Hagsuz7+aA0Xq{Wbi`gd;QkvRb zALBfzi7X~p!5@k&?y&B9t>x?DA%U#7#C6bxmAWOk0%M%>6$^%Y&327bJmR#_k**K` z6O73wWqorfLG#zGRtN@bY}orkDoaw3zaw*nt+T^ljqqdILoV^jtW<#A=R2wpBh+BdxpAqx0|>-Gg-HR$>%2BVZtbdc*S zPdZxQ<_9!4=|?pqG&RI!e-RkxPy}4t(Lh2ntXN9;nfv$mX+nMy0)D=EnKlUvzu9kE zOI5JbsC_ZM{b+dTglQcXK>?u>vz}-tH=&~)8p@l_zG3#1_*wo}!^K~E|N1zd>=(0F zppE<(ooL~N{4O?-c2dRh`^~gTfJ&4v`wE=z>+KTZo+h(~!rb1Pv)=o*doKb+E)&JE zIfG5yEF!y9$kSJju+I3$qOx4`ZJ)rPr*0&UU@V&&ZUnVV0{M|GONgk8wzc?3b)I9N zM9gZ(_4V~@H&^v{p3<&cDV9C=J)qv8-)jA<8U-)Npuy8@j)`R>TwLTNyo z_x<_x!F%Kt`Uc{L1KL}F(x?FdD~aV-za9f0dPTZ2D?5iJMx*pD0v9~MecQtDqD!?58D#gMOu%^vhP|Tka0wD`LXmtG7q+i?qH5-TyDv! zGa_M^#}zmo1MszgOJ%C8?Qen`*5m;1ZHlnpOIxjZjxz-V1-x;Nv!Cgd$Ly=lk1_(u zBUWi5_jsNDG7(HtLGqA4k0YJA+yTY4Cj(Ae3u^EQx|^;HA=C6)AEZ!dJQyDw>TOxL zzb)M6w!kDrJ}n$+F{U1SQLC-B*sc-PfDG3-eK$YWBm#|X<~S#{C;1=+F@proV?r2F zv5uN75K(J%jBH5bImUPP1ua(oJ@D&C8zcPn2)4A-u2a5RWLyJy4y-Nd-p9Y2Y(YTW z1Mmkk;t|=w(7ZRln?ogjTI1D|TYmkgzZ2g|xX5=}H~qe;Eo^M$VJ5QCm_;{6+cI|A z7F9R*X<6qwZt(F`F^XpZ|9I4?n%7jo8^hD>+_r8m4iZ@BI_qw>+FHl3Ey`8I%rth; zz&jF)6N_IO0~HCtaehLfn|n?uMqp*1w?}if!JOTA<3GdzDwB>&L4nI9T%D&Vroj-P z^!iW^=iC1YE#@q1Hk8no{h!e4es(4vLPwmwUe)Y?kHT#~ z!O5@MFW_CA0rvp7MlVZasf3sQoG0yGln7_$d}TWn#z*II)-@6Yc$D!QFpuRYBTB&(gpsK(e4 zMsK~~kRh5pHO|6#84L#JK3G61ad`0cZv6X^ug{Sf{a|;3`hyf?HT;?6FGK`nP!_~6 z7J&{)Av8AnleqDrV=+kHTL`nzIwUG7>kq3G6vj#3(Qo{?Pw~AXWR!5$Dw(5xWjHl& z1cY=EcukqaAe#)5|7@`fYMkT%m<-M@Y8^m|ZL|LzND!cp{(D=2>NcGk^?D-eF>xiF z8rS8*X7%fluyLdI@dkNstKvLaGj`(*hKZLUG2+UC zM_>3BaX!@?#?le~tFLQdgI9S0Y7&H4rWmtiQA)ikwL=-?ii1>SJ6&eE=EkO<zpxcJqm$`X%_@P}1e%_2OuU8__nA6Yk;Jz(` zy@Z5_oa@2qiBmUzA?7isdL4!g$nwI0MvD#vKoKAg8IA_)VTX2vA5(;wJi3Bk6>p$q zJ3gI7|6H^dTZnvvB!E|3TNwWqHj-}aUm@LC!~Ef&45lgPec2{@x3v9N*~PLz{%pZa z;`>)-@N?;MSqavlXOEXRx(wK$CK-r@XLHFd8aBF5=b9-9TOh`dt5*B8< zEu`P;eSbJZX+|0=b$^i`DYMS$I_CtWs?0`2Nllju>B+U5>cu8B=2x;3M=Zit0J9Tg zcsp^_ikwd7i}=4y@ND)c0#VA!%wI170H{OSz|%{CSX_ZCC?N28kT(L}*~v-HcS+rt zZp?|RmmfV}$eTNR;+(+Hw3<_{ZBA(CdMba?tkJ@%d}uLa2bp3o3`&H@?i;^doED6q zbkw)pPKE-b1R2ME@ozS#&i53IOD29sF4`_2PH|mFE@;LOJzp27I4P~Qu0a47{tgcA zu&S)I(mu(716Z%;5p)b!shHRrMMi)rI5K5;h4ZSHP6(c)4nc`kRgAYcyY=gKvs;W_ z0^o|pi|Puzu+rs{&J75x+tA=t+mp_ zOA5;7<{%RQ96#lJt^7dcbtu!;9*SWd>g@MOHmS)D#%uzfbNj_@GBJxbWfPi%1>MHy9Ac*g{lhEXD0Desm~5hgKTMNJfWf?&A0- zg#~+3grK+D+?iW;kY8bCg?mGC9dflgBT2^fwezRAPV9IZyn9RxHGkz-T#)2tMtHQD z^hMwJk&e>sku3Aub~sr^J5TS7$%sTs=fJRiu=>{}Gp07rWW1E4 zy<_TLs$8bNPNUN)mG-(t0n)OTEU;Tm9@$HdC-c0}I6=>}X{@R25F#e4<@v^L)~V%v z!C{A2d6#~hk$@2IVI=2yBFw9aZ_`n(=9#y`}xmJq-P zkeSAY7Z(>*K%qL%zwt9M(z_sSyI2E&nbWKGzQq{Mk$f*(3BtJaMr`iPU3CYKUKi4h z7Si31vAfMf-i_8(7jhkOQj99K{FlQMJ$wW~iSONh#<^n+rw*JMQwI<;cD{y1McU+F z(_YOO;NU(3c0N?F;t@wbxpJE68n?n6|3!2mxy0DQEPr?eaa%1H<&;&|Ne9NC{Zsz) zz=UQw4fw=_=|+4IdYJOL7~Bz6LnuLK>Ep^qb+KGG5-%GdPBmoXAo)w)q3Peg;P@Nn zimKpOH;54Mj1<`RbZNcel7$L^<95xrr2S9{u50cWFjouf!T z0dHiW`=?(i$pP!aVY9z6?%qmZfa@5L4qYc3dy0o_7ydyFB>m zo@M}g)(?fwaX@IcZq?2&Nc;i7Vb7gCR<*g>Vrq7xv(|!C^u0NaugR8COg)>cvO{J# zrhc;Yn3x0=Xy~gr(MnFhKIvTfP$4RjK#J>zOZvkau{D|RW-D(zNf9mI_wHcdDKknK z#(Z8h=82#U?!3hoyeBpk(qFla zwFNxT3I_)gMjl)u)E+_nI%{9!VIIgpfr8B859RgRY132l=j+Wn9BG5%SQ3&t9YxP% z#Q&9x!ZFE8zr_}Z^9gm=MQnzj3Ixwti=`JUE@?VXEe*;R1lRLuMB+sc?C+bB8Im_j zLqHx+H%B8QH%rlD$-BEpSH*OnsbKqCEUOzEACrL8AwVCs1<3rWdJq6`LJAm9*XUhP z*v;JqYFn=~UMmi*d*f#aIY$*@t<=Aw%El&dc0Ib1$s2(@Ue;tqoCJkX#o}u#%q{@Z z5IZ|FZ33c1=`ZJ-{sxL)$Ow%83Fa%7J#kLg?JBLO`(4ZI;{p=+SUX#6yWPJR{gM1O zQ2b0FrhibQk|+>K9x!g!`1q2R8DDlECW#0EII$9IuPwSxWWoKYVUBX2wBydMtgLQ4 zxs@72s%b=J(n?!v;dm?ewdS{LzQ!lFqzMd>6C@|6XkL`+-yFeBMDBgP>x35BO28+$ z`mXs{DxjJZ#V303r}VKN@q=@h6}#4Vr2jlv!fWCfXg1vO|7@6K%TI>1^0+fayHW#oM#h#9&RN=4X#8GNC z%Bz>;j=aPTos}IMy13}!;VG)dHB~I-S$~V#4grs4)m(!(r(hOb{}C$&d=K(KtrRgC z3%QEywM6OVk2d@ltB&$muJt;wJ0AQ90ON5RVf_*s;`C8>}%?w*&`mT$2=_0kPa&lQ9bL(@7#f;WE^zuI?gGSS;uVp+yM=W#ty8*wRK; zTltA%@%-lwwdS^*>v^*zx~#CnjN63#Xq^d8UW}Xt8*D8JA3Z+#jJSCgGU2y}>t1c` z_(9`ewq+zARd^4snTn_zXHJ^eNC1cTJYMVP8|QYiN7~*YeFjy%^)LXo67$4a>WO6F zaJxyanw(_fU5|}6)hDjL^>#3m;Rs^6JYo&5YnrKr z6~;X1OvAUr+Jn~R3T*JCjOIdBWovFO?PW~4{qWnShLtc zH@w^3+4#J7Qa8u6w)&^5y}g|zHl{v>BdcyHdcR@mWZ#onfF-2N-sQ!&}IL8oSi_q=JBE(&ifRo%+opG6icPvYoCqoC_PrAHR-azk2a-eDEK z00zJX<%&KZZf_|pkViyxcDQ&s<92tAN9HKtbLf}}f^pKmiVqR}r1Y{T87N($qny+e z-uWGl2{``u&q;?f-1K|4YL~qFk&XOv zYatmj@S@!WGRj?KfRL^GH?3tFe;&L}Gc+?b}zy1)HqaRg0^`9 z7cMn#KR5S9V5~p@n&im)yh=TaI+grV%gl-GVu{?{lu@S>BEZ)|##mbUvaNw))lVo` z{Rx4y%m@G|?p8A3?5Fs7-B0zty^<9a+7ZV~6VSu}@T*AZFDWPlpy$xi#;*ST(CxIh%Ja*-NSXJ5n#N(=Ij5x4rMdrB)az!GDdr>+E*&XY}7hW zRUg#Mw8xQDwJF75D+$7B=`dMLngS_vy4#|p67r$+Oa4%Qn*xy#3nGU!8YQKyhv>*k zq(3J^&M1IzTN@jCS+x&E(>+M!JS_4w*nLss-_ldt#wun93h8jxW>pQ$yxn_yXG8>E zj~yP6?zp`_>mgn2wjuod=!VOt93OGwx}8(ERIR-02=~-nw5@_I-5sDu7eiCuEi`=n zvcalVfXNM--jbK2zn$Qj()u9-q=ATPxn>k5{cMgZC!*k38O5Un#YWWWbw9m5_sa0f zTf4fs-Cga{0wQ)ZtV}OQtJL9E?3S4_;Q`Y}O<&^TdAv!iC-w&hHvJwbCK?Lqc>ePB zE3cchGlBy*gI++ee$x(rLl{bl&|2`L2ab-8pwDTwjbf{oAR%!Ff1!XZkMkjoyx?Cf zIlc#enxq|KR6nwj+$7FvEUFbE+*FJDf+iyMTid9_&w;8G<=@+vcWzYw3g;}7gG1Cw zE#Wu3xfiS1O6kVEx?99(ZA#T$k+2sYp%o2i{VQQ%Fgdxd-27XvQ~iGz(E|Htnh3RG zVMqX=<>}jdWh4MS02-#%3bnCkA;UBz)GtIG5-nO;(2JEVGZia25b32((1~Zi;wj;z zF7kRpO6M$zhfIPjYHD0}@UgkjK#hX>B}eBQZwwQQlH2W`%5W=zd*PzC(vY@}Cndyq zWZ5M6e|R2Q8K#6~#d8ez+irnF@nq3V$a~hYSn!oMYH+bL4jwmeuihm%(!OE{w;4d| z$CRC$A#(XaXFC0#Xf>;Im7`54C|Ih`*}o|nK5!%ys^PVi>gVR?)5`urrE>H(QeYOu>3^k<`A7P`b zD|9y8$pJ_B$OX_b3GAIBPeySUkB0ynzolx?{)4G}|HpsSrj*Gn=?)@%e6mRp_@rt? zm|9lftC-pEaGygz=@==b0QKzzwnXXaA7nhKnO=l0mMdSp0HU4MUH2UfdFp`~iWcuK zqLm7`mPiz%%ccJcb{Ih>A_M+NSMnroANqW8!9JzTS8p>JhE73(rSkP z0!&kOtiH4L26}%x}>4^Zb7-CPer1mv0)tJU)E8P@MUQ zs7tzx22oU9a;_*%mm@pFv3G@cSS*H-uyTy)6bLN+K=VW{^IxCMOlMowu@BErPlA7i z%t?79$Kj)+#wvaIs(NsHdzrzU+G4`0IPBUCRu8k#Voa%J7X@ZQBJS<%tkYVH-;9&h zS<=A=l?u_;p`;h_H}%5eR6mT2!_SXxLk+GRpvQ-+<41uaeKT-FLj%@=@Pbu{abt5c zhe$8QES7(z1)_4q-(K=1CI+6SeOz>ebO4xIxufglw{rA#Kp z-TnOvF6PfqFQ6r|?R7X`bR_9`gr|uF&yC`gC$o#Pfm>vV%79QNe?61-7tT+kmxf0z zot+;KB>vQA45|~EFeo$2l%YH>E67>8x~A$b2YipAnrP-%ko%lR{nwC;$00o(>fx$b zL2izZ<&Jw?ZJ%`+B*TarIx93#$>wbm#Xgn$p31(N&jY9(U>v_Re>KY>%mdr3^!&Yn zdHRqw;ZQweadW(Y=#N?I71kSu$AVH*;PbBcV15YZC5<29QL0Y1MCMIXre`1d`l}S6 zrT(^|*L^2AD)WG~rh+#hdPNNm4;K-zf}=pSXbK1D(zU*x935G*GATf&dFHat&UAaL z#$FRBks09oDdOYepjB6zWPhRg$&Uf=HkrIJI+dIg>?rfUF$I5}-VS|TSgON>&Rl?% z_d2)PrkjGw-`6$nL;DKK<;lt5VnmynLfTk*EtS{z_0G@V&ift++wS*rZXE93UQMUR zsqjG+9gFx)lM;en8(=p-zwjhWg-m!ld53Y5Kr2li;K&MMVPNYzc}(@ z6oQlZ0>T9E<{A&8o}3t_lWZ+2J9>Me7sEyCceD-_+>E>^*vx9qr0IFMTI_uv|C{h#0Du@s^Z0vrmsgv?(ZtD+pf?A_ zjK{(cW2A3ioS5j;J#7Umigjcx#Hu^WP@xc@6i!BDs?`>9U zU44E0i1djGbjb@wq$>l~%Uc911|l>h-Vuc1zCM`Huw7T%GbA-rLT%pBwBTSkOc7o% z2s@Xeewu@!Cw^NhN&E|c=l6Y5ILUmIU|u*6dwY99Qs^b?y+wk)%-}(HspnvdAsssY zsa!2iz5DiTP5=8Szj`s^DaaV(tG{Bl(j+S-D1%4BHdmtWLpGE~K&?wg;d=V8ILUrY zX+8~9L#{6!+1VEXgmm8-Ws=P5OYJfc^%NR`6&;eGgaQtQTjhZlj7svcT7&s7v$6v#14jng11589{Lz~$L({3_hpMo|Av(-O;{vFHyEG8B8 zl1ZYo1yBAOfp}7b1cZeL9r%KChKCeg_;bUwTsfcM$0!VIzEWCLAl?n_zwDIx%v99} zWu~yf=cZ8elCX`Yi8>9SdOZFs!PXEYb_phkEy!LaaAo=aqo*=2C+D(U4g%d6zeZ3! zbD1=C_>=|9^$PDh52wFn)zsw998P)0)+J2l;Aqy^702QVe`u-cLM}t=-@MY-stDD{-J{<)aX{^u}B2 znr|$@c-2+^0j9WxFWw^5)IB=d+11KUnwUDqog{$lK1a=^3q+OGln&wM!gv!Z;KSO zR2iRg*x~6Tzr+q(p+O#%psECY@Ci_g!4hSh7!#`vh#CGOy$ZL1pj%;qJeXXaec!H@&GjdZ>}I{emDn>putW+CHE>Zk-=m zOYoQGfSDf!5|#Xkbh9ADTY5iCDb?b#er-r8{Bk=u6F5@1t* znJw|?TEDXa-U+i70B9k881XC$znWv|4#y9*<@p_pqKeMtUBLZ>tUvScwttt=Hi9 z)bv?x%z|_0?<2=sfiuc=Zd)|_worl0J21bhCn@LY*AM-l{w--XLtB@ZnmV$QoF#UR zBLraq3g0?DEmZl+RBmyz201w2u1bP<4A*{fq{gDE^_xxbx2U+RRo3U?eu{6^d%wVi z=BbPl+b*ZySx=BS%nmJo2UTC3Z(4=#2-ndB;;vZ+eL{yN%4Y(zXUgm8>z@W;RIc{x zJ{K}TTTK|g)nawHB2RD;uRd&=(!DZKMrbVJ>(xsihuqPn0Kw$K&4Ke3tw9KQ+s{aF z*&wG+7=|_{$j+po#O&;kqA;JGcInNn*ow8WklT@2!C-fH_cj9uj|bXUGt=}!boOsi zr>UU^Kr}+FfH<0ER@8mtn~U7?whQQ3+`zzq1*aEu+=VsZ$(W!^uMUJp9=Uh&=~RS} zP2Eps(vz3??P-9;V>?g{;m^v-ip`zAF?zLIL`*YPQd2FNGQGPR=X_dO5pSE!g_>u$ zR*EWx-f~24y?cx^4^#IsuN?-6=? z=Y8swfYsR{s1cA6^&q37=J!^;*uTO?jA2dq zoMp52f?hc^NpRgvXL;u)UYd-SkygiE97U_fRG~zyOm!8}6F74>bw~ES3C>(@PU-&o zeMNd6tuNsDNs}L{TXut1-#O*r;MeXrr&SayBy&*h;utb7cZb{=D-NbBc|65E)y~=# z&DmqT^${oa;rw~X`GkeT_Q)GL_|LQ~%DZMOvE^l>4#dm(X6)5`y}f^HaZXLTa7vED z(FH^l0{IBd(_l143G9TPK%~;rt$0WWu$bnk28R+M`f49)N?NJPZf;a-&h{~+dEd7j zYBn7f`44M-030pDmqHw@f(E2B*-{OhVM4os~5$xNy$% z5BG(rMqc91{-?4;g_avsjtRT7!|J1kQ=c^yJ|FGv?NJgMETdGa@CFN&!nQ7iK)#<+ z`h=?gFU?d@#~J6)Lyoo7!K6PZ4F&`O9^Qrk9W&-%sMVJW&&n1av0 zVnRu48B~b?8cw${?Ay1m2K{t8O_g25HMWOl*Hs`}tFUQb+>ty<0+>*&qmWXPoOLq! z`{m_1=R6*dZC80bJ4QgLy+$#DKvAohafKcska`K?F_wqZ%#u4-!=e*#lh7)liD2fE z;4sj)Cl!%{g9F=an2Ksc_Wk|675?<}On$7=kL7YnUx|<=`3;zeo?t7DqAmac002ov JPDHLkV1n77x#R!< literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/173.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/173.png new file mode 100644 index 0000000000000000000000000000000000000000..7b04ab2b34040fa38353e3bd24639320efc52154 GIT binary patch literal 17132 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/174.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/174.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb2d2117c8508cda91bcb70a04dcbcb15502a64 GIT binary patch literal 18775 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 z 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 FV1l@icVqwn literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/179.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/179.png new file mode 100644 index 0000000000000000000000000000000000000000..1e200b4e407d3b0cbd631fe820f8413d21d718de GIT binary patch literal 18643 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

  1. (=f2;SamIx&QII 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/181.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/181.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5844fe800d9e05b2526e123c719d12ed775afa GIT binary patch literal 18994 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 dHw`8{_yb3Z+;8!QPapsQ002ovPDHLkV1nnAGQ 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/183.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/183.png new file mode 100644 index 0000000000000000000000000000000000000000..fcca9102ef1a5593473bb3c15a22403271186fcc GIT binary patch literal 16472 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/185.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/185.png new file mode 100644 index 0000000000000000000000000000000000000000..0c75c00fcfdfcec6fa339ab403f05496f16a575a GIT binary patch literal 18615 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

      Gs1hS`3pQehm)|yBua*hYt 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 amHz-ABU$(9*-LN$0000`qs5$jqv&nh~@* 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/190.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/190.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c512ec75a09b7ef255a3e529b11b2d4f88d353 GIT binary patch literal 18190 zcmV)wK$O3UP)6L_t(|oOD=CZym=GteSn2Nr@8q3Sscc!PSyQ+JZ z7>IHS(@O$59hqO`-tO-8ot>92UxFYB0_2Auefa$Oa}W>&(2SH7XiH^5kOcYS6ASDN z#X%;5WHNL0k!_&OrTrk|Kv;@xR^sl>-Lp4m$g-VhApR!){Nc`%Cr<*{+e zn*%V(1A>W2tigtaM5c!IJ9bFcr!7d_+uJ>Rb2goor7=T5@(2ZA_ICG9|MN=bh+3FC zpaS{~kHc%^l>}ku#*Nkaxjeylc6L^)Ro(N%3vJ|qLiW`h3@fxWm#-iI7*ZO?u`Lpu z!~`rS4@rZYxbwjWzrJ`8f`JU=EAdJok+@o&m$WMP*0pU8EH@HtuYQvykwB8k{;pmf93B=Mw{PFB8&(!1NXqg^ z*t3Sd0fd9YgZ=%x4!Xxg%{mg1%#UARyy)UxVw|-Y7QqTs7OIgeH|q_OmK9l8OA-?w zetzt)`T9k6fT}{3>r56w$U`E}r0QGDBum-%hBh=Ot|tGmqt*P1Ij9c4DQ}_{0rwv~ zc>MUWKdP!4dE~!4@d4mv06l@=M05yjVyqdRun=<1=}cGN0a=#vC5=cxgi{1i&TWzc zXcLH>+{UgBP$j{7LoOrM~yV9_(Np+CQf&FCjGCF5v#b65;8mf*{; z{_gM^bGNT;m#k+W42@aq3>izzXev8QAPRjk=92X#-$`Pi1ux4Iq0469x;jx}B2$5S zYj8v~DV_>FOBbY=+EaTzmW7SiyQnr_xr%j+1mIa*A`zi?k82%@9Y`v2>VlaXF3Li# z3PD(dW@r|{RL-SgYuivwN*h1=?6dFw@$Dw3!o*mCP{@;mNcpRhVt-N-c?K4Wrn}0w z!47VP+tax)Y#4^lM8i7BE&<~HgZq}AEg01?Hr6I$C|Oy_%7Q+JWa>XS@2#9#P??D2 zxhP1|n9JQzBK~r81b7KaW*tC7KeocM|I7P-ee^lWof|jonKZQ4Eh3A4aAViAS=0NG zd8RkXC4gK-v%S!&Vszt|fBxcVHa$Ty1*nYx2r`9!Au*9DwfAX<4+z%h3|5wx%cZi$ z^;m^e0)*q^o;cs_j>pWnni@C46dm5rA@mU z`~7b}XQ@_N`cVV8ckjXpmO z%Z+#y(7WE_U9ukQM_B*kPdNsZj$9#cp~)KO?2lfIa^z6?A(&x{{D7WduLpMv21H=tFszC zW`(SEP(MEXadO0~BF@^O`{K*@-!J0Mp>^&MXkAMAEP;#vU3mXv>zMQ}5(d*NE)s{- ziZCqai_4bs4SoLc;2^kbNnB*D<7o3e94`cA9UUDZtCeD@-5E?<3*Sa0K~IPn(pk@1 z{(N}+@SCr{neAq_LUemVo!R$>GHAU<4NMuXEzP`!A(X+yNto^Za*i!Rn(H~y^(U*B zDSAa|Up`bbI%Hw%C+kx2)Y;)t`_b)%qrHJUvzejsC?JyE_(muv7X#(##^MYTMdB)C z2~4FyF%np}Q>VA))fFR!^`hce@yPXaf{=w=;vr-g*vUt&stwuwZC(^cI*vtf(DY3c zd;*-QDo-<2H4m+8Y`zrFljWB=KT)U1GU@Q}Fx8W1<$nAOkXS9(j~oX55KjZ-mBb-& z@Z*nrTo-3bs0ZU#J(|O)QZqUUa>dBLl(70(3$H=%Ux6~Fs!~EYN~7-m=~Kv;jSanK zH!!5F1^sNv%J;dnF^sp2>Q%3s;>|C3aq-{Fas9=Ye|z@q+5Z0i+1Z&*OdaA<`>p~4 zgX?&W(}EllY8j|$SbNrL8nfb`Lt11PABWGrzGXqyXf?+8irv8ojd1pVZfbM#?-Tjn z?(W~cwza)lod+oK=!-|I^VRzDa=l*v9{>RV|G(O-qyPX2tw}^dRD4=nZyU!IK4)*_ zk`krXm)KU~$WATWN>$sajlf0ghc*t70%_6qtw4bSeF)Iz-?Zp&YMz}szQk%{#|mXh zBzKqOUS?-bALhQ4yAlM7oSmKd&YAD~<_t01=$WPDl*zPHChGFO1Mz3S`RvW%;g|pV z(mGfD!n2+#s)T@>o14?=)S~Rn#Vdg8yi+6>AO^TLT3?h4Z!adCDzteQ^%U%DuoU57 zC{ZI$z;&LQH5xckw4CXV7%gZjx`wbd}jIR}J$ zckdp2e*k**ppB3mxmw6lB*|3PKzRxy^KL$!B8OzfL!m9py|SEVjylwcS4f2*j$__( z4Ax>VQ2)Q!>9kajG<>ZI_U4V7Uq5+*9aT4%ksFf;1gaK~e!_x2^K$A6b~g(uJW&#J z;%chG+3p$TPzfCfF8cj`xh#QbV>FsgW>N|4rqW9bO>yox-P*WQwu!>1Wz1{f&KMC8 z_V)H3J$htdO4D??Tmk@w>xn1Rvg^0ej*IkLcDCJpuOskwZt~wwc?;39gtnNvV5#pk z+UsxyB3{37{mGN3#*<)RK!hlYe|hi0mG`y*5V)9^%jsnD)w9R{dAU!VKnR7gF|4H6 z#bRKNy&P6CEU*3RDQNW5eqGlc=sc)Fnl(p&^|((tvTzXedhE!$(tRBaowLqHuQMJn zDQ0434Vd&1rWQu(n9v?VrD;k;=gyszo^ow%O@oM|(dHk1_1n*X|K}eJMs3{;d;KJi z*V2?X?A@~$@89|eE#+c>0SV=Tlr~78DpXklOw|g3z%xSLEOZ-0{KbO@9iXhr>ez-s zKYS~=#tA5^W8-E!1s^*_FGejKG~EWE6N)TRkg!Cg*#H4xI27v?{O(WhUD|r*;)OVh>asd`{W>p-$>ikt=xAOPQ5dC3ieXrm zOTbQ90#wM!Xtkb*8n)x{UDEbl;{N`=0V{vj{j?2+2mlhm9XPttH z^|G!bG=ITK0sE$@KsdV|0zj1YDDOKE0FrY7JMec1W0RQ&K&(ECs;m*zL=g*&y zqj)_2o-wvuEXuO1swxNrA*iaVUewErTnK#-COqh!41**|c-z`HP3o_p?_`<2o5(HO z*~{2$jjQ$4>TUNx7!Uyd{?C6H^hcu&jXnfnpbEwAP?Ybsde9lM`7t#$8)N|h@Zs*R zo0y6sI1!hn8jQk7%}TNXCu+sVKYzIO?xo?{Fq_T}$K&yMJe|(^X@9giYMN%bTmoX2 zXJHu3i#!SS2)dIk$re)A151rcysr=SKleSEx=9}0fRtx z*ftCh32j=gua7>u^V6oTqbSa*Y(AeKyng-a<*T#j&I+P*Fo^O32#AZas_Ui>gcg4S zKo|~&i^W1Nb8j^6@JxHTPw84rQ(1M%Swjz)BuUdY^0t70l=yHWA+|4XgApH2Ac)n? z=Ef$d23nK|0O0G#kL?hR7ob%>wZ#?^lq87*H0cOg9V3}6T>SgdSGRt0OXYhjsFjCP z1f%(aG`2a=AP@I-X7@jIs66dRdk& zZyVO|mUF?~0WTJd)huyl2@gMc=%H^ua2t`%dT^ywaV%?@N!AeK&@~~mZ00^#(%fRc zaJbtdb@hX*MNtS69_jhwv9q%?91d0a0RRXT8)`j3KpQPP0ofIP``>SEUqP2!5m7c4 zj7w8LIXb>~`)(3Pyyd**S(Z&E)A@W}*Y)J&q%2DSisE>=TrkF3&bi=qU8{q+RmW`R zO7@#3FJ8PbkM~36tFh5VFn$soZ=yQaBJ6t`$K*OgS>cfBbSg*~dGL8qT_-0e7JcUd z(#@Gi$a%}>T2iv|)AhazC$m^(nT!Ys_HO(b0E7_vEQ^y^aFN7uSuUeE<}FVLgFMfx zvMkFg%QD6qE`*?!0JzW_OjlirT?A?=U)$N4OeWsoH4md}Npzoqk~Oer>(Y0>fBF3| z2>rUIe2{l3wKQT&j@9Xc?hBFA^M!XVeERE8WpC)Fm2dd$(l(rFe}$4zqG>kk_j~be$!w=L&_YcwpMkYPf1Fr9&cvj{Z3Jpbmo z&pBo{pFChge%H~U3i zbUHyqv+<0=$b6|nZPp}Z5RTT@%d)KN=J@#d=*^q5EVDeX%5qtjjIoxnx~>Hf=PlM-kH-rA)%_-}ps%m{KfC|@>9bQvSiQ!>@mTRHTElPC2q^SUM->zZPC|7+^e)nD z?l-XIIbSx~w!OA>h0~_sLLV> z#31bf5pQW;6xVmIj}OL0o>x`X>-8p+XlAn$#BXlv^$I;Gqu${{sL3|Nr)fb7uem3eZVJK~$VuNsL`b6}>gQ;lKah zpZj;)ZM!|hQ{vc}l+j5b4iFL&Bm@d#31Sh1AgmyY!jL6Muto@p9Xkez1&a`|03i~^ zM8vUU$8mStJ^iWw@aB3ou;~83-+TSr2CiD_uc~^ts%}-?d+x1UXy<)EZp!~3p{(@N ztk8HUld8$c(mN=NoiRp);G(4!Em|0|p0gDxDLu?)kp%*M=2f6yPe!A5(qc?o7ZowVT>^*aU8p@7x+OO$6RpEIbg(-L`sP%nONYxcU#_l-J0IC z>1WTuBq*TrOFI$H9+%qL-v0;M4TMr>R?{>>$wbd)_C>Zkgn&|P7j?(h9z45XQgq>o z`}WP%%cYXg3L14ruJ5Q}ZxCX|2SMxw(ecA`H(PFRFrY|uyZyC69L6FDd2cgXS>KE! z?ztWpTqInAl2S;eb_WNy2e3z=Hz)dH(e}ql{5vKWcEQ~Q%TUpfEPFFg9n*FOK)!)K43I#MrJ z3wAPBjTQJe@N zr4$MPk!cgZjr1Ya1^@sO#&$l>-X-j8{9O~=;jnd^a{C29sg$?fBe=s@b2fJGUM6Jd zq-5(Co<8-(&pmQzrdqF7b*p4kG4LZU1m_Y7p=o9kc)h;+*1I1)_3-Itt#p00SFBb! zi^7;GPz}eqdS%fKQ5V-%ic&*(H)>~d2bA<6&^Q5tPR@G#cXHJ@_ zoULspjYgx}?cPq8OxUJiA<7%!w4ieFnLBO`08mh?)i!&*eEC#(nj(x*$=2tZ){kC$ z`K8aCr+^ZnDWbPJ0j4^(nm{do(6V$8aX>1E-S%=Uh`0RS#cQkOa?xoV;K>N9NN}lX z1WCoXv9x&et~u+^fBT^1SV58?1UFXJdYkU8HLpL2cIo+Dp{iY5I46OO0aI$G+3d92 zcbI7!kpln#$$zlpSWH1jY08yMJ`climwSTpXC=$rG|2wB;`7g*`Tg&HdC$TOEoh7@ zt8pT6J>ss`3%s{<8N15`U4y6-yY02*51VDE9X#6^xTX5+!F}~nciqtyG8~05i(@V+ zS5kNC9p)HL)v;)A6f`PDCBU`|b4@eh+z+^%T!*D>BSPr>Q%~Mp&Oo*N=2K(1k6bnRLTb&y3rjff5ns@iTi_Ihw+37 zsSyaHz?r!VnX7%z1S3-9*@FPM= zk_cL?C4eKw6(CFsnr`U29(x_4TP)c0lY*vem9pcGMw};eGj$4h;D_IeE7(bLBF3aNhjqKq~TQDF6~TbyWXw-AbTvv$cuA6 zg~POgHXGIp&pr6-pT1HqRS5T0?2X*8QYe@#iAJ8PocO~(7LOltsE#=x7RIJdXUn!@ z7j#3vczL;2a}ud>j!MlV7Ue}lCR_>$JdQ@ab{ND&1>J6+6dF-5Km;Nd8Eu31DiqFC(phEj<2fe=X;MF~OB zXX@D5v&1Ovx5dckrdj;^KQA`wPP1m~x@{n?=>-i5v!M5T8%!1t9J%l2(kkd>jY`*# z3c7)nQVI-1FBA|<#D!;{yL$E7lzC=j5{6++5r_f+D46Ey)2G5PWHHM)UpZFULV`82 zbuW4H#=0sxruq#3r)Hy5JaZZpPqw8-9}vxy7|(zY{GdYe7Sd8cF5q#K410%hs|0M4E} zixBd?>=jaaZE`0HApj_sjAx%b`R4atu9vi}_+YfrwJW7_PoBXV1!RD^pF@l*^Yim% zUDrZnJC-mg7hEtdI1`4cF+Wl)W`WNWUZ5lj{Qb>pr#G?;ZP0gzZcsFJH2+wsQfn=J zjHqcDdg5-jI-7RE09qIhhf=9(t?0U;kPyUtu3-*`EJ-8)Jn-NH>uc+KNi8qdTsF<5 z{cWW`+0z8+IK5VlMq^=Nq1)~5h!25~Vp}_HEdoLs)ufcIR%<&Hl?F&Ddw>vn@ue59 zUAs1^)iiSaSmifA|L)C`H3{@HjpCoL&16+b4nyufQ0C^R>OofZG(CK z+Qz0?v5<~Rc10!02bY&>^-|F?Tit;KWEnbF*fJ=pAHVeB^{{<)==w;v3j~-@2#JSI z%)fv6X2;{5?q;d%a3PAeA*75G;fG1Z);vEELY+8y!uR~G%(eUi?ArL#r4K*|$r}j- z0C4o^(S-9PVcUYjwzd;(2QUmHjv`1WaP4%EN$E=8O=b_xwBafR3NS{8=AE~H`}*ON zcLQ@F5uoWH1Rxv-u`yc#ge7B%5DF^{m?#|dy>@$0ZdPJ9@cmHgy2P?Lb9%GY9gIdg z;yfJbSd983gmDtaJmC_X39)7DwQeo;r-wna2jFBQF^d*#Lk$9TOr1f&$G zFpk5Jja;9{Ofb2=;j3)Sc{=5Tqxp5h81JB+w0D(djJIC!Z2u7yvv~XVa+l+^4OP+P zMJJl%R%|P)aT?(ct|h6)7*(t0tKaQM=u|!l^O-Z(A-h9cIyTfJ`ynyK@6Q1t@_+N6S7%z5J(#*T~{z-wL8OR z#eV0~qG1_flt`tnEVbrmEA3X#c51#G+Ll=~O(~>CsQ@IntdxyAh#tlf#=WHvX{OV|Nlv= z-=P2i3};D1K~$VvS&t;yRX*q58+&ACWi44`#cXEUBaeG}rnl!aa+pVl$rA^XzeD`TzFhsKdQB|$&dlm z!cee41obht9)0m*Xrr$mCaq@F?@vxU-6##E!$u=Y()8uavp5PpG*+9|UW@yY@Pg;3 zuhS$tJ0B{gts?+H0;R6lnqR^>y)tAq^vYNS0N87_I19yEaMMzMVs$hCEX$QE$`)6- zm$@z=@;%?tvW#-|L;@hVdGqkwzjpXXKfK>;)dCGrL@jPp+Cz@F1XV+t=03qk{|vG z=))WM{SqbeEMtg(Y$ZGvz7+!g;DT|x7*i-8M`p^XN(qP`H2VOb9U_($J4 zzHtDSAPT`uAWWewfdybJG9&~>^!U;9a+;wv^5RtJiJcZYm#WZ4>Dc45Y2heFz9lSi z2eBO`o_C{}j=O`O{rpoe*=cwCq0pmTjc0|}ZlMpy*J}4}?t+Ch_N_LY;qAlSCoj8F z>QA4%a==g97u{}eG@2qov!2ZRS9vJZTo+b;;MM5BS2!-!l-$36pR>eU+55OedH#2C zUJ0(wNwb+kT9i<36eQuL7e&M%6nAcI{oP;x1ptEYK}it!5Z!|KZJ0d;V}PgR3`dFs zZ#0_j)uUc_lzLp2#z#SA?h4uKkHA=?By)K-&B)rxB#(UIbM{aF`S`cKdGG17le+JY zc9KGyTELqjI3gaVd6vhaANZa#wsSF@Wh#yR_wF40^7B`XB-m@F*Y=vd;dHl=TnwjD zn|YXD<;vRmwkTI}TVIU~mnH!KfYX!r{hk8GVPa2z&cNl8Lf;W!W~sir1w_5x zC=NuS;nnGDhJfTaXGW?L!zpd25%Z$0h>GE0`uVf=VXH~xdcEFuEPnN@?fXG@Fsh}o zGM3j4qoj7x?VxjmaaK=4CPa}JMX54rh+Jndecc^QvvU5vldJ>+NAB*OyWNYvBiaD2 z>g!xOE?K4jhatOpCnEtfd z%<=K@`jY7O?c1A`ZM0#(A^-wggX=0iLrW4|q2B7*i&1%&!`c)AWXn!cjvx>?`hnQq z4)4Bo49o)_z|K8z4#uyPw@okpMS$i=r8d&vIn6>p3OHv$>d2<7ca7+Y$V}7fAo*jyxiYwe*NyDb5Kj-|9*7xjjtUa z?A4N56okIVv0h6)esp39!qCr3mBhhtGDD)8XXD5}=?s*md6=Fd6CT?D;D7ZlH>}Q+ z7cZ)p&sPl^>v`7D&vE0ctqNANuVu@|NLaW|h#Tu`p`EIGJS?W3FM>4n|NKwC_u>8b z!3p3^$U2jY3(uA1=scteCM}(f(QoAbwMf47)AJ+fbg7*OzJN#Asjz;SL?O*-LPQ3}U900&74lb7(tuji=*+c;K zdlyXiL8PvJ&t+%%bU@ZgskC(r(HLt1{Wz>Q5EYp@p zfn)4qH1p9ue06jB4?tdME!bHPicOQoG7 zAVNe(6o;{tsshdb5B+sGXjAO0y<&vQ3RqOy(!!LylE7N5uMHPrE%7&qjEghI@Mu5z zjSueLxpobO01#kH#xMvx-{)2tN0dpmd;Q+1WPr%y1}{6F;EXYAowIgUNFq>Lb400( zabyW{sT*6hdM*9c<0t!dVMQG6Tp#7S)ry4>4B+9Di^Idc>7XOad^j30kEM-0UG%JV zQ4~n+WT^td17A$D(&PBq^YdHRciWwzgE{)(2%Mv0RuXM;{Yn6Q3D1D4`W81Be+401 zgI*o5?o3*H090wssLr@-ve>wJZt`*lLBPNF?GKn&qf&y=Rw?j>bF3_6*hrHk45Osm zX_whBy7`-h5e9`)Mo9%UFP%c)7ar%%7*$FjlE(N^;D^B{pFO?1@5P>tl6vRtRhVw^ za4#=qKP%pS=fGzgx!7(st{pXzIhhZGAY=@Hh0L#k@S3}g!8o(dNo9^&TZ7@OmV|;c zKyZ$XvCDGs3Zm7ee<@#9{Zx)`e(Tq(a9?$aISRHh_-f>6JqBUbQN8+NHSgL^U6Vlw z_WR#|?+#?d%i!*3rkerN(@09@P`k7X@D5#C+(p$vR?NHsNEeRC!X9v8leNu za9VhyL4T@zt1|-1W_c0?<7u8IVH9|t$9<0*M_D1~?Po+_)jV~+MEs4=18nc?EH;V) z00betWyc40&N@|~Hn0MK^$NJ^-!6sK@^l#_twO(!ArTRULAbP87kiNef#--AS`wm^ z+NiQ*JJK@kFb+@%p`aBhrsQU<<=0>J^IIEHXXc%JY?k!uz- zJTJ(l^y2N>_CdQh+1{xqwOSC@Zr(Tu!$=73(A64oqnUcF^t>ntys}gw&m4I5AddrQ zOgYL*KMXj-(KPS$#?MYKI=u-8Se7d+e%HeEm@^{L`|rQMhJJb5B9pij3C?ZCkt%F@ zbpd;o@el;Zk72**XW9BU$Z@>Kx0e~aH;rO66=}*8BV`vDtJV(ZD z(Db5u>1{hpy?*cbt#`zY54p{OG3k5-46jWnuj=&r2dqLjTs$ky8UK2otbWLHW(LPz_l@P z=r@vZmdhyg1ZVB;7#txj_9P7hzR-wEi}M!`A6}I+mz@6<`>(mUqID~%BFv+YWm&G= zE?mm>`R7tjXIa{~a>*)}1d9rNqQ{?oHvf_weeLdb3*d}lp2x^>gkm->HK{V=x(I#I z^b})!&^t#2a>SfM7UZ+pB-ei6N6n-0WDm$Ka(5g21MGB3+Z^L0AMW^qbH>&H zArdgiS2!&jWyat%=X%^J`oE35ff-{bBQHcdy=6Wvp8^UwdfaX%xx7+PE zW^Zb>8X)`+00030|BWGv761SYB1uF+RD@kglN?D_e!j()k!vl|s7gz#OElHZs7(g4 zF^oeu7=2(EjONS@_V!cmTVDj)6c%*G=yrsa@brF4aF zM=`RcN?Dc&5dQWrzWu9T{&MY#Xzm2w zlG-Z*yHLw^!A+MbcNzm{X~B$r)NdoBrBs-D^PEc|^HRJY%bTc-l&dh4VEg+|tu{uR zQb-o|9EWzh9Y1ij;N7-=`{93CxEpcCi1A#iwC;CWqiG!RAPn3nEzUmP{p`tZtGh>t zYqbUB7o|#53DyaHN(nLGmRyxwXrp&`JG_!Y>Orr4c{6o9)@pfgUwtpTJm{Z6amIS?v@L0Xo) zx}DCup?`OC-u4i(kmhA2Ck&K;v-8>I z^`t1Wc%Exx9_@B7Zl-xzNo6oXO4lRsPbB(dV-cdOp1};_FDj|on z1PBSjKx*A;_omUDF=v`cKwyj%vQkP5SyfV2LY75F0AF2?5ulT^Yc4GS+UYrjdP-Xa z##$TrPBhQz2cm>5R)!H8^mbNn5@|wTcj6>TPEJl%P_AM@8k}bX9jW9txkqT_2wL~q z#b=Z4KtrZAxzPQxs@(zrXl3#|pTwCThC6{1C1o6EMJWyrc3s!SYSumYk}ztLyqwNk zL5MYO1>Lio)bez%-yTyUq_UWuoSuRu1gktN2}aKz4^A#doj&#aR+8qJGUhNSDqbd) z5X_;bl9UqHVF-}pIBA+!N*m0=R=`}}4`@JzERv5=)M*Ds>q%TFZ73yL8?6^kc?&SS z8*W3t)#J9T|4J}z8KSKk*0VHPxgsn8gzfe^v=JVrU(0$BLa5vAZl&bf`iB;PQ1pwR zKg)%FcXm6S#agO&AMe_MCn^!espGi5hiUj6@o~;8q4dCm*zT?fSf`N=dcMvmyxsM=Dhb2>=-3=_Ji_VU3+96=T?1RFuM@ z^!jGH({?Yf$Mdudfr< zG0O-m1bCHq3n6@beB8i&NrCR0zh$|X1Ogn#vDOX-gMav^f2>vUY?{qW@pz~6bidQ@ zhQ?u|v>48kSy~uErZF!s-<20X64v&S?YQ*x!`&oG!N{+_{Oq&CeTs}vp%eOXS`+*WcxuCXC3X4h=ysG{94x?a!F=~yz8m4}GS1FAVW*Bun{A@3f zmA;$iXG_BlySv}t+3mf*81C%!N^R#H z*!~~<^S}ISuM__Izut8`7KA<*5-em{QHnaT3icgxb~*gd-(8I2Y?76wg+Kh_Y2Ywp zY?2ntr9xC%8Q*uyQnY+ma1}>cQBQG%N^2IL=Vrdy2E$pHg2`+Gs|jH1r9TT}zC@~VV?AQX{-gaxexj8t;uBro zHuE_z&j37RqneHpZKHVh{a?Pd7B1q-rO@ey{hglcJAjZwbeY`t`eE1(4))qP7Xc%b zF`*Q;5NGA>tiS|cjiN$oFARSE)n}c+P0Q-V!TvPL0I;rC5v|P%9?x@1an3mg6wh;| zv^K;T+irQj=Nk?4ObjP;&Us$Ru;o@l?)KYB#$n--x3wqE0%&U;;z+qLK^y3=aYTS% zI-S<1pBx@Meg14b8E>Gx{CN5K%P5YP_pYrx$;+ZX`{vD?ySuyXd1GS~KGZTziGa}O zN1ty?L<5ZBS1%uRTEX)dPn7>S&1VWADJm^Bp-h8yTxO9S%~GXwDP%uzqa>%4NNpx@ zO2Pp!r{G1e7baN|&x?a6yP^_#R^EqDzrGIv zKom!-Uf-;By;1uC^nY);7kiBWAWJi&&8CI`0Qln7?z87dhG)ra>iJG9@ExByl(t+a zt&~AlX$=@5N~N}ESL2J@iQ_sNaJS{=JP*17CYE``A_!Vuo>vx76s46^pB?T;(fsk@ ztJ!quFh(rmmF%{I>$_RI<#pSBFZA-PRD!#VJRY?2EboQRhwHHgO9;+Ofe=`Pj9z3| zs|CKyYOoJRYFUhB*lDQcn)Kf9t_&?Y<_+{&a(2w!Onl5 zUiUjeG|wmVJaAc7R5k8(^4$8jQ-Upk7LC~EhP-@1Q)ee=m0m0blqO7U0*KQB z0i0isu5M?HkgtxO{M(Ob2!XXWP7A5D?>T8+)@ZI7A4b-Kw#Lde1KjlHZ=wGQ;LsBN zPs1`C4gu|HrR?IDWeK+lz5$|3#8UNv<4*rOE+7Yb}-0%2;iq zIBU23LEFC`M$BcrtgtcInl#Cid46>}DY@u$LN1iC#-SuHtH5^=f+Q*0E${us-8?OY zP)h01bY5`L3H?&YdLiCeyXc`c`LPSyUrQq`OcQ-Tz^iH{z77r#(k$ITf1$-1`rttU zya|1M@P7aR0RR7lug$Ii014_zL_t)nolA4v#u0#fX7Jd>zQ`phk`irFlx53G`Qj+$ zL!8{>i~R?Z{D&k}N&c8~N^(i%kW|?f*(FO+i8Q%9uVw zH42Go%7s8FmD8}Kke#O8phTi-w;EESZ5m@Yc=_g>5pWuo#hBIXj$MCqtwlg{fwpDj zxmfEox7OQP#)By7b(;Ppp_B-TLoYH-#wBtg2_dxD3#`aH1Aqplfil7)0cB$6)1QBO zTH7qNDEnbJqfaWwdz%x5g}Ae%U;Z(jC;Z;y_d4Cqa?2KADJNR>xKw3)IVVwwX_~VN zgs8I&{mJ;l{jCQN?rFmTmF1aC$hwws5QatZ$%Rl#nbgSBJj?R27c!!gIHdpvV zT<^MJa^nVHeRuM&7e@d}OPOZ8ZJRf4sFV((^!mn2GXBxyy}y6`dS|P5HJk)V?li6I zaUdlUGPU((3$(QI6htiR!T#8F%M2Qsvpi+ia#oO6$LJOLs;OKL5rLG;R=TcR?JQE~ zzL0vmB?Y&VzGd6hiaG!QAcPV^Zf|!DAb{EZ{u)!fMMNghGKtf$8x4z6!i5~WVHlzqYK+ME!#eLczAStvb)|ny>dHEdlDw+*RE1}9La9e zJh}4T3~tuCEkfBwzn3Iw(=rb3_ix;=gf;8HBS45!noxp5)sx9W3Mk=MPPptgDIt=% z)@!|h6R3U=0D!~8!-t25mzS5bzZqe)UO!rn(`eYd0D1@gw~o!5IfLpJ&>Au>!#Lc# zzp>eCU*3#^AUYXbh+I1D_Swa#*KTU1P1BGP8;;GW@%-B(*N^tL`v7EjyB}xyJ-yEM0{a&X9%zV7JaW$G4mX!&ms5x}~EXxQ0D)r`URBR`t z%RD2alu&|*loB3`8PA!&t)@f}0zjTT`5+9#VyljlKFratIb_SW%S78$5uWEw>6gL? zqci;!BO7M)S1*=u3;hqCJQ)|Wi=p&6t8PcsS&mT>?A+^zVG<|V_U2lYq=K}PB;pd= zmZ>n?%i~&2xU^#t1r-cs2AlcXqt-h=Nd(r$RHuU!PoWZLaS;*mpg@-R-|R z8f1zd53a06bECg;bA6?hl1h#I2&T`aDWQx~N~zW$1ftR+DUHvHShFhlqtSSdKDmWH z005aTio9fY>cTd*HmgxxP-XvbH9NPI{fa)6@mXDJ6*JFKNP2Lvb8_WnoF}Zus2U6g zpj5Nn3d49fo}^sFY3@(r!L=(;q1JYzX<4RWT7swH#CHSEDBQo-9~>W_U5%s=VH7)# zqfo|4Vp7~%b2<(7{pp!$7(twwCd-8c0Ht&>_O$5!HBT_(SBo`gb_oCg z9_&5%{U87Emp}itdfU44puBrII?}-2eYig!j{%_D?c`ZrnVn_ME77m+7kx|HB2D?5 z?=Ngi?myZa4ToK)xz=xwLR??#fBX94-JS0Fm1kL|kgC(^+}rGMskjg*L=dNr)5tOo zTJNki&(6*%g`pev+D)xwt6_ScPp!t@R`<XH z3;m`!a*j%-2M_OaDTiLFb#5E>gLe)_fjGSwp(e~Qd73h6j6>OWOfF=W3)G5Is+9D+ ziAnU|zIyEiNq?=KbEy$We)MQ}&7DNHX?%a-0wD_3^z|t-2_ZlzrHDGq1!GL45}-yO zmW&TfRr2&lPlv9u1K+MZ*Rv* z3;@H?ux@rr$1ppFxnlyaUi~{u(<%;HwB*yzIR#XfX9@l1UwrZE<;yt*{0}lyTM>#V zo#i<8(mYLieaG|TZnxz)=5RC~jy$d8$#r;dz16Ty&^i~W0g^12s9Z0UQsudr#2F*d z>U2)8eF_S+-rekJYEaNo%BS5IlmVeYsMbUXA-R;OP^l{9uk1b{gzO*e*CKKfCvg!A zEfxGZm#}bLyys7U_UT}7TH&7g*tzu0^01U25MoxxvpEY3q8F=Vb(db8L1V}R>u--t7>$$M^`rA^*I-Ntyc`FFkgIWksDKnRYd~v2r8Q!f3x!Iema%9# zEiTGb4_!rn#&85DJe}lg-3=ZIk>MhJatnPz7S|-Hp8S?aovMD3z6P+1=|*~v z{%?Nw+uPXu2LJ&7{{|gT!TuAc9~z&0Ft(*65-W&vv9wmm z=7MtsjLlz-^AkWI6e9)1OTh;=j)^5-4O-+~cMkok>aKZgX=RV5YpT1eyT7XH>FK8L ze)xVmohrJJ9+B99Ygwx3N77ZOkwMg2p?<#&z7gM8LjEpPC7?6uhYh#@{0TqK^Tw55UH^-H&yv}V#?B{mhR)~!jv zRTdTVK#|egH*ZTt<#0*zZ}MY2!jF_c;ZR2HJJ=EJN`BW78yR>_hgS!K!GIUC-#P`CJEf3*MN`HPE-izdvIUnkF>J#!5ZYE|C=Ws9~s8%i30%jDRiW*t(4HL@Z@ z7iLD!1Q(@j%te%j@nhcir=ZcBjK;rM%c+RHf}r!Y#Fs0CskEk~>Ri9}H$#c;LzqOXaw>djI3on=QxFnQ2;<)YTpxvK$KmYexcupj&v2E>k zx2**HOS$4p`t8k(u%(8*ekt;8fBVjDai7DK@5>Zm2nsL15H^nh!ttNSC4lL}S^$Jr ztL<+aDNQr-6-B8hXT#I23RGHOUvI)T91a_19>KxWjb2Z3aKGO1jd#aBIao#GS)6xJ z|MeiM)MPiMa9xL_oa}E!~tUS@*2JrIuB|}(W4MN-}Efn6M*YC?5f*7qL+|e;5JdEP0vWnhw zT_^i$2;TbD(Z2lkZ1#-8>8DRAbM~n2@BskA>97HE#9NU>EYbZ35B@zpwFlQQtU_{- zP(&{ioA&0$&CAP6o7C-gx3;$2X`;wt@UvzCqx=^=x#`hEvDdoBq>^5P81VK^#!!x(LhoF#d-7jxn~Ikw;+KJ zj_79tgx-zbY&PSdbZa!STWcu9oPqk-O|b#?zOT>b)@G#uN3B+?ENL>C02Psu=2c{R zBrp$z{N2E8MEqrfQO-$IN59v1X@+Yb!GE27n+YGw;NH|SkfPjVL8T;4qF9h1WfQ83u0f&>66PQDXJYAIJ6OPLun7-hZARK*lwi2f(2>ROKi--{Uv8xn$2|@@^IVNeu7Zzt6ggEUH0f z&P*;ml|$*!{6D6GNdHtSAE90}031C#8oV3`q+_+2*y_{vdM&Q6Y>33)6hRzH6JcMb zAyG}ky;ZPC7daje%!YQQH7KP(c~BZU7(X1HJxx51!A&+$K}jc?dEYdF5NQBFg8E4y z>K9k@@och^V#^yEJ$uVi$YLoBeEonsnbi&C!Qrfd{RjJQh(OP*udg%R!bW#SE&x`c zIuLvF$D8Ey&Q_<;_7;FlG=={eb7JZ|?fojc z=elvLK}NXK*-S+M8d{IfFA77YB5VN&Bdn@;6BH+~ot+&q7jf9h z-U7D(I2+)NxKwtF0vRnz?uQE?x3sugCmX;5TE26eWvk=!3$i__?0o3>hxs!m>ut>n;Cy$GY zNXZoBH*YWsuX(HPFO~|Z@9XHq6llTdQEVHSe`VlobmlJ~^a8})8{UKcdjI~z%1Tx; ziAkQv)CW+1`14PrPoLZ@7NW}4)s=mNAwfjzEX%%Lf8}D~xzB@}1Z8!?nsjp8ye0yQ zh^Z63#mN#Of9_$HWsPQILif^pV{Qeg-EP~L@)mhD5uK*fX`aWo=9PhE64k78J&>(r zz_hKZb5 z)kOL%mPL6iWjr1~G&io_9DEJ0Wbc|PfOyUbZ+spdd~SFJzXl(|7J@JX1q z;U`Ms{#cm?G)_-Wtuw$f*s`Nok8ugm^J=1`q1vM_rBW;brd7?Fk@%#{ojX5V(q)F+ z9*B$^g(;yyhLf6vnNm1BJpAk3J3XJ9R<*i25?JVDelOij|NNf?+UV`=?f#2C=Zk}b z1M_2dcbC__0rkN}gc^BD3Anuc&kSIjq{H3BSa6}5Qv)(r&}z2c{`pqV=5S%%?EhIp zP=cYV+>Io7o@v&hb+6YOyc|?4gAm3=1KLzHz!;MlJaI?_K?RSVvcdSIj4Q0x?9wL6`wh zSX#Qh5GN6>oioGTP@xZVvtb}8#0`VOXfz6NV!x-;={KPP#o1p@Rt*3E002ovPDHLk FV1h?0eQf{$ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/191.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/191.png new file mode 100644 index 0000000000000000000000000000000000000000..767d1159fb00de042169287ebea23fa223d734ab GIT binary patch literal 20138 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/192.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/192.png new file mode 100644 index 0000000000000000000000000000000000000000..37acfc3abbf33a5b1c7dc5ad76e94086a8c0e72f GIT binary patch literal 20944 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/194.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/194.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f550c38c576c5708728ac234cf5f8d61478045 GIT binary patch literal 21111 zcmV)@K!LxBP)Zt z27pv)X4%|pMhKDufgo1GDT@;ntY<6Px9_Jcc(~^_9^60SjdtP2RjrB0bIOv5d;c9|Kjs6 zzxomdC;)*17V5FRy?x`x4GC>khQksdWmm&>0VTI}0s38EjbotV&m#-$+wQ`}a5&(uW?C$QqeD%`Gs748F z@+y~a;oWb)S!`|n>&G9hbgCGQ0s&=xvHD=~tKqZOf#z%!DE%EG0Qc_S`}yBLot~X` z&WOjA;Z?6VA0Q3=>~S17Z{Galzki%RzkPD@CxS|PQasOz>;{)o6~+h*9!c1Dw{~`R zULU`1xRYIm0wbms@$%m&gLG3hY=UUAqx#TMByn^9;NaP_XREqudG)B9!i-HbCU7N@ z?06<3L2Lbb=j%Hx+wVbBSl!|zq%M>GWg_=I`km;9k-um#y>v8#CFLyYK=roDX2+09 zttM}CO2mn;mWRTD@PB%#Q-5(MUA3C}cS>l^i#CbGGh=;8cMAX<9UXD_;2eVeA{ey? zh*X)+=clKqQ|u;3GRmQJ=m(}7krIf=Y&KghSDk%&!_WeX(hNJfzrEYHj^mjJ*(?1m z?JMYb!}xVWUr-?;7@gQvx+WLUi+d%wa^=dCCr=Vqu&YVi3kK>Zx*TWLRL_=YVH?2r zKm4#MP>YJ;_dqRYnvxnui^V)YrJP!wEvL;tSXKq=)g9L_u$HP|XL zdZ%Td2>^n_!^2patE=`@MOD7nqwkI^qS|ST2HT+zfH3q46mK4$```y>yNgs}S_XD5 zRoX-~fg)*soQ#s4nw3tb-3@OY6T$TQ=$dMna;&Y# z=1a<(LJronNNRg;zEuG^o6S~dOKUuOXEBFmoi4e1<+{%!b!cu%8RE|`1=rO|{w-FqE0Ho+-(>-Oyz&z~!-ZCn!pFrUv?%atQ28Igvf0KkjqFD5I~ zNg*2MWF@U1Ts;`;xLhrB--;eU`mN&At@!lpwJT$d94q=8h!32bpBrm6qB!(K+ZI^C zY2%sgF18k1V;xW5o;Ji?b`JIr9zA?0BBliaLKdZ%M+e4+D-Lt9BYP9jz5=Y7VExF` zQILM)ShfDNIO7H@Qy0L71&XCSOK}zus|H`R9Y(EFWnNdme%`YX3RUGu&LDXEzqeKz z&@G0yIFSn%cAU17#}Y-^;Zp`-G8I64TF5;hU+oZ->B%G{y*Sz5Pi#h>kgCn=-BC+p zm9|F!6+#cQ#x{Zmh;v9)#X5urPH9YkH+5RFO#?+l^ebl<7dBu;Bvk~S@O7l%Aq64? zOR=gH{Nw98zy0!SgP`_PW9)0z6lnwK?+UD!kRWx}u{|Q6XuY+PP$u?v0w!CJ9q(AB zHs-qj{b-x*c#rK2!c^Ms^q;&z#;P-N%2I@v=E@|_p(Kox%TDq=}B4cgn0|53u z{1Ae}e;y*gq9~JOXb9G70oaQ&-Ro%<4QKios!8$fb*nf6zFJX@R9kx08 zr8o2bcn!hm<}MCwzIhX3yzJ8r@4){900960l0a37000NcNkl5)wW!5fN#3=?JPH^gmip@|4otJaQBj$tOddSP{UcTeG7<_v~= z5`a=xKtvgF_Z0F$c7B!lj~!i+SyJXEE7LQjCJlHf`Wp>0}*nsv4UBG#ZWJa2W2K7N=2aWSjf_z9?59 zz!7C}m+1+wW=GOJKOP7N8 zFRx!#?|afudU@~X=NFuUe^`ym}S;1Dbjj5rNh&t?lgWr1OjjgNZ7~rA4GCBD&bR_^AC~ z-I6VQxm+F&htiSQL3N!#RsO5*zI*TA_bf9uKQYz{I6Jn%L2FDPget$M&XgO>+Bdg0 z@7}p9Q_BJrsuB9DiJGiyb2uETc5j~~P4@A4ObHNMK!`St$77*J5$p?NE*V|~TzO~X z`SV_EY5?+du>aC~*6Te1D10H+R!nL%8l%xjQfqmiP*a-*{ZQa<4-Uvd1 z(5JB6!<4d!IS>BxAjkuuLH+Z4@5S8`Avre3Ns;96@GzQNXmcy)Att>qby7+M3jmwf->$8jrPF)kzXmYefs%lM0By$ zI-@lb&xUB7Mn#jD?in!T7c$E-WDMkR;f)K#8?HPu5z*mcf9d>E;(cRa92zF-ep0lM zoL6~Icf`PRnUPo6#@qQPLG-3EDe z8rQI7sj0_NpKV;Y_{PC62gqHiQgTt@$`JW=;IO4E6c%OT()(m??aehf-1_L2y!4BI z{9Wk{&lF4pKKR>BP*k8ObFP%vX6tdFOj@c~-KZ$SKCq$ZR$Gqt+`fIACr?Rss)9sB zL>bS*Dq<2~klxl5D|5zeQ0<{+$qX_u38mChYX+41n? z(f=MHcL2txW4Kz*k=OEQw@SPZ14JT`bYAk9@V2m}%sWTHM~jP#`!DtZZ2aM!`}glF z$`_s-sF*r+kw`H_lx!lZVNsXW{!z=mHx<=BOq9qKTBx-AY~R}c=Id|54>jZ=w4rhe z-gqMN`iv+sHpLhK)c&+oWRxZ4GBt|=^M%b|`8X*)AefUyVN9nlIX*cF!1Aouvo$u@ z-D8kD#O7S z1;Ja^NCpunD?jrYWT4Cen5oyhoo)=IV>EOePahexCl4S22{>c`ob)bms8ws@@hB-0 zQWT2-UEy%9tR2bgB#6v{tPbI0T{nS&{fUSH@z?>u6O}8a(RfUe9rCJ35ArGN0D)Yk zT+g#gt-4Sx&(T_Rg=>LWLJ737mY0@;z^_y*kaV~ZN~Otq zqmF5aB)6L_)|1!KJTikq2s?M){q#4VO_UZn<|n5v7DwhshGq)x?CNr^AbeG0dne6Cm=of|DK ztgig!#Q0j?E!s989-^fM*jQg4DHi>JqHqv~{@n-lUw?cTkZ}f#IYBV6EZ21kLxtk( z+In8nKLFyy{O*u1W0W($2pi|l!(MLsyyG9uU#smT4&jSFmAv?82OnV@G zs`2NFU<{^D9E5HLq0yXymsN{)YPS=g&Y2$ z!&$9A=+~QGZx9U?+~d>w*5=B}QtAHJ&x43MUC*){AtV9-I-JRTE`RaD#KPRz!zbm^ z_;4Z5fuMXA9GAPcoxgGQM$|6X>i6&8|G0YgZM*YAk&NFqy$0IZ+4nzMooL1UV1b!%$VhBhiIJcyfj&1+!r*Ca-F63O-b*x|feWpYIj>zlI{5V9@bhNtXy7#y7L;H#C?KiQJVp8g0EpYyw;w!s5W5jTE|>Ft9~4of zK>NE!7#@d3JnTdR$l8F3(hC3(I2*Pz>s_WI<1D3s2hzt~| zRL1~FM3~%mrp!rCMFa$l@#5IrD_7oMTe~$qasA1IFHUQRVHEjZ2gwQ}DWzbX|M30S zs%L|4&+GTYAe4^7>-BE07eqo8a!wfPcd&^Ra$8E(X!b6y%|t@}`s2HIAMAy`uMjJh zdaKthP0!CwU*6of=6T-I%KVGdgN%2dE4E|*OR9Q~yO`9+4nX`(~Onz**i-gA9yRPv4HdB*qXRRw^I@ONwU}Mj@J1k;+E6nFpm6 zOLo^KjxqpXoG&fEv9iXiQz)te)6mWz!WJW z5`rQDq#|TIj8s0K7gB2eK%@|$)$#8?Jox5m`O)L!{vfbzM@fZ@DS}R~+xC^TmS;-~ z?N%)adY<1h9FNi%2UC>9G!OwG3<4k!LU!9-kV=mtQtRuJNzw*S*D>Pmw<->g1fCbO zqZng|vz(Pa&r}D-Qj~2)0YF@^Fi4fE+2X*YH8lKMCs(u(ndv&1c(k0{!s2V|>)*Y6 z`Gc>%_>X4$l+>Wz?pqcF5h~)EOeoQH^CRVIM@Uji5&>hRh$-nKvy~EzaUtQ-`e+zY z7%I+~Qbd5B7dD$c&kF!h5g_M)03@WMQfUYvoLyKO8(Ep2nyfdT`(7uNz-GOK;>$n; zQgCNy=f%m3My(FXdIe{|naie_bWMm5aF(~um8RM5iZOfq z?S^Q^x)*Nt0C+6U+q$&X>vn~d8Ns)C{cQIf(RGIw=C?0x?p)q@_sjqJm77yS27aib zNJf!R#PUuwJ2ToJM1XD(M3J;OXHtX!N-4>>&AG!E17OJA*(vwuKYR1T@4d0KP@I|^ z?e@G*r$+=z3CnUdh$$&`YGMq!-2njQa@LQ2_|}UPbZk3_dV@ielmKObnVZq?RTvB2xkFSZb**FeD0<@%?ngCdra$GJ4E*^FP9vM)XkT8T6P zYG<`5jF4gm6cYx5^hSw*fOC6p=9SBr-k+JccJKH9?&iadjp?Vmr&0`*RDhC*4UgoO z7ALEN+KS2vEzLAlyS z#)BYGN=hLB0f^>j$A9v7H!HPXxm@pi@~a02fB)lm%4dbex%p~k-y5`*5}A4xfB*rt zcsUl<#{QQA21(=lTJ|Ccj6yIzIHY8Rh;F}qdvA9ysmVEWcydeA)6?-HYMeka%*Qx0 zC^BM)Y|JLg3H>VBj)$52sTkiD=C-#s-eRDEY$PEp- zK_CDbDG5Yq@D^=VxIU7K`rZUq0@7vX~#YfcpK~px=0D|0_Y8tROe87!;&d zjk?kZ?c*&Rm|5lYXzCogu`JS7h!n&8zR+d1r5LFE%s~5Lk>W zsnUL&d1PvR0z_6EnO(o|oolarc=z}J;`v@aFHXw+(@I;45YV!0Td5FO!4E>mafFbJ zIWd_qu}CUH=5PiC2&917fUH{U{_pShKl}XK-GkbvzkPgCZVL%PAUt0n<3tKkPbApW z-51+eSHJwjGtCU%y1DWAn`3asS7(+6z51Zv^t^V~0x>yE3NC`TZ{ObA-A&Z7I(e|9 z^OLc@K@LhXYXVA1U41SBQcb1S(ixo2xfkQYlgb7zbn`47gQLN{|Wwh}pxS1R!HP zZ*de-0w~68L;xbjT>uh7_6I^KDhw5UzmEnfNeN^OkpYqGIzRrK@BHEJUc225!w?8t z?Vjg*OY4^l&XnJ)bh{Oy8%O7xE3r)#XcvylG!yztDaeq^l*J_0*MDQi`V5gHM~fw2 zon{O)b(`MUw@k|kOrFqWCP5o8;i5f45{YEbEe1rJyRTk-`{Mc!PL3X(o$UrePY9`$ z0*Z!*a{#>8^Yb|b^fx!=BMCy#+{}n&bI%uy z*`$PRyQBml5Bvc#hd?3YhzQ65K!bOo;9T8W`s3G!^+rcZ(d~Jo#eBc-ce=grzyIA% zT{M~p{Xv~TWxd{j%sDttK;oRlI=PjYyqw2yBWnWq27dt!i5;^|W6Fx` zRWfru$x==7Y=d9`sZ1OY9Xo$v?ak}2{loA6@1K0H6GefL0)USUyPS(=E2vbvLP|gm zDga>2Dgbk(79yt1{pwJ|59R7ws!Pf6A4^hKlqco_JC=i8^X zdSkcOtFEuF*3N3CYn%F>p@n}UhslBgfU&+2MI%b37M2%p-nzBB`z*<({|^8F|Nk2f zD?k7M4rED0K~!v9S!`Qpc0T97_wrt@qNtS;MJ<-?*s`s7jpHPCCZ1+PX99EzWClfo zOi-YG=|j=SzRhc&`rd~=Oo2fQG@UksX)>8Cm@Km0q=}QrQ7mhtByJLy%jGWra{55> zlG2nQBvBCWrM|PD^Zn;Y6?fz|1F3G8V-(P15P;$2RJvFw9O+3B^tWMj`hoG_e7rwoa@P#3j1T+AE88HM&1WYpliIilzg)9W567i7T&z<%4p$#+at*W+-Hllx8GxV(wgX@54KH{;7QMsE-K^Aae}s0rcnR z=lAyZ`gFgZz8+yqB0TfVGarBaapyN$P-P5iF%Cct&`ZVocg0H=FYfN-x@#V&XC>Iz zj`@X!uoZ6FHUU^>d~WWU>8Yo7w^v;5DWw3IX=#QLYPEgpq2;ujLy7RW4|W@xpwy)+`k5Xf*0L?r?J0^IRYr z9*Piw36$n8K^AlGepMALPMs;;?_{eo?1U-InKPC)7-xb7>m%(7Xi{sG=;}PN-f))sN zFSpyfK<_J2Azuij(GztrP$to7b_dqdaf`B-19ZKYk(s_G{C2&Pb3I>3Zkn19pa@9$ z2og}!7%2kHh$+!T%>p1m#&oN*UqlHPkeFsM#xz}v$HM9KxW@@W9abFOFfLt~Kd3Y- zwbtfV*)X)(?Bu6+*Ev^2pzGS`=;-D1<1hco`I+glWHK_J9Zkf;uE$#~=iJ#$xm+`hjF zKnp@?Ahsamr;Y%Qp&u9l9C=$%l_0~AX)38Ycc5Mesn^4TpaNv5jg6jW$lO-V=e{eX z0=oX>#jUM9BGQep5^X?@8Bt`60LRCMU5^78Of!`9saQ0;d~Wuazxv?eqe7$60>oCUmD}CBdgbz$Uw-BL;_(ZM z@4o+~>$ve)2tX}8Hf1+mL|FNshrfIOtNHABG7&kfHn~v0_}l9{Wi0HLOT`D3YW~eP ze|~S}Za5MSHe2+WveeUV81yz>l1?aWN>W{39$^23OTZylqz&paV~l|MCNp?Z=y!(@ zQAyc7TmwfxN^m|>5fEsor;_ss3<+GfB}pRUUT)v_1Tsa)qgk)FzggW{xwl>@R(|{5R}a?< z|Mu1=lM_QP-d_IEi5bi`e<$1nohCGi0vP@@u1ql)c+a%cVXFCRHBc^*%t#%#N~bap8cNtmXQ z2-~*Zl1f*KnhiS^i@2^Mg}=U4ZnoT|GnrDU+HAIe^2(F>!lCQ(VyT)+js5tgbDo!2 zz5mtW;fCYdKv1n#ySg>tg?eteKT|tCiK1Y)-GG_~2zLaKPN$pA?t;jfY_{2K2IrXj z5gZ4Lkii1I+u0+6Teog)ZEgi(KxBnNBVi_dNd1>b7MX zm5TlS`p#dy@xm{E^?M??`}xCcX6n~(e|q`C^1XX+JMA6?_*lU;h<-2W90aG&h#oYW zUL5T-E;V2npbr4HZTHb1pci)DhP|nJM-Ed{(~U+W_;7o$}xz z{p^{n&*jO5(L$-gIoS4LGJ&a7Dl?ra6pKq|GS@DjjK#wDzum4>D$C0k+wC^zywz%b zb^mKAB^OfoZ9pRyi?mvGP(n&Bg%3nNS5k_D!|IP;y84@UzYtQi8m(NeRI2do*f?YL zjg9-H)Dh^9q2G5B)Xfr)DQE!w;9+z`K-7*?JfRDHpRV1jq>pux0I+|282|{BQrX$r zE7z`WKH2~PO%FvPshOFRcD;rKBjX9X-tauXX*;C+P)K^du9QG#BBEu5X0zh}EF4Ba zf@WU!j1v+=P}DMWH8`sB6Kg~DMn z8COcKt*s9YC4~_6dOZ>j+qDWHD(N|nM@leFSBeNxN&(W9LIA)AfB4$A+nz5jKYprE zJd8!d+4St%cOU0+-%zL6Ifi}@_v5XEKYj$z4{jP`fDE+`^&xlw9F69IDfBo=UE2X1 za7sZoM)g{Kb7KPlh$v)4uUx%ZE+0rC5x4-i)o|J^M?;|$=PC*SzzhTrP@hVVz4D`* z`}xDva75RQa;aLkTL6f9SPIAWh;x;QTk&|LVK-_G-fVh~D_0*j#)qA;(NSa=jm0c0 z^4O{ASO4sZs~2Zqe&OnWyuDH=maberUo4hgr-i69#-#9+a5T-3iX?YQ`b^Ua7?E;a zP707=JZjmEmfi5;W^#Y`>q23bNDcUqBj^J_BpT_j{u-1;&o9A3stEQNHNU-pjgyGkfv#@trx?VUa7W~ zA^<3tOQljyLyE?tQcA%+B5XA3iwl$Imu4?5XY58Bz;qm62;b)dK`8~k??f!-xvph~ zfRrLY#z-^)^|_g`&Fx|$9$h?dLKqGNj|vcXoFAW!}Ig0H9W@4ZiFMS=TMgN@Ql{+HF@#9}t10 z5P~s{lp>M<9x`KTX=dq6*0M~_`R-oXwjJBHr>9c75y}^8oq`;Z2`LOs>bfyHlBm|& zwR)R~0NGI7EEdZ{L&E^@+u!}~%H4+#*0!>lq+ysqs#vc7`+u&iuWvd|%k$i@rCq&z zG9EMY`vuD~5jD^AfrO@oh!g-rO|RG5L|)rbttK~^>9=y#>Q22@I+mRW|K<^W@4A{E z&x#FT*vrrRK?0#S59r5$uGI{B{O;Wbqe9o^3{HawR%rqNLSiT(iCNZA+i@5e#5f7b zxepp+$Osv*5MzdEnws9uOiyv{r>ADu)*j_{ON;>mpBPVOGGiOtl}^?rmDYBtZaZd3 zJGnTsxl@u->bh39y|x?v=0WMfddY6c3+EON4(fK(i$x3}gsy8V_Z}TqYTR=cPfWh~ z+Vdw*r0?8at<+kcFQk+J0zfCmkN~w1f{MjV*Oi80#pCgjp)~PEF88_X*8Awg5%ur6 z8UVyhHq&S}I$iqS5&oX89u3GH2~A9n_ZU=x3qsU&eIh*(5ZQ*3LqVAB0NvRd4xQ~z z)ZZL9xa`2L+dw20mqIATNsvzlFcX!UnjVcsjCc%h-(G&>jaOPtC>AS`Xmn#U2c#w^ zMx}(^y&3_GrlKbo#()S}2mq8+so|)hv){aPk8_?Hj+5ko8lh=g#_7fBQmOLAm+OtD zUn<%E`qs*$&B8zY{Rxt z>*tuJ|KjgocRfebb;B_GJs9Yt6zF)b(}1Yq-u~VnLl41Vyq9|3`oXiEx0Fid{{sL3 z|NpcoX)yo*4eCimK~!vANt0yPRX*q5`{v5b%B*=(tE+mj)ZMbiR;y)e!bp}I2NAG< z1+0Jt1QGIr1sj3|OIYy(2w*{Af(U{|+X@?O)Dlu#Z3#;)sjIriuFR~QD(B2M-+Nf( z^s?l)$*7m_y{vc6x!;-36+^xzR+dzgJRPS!V8g29qaw ziTl zN)afoIizA@EInhbEY0p7R8Q-jIL0UpT-R3$lnirO`@6q!buKrX%ccAPgCLr*`AMmf zFO>i0um7moY!?e9K)kTIHa|DB{qWH%FJD<*S-SJ#wja{^+E%Ufe<$VpvGfx74S=8< zx}xEJ1LL@Hxm*T-zz+uD0Yr3WoG6Z>!JL~>OmwKc8300}qimpy5wp467`Z4Bx=Rk| zfFvAILahVL&Sn51o6RZ}D;34DPmBmbGi*gbq)fxQc=57|0f2Ry^+KWiaC_hF2c33Q zJMFcaE!)yg>)nUDCCi#A6iStH>E?|mUU>Gh9M)e0N14&OHV;sFBt0bRbiIfBrQ_oo z5Xi6rfFvUsd$Sqy&DWoN>gxK%t+iY>x3RvEPFY8fDzCrt)L;DI_ibCe^_wr=c=0MJ z>U7#OHkK=`IHv2*J|0Hu@}+aOPK*nsVm0=JM~=~;0|f})`N2EGQ9p_OI0mM>rt23k zT>`)>*RD<(Q80<=aAxwU;1NQr*&JIn6XL4L5*Zs(1MsXKXdi}KJ z*xa&>rNyOAFZ}+kmvdRC-RT(`A%&qbOjBQ6oa0RRe%NXUfQ+OMOdx8y&Ms`Oy#C6Q zPh89dfoJH3QmWhOl*)AgW;@o6>sK#dJoofdTa8BZqmQ?BU4P@%r=NfJ(&qWKpZ@&Q zyY~)nz4g-S{M;wM{8_&6iISr}pQIZF004JCx(fuazV_Oqqeo*EJ-ApYRj!l)p;oI+ zVKc)w-+F6*e-DPGiI6C-NJNeXfsI?YZWRl~D2mQt(YP2UU&zDsvA4TdEEWNXF~K-z zTw{U(pn_P+Sdn`Eg&UuL_GKJPU_N0#m&>_5k5otmt``c;SeUm%ukTotnVsPRQ|YvA z$hoX@VQc-djpe1KoCLFa+9$x5u5ZreGAT!|R9mEc_?O#XJ~&=n$Vy3bb1BPY_dea-KWhE%Z{IvE z+jsB&TcdF#Rg@(9Fvy$$;9=9bqESUSVJ0OIZ2w?|(1 zsL(D!{i)xW;xYiDqBxeJlrcugm;gZ2v=QOq_Kxp|fC^an>ML(Fo9$S({eVSL42onN z)azZLn@>M`rBo_rGHa`=t2;aUm1-SXr&jBpHhMx6eJ@}r4h}1qEu;BB8){~>XyN0!c!l*3{rxwkyMBn_#tC(u(uBogYbpWzWVBmOP8L^WuxPK zhcQ7aGIY`F^>R62|9)u>7WsJshxMgf<8WBkBXdXnUa15d{8_YHXS} zIA8z(04yypSIXtdZNmqRFHLBVGiK-LOu_^nUaVxSSS;fx4mnpEGa1FP45%G+fOMcx zNfiXa&d&DI;)-dI=SK`d#^L$R#fAAyI^#r9u23ifnjd_4zjhipj_LVfw-*6PWE`3B z0{LM3q*m__ka20=x^exAX*#V=u(3XuNm(+MmSvfyaawQYa#@FI-Cl2Pd08p-!+-zT zzx?ZaoO5LS=;)+aYAr9#wL327kV&WdZMW6T2SHbkW9&)MoDd4nN&CrFU>x+ubdMk?i%nFo;P- zfMPThz=)-6x4VX+zxn#5)g=*y?!v;t;(RujO@~pWl!~SDJa=(vNh#?#w(on}JA425 z&p-N)|NH3p%*p*_i-HIY)}Y> zL7hRA0>_v$_yWhDh|JNZz-OBJBVBy<{MU}JwSoXJ&XrP(2~C*u3+t{IaK!$6o1Js}e&6*N!%W%+0%yiKI4u3cKmGLRQ3XMAJp~jY zT0(%(Y%X-uvP{#|jG0?+y!`0l!MpGNUAeriR0Pv-KPEKdsP`WeX8;mw0ukWaQ`hd_ zzdscJv93l0MDh0b-v05Aemo-MxN~4c)Uoa!q283|1!HZDfUvQ#kv~2jKVeYEK}sqm z`~99$1VU(N69*YZk{rMo06<#6^m3^+H=i;zt&2K?F!o#ZdWNV!H#c9%pOW;D8%l*B z71MP91mIpky2eszJ&f6W*3bm4tSodoJw#rq<{dlb2heD=4bwO{$ba?KezO&2vzF_r zqen$Vj-*KXOr#kqQV~!fxQW1(VnT@gaifrb*moO>#?()c=8QxpyknqAKR1lb{rg{h z0c?UiIP|Cqi1@+r;glZ$qaenBoovePon#AeY6GjmnNGVil`|UtX9G=zToVigDaE;9 zOn~%(B!duufeH|r>jqKe$Dv24G2ti$x~88tMkDut6A_{yh!Hj9T*;6?AR-WDGvdN# zHk(PO(lf1AuXgGRf#pg)j8wJSIygFguv2Sw`qgTu+3F$F1qT3zOmNN_W1MlJn}#(b zG~F;nb~YoVwY&T7@``a%EF@m(>47OwOO7iV<)9PdKtyK&kq7~alG9j-F`)<;*K@gy=Z6GB*HMOj1p=4=5EOTX zp)D>ro~IN6Ne_{Ok^mA&f{HZFKyJpdieuGi1r#^ta+!9kZJ1`hP|js%4vwnTTDMYb zH=Aum5XZ4n3K0->+JYfQzNveHKE(Tw0UD#?i zniIAFG89OhTN*`57&<5fl8j-jq9{}V7)vA-14RIwRHz$5H?<(}xiG^pBS3>kTDiV?)!HSc6N?^KRhWnilvq=pkD74Pr5-E%cu{iGj1>zqLPT5b8TyD z?fY-P@SQhqoZHBK`uTCE+h^Q3zjW@iU;VIBc@Rb3S?Z6ZZX)9&iVZSf!%L>iq0bNs z6Z{Z>c$U56-0uL>#uzttl?U-t8heAkMltX2?I-{I<~Oh1zyAO=0lv>ki`_`*0tlpv zR7i|#N-0zksF=8kph!un%v{#cG{bgg_xCGan5C!-u|hEeOdv_qGJ-$?DL@EZKVR@1 zE3Q-`sTi`3CU_XBQn?pJ(Z*w|f~&(rDJ20&0EP^7!`$3lb)1>i)us2}f3I4nD2fnS zHsv%M2d>-jymsQXe+~5kfd;UMxkla52MS|R?zYRT+#jVliS*KeP6a|M2!VuUz=tC2}?oaOu*<=XdT#wkvTW)>0tDaZrb#CXV7b9u6`e z8~~_Sjw$41?Beo#w%Z7P z`0G>DpQe3%T5y1iZVt2M7*jEvT5D3p&LSWaLMVJ~vn|UMURq0P;1M!rRtQ2)%)yO_6yPY57dBR7;~wlhxp#l$vWc}3A$;}H%8M_YIypH$I-dOJ zdp8dbvx9@jB4FT$-@EeQ-p=M{zun&cM71f%t7tN_@~2-loou+FGtW@J#enL%)IH-$ zUNJ4q&!<@mpc!J=wt4F0(-v`C9IAMMHdIyri*1BfrRJUhWn)<=Wa^xUdL@k#)9uG+ z&YW@1FRgTqB_b0->Vt&_B9I2+SfR`|i6u+Zq6Y!UKs~W#rZ~1o$K%mB-F=j4@N@mR z-|Hr^U0%%N$c`uS@X`3>B;DRUOk#F<{`Wt7Yx`dJ#*Kfzv-uy+wH#;lN#k0W-VjiO zKcy(lVA20geGr5qDXp4n;%7nqI>oor+2uF1dnB}?IF&dww^b9raaT|=aumu`g!hz$ z$$&*j5OT+CG#r;FU556lTUtqXY+T%!9i;? z(*lDTezYvZiY7%hI5#X|w3mOmAc@}k!S{InL?*dogR;egX8hZ<6~72BTFYF3(yptpeSsD zheYbf#1VogRss_nBB(kAh!Y|rRj4w1Xb8bPc`^vf$0y^+dIaC=_Fug8?N4w1er07c z7(6&Ah8E2}(-$ATe&0FQ)L&2yM2$|az=P_wUrtR>05DVfS}O@^5UnsvpfVd$K%rx) z9L6#~w=fzG^DHkvRSdHXvqQX#bMG?(V+0oKTxJ+L^di#l+I3A6I`aJV4Q>e3s zvz#b6sDlQC3~&HL2O%XA5u`=X9+Zbrtd$59h4cxFe)-&2?%mz?PKk`_kVuB3ab(GR zd3OE$-(C97%^UxE`_p%J_il#ZzJT0qE4&J|7o;4HhOL^UY1wE=NbAb9NCCnf)8ZA? zCR9s(R}P43|4>Q{2vsu*C?=Chp{`q-Z6a!Ir)!BW{!~NlSPCJqF(G&n3jzg2;KRd% zXV3i2WHQb&RVZmFq`l=Y2>^qmBsR=&0RV$MaiZBk$a}Bq^T?WRGJuK;U}BOuPOK3C zy1ur2`NH?N?tOUU=C615{u0zR>gp+_i)o{-B-&GmKV_A2-IuhY{>;}BL^>9P7ry$! z{{DVVuUeXl5B2)pJa+}z+OCg6=hVS~MqQV;K~oQ-4J(Vs3EqLgB!~b3L%etJ%3_FE zRnsi(b-VpuFUy0q((TXXS0`<)UbL=2%abw4%U*DkUKs+JThYD=ev<10=jbx{r<}NGvB&>`!}1Lzb)5(nMh0Z zv2pqGOfnWt3wUwi{Dt$czw!FP{=pL$Sil7*TtW3)!wk> zRx8}jufF=~2Y>pYb+PbZmm^A{)huc#)x~?oo!61%YIs7s0Yecp5Q+MW3t65^hytml zM8t;RyvuA7udT06#u*!W?n}=tE-a*JHX4qPj|RKj4~cj<92FI>#5RheEO&;KOozm( z>f+Msa5!36=y-=Hp5J)>E$=3`ZvAF^`=f({zbZADK5gf;QWO-by1KG@_Uzf~AAVRY zq6Vm2N|>rLvAXbrq(yrI)!i@)8&j8pkNl^NQ@O585_e3ivjr&2JSF1t6>(^ATb-uEWEn9 zW=ypI=pap z>)s!>cRn7Ek7@vIA!q9uE7E`Cwb$PN@AvD4SgroXuxYFyF6RvtDAH^N+I&UDU4YC= zr^JLRd%Zl@X+>0f;tJw(*?N0zb*)T#(Q@pxdIh)oaTB0ZRccLBmFa>vB4V<_MoeVl zgvE+jWDskONkW!!M}j&)5jc)I*<=Fl1vfS(h6b-NHrd!X|FtWxtgWs8>X-j?bd-u1 zF_ze@uAb}9KO05yXP>>Zw|C?4;I4C74TT$*H*Vd!HMQWXw^S9XbN#uKK^+)y06*WgJk0b&!MXA6rf7dI~M?(D^# z==f*=GOE$)sq@cYeEY%9`+E;RIyu?Ad-ujmFTeP~AOBcWxe5HCTw9IBf)awdo$hcr ztR>@(H{STK_ugw!piD(9fuu%}+L}j2`uc^IJR!T*ow7S?%xWwmsN%x8^Pk_j(|F@* zgNTJq?=+%^PL1?7G@!mOP62T+PY_xZofA_8BNqd zY$RkV`vVeLu&Rd0_B6mqytuULyezDoH8zQ2^Wgr+yAQ7)pFB#l!COE0-nDnHB}vi> zSCoe_#(9Uzf@`aRDN(IoXww#;_*W9WV&wCeE^cma)@&n!vDP&yZUh3^^z&47zz1}39urWfBNCapU&l!p0cs|Wf#*@Q`k8X@7Ptt5K1=dd=OjqB$dhOk7 zQy-{TTfI=w#!{fFC@ny>O`NJxf1ON4G&@IwK=@w(009601?lJ#000N&Nkl4Sk3$xH24veKmKTdcSA$Myo`t#7pqCqjb;b)2FFD!T?^ z2c}r<(%j4R;mmDGm4ING}y}eUiu)n zVp*~g%mkI{-VU6CKUiac4G11DrLst)l*+Q)D$*zw<#=nS7>z(EMq?1Y^UnTau_%fW zr3CP&zxnvbAOHE~m%m>%)d1wAfv71Vf~yRkPXJ-$maiGmD(83Z-1+|L_adW!^G~BF zKUsvZN1eSSJ;vwL1ZHR?3=pWNT(MHri8YW-;9ls1K#SzU#ZDZyO?d^JY;NV-TgfnC{Kyi$y9&AYNR)VD7rEX_^|~fBfsumR8BI zk0MYZrHi0#k7qpPsqiK$%iVjw{Oa*zvJ&+SfL2{Ygx3QJ~&Tf zfDCH@3nJYVHn<&jU)K zSuU6Iz2l+_f@8qZA3+~-o=Odu4QC31!N z>v<&6+Kc2M5?MuFEy@c3I5;?vNtprEbv+EihvBuT3yJWs%6r!LsN-s5#55 zLh1ePsU#XD8Wm}rTd)E!xsDz=z48S@QNFchS{Wz^097sLa;DR1RaN)z z-+%Amy=VVE*V~>Tco!3Y&n!jVH&ux@q*xUnZg0&4l6|vAbQzuvNbW+HnXLIQgCAz} zDM`cAX0^()QdLz}2r6iNZL911uJ43oCIR9^l!%E^q3kION`jWHqph@JOtgFBM!j58 zJTpw5zjMzD(AN7m!)+FFoXe~cnZpvZCzjvPGpYn=B;5AghTF)jfB_rkKH?ukK38>I zTXzNoBs%`}@x#+oDiW1mgF%>X7+1ibG^S7-rfA!GpCzJ#Cc8UTT^mT_I4LP2Crq}t ztGf31R8wICLYYg5Tiz`3noCgzWj6?~o82tH?f{OWh=ogL7j4+WJXernvMUS)AF`P7 z)_Cx(*|#w8;ltC+_mc-F8tbvxUoozNB@T}cS)i~O90zFzwis0|Tn>{MxUn!9C93LL zP`~#G1Jus=1~YjQ#deCDrd3)hL<&zP6D7a?Gq4-1jA0K$0$`9lxH(PxZ4f3|x7B?m z*lkft^ufWX=Z6A3M05Cr~eRTKUT~J;GP2Zg&$(;;o zD-!!5DpeH-VgL3|9Rh5Y9kaFR_Cff?y}Qu)6eD?*;C$*iX<9}~3(fZSTo8rz&^J!j#!;_Q|K8*giG0Bw-+W zJ~=tj_T~(L(jb!f`tes%&XM`(=qT??>`!J|ZbF5yDU$8H_|FS>S89l|=rDu3J{QV% z(FD%U&WyxrQC$QLVKala4sJy3e{_8R^e>Wkr4T`6P7Y#pQa1>2r)NU4?dy7L?(JV0 zF984tKYRbx%a@mzmm(>iq6nFyypEpHV>+E)TwJV{Zw3Kp(tL?JhTNf5^u|4bgyp%D ziV-o|Pw@n$_s~%V)5WVjT({%Q))2-;mT-7<_~_vy?y?MquqLDr04|E_TWbFqjQRZa zYPGTnZr{57`Ge2D{oA)9GHyL`%9<7P+iLWuW+K;2kXrxw#a!BfkcF&y>7;fs^Hz9X zRn^*2A#)Gzf)uL|rM=ng^72x`BKM&(Y8dpWPacfYyV;vA(A|RL z=I52AM4CS#;KPqTY}&SKTX&0LI863+F^c(6RhJ?MHh>6(FMjvMlfOT4x8tX`tD+QNoWKF*&Pi-m2&(+9d( z0o1Z+oo!f5-)yd{H?z01AwZ)Nf8r5zetzDzEfpR~$$Lp}F>z4dyhMK}JV>YwFwN-o zE9)_stj$#Z=n!jQ(5_TX5hpd@#(OdHI6VB-^XJd=upGJ$h#1u=z8~-J4(3ZkK9cfZ zG3@#Sys$2!!54*Gzrk7 zRCQfjZxcrp{?4wA$bu9%2@Prh5vYJlNGTOmDlMv1$`7x2EH9KsEj*w~2uLC~HUtMk z$eupTxqM@nm6h1Lb2+y;x0#(8_$-wJ!TQ>VlC>y4;m`zJP)|yi<20(7UJZ@!2z&4e zOQ}O)n}(PTY<)!aKok?VE&+}JVma`N4aIpou^@nqt)tLuy;>F~88xDawQq1Xcqm)S zTe-PdovF`5(;{WJSE54v8t^#PJSJm)7*?8*u?lV72zpWN&^D!oz6BNq`@~GVQbwf_D8;qtO;utlp z$YtVa30whyN54O^YE`5DnB4i(rTOzeI?^e9o1vVuAVYQL0sUgjg8&CJ)@P+@N``VccT#Zi^-X5 znNUXK8T9z0T#l*=Y2o+9zVq`w4G9GQj>r5wq>L>$0BPmw*H_8G@L`@MnCQM#3H4tt zym<8h@Z`yp2z1hG0g8UB>XM)U3no_p!K>G=rf;V0z_;6L1dS|@mKotFOoGMnbA%CS z+cQJ5_yT_k$7SYRS&t9)K!nI=Tar7_HuluH-NQ8-QNiUQdWrae zKjE^9mvGJClNp|-F9oa?DPG4?vi;}_2*<1l(7V|?0c8ML9LSEatQ%n*r9>|5y9tY6 zYirA&hdRqi(JCp%qOQ1dEn0hlKE%gHofM6AF>8>yD3)75etzEtn^Bnv~e?M$k!A z>m13^MHPo@T_H!)HofY%x3(TX{sTsiH126|$QWR8SwpzSCloyiWYFd`NNBv1c*Rw# zfC$jC#_N-%!Sz#bzC__p-X5oyII5gYqH zN8g5ItEs_WOw{}LY8glQ8IE`o!d#=c-DLW*?*XixJ4X!7u0m0y;_0!xyj;3;b>(56 znm!GMn4EWFW#pMDFaSbnfeQ$m;pwo%(*-g>l z=H}%&@NCVGXpk{wv0eC*I%cAoX;Zu zf=2n#HkJr$8-aU!WhrAh2o@p(_b$w+l&_iMb&w3IL0f^{^(%J7gjepgx+o&nx*eq&>mBnst3_|2 z=;zJLo7q)_!c;ljm* z>JAw7HhnXF`s`V*;z`r!v!p@6NE^Eo*tTtSS9se*>*|)eqD_rvq0IB=&(rmUCcTOb z=1YMJayP>#3Dp!o>kj;1C`Hw->-=72==i$v&5eb7#0T!e=I)JNZr<_Y#S3>;jh={k z4yDtweM8TL-w>Bu-`%PJlg#0l&q=&dWVF?`SsEH~n#jhO82^vI6|<5~nzhxn!`Y$J zH`ZkPZ+Bh|WP5L<@zI?q8LL32w3pDjSM>OJl(VGvrO)r9(dg*tXgnSxsb`v&nJsCS zU=JF^c&%JfugCsgsHS^A-`n5cUtL|9y_?l6mYtm)D@V2|e^-)cRPuE})JmldfR(b9 zG-x!CDj1K)B>vXO-JgE6ZdzZJ*YL=wE}8qmA(;0Yu|fD+)s+L00at=HeJ3C4fa-8C zOr?=4Q#6`1(#ID7st#~ZqYN@E%^`XGR^ENed%Wa O0000R37OsrH_aQkPsq$Xe*?UJj4~kxUn1CaqN5c^kMeQo^za|E9>~) z{V}s<&6?Spn?e8t2nb>C0M!55zw~zjNYbZ}km(cvLW=)O;G>WJ`u+F&pMLfk09Cb- z3RD2vH;P9ARjoDvfP%zx9|ct1LU!}sx_$ef|NfUPo*fZ?QD6M-ojdpL-3uQ9kjx+` zR22$TMRnWy?rCMDi8CYNp4+?lE&}jHX;T(Mxwcvz930HxD1eY*5P`yOtN1V`#9Or3 z9M&liVNXpUYW@kRZtk_!wZp^5dD*;vtf+e)n;?Ts}QL z)hQ3Oq2IvI_+&=r?*ZJo^NX+V{lk4!ok4HheYy0w8KX0C1Q4>YTMs9Aq)Q@8kAw{{ z)-dB05CZ_JhoOV3sKDqn<0bd%6jtVtr|~rhK;bl-&*CN8Ub%AR?Ci`)FgiK%Y9y02(peMA`6mTNZ77p0 z$-Pj3I>m8fvwKn#`eydcn>X*@zYkzzV`F`O9&ts|B{9>PY|?EA>aS~@5J@W;3FxMPiOiF4FtOm zxSk4G$Upz_4?>g~%&zrvDFA`~M0|XZp%38V{5(S+DDUj-Y^_#fV*o}=0;2*@$blRP zF-AI$l8xbna7>U&Le-FIfw?|N%$#w`qCF5omK3@GG1IW7Xa~o$HNmW^7*&zLn$fl< z+9If=eW{w%Ak0=kNaV8V19ooQc<|r>rmksYY+v@(?d|`3_g!@bwhXrFDou8}6zAd* z0#IE=;rS7Zi<=h^wdp@zNH|H)GWI!GcnwgXnB5MXdGhj0Fa7WMN!aaBPSP-=?{>Q> zsW8O&ob|o%h8*`!WF7|7z&Z^~yb$>5>#slB+necFh*bruYUl%cM$VFOQaq}|5%nxT z(ifX|m;hwCxoIjixKPBWX2ak%iut-P_wkloLSJ1xGP@8d=5{z=XHt znh6N`=FSbXss%W;n6}r?-gu+4*+cc5GOJo%sG~aML~rmr`bGdZ3IyySaT9WA>T(Pk6M+*tZ zNr=aw5P$jb!@qy>Nl5`fIt0XuV{Y@O=PVPV=LbK|S=06-raMLYzjb;hLK+q!RNwJ( zACfz$+HdYOxKxdvb5||SoLp3pCIu07hk|Dswv|@3|`Z_ z{Dp5(LMzmf#}nCg@s)nmO0B}I+3;cFf+n2zf@Tr9W67WSOaC&;c!15+`TTYPDD4MY!r@Ocaky{L5LAjhxK2YLWX$om{bmC*g&i zRJsvlw4pP{>+}Sk4|L{;48+2M+;zEmQaviBw2?jps^UVmT1EDD%_^k$l?#AZu3wLm z@Y+wdL9W8wU66bm-Ncu=)MSlJY6kiC!ZCoSmKJ z0o8l3*|qln0RRC1|K63p4*&oMDM>^@RBT$?ZWKolJ=JsZf|teK2e7fR!$pyT9O7_Q zB7qRG_<}@v3SUURAjwPk18zznf>?qDC#;R}ZW6rPQ+epF>grj>D{FVQcc#0#s?MoX zL#OJ(ax4{d6xsA+ka+t2{&06!p^q%DFlib>8RPyF!Akr{DFQ};P~;@z{`%44o)8C$ zSCY8)TFNGTPFc}L09nUJqOgs^H2_Y)K;{b8?y~~5PB>AowyZ5c&+KOT$;YiPvw63- ztGLaQ@4_1ocn+T#NYyonRCaD*3?xN*qbAvD=ol8W(QBlhXfBaDR!$X7c%J8e5q@=-;>5Z0?}Yj1Y`(v!-9^_q01 zQ(6vN7Dd1rQf`}b4C_!HsEK06WK4tAW{Sh5rRBrP;oIRb8Z~eO&g`p)WeDMm-mzo* z2k%?jyDgg)*2vhxCf^Xdh1o@$KZEsQ?$|mw{|;zuVt$jK#wmoeDqa zIwgd{D^jU4)2eRNmAc*T!D!SN0bnXpA}7BfE7FoOuspr!^%eTqgsKGtb$pAlHn7C9 zB*>Ih8nu2w+1(8eeZ<5I3k!RDdz_yP$6~)f9PYNJp-Q;IL&`a913eXPu6C#i1+a19 zvru-I5}2n~S5rW#5di=PqfuBDBTH=r6hxn#K3&F&I?Aix+`6SYSEZ$2Xtp3gh$tCK z62M3_JbHW(Jk;Fk5Cvl6sCHBszX`JnwN6cOr5f4ViL&{`z8R0lvpXFo`BtpY;yPZ+ zg~%pEUQI?{?@ylzTS#t4;=I-e$+^aR1{~4%-+lYzy?b_m)&UfId2u?eMsAb#K3!P? zg6&5Wg=lR_tBI6yk!dv9LkUj!syJB}WGX<*%E@SLjVT0@%ZvY#UVG*UaWI)o2$7TM z{JdDIVV-#Jng99szlc=XbV=n6b>2I-Z~yt?MF7&@o;-1qTh#ghDo3@5T4j_LvatK8 z_06Z0Ni?VHFwY#xn|QtTD%C}F6%un%TT4`Jxh||41r2Re^01il=FJ=RTxU2OD)VVM zNb7zUPRLAgDzr6GG$7QC+2%zlChcq>W2-Bt9zJ+b5DJ&I3LvB_5T25#bmRynrOD_R zKcmfQ#JBRec^{2#?Vg}Zd@+N1!%(%|WCO!l5Yzuwjc_8EFmV6Z`+q!pn)+6@-K^S3 zz9kIY{o!r{c(7;o%u^0p8#j4h@apAD&Z;rC1j%RkW-us4L^Da8LLP8HO{j<}LJ5>a zjF^r+Fl9^{o-lg=oZKiDfJMu1jR{JioGvhqf*6p)=~o|b5HzG6cj zG7%l>EcE3+2Qec4WQ-1UM(H zR|Xm+wSc4$(*TrGB0_xVrYiC@W>{HOEbQg);V@kD#L|*i-#6T&D9R(9j?1A561gxr z@XO83Ryxux)G?Kdj}nzcBpKN=-j7Cg=ZH5WA%GFAua-(YSfuvwx_tSPW+8D|$@N5^ zol7Os z8xJ2n%C0PL)UtX;fl9qeD=BZZ&mbF=0EzygTfVlozP-Kea;%;$DPsS}JUIzH*`jAT zaFRhgJu_?1mVD_J78jFK5MVla0XIr{%@I0|I)ph#bB^YSDo2aGUQ~KH<;u7WdDmB%LE^ zybu`p@ZnGk=GXl zAvVeShI&Q?x0U*Zp%8HW%9Wpf`PmB81XNYUO+)#*^xgC4&*R7oN2@5To9iYAG@32U z(U|nwST>nIc0jNM2~?W?xF$ebkgM{pf{NZk^CZdL6>{gh z-S-CvjY&9=xk0X=v$AbC%6%pH!dzWX4iD`Qb)>cS{{R30|NrC(H-P{E3l&L3K~#KO z>5tpS6@SCwE$TkkEA1V7z0Uebnv! z#7?}nSK3{zw7Mx$JZJiW;%Gz}6&3=;9g;J@_ulUv^C$$A`jiHQda=O<%Z3SY-Vujl zG>F14=8FITU~hMiU7~3ka4`?%{s&$rop-?E6IIj@1BSMr?0g%X1%|^Y> zTE`ZR3-KN`pMNm)`6w=miCOJ$Y?@J+Fjp_m15*xtfkU6!cP^LXJBSd#*5)REVG{k= z?r~leC_uD@kw~3s#0-2hOd{@#k|~5jN-qZkMyXN%6aSH9DGUjkAIp9`fC9*}9EKr} z&djzK1>QOO0Dyk|!3WKgR~R8t#IlH0NpxnGCQJ4DmD{&&HCxR>Hs`nwjoB1&`oZqc zo*NahV=bB6L8(%{fB(U7Jhp86H5SPd!{wSQLdbJn9%V(AyO)=+609>)VUVJ2RRktU zt}}&sHay=7TX^|MX-T|>MOBBJD_%nKYZI66A|?DNlg@?p%$^ogg<>jwwl z|L_A{W}Z1dd}6pFfCL5c(DQk6wEFY7R{Q7?FX@E@DHE>5mNh`T$-?3MPBDO)u&^1|vd|FFua;=a~>q=>3N7B=4g_@euC}7pI&iW?g z)0JXjd~s@IGf%&GluGBG9yg1%`aiz-dSK3GUJ%lGl{f?%$M_4~r<}UbIGp7t&(QzP zM<4zD(W6A8E~{WNpxL#Q73UH9;Jx=AKYqM0Yvw-^d%_rj0En3a>q=+-aIxD!=g}UD z)kl;i&+}nrDoh=KTQmPJ-j_rlS;X~n#?X{TCA(3t2-!6%>q@q)sG9HlhN5U8$?1Ck zJJ{-$baffPMkTQe}mS0UKB#Kq)M3B@#N9P@ERVp$IpI0%UVJ%W+uD z6NV&#Z1jnU#W0NB-JQ!`k8(OCiXtI|GUtX67KCcSxV=}qdu@GlXPZ>_aG@b*N-jv5 zTybr^K|lyVkaM}uo;*3R?8ePIN+Ay^HJeV4rxt`XTdI_+)mCS4_rZtvA3jw4;nr4T zJRVU5mK%hGGSWBFX~%J1qp&OCCJ!7Bc0vGjg^Jm*RV$ejtS%r1DCG(d;T+ca83K?L z5gcsi)Fs?atM!`}th1*=nxWs({7T>FM_Nj^nz!JKKBLuAAmWMxm-3`RWxi zn~A#7*l1X`O^|qS`<;(}|LMWrX1Do_A~f@Z>o*S1+ieQqx?V!1_&@_VyXPUB%Z7IY z2(c_7VG0PKR;`xHrRdecgsZr|zmHV`vEu&1FU`Foit}|qNFZ@o#HQQp^;QLrxNIv3 zeAji@c-Ql$)2YCvw9!$7e!Y}=``VRarEu&>-~QaZdFw4zQ8pXvvLvO9%y?p+oxGqx zcel1{SL*3ZmIU6NH*a(3*;e!P%<+OS?sA!PBe!SECdM=uEiaJw!@x@=fdfJaAlgRpdfXr?^UmEDTHQQK%xvLN5IBy*Vj=cm<^qJcETJpnRxQ7`S@HE;$MgZqhX*%a zwazp>_2kJDjK%#o_D;{wKmP6Sdi}wJhwq=AHoyPwo0KGKlGJQ9bxjw2cRK3png*d~ z4*Q}k7IN86ueVmM^oAoD!eTZvnK`%LKKjEapZxgbOFtwN+YLgJQ2Zr;I0~XG=c6CI z#h~SI6JnHk!R+qrjD|yoShLx}nt&3LT)@iRhQ{2-xF|keTv90HXWXXBYKbO#0*cH1 zQLvlQmBa07t(HHY1gd6)6gAebG|$czSor9bE!Muyl^Dr@D&4)JE8W4D?o8N(>$vIt|fR3?sBDiu`CxcBzmN$+%I zPAtcF{SdfUnpTx*zV;=NEb$Mscs{OU>XpEfNB`!{!%nA*4FMt6_JbBf7m`>|6XFqP z`#}`uFweMFNEG!M1_3_<0RY3i5lTQH2&kCWu5XsF){EZ`LX2=m*PW08g0x}ejg+RU z<3X=bEKdeKe`@L&x}EmL%VSkH6jdpwB(v8gp3~`e$|-4N*;2}IeGdd=4|=1smL579 z_~GE9)9ZqO9&!OVl0q%<07TTtDD3ioUnEwnn2-ys|}3_y5WdoYC+} z1N$>ly6-Qd#7?J60kDC&{vUoHXW7I!S3GwQ06>>tf?(670QZlMj$gcBQp8*XFWV8# z=*m_tFQ<&J&L`zU!ExLmB$A@mN+owZ3Z^3&i0gX3ZPg6@r`D-KJxvnJ)v7b-cFxW_ z?Q>*}RY_6|!^di_vZkt<05n%D2Yv|FsHn@%us1nx4cg~)HWf(-0r4y|xHypzy1l!d z)r8h%e_+o1kSv=ij7Ot{4@i_BRzn)jv#pe=0RX`FeLl*Hj&T~Z`tVXP8`&D)1Hoj# z=#S93SwtfcmoBziEq-SXV(CUj0!pbOi&r;FR1nU6;pm;aFJ3hXATJ1~=ER_W3d8x( ztYlKt$)uXk&YW36#>efhuIXPteZE^O)hgxQMSHhad3rG@*EbqlTbio0I~^=adf@n; zw{`Qjq^E~JK5;#wXbVE?`V73w(PTKC%OHWNBuRvj1o}K( z^We;-wNlw#f^_8!PH}b4SYa21RyG~FJSGlXnc}03M%|oDqQ@sUwzySApY5&9jas2Q zo}NryEK0-SNE8skk`(%<7u|z;b!52$P%7Y^`W4%8*9CtxwVQ+SPDb9X6g|)LeGhpK zq%yl3^>n!wgrR_OHk%1OpV+hB$+1zY5R9d49y+f)0c%EHPG?fo2A`oAjUjP7&3XllQiHUgB`Nzkxjx8>kFc!kf`GF5eE+m% zO>JaP@pPPahGWy#6eX3?W|l=Iyz@r2u^HMXpm2KDN>|t4fA8U6{`%+B z-o$qN1Z1sNYvFhSdc7XM_Am$@+`s?)_&8c46CdIPkidQE1&F8`s^i7bn062(a&b

      -yuT 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 Wr@~@nFGHUI0000esm*~%s?WD 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 N002ovPDHLkV1lTimc9T0 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/33.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/33.png new file mode 100644 index 0000000000000000000000000000000000000000..1fde464ddd737c51f83d8c65d99c28b680117395 GIT binary patch literal 18343 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 J*y%Kcqn&fD z)`qc8-@==l8@XDi(}_h40&zxaIP~j|ySux}Z{A5Yb)8X6^eGCb(=qQd#dq-;fc!$~ z{rjECS{W*K&-5b^u>?~jkaFBbXc=0=uflgUIM(Q&G2Qf>*}i*!Vh z$LHtg6j2YLy)1XzDX-d+R~Z#0W~MYv)6r;LqO+KMuymd<^L#!pMHW>VnBzdOLD+h~ z=)ek^nVq9f=bq%FvcYQO=lC4r(g3*Lr>Cc9XJ<~gfkKyq!Ck|LkB2=Ga#22FMdBc`G;=%?CtFjheKUt#@&gClcmDZLrh7+Z{EDIveNzq zAIth1w}}|q4uLRSEv6>7y1Ht)5-d~_nHuu4D;2yiW_yN34LduJOe3*&7R4;_HI8eR z)DzqdR5>^}FoYSDR}{s;!5`D0>|@Nb%vg9p5@=^_ZB3uLAiNI-zL|jI_AL>%Rr2lGvuB3Wqx-lh zlhKm9qs5jSveGPr6gYrSz=XYBwOWOuNngvQ{A&vm5k@jJFM=8w;FmaEfOT1%_Lz{g`A`R0R(L{%N}D(DgXcg07*qoM6N<$f@eF# A^8f$< literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/36.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/36.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4adbcd86c23ee3561101beed3b7b08075918c4 GIT binary patch literal 17876 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 a;_)BLrM;}vZ&XPRwq5m->?Cvt5oUw5VIw3a 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/4.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/4.png new file mode 100644 index 0000000000000000000000000000000000000000..46b0e5cdbf777cd9f6b6b87e6db8ed46fdd87d45 GIT binary patch literal 22458 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/40.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/40.png new file mode 100644 index 0000000000000000000000000000000000000000..c2480c70dc86558d6fd2b0854fe3858ec312f142 GIT binary patch literal 19774 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/41.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/41.png new file mode 100644 index 0000000000000000000000000000000000000000..acd14c2de9a9b32a99bfac8d6262cf19de94e548 GIT binary patch literal 19670 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/42.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/42.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fa0261dd82d3e5bcf1115a6c864a8317b1f2a4 GIT binary patch literal 19746 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/49.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/49.png new file mode 100644 index 0000000000000000000000000000000000000000..c86f932b0a7ec04afa2fae93ed34792afb021e3e GIT binary patch literal 18029 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 Af&c&j literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/5.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/5.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3bf683ed0ecd04a5fc4ccd80c8fd899b649613 GIT binary patch literal 19159 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/51.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/51.png new file mode 100644 index 0000000000000000000000000000000000000000..6d056ebe441920b882be3f703b38ba3c5432584d GIT binary patch literal 17401 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/52.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/52.png new file mode 100644 index 0000000000000000000000000000000000000000..df0d701466e30f8545f83b03a97dfd5e046e5f9b GIT binary patch literal 17486 zcmV*cKvTboP)s zKxqLbbVDhn8%R||H|2M>U9xPuDIyehR3Z?e51g+wThJ-3Vbp7)*|bz;dc^JeZn z_ssnoQ_Z!AFhm4mpCHk{1OU>m6$nX?ARqt)AVeZT_Rl=qR}yJ4(h}Y7!OBd*_`!Hj zI$|wEuh)C~_HEs=Mgg_stFN#A{_AfR*aQqlyMHCeP(!kqZ+TcEQWoWCJPMS#`S=*j zB$cDjTOHeXjAS}zsF^e-grjfI>y!7hjt9*9C0sJra0jNYe zF&d8moH~69$~ZWoKt=QMD?R(yzPSdVyU?{(nP_NMZ@r$d!ZS+*qQ#!Kae|oEaQxwP z^YiwwGx=3r6GtQak(_qBU6w@v=})@B{FRlJ)L4NCi-mU8XT4`RF2o_AQq)=!DL`wc zb$ED~McHW0+z_k#-Li>q%Zk1X;sgwq^9-q#_E%LK!t$3kawr(uYSwl5l}ylFW~H?pSb! z8il}qAlFtJ$y0AZCV|~3zhGBnc zX*tv+(mGPvJ7Mg!&Q5?)u@!*^L`d4?5S3ztIw^@ImOZI4PZBo~Z3X5@zloP>erHOWA=B6gKwP?XNtMOc)|RX1X*r3dB|z#rw0LnGAF0Oa!&j-w8Jz6*cXxMd zq`8#}%9k&~kX(?3VnLRQr9w%TiiI-nWxQ^2aSGp7RM5UlerF@y)+1YW*1As3sUU>cbby5S+z?B+~Kyty}y1`|tPOSJ?@>CX6`I`I$85 zj7FoQ(NQM6)9H}ZqW#{iEV0#}w`95WJ+(~~iB_gpCp)9%@|TzI{c$frJT>$9Q&6ER z3som>B}J?^R80~&+3#;$-uUIGpA+P$ke&B}gqri15<>;)XURC6~3= z>v=pc&y3f(@hBS>CA4>W-)-E>#fuj|O+IDALNLtrbV#;>$B)!Luwo^?V0DFp0+#ci zv-N0eZ*PA(Ju3DFk5pb>hqlwZcki-n)~?*Jnz^k9y`PpAFRWV7(=2UNWI+oJs^O=L zuaxXdubex7et&N-qasDiRn`k@3L2j@{LJB6ec6s}$A;YWz0W1Hm3!H5-@d)Qy`3hH zd?9Nx7F-D+ zJbv;xzpGSFwn3g_rX6yTat*cA?rd%rrk&TiAzHF7vOTGeyS=^raO+`4Osp<;7+{!< z$bGepT&=`^?}XXdXKUZ{#VDVGncmUz2*At}t>pL3z`Vw(x&}0DSXd)KZ-q&Q`E8)H z1O0qbfBeinW%plCt*m@GJd8aol`6Z}{klc129biW*+5U0S{0j0A7n({7KrXYxDN(7 zo>kSXs^AEYi8&NG?26+&Arkm20&_4o7n*|87{YIS`gCEQZpt?>LC+J2L}4yCS}-X(0V2!k~po1G~Ie__sDvV+r4z@ z((dbB6x&I*uz1U{5ht&;tkZsKeWo?WcCS10`_o9v)OdqM$F;d zjp1p}Hy6%@5}Q-455GYSavW;fSM=AJeyK?0U5Isj< zAgeX!|@{lkOJrRSB+z7H1c1Pxp1(6^WR>8BVrEv&dT>WoVyWomlsL*q{z?t z`Sa(LF%$uv$0LWGzCLtrNLR0DKXqMyI5-H7*?#gl7MH@?Kn~m$GFzGef;YQw%%X#w zsQ?!*0>(rLz^UbB=UnBF?A2d+)j#}l7);75I0u7RAFt1<$~z?mg)U#dJozwzfRL`6 zupNv>?JF}--4z1ScUP}|oJ`Dhn^^VGSKOU**8Og5Y#h7~=N3dxJ2S&V3roCZ?>!(|{{(b%&!1{PRo6e?3nr6>) zUB?szM#_SEschW#j{X|jZYpJvwAhYW_$kyl!WXkk!TMYVxU69Q}E&8F`dI{BN?Mi!N$tWQb8!KL* zN%85ehzOaw_pF|gqbv`PT-T%zehr!0$2kX*HKOd_KBn^ud^i#MD=RC9IrmSEz%fe1 zyvZ}jn?K&v*Zj=GB9xw@kiNXNU;`;MI0u$VI{w~+-`2)!8he?Te!2H6IpwUL^8g@x zfBm{%WH_?HLmhX%suL$o?0ub@#kFhKQkX3yK)n+rtEK}!$55LB`i6`-8o3ZNmH+vO zb>{5ZgZJ-|IUJ&B3XY*vGKRPi1_OJEbe>~c@bcx$s;NWO69D1W&MUv2{$GN3JE-gW z=;#Q{R=)uX6v$`keVB`-@~&r-pYPmxy%S!j8jVKXn&^O1Q-)m``hixuS6QGlW)|m4*`roX?!u+>2^AzMW#g#@3wfXjT<4R_3`-3*JmSqA~Kmw z0-cFo%Y!EZ!P7sUQhcuBE*h4*MJg+^2!MZ{J&RY~{`a;!@&vrR+)Cu7yJx08vAVVj zqW=K^0RR7zkhRYM019nML_t)XTUm1))fGPH-rl=Mnnk0LWh5_9*oHs^l(FMf9&l0= z6M2AZWd_v-8vLUO1Z@lwKJQhy8wkW%bJ1FmOE6v;cGxr%@6o zNtPx_6eXr<5Q16GI2T#Qj!#Z!vw0k+sunpcD%Km;8`1yj>&FWP=Y=1(0lE0kOZG)` z=rx}%O0v*#vY^p*f^#uHFf3C_33Xgw;J(ziQ#$S9jv6#*sR49bUvA&Jy}!HH@%WBvHax-tBcg-{*PmxLz1VEEnN?HlK$q&pGF|Wo8*$=>(=_#&HaQ&z}9~ zbbOw%{8!Mgl@9NHrPsf7uG)ZmC+}hrHzPme}&ejM0`8=|1=gGgm&+2UM zQuLSBVpeoH`WKMJszK%rptrwAW6iB((P(-VakhTYHaJ*PW=&>W1u7cK^tEi{BF&SO zTxQ!YYhCoqU^OUZ+jhUVdhf%XYu%B|xYqi7I#XKnoF_@THe7rE{X5V1_QUxcl*%%u z5z;gxgh;6z$2JVg7(;;LlatAGMvy2el~RslQ-Z@@|KRXw@5MoWv9t5d7XQ+GxK=pb zKwpL$TEG3yJA1pk&CYEnx_B>2Jqzm`wd!!Lk|R=up-3n}gBX^n4I~CZlOiQ$!bM2k z_Elo7%J`?=xn|0mqgGfQQl`OI-+GG@-1*?nUqAceia(f~O_f$rnuTFJnM{%--Mlio zw!Ia`G0`f|nFh$Rj1to8tpXvGAb=(W4b#XnMhFSRC`}TBQp>WGQu8okoDbIqgYIgS zq^v200w8Q|ZieA6bV$4beQ4s#C4Ou=nE=3}uO2;n_6%xWZU@9z>NFaC7YGzsLzUl_ zYyl!5KK$du@4ox4R{8RXw1ufErhYm4M#Ppmf(2JxPG`_kL#|#K{r=-m9^Cq5Z+DM# zo~3Ed`T5y-lCe$@Shjuj>PBZ}<@|h-=S*@=C=o(w0LyU@6w6qgq`8n;ma!}&h~u-f z>15`6UY2Em$OY%QFfG%dq#JZzpN_lzwI@%WTn_q0=xg+GS&Shh8Edb4j*Q@7ZE*j0_h0PqBV8OxsV$Ex%#KEbAVol8 zJJ$Br=0E=a&A?vydH?4qj<}GfX^zL^7cUNbz3#iW-*sGf(C;U4%oyWbxUNm8X*sSR z1oJS=7@th1j%_D#j7V6XvphE~LkKB^kWvvs(li4AA-Ir|362O^lB5}1?w0(2(f{(% zmr}^Oj~W+_NX4Tp;}1tKk0{!e66!_#mQ5(oj2I#L;M!WJz(n9LIY5`t~=U|0SA)KRo^M`1R{>9@@5@r0HxHt_=qpS2p_n z{@QSKa&i**9v8wej5yBHj9Hdt+g6$+gb+XIoQ}_gkmaERa2-oXsR3=?K5`7C@DyE~g?I z>8jmityM`22yWlFc6js>3T~(NrL>w6tJwkBqy-C|EHxKjb?+=hRseutTh@b*KEC(v zZ%+=6&(F?YpPULId%d3Tdx#KpI#R)4t>0Z;6;k@Xe|UJPq&z#HD5ZrEtKBXo;5hbd zHjCrbvdrmho+OD@%Ct<+bH``rQ51WgM-X41oG_LPF0|4tFPe^l5R#`XiV`8kCCTc= zRUxUhUKl!SbtpC3+48y@e=ekj(6UBZ+tdhvil3@!-ZJ03=tQcWTD2C z*yW5zGk=1pp`4Z(4EkxB)q-(sN94TRTeU2V(z+avsbbBlgS_V5bSon@O~bdX#}EE= zxOe#S<*V6jP6+Mxx}N9l?0o2VIvX1!$FYJSKmet5lB7aPEC!PZ^*j#=3c*dw%5$FQ zc^HOWCR%w!HfIMfmZM&{JpNEd)C@GazLhw!yWQ=L8l~NT8r3#dzIEs_F zZDZ>ef&$I)xMVN-{eGIHzl#3ysw_Gn06|JUv*`gTLi^g^5X{mHpmOU<3(m{UWkov5 zihxw0rG|Q7MrkcnX^Yy8Tv{81j@AZW-2Fq(>+bFT@dC5G7R+z$}@I`r}2jlco*&3j(NRu!Me7(rBDBCB6x& zjv8Ad=hfv6J*Vn|RMAJIK!fLaJm+-@qNM5Dyr!22G2}J-QB~ri|DsizGf=1 zeMKAk5@1Sv6RNZb8gpNI`RWPEZ7j!DQVzO<)lR1qtXPJjwa#+}8vGy_4cEgYEHkWH za!}n805sU9`O$CQ``hPV@mzYIlO&nez3X3yo^~WzW*-(00960kWaU)000dINkl5Q()L zy}q^T)#k%nx|<_+;LtcUUgOKGFEhW)EDr%4)(a=j83zurSchl`t=oA3YnZ*Ru8m)BRhlu;bd7G-8u{5 z+UqvQ6T$s}F|XZj^}1cch_lvXELVmzE`$I8LP(UPgMRnj#nsMWM~Y16If4^HSZf*c zgcJafONjv8Zg(^udzAZ)Mp4-!0^`0?S}C39;b5>mnJ%OvB7*qo3EbYC6#HnJ4lE%YPhp4q%;p&b4Ch52s$9UgZ{<)_s$rtb&?6AH4>5v z>8uMHL7wNC5OEZ9&H!LMo&9|GxgSkTO?FEB)p3FJHWPA%(md-_95F*?d0O+qt^A8c**UjV1sb+}nTt%(}5CldWN=cHW#pqF0Ho9W2 zz#7|ZHp_K8w}#p}`nZX{+hF!pur1`AdNQGw7)T|x5kk?YP>*|5WL*uUxC(t&%JmMw zfimj-_2n<;uReSH^x@fGjqdJbo`ZAm-@OM1+r6z!h$jyp%Uq%Z-}j>=z8T$2XR~Ax zetGtAd$4_ZaVT;5r2RBkLFIB-@eMJe@t&Ny=p(o_^j z+gbw%oUb(&^cY0sm+&u?x=%=5I?j4_$#&RJt@3E(Qj zL1RrJ;{TR&{{`o)b*_pxCCZgO>ha{mqobqa!^w17jbfHl4U}*SE3LRJsaB5!SRJGy zx`M-Eu-w6Xu?YNNZ?GFKmqLglH~oj-|CA)jY%%}g?|$Fybhf(vcB>tD{^`-l^M{{4 zef(rTokU5>J=*VebEOG7hh)Btc&lTL$z`5psmg^hHrHBavfFJFLLGqTdAU-JM!-4e zoQF}ArdcLLxC}epu2PzDMhNZqx|7K?6~b93gg^u-q|)ZI&z`<|{bo2AXr-i-Qsw|a z5M9yJ2LJ$Tt;f7_wyv_x2K4LUp~k2b9@d~=9}6c4h;bZGX48)!J)F(wScz#sfFi5r zbJryV=dgNA#aFoMfPsSgeef0FwaiA54?rG(4@pxNy$ z<_lwN&}e9FJ?6c;xI`pE=7dlr#F$cLQ_3*T<0x*nnntVbt^Rbjh?B%<6Gah0qLe~H zIA=1?m&+w%EX#y*PHR*Bi_ST))&hXhw$4X4Dy((KUyl&g=v0;GU_BSIzKm7>I-k$i zjRc4keY$e>P1i3E1VFRdP)eVkoi3M)(gqFy+`C`j6=m9NKKtd>tFyDSez&KT8jVK) z(Cu`SBoRVnX*%2<9QJok_K!rCHX4C*&gWbRA+t0|GfHW*-7(f`3(LhK7vk#OyEu$^ z5VX6!R<}dB?<_3l3u~>)RhlGPYXmgLFvc7J^E@eKquJ0}GtZM!NhynNjM17SUl|t-HzHbUKTp_-Oy|e_s47vTU$5*y(R8sXWB*pMCY|r=Kg8 z-@kusEJRV5OG&AxwL!3V4r?RI)ykCI&GNs^qudhIc`v%9;0baXeF z$UKk3NMs^chI7U_0|c$LHpcTjBm}?}K|(9-0HlYB66QwS1nN$=&jkQa{Rh_07NMI0i{~KR`U^ik@6p&o+_>P_V?o`%%lJZ%=eX2 zp2w0n*2ehUm$^*S%wwKbnh?Sm6G8%Dnx=#hL}Kgf2OR){vkq}}^VGTsQOPrFp1!_F zQXK;8T-E~txmuws*{uTo`Sa(u*EhvqDfcGUk~0LH z&1a+WXnSjW(BI0__}S;rJc`X`^X;z}Stc6I2BpMVLz$lmfruhajj?{A@@JV+s@-Y? zKATJ?ccW33B)j|jle-CHEDEEmi;E;qZf50Fb~^278CnNvno&wT&l5s4 z+ilNd)>+0Fp_KdnV!7a)2_cNNuE5JW>l^@3k2>dyJsxA$@5HEyrE=kVYPOz_szY(* z`#9G^Kw_2_C)%7*!%oyVwMBy?D zBOwHUJ36_4@9=;zc6)tubA25yL#5PkckkZe0cRYXo6TmN^Gsw8oW~gTJY#GWMRAf? zYpr$EqlF1-2Peg{CV+FGwcddK1KO#EGfQOaa9KmtlkK#lrg@7Jox1&2sDJ3L|Q)@H;6jO*&=2B$25PSFb0P&NjPo|TpQtJHt z{QBa8`+R#i>~?#Z$eeXj%IS2b@_aZP+>XXl3Z)Gabj}%T3)(4&hZbId>KQ~sps&$98z))Xz0d+=H9gqt9!T^L*sN3ar9k9k$4&6%4LmZ860dP8<7SaFh z+jB%{wcELr1?Lclpr|k zF0U>Lp@o*|ao<=Q$8nkoV>BV8$mkjKv@ylRW2@cX>i2Y^82}nY3=G$)xC5y#UN@uU7t zI&Qn)`|Q!IhG|OICmgRYVb#Zxlabb-)zJLGZ^z`!L{b)44 zzPbV=A3uC}aB#4*I|S#_Br)0)hrk$%00c?VC^ODh)B&ZivjKfos1khh_KnhdRdcNY zxCZ*_r>Z*O?714K8 zEI4Bx^SZsBHa3c4&OFcavQ$uyaLy>DJHw$iI*DUrG$EMh3JLM3$2s>r#u)Q`-e?4j zu{cd~DV5ei5cs~&7!7RL5Fe;9#wYHdY)W%q_CEep@m<8zf`$CBFe3V$Mcm_Z4dfc!?iHrjv5XZ^?0RRC1 z|ASS%IsgC+gGod|RD4}oliNsg&Zdf(pcjQ&QJ-_>@m?6laddHhu9VVBS#;d@Ju_^(%kz9AVcOhb9aMI4-}J165g=fl^}4O5oO3NT0F-6bVoh4YmQdPR z0RhfBAdVn$3;=*pYOU>nzHvgmF!Z_4Jsw3-zn^4T;c*|W@i}kwPD%-gK@b|F5SS@NHB%yRL9C(afPN$w` z(=?0YxSG!iAxbGJWt!&i-@ffd(ZS(Czu)(L|Jy%)+hBVC{{4f4gKz)ykFQ_9Zv69A z;5Tu09~<~9A6+p9OR203I{+}^t@#i%*!{Ovl-araI_$@47q=Yx-~6DnfB*<2Nx~TY ztFOKqj7Aqp+@Pk8{cx^Zd~u@+eWplx5Y>HO`?@${4Mc zlv4P_tGxm65HT*DamdeE5%FfBmx4 zjq7uNZ|_=Fm5egCtaP=%Tep`x0ARp6+0&J_cj%wJUko>21TAXn$52Cx^%U_xiA3O-QBJ0x*HU=xMOSJx_0mA z=m;(9<%Gv3uerXzcXW6-8Vx6tNmZ5}qgk3+YnvsKQd@M`@5ja%2V^iDjfR7KHfw^P z*{mW!93e`ZqL^{c7mJ0_1}LM9HRO1IFo@!4I-Lq3;w08uF-jR@X_{MO!!VFST5Gj2 zQb=pthNTw$wjk5!Bzg72%e=_LC_KJ#{QKYkOVUsN@E?CbhsCTIk8f@7>{eCPP5~s) z>qRTl;u9EdY9jy$A@VFQX2r^`Fw!wW8}!o}RkElT&ArgYx?O#^ii_K0li6&hq*{l) z0EjrgapU;$IRO%cAvj2q9-(AbmKO2!bmDnl7=}WMs;nqwQYoWN6!mH$w9yVgE3J)bxE6;F z(Jk{CLI`R4K^!^~rK>1k z35q^;#|UHw>7&&z-{V2tijzNuF1#d$Tcq7_q<2H{p%nI9XifEYqdkv zO4ULlV&MB)8+1qjC?)USy`uzt-`Cn`W0f|=th9(0F$lQl@u1f;)((eBQC1%=rw#!T zDWz$eA>wqJQVPBwNU5~Zd0r%OB!xsor451BFuLV1kQIAF2x*%Y(GgA?kxa96duMxp ze?JVuG)rqyzkK!T{rUTQ_wMcO?gl~N2f@khlZ%Ust0;dIp04zo5Lo4R?B{~54rv4@ zCnv+({T>i#kaX##k+cG3L#i zH%XElA02;o_wHmeG1f{cVMUR4IO5@HNWo?8|V4slE@~l=xiCHnr(hQcm^Kr0G z+~&V*CIrqoW6aUvK@!I|jt?z@5TahxLe!qe07&C7fl!A|De1tKRaKT%nr6lrN}1By z=RA&jJ6nS=>QO=`XJ`E+)=C?#jI~N@?s-B8ZL~JVV@xXD3~4}zgutMmOw+WvBFgBB zx@{SlPCn(F`|RFl%9`Y5 z2SUoc$hWq)^Sn?>HM@8|C*YEPVvMGgDy4!Ts24T&eb3`T5bPgZ>-UpcS@xpdbedjV zUN$8y2S5lcYLQLzB#CPw&{{%>*4jB}x=ys#;9#++mDY%sI0DYK&w?TZ(XOnhbB;0U z5C*$LhYk^M-Mabg*|WEA-#-8Td0Cc}lIJg8bgx=SK`AAa3nz{NjsR)>)RX zSZnAAq#Y;Lj@h7%3_4DDsrUf!;K75h{_-npY?fuK5C8Sw|Lwn?Jo&T$KB@kjTUk~& zjt&WBNfK$TqbO3wI)}zu020R$Iu``NaL_NyN+})3u>XE zzNoE5M6}ix#jKyi^F?ipvDPw1l~Tr7M5~l?&S|ZO!(m<5*r{{1vj`hjpz(~9I_Esb zE{oJ6W?6Q2cGiqPfAE_J{Xu_nc6NAhKq)!8egp)Lj*e zj*qphk+2}}(=?q|b7RcT?k-`>7z55}Z5$zWT~}r4fOw1wv6xQN<`EcLTd9=RMr+kn zPlQxWQ?xO*q4kSmhKS5#Wi>~OK@bFCkmWfzKx@$=^B6jZh{oD>1rj>uF$d1jhJIf{ zumW-!=`lu6PEG(oDLo$F5>lRwPhP%$<@?;{{*ymFDavx45RqkhU|p~z>p%#A5RYEz zIqk||ef*ylfcvDrZ^&ZV+cds;{LlaN5B=dV2*Z97dz_a={_gy8e{Y*GUX)dm^vkkv zKpf(%oOzU1^ZNS1-qYtVIOC1cuonFwV2ov1TI4zBK4a|s{37suB_&WwDM3V0i&_Y! z6s3%FuNHz(N-1@SXkF9&gNVi$hmHba+(SejaN#r|WVAJEA9S-!wZ`LdQ520ySR=UP z6+WSotA2>v+`SUM-IiJ^AmStH+86%WcRk^h_6jDM{CIl$*VvxjHmP;WC0Y*tfxT0-Y5Fv!m zy*N&!YTd8W3Y@cOmC^uC8>6-1O@eJKy0+t?X-lu9XO(Dmb<)LLspDRs{EdObw9sH&zrp)uu+h4DNt zgwV!JrzxduZ*TAEvuBJlN|`oBNhPJw+9<6!^OV+zsElcsa(4y+YN?x%@Pv}4H-K{1 zlmwJit8*UTKFPDZHRZ63YSs({Aq{Ix)`3m8cGi|KKaN?JmCOGF00960j{zb)000RH zNkl6;edp)E0}oGl(g7P9p{T1g4u*sId@gh8yWvoW^{g{%-EO-d597t@ zVmKV8Ns=VVa5OqPKAKKv@812IrkS^x-f%QD#@xMk*Skx38{nlat>rE~S)tp67YKyjtaXzTNJ$*2~q3Gv=4im!;ZlckA`$ z_-HnpPK+^mUdX)gZKi3q-R=CkzTs$?%c9YbKKqS)PFAoUf-%M-PEn0nEmvz<(MTQ) zpV9j+>cQS+mW_IV_WOFX*1j@Z1p*jjD-rauz}ulC2!PO{|H<K z)A5_1ekn^OB7sCw7G+UpS*Epi&iVv`$z*(b>-6Qz*8q?v$!Ihj4hBl=TuQ(EF_+S4 zEdhR9sq-KWiDY31V9j$n8K3nr=*<$} zn%1V>)yNeB0P0)9zZcEA6>OO8?-~BV&z*Ieew8<<#M@C(mQ9j$KxRvVz*D`$H%kdqeA)uGX?<#=Ryc3M3QBt zQc_CJn23ZU`s}lNuiw1!&?}{^bw1zLSX=2+1n+f2WS#<9Yn^cwZ$X5Z`TJii7Fugh z{7a=e=wlrQ=WPMhR_q`Es|z-U!l%2a_c8d@$Ejk1Ky?r=5e^7wsaXx^!>Ld;+J9lwI^0e*4$w7auNa4_b?U(}-{G zv-|h=yZtBJGtjeJW7csed=k*!EV~}f@7Z5;?aZ4RWQeCHi^rco9M2}k*d$G(DALAc zX*L>n$H)<^W%Pv7P!$IyQXrl z?YTL+aL}uP{&sRHfBSF=j*e#2lf_&Xk~7X2izC4pn@%Q=9-aU4_FW+hS;#>gE2Ya) zF~%7~V=S=h70KSsW{ve7;E24d$1wz6zqG)^3q87tz_2XJ5Pko}SlgV_^+sU(X!X*X zj4*?t!Gx$6e>jj1|sy};e*|7cXs>ihJNk!3RNSB zh_<`^)pDKZ`JL0#D2_^{ic%#>mP?uCIT7VDN5HaFYD4UEwibuT^Z>=Lo$QY4x94wLx*;+HwJ-7^`K~&{N1drAb{J^Q;e+d8l z_rIz)sE5cBwFCb;`rYTQoHx}W!h_k-%^ee*pP&Ey=I73S2y{lxtLmdQ;|ziUeWlc< zFXHp(&%giv`x`C|fQTXzw@yz6adhYQAC70U?S8MdzFKd5y({aS(Z*BH%E!;aI_Hxm z`zR1G&MLn&21VI}zG+o!2)#evm|eXG@k``-xKr=@0sTi%cR(nn8Wd_3(h2ZhKNC8D z_HORkS6}_-hab8(^pU9$?rV)t|4#^UG@XvdLjoEO2F6-h6iORwt##J;5T%!9y%E}6 z_nL9*KVSa&%O8JyQO}S15XbPw>V&wa&7Qsut`+Y5C>?@Y1cg|HI-r@8*g1i&pBxzF z2!QbQU%tM)yaIsB4|T%KAr{oM-_zM)>OBAeIOk+pBx#mpS(4@3?LNz;Qc7v<(f5r^ zXS1izo__P~H?Lm4>Yz_`YZZCNCr_TN)+x&S9pzzwX_I$`(bf zc4m9Jzn*@~?#@gqGvyJB@OGu}?{eGc-#_2o-7TmwMf*@jF);|aDfI4eulEeDf|`Yj zXZ||L#vFQ=_Qa59`?>8xHX(f-6KEn7MB_+YBqcz@=cBd3Ii)XdCD{YY;Fc#SMPpUc zRjdh2M+L4`0Hz8l5z+ko{A4m|Q~;Wz_Co!x4OcYMoT?=!2t5(2L{SI!7`b3zxaXlj zA!GT30fI7mtr$>^Bi6QM>!2d}&4Y+KNf~l>>zt?xk{9ev?yHhSc3@ z;IAk~uG_y%0(}uvnHlN!N2L}K{kZd!gY3GW?RMKPR&%GiY{#{x~X z5ouAvX(QFPQYxy$hFWQ9sXrWzAP22xWpcd+lo!(L{v)d+~0!Tiiv1(adA8z+n`ATfa48`$a96LX)(T3HLsNV{r+$?gs@bR z8QX=Uuva5H5#@>6M60W-g9n4d(P0hYklSec4Q|Bo9^&ow=tBxvdE2L))TsUQ$!Dtp zxt4en$)G$Duwo)V$)_;E)a}}`w6p0HReSf&-P5zvGElYllrLoOq~7D90w$Bm^xx^l z@<3%ss*U8Z;r1;0Yoy9jO+G3Bx0g|ufOrl#@eH`_XqE9 zh}h`3RRIm?=hDYtKmK(5sa$sffE-YXh^T$5{q*U#qtU3q&6Rw^w>3T*pI@AVjsttL z4R3J&(O*MM0A*XJfZPYGHoA)3QtNiRp&Uf2Mi<9RX~7M+QbGZkdG+DLy}w{rcj*2m zo%#oi^CV-XOsXtN&5ki9BIqUG0&zm3^NA@2l>USLqCKxNe6ZF1G04Us$`-vsc-wm3tOL` zNhkZsOamgK<@?Jw^m;Mt<>mWClv>@k=Sa1WFcv*8EG~}6M`#M)J$v@sn>U1A2Eu(_ z4#`{u2H}(_Pv*LWRSK&Q9#W!2Ymf2{dy-bMY>Ps%MH8aoA(A#7pWv#I0T|Y$rC{)2 z@Zs+dW=k=g1BKe7Qj7|K1LeU&Of7`_goO;T2>j1A31|qvj7=3*DzdC5u)itF0OZ}$X_5CP|p8?PJ9C|L*>9p+8gf24@sDTqB=`XvaFHlhIr9T0E^bgq^EI9=_@4%Q zGB(fvLfDtIREk{)uQ3aVt2bBxQXu*d00960V^c_H000FgNkl6pWeVx^^FiDFmqKI94AU?{4~xriW(812NL*+fmAtfVa5B z0RZ~Nb?w^q>HaT5sOrISdy8QHw4da1B@$qpP*xcCMTr5tNXDelad$#Y6zo)yC{oR)Ukyj#m3#pDJ&oFTckcXga$=>lm=*1@d(&`RudgKs z5P5il4dQ4|$V7)`W;dJ74qqOsQPnIvo5+U>qit1{odKop!%;=j8EV{UNU;637}^*j z^L~;P{pI;{B3fS`NF5jbQkz!VDCDj1RU(RNXX78+(C5VA%foy#-oJN0-E~`zba-H~ zR9r^lEIX>?hi?Al`$^eWY=Sf+t9u>+0rE=h1XjJ`Q~=?kKOT?XzyDKZnKd{{G^f+) zo7b-;$BDu8yB;hXa^$gv&%PA}tiuc8$?xin*) zoiGw8d@q9f3h-}nkA-SJtBTC`0D6W(mO?s z*=ZGPYgemO38};-9Z3+~qKzeqfl(GY&8#65b?x6P38{+3PC6*U8SHd$aFFaUf%~P>V1{-D)V3Q*?YJ~nEitT^;>{%k7L$dt9 ziwVrMvn*Yv2qU~gXK-DYP*5slBW(5rU}oYIqTz5jpU;g=P`I-FQSucX(C%!kcx9j! z;DJt~9~jb*%2Z26A}bk#14IgE)}}>9f%4T+xf%ioeM2JBU@$0Wyc-)E8WBi_;G@6l zVw81m7H@O&MtfCJQWb_oqRVKMk+Q!Ny+-b)F^Nci(CV^z6`#4lAh?7yibF9{)M02K zBI@<}l)d4-yLVGFG#XV^HHovcGbLY)6ywRecSI^`)~mQJV0m3KnM?+Qb*sEuInsG{ z<(0JrcdUr)Pq&JiXNW;)k({d(Chq3e&BPyWKYH{d_eTX!M<+)Ae)+;-&*|x@S?&7y z@#DWgepDwaBl>)q2^T{zhpFYsPFU3?^ZA_5fMsf}@FDAL9LmBF3i&I{_DLZw8ob!7 zMfh8{Z=HWSN1(dhZu9QcT7PY^STvb=1e9JbB?SGZF~7fhwOlS8hAt@B9{iXG;J&-N zo3>>p+6EpWr3N+e*nliiT#{eZt%Vl1^FoV zAObU}k(^S>Ip>`HMjCtNhN8iWTl-hB=|Mw;5MzP$g3q5nBjWq_@5PGqDcd&={l-Tk zY68&!4gmERvRlUE@s}@OK7RaY0Z8!9>FWP@Jf2Qxh!{d(&hj+?OE|q=uPjSM5Hq)L z-(D;hM09a+A-?6D#JGfwNQg)jLLfv6AreuOPZf?i=U%V7TrN{eF1qSYA{0{sy@Y9L zkd25)69&!!1+9q{IkvK2h=gtY#mjo-%=Y-&+M3H>i~b-!0l=$Quf!**Fb$97LR}{S zI6OQQxKk?i{**I!I%@#DSj>gmDW#Nhx7(deCcR!S=ah3Q%as+Dm?gpxVh90|VvLBG zbJh~c0-tP=Qh9oMno^l__VNDm%eG;vX~UdZ$f3BC;^?af_V@oKPat9_ilQiroU?f5 zC|}dR$$AEW8#iuDCKFQw$8}3aZqeTXipmaSI!nDPIw8goLLj0LLI^>h;#MxNUcEY* zOpIB!4h{~O^Ua$#4-XHUf`&wB$pxrF7I_gBvKS>LB0es8RhVaIOXYGMxPY#F=e@nX z)oOKicGkl1!-o%u7($G(!1eVm)U{t3yMF!pr%#_8<`pBP5$HERU+NAjUn~oj;99%v z+MxIK=(8?xSYrTyjg5Y<*E>G`q1GgevNddM^k%cUG_Bf$23=4elY7WG&fGv>5>G_d z7@Cn**X;ag;=>vvY;JB&r!%d;NTS*Xz1FpLTDHccEeKpJ*pipKckcqAxuLLD#38Eg z%$dzaiHGWCRRY(pT~pj;>x@Vt1fn2?v0N@ElmBX6ReM=&&F2dMsEi^KQ3%oKiFJz> zZb_5KIde)mrSj?1rz$&jqt^b^q*WuAtWv|yeoe2%;w;8k6rC807-I-gDxk99Q)dIu zufOgd9UZArqiv0$IkdgKeSCcEGG7V$a5$XLXJwf*F|{-qKqf)<;9xMgckkY_XU}9` zg%PboXtdeMoprAYtl{v=$;pXiLJ@4xwuP5{{8^#5inE5I{ngq zLI~LFZTKS6j>w2O8jXJZ__4FIv%bE5aByIbLe(L>e?BS@y}InK4@HWah(aJ{5FEX= zt*x!o)01ZCWY!FQQx${WG*dUO-BY2ceoZMcXZB$`W{I_1w{E?C`xXFx`|Te`NB^;S zgbUfq*;%kDOWIgVS1oq=6*o5eE$-L|#SHuVkIv7}Q%Z});_ts-d-q%FK|^ZDlb`QwsS*8f}HEh zR^`D54<5XJ{o0{l`)rOGxT2Oi4z+1imqoun0H`w7qA&oc2+K~{G)K16Y}c}&ps|U& z@!j?0iU&qsX>?)}t7%6Pj9&Nb*}c8JckkZGcKU4Pj0u{cDc9zkfd#-e*NcMrGXU#B zOg;%ajr$=48&d0Nfd_-l*=!~w98t}EsE4I`^wKmSZf#w;EDo)KQreN^VRLiy^z_t% zF}ECB>q9I6b~>HaYUNXF|3!IR$%Eq65MS?-GDyO%dGD*+9!GcfvGK;s{UxkH!6Khp z7a9;nF_lvCX_Jx`*4yZ8%$7^v1|$;z5c>T=Q54dbr6>SUMsTTINv6rv`T4n;2#BDm zuFFa^M)4wM7O9XZoV*$iwTw0;*f0AYr9(EVER;yJ?rQbWHGNqJrEqoeGqyHGEK!;*PYbOmjeFF4x>lQVjt#h1JlI;T3 zE09{Lbf#k0)hkone9`2sd)C|d57o@wqKj1w62%y!9IOm|S^a)LgfN{>jV@j%&G|4K zZWCcymQ@nqTHB%l>e*n}! z@OU}CR6x5ds(v|wi&;CkSrr1HPvm$!o=&Ikd~1hCu(u9YYQAlVH91rg5m77(NkG`y z*%7I*I!LL!xLE1iIvqMSbK*@(i8`Im+FG|Lit%_HLPW$~uSg`0R z5qna8J$qjeBH7unB9U?slFZKROxv#e@LbiNVXr@+W+u~Zm#f};^=!Al|1`#klot^! zV@e(TXGKhiwo;0u)TPvQT_@Txf(DG@OmQw#*=iRmjr?e3RP&3KOWMX;SCN(*7lQ~k zF@uQc@QQ`L1s{bSM4#KFK?*H1CqnFDqt=GDi8~~W<<_?oZ|ceM+SKk;nvnxD{@dG1}jaDxMc{E|8tS)eW;*P zO3p=>U$k|yQ5naA)y>Od(}<*sLn?vypW90j{U*c}sJYqvK#1!X!7Cs1ptn-HK*;*o z@4x?tPOf0_wc=_A;G9dT7IlnqHk)=`mr{ZnYb(_C9#JL1XV3on^UwcT#qvI%1w}R* zjmG0~JM%xweZu;wOGDQ2yV|?;5&%JO-w4@m7Yd?%N7H6glQgZJ=i8MtvW;;dBCX1_ z`L1Aq8BNaB-3SqBcVKE_dhcV5_93<`n7xS1=W{G+j3I>Ry>I4;xYq?h#hje{hTm#= z_Lrr+b8b8yx7f1$XZ8V^jIm-@2~W;B?^iUE<-TZu*uqgtR?J|4i3QZ+g|A<{c!9_^ zI}^mrKmGJ?2v9{BYxPNbAz=4CErCU>fc*CMZOjV%(qb8Ah1_B8trAuDwQ|lYj(zoD8|8JF}Kod7^3%YH#ax8wzfWe_#l02 zT4{jD*tIoqD#8%CwY9bRd`=CNsUYrkh%H@owKu3BM7T*rzXA)%UFbJGtm?7x1nzX+T2t=Fs;&{u(LN>Ti|^-I5;>yK5n0; zx;7b~A$D!_@j!Su2>RC6_Vx8Opj?{$M1xzkiMYuDvH5!MLx_H7=Wgp9X-1@+Gc)6r zcp_$KfoqX^clYjeIyDRM_unV>!x&?X0aA)ctN@=pc`_P}&d$ynsOj-z_5b?Gn>TNc zj*cEZdi3SX7g~~1Jq}pBP}3?X1cVtvxV*enoMfwG+xxXQjz*)at1CRY9R^s9nHP(W zm$nqytJwn()|~4NDBL^8A@~qtjDvtfFL-gzSrLOaHa4uY&>|9M4>j$2`OM7z{QO+c z)xfR-gLz9bsxkvWEJW_zyLVueJ9l=MlaI`Ne0+@4G#G+46Slgn zyCsNz&Z2#j*GPFHLjMnRwf9<}KY#v=TX2Q~Pv6rbwW;4-@r|YCM2h-1{XU0szK3(? zz4!2fs2;G9?d|R9bc)eiOfhZ|+S}W^zP={H;ha?*(1@eb4GLCHzVwxZw4O{Rm}i^s z_|^9I_G~ue=F&}I07BgWSXSS?%tx-2BIxQN+bm2X;(ZX2oRcnOpZ?68QdJ*TWVdeJ zn$PE|M+y2+uNY%A9z{v*?F}z3F7&Y+V~BCkjD($Y{?47DttvBjU1#$*YSPNcmzP%} z^z!A))6>(Oi_ITsp{ZA^@WF!zmzP%-S%Va+9%>)(KkIvmh?Wm@toZ4yR+YEGHy%c< zp5bsfo6TYzSaYNUCg&U)evu{GGYV0SThR>10Q8OQeTZ>j?ioH;h|g$NzJC1*aaA3R z7)_Lu3Nyd6vuiDkf_L0L-io`3!I1V$?+-0uDu7CYxIE-qRdYZ+dkohyvl z`mJ25#gXIH_8Ja{%s%IgvtL&JaG^~&;iX;IAp{1^A$Uv#StTM}*Fk7#1W4<^0KKvc zVi;p&_WS$$S65enHJv_{f_kE+p8Di&9^N}Q!DfrUP%pQ4!x5SoW6s$*Nh#|I5u*WX zGFj(eCsRrduK8Tv`;=1SHj5@KH9@cARE1;fK{syPI6wa{5ka}BQC!rK#;H&;>E#@+ zuW!IY4?;?Su7T!%^jY@jefPBeIALj7aoD%~mtPvcyP?=UTRB z;L+p9k1hKBckDt4)EseO=7WRBaE+Yfm3|M8PN~zQtT=N}AXTAR=kq^q-n^;4jjb{E z*L0gyx3vveEe$s}HvzbV!64_NVFK>6o<4FA7%>i*8Tk=HbdGY)KmPbH1S03G8zzCPxaO>Lx?yE1k+mma=A4U&q?A)iQtjAMO4-<0mwL+4^iN4CX*5dCsp~qwxAzz4 z+}hgO_4T#%eG}PvF-t@A>z9{T>PFeA9*!}3&r1E3{cTkYdyo{<=~N{@J%9fE^z_W6 zi$1WQJn%}JOh23b@lA#X`;~|chkKLB#QuxW!%jzS9UUE&BGz4&QeM4!H6H(Bx~t`U z1=Y~>Zq^VmtAz|eE7c*#eV)%33N>cbXIt#P2!8nCpN7i@);Z^mjg8rCh6r-)`dZ_N zL}W0ClgR|nN-1^SBBgGzSYR8rN$^T4r4%Hcy-tMg-@pIy@`s@>R z%5>H9)2C10zI_YbslV-yqG$-Ld#__|7}(@IoU)$Vl!4;Cd-pzl`lK}hR4Il8dH}mF zN=vpY=xP{4ME?T-0RR8!n@B?d01E0!L_t(!TU&G6#ueTRNZfdnNJ`X|mh8w6l1`n;Odk3_`{F#N)9Fk*ZDyL-No-4s>pGGskrW96Ab|yTw+{z<0L6OnaAX1k z&gDDb`OaBB96q45RAvmPE@T|v_kkAyKvm%a02God&!rJ6iY@_2f?2~W>ZfH{Aeq5! zAm--txvDHZVjKVjF~%z?Q7|0F*wVT}uRv9Y>55V~V0SW;XZhLlihJ7OZ zT}Xur;!&-27%tE*_*8@tA%t0rBc?mW*sro%j-dbu3|~VfrZT-yl@CR`3$N)oHZ0~K zXQ|Beq=jt6e`4w7;W;P zz`aJpkD>@;(FBdwl|w|Jp%J6~VPlJZmHDg)Ay%Ge75ptZ6Fd{(qh-~gu#jRcr^p7V zv``@sdChxLLiD3Yk6*la0b~HHTqWGNF$-7(X$Gpy6mJLsRlqUloH3DQ7N@Hu)r!R9UN1riu{OS`z|H--2k;T3MErBnez>SsJ7|AoW^n#;EJMaU55e zPmylW=!4pdK0t^-)4)5!lMzBVuQA44*8wiUxmB-O4bOS}@$qar@m#0bYOUf>YpwDu z%`%x~j#|B&CCfxigHSP&Nen|>4SB{GN?zKWW;s7UH<8W>p=qw zXl(_m8+ZYnfY$^pg8%Y7mr^<$4#(p$*5Ublu9W0j7Y!#882FRMlqh7v5JqCsK@wE^ zEVB}#P**TiK|=$g%FTnq+Q#Bl>RtTut3UlQje`4o8{6B1N4+}F;veVfzw^%b*TI6> zR(tIq?0H_V=AhqgdcI>XQ<3Eg=M72~oeCEG zif~(S-~IhztJMOAh9H3?$0TmC8-O-N3t;mFPK)C>P1DI_jOY(vQ%ch(Pd;B?Uk`$S zm`y*NCxBQ8;x)vhl+sKsifW$cGS4&2O?*%j0@}Q1G0CgW84(S!TLEV~_4?kRcYJTV zO|v+P-$crG+|g)Mud^o`etkLKbN&yElonl zY4mBzn`;-7+5bk9Boz?CK(ZnB4TzUKt>O!c(wxCe+`-X==%-JgK7alktZ!Ldh|Ca* zGO>~AR_%jc=|_svWE_~8{<+xTKtESc&+3BGD6JLe95{(G(IOJXnTuE$Be?s|T+M}oKGi6Yk9>#6NGTdv*jG+o!71q&dBxSpns>II03VUF*m z%U#E!nTPA7l&7bsCNmUc%%FV1cFgCJ`vcv;OSIO!-Cj?URhFd)ZHA)e712spp0yps}h}N_V?mrBs@x=(D?CL}!q%zIyiR z)vKcCJvjIX?Td^XY^Tjm5-y1vX-I3WVLuMM0>r;^rm!eg^pUNB6*&}b~NV;kM~J%> z3A`;a0ipFJW$%M2S^O0ckswieoz~}{?hBo*Qr+nfew`(MNKeId>Jed+ETm3A8gHi8 z4S#(zonJ;l5X6@2&X>vY&bpxWD2@*FViDfHyPnl*wo=-%YSZa74CC>5l8W?J)eqLZ z7o%|4V6#L;NwTxiOGQ?z*-4swU_os>fxGVn->b+DQ$o>s`0w7{9vonych{=5Cim_Q z;Z$>yB(GAae za(s9>8Sz@jwr$UEMDKt3ZqeA)X-w+l?!j3k{_?N?9JbmrNmkivxPK7mVtjMkY&NH{ zpp>4UpMRW(zFqry8a0~D!xlNc7(aY?Je^LvZEvI9m@cAesvmE-xwZnK(o{&T_xfwI z#bT8T)3}sm*tFSYdxUsWt$7IU_#60+5Gkpwf}1{B&1Q2#exD`0Ubpe4MpV(b{-=w{ ztw!!_%7c_rVMl`{1sGJ74kInYl*FMfrL^7fK7Vv{F}axsVlWtlQS`$PKggQTb-vZ@ zkZ#{j7JidlF4!U?pA6dl{?>vyAH}0(bAxfEHH~lnyW4JV^W<-%kT_(ul#854aZCtN zO2@a8&5a(ZxmQ<_Fl+by!VvJ30=lg?hxJ+_c!hMybVX-w<)&|7OFw$B-d-m-0 z>(^Kzgh(;)!ET=Cefi~=uU`FviDlb19@?e7-sW8yvby0!p!-LAp}+)dTSn?*D5@AL zMG!8bh~V>K1tx?z_1ekdZqs22cPO=7&wKOc&B@8ha=C1`8y?9iwGxpJPXF21>A$h} zcE#k%+X+^wfBm+(3f9v3x0ydm2xmOYv%%&dNs~NJ^Gx@8y(o^>I%{WVXRcdcTkCdI z@Y|A6%EB;QF5`yp3n45`%e7i|#v9$bt>R_YT2nH& z)0MxNEDs;uZa+NO=xUc8t+i_HZV&`Yt27b5?<=i1&dOO`5Yz0BE%Ed?hcFG(= zNEAh`>oLxfG>zlfbL?=LplJZ0(O3v9nCM{8&pvx{bv44PD5XNAgpkwIGg6ti92^|X zX0s2ikAD3>00030|2tM-qyPX77D+@wRBT*HZyZT>jwScXtg5V?J4LZ6si{#*Xf-hI zv4wUI8tB8IVT@1iIr!$k<-5-Y4D?}O1Ga(jVGLW-q*_gp5?QQbZCRCjxRo3=i#QWa+-uD9b``aSSVT=)yN|uqajs8c(xOH~$kq&^%#MwsTAqLx#U^GRI z10g&)IdSKcm!Cc9paRM?Hg}UWg%D9ngTQa#(DJ<>rwd=U4a3;(b-T;=3ZO7eZZS+U zM6^!Aa2STBY3jO8iyT6vD(Y-Dqm+7{w^%HaBtaM@Nn+Ma*L9C~Iukdd1q;InLcj{9 ztI}Q#{&?prvdjQjxB;uK*h+pOLUDClaI+5vgUMu4axfxRv-`yON81I6Pyhf}>vJH4 z2;mCsa4Jd?*%$!etFQiAL?;10lyWK}=b+6?^Dn>r3(>UWGzO*o`IING7eBv!usf)? zdyQ-w7~3%+5|$Wal7ua*9-`(S1L@yhzw=!0Pp|)U@%{r_UL_YlYr*0%&LeZzBZ<41 zwcG71&yysHBjS1fWHRxC;QHp~?c2A0;4{E5#+GGai~)oTbV3m6!58sB{V z6_iy>{8XutBn6<%qgZi%c2;j_60XhXbBJIR#h&NkH2mWE1KkUp*75jmv{%;xTmt}D zs_exCA)HhC;lq1E5)#J+V~s{#Q#H@?cuO}9-5tArapx$iT2RV;(@KMx7c3}vwOjkw z>oAB(sa4t3y#gS?29`Iay8vyzXG-Ax^Mc_2-2f0mfOVZ8SF^UAP`U6M2_bNEzS5dh zfDoRZK3yyv0D$Lt6*_R8P6*&Flc>$W#*r-|zK$&8AH$4U+T$O2(<2B1L71pTq!VAn{`=X&79OM()au2~lKu zZ-0N#@5hA9rqhBI2tp%q51Z^^9VJR*;rfPd^djYeh7 zy{^mo3(IY^{-_r(Uf6bPHk(y`4}1BGCxh)Ra(5McxY&UK(yhA`|9tgk3T?&eXqv_t zi{seP^)yWhA#dOQl%^@h#g)gHW-c5@Gn?~e&_=Oen6B%lllMa>@B?2}RY{h4&!pGu zQc4lVhOQ46?(cTZB|v{1t{!c-+&GJ(Fp9}EgF%=Kn(DRzKdchQiY(7X3+2yq_Uihr znDt(ARK4ldt5L_wEv|Iq|hJ2LOIX8T34_#Nl;-;^ubU zRZ)_BvMiTF#hd8Hy)_<>=ks~xI~JOv?DpG1lAXOD|HFRrd-;)7H(sB;UU>A;e{gVc(Cu_2tGlb`ALj1h=rPv|g<)t} zmV~h)%Xv;|QS^E}PU|1j*fO=g1@B_)_;HqHoC3;Zb>fk(3T}g(Qc4TnTLv#*z8sB4 z6=!_3enoReEc||AUY*DPW=7M;F6~qVix3^wbs)XlJx=JX7fUB$kVEl*y zzH*O_j#ewTT=MYg)2GuZ$6ir0Z7g5$(7FXwx}=OP8+|oG2x3)L*}Z``@pee;qsz-H zUK@Y&%{TAfT~@c8kiYR-On^&e$HA+sEAjYFw`sN;qdUj*ef{`(7!!msArXW~QH`AD z?#lIipCn1mFf_gP`~STrg#7#Ks|?B-O#LYLgCL3`*L4YrqbRD?Y6u}kmi5u=zq0** zIiGC}whG3UOGlC zTEcbR>e}Dh+L}%$mAx)jJpAZ~Z*(B#J@=bV5JH4a(-OeKS8@4f005wA8XuVA#lh|E zEf4n_NZr8ex`|dgPxSx9jfEmhpB^86(r>K%)$!wJl+yF_Gl-4U@&;vM$l4{6vb%~hSAB%$;rt{y z)6>)Wd?pMFAt+PNs_Cod2O{W$`xE-*ZTw~Byk8k`)<)v57o9df6jvr>aA#+?D4Wi3 z-LctBri@yCcL0NjGI?rP36CH*TnI1h_`oHDY7KFiNWd;U5v&7z4U)l%n5)BPyqf1V6zk zPyPYoTY^%(Qf>kO0PD9JPqsT+GVi*}2d58Ny{GF&qtWEfySce}aP*+jXdr|fXJI#O z*K@nwZV)C>6dfKOcDr3l>Dk%Y_00{&xZmsbdOh2=Aw+&ema=)=Y5h`h4-BOH{?f4b z4InRPE>!+=oH}9rY`bw%M>hl~NeTflYqcy(cI$W&(R~H#0RD$V9_To0_I%%~Fjt$j zN5l>O#JAsmdwF@eS@r;M277yZyVbIJ_E;9VNCf@z{&h)ddR8devQ;wK-LZhy&-1u-hTSQS5MjILY%nyPf2trEPf6wwbCK!S1tgvLH>-ctfTMZqR=&`}J&p-bh0Pw>P zKa^{01Dp^-$8m=1{I*WgZAes3rAB5|H zB;mG-FF{ezcDo$}0Y>Oo54#RlcZy(`*GNsZ`n%KVOqLal@Y(s9Wm%f8XIZ8j2FGnp z)3*i#!>DnEq~kc6stmzUfz#__QL;Axc-mb}hMhT^pNF0H@3Et(-UfX&+9#<&` z?k%*|vWsDewZv^cpH(X@A%Wo!VqMn}l1kIx3sU7O-f-WHaUljRubg+-VdW5Cv4I2z z1VI1*lO=4~^-kM}SyNd~AT83){$w)ibUKdX*sYe`Yytoz313`XaO`O|n_(EHY3jP} z-Q8WDr;LHPkct9WmZc{y)l4;XcWz$qdc&dsJ56~{ihRPBl4KtI6psME|;pRJvw=mW@)R{(o~fzYTB)qEX#RL zSy8k*ojlL8j4~|sK^U0rtZAzXQ{Cla9<3zv^KHnyVB%*o z`D-U#C0Ux$qM$j=A%IEFC}X+=ll-2dt$J0Xkf=I&1G2jBIWkwEcr!XzEw;D}6052v z9y&ceMF{!64@!DYq%nN;^S`d^368L2@kC|Fv#EQ1XkJ4oGXC`8{_ncpIFjTd4N0-k z8q913e$Z~Wxr*I!7MiN<@9*U~m1P-0h$U&USRjPDoleVcy}P&=Y;6I5e3S>Zj6|** z7w`t?A=X`^cO%=FLDPh;@UH{q9C(j>}#CM&W$nNBgrG6cH?S>{Dsq6tJBXX;(jjSRiE)v4 zprYPSfBLhRFTd{fdU>AfWiY8UgpaDF%F@MHOTCp*RW%xKbuE#!)|z0nzqfk^`ghRG zBbe_!c&B_sUB;N_c_m}=D=W~rk(FATubTSm*|TTo=jVG{8$r;bS@L@GN$d`W<@Hqw z$CF7rXqRQd7%PhW?%f?iNF2wb%geK~Gtcv`!w?~8+qC5ebd(#Z3@^Nc4F=S*OPxD*h; z%4@gn<8j9Es#yDKS-&TXmQ;lh)uuUYP&P_!DOZ^z)s07w9!;myS}VXB?9rG~+AJJ% zKVXOv_4MgS`}_On=jYvSx60kE-mvx?H?LUfsHM_2U;g6aq8$XA-S$q`&Fqc>ATD{w zabjf+hr`)?7SH2uua~81yWNiC`1tsHgwWR3mQpGV!#vNs-L7rhlsdUU+thu-Nhzev z(=1K@nmIYJpKjsrMia}T7nfnTzxk+VeZ12NaPfr?SgQjpe1yfdg0Dx{7~v!@Ez2qy zgGz3tlyAY9HAh1LgVk;=i6(Js#r4L8UDxAW)E$-xgb=bU%jeIZUtL{u&Knb_ znt(=#ujF0B##)0BN(<%Geo`T0);||JHw5+#P?b_b-R`j9mq~@ zV#jgPG@VaxN+uS`!gIaRe1-p$80=< zBo;aaKE^Z*!=TlgOeRnJm`m_%lf1Z6m$>ydQ~$E5{_9HGP|T9-<31ulwYB(c+wHjc z?VNL|JPY1wk&G#!HCTm;-o|+hp|rLWZrVcd^`064$XE#>eD&(p^XI?W-QB4mHKpnm z(ChW;9C>peyOiJvp)d@!QTwcF)F#s^=&I&=-2@qc6)*x^YJGBl%X6*QVY=D&H?r&F zM7yqg`sUPeeM;$@(>Jzl1E4(DYZAVTq7XvldCnN4lmY;EA}tQJ?<#I*to}Bv)m_r`|WopC$DNYRhUw{LYSMb z1~r$139*dK>50H=Njx?Ns&N z(=^@M-ts-)ab3rCx{_{3RtPH*BhKnw3ha z@%YBFaGGY_c0g?>2!j8gh(#&0y!iQD`tg818^T4*KiVL_7}_r`^Xr^H>R5n-4?K(s z_$JIh+O&^jWw;*KteRTj!1qZHYopU70;snO$T&NphR#$Yg6u|7H-pz9IoSwAt#uSd zCOep#`RM3Db)H4_>oqR8e02?gRQjXG|1eqb`8@7*yJt7E>15*jR$0n4ON*k&i~R1L zyQ9&l*Xt8XXHn#N-fT8&x7&{GBxy;d_f`prA z6+j5#)2C0zZHzW~|j`-vcg^twH4;rTq~ zoJ%2!vUF_QBBaSGZOQDurN&Oz)iR{+CojLDgCKT#J&;a$ROfcAa&&%G7$fY$`F86ylP{2nu#I}-ESFhT7#1F zw-=Wi-LB_)y>9oRllNUaoD_ZEBa~pvisLw%Mi2l(tSrltBpF?f9LFj0yz&oQt`i|E zSKyU9aA;?5Z?CEtVN+U^g^*&ABmqUpY5!p_|J+k&GxliEDGGTMxL;rMCjmK)@*nTI z|8bW6={$Rz@ai3fT!w8Ue5+!@O85+iLsQJ_I%x?2@bcx$hH%g@VL%P!G>|0#D?M7# z1QS9U=?#o(BMkso{~t6McfI+lY@TKyXto6vJZFr8rfs*;c9PljtFOP|-bPZge&7!# zqnXoUkXjbM4ksTR9%5{9#_~LGw*$+a|)#Mg>R|J}Wdu=&N^$0`NiCI+^Azia%+SR|(Tv z-3#nYueke`^^@m$(_UZbYnUBeuXbDqiV=v67wM;Pu-PB@`k=386Lx8hE}R&*Q;x zP?k&z5r!djZO-Dh<4ndkh1BzS4gjc*`PkmRlcg!=B2BX*FE3LO1YQTo0R=1*+X4C4 zC zlumF&(@~Blg<^~eA%x(IWPvg6bh>X(Pb=ecI*kY=4;~x=Xq}vnu;UAeg_NC6$EI|D zZ(k~vrK#WY5kj2v&A}#sAWd_NkY8@#|9n@T=lZCNXKDFnE~HdUF1f0dT5Gl2^Gj_t zlKqD`vXR5hrx}5yWK3$ z^E^w_tTF``i&$$AMNC&lQ6_e0UT^v&uo=OkuTmvoYE}csMO&j+`)O zPaJky!ol6Wmfxx{tkNVLKtJexYs$kNh(&8LI4P>z)y@Y*MLwvj$>`E;+3FZ z**|cd5RIrXMpW!u^)V+CR&YSAWkDF;RG_qFj5Z<6+Xj;fAvL=U{R82WOS7Rl>#%xZ z;{#B^ct3Dw(WKXEb+ftSIWB_CZBL>(u}CzF@+|B1H#lS6ZuhYlUuQr8pfzwD$8p^t z2q+;}S67r$!8ru5D9W9kLCf!yMS&0w!!VjgRjRw-f-xqAJdYVd%fK>hS(SByElUIK zy523_sC84(V5N+}YVR%OOJ3v_?oO#W;U(c(9E|Z^<@dC59?Y%9P8it4mh0Xci4N2Srho zW%+8lcoMM7EU_)emq{3BzTZL^cRHPTK37^H%@hDG%oO&OlAN=a-;z>V#Nv!YgsiG~ z2n3ultu(?|DaE-!*wR`94Vp834Fy}#ajouu(*f26r%cAJ39^(54J*%P^XfFw_1{@i z`0oG!0RR7|A~Uc600{g^L_t)HUCnRYxD|honvq7DFUMnNyGfiyym6AYX}YLWbc-T; zFp};eMS!|M54|mV?Vr_C5BUcI>>diVKog*7y9pNcB#p;kvFnUy^es^&d!R^Bnh8)I zlCeaJ;_rR(>5-IKw93SA0U)-ww~vpHx3+GDVUQ$=?+1-J8O4cggM?`gW2bhr) zQ;4&i62X4F>b_0eb4CJt@bdNB(P$NbY;N9I%l(5{#5wo69zd%Q&`aV*QHfjJlpjDQ#J;APm<=qd1QB96}DDD45l^2QILP%eWCbyA6X(Nw8i7+I-YIjye>0digaboySeq&1`u0O0=p`;^i+ zPLxKH>ZQWjTwQJ|O+!M65KwS&0q&#KY})-eiqkC5&(F{Atb4(`!}C_ZZMU;D?b7Hx zOcI7~bN3%U`Lq?ic$ZiNe*dX;nA#^H-Su@p3P4gYCPz#Nb~+sZxP19?97l?cDsD5d){Ngkx3)u(ZgTC~wfTImos^}#FP|*; zz7pm=xhXb)iM;j!01<*9>~?#EpscAe)hgbE8)_LVXhyhlTBLa%+QT^U`@>Zb;C4DU ztmN-!q1|y;hATab-|ZBu!|tJ<`hMWLy}wTUL4VL@*|%vgCHCpreA6l%+XBMA{_Z%5 z6S?4<6>K)22`*-{`NhSwoGl_EB4=!S%{huFAuyBTS7@yz1XPh8tG?*%04w4+P{i=bU?<_uvwLc^+F{ z_mao{G|B#Xo(nE$LDM9anbmog`+*haieH{wZmr=spaf`oJ~_awg!LRf4}0w8^0J1 zhQ9Bw_T4C_*GW2Pq2KZjsnhHA(ll|Lj_ue8NC*~;Nxd%wM^f(Z#yG=rCnn)I4yp3^ zD&RQR+FAPY0udfP`lS$JHoIsLN&caC(KjzH67$uomqO)`LmBeHG)=WwRdlPww1S25?7^e=P*Rg+c`;!fe?oG3lkXb@)hx~BG=>m?) zFbboC!^6?qD2`&gMLJ#=04b%{N#+2Y2{`aG1YnHkd8T&MmoEy05J2QYP)bK``}&~u z?UZSKt&!6InjBdlxKQCNZutHH0KHyM%^}PuEf%5Ocg^1xBDUM@e!mX@#>sC@^wm{V zYRb%f*OA+*vO&M{_WJte$z)=XS$`xF0GLyHaz4v#cjUHsnyxzRG$@?@%6=k>qHr9i z&Eq5&osRv}k#!MN`9Q=u1k(m5+|u;S@L9gwOj`f3Fln8{Bm;Hx5<83Gk8sG z>Wrr+^Rj+j3sp)f%TiPckbM|xVS*9 z0_b%wqI?b^1QFKOMl$u>prz^90ptArEJ!%4t&eVd?T>m6V_DvEqcA!>J)MV{Ws&*Z z=V%>=)UvFTxcKaQo&QGkB*Q?_3Yn>Y_j@`z#MF24=m;jXOsMT&;q@^85SYquO05r#KFp6QIjh_bkm8WNxd-r~H zdU~e2002a|di83vo>qBiq)I5J)}CnT`RKbhZ*GmpV_mgmL8T~7F*2rdRgc=@=|K{N zzUK~m?xjIDquh^@oKgU^2xgT2c5A?+;xE(ecejTu%>R|Kc~D%k@r)M#o@S>Bm0wpF z=SC`Eg`=TS!BonP7c+-rJfT7!00x7>ty{OAKmXhI_Wc(xp4V|-Yz3wS?Ck7(^Uc>y zdke~exF_^?SGXT^^XARpc)F&NOr^&&xQYTEUxg^Q;jcfOQ@cp;r?_9?|p9LI9 zmY3%T_1ieI;4~?|+8UfB#UIDMY{NJwrQg};rNL5_S~rnhY*nvjdOO0hS|1AXG>WLc ztW-S!0PgPYK7IPs=+aywf(C2o@JRK|$ec0AmyjDLX~Aq{OQ>E{-^NL7vVwd8Ee%45 ze!m|CzGYdSV>`CpvIrqaDWwJDoELJbK4YA5E}J7F67Axc%>JSB@ZrN}&z>1bRZ_AH z$L4TMnKl&t5(3n3l|8iT=mR43`+d1NEYyh)MpIqX>w?^UF-^0EdI7b>9_tAMo6TyBs0OU{L*rJ%80aE5-m3$OW^*mF%Um68FJWmhZz0zH zEZ42*nwy(u#+8Nx0pRn`e|B_qRELA??CjjUd2>A8Q-rNV(j2o6V5np!R0bRo@y(mp z3xv^m-Uv```)nqmifX=7L#Gb%B14;m5ep5?YRjQ)46R-o-pc<~q?)N&Cj$#DDX2O& zD-d-^5`l91UW%ADp6aPch(6D(QdxSOat5bWsxsFVidb8226|r#Ll28O*fljHm7dOA zlNV*yX#=dfJ%dF7GA}l|09Yz^4MAB>y#E0J0RR77?@HPL00s+5L_t)HT~SXPNes3( z0Yym#frJY2Qp8iaCwgihuHxva_XBeOl|O*Q58yZO(yK%cibTT;S>J=lpY7RA+Yv%Z zc6MjR_Sm0i$Kx1YQ6_kviTEr^FKY%s#lMp+B7zV=Q`qFx&5987Kn;i68mXaIEisA5 zl?RW{$98mdv{)=)LX1_IE5&ADJ7(SiC9t33Yc;h8YyVvh=4xJhu~fQ$7)fj*F$kcgsBL ze}B1L{)*gn#+bgMepiQd!CU^h`xWf0Kxcm$#7-zV-n=<}e0sT2Wj1V~ZFZ*OneHcJ_ye==IVU007I8i^<)k{BJB&u7oi zD;s!CdP>tJ+P~C#-;^r7sx4S|21JWjEkWCqthBJN&;c^(Roir4Olw#{N?A7%m|Xcd zntW&N+2mc@gn*oWPS~WxNE5ot($+JjLLEm+o2Z{%-yR>E%oL@U&el8s&}kqFP7i99 zvi@8&j3FP7lVWa~W{5mYoyw}Cydl^6A>kfdhNP(9BEma7JcKKgc|e&5M9J~2#8yOT zJRa-jGb3UoXyRG7xh|Drd3kveq57>qhGa4lt#MEHaThuDUEjoWS+tt%{Tr~I{KvLg z2#v-_G_nkaWDvlXcbG`nQ^$!JNg~Tn*&TCa7{10;@v1rzY3^PlW%M)RvP3PKT^!sy z35aM|eUA_*g2q60HQf$9<9O`9hnUraP20P{Y-~0z(XVaJJ_04i+z_>mCrWP7J@iVu zAijKG4Y2#x4=4l4$>Z3|eVI5S0&-B~0l;KbLB<=vYa${|N7E!KIS(Z;xYxe9t*;1O z0Z>R~bioYNVh^~RYt3V%7}PSl04pchJ{TYY;s_o0rlHbCL_{Ay{(+j63tD++ag1^L zYTtHtcD0)t%f(s9`yS04Fr1G6;^NQi>ubA8@oLp|{e3vx zQq034DI=FWUmV!O5yjfc$7*0(TW&0u!nyID5HC#l^j^1j)-&^TI{o(Tv1<&%ks66H zL6ZpFh>Ezq2pGVm+YK#cJ?UMi^f|;bhH;pHmw)`+S ztRGPbG2YYDzFSX3gxHvjb*tJGijSs0z}nrHwXTXG;sz2&0a()*i`VTgSp+S7I61ozf5 zUJ?-&ArOiq($41xU%&nv2fq58XzhrkNafA^t_itV z{BwDEiERTvX8;io21ra>svjJ@UM}yT&Vulk%!5?abje_-n{e3YMO*Ftn@*>?@~l_w zc%t=sy|z>ITZ~-Sx3#8-#AFtg3#xPpGDH!}RSZxE(5w`S3mLkBSt}xglFRD{4Di+_ zlL9N7pO@aKCA}TcRr{J$R&3b?#Gc#G3U%K4SfU4vR zAY9~u`z@>0vmWiuw&bS!s5$Ii6w4zYx?c1E7LD6hl=@`4p3R0^i)mq5sZT`X@%Z84 zK1-huJK{prh~@!aXQlucR)nvQ`ZW(Sa!K6);`$!|0RR7Jx*CB100o0dL_t)2UAt~$ zHxQknC1VpwTN*H2YydCZ=?AjCZCD02y+6VK7kxywb!DY;45y_*?_fhe| zgK_MVH(324I~KVN<f4XFPJ8jHwj?nUbUEa5${j>y*-uAAiBmL8nsp<^P>LqfzAv zss>HvOWYCqK80+19*xg!jpS0H993epZ}xVEkcDr}ud`95|AAjH&=Ndhi^s*5PBo~b zDymaT##DEsU-!)|Op_`G5xYa3B z3yWLTELFnLesE`pG-x{IafVTLLeO;Yt>qei5wQg%ek0jWSWK3I9vvmD#iX9fs)&*n zX@HA8P1zXSS&W97kxT&<;L$P{e*^)9Bese3vr0BYR0D;C!mf?(?9q>S3a{N%_2S~9 z*$;3eKYw0n%{UP(Fi#4=5dlz%r5LnS>PYDweuoAxyuqR{TdAGG+!ULe^M2%pR^^iJ z^~aDf2D+{ya&vR@__*s`j|hs>?1RFbQ9r!Ayd-KRK>YgpYHuKMmznDj^sYv!X3klz zuC8)DZ7~EA#Nul(dPSd?^ILLo`@DA)+F=I`00Fqc&2>)_@>m>4P{rnwRb{*VlYR|1 zHJG9fxjn<;c00}I^GMA4zx@pg)%ma#Od?o8T_E%iGL-W0@Ibe>sTU~>(4=t*!)AO9 zEuT3<2Kl(Xy$$SY+(zLR&{&3K0QAP}V`Q3N_4M@g`S}?vVE?MYC{YRY978uno+@#n z<#M&(?^Q+X8R`5aM1>&NW3O1flm|&X@*Im-6SJH-^R5wMJJGDE0#?>+q#>cwvJuQ@ zo$HH!;uax>{Jgmju5*Rb=Fxt?XJ3M(RYpAC5TNxs>`r(`QjR*ep<^bQA^7&~_ot^P z?uK^ftG+^B94J9_P>zykzf~eQXyC0BULLkiCLY$f&d{Zla;%hiC%beA zxfHA^_wHm@CT4#YGV!6aFiMBjzj^)HZ1(BXFF$|2cd+)X8qojx^}M_nW*xUS0PRqXL_ER^=9xVvjj&zSKb$?h zH@xkzT089hl)W}pg}z2pDTQ4rBQqfOuR}#my20s0&TESs!;-Tk5xu;;?D2}UWpHbM zyWQU>Cnw*(|6zB9Ka&Iae3CO#dxPJR)6OLZ>x0JO88ZH`KpGA3fdEb63fr5~F)(rn^s{{+KI& zyt*Jz2?7KvsS^T%HUxP8#*MSHGmJwwRzQFxNI()v0DuaRBvAZhppupCt!~#fI!BnK zQHlyGwq8^>5wZ1pjO#2SeY;s?5@$xVUHUBBshhR+9P~NIBoT zcdtVaERtkkcXwAIjE-NAnHX@2-P!5s_LE<(Z~yk8wNd zr;`(n00TypJ|6NU&rVMxmGp#C3OcgQ2{jt&(0kyTqq-G=F|)LjoZZsrX^U!_0CK=R z`i!+StDW5jmuJHyoe=N6cm4eQ+!H{L{=0h%&({uUbU=@$(GyOwOVVoa1jA0R1Z;@Q z&ELF#a&n5xr1%rvQtVyNmh7p?s~5&|7`Dv7y>vwBDdfQv{5{+5h&9DbVh;s&S|C8L zW3dfh$kB6LX6VosSuCR3;loOUj2y%h`1i?a=Tz8|rAKj;o@OY9w;hr2UIJuZpDjmG zQYtlsC`3Sq-4%d?5mM%*#2_@eZ57zr*>Uav`uXRVQideKUi74i z)07fJ)z*VVB`Q(KA>CQ);=dL8h4lKL0u~EFw&ywcOtinU;v~RV$6r3Ue?M6cSy*9D z);O`bqGfii{7H}k`pF7I3L2(RV;udczaG#kt9OG|_5jpchl=(4-3;T}a=BcsRx{8; zKhn}pA(KdU7K|L!uxP?UgG;hvq^I#QnINA#C)91U#d`MM-qp?KSGAC6e)Th#%jK)p z%9-ASHH@QMw_dN;QIi;#2*#MOqGjM3x)B|W(qJ!$O$ z<7xqb50=YMKlvo8TZ7GBz8X(+{$RPhG|9?1(fr|*^km9_ekH9`iY`tfZ{KeEGINis z@vm2}V!IO6_Mi27-8dc=%#gbK(Om`iZ(n|;T>kp+Uw`xbIbh8XQ3Cqfe0zHn?;lZ< z<7dxwa_7z+0`lRN3@;IE88C7uLTPQ1+3fi=GRWLsLk9QqpeLk2{~16&W>iqM=r<3b zXg^0H#K*RqEZ(8=9VY~j~+h!$G6{#!6d!7>A$|X18PlG@7sVRdVgj@@3r+m z&kq(r?J7Xa`>o26+v$FY;IWymhUv^S1X$yGZoM701i-gLb|wYkiI>3CY@^<0Q2@z{ ziFo_&q5uUb`dsUTs!k~Sx_8n(z1?yx;UzE28(mMmK+~vU%TgP!RW@1O_=N-wwpa1mfPwREaM-4avjy{36?=D;!0ZvX% zR0lmU139HqCa=u?ePULkhiI_FBNzMCVeBa*^#2EO%*?d5+u{KEYH&ace~~1}f}ND6 zi+6sJ(TV;fv=2L_l-|ooS4d!K$I7GM=40pAs%c9~NP^d|*EGod3$}mrVD!h#&frvO zAC!b4OQLp(wsYp#FraAS3HZGS(D`2EW>q^|!j00030 z|7Q?Upa1{}!bwCyRD4?7ZXCxEt?HTCJ4uTa9a@xO$U`P{E(dq$_+5enD&Ka1nq2#*c8xhzr`hW>Y8eHNP@> zo_zUq4-@^f`7QG6kREmHxy{s9QhSLHgdM4^I98MteW1gtHyj5Y$$T0{M{ z(d#LtjMhOA64{auh37c(pzc~9zBRC-x0oE^`N$qaSt)5EAfmi!&3mpuOYt9*MP6YlFyo63DXBW^QO-MRvl_UPUwuN z@~*1+px#X>f1{w>QtiF|dc2C|w-R55AS((G!Nkg4dEiINWhMv_LWKe1C!c(b2vgTi z!RqC<8dtAgy>aVSk`#9j4sYJPb^n78n$6ayAAkDozrP`C9T<;}j{1W^wOGM>|0mP# z@9#UgrBE0_<`Mvf@aqQ;o<4o55V-JHZZJ0kZ+Evs51&%!hPu|GBPV*kL6@5?y}l%6so0b~>H;eBNp{H#ax( zyqM4DNB#cjWO#DiU&S$<>6V;J_aO3ZWoW_pJP1BSRLSS)-&C0|Xeg97XPaKTetkF` z$xay{5`gtP+VwTp!-6>u*RbIHiWvB0>jppn)n`wiJp)nZ|(F5_JfBH_xASMtyY>Qqw%H#HO+3V z1@0#LvXm>jS%30}gHs7|-0bzrLK~KSM2=r)Bjb-|SRe~fxWcb+31ccr608T@S6}^^ zKN3`JPDA`xPO{bRc6z~2cu~^KPVGwjX?L04%EKAbNT5GLk z>%V_+z(915s}2kK!A2C7g++h>p~y0~YA&}}t!2L5e(g2z^jHvRB1;s6>{GES3D0T- ztM}#q8pBjGD~cizBa&4~h!z=4GMNLppg|5*eg%k=@mS`Sa{%kv^5JhDWx8lK8rqo2 zbUK=h$K%N=Ns7EUjZcl%h`3lTt=5Gu(kwH^C?C*AM@I(-_xeYDe@n2|@B$s7gS8yr zjCxt=f--5B#5G>_{YIk^ zMqv;H-A<>_MI6UPQ2;=iWm;>O3A8apWQ@i&@Sf#*Z|eXn4O;b<*#b=CGC2vIT0u&r zG9ZGD%}qW?B9TP^AY?MgW&75IV|MbTIz!dz3}FBBR{&mjS9@I|c=PgQU?=(UY8phA z==!zmN9(=JDGeez+$neV8|s{bfJnLeSH6?ljGTZ zy1CVCcUzrqcwxI8hN{&HyWI!?f2Y`6<#*N`{NJODD zuCsp4+!B4BaMxS{9`y>*0$^E%24q8fQ2h08e`gAk!N|OeRC5UeD1}j^wl><02zuRU zIQ;$>w|^E!YIl3<_KkO5zU-4yak>H<7AemnVwF5+S%Pb8I7_$ z@3h-Q6er2@^i&r`Q54ovmKVloYmGI=&Bmo~UZ5;$R;4tL`c9{_TCEfUizgD<&i(l9 zD_36p@Z9575UNs6O#T-D0RR6%2Wo2o01K%}L_t)HTuF~4$8~aI1jGBft)Lw03nRyP4B8ima0Kvc%}UcC6;5_MAKy@dNxoUi#d(EhBj z{?d(CKK}S4LZGoKfB?ivToh$x!Dvs5aZau_g-ufR}#f#ZT^jQbXUIHMI8+0NC8z z9FInX66d^cOt#HHn_EO%0N9SoH7w8ZIFM2!UoU4z$^ikU zi)=ETjnj-Udj87RbZ$P|$p(k%;Al3UOr=zasI>wBXRY_15`u^nu&JlD(@xs*sMl`& zT(w-daQ<*GI6;6cW836@U%z?tKYsbkmH<||-T8c88#QQz(Oa+*LIJKn_uRvW50)fU zGZO&#qwjp@-+u9nC6tpSE{YNs`rgDH04OD$j@Vd>{^ln?diiSq(s~dkoiGqcS;Uzx z#))*`3bP!k7i^0i=X_?=YX)hkbb{`un?$|m|X$HPU_NzR-Q#+Y}mIkg)4 zm6hH!O&98j73V&_k~ps1PJq_BSh6|I3|GC@pk7c5bentZ@;D8}frSZ*Bi`SLzxLX- zAKm%-OV_S!_Erjyl=68lfsil|)Y^lgz58hY>2pawpT}`9n$3+v62yfpN@-?u83^tj z^de^S?8(7cDm|EFVI0MAFqvk?>Cvpv#6EgFI~o;bsS%M7V3fk*L_!Vj(tJ;}q|u>z z^OJ~gTjdx0cwup|)9^Zo{oPx)?mc+0Gy-W$ z=-FqVReFBs_M10e=>PLS{^a8Jg>G-vgoJfOAUGP7%5qAHF-LH zYh9Vo)9Jh$2aG}-u+>hWq$He2f+PC1l?1F$XLD_=){ar?l)ZEz4g?g1(b_Qpg80s@ zTMr*RsPjdqEiEh}Yjwm00baRr<8Uw_jT~ePiUstw$K%^2Ex06rrk*azfVA6#Fsw7H z*hpByDVj8yOv2AJ`1L>d?r^Z* z?{#8M%hDm(r!IDg$D%NZP@zv7^KE|Cu2wCZO7RZ|0}2od0p3G1Q&Pps7Pz}c)})0# z0xSuDoW3E)kKcReoqPB1SEIOwfouK|IF1h0A)2x%D&4{M$kk&QvaQYddvCq?_wW7j zOV_V+(X-k(<5V{Fo(I~b!x=h{O8K(fo8;@8t3epV{cFzTX|6a$?_8-2Wz6Y3z|3lG zjSK|WS_{q?fsK{q`u5hpe|YydcR%igL_}RflksRc92bG$SD)${~W> zz>^4mbuGd^gc5?@*Pc!7jk<-tw_;qda9tZ}%IK1PI7=P~@aet#xDW|x>j<1$BG5#< z;kY$F`x~oktNf?$ee1nD-?)7K{NTwUSi`&{p2T3Ohhj4G9;1L$gvWcsjSH7uyls$h zm^h`tN>u4=HY2`tX5I~{aTqaDl&W$7J5fLZ#?$QAcRyS0CVRu_`F;O7 zg~O3NzZE5M@XXa0_V*8(Z}|H+Z$8=CxxBs2Db-TJndk$MhHW{9zOC=IrsJta08IhF zDNL8dP!IS0+qXZxckfiMWyv*}LrV?-01ybexf%ZEqknzvOIKG`SHWnZOlPel1QP+{ ztJ}eaSAwuJ8||&EbT}nxsXY?{3THCVmJw1G5(qKIXzQ5>G)c4%qyuBU@;q6;k}H?y zrS!o@FHGkJqtpZRx=DX^<h-#5gqG zbHSap9$8uBolZg-K_F#W=9-8=ILa+cxZnVGwbu!guC=D0!0zFg2@wiL0H#@KtuKpN zDV_JnXFwREh~7I#2xzTp^jTdyvOwQ0j_96XwZQ$xjT;Ap0W|jHCbu~@L8n3g{~+7K z_>1k&!fKs-Ev4k?%e|le`M3Y}{l5ejf_E^_0YP*U5U~J9LXq$P)=qz`jEUnAtWzE> z(hg>icL)8A73)0bR4L<~&*mj#)M7Bn38&5&DW&Ah%Y3Gdw0cIEkn_>i>o1RIGw*Z| z_bgjc>G0x4@4@H$Q514Uq;g6d0uY5vYgds9C8hVS-U90=bUm-CSkEpFzE!Q8TU&Wv z)GB{47&MEzT9_?{Vr+3x_B4)X%7e69ngkRG)D?c%=nRYRBLud#k~?qT_`CQ20s;Zy zHneEX!^b>#uc<)Wpi8 zqkTd=pfkpJ?~Fx))>_M%Q>7XY2W6glL@D#Z(d7Qlu$0n+$kNOquCMmeEcbYvH+2@@ z_`R>}?(Wv%1louKK%-*yMDZ6}>%2HdzxKSAqW?mO=DAF0P_JbfH0jNfFz{4|IEhbo z8*FtxzCk1e)_UR7+r5AIt9Ky|fNg_00wCZJtc3ZK2oHgJL8%ae3K0tC0i#e@rKgju z%uCeTNj*>VvQSkvs+<>S9q~TT3JQP#oHJuAXFv&Ilv?8$V`wc!aK`0x8F8Bk+&vf# zMc0j` z8`H$i12De8z4lSRXdN`KCjVJmTjQK7DJvi+EgKYQklFGJV|A^{ah z1Em5+L1zE}sM6t#2o8(^LRu&m1hX{fQN+WbzuJifn@%#VO)R+5V5CGu=b&&9MWI8Y zl>z|okPu$VZf(p?h%tPkV>y~qHCA>dxv8}s5Z{p<2q^pD71?hL5CIftjqhz zg3(t$$58FJm44O!?Go7^jYa@qoogep?9wtu&af(H?g3wY^Ua+nPwFAaf-Ptzm6W7i zqgr+N>KkulS*DcQzI3sh;LrZ)ufO)z>kxzh2CM?em#rylKt4?mpEW&|KjN1Ofl z^($+@H~<0TK{=2L5FiQw5R`^#>a7Rov@r}Y&kAX55`~3!oj58>na;~6hm+iB(M@u# znP5>T4nh&eNjC|)+&;S%Z$(be3jy%(v;8;}T5Ckq#)bh8IS)Cb0HI)csg9Y^}{3BusN=MP^n5L)<(FhgI|)$(#`(?00960 zp&=kf000W=Nkl1ul@#o zg8~15pZy0CpZ#R(L4W~ok|@!f;cz%JJ-t+S*Opss*ALlMUA@j2@I|2znHiN?ac<;| zyM{cQOxlCd_Nc5X0M7Y)w4hC(FL=07hecNtT}Go(T~$KR-fsR+fB$#yeEi3V43dZu zMFnGEEr{SF1fg+4ir|Bd2tF7goOK$U2n1_G(;)J)b#EEC!&B}pYF={VLM z>4&L4niNe{RArqe`g~S!WH84Vz4wuMyPp?DWv%aZlHY%Kcyv0KQj&moK}d=b1cVT) z5H%=7UZu})*oduOO7LrOJ-%$W)Z%%oNWT!&1hxLnPk~0|ICe7%@Uf2!SjWJ{Tbg!Z((KZ>+6D5K=A{<+5r*h&$r} z1Lb_Vbfq*YD3MtnLTHwgb=ikx?~{+oD&ZB60v6vtO0N zUlBVifg_|`OQc)rx&^R8b1kgY8uy#V!e4*!QxJasi!ZOO(wji9eOLhy%tUnUK1R!( zQRmZ7KSJ5S7;L2|CTR2Z;wq2H2HQAew5RB$N_vTlk&HB1I_PBQbtBVM#<*CP1Y}zJ zYANNwTFx2Ramin5v&Hc!&MLH_Hz0gJxrqOGB_ZlNzW+3@%gK>(z^a|nB_yurs1HIWZW}PUmhp@z1ehjbhgOy-qUBV zUOs>J{$~&W1O~?TJ!{Z15g8PkTHyb z_W(&_Nb5NGQ#*S~s$sB_QX1);2Ur`ajF3WAE_O20+1hQ=y&$v0XHVEwqX!Rv{p1Bm zKKb|ma&>udcwEd+jSOFW_M_=+p*s&g`uNXhhfkGQP8a2PyI)%uB5Nh{%>3#%PnDE0 zL{=9HKM}>qLJ$#Ry!7E*nxAV0<_0)#Vn4OCv$Jz@a)R|6u>Sp(HT}lZUi>h zJ(W_y`y^50QT7*q^$A?K7(`XU0Fu#Fs3UxYQZivDw(8|n`VvHC)tF4%##`@&6jfzG z9EnwyQsV*%i=;aIT{oNwiOKip+Vo|8!qv2&s3|S~@WcI1sTV|uA=I@EKD@g(`tE3!rs?U~xmI%h=R;&c!f07Gel6~=4IDRMxv7}kh1+_k z9BjHG?xA}ec6{})rMG|Zb{jJ5=DOF_0D&aBDZGQL5F%O)!&x|o5Fw?cKyIqCZ65_0 zK}1Xmv$9U5N*M^Qo2Idrnf;Q^{+sMf2x1|-8GZat;+xXVkCtbLozy5vCNWj*mSrvM zyq+Fvt$+OKU(OoS>!ckm%c8c{EgGIKYlTScV~oxRw1RV0vr0s}JL7BUZ#oigrPp?7 zX=glcfxWbZ@1ie0|GeFzZE&(p(JVx z^8?rlOz;dO=)CKj`I5IB>zX@EB#3NzGCessKC{KLEXtbE20c*wU_;P}NfMK4RX1*4 z+9>4y&X5^`sMkrG#`e3}c-Z~!#lhjTuQTO`y-x7{o9~aU51vfngiP{Yp3aLZOU%1_ z+qf8Vi+*%Ig3+eRZED;9FAFaLZnYDQVBni4kJlG))h$X_C;Mw3Lo4$SfKsB{Go$w& z!Ux2N5HH>Xk)f_oH7G1x@a4k2`WHQZZ&?K=wp^4PqqV_TMK|HbBQVl5VIY8%(Ul9P zlbA#cq7b9jvZ)&v*)me2%BmUkGGZ7h{`ps5WvPk57H7}TpZzD1$g+$~_u->Q-ClPx zIo;aY?&aB{s2NDK#1(17*7?=uF!uqC`}Zs zht5!yh=31J8oq=OP!dAG`pC?#UVQg&%4^F>rb{VAbiOQW+sp+-1bhfgf+W|CO%knz ztQ)7K@Gc};8lw)5&%F=bUT3hf+{jdkub&<5jt1w8QX9P}n-_~xDT1JJUk^vS zUw`u?N%ZmYNn@>&LJBG>i)GjoQJ2*bCtn21kjI52$QX`ch0!gtw-Ze>D zESJn2V|3QG>J>A`$Vv(&1Xj{V0KH!KR($COR&>YtduZkA*$_8ti{n-%H`d;|Cf{V+ zCm;XGAM8JX>cP&TBm$+{f(d027$PbLf)9}yOfCc|MF^Z29i2zyvaEDsybsJwpt7v$ z+Cfm7Xa&x+^tJ!}w+Fv{{4&I7w0d1gA7W8ifTR*t z?JzwJ&S~Rf@R<>>!bZ~h3`1$eitoY!Ed%L4S<-%~#*&7f3=gGnG*<#r1NGXT?Tr1(MKc5$A zWXykNULo$r4#_#?5=z0CJviw%gyua1#`iN{O!zUy?Tf8W^BH0U`({g@97V5SSQHE(GQP&{}7Gj44SWit(NK>8o;luT&X@ zh)kH0xAt^e8|%+!wN$c@F<@nz>5W_WbUBe)Tb4Ze|`As$3Hq?fRrdD z$}^3K%-~!&pSL!|HxKp@p>x4`*WWZRJKZj5UTD3;`oish`Nc1;!JS?0RR)r*%W^Tn*I&$N=6;=g?GQ>yO% z?~|u{d1|bmF1o#&%Fc5>3qPIUp zOw2xA48J45e?5M@i~fg{ez)m#y36fC0qfyMAHk+=+C9WB{YMWU;+hu!s`T|4LL$Zx z5|?*FBI9iI&EU=VF*GGQ1zc*Sgiu0?gaU=Y0f@?5J2e=x{W@mnjc;r?pSNXM000sb z(R9`{#$}n-S}o3A*k<<#>t}HU|ys^Hu9tBD%yRI2XV;5%_&5iNoKY#V?&4U}QalM?Y5JCuHt$+5- zQBh>ar?Uj?d=OGt7mK1$TE!50nFe6!H<%$NB8Eu(^62=7pudjqqlXW_TS{1l*(#%l~h*jOEsFG(0*!IeA^1)*z4&D3wZpt&a>mt};lel9;UXK2VIg zfC4#A|B%nVmPh~dAOHT#D=n2kCRSPrDYTNaMOPGAO5{Tnh_m^8 zUbn^tVooVZA==jVzgATaz{6o#vs^2=)GA$HvBTWkpB01ekNU2200{8q zmtU@b-ydW+yi6>lLfAUTbv=K$xq&;gfL7lFK%d&&-ml)dGra%K+maZyPBEpJjP)lc zQ;nEw2}Ci(MBEq`tQD>$=O6$2xlMFqz%fOo6$)_?lMoZp>$CZyH7G>qLZ0c#usl7R zAz}#e@Y~lQuo{#;rt!E!fe5ITdj8FES!KkW5?L3Bn3=r~&UtGcq5#CD1Tr$S3y}c< zk%%H+%N?$%m31r!2M6s^V0KkP@QCo?haY_W=n-akHF0K8O08=QZdsVEbFW*l{;^S7 zzx`(Q^xys!%q&DsC{iS2edl8E-q&q#{-m}f1PF1kKXE=RW_4Y6gIvElUsU7CXj~v5 z5&4h=u$JQNd@-v#BKAaOSqQ|g=_sYiur$X0_W9AYF?*9?>-=a`wZ=*zLQIF>9QhEl zT>B7>@coO9N6haAe|L!dEr~g%GIZXn${VbHq}x5JJj4(~kJ| zTkqX`>%Q;Kl@wj)@=~Xe=Cj7QKnyk}tu+96A8w8Z(^-SS#=4X9`gGciCj%lvz|Od) zb8Tm*v!<*vA|mD(layHG83N4aEnt7g+{+a)@S121I@-9W;c)QTr=J}j9wKbS9lK%3 zb@X>9uv}Ka7X5Xzz6Jez>R_udK;!Fw_}fo@`~2Ikb6wqKO3pebt1KH7rmK6awVzo6fjgYXRJL4h32ti!v9YR|y4*sq0MBnptg%T%XLE(Wo>R zlU&G$=zW+sT~TQ7qxTU3GOeexb~bMTpzrfdiMXF}emTC1%)FiiAVBcp@bGY56=j{q zWIT4>eSbCVHkHj5z}tR!y#iJ`2kXw@YA12o*7(lty|>424eQs8|zegqYJY0j1*!@DWy!yMcsAA zC1M8X9Ybe*o~h1w=L0jeokc{YR0wf6EKgp~jrDvXwaF`0`B;6F+$Ua>IK+81UbH_!FU}Qu5%&NH8-B zA;h9{CZ+LYkOYLt&IKRhbkTx@kYXaI6(_7hh>B@ZH}lTB5a%Y2^GKAeaZ<{*HBD>l z#wsnJe|uV0g;p}e#0=g?AL8q?`Dj!%tqn27nDR`&K3!bss;s?pf%@^U6@37gcnkfN z^r4p)+Z;{V$cnB)6he68jW_DL7ORW{Rt;*$*{&9(t>VtrWYBe)-c|Yd<3}HS@YntJ zqVZon`Au!y;LiPsXc8x5!H2FjCBm(}5ewFtDhk~?hk2e?S}LIm35eDwNX_Kt?HTRQ z=&KMK|cO8o5i$3ox= zeD8SspfeHmZ31B_IkGH&|JkR1^WXu%wN`hF^49E?EuQ^HD~T6i_8H(plNW#+Qk0AVvQ_}%Y*|Meff`NvP*?L1J5 zLgIJFQ;DdgFxH*Co>jSC)ZOb@o#oQ{;9QhS_Hr`i=$*#OMcrZQx}cmluU3{pXUWqtZ=XT?I0C@1=!53eAu}%QinOxOw+O}0%ONATgS1WRsaV}oE-q#4y7(#NJ?T` z&-Ehz{Vnw4$#~sY6Vd+x00960b_9e7000SlNklj`P-8l>ZVzHF0s!Xw#1z-S7eKXVjO{1q2lHtz_Gga6A3U;*JgwTYpGo zEk-f@?VD%0ClQT=FJd9IHcCn3(IE*TE^n5}AofTMu{I9TGsi6Yh-$f5W~=3Bv}c{) z-#@r_aCCKkI-O1r23UA?y;v(rA3eBtJxv(^i5wylF;i*WGAo%#N>OTSL*9+B?gb%b zMe73fPvS@ju-55ndrXDV`>A#X`fouW%Addc?)3DueMTix$W6)922nOLr**0Q*6!Hf zV#nd6b2MG%)79*+Uwx6LbL(+cxUwjL*&;;%E<~vl;JlNHv=&OBcV?Zl5>%{a;L^2G zS++uAB9u|@=+W^!v*~>D;P9iX>uDs|IrQF3rHpmfp+}6BEFFj7_Tl?iEgMBM)oV`( z;SoJj*+Rc*|A(Uw0Dt-Z`?IsNJ8L%RHzHc~gpeH#+|dM^8(`YV^44#=|2j=K20i=F zkN1^KWHNfVKUl5`az2hDZGCt>OG#lx%t)T2`mNzi&^t*AxY!7H>;Yk#?z zJwDoh^vA!S{qka%L~BQ=ZInd8yK!x7q?C8)9eQL}tWBO4WfsSPXz$%W{P>ecr>AGc ztjnBiwq9J9MMmhX)o~=RrmNEUY+bxQy9VaGH1ky{fXCy#`68t{Bol#9N(o>A0Y zB2Y>q(|EMAPIKq6pTv=r>#StLvRL;bOooS(%PS?^cz2+bL?k68BIQL{@%gLnG z0a7+dH7j0dNKufCTTg78E<#MK@HuH)`gb%35gSXTu@4^%dPx-0vlXR{l6cflEMg)> zX|Uh#d53vnloZ9f$X3O2m9KM+o)Fm@&8P!COXA2oUzVoSHjW~#?QjrJZqkeC(paAr znwTpaN~Hi8k;3XXti6g zE8F%Hx0z4dZL59DwyxgL+d?pa^OUXa#m)Q=Uq6-tvb0ojlxqut6iVr=KNyd)tU&LJ zLeCa!?YwiCB++QtpUqdLg=Ly+ZHm(5g*L`&A^01!_lCG_;BGe;apOz;HP5uA6uZYC?85`gOZHoxz*=eVn7b@YnNfXD534 z#mUX}!W-Z3B}qR~#M;0!~g&(lp($5w&}zb=aXy^*o?uYOZcpuim~L?x8x+(y`d5R(l07Yr6 z^U&l0CYDMC&QnuyZ7>3 z6XH%U{?E_nmLOL0<=gAyhvU=pX_jSCB$GHA^yASWS*AHNm)aWZf>_T>Yn-q1M~5&4 z%nZ(xM`8|?UocYRi`K}}pI*Lv|Jdyy)2S?_+?Hg&i9P_R-RPETikgNt66WCGAc|sR zOw-VC$r_8^x3O-Pa&73tKL+r@25?skh`}0s_4>TX{aUY*L@rk4uUE_AAO_~y+Os$R z{^`s(ynk;*%t{I-zPOs_g)WUNw6zYc^Uh;1W_gcsuqg`w5FVKsqyXC7@W?gadygXB z9@KYoO(9@sr~1P6?KjUSSCg$O0MNDTRrh|9C~l2hsN=7MLjrj6WkiVj>DkHSkL$CT8!6m-n$pG~QI&@@2r5L7D7-_&UkLmGs1oqPN7V-?h>}8)NE=$J z6qjOGapTsxTOM|2c6Qe;r;}x$_jc!dW_M?I^P1HFJ;P<39J`;P?asL3SR#1qe~lZ| zM8B3eO>jL0B)2gr3Nv^->h*{J_MZIRJ$(7}%8MtPMKQ>8Ol4$@nVNE`v^KC=T|Kq3 zvbwvwR}_XyQ0JM1$C?g5{xJ?*5ax~_Uu-n~ymRN+v787q z(>W1lt5Zc`io%RWWogV&VUFy$CMWrm3K<*&IM5J9gx~QE@;yq{4?G+IAm@a^dcEH7 z^(HeS!Da08rAltUmFjqG9ybrSB?^7DJY-zFACn#0g?aWJJ#=MQ>oY#s(-jOEoVF#S zRWG!j-`~HlU1(`SdTq^G1G{B{3BjasckmZc2HfAj4>l>BBNKz? zk_wpmn-?xfh0&&n#8cn7w~Dm4x0h+#74}%4K7BFCBb@NU7tqGYCwdQZbEj=cIVHrk6B(`{^Qmyy-O-72596v zo%J1c@QdgxfLg8A@ApNSJiy^6;8jOM7~nX8XlcnT`VF97t4CF|S}iEnWjv#*_mkC) zMf@kAv%c<`AEx?hS|GG$QMH=-nFuU_fZMlk6IT?GEQ$hlc5aYLaFShd33$}+liwWO z!5N(wPiz3a8nGr>bsDR_6c)Sq)|<1{Dp+gd9#(s4sa~r&X4LDgR%?HMKd40kEhLO$ zI0MYg%n0p%y>TPbUuTz?gQ7YJBiFHZPq>?@pWtfs>zkXKFtII#f^VC-}HXm{P~8^`BTgGaY;0^SEG&F~?S~U5 z8o%>N15V__UyFtGr zY(ngwHt1Vh?|kv)SGsp*!rrKhN3*O*#&!TqPam@hND5z%CtSCw- zWpas&2@m8-mDOI`AAR`Ar=JBRR^~3fXsMEyDNz*hC>$yv@_w>Zp-vB~?qoxj zV8$mk3ow4PKqNFul>~gIj0qbpR6N5tkMFdm#s}eKk%p&~F%|#E1XHOQ&ka-Z8C|gt zFzV(yf)@?YZZF9zm6@5y!1;zrEkASe<0v#gHxKpJvt=a2D1eh2a&-q_B*Popa~K3v z9P6c{f3*vu1RheclLTowf96DE?~Ev~O=Tu(Qppj3=N1=-oEvN}d$7GNB&+x+L_=Eu z6FwwhWQSHl%b*Z+NJhEY2){@KZDV#r-r5j>CyK_CmC{EEoafHHR+{qQU|O`tF+?hs;s~;c zzRT@439t!KNFkc4t+pHRPRKhR?$=UE{ZtR2Dly>?yISDdk3V(04^m`PxK+Qzts`=R z&pj2l27rM-I5-d*ZiZ4e{$buGGfLWZM7c$oq00ku&C z?W{41oOr2LOCPlO%+j%Pd~+1)n*up2K3+6OFKo&aMEUtn0st*!yM)yh7r_v`Y63vE z*zfi5y^Lx0Lg>Zw!(=QZ4W~ftQt2{Oel;eZjIzm2a3!_BZT0xBan)ulCOh)Q`Ak@h zXy2wO002$fwt4rGkYHU8zf*|$rG{50C%(=iB`+I_fP4wa7_P6cS%Vkn=js+73b-nh zE)yXilBO6NIiGYpJme4mfezSiw$2DJrhWa%98q>fNbD;8E(0%BqC+8Q`UG;3NXt8* zr`eF(uPxo!7BvZbZk`f4|7<+jLjWO01N`vf@L+%c*UQU570&nOpa1?Gv;(B&K%!T0 zHAx!5Jei8~XS%xf#SB%|R&5VKuV0;HoC94MB;IpC^y9_FP>1-Y8*FG?Wjx`YBqsFs1Wq?xY$^nB-Gps`$v-NAiHkW1M~e zEjeAy147mO$pfHEE-+?3FBS!*QrRkDp}5Qjr_Yx+l?qA^H;S{Lk#^7q)> zEu0{(m7zMng-%aTeeq|L_U!EJ{f7?>#D=*X0PHdYaVato0~kOXvTv0$=F`_bLle-- zUKQ;_zqv>Sb(=d&bp&O0llbE#5|#=r^M$g}|4dB;-v8{iKUA*^m`?l5=RmBCQKFmU z<6|lN)4O+3SzWt*Lm|J^b8ebpS_E+xJw6zbhIRE}CL(uGM^$}2oCO5W>FSBV z?sRv(UVTf2Wq%SNKb^ET6$66~n~bzf#z8xR+il>qABsZU{J#uYl*k954gCUKuFZx!i$o@)%_OFSv(-bJulU*Kul7ZMOqm7;yWh9gvX@ t^W}2ic)qMxF=qg9{PLx!em0xQ&97>Uf5(VYQdR%}002ovPDHLkV1mxsG1UM7 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/55.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/55.png new file mode 100644 index 0000000000000000000000000000000000000000..d3712e0cdb5813a44495a62528026796ae796554 GIT binary patch literal 18351 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 KMNUMnLSTZ(LCm)R literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/56.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/56.png new file mode 100644 index 0000000000000000000000000000000000000000..fc65431262d0363df2ca22318172c1f6b1486dda GIT binary patch literal 20045 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/57.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/57.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3e029a7944b7eb94f8e1c6b1c8f08528039956 GIT binary patch literal 19811 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�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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/59.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/59.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc3b8c714e186415060d4eea32eef7955339dba GIT binary patch literal 18352 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 M07*qoM6N<$f;Z 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 Hu0mjf-R`S4 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/61.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/61.png new file mode 100644 index 0000000000000000000000000000000000000000..53eac80a3f5c8db7bc7594ef7bea5cbe63497d9d GIT binary patch literal 19570 zcmV)A)L_t(|oQzmaa~0PSJ*V%?lMs3ckod4&P#9-N za3~x3Bk?jxRlITK2gHBWc$4xL;vySXaXDq-5I}m8tgrWGZfDWm_ueN}QkfEHW^`w! z`}FDV)0b&F0idc-Kmk=KR22Y#M~@zT|F`cEmngq&J$(JG+qYi5dIbfDdN3}^Zy^YP zAV6?w0qxG#jT>*?yk4J9KmYu*Z@zi5{6a7ZlR!XF?dw@V`Z5Ke$WT=svR?vFr~+A` z>Qx(~)=?qw(|NS`=*^$ZFVShR}JOt^m zCek@V3Q4jP=>>^OFbO)6gaTn$-*uW50I~wK`-K)InD^d)-%hr+HlhBkd9k&*1;zdQ zADE9N5``-jeH8Rr&f(sOxo(+K8Wuz2hIdzwLBk1EeDTHazWeKUI_CBD^*utZ*qH&NnI2|oIo5H#gM z_$Qj=_M5EGR|(*_#?6-a$y<~gP##aRB7uNTsriE*sPS^?i#9mAicqJ8} z?QA5hs!G!>0(6IXP>fm&`ly;!$E;&s>QWbc3GLhTT=LG{I~9Gxd_m_iFc-#g1kL@B z4~gNmuop-OHmf;9)*zkV=CnrwaV33nIM+QJ`0NUQ(ez~*b z9j%u4(y4>~;YF!14<7#d&70R|z`^06OU6X@iAg@*eyq@=lcNw3q>!DkaL&bL@^|{z zZ5C;WKV*y=O`Gg2ewTav@1t!G=ZbHumjp{gV8yo`Lp-&A|HnUk`{YSO%-Ryd2V*xj zw>ICtee1bAs19R6HfF2Rev8`4$W4RQrct4G_$ZGN_>w9Dn?k&cs`uU+O7Q@AMw+H9 zj+a_r#;GC4SRMu>Lge24dq4j3$C?2Z@gnwtIu2yAy10f;IE0fOv6gO|&nC;Gx6{9x;i_@LEcMgsYNtoRAkG4XyXg*-lPsVX< z(QiHau~o%@d*#wf9?TS||Lj>Hs#If{}MZXXUA`HR{@ zt&A2dN@lob91K3npijk z4)JL|1d`JD-g%e1a&4o966GSJ-GT7vT82fbJX_2&)#~#7Uwu%wMmn++ znIuk9H|g2S^xAY~ZPm6_D8?a$0;B3;)cKfC$9y*GkWuJ0u?-1WrG4=50RYXa8L3vf z975A3G*_<$?mDAYT9v6S&L3|-{`p@&*Jfbb4~$Wu?Z3^$@71*wkVvdcYnQw%kn{Q6 z3R)>R*4EVY9M}*7OX?F#=+}Z-D4asin1V>0?av6?q^kQlz6+aVu~>}5fM~QpsQX3M zMb<%4D!!0ia{X#wApvx$J3REMPy+f$>Ktlm$hycFvimuDUEAK?cFJq>6O@1Y>{+|- zN-K*E5cR?;iQ?UN-ue13U+b7vtHiX$C#R<&$O+r?Nf*pdYOB!>=!F{1f*3K zg1;ip!ggE;BIX?U26HuL;bX?u+Jp&!qg;c4;D&3HCki4kmvLC*k2_`}?r3}K+|l1h zU?vjT5v55Irz4eQHOa61p4M7RNkaxRwfsTWp+Xg3A-EL4t2E!A_`0aOJVT|;My=cvfe#;nNldw%vD~#J1t9hU7)%XF9|wgVnBF4dp?`ZF753e9Uozn z3ha3(QymZ`^-WAIC${;1D`~&{>EgZ%U$^d0a-;ZPYMRKMY7j&s<9$k zY{!s^2?kA@mmPO>^X7-Y{_=~jI^jRZN0laKTXL~IM*U(+A`nztl4ep?9tmN8ra+uI zAPCXbi=dyeMEk9n{-LRbLX|M0a?k(bHc<5$XLN zTX9=ZW+# z(!rLrOPCTgdf%i16e1&jUHRx@u}op}It*Td zs}wt>p|)3C6h|*6Tt8nfWoe~|Gw~a*zhNq|Fm@h&u8*0q8q zVXLHJh}veVtJp+oW_)>fM>a)k-MpgG5bsYFD+tds_fQ^;>L3Eb&V`-7{`^a(g{o3$ zuO>qot<2;>7bno0kNs~_;XZ6IX!q+lS;w({>=~W-o0CS zolI9C?noI5*nYZ7HDJ&!kY2G81^{RiCS=35@=Ox9l`@z(^ZfZ-N)0nJudS_Jy>dm9 z2!P?qbgGm#thx3CN9)8J6UaixWdAtxqdy+*zrD{LojbF2GJ76qzBcB$+erf>p!n67Ux^Sv+VFS8%S_A6otI{e#!Y~&N)&~jk|kIu1IB!G z4@2f@I4|5}ki=mD>JC@ic-hO=i*a0>Lzyt`D4N}t(vkafLOqHQBSF(zcY@=QdNDK^DuU$=?l_~Z` zW~ETQOCcyi`EWEm_1KHvwbxI>cx`<^oIVZK*F`FhIq(K{p(uxvSfz^vW@di%!bMlG zI|AJ$cTQrBTbrBpbk+zfy)nM|I|p1EV9KVl#wBEZFq7Z3k9y!P6) zd-v{*M*}7<+yfEYCarQ_th!<~VkRaTQIP<(SBjlPL~N7iLVeJP1d#S3C8j#i72Y2JW8+Y#9k>U{js%wLU`v?2qefRC!cr+dkHpZhfo9i3v<1Xhjo0GwCyqwRN z=+b)o^YKY)nq{|qdNMzmFHRQA*?f^R000bpNklXMGq0 z1W`Mb+!qHtIXPJ_7DZWJV?l@b2tWuCg7v!LD2bvl41+G?LK*USAhwDx6&VbY^=4J9 zu1eFPj3!Ca!(38-u}#s`X}(>hc_HP?_vcb6)pisPfbn21s4d=m8sjLh#lX+2BZASk zq8=0&qb=3Bj*Yfow8!?ANwhT7CA&LzIIsrY#e{&F?5QQgXE%!p9`2fAnrmb(jKLBILm@Qac zV@J&g4*drJV@%TPX(jJ|F%G=2sw5R1Sr+$?=nhA~MO9T=>D6+1J2ERaV2s@l>K{L4 z_a;Y@cL*T>K#=r&w#-VUl!tou@$G3WQW0P6)|Zmid|7MV;wrK2xqZg`v*@>X z6rIlcY!KM~JbK`z!@*Q5Sb+L0)RYK%FkwiXXJjQiYA{F}e-Z!i$3MJ(f8GxDw_6E_ zq?Pzi2(*7vL_k06M7_AIN@Ro_`2M5OC@%^}iV(5mi(99oM|W;rTr9U~J~}>T97p|L zhx;Gb89{RX{#+|f88e-J6h*_~FezuhPw12dm-7W6);7-y5vVkp9v~OtW_j-9&*kNn{XYd%C_}YMm@4x@v zD2)b+EN>5xwgLH#5=MfQ_{_N+hgPi}x+8lBmEigLdD}e(3y$P)tg~G}X#Q#A^((E* zs&oeo2xtHd+`E5oI-54b9h8!@@#xX5NnO#|VteEG`2I~7vS(J;4r|FQzGoUY?gp zGPv60yc<&5K@CT8{+H)(2cc&O=UkZJ#(NW)FbaBMMLZ9^vCj;L<$70DaxZ-jaf!J4 z**<^kQLAfBN{gO$P*npMm|k50;Nb(hj%v9fc>9)}4-DE9JzY@B6h< zO)@*z2LK;F{BkmxTurY&6KI%bX_jS3+@aaSweAX1LMZu{uOB8J|L|f)2ulWo?Plu< z&i!D^BH#B3p^S0PIb*D&olXcn}0Z zG8n{hJU$t}`1O_F@kZQK1PQXTst6$k(A@79rIJN)=lCp+{rP5F$hzVC)7jKjSJQT+ ztrxo&ah3-n06<;I=J;$+%{c|u6LdLm?TXfnG6oD#5^{&#+Gs?qwQ9pm5D;$Px#LU{ z=ac}L#bWX4(`EBy&z?Pd{qogs(Z+cLV29T&xuTSgl6V|P=Pzg9jM&p*=f`*RJkP)T zLdexhN5iVD%Ca=Z1fKVeyeQ+NX>$ATt9)7e%nPx1)bTjuB8s9DwGbc?F(}ep^hsT6 z=4q{kC+b>lH#r8e=LLueN@_qb1`&~oOp_Bi4Lq+qxUt-A^0I223*3jvro3CSa13#8 zs{uGgO%D&oY72`|?QDl?$I;sFG=|dH13L`>XxI4A76Zh+MFju=gi5019es^>5-9Z28r+G3O2A=+yvBK*-jrAEvE$g5z9+B-| zOzcPfTFRcscX|4dY@w*S*`^cl9N7Q7nEkZGzwJ2OdZIRqsM>tU=K#fDpljlvPtR!*2IOQBPC>!!JBmXH{90mA*!!_lgo6X?ALi^THOnuO8eR z`o3HhA|Ab27k@8913(DzgV+-uAp5k~3>gN2m+R`qCTHDI7>34}61m9N-((lL!apyi z^1^p--i=SkRaIqa8g{!^o9tt*s7!Zxu2i8ka?ZQmNC?qvds9Z&t96#8K@jeCJKqnB z?u{GuIyrfmSBupyEArB<+_cbfC|nz@Yn=?IcoEUKVJEPOuOaF8vrP)M4F}rLYxDH! z*OwQcKpPqiy0x{mVPQ@4ifNsaXdo);H zWoT50Wh-h4JUMx|NSPZF(l$S6ep4GM^lzF@nl6j2n_b$vU%I-S1j9w+}N#^;yQ z#eB&*PX>dks)oa1uh;wV{(QGfi`v}1cmHTSnNMfi?fUZ5RUF41tTi%%BnX3A)~c?B z=Y9O}u^WXYaH`~JaK=C`7V9D}uZbzNiQ_`=#G1`|MBCgxsIj1Rw#zJT?Pp2BjwPhq z6pW#UqeUeE1A+@xD|C+eUNJY(xA0=@G-e8P{Lth0_W4C# zlm=kETF1Ruc%qi|78BDvN?LN(h-vXTuxA2VXw$Jg=W5wUqa0%8yQx!6?tNZCZw5*sN*%^86p`&E~;? zcSwD)$YzUGUad#EnB4pN^78#U%at|`N%pV()(yIVSjWwlKIi$UgCjI{I;2TiWsEZE zE^Pu%Nr$=g2LN3w_g!Gxl{uHi2+;0VD&u+)h_>`MH<4PoYh9}5ArPS0EO`a9`Pvxx zEx7BIvfqTpivYv#+nDcgUha#k(vGV-6q|pH*eoWz*^OWkZ!lTS#NflJsgEU zzn|uLzTK8grdpe$@dB}wwj#|2|tO6dvFTw>4jwwrC->#4e?lm@=wLNpb`R}vY0J}<*CK|s&*v@w&( zDHlT3br1%C*umoBYBjx@3g2UlE~&HO(M^E7z`6*pxXtJKJuy&YMHPhj-5MPs=PX z{ce{FJ_+cXi@7I6*zMju>J^4mRn?Dztf-7JTI+}!pOVm&lWhLBCM(H~#}i$vq9}ad z7oJB534#t}SN}DfJ>S5^RsmvFRb^2ULT8JW2&1CbKVPi6k#`!h9` zZZ}*A&N=5i?!|eQ_jVlRavaAP zV~t@B`#XE~)tY_vW&t6B76f5fm8Fsr6LNidb$)(+aB$%HfnMI+^}K_Faaz`tvbyFs z*Ejv7?>G!&Y|BMni#zx3){Tzi#3A6bAOHB-v+uVQMSn18nr0W-w$N(}RF~qn-M-(L z0RXlx|JDe?J(RlK14iz~2EZ-2TV=8@lAX*uG8SyMSoi7oUct{s5w%(m5QP4EGPudA zPZQ@@l3IvI5#z`iPbWHGObKEHeRs9M%ppNyi~#`Tt2}mX&#DlL;}t(I_#=@0&+`j{ zFoIA?_4@b~fRJE(qQd|F_KnttbN=b)pZUK3@ZkdsfbaX(+VONU8jYWQ`>Y0zN+yE1 z=`8)hg9qAZB~`v!JYh49{5T4GmY=2ha5zk7Glx0ffA{rGy6S4~;e$sH)A<}A2)DYv zE3Mc-yDjpt_7^|@#ld8HaelGqe}L`PTRu7f7&&+w!QN6nXjiiW;O(seca0Xl_~MJB z=Pz!d-zDB!!9W9g4(l__j7@8hO8v7b3kH+RyjDU+k$+wAKNMCFcQBrC&Z8)58i5eJ z!x1S7W*N9fH9V3i(VLrM$E2nAc9YS_~hP4AFbExC=Qv!tTFw5^7_?l z2qCX)trWs&G#+7uvMfUo^(oKRGMi^o%2fC6)<;GB0Qxb}MV-!^sIRq=vR)PIMz+i) zn0Exx26wZ!y6wjO>AnmEZ%=%o4G|^V&?!9<--0@$VyY@ndca7y{2Y95zdSlibA;2ED3;_7$Km795 z%UAojLjc1dR7yR0`Xrstw;Km+rvd;N;5sgWmHJ0 zE}WnbtU0@x38{9-*)I48T}I4wX@E`@ZJpOJ2*qaAzPIf6WUw*9`&I&W58IC8m&Yxj zdjpE5vDT((+KM*{qd!SY-265Jh1aoV-4{|MC4^ujhGQ9LI4SE2)gu^DMi6|DNM|i)?`q zq?BTWT-Uo1l9iKgl9+}PxKnnDX*O4^n3A8$*Kf@Q6b3P2h4d=C>G61;#^A_p5` z9nV6flm;E|>$ooGjj_#SjQ;OhC27;X z$Cu|qRG*Ld+4+^*%&FS_^?OFPgKOX6c~1;GmKXpGUA*rV?Ucz@>+P}-Z33pn9qfy(1#CDR z)@8NVpAb-t86m&|A!HOs2I5ADBuRh;{iN^vy~l{Vj@wu3ld4$@E2UIY5kiPnCvVQ0 zhEJyBs;qO4h#&R`1IJ~TS>X<+gW<3j1_>_TF6uCh+OPmZNGUbOUYws7MP&`0I7$cO ze;it$)Xy`KEvvzBptX`pQc9(eMNv$rQy~PQR0yH9W{kDUhEiIU<=e}vO>t4jqqT3x z8-8mo@7dT*a^_v-)0yJir!aEJzTE(zYsIyldUvo_hqSF12RlhrEx)n-FD#%Kx4jMf zgT!&%nsZ7C#>Dfy)pE7S79{AsE%=gn!frC6n34$<&rfGkO6IUAit|-bG)gK300@HM z@Xi5a%ym6XaFb$C%jlhIJ z00<#SZNgNYGj4?(VN~uy(D@6&ag_viHjhpwrGO>H*+<*Dl19R6XZx6Vx zK-zRA((P#T3Ce)>Yy1r(WFLI|gKdIsQ+3?d?-{$X$QW4wJkJx2um&ImJ>dJH7wzwmTqN=K-RApJFvzwPMj*fHfQ(M*b zVvz|U>bfr1>vWbbm&<&WKX~}y&b_-$)0`AMNfHEMge9ZQ8Y89p`VU_RLGa}1)8%p* zhT-+~wbmMA%ovkW)OEcsOJHHMEgx8*1WE(nz_#9`GvKhD2l;g z;CU{i&dKZ7ju#*ZUC*1RH;;QwZOP#%z-|zPL7c?A<`#g1z*!4TF#-T^4V2P^;OndF zx~_-gAx7BuJmuFhwRe80N#9W+|>cJ19j=dSPjk$b*uE4-7} zC+!ss2?ASZcIU2kWW^TH?JluaG)+~OZ9h(H?Ps5UcKq_?JEFGMZc@LLSZkj~=u#lz zhROiZ2q6R}Br|l0gIQjcTmS$@qmj{Ok!1ivt(6dxQlgES-K6b`h?C^r{d=SFh){BR zavCR*>#|4prj4ch8IGFWNGs?Qehc#c%M{ z?0PSV*aid}E@wZS-kNm_K+`naU9IGcdF8s!<5BRtL&~6f zQ)u7!5W<{uXbnO*OXu_Xd@`93N_#z@F*Y2IIOqTJSIi7QUQ3{q%(8`2Dlc*iK(7}P zjFnWE7njBu0O0YPa{vf+J!}Co+8-Y_O+yGa#(18G5ae}reSOmldO;WvLNP+tTF>{5 zHV`2xl`+~F6PEKznKf?~^Vv<7YpwT{!Mhr1Z!p$%=lXy^Zs7v}IC^n}+a4`l#seGyYOM}6953rUR3gD7Q#*d zg!Bkf*8a`JKPi<^`sW9()2L_4;Wd|1wiy!6IRl^slrqX|E~Nkf-1p?!k`qE&woxf% zj8RHj3wjP2VZ{+MMmLREWZA*N0fcaNa}$JtG4@SX{XTcJY5Ic^A=vYLjB#0(ud*sh z5{MvUj#3I^{CLEg;0|rdTqvnQpmGu<005(9fqE_@FHg>t)bA6Sf9d!$1{{Jv0ssL2 z|M&aUJ^%m<@kvBMRGghjlN`r&$6sz$S!*xTGt+|sFa%6dTtLtfwnCH{pnY^uL58l@ zS>d}sjlX~|K1w<|e6W2n9brphTP6UB1ZFT>_w-h4R#t94^ejEo13=QdRCIQ&zn4qB ze=c<{#sRwW!WG$z`0HBw+D-H~`f(E1b$zYfziEb}EXy{xHnS{yGO%~7{+(oiQ5;7IV+2Sm)wXR>6o6^y(|J(@VZ^!L z>2#^b;yB*f8HPcKu{j%$5TlE9@?!+slL2%G>3M5P$(4U$(`ZLPx?TWh<$E+CL13!~KMJmUV}+`~W5 z5-*GpM%LOiNs7EU8=p0z>Grw^U|Liu_j!`0NwQQ6jM1W=&FAwXn+ak18~r$rgCJOz zFd;-M+bqi*IE*kMgeg%p?K1SelO2ES4Fw6Db2RQWjb!CCiGxb&7Y8R=U$53LhAg~= z`0Ke}IRG9Hmh5L$*jSygp5yE9-?{&O`tU(STgg)PkH;6gQ1n+MW zN&vuGE9(0G)*u(H(Rz@E|1!l@BU@EDhX5hjG_&a}isL-X!Z2)_24l>Eko$hCl+ilN z76_1aq!I0WUL;AvJQl@Knx;irT5Gj2Q4~gDL@Cuqd!9f0_G{k1XRJjCaZzwBPH-GY z5ki>zJ_=LIqax3bPDZWP*V{<+THJ3Ve$xSn;w$u*^e@`_bwL9Fc6N5k@^W(B%2BKL zx7=bx2nOdYMmqr+#B5X>*|yIn;@J5(?gD~Vw!ZHZLI4~^7%}!_Q@`uvySVxFymF2q zgc+p>6~>TGw>z6ot#fIov$eeyP^^r@#yEu9R(YN`olJIihJYY4BI*sa)=F!PkZjv! zE-Q*6FY+`^N25`#i*DG}fPLSeMH`J57qV4Kbvg;cB#9#_<#c?qe>5`IUc>t4xa@8A z_>)gYqtUqou4YL(0B}G2;isLnGaipu54h_42LK13efHV6D{B>9+B**(EEbDv4nTkj zCKyKy-|Ko`9}A-mAm{mh5JVW^IF5YRBIZ-Zrjv=m)M)d?0QMXAKNWIeI-e~FAzOI9 z5%qX)E5#KKI{kiccXwBa=IPVl8lxABnK4>a&B^g`RTi>scegj6Y?!AxXr+Y^*0a^ z^Ct)U2XA)3C4D$=1Kd^RbNK4j*>(Es7rTYNa{zEo|C0T3i}BrM58Q6n(`16!h@hB_UWjc7>`hzq^U9L&cMCQy%e$!5;`sO*3mGE5du+* zjltmTY`V2I)JorvEkylJnlc`|lwMI3+UPV*DfO~NHk-}ss%Df91MmIC{=0n=xJrA2 z)(|Kbg#jrgA(*SmP~K>ZF~ZJ_PESU&?DwP(0B@zgf@t+E2;g%1YY+sCF@1gglt0oO zU`q1Fe6Ya}ii<(?1RG;G=Tb@p5D_=2MBZ9Js1c1d<}}YUNs=_pvpkBTvaDtmld>%p z{AE{3Etze8cQl{Pr#y`A-o48_uiNV#9UbwFVXxPV!Z6D+&-0A2q83W2IF37=POsM+ zosRbQ_IS5f@kjuV2z#Lt?D0GE15U(#t|&O;MSI-TG$`_%VR(7)YEe`dkF$p34GP2? z3|);+A&B7fPKHZp)}4O@X#E1K(ekZ%Vf}_M!UW%qnM0`54kHvrQQNk@=WC_^yywP^ zTeKEqf-&a4KS=yWGoSm;x}q#q+Zt^UQV$dScOTNf|BX1-(ZYB^9Pi$}M=6!Eky7rz zcIEg*aE6XYjLjc&>*})hqrAh-C@9*QDa5zZ2+lSwL7u`_+ zf1PB{1W{g$DK%P2Q6C&0JHY1>!n(aJgTDX42b0O;6&7^hUv{rEx145khAKdT%>NpQv!_&U+d$ZZxVWwIo8!2T&2$ix$ z;CK)#D?i=fJ#7EC!W)ClEX#eLV~oNu`t7slnBaT&?=!~Avf`X8t%Yc$l%D6cZM&5J z5JHqu&bb5Ew(2n)yr{jlZ7HSyIx2%se{*Z=Wy=Ozo3&_-F+sq`$FE)D~&Pg_PPKlj^hWz;atLYfSRUREapOpIEpaFvT5G?{(H{4 z!&iq=wuIm;&l#o5Sw}*MWi2$FOk<=2(6Y>wly$lIr&ERrMi^TNQW|Uf0sY&1@;^(TF{+ie)=)~v*;$Of*zftU%p$CXV0Hsj55C{8t!H_@>cuk(MKmIuUTyrK|;w- zc9O5B0uv0@VT_D1N^8bg(>6=bSxwW?y>IWg5 z;SM2KD|I#=dDYA^KTeX_Z04*Jq5=R}7W+r1?FG}OX`Hp|Pj_ioGawNFg7J8KEBd{? zz4Pw}0ssPXW7OO05POU*b-t@0V#PPN&|hge^44HLN75ibm=FY@jYa_0+Kr73=bSY* zjMzINQ={7d><+gnvt!L7Dh>n$gm8T+Sw zeq8I&BM&>?Oqyl)H-NL&N+}r&@5cCP4wZrNcr1j_N)HAD&bf1r`+TX$E2Al80FDr9 zt&QX0abjcD%y{};<*;)DYz$Z)cZ@MX82Y$<$1dW0J_o-J;zqVelor#6^H+Cm{!Qz( zZHoym@BF(eT~NTmiGEco@-#&zF)HLgV$J9 zS2ulrgZ_#s>ptBKPa0Ed8&F)RIdMUs>;}8LN>xr@9_rlFk_MM;-_SbSGDi-+2(_PIM9{zW!_$*# zhZs^$zjHJuZZumwe*DQQklo$gWp~i+hR~;f@go4h7@L)*B1w`PJAU}lhpT;D{|^8F z|NkQCEz`R2zRSJuT>7vicbAeJ5BNYXXJ*fw`$_!(n5HRIg<#^ka(B>> z)R!Owg#2CHMT_IO{Bxm{?v3Ibj`qsBA*IaAckzs;Sw<=1^MwVqlh|y>yq)3wZi<2oKBuV1&c&tll5blTJwhcEm|4Q07E$8+? zH*`}Z5hBWHx)G1Ws83fK2kSf2asTxAv~#JGCTSQ1hY{Uo>8a9UG*2S=@Te!3ccXaD zr-c2yb-Ud=ckY};;Vi!jU}Iw=OVhIIrr)!do6k-e^*rw)^H4;m&%m@G03s@Y*EXF@ z!P9A$Cz%q02>82e_1cR5$w(n%fBCX^$tGYpUKn%E4bzCCNJ_~$*L7XjG}AOSO-s_W zR&%EQlpxU<>$$;`guHuII!YbV*4vGw8>+F=bm70s-M(T!TN&J)>iS9}iJ~`QaC;zv zAhs;4bEz}v4=AOzT1_*w!vMZ|{B$^}GW$hFu|$ULoo#pGE*5)1cl3RKslx>XSRyjO z?DS3qK)Aedd4}-|_J^%@ar|AG003|>NeE()NreCs@=7BAIthM#*}mC?dmh=f`C*v3 zBR9&VVVVF?uh$XKow)USJSKNNWH8)r)wYzU zDRu05@2p9062;>*a+(t^6QMpI`(eN-rOnowW7`&_pc!vj=_6qK-P4EN6QN|j(w%EN z6L<1F5w{uk&%xwu?YQuZs_hH`F4}XK1}~HGO#di~m##qZVlB9d$h`|BWRZX!f!eb* zO~-#cjb7F9<| z3H{HJM{WIqsC#j|SyMk=V;`KL<5*TSJ~$Z@)Z#c=Yqxyg7lOaqjldl0ZB;9H&v5H5&DniLX0+8U${ZN0xBCvyOLh96T)W@hmrVPJkr=!R7CWmGf@Sk(;G2rAcPIPv#}h7tcEp0pQTfwj8Y=%Li_n z*P}fRxSNR@QM+yHC=hWRGqcuQYc@2oVpumV;RW%3U7?iHbj>u)m6a97SRBWr;c$`& zYS>XCe!5P-Iy%)1d-wVt(aqk#i-dA4^F}r_9V;Tn)b|;oFYEq`M1B;S`;WW*i3dyS zVu^*9{FQPDX9>TR@WOdpu=!L~0-T53v#3AkLGi+5RmE+#n3?=8xC!TjloG0K(Qd$% zRDk%~ofT7~y)bKNc;IEf*pL*nek^ZVR0jbGMGPE zvmOPRLIkM}Ch70@>aTUokGmlNWKzAq+u%T4$q-RV=~Hv)`-W|e#}fpS*A(KME2SEZ z1|nXm>&9wlD74SJE@Nyo91==omfW;OB1tb6-Qko=Y3Mp4tk<2VQagBhaxxf8RXPWy z1R$ZL@QCn&4^)OMq5j!QYzZ#~_KW+KIbOl7_io+(+lNJpWI0eZpJ&Znx_7M&SE#6uYi#+Li(( zh1lHOaDXSkydV-ngkh*LEz8nBUAKLyf9&h-#AS>bhK>jZBLw8*qu#(R&YGX+!!C4= zvTY~4DCBisTTts+c(2$1f=id6VBSUjf*BdFUEBHW)6W24dwaWx>dnUhLQ$Uvm$5&S zn+0U^b-wkpw+SJc=P`mN0ZU^qt(hM`4fy=v=8#Jvgp?A}7=?JrVK$Guer(&8<2bp0 ztfaI}doms&(}E<`biL*{!{N}b*?-upqs03un4-o10TlBt-FAm_PKFvmJV zAv#cmc^${`r#>j4jBYvFAeFN;D5Y*)Z~XnCFO+&?)ry!-Ejt79BaHrf8VDh`x3&l+ z{eGVknx$!yq)D2z+bx4pFNhkAMw+B?90|^Ew2atjL|g*T8g;8bb{`-0vvL~qEbe@+ z9)W7NXIw83vQn?_?CgAT@80?S=a=Y=#}^l{D3?|6a4#Zj^lR?v_ExQOv&_1U=7RwT+mn6F+5?c~dV>lNOxc zXllo944^1s1|wmTtTtA|z*hjeq2IW&e%K#hYOSU`-G6d?G8hY~mX}rr{u%0iwz{&X zx?sD4@zXTv^-fEQq%Z}30BQ~5f%3?xQ zIulp{01$#i%PZjkoz*EtvZz4>plf={Ge#Mu6!Y4WLK0M(X7Ds=G}iz?(^%%aU|1A! zb;Syz7&PPC{fA;!x_FMU!h@?2r2I1JGW<)Nq^c;oxV6{YizJC0!-WKt^nR)8{lXem zZ@J_cEaax_cV6Du@PqlDc`;Q1eFf5u%Nzc*FosG&E(H0AKi*uuKS}fF?1Ug8Brou& zR9>lD2qBb`2&jZWB$Ofo)FI8NUNbZRHJo_e-l#Vi$$0>AfrSzmSG76J1sALEpTpEu zdKBGYYimm>m841jlM61ToLS0TL*%K6hSI#ysEb3y?C4dwF zz~0Th``_Fzq-XB`bUK}>=Y@H7q)JYFX%0ln2qA>B*;xl;&?Fj!X%wPA*mR=Whu`Y1(prl`G#SRodV{vd0SpXNh?%+&i?}d0RR6h$>yK{ z00vn}L_t)9T}y9MM-={!jUhLskQg^kOK5-uQ33c12lP@wH*{6CQlU~pp$qzJOVv`b zqMNLXnm{&4BnW(+hfQ#3yX0zH|&ff93CD<^dZ9K`Q7Py!q1Hd8!xwCDq*y-Idzf|3z018K#C-D@sKkVq-rx!0C91V_7s?kX``0#OS zduMq3@w*?s-+8s;9QynHSWYO*KQZJbQ&n}73xE*Nhkh=d^x)yo+uK_@7aPQYCjr3i z+qZXK?QkI!V#*7MF@s->q+%ugISrTAE&;_TA`grbE1?K`l;S` z3Nb++fS}J7n1XyMKPuYxYzt$5BpUNlr<0;D9v%QJbi0|-^5y&7d;zMlvBLbRYmh0b zn3+Mk+fQp3+eDEbG1SXfm-(&9MI;e4j1F;pGT(4(tU&Zktj`x4NdwNDX;xK*aJn|< zzw(Y?-K=HsWVLMhEq=#v?HHBA15Pb2kkc=XF7 zt*p|4LX?B0r7JjO75=FZ;v6 zFx_-~>X0g55vw@m2-$H)Dm_GJ!;G|%!sN7`6W-@Iq+FjGh(pl#*;wJoP2@ETEVZVe z?qatrOTV++)2%~&o;!DL6m}RywF$#IKG*7v8=X$)@8{3WkTVOP1tvAc+OA}62HDj0 z7S&`I(gC^@9#$k8naqvVN~ZFSxc}4rKY#zjMSBiC{eY~fWr`uy)8a%qEOZyvzFvFw z?3pwS%C2x;Z6S>LwN0)+nWhZ0Ww0%QX2IAV?!R1-O=>oZ*`o5n*<*@kqv@2r67)GX zL_^7x(G>D;=T*Gt&*i#kdJ7S8CoNb}&U}MLqmd89?BA}hZ|v{y4~N498xPi*R%l%uIe3R&O?ckX=ic5g3HIFi^X0Lq9F>0Ca^*@l4+SnPIp-|PxZzVI0M$8blE zcL*fDKi~4|YAT4t$S2OI$2}|>v(l&NyiU|BZoCpB|2E7c5rI$?#fRf#Lv3W^?qYXu zcQ4Zr#KH*xe!O?@ucuE%=v9JNt94S<4lqsOcU!n8P)E{()jZ;>0z@XVtSyWpvK#`9 zaW^r~cw7c_I-PfZ=|kN+#Y7oGwd!RHxzpP)-x1Qr|io z(SP{pp?I8}IM{H6L6#3@l`-%vP>QCkrBWR9&fi4~%(v&28ynD{nJrFlklne4?qZj} zGx{c99QwgULd;8c4eB*!&1r_R^PilzLp4PIWJ)jjo1uK@hpm6N)X-UiScAadsX^^a z?PI}`y%*$j%%q3;k`C9vXNym{%+P>75Eo;WYD6MM>1qe+_;t4lM=1F2tpy31YAfnH4 zJ_&%JPs(O^JI8!yh{k9%;z6mm_8G{aY+xjKwwS&7)y>tF)vBsOYl#rH1B-Ax{`K*T ze_q5gQU_eCIAUnXzDi`8$qGfW=PgCa;s*f2(&eRt!vn^D+J|jGBvtFy=yzV6pF21_ z2+tiPnS)XB)+C0RjB&Vl(OAp+idfPCVvrb%@Utk2;b15qgU1}QIT#9R7J`3TJy;3aLO@F%(>eMuXdBEqFA+_?|-jAzEXM`N9Y z*Lc0-`9EH-r($9Xx|zcAj<*8UwESp=T~EoHVx`r}W4@3-EdC5i0xf<*T?9wuA!UDQ zXJ^OHw(%>HM(j9^(*UVDHPwO8h-LTV_PMz^j~`%haj_gE1!A7@#sA^tFv%1LPA4Jr zNr_G%7HpP*=UQ53Tldt0$mo9YVtg;OJzInp(P378i48Tnq(IZ^4v8R}Q+71c8{lG;`h zvcLTKB`O>q9>!Z278dg2fmTF>oID8`2t6~e1ZWC*N})}E?N^CKr7XceGy_bnBV_(| zb0p>|H%_H<#pI_@CWd*UPp7@Ly#>M~OftooZU+Ykdfn~Ahd-csJ6QPKL`k6_WHs`2 zr4WMYI%2Mz2lKVl+Mca%j#!n){-xn9M;zkS#FQ&>s z37spCR*<|QC3Gzh?DcvXe2vGdJvj>)<9aX{C`%9*-HOR`%e&Ke+#X3lozASo(Srxy z#<~uayp%UgO$4P3Xt^4KZ)z*WuCh13y=l{M|FcAP9FK4O2wH~7AuThh+(q@hSwIvP z5o>%RLQO_B>zHU_4*L!W-nkB(IF9|I)SrW1r4~YV@JAyk7S7N!s`Ubc;u{5F>0+@m z@d1I6X@x%BNa*+b5h~>rm4?AwnqdP1FjLnzW3`i0`HH*}S0ORGNU;w|wKrf&^9xXA z66WXUGdlDwMxnuApVS}@`?qnt?-l}pZnx{*p(*1iDyI`U8%;EoP4Mc7K!ovR+@_l= zwiB5<3;(dcS8U?esYTVeC@#$yMk zsW@L*ygdG`t*tiq4**ct{SGfh5CZReV5>j`AfyOMv46~Fn?TgsL>o!bND~|%9lNPE z`%VO}k-4m|ub-cv%fF=Ck9&K=!B7UfyuAEJf2W`Mm;B)5R8b)TOl)=XVP;3UwcG2C zZ^mLd%yR?4`?@Sh8H_5TJB?SRAIU1U5Fr2o_wUbz5HJaOLBk`lYm#hywbft{q@QFLIzz}U0-u8h0$#HQ>_Asi{Qz>3IIaP=Pi@$ hcDo8z4NtZx{{fbi=b1?p)&~Fp002ovPDHLkV1i0l_euZ& literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/62.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/62.png new file mode 100644 index 0000000000000000000000000000000000000000..29d6c098308c383394df4f71c2ddda73ad2934db GIT binary patch literal 18107 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 axc&oz0A_en+fk)F|!?y6U>UR9a9Zbn4R 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 AG5`Po literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/67.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/67.png new file mode 100644 index 0000000000000000000000000000000000000000..5d513c1831674aeea3bce25065b7e1bbf0b2e2ba GIT binary patch literal 17863 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 Hu0mjf!WfYc literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/69.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/69.png new file mode 100644 index 0000000000000000000000000000000000000000..60400d4d93600acca4a9c2957f025f326ffc6d23 GIT binary patch literal 17891 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

      AdZ|^F%h1e11y;n-rO)Z4TP?^mSma`WhKLr|Z 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

        %c6=-;eRX-MdkFSU%+zK$7_sU5K;M@U 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 z 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 N002ovPDHLkV1gp$=KcTx literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/72.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/72.png new file mode 100644 index 0000000000000000000000000000000000000000..af8f6afb9f1db4eb3c7c3109e4cefea3257bb427 GIT binary patch literal 19224 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�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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/76.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/76.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf7a61546ae8ccdc689e0e1f31f64daa20499eb GIT binary patch literal 18663 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 KMNUMnLSTXg85kh| literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/77.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/77.png new file mode 100644 index 0000000000000000000000000000000000000000..93fc440c75aac1f43e4c45e876e1297d6d8c4413 GIT binary patch literal 18234 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/78.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/78.png new file mode 100644 index 0000000000000000000000000000000000000000..3720b727278be3b688c460df13f1645840ba4828 GIT binary patch literal 19421 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/79.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/79.png new file mode 100644 index 0000000000000000000000000000000000000000..12ce480b62baf47168c261c7b23350d61ca13712 GIT binary patch literal 17422 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 RAn^bI002ovPDHLkV1jbG?b84N literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/8.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/8.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2caf3d0ac69c55ff185fc2429b06f8def28b4e GIT binary patch literal 17505 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 Q$p8QV07*qoM6N<$f;-s_uK)l5 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/81.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/81.png new file mode 100644 index 0000000000000000000000000000000000000000..f65732b2738d22c2ead5ae231e3cd90579cc5932 GIT binary patch literal 19360 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/85.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/85.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bad9a7d532347c3b6b3edaee675dd66280d8c0 GIT binary patch literal 18356 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 P00000NkvXXu0mjf4u`9x literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/86.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/86.png new file mode 100644 index 0000000000000000000000000000000000000000..11b64788812df14640bbb584563d29d35f7156be GIT binary patch literal 19159 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

        U9q!?m<#1APJMEl=3srX~wesH3~ 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 BZPx$* literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/90.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/90.png new file mode 100644 index 0000000000000000000000000000000000000000..ebda7fb123c0632ac45edfd4f15cbe90eb7c0f8b GIT binary patch literal 16877 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/91.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/91.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d661e764aac4e1d1f1539f0ff51a3d8dfa2dff GIT binary patch literal 18824 zcmV)^K!CrAP)xZWTuot*Y+1AT~0_B*OM$WXVWi z_Q{eZgiuzzu#vLaH-3XJ%l-q|H^K*C2?+%$b|7R;u9sjgp6RZAI9)Y0*JOmuy>n-} ztIs)gs=9e+=az_wBoQGZRaI3HR;5}ik%|ZrGc!^9y_7NxL#8WZ}yYMD66ETsJUAT#hh=`aO^AfY*HUdypB8)`LOr*7{PhqoH42}tXK>W2R zT0CK1e}>1W?eF+bi{I~5Rl*HK6(Ur7EPftW9jD-(om)gCA~6)3u>m2%B8eIIYbo{e z<&~7u>({>!Q7J`Lof4o?N~yINUOp*+P=u~JF47-E(9D9UOco%UuU)(L`t>i7R7?u= z0l{>Ui(yDd0}d z^v91MU%h(u;K2hIfOBsFD3N~q?LW^W@AHcYv+(xzP0vKtg2_yJtg0e1n{{VrJu~0A zbLZgTxoJ+Z_<%x1gceY<5zi#IAlJ;21px&&H@it&TQ?Sq#jn4<83xCieDOYJNOLv; za@3|9oro}dNDVlI0Wn3*87buX{b#!VbK#G91rS8IdF-uQfAcl_`c0%QN(T$8HJLX8 zhM^BGTr^ycDHsLu;rF^kfGYVEWEDbNr2*Rm(hG3pocsQ4$=uH&GBG7A8|&}7uJ8Lu zw!b$e(oJ7$)z9I(G~JkdOB{sU6XZbJ+}yIPPax;$0@Y2=QE6g+u zeMB(i*F@T0W(&bz?r4;jri2vsSLR{Z`^N*i?dIcIvDRzG{ovlJ_ zQBhJFZ6rj?0b&Yw9FOsGzinT0?q;(K7cN}rx>?R$*L68}v)L@?8GI_GlylBGA0Hok zN;1pI$$YU`7Sz2X%3fQKRkgZ&x2owVJM{_8o=U?!OXXB-+uY> zWwd@<_1H<+ukEupxK>@F&nTioM@XcP9zFX0`+pPZY&JVP>#?q&!3Jxnt7>BM{&>s= zbNtx;($rqqSRd2OQ+dp~X#j9_^JGbzn_F(s)cR5JQXD&I>cRtPL=3oE# z<2_zSG&a?E$J~rhPe1m3k8xT!lH8QZj2M8L;Z$$-F{y{@UB5%{{P}ZWWZoiXwXMr? z^o{Qdkr{COSm|~FyPJsv?F>!QbgA6A6}S(0`Ekj67MkFQh_<)4 z=ks~!>qqnrUkT~a{xe07E_5Dr^V{qt*1Lmr{ra|d+`h=v9!}1cIUqB$6K04g_N(TG zEwX#}?un$6lM~n-rhvD&Dfv>|sRAE00I{UXwsHewBX2qIwe6w}vc|E9?Cjip@!|y- zM3e3G1Da2tJ|PTi%024#DWxQbD2mq=!>%uLj_pjQ3V z!)4}L)%YY;5^3m^Qa#_mlZQU#fQdAv%*>?})yi%A!?jis!D$C`@$w#o<9n`gvlcTc z_Kw~cs%j~Nqwm7ku@@LmU+g4mB7D>S=me3Nu%~l;CtbLzP8%l=fU>t1B4SHLNd!k+ zD~lxGZL7A{$ZHyNLX&PCRAuIzbI|pebPiKWVsLBBGaRWg>nIZ2mzq$jPMRpXd-v{- zKR)%a4cYN%B-R+~4#=9H1}`FCSy?$bIf-fQ4-iq`_e;5T;$pD?78o%g=xOAc6jP^l`p}DN1+Rdk)~cFts)2L8 zpr&N?nNmsszw0_|35n?0vuB3BgT>arO$vtx?1s)((ok~N*49o={udyg9A@~UoRY)C zqm)uimMI5IxR17J`j)h|_N5(ORzKnC`@YrzXI@LA*Qz2Z;E22}*8a0KTb+n}{q^4u z4-fr3&QCa~?Pw&W%$&Sc-QV9oIy%B=*8E9a5>QiBOeZ268yg=!eDJ9~)%N%IS5{Vj z`|ZEsbZlIQCuP`VDKpRK^PpaDoYV@edl5Rrj8jESZlOlKk18@-Yu|HD_wV0-^XAR} z0RRC1|96m6LjV8=cS%G+RBT#JZxlxmt?K!(y*5I|iE+HzNT7fONyLQ%ClHt9PXkhN zL`dA?3nGaDOB=v^*u+^+cUKP8^}1%v91xzJ>6xi|_3Bksw=oWCiQ=$oY!Luf+C@Ik?C(|r5wu5yun2{WUf>bg$boGGQ8iJ4Q%@87@IZjzFT zO4x~B(vKukEx^m=lDQfbS3Z08OhIiH^oN)o1<8qO=RluGB69!!{ojB8&3rE~y&iO- zc5{KHu@3aqw1L*|!NCD@Xzl78LMx>c7l;CcU(Oi|Nzu-YVMh&GS~L*6=t(?!^msPg zvX*rsV%M-Mtfl8wz`S_zf`~P!HQ9I?M-+>x&-Jo&et?#U$ zWK*&fjpjBL(Lelf~hVX4A;KL1{;E#HFnT1{6~+G*P!!Vd9~Qj9UiIOsZU+bQjY0KGv(lu|^Z zMsG*6F>uYq6BN*&JL^Wzeq}kluv?QEv-~RFF=m@|E?c|&vK79DsUw=ELSe1{OBgU9gGbn`ufH& zoO_80tEH5N;XKBufnxHYf&XwN6;WKRriW$%jiZzzGp|-FxWQlS(nkFl2V`m6cC}g| zR{SI2CnCCj{rbz7FP-~Pd68ufZOH_k+bI3og2ktBjHfvJ*<-!NnbkCc22_i{Z<;0q zxq9{La=8ql$vKA*Q6i?4RO)C2tJ2eQX||?uVk_l`q4YXJKx05tXaXoaJLQ~LtCfO7 z%VW&TH2db9FJ0O?KK=mC^-KaibACP`%T=`5EoKb)^Us&&KVMi0@-{k1M5NaD;&ozu zk8V3ji^byg>({z0VpW?6UOw^G)+H4lY>e-t3c+Tphqi6>PMrpWa9xjxTwsnIU`S#0 zQ;Y-N7<0{(wEn=TD-%`m3J$zTrp6~Dy@W*Nt+QAxUcGvSRIDq(PsY7f;JXs9d;!`` z{w(5PXJ_a5_yb&``4*Hup(dWqHenZZAlQ=}2k(R3-Q9QZ-oYq-Oz76Bgb3E^`(CW! zK_#h*W_ukhqaMWILfjmDTrFyFKn`j?geGB_9=gbd;3)do1in~Z08$Ad+`D)0>C>kG z4OOOs4M#-dEKB6}!l<}cN)NS#6PTIT*48H=#ez7A3UfA_X&-`0MOu)hVdVm*IzUbE z%P+q^fByXL-Mfz;KeC1g4%=H{b)0`0O;)NAl=MsmpgJL7A00aTH>3OLQcl%5?hsT4 zzz|GfV=Vkxtc08WYuj>Ue$7Orb!*qPDP?y19EgPbe$D%EvK)ed+$ai%kxUtEsp)Ut zyz%klr?+qaVYi(EVQvDPK=%q~4Tv$;81OgIkg*j*!8n_3o}HbM13W$q#sO^2`V-TS z8G*eW!?cH0Uq?<-T9z@nP>#Q!!kv>te#Cic`xjdjpRSLI=rjr(sLr z!*Figl8LBoTduo?PzR9J4W%qVnL-Zia2r{=yL|cbr%#{8_^!kEG3bjgzZ(4REKedy z&5Na6z9BO@KwPf$?WuC{#>Q;y_EH81n*#&F>Ok90Q8%8r;XyT@8pS&tG$JA?MFoCJ zF(s|q%8-Xh_V@P>4-d`I**0WkpITwNNgDJ&x!}0SGouKY(JF@<*TerAyX00>y&aUg- zU`i8`q!eu%a@hc&)YZ5Q>@*29W@0Am zRBOoBPJt|>GVq=HfldG1Q0)K!1yW`{I3+z%t`OBBGegA&| z00960JjL*{000ZPNklZ-o?bdTq1&x~iCb#|R-6_VW~NXbhi6a{io zSc!-LPe}PO`~e>M6}$is5RwQ4h!DY&Y?6(=yY|{1+cV?o>3erwclOu%cGOtXoVgZ2E(=V?r7$>NBVP)vDVO@5lx#YI|`t|FFj}BUn zsUoG}5T?ru$L)05t#+sP=|BE5IerYW{_%&up9d+nn+K1M zbXCa;Dy%P_t~9!ccwr+@*WSD`as8K4!Iw<0h!SBu9+%a%Y;;!l!?~#SZr!?d@7_Jm znQc2^7(mmsl^S*Akpdt{t7v|eYPcX+0^bFBmzEuZYD%t55LuQ{N-@Tx(Qto%zYGyV z3L%TaRo|_gXrz{oHk;P<(dMY%A^>Yn`{fs348kzUNSfzfv(@eQNuKw5UCVO9FtQy7 zBa9HzHTClB=jwaF9~FkRtjXHo^k*< zLbyuBD{Y`CN}-=rF+s|vW0h<;=L`bSwAE`}r|0V3&Stwe*grgliqdkdo!uL@hBsPm zf;B_Mj03yjHd}296`JRcw=tc~wgw|YNYiU7ilSl#a{ln^d%yYhum1VP!O1)dl7cXx zD2nHKK@dpRuWLi`_|hw{LcD&`3bj`IP`+~&1;MRMzbaoUmIwg=NLAGe6M*avGNMTl z2L$uut3n9~VlI}qTpAGr}7NsnRVn536 z{`8kWyZh!>pMIokT3Rs1VV37`?EqH}zIFiVXTlEfN(_luv2DB3m?5lNV4?u71rh)N z66&U$1LT_$a0IKarnr(|esbJ#UJsyGxt9wWhf*Tezl@CXU%H03Hmp}}_H5Jg5Sq{C zqv1FpT%-A*+v&C2VOE$}u~bD>HInBlgz5Y&D_F+B^;QExWxL<^&ria@_oov})263S ziYzf`>gc$=HEMK*@BQL~_wN39ae8oeex4PKGO^i2wmB&0jw+Lh%D=RLB9Xuq(uy*u za!ptcAeYWsRiIpGDpwR2gb+ z*8bs9(>97I0YS{f?WX|8Gdbn?XEq;0D6AZ(a=FrV2v^3%+0Y`p%)+ZKpV zj}DTYKDGPwbULkFbHy^sXs(CmbC+)r#<(SZ+Gr~;EnI(DCGR|jD71MeCuDI{O-0(d7g`eQ{F_$x}>ANo(y?HGZ3y+l~7dL zK*7aU;^op8zZq;;ds~f}A4NG(Nxt3hd97{`g-y?Gxej7{?)%>xw6h|&Y1(SHVV=Zs zR8X1{s;k&*xZ2_gCxm8629bv$0(}3`!@XgD4$aN+PN!iv zH7&iI93KQp9wvo&WWoBXQHj-)O4T`dFOaHg!kT;y4h0;Q zpR8_1(%lkI&|LmXBO}nsEhV zTf@k33>8DDglVdq)-!|N#q?sn@JAc&JWdf(P2Ff>FlG9V5{DE`323;UYG?@IkO8h5 zop#%7wtHJc1*`sisw+$ZtT=z1&d;-80cp;n<*i${e}4BT55Kv0dNB)bo`K#yir6+9L2L~c=`y_BAreA2melkfJVO7XaTNpnq`!- z;1cWhdvCn{@!vn02U%Ls((IOH$zzt19ai@*=}0v^hy!E1z9h9JWoRi4jts++uOXRO z$nG_$30xDrzR_qTiST-1eW5%H0#M(9t>dm|kb)LD8FX54k^lgjmZ52CL8n zo?{YD2UUx#rDv`MFj(mk&N3 zkNf@pbUKw>zCOyIBTdr;U8Quj{Xw$(s+aQayYGJa<$XC6Bw=qYtE@+l2)7k;Xj+<% z6~H-R9B{6y2t#L6)Y0}h z374ANj^@+03ijvWb30o}mLT0UOm7zDL~}ITOD-qNEZ@{%r`1q;JJ{W5Z0=l~92(&z z1Rx^RaXr)-BGY7xslWgEwQEl)knNwGU4|K`lH!$>5LSbg(8kxM9|cIP9DlL!%bnE% zsRYHZP6d#vsfk=H*j$QneB=mMfqM=k*#B_K*BiVe8X*A1PO-< zMwl_S)$86rI;E897||jdHuT4ni`~(HLsi#tv(;um;hgJvOp{QH=dNX)o==AjV|M8` zF<&yQyDdY-jAR;uAPsV;JGQ~NqLWl5v6cq`FkHk4*1X|Zr-@>9xNdN4@J0(xpFFeS zd~$HOv-jNL(eahsD`!L*WXk8=+S*($gVF`T)h098+uNJXW&qUv3{cG@K?wf`00960 z)+N@s000dGNklz zOY)S;W2&;r)>bByORc?Q$+kw4d69SpK@gV)(B1n$5&~r>*?wRVYzPp(bNXDqa~i1V zGgynX@VfVIT3&PI`p&WxwTu`xvcWZFw7M%oP^GJ#??T9&3x`Nkr7TV7QDm5U&-4HK zo9Be!oAE@!_{aXx(DgXuB8!A-(dHqnY;9Lv0E9t697YBNK`_^_Od$QQ8Q_}j4SKpl zT}w{|{E%t&)@~HVwrPh+Jn~~~ZDAle#@i1*vvwb)DTjaq7UC?@4MVLr@-+FIUw%8d zI$QJ1D;lvtp&VHh8IP2r-|v?ee4&D?!}IfVc~_Aw=#AAmm=JPbvF~@+Y%rsRb{7T_ zt~bhVF4lsg0uaJ#wf6GcuWx!?f-wYANT4FntXNT!<`N_VJUw|}sA_*Oz(jR)wKJZ6 z)~q22u}HgqeDv^9ol6np&-29E-k!q6X$h9(BUu%v{L5DcL}l>3tdQ~Ca8=!IFF@^VgE zR={M5 zVoB2P^>m66TrG-RA_T#4On&W6nCV@zqO+a@rJT^%tAu=n~hfizGU0q~Gr8e$f zqHw0@mPo=Tj=c=dq4x0M!^>WeS`{fI)U8G9w0ZgzQ`O#Xfiy;q14C6JWDw32MG;A) z=vGb?5huGO`b~e*8O>Ri7e;0cA}BrJowDA8^`6$2p}(iomSru&&~mm_M!m=eVF7x% z^jse6|E%bf*|-!&(9l!`V<-iHs9kdxVN`RhI2R|a`l}CvXUBV^APHGI@Mfl>9M|p6 zY~eaK%VjFzj-xG7jyS&<&32mgz4i{(v|jf^9?mP0X_}sE)mhATEG0{sVz}clvJK6u z)U0YlGmTtGy?t={#WP(|;^`oVSU`l+xLR`qmJ$|%+HTGwz*#!IA*$7C@BaJSA4h&9 zWl=9$pv_9e$|*q ziLH_-i6z8Zt)XTyj{>KCP-*W2mLSf!QFUtd(3@!KJY=zARFJA?SFeD({m-w@HM_pI ze=r=5%7`*{hkkh}def@L0Xw>k<*7K&e3`*Qs{juXaM zL0YZ7ak;yqn34bhf{{wrH8MiuG>4cthOuQCi!gqtovxobdroS66EM2FNOT!@&xdug)YBGUwfHh-u^pdkbwKYlV8 z3=l#Z!4P2x0fJBpA#=vFbg%9zigG=keR*;~2p#$hl(X)58m0MBvvDyP|Kj9OY9^`F zM4G(2y!_&52P)b;iW0^GZ)Q0T$zm$9;VjtG(UD_}1twITOvbkBYT-DVO`H+PaV|!qA%qYkND0M2 zESD1kpk^ADuGbBv=Z9g!DvsSW6+es+Rc~jDhFfVGBu<#%?AJfMKXjdz1}=uv$#i;9 zuWArL08tdktzD$3^B`!nS}u(Ie${z@-t7-|TJ3l~yNwbAq{0?L5-Yqt z?+=~%Xnu1g!r82QRXI4ZcaQATr&<3RV2lk*)Ac-oKLA$bY;N^lmKBU#j;H} z6*A7bswioew`-O0)Ejv7mw)nvOL;q<{QM`U-N66|xn&uyZCwmKQ$g*Db#^;*a9%Mq zL)Vg=SDNjkr_X?tS~M{Xhap;XYqq5irDicNh$5WEic0III+0qK<|axf99vnC`=g3m zA1^Z9>-5Jn1&Tb&v8F-Qi03}l_33mfIOA^pH?J=umajoCBY$@QA^aoIzmMVJ;oOGWwRr z1V{i77695RjWXdFx*x_W!30Q(&^$?PifTjz9K9b;A8c<0f!FZ@fyj%)?Q5po&iqI1 z28T$5!Eb-}=I4L;SDNYg!!D0P)pBIC80Bz(yQXk<6Y-tLbScbXm2@2@T zX=yQh-(Rtzs;U>3r%>d@B0N1keevSO#l^+uZSFRhm9JVP5GC)u;4ZvHjhlKP-77V;e5_BW+P5jI|)4osn*=L+-=LP zfGnE(z6m*WYPN#HFb;06nMBo-&w-+hY#0f=s(Fq7l-)i)1P?Wbkm&z0KjxQxrhEec^6vo=+Q}*<;&Mi6_e%j zR44`K5Fr93LI@)a5SEfpqf|Goo9V1xagH0cC=)7yDVGpoFUhw|)vnh6=eqa#gTn-? z4hCm8qdg0ECV`{Cz8^;{tsI<8#v`n#ED8tL?`xI;Ao~9ORkOJ@meC#y=fLKbfEGR<=pFDZ8?5GAMhXVlkSmn!N7>_56 zu{A}tnIJ+4fFu}6DImrKV+bIW93mtos5=&gViJT6$FdY0B3BHveUh?8Fk46kSrx5P;lYe6#^3+?yYW00 zYXZ4U0Ttkv9u^c5T7D11@P7|USEsEq;pK0W$)s@i1@rew8N7V?veW6TMX(VF7qsZX z!NJnfQJD(~5Cj;(Wh9CqR0yh?#*G(XjBQPw1mTura{!vQMihl`rmL#R*iTQ6#{PV? zh;)kQN!qNs0n2QSdO?T?ZdaWs$&J(xIC%Z))t(0Yh*2P8iGyI?odjQ>9?k@`>J2{w z7~}+NDI^Pjgo9DkeW$2uu9-PCQh`T|SE=AhWYpV|#e?e$h`>Mn=c}O~m+Z`jZrxMJ zlAHX$Q-KZB^alU{0RR8^zV2rL01TH&L_t)PU0IXlMqbZTsk;u<(OunB(=$8ljE7-t z2$mptVcAzd_+u=e!=Hk008cz{L=X!L3xt8SS+Bvn_8j)uJ$+Pn-KATZ%1j>ArB>C9 zHFH_Z0WYM|04e~b0uUg8iIinh2&g1AD1b1^bAuY0DDx~0^YV^wEi#b{aWV*APUf02 z&$2CyAvQc_63e-W#6i#r4)08_uD&`uOVaGfB##HJg(R&`Kq$);=motYlV4mc48?W2 z&J`?$dNo^wtA!|~GCL{2vrU*KvP(2Uz|tI9ZLd4P6y;eqIzG;p(?9*;54WSUDJJ)^ zuWr0R5_387O#DDk6=daG2zMwZ1A6P5p z&!0bQ9IZz>tYa^G&<}^hI8Ja~P)Rouuj4qbWvo)lvMeELPxlV1Z#qzS)uQU*fYtyb zRMCWB2mw$40f?kj1Y?Hb(>ud3%K?CW&)#G?rKBj8hA`-~*Cn{`;$hogh8vTTt1$CT zS{B*Mt3}{hqB&Zf(^LO&Xf;y7-2U-q0tJ8M1$Y`0cEDa%=PRd<|Sd)b(C}{nx`VkiZoo8oO8qNnFN#tl!A>P z>+ss@4GE&`F{8J{^-juKKqAHpKlVrFKZ!$H`y{fmj535d#&H^CrRr2eo^F2 ztgz#FjlAbt5>#E@EJ@Ksc2CGa-}jG?k5{V|0HEFORF)k88fZXoT%no}10tlAtV}h^ zOevL1^fJl2Ew5#a)axC&IN`kD<*%=nPmlW+V@k=XfKeFp zEE&J^F6s8Ul)Zz|px67~Uwq6Mb-k9z66yzrmQv&}-7o`#A|q~V7AE7P!+0@Yra2IN zlW~tx9j}4q5t-*!`(S+XH~;d_pPx=QDc|DTG=XmA?XF$~T-R-Ii`!PQ^ld4fThrmD zV3XEr3-^9<_sx&(+TeyH*|+hEqFAj~)e*yBmA|@rUV~tWDNqtZfV3op0If8{)dOK> zN-1?&GK|}v8|6h&s)1(~TmXc^oVPn2S>yndj_1w7B#WbWkNca9`zAv`&A9SgZM!$@ zwp!S7UY=i#O&JTlTt}v97g_4qwryD)U`#E_sBbaMjLmGSv$aL(d_Mo)y)jb7MnI3E zObKfFl90du*}rAPU2fvClns{*e1o6t48*;tB=}Bm-IhOBLKuKslnEEH1)L$h%;j>urc%d{gh}MI2gcyYSY7<(zyJKR7iU?{x1$j3 z@|>N4ze|$uJo{$DmgQ8yA%qNr>TSMRt((@M*VC_gq)CQdakN7cj3CfTD~S*U2tzG_ zl2vR0XiYKH5T!!pLK@5**v6(11e3t`jt7C`I2kW5musKGgMP3P%42k;$U)E%m=zFH zj4(6Xoq+Q~L@SKwe16>u`pomG%+C|GSgd_iuC?Jiwr^SU$$2!paC9N4la=tux3Y{= z0=m5bAgZZBP4=H3{p^?L^Vjo8-wrR>1XOEq@7@XLqFM&=+r&ttP#84?>I}#1tX~l!6G!QdAL3fH2U&Wrk@OvJ|-}?*^?S-+DO<1JAwM#253G ziGgd`TI&~=Q(2_<2LWOhHmpS$VnpLKqNY6_9VVBr<{T)9lljCU5E^zEu8hvWB*bgA z5j7Nqu4P`W)^U<*KX8#W7$vsHp>h80i^GGVONl15Pym+lGB5w}(=QiMv4?vT>-BnF zy(Z$V$i7t+H_@s#)Ofi@{iYJK<@>iMs%iNC`|t0~jGa5``qH}ID*Y-KrPc~*2_O<& zXoQuNT1lWJ1ey>MXIUW?f`Ah8U#~8ulnw#27<<#PRSH2BvqzV6!QcyurhIvV1|aF9z3Y^tv#te91i!`RBbSGE@}#iQecF%EHQ!r zVGW^%7-$JG(Lm3lEY1s}_~T*c(6{q=^UKR6vn+`4GRZNa%(NEEWt8U%;xOkAkNci& z7EvgROakb4`{!5Jw(ay7ws`6h9Y#?yIg?Ul8iKMIocxZ_>VN;qdy#~;Wd)A?`tk}Z z0ijkHQ=6Fv&ADiIds(#l{AzwWjS5lMuLeK*(Vuyq-x&US4}~hc)ogEcxoPjb^G@?8 z_PlnjQ`Vlf?JC9_p{kV1^PF?Or}I`VO_N>SU?*hSkQUHD0AZxcQUj=Exm9;jHFaB# zy-4!ct5^aQxNa_$iBVR{$9Io^_3hb{QLxHI#>LQKtDHao_Uv-HP>9SoQOmWd?adbp zsgaGed368a&e(Q5%QTVc0AjelKY9IaQA!hO+raD98bj%s^x}FBc~9c3gD+B7c5w<}P)RUv02k53aJ(x@;+l~+bh<(2Www{kVe6<-I-}P*B zetlI!?E7AtWj3XX=UE)Bk`y`ZaC#YXX=`CJ%e0*^3MF&%JT<&-2WDT##b5mOPhOl| z4+g`!IK>bx}kg(&x8;Gpnz6YgaB%(0I->na$!^a>}qM7=H+bh^zPBu)8&I< zcNP~=NzOS`Wtf-m9{1KsW`Gj%%Cc2SFisLlj`lQsVCO^Ra$cO zvsxC7Tdj6Om*2zlCaHQW9(J5fT z%_$*i!RHre5L1D$EQM!VlCVeb{XsUrMpB+F!@_VOLXsD098c%VIoJI=<5jfz+mC;J zv505$eV+dRYI`PBy$c#?@)eW+KL7v#|NnU(x0V0^2~tT!K~$7oS(6*L5$*;s7w=t? z+C!JMlAV;}xKiafc}U*!?BANaCzThMoTz*yj$^4-UVFVm`4?>ovnW3^o(X}6$hGCmVzulU9ezVyMlPpP+c@TCx zy~)KSA|6M}i-q@_#}7psEfrkPW=t4olZ()si{7Bw?KK?-0KR+v-SOGz{rme@emoh! z+B>{QOf(!PMx%G{VaP3JT3;T&_~K;p_kVm?qH905s@A}$1Dh@4@b!2?JLk-t2e$t+4GL+Uro zBwk*)!K>-)y~8`E!FvrSOJb8VKyEi$Nb1FSdXq6q;=}t7gD`AxVhFFUZr*wF?$zXV zzrQON)1Gadk1zW>UBhl%`JoEj@jU46?aN@^-#d75`r}`}ett4>GpXJV>o>r!6>KV` z^=DS3F3eAGrs;HAM$ifuXuV-3-+!v_{#A9&4;#F{CZVjBC?e#*c$TGdrMtAuRER_> z$z-=-HB9TmTc*HUwjCzfd>NhH`0w03@S}t=ywhu^akSIx9dzuzEzW0NkHdR=yM)ZJ zY-U;~Cnw1G_|IH%Ko>!F-mb@zZbr`@_VIl1xWm2kVxJ zRpqMTpu0e~JcGF7IIBeVh=`CUlq}INw>4==CrBxE=gu9^^Q!E>rQs5NZI-q&L6S%a zL8M60>Xk*#^Hdp}^L#RrD#~OQ#7V<4I*t`a(RASr+D#(5n7MJ9EuuuqtR+L0q+uKz zTtsOivlIvxesKTZy_SFkTaW)(d{_^S5ufBgh zb)$mjS}bc5+)8h&9o&M#Hc?nzywPZ`;$@r_dGkwuOZSJUm=!1@@;q1HfxQ*}LXWM9 z)W~IsC|7y9d7eF5F{YG+JRDnWB~wZgz%oucrnvT_mSdk^-yH1^8zzh6Bn+33Mpt1f z6}@spQ{aRBeQz;a1j`IDizBPiWLdgQ<)ee4Xm+{XXtg_#gh&0(z{ImqHXU;`z5Lr3 zFDA1tf*nV9zlbeZgSJ1UKi&(FU7X*!Yu|wy35pppstU4Yq^Zwp08phhFJ_8z~=3ORxoYoe|2x&)XjihG7^Mh3h;#Ik`#^ zXPk1MnK9IMh~%EIR4SE9F_vZ-3L^t%39gWRd~|Pb(Dx+-aVi*VG@7KOQrW`wW{dgM z_3!Qte;AzyQ8e=c&s{VPSSp6X7`+||$A0>sA3yx~4==y}{&wgAfGo?-4+qg)yEpXx zEzt)6?DclamdZqFTeMI0P_$Z1N^hsS5TP5NwG}9+tYp3h08?@=eBWLSIbMdY1*1%S#JQ>^vv1_ z>%?gk)TX?v8{4*}RIrLhpgsto$wB!PhDeB92p}S4#X@!dj{uP|9>z(g=y12^E+Z-B z!^8cn`J4g#>d}Ljqt_;bnI9hZ+Q%2O@gg`n82Vx0r%I99@3t~T#LNx7&yQc7Ub@$F zPs6J&(fTB&%JRAaF7wB&Yie^KER?N2G1dnI0g6p}8_J)`L|ZlbH1zRjMGWF}+MRt^0UWzFA%TDcDQ<}mX-BY1&5 z=t`Z;+^!{K1L3^%9U)efxgiZ_n*0jQ{>jlLleFve0T3lUiH8UZkd3|S_#IF1#O zl5*~P94R5RIPMIFtl0^C&$jK^!fjY=*s&TW_{wSI=%EJi`Wa6nXD+)qQ_8`^374f z+E<{dSGKJ;_vcTYm`asq>KE^S@buZ|X|_sZ zS9KriOjh339G>#N^dPpXDh-V-<+?Q7CJO%p00960sqokF000HRNklRsIxF$g|HP)I-#HAn72C7yXP;zRDo=bjV~9|T=NK_q8n4eIXpJ@nMqUvB zoKs5ek*@0ZdrwbKlO`=!5Rq;tbUU4&&o3dp^$g+l^%WLea7`@(dzR%?7>D*vX&S9S z*Ob5#*xK4WJ3A}j-P_w!i-K~DpGtb%_Vo0#H5M*9RgfkoG#dJW#Nz}&?an!IVC*qA zx&N@IJ8rDBhe)Am*j7+!)i_v|WPnjlfjh~?&`zm4yvU zMPmxN^1o)6QrxjZ*_}o`a&4;u8+T^)WkwQZJRVp4rXrel{AWOwE^eS-SXk(GJEPIK z2!uFFGxU|-V!EUz)KD>xgiu;k_51h#Y;QGX#FHr;9DKgKyd-1Kw9py?*q2(gxh`r8 z96h`+-x6p(si=oox@^uAKOsmBpX(8ak*Lb^^GmPSvuW?G{S{S4Uz?*mSP81q?ariE zn*bfmBciXbF9bv+RnQpY)zuY#ZB^&WiRJEa*IH2{8MyBI{;>k(2DHN=QA7?7J`VIagNDQ?I6CCOI_V(6~ zEL!BPEyWGfrBu%bH5Xqt)ii0tH#aw_X0ZoHsVaIOJxPD_+tInXxs;+SRXQGzVN#2W zi)(9ZX!g<3(R6*6?d>h8#z3tI;vkj7!!M+xQA9lY(LRFcG4Q>;dx4VT4t&ezG;jzn z?AYDi{r2r2v8^LwezuCO_F>e~o>k<22nDI6y^|PYx7%G`Uq3thSKZLMfT_92Y7lyg z-lG1Db*<@3OG{Y4E>wG~Fs8-+)7(QL0QEhI;71Pmi|c6_ld2}Kn{i3?Ba4ZMc>8Et z3gU~lDKf@o0Bd5oBz;?p&>{;1oF)=iR#pdt0WS9faCj90@Qwl1I^6v?g%kQ+2;g_E zFSt+9fmZZI1UrTXm)J@HDA+j(px`K~N1^XnvzESto=zqc=(04@a-klP9y@~!lApd8 zNwEsB+Eo&z-|zF>^ctDM4(f;rNA;AqSREJWXL1LI%=p^2#gKCWeq57jiwbX+UEB`x zLpR_Ie9x2Q1hhMaHhCUOz#3;wd$1%2|ul#xQW&vk(v`xY+_`(rU z5XNz2xtx#r0i3Ife2C5n_*&c%HF$C6$O@y2WMCrF@Au!nU4DFgG<3vx8Jfhfs))?Y z%uFb$5VMdOF+7c`%ErdV{{CO*=jRLxAiB7?sBo0pdp|$FAjF@RIHR~GtFHZ;BS=HD zS=L&tFB1{oZkjT1XRZi27g6IdQ-U{E4!Ch?m?X!tX*GxoM zuFL~$+Mpe`oFIz}{4Hr!sgfK58L2wR%R^TjPufSaj#r!^A|F2dkq!bPfi^0NGR2Ae zs3Tu_eSHn)t)m6}O<}$W11Dznj(K=*>IAwaF%HCg0sAPcpHT@lH!QNQ6cz?3y(egZ zXKVTT^=}5Z_*7LDpQfCio{GrM&Q2#?b9i`|)+79`AhyXEnGDo=$PyCMOMn_w_5S`I z*foj}2ph9g+7Dk;<=wmY4-XHx(f0QC-Q6A29SGN=`(Fn${A=}F8+WHN91dxti1I_y zt))_yo12^e0RRC1{{Ur9tkRE=FtPa`=HE%z+Z1SJe1NDw7E5(oGJFu;Ku z7cR5^Z09d=qy5=z2I0}9!g=bB-|Rx%3LTqZ(=?fJ>W3>b^r=j@`&M>Lp|sC;a&*G(Wi>jV zy6B~mBmY&^Mw^uZ2w{zL{`nMRq|MFE<#OrjY}TV+<`Ge^*K;}c7NuoK>Bz7P!;vrm z;OsP{MTi8%w{QPtzr_1r^4GZxkm zJNm5w;PdA{`QY;M5($Rf0goC=%UluaCo#CT7yv0)F%h5CP~NIj_457uUriOf z>f0tINMr7CDoOT9Iw#?j+%|d%A^s5-fn^53ck#D(GYaZCxbb`*C~up{4do3iS8hw3 zqF*e1%qk*=q5~{w@NuWJ@%{VDkA@_I^)q@2`nFioIJQt#c1z>~5p8X~E6Ru?l6s=t zWeHLc#D$y6arTmWuZ^YYKVOv!0Wam+xm~ZNaGY}7me_!xe)7SgKOT?W9QOG5crX~$ zDp}*HqT8cM?EBNoos5#l}=4B*W&+SvF- zZXbq8D;v828jzGWa5vl%5sclwey%f=Co6lSvh#+uK`4 zyx-rd7O>-ythy0%Zb4s78~8F=z8GDa&*x|ayiYXO|N8nWV|p9~rCh&qPFRqgMOz;nbBeX2c>@y)m8LuC;VjQJ8O zruYp4m#xkXqH%=N2o5UMpFhhJ^Op2+xm=FN;}TWCGz49iaf760-P->e0IY5Oejj@3 zixAPn!{0^pQrY-YWdMf5U6*rlanT~2sx1Zv$ag50Dxl5*#*DJx51IDJOPQ&>tTe|M z^T#+2@D+4f}|LbyYZfEJu<){6YPz*P4*obrBHG>_JUz*4 z(i$6fc6J^gAFIt73#d&9>n)Lfg~iwS^78WZ^dz|<&G?OxW_4EQ1Lk953D}C3T&-3I z2M2}kl6je?;c&?L)9F-NsPWN?{_?ce5eA%ByDLPY-|t(KN>?rVgxdQ*w`M-1&7i3D P00000NkvXXu0mjfrcII8 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/92.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/92.png new file mode 100644 index 0000000000000000000000000000000000000000..12a88e690a0ced40adb920244c36984a36fa64d6 GIT binary patch literal 19177 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 V1<$U=H!A=D002ovPDHLkV1k00s-pk^ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/105.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/105.png new file mode 100644 index 0000000000000000000000000000000000000000..c85d8322aa1f680a5c9fa48e78f1ca82fec29882 GIT binary patch literal 1902 zcmV-!2a))RP)WZ|4463~@8K>)l^0DU2s3c(RW#>|ogI+uT@PkVs6j#3e zroHvMfLx#?z&Y3V9^14CSn@KL0077TSf^<=eel@K0awiq|MF{k=U(T^ch@ItrB1WG zvsylJ^iZXC{Nm?d`|YL)K;gXsZs0r;!Z{KENdpox4ujKkC)S^=jE?WGRp=#*_qj;l}4-CFu)OxAO}^(LS5NtjG<&^9CP;e z@uT-|EtH+PN-Z0%ZnoE+ZDmCsn$MbfUzOqP$?9{Lrb(%Ea&GpkFF(5du-&+StwcIf zfMe_dyi%`sI~_NcSOOZEkY8N>?9Rgc`sz~weOG=ShNNz}k~Et`CcHK^@#vrRPd+{~ zwSVHBGl!R!*X})Bx$)bBOBc^A%>VJC*+6VhAOVbg(QbRdWyS!+6wlAk3yco8kh-C4 zWTd-iyte#Q{k-UQ`m3wWZnyaP>aE9(jg8ILkvFCnm)AP|;_|0^fBgQMi=zU_rMFI< z+O>OkqtS3>V;qEW5T(ZGO3TU$c^7%FUxBj3l_n>4uC6xoLOXU;JDtw(aQWoi?D=zZ zp})Dfa{I5FcLj8VdXj*p<>lqajR5=$00960RLyT)0009mNklM>n+Km45Nfm%Go7?ze_$n9XMCXtFEp zkkXo&nXm2k_8S6}W+VitEX1abu^RNlt($Ly@%GIdWm6v>9sKq5H__Mc?F_&A;^VKs z{qBzke>zDEVVCR*3!+0_5$aVHA>EK?^F?E(fB=y|TQ*h*Wm%St^|ETu$MaAWAzb`3 zJ-jp8k>dFGht)4X9nZ#pyB{b(LV>QZD+Hh&qB7K$gh&AcT7wc1C{RWSCGA;tGuGMwt@)Ss;ugWfyma` zi-Y<2B#HpE7gjw1O0t8z?V2#0( zAOWh@P28w!6D~@9tf! zIk*A}WJO8CS2E-AyL|#_9IxFAE zwO2>Uk<>KI{EZMHIT9jZmhuRgCe&t1&gOH6%ZpoW6q(?&Jca~%ULj8(j)OOAG1I$> o>2wk#cXr;z|1QD|8Cn?dA1hU>=)$pKVgLXD07*qoM6N<$g0pIgasU7T literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/106.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/106.png new file mode 100644 index 0000000000000000000000000000000000000000..8217fcbac5d4cad433026e10b549811f28729843 GIT binary patch literal 1946 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/109.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/109.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bce7cd9d2f79a07132364a6048e2597497c577 GIT binary patch literal 1728 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/110.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/110.png new file mode 100644 index 0000000000000000000000000000000000000000..1cae2cbb13d34b28b77f98b758672b9a33f6ee92 GIT binary patch literal 1971 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/114.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/114.png new file mode 100644 index 0000000000000000000000000000000000000000..3c06061839dd39830babf7fe3806061b88286598 GIT binary patch literal 2262 zcmV;{2r2i8P)UNjvHlUni37p}XZ!<3E#Viqsr+1(S01?m|0DuQQ=l}u&6C~aNKn+CIgn&W>5H(?Hf(`%}Llp3gsu_zYY5+)X zNe@s*OM4VdUyG*6r~#QwedNg7ExDYkksv1~Owyo_8P(vLfWpUYtTJxYs%uC-dNp=* zv?O9oxjfHgA_zpFMl^sLv02eT)K30A5jiKeMQyfJD$SM40s$x{NaBZU(8u(#h)Oay zJ-vIPSX4CvF#tg(35W@yMod<01`yJLUQ9;RlAdubc_StONqR75Tu)|ATk$b{B%&li znxu*(Zm}5&Tg7BR2U5~2s?ES;;2Q9;m;kCGhKw0EByl4Gdb%cDlfDTMK4}yNA{*q` zBok398h{So0g_}D*s#B6sH=O>hB-$Fop+JijEDha#x=SoT@5};bW?)qEksjheGE}L z0|>A&mLLc+#V2=yZeb>iNG zLVNqsw?2Jbx%c3oyBn121~LjU5Y+@5K+?@3LBB9xwl>(*-d|l`?(OOA>+cJK;L&V( zX|+M>$5{Sbu)FT27ri# z2}FaWQvbgM3E=4oQ^}4Fty=(ix=B|3J`rNa7ChyP9SL##KmHSgO z`Fx?fxc}wIPX_iIxf1q=@lU%qm!@_6y#!`aAidQ-MsPF-8;8)ExDEDYd2z>%fr;CHjE(&iIUGFr!oc8QtyZg47T}|Q0RRC1 z|F?{>5dZ)LNJ&INR8^MSZ&XDb$A7<>vwOCCDcyBjma_M@U`qoA5(#aAqKR@5;mJph z!AFh37ku%-K%&Nf!Nf)pFCp?qFb3;`DZQX#qlUI@&$iuOpisKo-Lt#roSB~wb9RgK zI&*%vIrIH~_?vIPGci8V;t!0Bd}*2{AeKrc07CS5y}o+ARy8Y}gXZyRT-)3%_xGlI zy3*lrc;xEMU~oq$sDJj+8<#)-aeVBC1YBGy{BiHE`0iaR%S-RS_b!0s`wt$OHx{_Z zmtR;Af{<&79Fa>Y8RJq?AmH!r?paw~Kd`@>V->+}Y4HX8{`0R71KC{DW^-%BqH}-d zuH#q$lB7Lz|DWT>j>clKWHPDw{GpSl&n_$#2sm;ta812xjbpuPdb~czaelvhSN8>t z`P@cP96EU5&wKw0$!F&lW4k&Noso|}`J#W{A=BI>X@hh~I^l5J`lCmYNMv?q21mZX z`Sb13R3dJgTZKZQTCLr>^;0^XHgYr4sxiiOJrHb-NYWg^gFD)@nRu;E#=@#3tu>^7 zJMwAHD7~8cf z?~FZoFdy2{zOuUJ4@OhT&RVs2VtAlx>ALP&D&)*^X{%J!y&fU#`0h9Wj*k9Psg$Rt zrcirsFA!-ctXdhQlZbcPwsr2@`Pa^zo}3upc=9;bnTSTC-(9daZMu4gjYiOH#K zw(I)!8?T-^T`m_>$@s6Mx6`R)-k3KGBcC_&`Fum~7;0@AGQ735wDZO(@il(fm zGug$ZwO3A_Tv}WVha*on%gJ8(VfC!*0Ohcx*fP@IhTuuVO za;4&CcB40P5CMP`%~?y8qobpPF`i7Orl+R?5LB&<18TrDK!(Tx5K(V!MqvnnKuc-! zsms`^71bhgK$TfV;pmbM2LK|e2Gjs`smKZdxFR@pr9@=a>p;S7MfHd5nI8ic0Rw9e k0TGzGWI)(9c65vW50z?Lm9d{vTmS$707*qoM6N<$f+giXB>(^b literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/115.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/115.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2c3ef809468ad85eb0e2f19cb0821494412c24 GIT binary patch literal 1954 zcmV;T2VMAyP)DBp@h> z@=$~#K|o1OpBf3Jp#p@&KcJ?ep`qj_P(`9cqTmNmM6o0C5OKyfGh@$;=XK}ad-kHZ zW2c}y+B#a=`&&zkY#1CMrTmTr1nK2rpSuk6RmKg}ot1>U)f*BxHzIAcy%C!&1^U0N) zS7+s%F~F5(MVgg9FVdtSqXB>sE)c350*nj<$;=?sA4n+4)`B&o1XYPKSZ2)3S{b83 z@@4XQiNed1T$RJlBnXg74qQhg)<7$CvGW@KPmlqy&1Z%MdRBnWVk(dsE&jK)S-5jUz#s$7+y?e#x< zE0tdBoY{8u z`nAz`TqCh8aAk5J!8>>E?CkEq2(q)edDJ_CORn3uZhZCSqt5m_C;e_K#@!b$cb+_% zFY|JdzdD*6_KqceeD7XamakvGp3bK$9s~#^g_Wg1f6ymcr>K!N^7-Q7!-tL8;Fq6& zdjDKJKG^H{VzBpecDT3RY^24aI~Y1-(%0X9clYjH0E7NuvCLJINUGyt^^2JiwK_nI zMx%|*jayeP|Nh(KW_Ne=?638cUjO;ia?o>`FY|**{=wx-n+;3w-r@deG=lStyxYfBh9FAh6 z`R{P@?*4Q-9gjyzj#$$XK)3?Q?*9HN-IX9g2*w}2d30UVQTO@SV{!gc|6tEW zpO0VkjxLH;H zJnI7pUwrmy^WE#OdV_}fS}P)-rD8c4O&jfYQ7rF&c)Qc-l=JD~EMFE?Ri>=fR1yOr zs7i31_3?iI00960m5~W#000AVNklVdu>*Tpt+d*AX6N~|umUAqG#Ppd z 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/12.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/12.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3922e7361d815aad76d86973d18d6aa9c3ed30 GIT binary patch literal 1915 zcmV->2ZZ>EP)*glQUyR2&fyMc@Gfz9vpUflj+! z6b0%;BN3}&1S(L0h>#E)70wkNBgcX$Ne`IJC;6|xF;hZBqW<+gZ1i%pj5bvcA5 >IfOS1#>|2#X17AR#dJzsy@LoWfFz2h zW#vJI0Ekrp1REleDN&K`eKSIIol!wW5Gcuj%laA#O;jT1VnNGj+iEA$Pz$dwl?l;tmor#QA|$y z1E^i>cC^et`e6CZ;qia_`&Xg^P*v~!m7XRuG9gFK4;_Pig-1nt;>q_4&I)+T6zJ34^sbn;doy8OV83XcRY8zbUydY zJ;(XQ_Sg5Taw00nr~P3*2I#7CKFiWH6_qqe2E$RiwQyaWV2@t)Q1CDkX&7mmckTYw zy)VA|_M82K!?!1=YV7<%Yjb_$q(8_`5R1pppwZ~y$_`7bY?Z*FXan$*yfiHZWAs0c^S&(9Ap&fD$QpRZp1wX-vIK5jHs z&0?oDDa)PL|B4`vtWiyqxU5PM=??~f|Fg5avhwoRmtoMhS_>p>D1eIefFr|vzPZ#% zlPHRlFYiA%KI-+3Pllt@@nkyA^Q_r?b8sYr)BZq3M){bY<6;8xlg*9WYipn1y}P@+ zx4XL+O#UAL0RR8OzEOJs00VzXL_t(tmd$S)MHIl_n_Z^~{t9v3Dg`N#sEeRco3^y1 zNyPyKRU}TFqQU_yQ1IoyTEz z*6WN`qxsUl_vXEMzo!cTP9)Q3{L1^Te{{qIPY;7MOA5G|b zy=GLZ2bOJno)1JqkRR|M43p^-6$u`!tZZ#>;f&5OLKSIA_yakbU+PJLu@t8fzPXz>cxBp z0Qy7MIdc%fvh9KAdA2^hewCR*~d*MU-%^P1( z-}5`2Gmmo_-_b`=tRtcvkCJOaXG{SW5e1RdCw-!^y_( zeRMbSn9`0^2_h6@WAXpKek})MWke!LoD)Vw{{sa1{MvO7DUbjF002ovPDHLkV1mL{ Bi1h#f literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/120.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/120.png new file mode 100644 index 0000000000000000000000000000000000000000..4c299f7bc30776c1ab05a3f648396406a10e6e19 GIT binary patch literal 2150 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/123.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/123.png new file mode 100644 index 0000000000000000000000000000000000000000..18fbe11b25513e9dcfeea9fdf8ff774c29fd7f86 GIT binary patch literal 1940 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/125.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/125.png new file mode 100644 index 0000000000000000000000000000000000000000..460b50f648d941a0d0893614a2d74856e4cd137e GIT binary patch literal 1751 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/127.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/127.png new file mode 100644 index 0000000000000000000000000000000000000000..0113f79bb735d96294028dd61dce480a3cd19424 GIT binary patch literal 1670 zcmV;126_33P)!K%*}HrDbvrZNMbJHa zd!q^7NImb>tEw)-RisG~Bti=a5+Hy8b_#$5jaC4XgxGSL(JCBhD2#N?T z6rl*{s^e96gLzs3ngA%m9B8oO&fPa@1J03d+`9nArjHh`i+ z1Cp)+NHYL=A;k<|q5s!>2Dk-I%cw~Jq`^G29T^k@T?rcfUOumY&>%BIr~?RdiC#}D zpdjn<_MDKEln;<Keew$%)kKoVurZR>BIJmx9{0LZfzt z7(k;d>1+CmuA-}G4l!hF_0x8oL(7%9!TxZy-Xt053Ydqa&?syW8j!Fei=mjb?YYXx zSypw^Y_9CMV^Erh`F>t6IH0iEB7ha7DRxRaU-7JTg3BY$t!|ErpML)Fx8MJM^xt3KJ^V@`^bU>yqyUNLls1+eeZ_2>9r#-r=pKIi!{?uV zSQ(xhR&BFbE-p@=oGDgeJzIr%`_^l}K7K4kl8W86Xvr?>i6(olQh1mv%Idw3@4x@< z8|tuHVmfIQt=_8-hJ&^_n@`V=4u>z^x}6e2vCZ3O8bT^O>A-Z!JDQUskk8$F>+LT; zxnB|;v7FD$imI~l_)H4Z$+Lrl!&kif{+q99P}^OTP-zcAN=Xuv3+Ze6y1(%{J%9Gn z3rCYFCQ}GDo6X1Lf6t#z7K_Wn!%+;~>67tlKBrlaedkSF(F|l&RrD3h0bBtfMJAw| zFTeWdAMIiuR?E#|u^Nx(zdZV9xd^k_^y1=TyjXlXF_KL7v#|NjfZ ziy{C30{=-wK~!y4U2hvz5Iu8uvx#Lpc4P&$2&HvX5TpUAJc4-3Bk&8L|FrEZ571UE z&=OHZ9ojgy6YqLIob29vrw@1T?lxkzTG^}B+?g{o=Ntv7vNFPG%tXqqYq+r$4*LCV zJ2^>>(fwYuzdx$<)gQl4<7HkHd9lu(KKacUV|C^84cutE9d9JAH1MwZ1IcDlh@K4t#+v(NW#-{tBmPt!Pw{wHiJQUROFDI$QuU^|Huz>06Mnyu*!hon@Q=WOj)hX=#K@bROEo+vRI zjk?|L#zyq|_1}IE9OL$G5GgiV&SxXLD6AI%?f?zzYx*$9>wlZIAOOnmo^g#8d_?+* zNQ9F}egDIcK^WG=38D|4*KRoj0YzP@$ng}I2+T&vM36Pi=J@!p{qgwX;@oApck5QN zNI)?)Q zh&DInOYZ?CdOg1W&a%wCab_(5Ae?HAm`ibnKKD9A<6KFmpzd(njeEg)4<5qfm^)9@ QHUIzs07*qoM6N<$g5={FkpKVy literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/128.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/128.png new file mode 100644 index 0000000000000000000000000000000000000000..b323d1e136735d529e45ea8dbaddb9ac4f5c1496 GIT binary patch literal 1937 zcmV;C2X6R@P)Z&Xzr{=ReW+mMWCelD4!+ZD5$0 z&V8QG#hoFX)$cCOcfQ~ExGWnwAe96-A!q0lmb3r~14KgL1R#-|AbNQ4A%f&*f~K`D^B4ji7q6%0WjM-~l>mKN{`lCjWC6-kkk z0Fl;uw$HZ&EMdTm*Otwj*B;gqsr}vA&t!}UkMs?*T|E*&BD5SLr%;HbR7e3QB+l8Y zWh^;>ge3(8QFP+?iF_gd;8DF9ga8cN$C4l|Q8e_36p-M+Seb@!QYM3>6mS4{6g&q+ zPO%gVu@pHuAd?$_Ax!oLkSBaY%SJ@DDHZetdUgm{ zz$fyC`L;6f2tx?4BmhYOLZ?KMF|KppBvLGF=-n7g>fn-XZ++h<;E|TtH8y(W@L|*8 zZU701wCX0=8rgfR+2J4sbvs36KClK$4~zk(Uk~y5D$Es&@I6k|RyI zRI4{zPO*>*p;IWhPUK7`Y__Nc2;>Z%gCK#`YPA_g_4W0Ph4pi%KmW9+PzqXsVY)EC z&|D8v7oVS;y!QLGu$7er4lo_hGKYN961LyBAT#MD?Aw3fnep*LvAEuBw!&~|Y~<9( zCvV@mS*dj0UYK=J8n)K|ymh@RU+mk^=T{1iAZXN^$P6b8ket+k@?!%se1ym{yBh3_u^bNQ=t-}aQM13kSDnzbzhL&qjw{{H-rE6aDS z;j!0VIe1_{I(^I=77RURVG%d^)=7boO3&`yw{v`a^3tWX|JL$dh0ne?ef0SwJKx^Z zTxkv#2bY`o-a7b3xm^0|&eV;$*&Wr9$R)St=4+4Y&0537F@d~kCpfckeAg}x_%@aj z*Dk@t#KgkF!qUB!ci(?+Ti?Lc-1KsNdGGc;-Co!3ZDU`a{ra~XS5z=Prm`{r)Q#J- zNs`tYjVOq082N0QkqDANTEOPWRLUYGV0LbhX=Qx zzj$tXdV1^Va1aL7-b%4jd~x3k|IRP%7~MHHKVLplnVFfnaOvV|qY*hrC>1(Mk#Fb$ z+0WI>9?a4%VR31ZKu@*n%~xN)J~Q>hm7m@@dVH*J`SB=C;r_wd znOhHQ4~Vi{Q55gfpPP#{1Mha{&+IpvVw$O(`*Mv-z(lv5DG2w1R}HO|_e{qoLC_jFed z{V{eJjWj#ETh;aP>eWkJ>>P+5fCPra(Q>OLNSt42KmG0bjn1_jom)-$c6K~lUcU7H zb5tHJ$tpabwarvpCCVn``U8|M^EFnG>Lo zd;J&h-;A{S(C^JEv$}ezG^RWlkH+KiEEmRrYkF{0WiA4TH0t=`Qg8V17;*?S}J8``EWel8|)uVrn90fwQfKdV~9|>O#oPC3qlxg@M-#7UAZtC zOdmgc^4;xw=aZGi`9&$^MyCUf;<%U`tKoE_3)4VCh8qxtQXr2`>$Ve-1S}vE^7M(o zBmlB3n`Vg;eTgE2I-&-k^77)!`qlN#{$TGzw|jHrnq;vk8r|LA*`=1A7Ft(YYo)7s^83TD zJ@3sUlhW|Bi=Da72EhHFe`r%$!fe0Zt|s|>y0CfW>rcBMKke@yD{YmAF%qc21QKCd z4RiD%{UZb(FPF;R>u#21cOE_{$2nPOQ;mn?gDfjb#Y#VVa6dcB3Z)3-(CEAethls7 zqltW#Tqh)801^1BlCrh-RU=L3Ec(4(r7FWLiQ4V<;P8-Yyq3(Rbf?{uipmd;&w!kTT*FA{qjl!RtaC3gHU*F;rN<_vg z0SrhWA#z6w{2%D<@>~})6$B!38^{9LXjB;!!=ICqn56)Kiap`biQwI%xwKT4rTgYT Xh5Zve8A-Pt00000NkvXXu0mjfKMkdK literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/129.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/129.png new file mode 100644 index 0000000000000000000000000000000000000000..e30992e22500b9648631ba0d4fc779ef63b6712e GIT binary patch literal 1823 zcmV+)2jKXLP)2XLmljt2oR| zEHN5sq^a&#Rj+>CgiA;V5~gMfQ<$N8#E}l-pb_Bm&6Ruiex&b!0uZLqXckE^4Hk36 z5-@-u0YW@oi*QLJ`YeVzhd4m!JSe0$ivZ{nPyj#!#FL`s&_V_+VG0lwhzCeAr81heT@=7TPm&Or0ZIy>X4*-7$Vc_eDlRDSZAuFw zpw#)ypz7$_jdz3@tjcWlYYGA|Xjx~~5MqRQm_kdyKmi@;K%Dxlp&E>=+`M60TF5HM z=zP7WVaZ~EMo0@Fz?!01n3gqi)zWH^7EOa`X%@|*Y3VjM|Lk_V*RL=4dK&~R7IpH< zL^F!}{EKfEE?v0w@%y7IMfOy0bD?eE=38VZjj+}}CAxbX7!PCp-|l<}$Axj}z_Y-}tWjm9U& zr>CaUGzEahEC3Fa`rv`XVLBY9RiNs7ap|+A<=gMPJ)a#8SATk#WnyMon$Da}ihSgg zc9Ernr+olrQKV_wNTCs-G{6wBCkF@hH9&#c%13vnURZpko2_m9{CH=#*V~yoGjaah zj4=GQ_s?Hh96-Q>CMc>oQ2Y^X(LgFF3ox}qYF-+uSKsa{xk!`asC+{DSC^XvNW z{lh1DmLDD-lz9^Q_E9qr6D7;V8?7Ar__@tT2sc;q;=ez@Y>19{>OV z|NlI_o5TPB11w2IK~z;%O>f*(6g}rY+cQnl45WbC(9lIgR4SMVBv$+Z5E2p~{uvwg zNNiZJ0(A!!Al5)hL^2A3Hd9LTp~*~Q`@MHBi)Y7<<&~f9ci*|^o^ynfG3}Wep5##6 z$De-m^*0Y^c<}i6`u6SdJ8!;waB%qg)}5@-`K(-Cxn>F|lZZ6mHh05GzyOt|><&Ih z$w;@i|M&R*WOBG~@#1{G`Q=wX-MhCjJ)G|TelQ&7AhJT-Kma2h8+Kqk9$(IOawNxW z2pB1(5ClLHbn1pLZ!Ejn=+@}1^;hpcdpa#Ij(_?2SJlc8mzHyi#t?!JF3Ws<2J-Ia z=I+i;GDlcU+X$rqQ>z7%wT5MrN8i8w#{D0DtUv$afyHyv_;mW5Fz4i@S5{9>W+8fj zMy={an##%ke#1s<&5`1m4M-tLI?}DKUa#sJfEsot^=F^FzxT)Pci%pYettGPugXQ# zP*!D@LnA_{VyM)YfPqOIwf%KN9LMZh0xVg7UDpK3jN*=;{qyAC*@qvzN7Rpg`*X3F zs|Grwm}>BTUR|7OXpO$rhL(qb87PkV3d9it$v^?Ko9nlIj8Orz( z`FlE6ySluzBrV|-79bf@0=vvPp!Ys;+)@K55b1DW@4kezMQ^cK{0|T~?Ybx*SttMi N002ovPDHLkV1oL@duHr;WX4fqCwPO& zf~;T>5eX1dB!q1;Zk z&*wJ~p|0z$YgN-`Q#VcB_q~|{K(?hQN)bjRGX+2a05fxUB4!oM9ji0A`E~40DxvDs>#flc^G{()RaF%L1OW1UM0EGQ@61%y06c^u z`&d;YGi}=z5dpmGy0+a8!;n(Sx3bo2K-}HT+|Au3uLA%?j0n4pAnOhxh{(ag!TI^Q zYRV|*VBHM>&0K^-2zgTGHG6Jm06^~f-P{cT@&|Ly1Ny%2`|iby(_emm#ONoB^44TWsDl+rK^DaB#vRn^Q?^|LV|VFv)`0jdh%MNwv=ix3W$i!Tpv&c;%SypML- zq_J*W48Q;JXV&cw01g1x>}Ai*jCSj1Mnyz&8!}y0p#4!%`4F3C=+XzMj&IDqowf~) zs`36$-+xmEQB`+;{P=OkCilzTQ;Go2yJ6@KDW%nFl~T%eXTo1kmX37c#h8ZoNkobc ziVs%(aA*AQ`qSajox4Y0ygPf_59!&nzpwLC{meZP^G>7ZmFxN{#=*=1d|VYDaRlS3 zh~Q{;yXfMe1JL2o(bcB^>-6m2y|4H7_CKDVeOO=k|DJ2ZQ%anFUfHiqG!f-iS4DCE z_U!DcO-TXa{=9r^WsI?|Hw%o9jwk=Ty}0c9sw|$rc$M)-#H_>J+yN1onXcJ%HvrG; z13(eN>rb2g$>_(s^LK6Xz2%Hm`peaP+O#oNVY*l@Zru^V*Dqf-ZMSP2UH02@((T=SdC^^6)${rM$&=q!s}(aJA0HDj z0AyI*;XeQX0RR86EQ37&00SOLL_t(lR?m;qRuG2F7T$yLr}rHE2L&Hco%s&l7VG-~7-0{zE>yw+wu>5ZTDA`VNxuTlKw`Sjz@2{6Q zS(m@Ej%yGJ3A9I9HdM-vj_#eEojKP4h~AE{%?36}?4qo{y*c7mUT;P>%H@Eentb*C zpLd6cdv7*nw8F(w1Mjpz3!ukNr?+)3K7Rb9wiQl`(Xy&9Ye(My_PPFhE$8_f$G7sj zCKDUPO?v%-`}}9_-hNtkbOCImcWUZA0SL3#yEsm~Cu<`jYMQ$BJ{iPu9H%=e8p+p% zYuaf>S(YKtlyYKHmfBCAcDiJA)0^kdDO#lFJe}5kA)LQF3wQbwB&f18mZJI`eyQXFq;511# zjRSx%kKss%FCl!LCmTfrt+R73Se+`nLiCQo%uv;hhy>RS+5iB@$H!k57!VQf-1%C& zo`|%GiQ3>t-g~0fds4*yy@ratz(^klY+ZF!nJ^t1yY5d!lFaRiNK+I;ZP}_Ntfx zQw>1dGVnH?PPcjr0Kmp^qH_QM#uxw?4u{%EnvlAwh!~?kp!al@ohv+JOjT6@Tc0*b zc6y*LX=X+={W@hrL-a(e)^?PO$iczEY&Kgg&NaU6c?N+00ZorAuPAr%Bme*a07*qo IM6N<$g7n;c%>V!Z literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/130.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/130.png new file mode 100644 index 0000000000000000000000000000000000000000..a9146d79af40d924db002cc7fa831b15004cb4e0 GIT binary patch literal 2028 zcmV-P)mddV#k7g6o_J?;7AB7eq@}C$Bt*_-rJArDi$4c zcD*^L>hw7!Zrr$?=ealsGlbw{L_`e1Z)|LAZ*LP30Ed9qRx!rK#l<&oUJD@;l+r?o z7$X2Mvr-h1zeVz1Y8&KqM!qvH^QQVIYN0{{a6GqhUm z!C-($S(YiKv&<-^lu}w7DW&%o5fOuwN^5PLb45{1rxPiaQd$V8s=D3oFjG?Pb~~fd zsM%~~S(fKTo;R{A^WH5lx2?5^Ap~!&Wu_29T~~-GrOdKi2q~F4#<;b$m1VgxMr#cq zm`MnTF@_KTxGbwqr`zkz_xl(7{R{1O$C&Kiz57|#Xf|6)Y38&UIcJqpjYh+mjF|yg zY;4?YG>S%}AR@#7002NlL{wE}Rh7n=cDvK<_OmQU3?YOp%K<04$BkI-O2cl`$d!D5a%TQp$yei_K;Mz*0)B4PsbXS+=$&ip(s80Dz)s zR8?uMbf&Fj$(+W>U(k zssTVsDTHv&o}QjmRpp!&0uYgih@w);+S<7~gb*XDcDv)80|2eHQc6md<{)D4?ZLsp zty{NWyx0NYlan!G@ZJ$oUDw|G*=!Pm&oVQePDAkP>udY_2iDfs)`$^+iC7E`$9%pV=TY?=DWpTBrt zp3{kBQ6gprApk%qV+=E=*dSsWUu&Hzqjk|;{&s(KIzAm2&E|LC-2Uw5mC@)>!|7QW zRa>IGMbg4NS z&#qo>y*zk*Yh&=}k8KLmLIn)|X!y+g88b*J07QxaoI|C8FcTsUheII*QA`zk@bwSF zx5~LvK=|_W%?Df8uCFd0ACDI1o7a|G2Zu+O7CO_(DI$3{6+$Gd&jnH^Kqlj2M4|}5 zh?v;(y!YWJUtC@8?mc<<@!FNWgX5oneZ2Q->^v&ddOLNcgWbKuqM2*0TdlS+I{B06 zhzLLcyc6K`AY!6OM9h?B?dfzhKAEiF{V{K}pKSkq_tVvXcaOXezy1E`@zY(7me5Wn z6Yu@n+D9oiF=Dz9|63#h_+6faR7wJ*?RaVFCUYDek7v`#^_BeLPv1X&`cIz8$+Yax zWdP7^oB0ciKoQYBfBtN9bCa0?1arDfB1Q2(00030{}!TAI{*L!K1oDDR83aPZrfH6 zod-$Ll^=!G$O3{kfRF^J7tOK`>TbL1uK&?FAO=; zBqDA$w_fgFO&v2F4YI0QeJG0Aw0QaIjI@e=GhZx12r+EDuT&vTlNhDdfe8(Xhud2>D5kbT(%a~cVOtQZ_I{xxBz`^;O=MwJ_(Ywvv-O~Fdf&hR> z6j2i}Gh2rdsbOoszXzbsIYda3G|PGhqK(fOV~ioj0D$-IJyxZ%oYZw0W8I3z0*Gx3 z?SqJ5J;glVF$ZVnJm1N(OhnT(t?QZyz4wE`;q~>ktwzo@n+qZ(33uYRF9x-7#Aw-I zuBu6r*h-P6*|uAWNLiK!XpEvNTTa>T60MImH@79&J;}#Yl3K&fuvDAbYx*#QB4Sl( z8Pdcv>9%)&EW;ut%&ZDFHEn?q5o-3OV9tSv))G|#Ad%SaPN=GgM$HEFu09J!%xui* zLU&xYM9k$!qmj9NyH$Xl+kUD^jEI@LV5$m@Rah>T_4ejtAIIZyQ51+QqRd3ZL~Lfz zjbB5FsQK?qftdN>!$+;nY8y=K7h@EO=jU$#kO)=Pa%|bsysbkW^j+PE$o>BAbUGy> zk(eY&XRaXx=bXWfh|FZJPLx<>HnY0+ifDVrr%zAvJfF>Gs`@`VJvm_R6gc7l0000< KMNUMnLSTXjk;@kV literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/131.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/131.png new file mode 100644 index 0000000000000000000000000000000000000000..0344860af17c24d948fc4698448294656373dc5f GIT binary patch literal 1909 zcmV-*2a5QKP)aL_|a~ z#6hrR0Z}A`*hDPYAolzTd&F<>JrGEOjT536;_-MMc28H`2aB@PyQ-_cbr84&;gV0(M}`1n{PMYww~bKAB6SaF!CyGI1GG)+T95uvKg z%x&9=BqDNmRgDOMKqLS}g!)^AFPBRIh;Vm{2xbO=QgSJUnIixo+O}(&#@$LOh=53? zWMLLnbq@dl2t;I-h#*2UzoHUE7!hV#VY*vYrh+9xcdR^!hzN7eh~(}}L=~5rB9cf# z1OTkM0YF3mfV%-e1Q0PIswyH7v4~U#s>R(?N~Nf~sj8U*1R-LDNyGqAO3pc#GF%Db z?p9^FdGiJ$?Ck8QDiMjKuIrknWoCD)eTE^IGUS}EEWo(FzENLu4|gNtw_`wrxcq>q z;y@x2k)~IqC%@4FQvF!J-YjY-SPKdeD=wm_veAHj!zCx7h_)? zWjN_q2Y(+udp)Zlm^r1Ux~qE6%!rU{SSp=b1BgljAin$jqhEgb8nDsH>q%cW%KUsW zn`z`?=jZ*R&&<(h1H_clqeqX9j*iT0alv2Yi z%>4NAVhCoCP4i1Fr*B`$TX<=i$%sN}lbr^UwUd+z&s{ik7;Ydz$GMjI# zug{lD(=w>L8vsUlRroT4?k8~d^XJdzL!K^HgDSXs5HllQu9LdQ%se6p0GPSnnwe_Jd6>>; zlL7jm(;@oR#o5clHC_Gt=FPZ~yjtDZ+@xkr1K%BQskumU)4D!Yi<#BU6XA&XKL7v# z|Nmg6DB1u315QaqK~z1KL2nyJ424O~%&u(LRotj{>^d+E;=~Mu%5Fee-Ja zxY?&S?+(r{*IBQA{Q2tb#rt1=Jw6 z&=aBe0RZRK{!^8--5tDoBWYhPm)OS7)9FsMjq$JyO~a}J2%1F!0V#_hVhF)9(VWZ7 z?&#aRTxx(j+D# z=S)j>95uc=?>zu858woI+@g*v-oO9t_qxr~r^UL>brWBoo)rg2iFmj zr?y8nl6Iqrx~gKMybsntj<4zv4$>f~tKg#sm z4YPOas)ut##GFMWr4(bd>Tr2^DI#{H#bRNBNJJvpl!=Hggu=qXemnbl@0=fM3lVx> zsEU<1W=<(G^K!Wq5vvErG*u;{VM_ocdw0tN3x@s!Q;f|ZFz?;P#d)76oO2i2>3w%DksM6w|c vcfVd=Uo$70(c2SL!T!!U*S75t2_pG_Ja~@%X_EF500000NkvXXu0mjf(w3bL literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/132.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/132.png new file mode 100644 index 0000000000000000000000000000000000000000..2b44342eaee8998a662aa34b4a21204b46ad5621 GIT binary patch literal 1889 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/135.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/135.png new file mode 100644 index 0000000000000000000000000000000000000000..82976b83537811ba98a24b6736c6a210e244ef3c GIT binary patch literal 1848 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/140.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/140.png new file mode 100644 index 0000000000000000000000000000000000000000..f564393df79db99766d958de43dca2b709db64d8 GIT binary patch literal 1948 zcmV;N2V?k&P)SV?3{T#*djKBF+l} zBq9$H7Fn=>omsF7gnShF3Ix9ZQiKrv0Ac}BOsv@B*zwqdW~S%S-Bp)G^(3v5`Yx)@ zx#v{f!-xQ&009CD03aX?e-JQ4ObTEK1-w?_Ut84+R6(rck=$x>AnwKR=|6`%*4!Yg)ncO4LxR~0fy zF@RGIEh}J%wv|*Eh)dNw_aB4}ORoTgI364pikVYJto-r%PDkY!VE~drq5&ddLL@>V zQ&vWKKmY=zLIEMXV&OH^?<^vr8mxco5)?3iAq-G6Oho|1tS-lbPE`O8V5Ph8)u~um zsM^qlYQ=$7J3{IT+K@3JAOQgkt0Gq|6i(Fxg|93%M4$|cZ9wmIyXR+Ttej!!G1LfW zNT=!)Aakz(a@A4;U+{s3An8>}q@)2HV1gC%`J99$BQhckX~-ZV*!A$?!?WSgSW|Dc z8qMZ(HX~q#X7#dTp^&N?3sVsfl!{W75kcVc#fvAeUrT^qfs$|vLtNRp^68^To^t8h z^-gD>s>}DA#X&XssRmyO%GQ4p=JM-Hl0> zImJRXuLy)fl1zoMPza}pgf-#rx8EF|oVMHTvMh};?RIOHWpR?kHnNdDKOb#&yRF{# zdpkQvFZV~|u?Omn#x%=HXrU-n0ho0wz6utS5I{fx7rNaUt*VNcR=d?~H0o<>n_FAQ zCnu4OjF?_;JBni=yS@I4zy5r4d<K+U^}59rgQtTC-R#fBXH9(fPTmwp*>wzW6ftI`f)&U3hg`WujAoe<4~IkNy#Sr{PMRj$yyzEMWfMZYjg9bAAbD)*|WR%?!DOCI~$GO=Kucy00960BNj0k000ArNkl6@Nz64V5aWvVc-4NOaql zE+Q7NKv5nv51PnMNaFF>Gq&e+ac9O3weI42#@FZEbI<+0pR{t}2fn{|FOH&WrTWwT z`=(cjdXc7UQY}WwmdP>Pm(C%uoH%1Cyt^xilVr`x4$nmjhT0Lb}Z8( zO|*}WFI~DIh&I%%Ds`8EBmQ@Z#Lujhi=J z*EutLrrYb5{8ALhFJHa7_SvUGh=p6B_cQnT6Abv^8KCTq2s>6+=-KmYLKAd0li zz4Kf}zK?<=g(2z}eFhV8k{}a$285KBX}YfKxo){!GECF=iyNwNEalC zBtat*1R@Zn=*LLsDwrThf)pTw-Y<&^ATqoGkT7(DF4C-}f;+{7fB^hrvE6P1SzQ1y ztBWR1Rff}nyoHrAv3+ie@agADd(r)J*B~ln9)u|%ynfH!CjBP91G7-=T0)esW iXOf^gMdW9mjsE~WIx*&bcgzO>0000yY` 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/143.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/143.png new file mode 100644 index 0000000000000000000000000000000000000000..d21c5b89e30ee85d9fdc71b1fca27acf560e56ba GIT binary patch literal 2047 zcmV>YGlvjD@JmZ?t*)*jA|gypoy_yx zIX4;|tHuxlGshT1@QA3YF-AlrqKSzK5yLDvH+Py@m^sfoB1S}rxNVyxA&h6P zWqGm^5v|SAorp!mIp@7Aig8`n&b7C1-&R#s&9XeLnBqi40CLWWh_N;kk+yBUcb(2e zQH;I!L=lmgxvnc_MkHfQ+qOk9?)Uers&vlH%*-I-Xf$GGYpsY$qgB;82Y{-Pr>AES zF~%5UAYvjWBInu=!otEUgTbMyR#gR{bzL7E>>nKTiSYP%boJ`h%a>Pnc6OSk7O^qL z7!?r_(R=T`E6ZYW@tlmu$Ii9P!YnbyW8-lMA^FoZwR7!;MA5nZ};>E_Lw>4OwF0CeYGe&^#) z&%e5OIPg~%-yK(ngT0-2a(e&%YQNw2-XUUL*WSCMqZmR+L>OZ+Rf&jI^?&Wc%*+e` zA%x!S+`0EZ_~zPIXHU)d_qOlex%K2pF&Z5l9`3jky_WdyjUUUhNcBu=RF#PHyu(bY zK&gb@yBCtZ_sh%6F~;tx*^j=w_QQAAvub+%@9pP%_2Rh;gXfQ`F`j?zjjiAR*!b;M zci}96CbUxBl0*PiRc7ME;){OA7y)#1b0dUs@yh2vfBW^rb$2{0PIO~g?DzNgdcEF1 z4_8OSp%@$u4t(1-RTW&5kQ0%_TY}RV%Oa-N>rPHi7DW+bRE;6{5W?$kzxVz18{G-0 z3aHAc`fPYKIzB!|#5_l9X?t^{shhg4Ky_h$emEQ^Z>`NzABmWm$rw{r_2J=wSyCPe z-FFxxKGz@J!e!5$hMOl0NsJ$tGeQ+Q&m5l-R& z^#3Mnj4CM^YctiT3e4iYGo8-KiI*7Q@%o|>Z`(!?o|#=fM9PH^Mq?o< z;Pj$CjtP1Q`Um_wbLnsJA?Upiv}ln6t&O^FB*ls-+9V~4%blGbMr2!F^xWBbe2=js zzY)>7E(B3BKRbt_fhXr@AlpfHIG@S&HK*yxwkS56!Wi2-hX}ssz#XD=-2oA`H)-^dk)-ir@wZ6uo#VcD-C-~cA~M!S>f!1WCQT6ttNKwqyS8!rT0^VfouALDszQViRMv!< z&8t^mFBb1~lZfLOk(4P4ve5T`{ruzd?)vm%w(r|8J!u|_*=)ADz3Fz1f_u<0&hxCU zYZXoXiHLAIJ<gdH7LmuYI>`p8&PWl z03kA3*~tH4gg7QTMi&7SMX^Q~2}(2~5(xl;2nr1EIf`N;%(9H=ctm?mWJEv@{=b6b zqnjuVMIoZm)R|djO4p$fShYTmvFi>aax`h?f9uw%43z~MqK~5rA@Ie;g?`rm8Dr=3 z&nA;Rj*}>g6v{fV`FyT;8Qb+AXbAvfo}XxEl^xnE5io|VjguseqR1Gl`>ZjR*|+V! zZQCfaWw{-UmK6eeRwRrqqG623-Z5)$c@SPfL}SQWo99y^VrI?v@$u1GJ0y!VJcDAw dbUH=Ee*o0l9;JmPVyyrG002ovPDHLkV1jp(-EjZ_ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/144.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/144.png new file mode 100644 index 0000000000000000000000000000000000000000..99392d4a0e5f2cec12c6b9a629f62c18a3369e79 GIT binary patch literal 1834 zcmV+_2i5qAP)3}6{eK>~moD1%P`0P*w{#LO%L zpoAjdG$X{rw9GRF2yz&UN)}-{Oanm~zLKCT>d^%NrV5L&2s42x%*yN%H2{Og@?Ong z1`u=*4+#VK7{uX&<)@bQ5Kr&De-~!2-n#7|uEc8w{tvhT3JOSw2ZiEbI=r_4R76u) zJnO06XzcDE?C&2qhLMt72^3!t02s{5+GiL`>drx?KwNo3!X^2CK$lPg=>|x3d}0z56oAY=`SdgTDqT_}OHzOE#g{TN?P^nm ztCBENN&<@((}8XUMOK>XJmY80kpM_x7^Sb6Dq;#3q|%@SxIpn97R>-tFgHUfV4=J? z(g8Hh2lg%0HUJb47+i&}BFPvCOS=p;CUsKaD=;0c1(u#G_#Jxb40vIA0&q!~oS&sI zJf_bNk5-S5x^NyCG)aCS$ML(zW)1P1A`4_5TvitR|}wyzFPVn03Ai>0x1+n@r$p#Y%}e8 zWh6&-*gx3ZdG_zlAx}{cjo&P0>>9J{f;mYN!-+uSabbYRK+In`fcJ#a{ zBG;B~-oE~(Q!t)b-Z#wwn8lmdS1diztY@bki>V_A+d?BOn&yZZEQ%m`Q9i!^;OX|C z4}bW6W_GTcjC8x5cI&v;KiS#XBi;7i*3nTD)R@MzeY3s!51{2nvFIoP05mgAVG)`a zJMQg!cgE)$KmYo0Z+~a1HrviyOLJF_TgSIRpI;;Z zO#cG_0RR6;=sx}c00S~fL_t(lmQQaSMHIxV-kb4m#=&;T1{3~Bwm=~U#0epeT;M}+ zoWV#_f z^Y?;m{d^T`kGqHXRp&;I)L{?`8S$)71D3n_*ks42>l88VpM z0Vt^d1EDCW5Q%+kZTa1g-=-L?!~Ar%i@oXc?ELh+Yu6I0nxnQd+3dKu7%uD$$sHkNG-Rln}Lbss~&xSRn}S4~X$pgF=KARx0J z0F)$xRORh}dum<9@kbwitYg{TzBgubI(xph)q^{)*IKQXD>tX!?c2_sK$!taiV!Se z1=qqNIHY1Bgk_es>+X%iw|1MI{kw0zeemddzWU$U^jJ#Fq;OPor@oLPBulAxz>{QDoxWN)(l%IspcyM6!ZFHcU6PXGyh2<^(S1rnm5 zkaBoa= zP^xT9Po2jW7RszQi&}Ck0xdqEjzA&&#q$@*5~viVC@c<+%OT1~?>xSk&9<8+ggAs? z%7el@wx?8xg;|e1y68u zkMIO|UScwt6v>r#>%+-!ewqzDsNTyd28B>ZP(|J#w<93mKipQUW%>GCY76a!n-1Xq Y9~rRW!>tcJeE(^b literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/145.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/145.png new file mode 100644 index 0000000000000000000000000000000000000000..50b9cf4e05f65d6f666a69b6c1a6c077703f6df0 GIT binary patch literal 1783 zcmVdDN+cH%e>J0u~5 z5Jcn<1QG(7M{pvsiNr2j#EM_QiVd*hU$8*pH^7!fEGt4hVoVSs#4l`TY&`Zndb+FX zu;^~bC3P>Z>OSh+?_M?tLmD6g77!o+fPf$w5>f<$D!U=dBOxIyX$b=mAej&na;Xps z34j$4gdjv900AHgz^e=hOOiB1LR!+1Bn4Q4q$3CrFyyJp$=+a)37HguvJ#eG73_$$ zG&&-w!!^hNc&QKo7(6=!3{eQN4ox5ej+KtLfyz@W;9Bdv<6q&zBv0dC*A zRb;~li;H$9wW*;YQ_`{WbcU8RKmZJ3Ku4yAmWV(u0f>Mhi=EPM>6RJ1t}N26jiGX1gT`B zeDx@bbxPFY81fJ{0=C2yRjV6@DQVk=1>mJTssIXAHx6G7Ak_aT9BYj!ctEj+yBrPz zj*NgI1T+m(^6KU1Ig{FwydXtXogz!2WB^0TBv)oXEW8zujkUSIvwrUEiN%HQi(5JDt`})&`jh{Z6o11<4H&Uo&%eZx%Y)sZW~M5x@pZ;>&C}#{J8SNlkI;Ne!Ji4 zbzho%(Z*tH_{+s{HyRGQ2fK8~XC^1c+pXbnV1TsVY$fqtvgMkS&~CRAQt=rn_dfaj z?%g-fw`ML)UD(;{^!vTc53`u{i-R*0Q%%=ERN64-PEKU~p3jEmb}He>qPjtYsN`@m zd;R|OnbXd>xwqeHG}3mv{ol;5fBm`t+6%8wx~c8er=4Es!S6rMoS5!(_V)APzpGov z+vC@-URhdRx_Rx|es^#7)thT;YY!hTJ?(V76o4Qk9tf(|)BEqeo2G7*jlTKzI{~-9 zx-&5tyfZt$wX@#M_ER(jtgda0C*yuF%JX9DV0&+KvnWRQx3=%h&o3`8-}+!)Hu>Yx zqrX>Hg9PAz00030|C#Ze(*OVh`AI}UR8>|@ZxlxmeXo0V)@$r_u#lY?Vk-xtNQoka z8z*i^m;<@+5BQyl5XUG|6bJ;2aO^C>pWt23$4*aoR}TH*r8S4$k*2D;>eYKsFLLMe zm#>bFkC&I1t+m%iOOGEtdGX=5v0nXQ=le}=+*-L+y20y%z1hX(`NvPjJAkS;19Erw z;nCT7)6Rc=_Uw=6FU~Hed51J3U?Npjb#riV*w&S8oA2)Ky!*Jn|Ms7O8b~K~(~Ota ze);{WmVuo+=|#NrV!^?iS1%9Wzn>hR%<9^was^NTH4x}PB(5$ad*j~ypWl7?*LL~M z-pO7&tBX#LxZGVB>HOB()}OEc9uc3K%aO-$G@8~;mO=tL(TvWzkuMd*t5BRB{deQ` z*PZLFv0c?{7T0`htEz3M-G`Gi!f;KL|+M8`cWtl)PV9m z>O!vT`m#2S@8(__-&DP+o%P~u-*?7YXT3}&6B0UUXCS+%bl2C{gBnNOh#DH%_;mkZ z$9y|3Z@}uda_5(wnTt>>@5lOTCCR9fVY#9f0X788oyk`z$t6VsrD8!0zt}3))@vGV z%X)S`Z>N|y!_m^Ts-5JrAQEX+0H0h4RSI2XkrFA%p<-72xtGBEN@-P;y=g-T6Ifk< z+<*mvOARMd!-m Z^FM_%lJl`xm~a39002ovPDHLkV1jmAPpkj{ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/146.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/146.png new file mode 100644 index 0000000000000000000000000000000000000000..2e6e5090a3b4d2996bc9ef9fbfadc1058280326f GIT binary patch literal 1865 zcmV-P2e$Z$P)fS_HuB~OX?nM?t#14K5Lz|w?GsS0IF&hKtcpnkN}_#qM`}JiOa;L5S1i@ zrT`F1h|mJdHt1;qR^A69PLfPqDx#yKW2>uc5QRw0F{HYIh=@3lqKSwDNT2s*TC`VK zG!b$H4;o+uL^i8x{h(nh1nK}ZcGQ;^|ABb`S#Mun22FaAWCD;BO+cdsh5}ZCMjAi> zA`YTm4T96GE-sa%N7RX?TI&N;)O9*7FvP!t2M8z_XaVM79<;2ckL(-owAS;yqbiKb zhybKVC;>`3_$X-f8?hK*C=hapg2Bo*$k<8Kv9a+y-&j~!AOZTsIq!X!Ix9`O->8If zX=5KW1qhlzL=-L&0HT0J^%x6QSMD{}*I*v>0L%=)?%jj!Rx`dC8PQ{gbK6G%L+nnt znm_;%hDu5iCj!vA#f%o{9^0)ZAeA`K%9C4cl97S_+qZAQJpBeVK`6jLUsM(V04po$ zA_Uomz!q-I3Woa_2t-`7T_6+;IcOpdBA|(gxEex%ut6FaAOdxu4UbGVn@e5Cb#W`( z&~F)16zTvb4CUMJygNHPo9BfjSw({8VdW;%`UAuJCXc4I!3Xz__iXDQ85~$#nE&Rh z4?CUp$}%wfpVu`34Hh8k#MOSfa3PpMAfkYf0anuIU;u4=?D6`p(N|ucIe+o$zsqZf zCik2^dF0B~yKeizlgEz#@%u#!B|wNomf}#&ggO8Y5WwhjhLXNR-+pR(>gM&UG>=dW z5ADy3FuZ4Mt!1@@j~yQU;oOz)f4ub3`>%F3is#PE^kns4E}f6VAEoE9<5P3<^VQJ- zfO&v%d_r;K`k%BCAx~?WOS0a+?N6UNn)UYoeEC||({tjHJY~~wW%Wsb*kykT@4Gx-2C77mX-u&Azxg)ySBRW(wV6v zhX%5gckbL8oqS>H#B{Y2yDz_KYq)NM=qiYVs)zze(>_%-3T4~et>s3ees^)Hvr&Hj z<+nR`^zYp}@!1#Ot*oqm{J~pi&%PJ0C<5BV#Kg+-a^+Wzt5qG;H3o*Ny#$wuI%8-x zJDqlG>E80`>4PuM9Ba2b&zySV!2a=eyGYdDcx`6#z(l>#7#e&y>O%tf>*mePLHQ2= z0RR8ww}I3E00SXOL_t(#R!wglRS>M|H}kx^X0x_qgb)#6KJ($^o)aJrgw+5lCm@cJUu;) zDJ=lhe4?6NUR-?hjrRWj{Zyvp|=U4w`Go zT#~@p>CBB@4c~eD%2|IH@-TRnbaz%CKl-VXRnmJOLMWdC3Z*d*=b1D}7n>Y1xD=*^ z%If4LG;_|U$xO4^5jW#~GfjQ3`*=JW6m-A${s-IJ&*Mr}DocQr)*@Yl&O;m|ff+Od z#X?4LmXCEZj9LN+Ng#3Qc+{`1N_ERB4PU-_>&f~$%;?%z=)A#LZ&9gSmW?c&o8~Zs z=2m2?&tgS7U{?7Z3Mpoq(4_@B(+n1(ozfg2OwA0E5~z-vDo_IxcdE2#k(sI_Deqzq zQy5?YVG@-!`Wz|8SL#tOE)+poUcPy8lMNKQxg~_mEXUL{X#mVL0{}YGnFVNW`N)df zQdx)kajr>e5h{vZn3zrq&jJ7z5Wx}}U<#7)>hdDM5_{z~q90|fl>o$|S1k|2lwAtw zPymSutdy{NpQoi1KMJcEH8T{1L^x&&)7W7~lNz&H(GQjs)!I;&wXm>IiA3pc9Mf5d zRK(Fi2yu*qtDuksfp8uXKp9OqBX$ztXgn^S_0jzgSUs=PFQvuV00000NkvXXu0mjf D?{b90 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/147.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/147.png new file mode 100644 index 0000000000000000000000000000000000000000..afd0adf7f6fcd228c220031709d5720fee36f8e0 GIT binary patch literal 1852 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/149.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/149.png new file mode 100644 index 0000000000000000000000000000000000000000..f16484ca6b660dae3023ba6f7e3058fde62f7eab GIT binary patch literal 1679 zcmV;A25|X_P)$T(9F){fd0V1ka z6x2#kRH5{)DlL^tugVXt#E;;r7Zp&oAQ306C^%6Ai4)tqJM;EpyufNNc6PPr%=vgn z9wK~l?b@Zy&Bu=)d$F;;J|2$)01gCB@*F)T0lEtu(`Dr zpf)N4@RAb|47@O?BDL8(S`}>??KH$$G@v$9vr7YsXebxapjmgjOEKDXI(5QB?o>!X zCNin*w1BpSZorA!Fta4xAR3|hnk6bAiOcg=U02EROgPDjOlk?BGOLUlBytIeX0?6r zBs4}zTIg^M)glu}h`I1mE|#3q`^t!r2?r4b!I(!&Qfjkcga#y-Wl8$S=zK&bXo+#vuI8TW{qj@|IHc&S=J;R8v;QtdfqL2%}zKNHniUuxPlNET#nl5&nGU>|pRxk@#Ao-&tKX)peB8zq=bc5JzG%V7# z6fj<>p(&hNP93L~l$2Fwy}`=mt&KWs#c-}UlXoZojE~A_m04{I-DwCUc?by|yc*_2 zlS@9$YNRxakmuRG``=oBwN3o#Lb*Ix85Z{U+gZ`;&dRc?LjW@ijlB`-<{9v5%2RoA zsU;+(s@2BY`r4h_U;cYOUG5euYnRW;_}kv=!^!-!o_l&UZFM@6^J(f&!i$E_Gh%%2 zhj&6El_7$mI$CKaBg`>Q{Q}caCmfFsu-+2ee-T-b?Non$yV1{r~mMm zhtt_?rQhG&*f>2ojiGjuBqZ;JYYsJo0Kt&hx^&4x{l)FChKKuakIQkf@^WugCKTY0`e8nxT)&eGCf z&z~<2(3HV)w|jPWX7J#_&%Zu;w03cL^ZNDOyLX4HtNRBBr<2p)pF9C#eO6U|ayHp+ zmD_{f%kjyJ7cX28jE|0J_L}Aq_#XfO|NjKRPbdHY0<=j)K~#NK%Wl&^6g_wB z#A(`?Mj}APV^OuLL{WKc*|6w0bitDHd;A4Ux~Nnss|p0AiW4}HQ(Le=;7dgxm+^P?RMY1ezm{5I~)$P(I`neM|;mM zv(ZbQJ=M99(pZW%d$OvMBpFQ?Mw|1jxSUmN3^xn|1iUyr98V@rR-?!oZ43ad)b-WX zye$8bl!>$NzAkR@m zh>4tG38KbR1wjxgspeVMP5bk*x@mWF#e-CQ8cwBD#u|8+wY;{u@Tt253iQqf#?lt# z=6AZCy`2H8;vy?nQc7(ahz1>j1U1G$uJv%~2_p6Z23k}Llw#*0kd`IGFtevS+;W2+ z{tBns%@`2P%O20(_v4$)uo$WMYOW4n5{?0 z9mMcS(==Z!BIoGL0J(OpC0w8( z0JwcBZa|FSRKr>h>y_69(xT1=fB@JxpCLN@@-f|^2tXXiTI;(97zm0gJA#w002ovPDHLkV1oZJE_VO` literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/15.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/15.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb731846b3d1cce489173b60eb8be9728af58c1 GIT binary patch literal 1929 zcmV;42X^?0P)AeY7h0850ZkTQgml-^1U@Pdg5OE|(A`sr;FmPia8 z85@#_2uE~UEdXxX9{~vj4B$urh79U{nw~W~(KTnV5U`|x5@E>DP3AR{#)1KOrUOHI zDIgk851J5#Gh`CSgDf*ZV(2kJR7jB_NdRNX3u9?4I3gkm1egL0;lZI-Ar+^>)6ZB! z`6%LBX+r>r4FPy*B!$w7(-`8^1s=$}GA}QEu)dBnd;$r!VhbQ7&!qq-6d2&<)7k;F zo6Wu5SB5AA4|pk8@Q;GuPSIm(EvG4W50nfsz2Ox`O+hS`t8*7xSFWwRe`)vd;J>Yn z{ipxVME0L2PbU63qr24YZftIzBH~Kw!jMnA3Mrak$FLBI(o8*>sV`i+8JpV8>lf2f z*}14OcdmDF?cU?fJ3oB4@%yh~s=4Ha)A}@R!gdl%&;XV!rWOp1%h<;HN44&IE-S{v zlUlWG@b0CHUCTKOeYkr0_BXdTj|NZvxIfDCU{G?hl3`Aku?E znjRh;Skg9Q%jvj+opYf8;G!ZaIcryzS0iip-n{B`I_J*K6C96@YPCwY({46qv%UQ< zKK*Qa^XVtIZaHfW(d+dN_V@SRycr%JIl?X^j(|V`1Pj0t0J0>tNm8v;R1}emTCH{* zr-rCk%k^q`d0`=SC?(O(?pRUz#J=zj|o{n7POlf+Q2( zI{-i~6;WcMD9^G|QmR(cwbiu?_1WIyQtEu=-P%y@#mk*^rvCb%UeH{-GIRI-J(p!K zx3?ZXc+fvSW>^BiHX=Kg!gh?LK%e9YbaA}Cwl?2rEVY`QR(oT6+s4uE!C|FZi=$*P z$VU0Bb5XAs?;j$LqMz>kX!&*(!t>`cuL81QtKE9OwH?-~*=)@;+l@wJI2;`H2bnGX za`ztT({g!k{(KxI&o`fSd&{%+yiy$v2X^O0{NUkE*d76r2#^%;KL7v#|Nrg5M;-tG z18PY`K~#;FOK%)S6ot>N>h9?ok7qpb#N%BoRG98AykwE^N)U6UEAE= z+B-8ixV-#)V}0w%Z-4FY_lTfz7X7;7KtrZv>=+%O*USEyiRr7Aa(HoU?B*vQ8=?g4 zX)Pd}+ue&c*H@Ja+asexL(O)3cx`QCsMV_0TZ;>w{`wa5%f+9gujW2CE+?JKHkBZt z8=eAid1B()n{PdR{OcQ2)8$HKq&@s%eS;$6c@)*_^{lns&dT`Z*Or!^HJeS}4>mWJ z$Hva|RZA-y`rdbQ55K;ZQO{-^Q_7J5WV+7>k&*y>B_JGN$%J?nl$|I)EL+i~AguM5 zU%xV0tJMb@=X<^Fciw$(dHF?H(W6&pKm6!}rJo)+fXqRCC|u`C+7JdH5Qr#&0}S8` zoJp5G~dI+V;+_*2)pB;ejNL!b&x)_I>%o{U2|Cag=lgt^w$lud|$5#1mM+ z0@M-zY<*%#0T^k`S1hnk;I}_;q^b{~Z4SJ6rPL%#EN_ P00000NkvXXu0mjf(QTJL literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/150.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/150.png new file mode 100644 index 0000000000000000000000000000000000000000..15fb1aeb592f7df72c0c983c3a5bdc70275c8f31 GIT binary patch literal 1801 zcmV+k2ln`hP)>_e>mm`I3y$v7zjop##U&cdGzDH&R*r<+zamEN>=S! zRkfCSLQ(>twHv8UYQ!L?UQ#2HREcSLWP>VUGqr)Knc9`q6G<9HSM(@62^(5dRZ;*T z$WjuO07l_}A=pt#27~Yj3jxIjdQ!nghOiIAlW;(ofMVzMD%BFu&&pDkdP%*c#jGp@ z{hSO*Bryz!Sr`mPlSxMi7~~Y@p!hJ{LO^R;TM|$uNC}4;DJ6<2woo#HfN_a15*cb? zm>eG3FrRgA8ioP^9sT#Vwo2RHy>|~t2BCgZEzX=g+4YR=qljU695!T8&xc#eNl>Yy z$vB)vz)^{5IEf05ZEXB@?;e1p^(xguFg3Nv(l`t>Nv&N;8G1>TsHK3z5&;?V+`PjQ zqi{EFF+f1rmoHtqefzeKSE)|2U7&*oijk1zID`(18TGpVUPv z?CygCU*7m?Fc>_1^w4N(TC=>-|LofKna$O!ADsL4>l=@EcmLXbG4;$57HJMW zQ(`%*HJ+mj<~orCur_F}UD>{V^}?GcHcp*5-d{O+?)+A-eQ@)aTi^e9^N;)Y3v?P~ z%^Euyx}y3?-Ild>F`c+JNf=fK{p(k@KL7CD_0{FGr%$!R{o`wc%{SIJ&YdI2&d%Q# zzxZxEE;Gtf*a7wo1V|YYgx#g3W8LYv(BzNbKl}FS4f-o-Y3XP(Ts^k7u(7tX)F(#t z`)A(Sdb#uSrypI&5|X-ooR2O6q*_#>m((Q9+&4A>C)O7a4%)hD%Ji_5cCfr?rMj+m zkH*xA@e!jv9zFf(hi|&Z`Nf%mbk?THEL%)W+YQ*oD=Syc@wLITr_ZAeO(r`J9v;0s z*!$;k)fP%Hs95c>x^nT8?aSM5z52rtynb2m>Qr?{syjPPN)csaW$EnZv4hbhMf96$ zp{Z8~3(k$h^{}J@O%3JFufN~A^PmHHEple!#!a50=&zAMPI= zwe{Y!mqX>Dt7lK2KY6k@+8@5W`zMojuv}j_e}2Ajud|fkKL7v#|Nkb+m017)10qR8 zK~!ayKX2Sd5XIk{U6S`lC&*C%$#UW*7Tg#qW8^!;U(3ixNSnr8fB-53C|!^$KnfTB zqrkCqk!fV9NH{e9Q?WnP`nudAxL zxL8iMN0nP$H$g+FnpNSnSi8mf%qQ7mwyZo~y?H~%N+4*2KL8lZb~FJbLQ5!6RcnM0 zphBjJ+1(y1X%agck1OZwR#N&V8D_zwuIn<`AAkDwi=2k@vN-#AsiK!Fo7eWT%HI7m%dd(@j}BwjQL6DI09Jc1>wZdr zR2YE7nxb5vT`Wd}^ySG^fxZ3D%ccS_91Y<=7EJQR?8Dio-~W6U>mF4WMXCyoB?4eb zLv)5r1$K7st;(|TA%x(AW~rr>t;{x_byHtm=Ig4SEfzt;4=;}Ai=xLvOgu&>z?3kg zZHK4*6{qR}0G24hEVEf^zk0ZrWoeq)gT2qPEJ;#ZSL+u?zg_3`4S5Iv&%S&1^U+Z( zzDYVWF~Go(!1vFe|8jh6NJ}Q90N(omP&giDRaIw(MVX(xpZ@Xk{pop|J2pJv)$7+$ zcLX>VTEZHWLM;_a-qO-QokexvFDNel#OX0MjDO$W=oxHb73V(#B16B<%9Si&nZ zVbWrYt*HqUp(O=auU%QX^Z9Ds_`Uu6A$D~mI@y9UzE8HsW-KJ|@WDa8%ws12427vs zzzsCAS9^S3%;$Zk+mlIM*S(&49=oP717WnG(A1IXDKR!;$Vd(Vjkaleg^PZ9JMkDD zcMcH1Obmtab(0D$X^0&wsnBT~F_p-AbwCq+TmN4f>58)%z1J@+m`Drqk+5GTg-qJ6 z>9joWqL>nBfa7ahQVu=A4Ts8aI)00000NkvXXu0mjf1(0Rd literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/151.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/151.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb90cf5a464ac8ca7aae2f3b95a910e0a708621 GIT binary patch literal 1949 zcmV;O2V(e%P)Yr(jIpK2DEP(i`T6Df z?cO^x6xXrXYIm>hoHOVAsA-nW4Dg)Q-P|1j0A>~uA||2`VvO;BpP{bns;X5r=bTa} zB4(zlDJ3GPYD!((wq`2*{xF09fQXnSgb-sDLcDtQ+ITz>33c6EzkYpZXNQ@arU4uP z5w~rdb4saG)wW$M7RNcKob#0{S9W)IQtI4|h-ffaE&^r>kh|xcL<9gpP1EF@mzI{= zwq+J(>bmai*|X#Em|2Q|I{sn@JW;1iQa+z6} zxvHx9e9kQHcKPz<&CShTuQ#91?c~vCF>uMCX_^os4F*GiQtF7hb;Wda!O_SXIj&%e0-(n?=Z^@jbmb=9n@rF;N6C%{koC!(UxOn2}8u)4Z>aB$%6 z?_7KTn{V%2r~x1?;b<~vw)Qyndx6g_<*Wp5 zzPpb`BQp!Jdh6!x*J^aY0uaXX@^CWVzxYNBLC>722E#a=jF=c^xl0nO(!?n|W@@Hp z#wU5Zl{HnBnI(ifUwpQAh}}JO8Pmh*WO7u+cr+c)pN_j0f8M(faJy&$z%_rT{kgA zH%}?0lvFjwiin7)uA3Mm5p#jElvB=BH4X-=Knpw>!_9N<7RT+@*4ES6bTVGJ&xotX z|2#4)h{MfdtN?Uf>u$`PQn$Xoo^$#S00960NBg{%000AANkl{$eZOy#7$X375JoY?;nPC^2mpft+$&loWQoOm@uGb4@U}6eB1Q&vr4u{~0NQA>oTCgLO*1FXhg@6wpJsN#K*ok>| zwOkfOSsH7ssjO@M`t#iTu-#TZcx!xgO$h$@`1yQ3CyLBK#6&U1KtvhpBx=GWfo#HnY<4nFmP3uv*~qR*9`2fiOxD_1Y!cm z#UdB@3*NOD@7c4bMNw+4gjVD6n3=BMUCfrBzC1iqHd^PMbJOYc^5U{6O9r-06HMdG z_Tcg3)oKOMwz_j}r=1SVBoT%P%phM80RV>&zxnQ`U-n14n=C7qb-l?cdT+Lyn+3#x zsJ*w6fPHo8Rof+{G$Ndyo}QhZ^_Z1V6UPfCl};YM_yL&xW)nASv)wXrnkGtV=dAa> z|06TY;pCt#^O#xAD@sK~d53t_dq*S-8FxEbf{1CFjz+tAp2ZjeZtF@Rxq+o!>Lw#C!Y&k)^x9ezT1@uxP;mPo jA`nq`3F)M|GY|M5<@Y)OF-t~300000NkvXXu0mjfxgxTU literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/152.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/152.png new file mode 100644 index 0000000000000000000000000000000000000000..5c653ef673e95215fd23881ac1464c4130e33169 GIT binary patch literal 2007 zcmV;|2PpW7P)zlb#Q;bHi4f!u^(ASeI?Ny`BeL>d4nNXl?KYG@9Sd_wsyXF-8c zo-WtHGA9Yy>7WD5!~yczUq%J;fIvqV(;Pqt2oUKyZqQ&66zFoK0}M*LUI|dgqW{^b zzgBBC8{Lqji`h+}#V=CPrDmPM@Q3n;89L3;<>_Krbmi&?j0(sINq|O1M!I($&4I4l zHdAOjMm;11AfzM#(ZyNn>?`NCww{3oi>t?mihccWUA~OoVxv*d#Zjx#1OgPEZf<5d zGzUhYbtMKsv_e0C-rmaY&NBoLbD(3_C@2(5`T6(Wo}QlB+uA-gGj(!w98^!G^z$!2 zJ%94}t1oVVMvLKcAPE9gNT49!2ILqO;BtotEyydR1YpLDh1u}rXtkDqxU#aozSi=) zug$&j2*?J>D+Mw={lYIx?G_dimkgzgIVwlYCpvaQ)IJM+OESq$^kEuYGvw8YC%n7>5+{ z0|SF(zM8GMd~9*->h-#U2UIBc<%)$6+AbGHM<-98o*Nz-rn8~pfpWE{QtrET=Vsg} zl#iGGd9vCwSo-Gk?;4wRDL}rvnh3~Q+yek1m6WDF1mAg9W-f}-&k%`}K-G;*8;83H{ z$W|{c`VRmA|Nm-z#3KLz19VA5K~zmvO>Y}j6g~I7H{pcNU2z` zV8f0dz={R`fCUQ{u;ULPu}4B|x~dQ>RxF?hMXCf+C0vEdZE;IoIYo)bGoH_PS-dx6 zcB9eEedpeL-Z@8-6MzIsWv{EwbX7q}AwWc^D&;y1y-cDCSfz_N`nMZ|hez+;yMLNz z%ikaW@zIAL`+jix%PA*$o@a|_X-XR1U^_rtfJef>!uXEz4BukY_AQ34@r3RR6S zDWeV0g(2DG;hE7zu1Z!u17*c+zZZ8F=PzfQ{r>pj{pmk{y|{egdH(VCt)0=p^Zjx3 zAij)1f*F7&YpV=Wl9XpJNMmQZG~F!Kav*)wPGa^aKC6Ywa2!zpS5?+^e$yE;HcE&eA01t=5>GY{=wUonBDWSss zgPW>VRw?>}t7(#^B5|C~Pv8Ft5J|VTEE6@fi5f)C2G}^baYVKk%{-W8xq<7F<2gbq zsYHM0T3M9RrOS)h)oS|m83_d;ZCWvwrAr~;DoK8ObCoRZWb8de4Wu?mB7hw)*tpW| zZ1*l^^VKpgvI0aPK|<9o#$X1S*kClHB1q3VHB3UN)(6xrfT-PWU%#>Y=XhMdlQw37 z>I2NhssJ*Cgf7eh?s^(_$+X_HjSg(VHXloe8o`mu6ooEK-(eUoqf49Y>YwWd4R&fe zXo45)Nx;d;Eil-^suK;D4fZ@+8NM(xh3#&fBw!v6uTB4cvaV&PR4;=ygd$_q0HjlY zCWy#dmIa|Li&z7!f-sEZxYz61>J5u(3ayz3W?kB3W+Nqo1hcS#%+6DTnQKlGgk#?} z{o2w3BtX&vG``)$P!a&qng{~mt?mB#`5X*}w*Cy3b+~KBvVH^!5~2>w^#uMmLJOQt pHl$>=GANIajz*)=qel}k{|8Lh30ZUnbglpZ002ovPDHLkV1lw1yR`rS literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/153.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/153.png new file mode 100644 index 0000000000000000000000000000000000000000..8de3efb679c1d0bb1a3eecb36549e392dc2ae552 GIT binary patch literal 1823 zcmV+)2jKXLP)uTo4dyG$sG8h0-ID_ps7ZCqiDAtqKM8j3+{T1X4iuYd){cBZ}e zp4Y{lJ50k_+}yA8d*Aas&pE0%IXc6@3&4Yy1Q}#z?O;G80jXJLNH{RCe4=46Iy(B` z;lrGxg4ux!yzs)nK?dz$2WG)6F#<%Ag8-S~1aS71`OL_SU>MYD)rE_%@yyVmQ^_$k zKEAcJZ4k^t(L&x}YG9_KeFHN>cRqL#42jH+q5<%^6s^5II{Iihj z<-x!SUnt`w2VMvc3KJy>0tB<%20>;W86BvwwO7FWQ%9_v9u;(h#B!V=WoC(45-b#5 zr_a#M=&w{lLCb;i;6+KwuL49nSgubn>;9d$)@!6V5?0rPwyqf^r;-$@@I+vgychUR zNYqOd%+Abo-*h9_Tj@xas$O}JfT&QmyTvjiH7gHPhw3Lzy?FldVBiqo6BCq1yRK*HTs?M=K#XWPKl8jhsM;g7f#HdoSU9~(wf|B+s?!N zFTeO~Z$EM6vDLr6zq7K;QEo3C@KvvpQ=cd~<^D*@)i)@W2UR^aef;F(WOaHv{rr

        ;v$%%>G z-QDMghPQXNYqi?Q$Vju<^ukxX0whLaWZ+3Re5D(QeKd`g&D2n>(qhlX`@X`3# zd?QtkLacxvf{`x_#XfO|Nn}@IvoH214v0kK~!Z{OK%%h7(L&;Gk(+# zZb&G#l{iolscIsmx+;YtB&0}4AR(dh|5&l;f`~;|EUF^4EJC}0N-0GF(vT3RNymwu ziJ9j;Ebbk9Qbx16qj}u#%z3GbpsJ*%q^_i?K_iLSQYp(O?!9BbE?d@$P zQ!x|Jmwc_ny?v(DT3lKRhbPO|R{r{9tKMi1&LZEF+{oth{!bg5v$GfX4}#9+xms0i z{2I((Xs)a@zy0QJaMZUM2e?!)g&K6bqN_^kN&vLGOIaL~{Cjs7Se`#Ptr zUR|tKye~hy83e)dmBqQ1|Ib1CM&rW0@7F;VUOV+A>mPcd>N&?(auNim!{IoJqBu(9 z*Z_)IOr<4{Q;bHVG!AEK#!&rm|MAY=;oEbye@BPUetSm15WQZn-|vgdC@290`by1H z1^S}B)EFBkzE&V}8kkH3^|}Y8&&J7V7`9q7FJA@Ch8_faPc|N+$UgUWacSX{+^J{* zQX&Jd_j-H#`vM5W+I3DCGRcy0l%!cK%FA;@FbrQYJ$||W!qRc-KjOmN85AMc8$JOg z0w6Iou!hQ%NXdj8=gf$VG{BuZUw^m0J|U%uW2D1<>g$CL288A2vGk{k80Lh8b|NoHU-%dspfoG8+P$_CeN+v{X z7!w&?w6TnjOmSf8Vi`ab)y>la5%C3{NDh+7h{VuV3KlcH#uJF6CS22*-hhHKcIo*d z1gv+H7JVip01*)oJjXm$DwY#2m0&rCp8zT)wIC-6+Pz1Hw)0Fh`5Nf9XNVP42`+0# zy3`vLplm5OKx!QBiE&*>N)>oAK7bEz-Fkm@RTULqCY1+rt`PwO{0EkQm#I534DkQ} N002ovPDHLkV1mOxfjIyG literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/154.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/154.png new file mode 100644 index 0000000000000000000000000000000000000000..20309782719fdb4b9039629ff8487007a2783f6d GIT binary patch literal 2002 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 IM6N<$f}T`T&j0`b literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/156.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/156.png new file mode 100644 index 0000000000000000000000000000000000000000..58a996c5680132c1bd4ad74a059e6e54232fb59f GIT binary patch literal 1683 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/158.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/158.png new file mode 100644 index 0000000000000000000000000000000000000000..7812dce69cb19c8496bd2e25eb1ec23ae4e0ce11 GIT binary patch literal 1832 zcmV+@2iN$CP)LPNbq}1w)M> z;Hq7PGHQURC@88R5VhVcRsV-u-vkRHQcW^Kr4Qg00Y}Y9ms(rul>mln5>YiM0R*12~h+7dOM8yaK5!@`Q0;=T&%_*Z_BbA1RS~n{cB6@MA z(xCEBz&a?E)n0GDEXxoBwA-BzZ{6D7-kHv3)3Y-J-S%qYoYnBr&8sITpnkD{WKv5}Nery7jkdP7c6WFBgTd|Fw?(-5?&#wWZoGYMyVEX4 z!)}qMlNZNdee?Yf_x@}Y?V}e*)%8*-qsBL^R**rfbuvBWLK$E<7#z1Y?LjNUm;K@J$@u(}Pd__8SqPLDVatpN7>E!QGnt;6Iu%l_ z$#^`QP7e&#T`)c|PB6Nu4SyK`k!6uJ5`%aTSClFVh+t|YEVlNi+` zwsC3n`!D4G^Mm+zV%j_-~x~CumPdNSycyIY2fN2LvmHjpEqr zj~UzZ*guXj?>$*AAL^#LyqqE6w?~q!8>gzj-_4u4xw~InjFNPl zu|#Ad(AB+(7|Dxjv)(ic6veN%cM@pI1Zrxzh`@5OWFQldV(Zi?@}m5EzTW5Me6eBF zD|Y!ekFR%CK1knf`mrPl(m(grE&;3B`kG88ll6LSNUsOt$(C(HXb2%&;QOsBALwXnvlhxKdeLBM@gNIdW)iGm!*xmf}s;aE7wkoXG z7}eKr-k84d+m|oz-@f%M-xCTE3sn)5Ru!a(C?FzH9G?&SMbn%`Cf#P!i{WaMefRwj z`$OFcmkYDzQNw|UEfA9t5tFfyK2y3eOQM^f zU%j7iy6FCgr1v5Y;KP#2vE(CK54X1ZC}t+Ig02v3R0`E=-vs zm;njqzy!kbQf&Cq)KrbLwF8cAbl$XS8{K(;blL)lbR$Q8@$8w9m8#cq1tJ{Ncj46* zP*r#fqYA+5x&xfHGH%0;y5RWs*iF!;{d86WZ5OrEprxJ0*SJ$ zEY$N|6Z`~72K+goQSGeJzZa=`EDr&Y0>A{KR$w?BwR5O}7e6jSds2^gXt>^XzAt>C zDh$3%NC3Ot?g+Bh45G7(_)i7?_bEI9t9U8yfb2_YLj%2H>uJJa>B;$S3yyJohW`Lt WcCbh>Hkba$gz6AgpO(T82h|TB%%pe{bEmhFk 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 WKTx`<&O_e-0000kbnP)cn~4eoLn7G2 zC;!w0Cjc%*&RKG5CMSMSnE!nJo)6wQ$!$QA_Ncs1b`5#lu}vF z%d*saQA}4?SGTsdRXS!_gPBDjr3j#2B@sbH0JPRwYmG682mnNk2+PYy+wJ!C>p!KG zw5VvY-3x#KfH9Vcu+eBDqA@0=lx1~Q$83n$T5GK}#xiRIvDU>HL#Sr6qN=JGLyR%T zsJgW}A~CZumYIl{Qi?=amh%v*;cx%|?e<jO3y;nC=O3X~e8U_(E8|S<+&(r__B34yZRb^SuXR}#V zl~q-x6xD+~Z zRQj%s_{=nB^FM5q0d-6Op8b8+=Z9WDbM(}ahogJ5!As3-@AjRWf8YMO81e$69BM5fNsqn+^boh-x{`8+Fr~$60G1^xf~n@y?rvk9_*c z)y%s=zj%=Dytp#jxOn->`o(UydtrTjb@lX(8#h7-x&{HjC{ntLV+@_n@_~Z~Mx)W; z!>@kx{cp1vvPP@UaZ(IDw0L3X)LQ%eJDtz2zWwnunXU;kE&G&tRs*V!DA!4aCm&@hOojup>b*t6tUZWiZ zplLzw&7<$@Gk-l_Qz4#G&V~lmXw&!^OP$(2;XJ?zu=BZOBQ_0l*U+;Nd57FOi^lLlM?*D#Au+fp4wF9fs zXkWYb^_N$#fAUdLJjmsF zy|S_b2qy|Bc6MrKri!lHZ(A?HlRVsii9Or)%!YXDo5%IN7e`Z?6pa~`)zXJ&Mg(3{u(-IGP9H0m%kg;p(xuCe(-S4>iSaio zFgI8F?uVQ6^XFe|S^DXZ@80<>l}dtuqY35i&)>J(ZGCELV`HPbRjpR5q$_mE7>$k) zX+SuZmX;JnsZ=V4VT_H9>8Ewq@4tOKf9uDaSHAc(ri`ro^w@Ef^QBoPz`wiee?0or zFbv}#gG5EsMorTMK;QQO5UE9^$%u^DLf3WEG-X-J=kxDQPVVmg7oa!u!SqRea`n;L z?O$%oViMe>)0fxoeajIEfB*r80{{>i%CbVbK|2^jx{`D{U9Z=}7tRDpiHvBXqKJYL ziK#~tV^5!yZEHXD9JsKsu)Ms?`B)Hy!8vpQSqxeWIB^3h4?_g<7=kDhMZ5i;@B54~ zax`QcU}(hSanm#zVAcjFbP|Yj3EguBCAv?6j~G|@^rRsw^}U@8;VOvy>MZkUnegbxqk8J zj0qt$SqLG1yNp&<^#~&4i4q8Rcc1h0hg*uWtc1lLVvD>qEk&b|OeVXzS#e#LAVhaa hjz4^)gA`t`;1w@8Ut!);?pXi;002ovPDHLkV1hKX*q{Ia literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/162.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/162.png new file mode 100644 index 0000000000000000000000000000000000000000..01a86c7b21f5fbc379dbc304209e6176723e8b3b GIT binary patch literal 2094 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/164.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/164.png new file mode 100644 index 0000000000000000000000000000000000000000..8c492e0a61723daa695f94836fa4db41120401e2 GIT binary patch literal 1960 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/165.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/165.png new file mode 100644 index 0000000000000000000000000000000000000000..dabf597e470f0a3a4bb4f2fef37be3504e4004dc GIT binary patch literal 1872 zcmV-W2e0^vP)L_t(Yi9A$Wk5okvu1j~H%goLU!!9V0)qpH2 zivgpFz8Xw?_4ms~*(iI3VU{`P^rfnN=s>@A^3_-MU2wHp$2d*Xh)6^P07OJYh{(*& zd681TR8>{#BO)RuLNmxYiHNEIAQ3T>832HpnVI_p=sPv)SJB=fD5^?|+C;cV}h*K%@|w z5CRd`4eDU;8zOrA_;`PR|Kj3enxgl<>-t}Q`StAVe6d*Y{reAZ-aJ??SM?fg+Z`W2 z`R1F4FJAmriZo3lB8b#9Z57`+HUsBe+qT|^5JKP2E-x=)jHO7|b#2=b@%j0=nJpFz z{^End6)xhh1&02X631Lt@)o8P%}C&m~;lTsYVA*B>T z)3&V{AOf>%nkMJs5b@;XO;wnPM2d4hgoc?*$)yOhL&Uwkz4!0miIl#dbzR^0^X>Kn z0H!phl$`U$0SKV!9L{v(4&h76XsFbGd z@7y|wxlGfz+g<0J#&H*8G}CHpRWUO}LZopVVvMeoETRC|b+eSx_4Q_&Mj~7+R?ayQ z@jk3qiyt4|8+XgAvBVgMaf@0QA?K7*s{G8XluSg-j+uwyV@fH;iTi#Q<8f+)o z#t2~3G!DaV7(N~z9&R?9pN}6Lef#MA{fDSHj+3Yv!0zJ?LDqZiyX~$X#LPr0eVC?c znkLnfbK#no&1RExGSifzh^h)AoSvROIr{qW!Naq+|IPQ7!!QlgD58J=^BR$2O55FV z>)_Uh?e@Wg`)6mTW>zzwbIdvAoK=NuP|YOgoKh4KW+zer&^dSf6m zxZQ45b+g%ge=xf)cy;wIrhIvM2>>)o0J1{q)n%OvF{0r%#`roV+oE8f<3z z^N-)U`Qq|&Gn>s3VR-v@*Y}G&zS1|tbA-4y&r?Zo{*CR=0D?=(%j5!xG1*mREB0?l) zCL$`OsA?(sGp?DIlJDL9(ls3b7_XPhrT6|S?Dv6Td%1J7HA-h`1?6TyL;|o+xPYHV z000sH4*&rF|NF?bMF0Q-?ny*JR9#k0j}~7mLY&I;*W6=wWM3C51t}AjP|NoA- zAdxIuMJVqn@V@5Fr@K3c8V`uu$a34$3pyxKR*c}ZAQJ{4dzx(N1;G;LkLw>g(4DxnQm`y4~GNf zlZe?>E-tTDt7)1VkFWXget4AKCzrk-cBgYcjFVP-7Q-6P)+O}2ItomQ4AP#&NQw6)m zVyLQQ=D44TRI{oPQ3!#EKX1PbPIjgyWd2l&?`}WU=hX+v6 z%s?8BF~Lc|BJdR}xRS^pRq>bgI=VitZf7m^WrmSQAELZEW^+%8HHP0D>9i5Qz;nIcFv4$W}41p#cxYRpz9cAhe`nW>;m zN|l%4h^S;{qS+{j!06y^%%ZAh7;@|(fPmEGZY3T#GjMhyf+x-wpaZ~CS_WtVKO!RT zIARW1z`=}`n1v6hg{q2VNL+|9;rB6cM3hp(gurP#$eglB?CTySuv>qlkbr3*QmNpge%i=DL|n zsya<$&N=5i&-ZtFOVIJ0b-Ue^1;=C-9h@H-P`Lk4&c#=pi2et?hxycZ?v`i(0000< KMNUMnLSTX+Y@D6| literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/166.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/166.png new file mode 100644 index 0000000000000000000000000000000000000000..818217df2e6a3c23fe38425d32bd36f6f69c7418 GIT binary patch literal 1826 zcmV+-2i^FIP)j_@oEEIijJuz7J`Dop|tnlm*7Tc#jJ z*((P~?#Th9rz&ZN2sBd~(M(Y)MCAk#!K4N=c1(gGGSp6xqR24GB==MF?3l>2+Gk6) zObbCRQ|$z3+jP{D1QOw5G$28hJ;BALB`eBNRZmjNkigGKF(W-a$xhHhP}>wF1B5$K zlu{#g04;{6veq+MPO(nUS;8HMAfgmSOPUMnm<$HltL%j-Kw(ObK@b8PJ15y2(Bw3% z^BIo@(J{@N7NcE=HXrPrTW_8-%?Gul+UX_FPHDQmwic!2OvRB}rdYcJWA{(*-o1DK zK288lW1$Sra<)!e`y>GJ4<^6y54~`!7i$DMPJ(Tv~;p3lw{q3)f{pR;# z<_^L2m1|p@n}yU!I^B`LqyVK6nq*10-&p?PyRW$XI)|HKuHEYmLu@~H?RwQexb*C` zQGIe@q1fF%%utj?m2%^VLBFq4Th16y-BLs4)Xv1Yvwq{p@4u$gq5s5NVK5r!XrpR) zbl9!yw6n3X)t&tPWYxm~f8@uL zYB(NG!a=`A<>9}(uiac3BwD6Y1SFB1>{BZPR+I(*cVtt)_tvYlg^R&4y+Jh@5$5)G z`#v1yUU$;pf3UfAZmzwv+g*PCa@h)nRGOL`1d*L__T+BWq`LaTl_*M6oLyulKKt-( zY9}SqWUn{g*+1@$lgh9=9QCjoQY<=)^R2l~ozjt0xi?X*oJscDJxC^55Ifu3QEGg7 zXML@Z0^D4^nolM^nvCl_Z^KYnH9m4{m8S7{a;&m-esNS)heyMs;}K5nWQY)GxXPh& z{|^8F|Noa^Rrde@11m{HK~!y)OOM+&6otoGD%akX(tGpO$zjX1^t~}WtADA zKvNVg^60$m@l%pziQ?mSL2B#()q;=#LnQCH_k72E<;le5<)tAA{`}qP=5{%mjLU7k z??WV`56jtnQ#G^u&ARnuyu+B}T(Tw*-L~=><_lj}%k;2a$p#U`S1xf-lY< z@2aLCy4G$jeO+#=rnBzqb}2^9R-4xLZR_qAn*vJ57zF`%_Wavz(^!$@Z%P5v$rykl z&z?R_T8)Tz7k?Eay=(1nzkgcp{q?f?aNFH&-MVaQ>#wdCb=5X)`1|7x1kw36N)u%t z;*YOi@1xi#Hc9~Wh>RgHc~Ngu!x?h3sNekZ)AO?@TWV z^=!V}mQ81U5J}VHfsa?$$<;NfNj)0e!4QTVDHde1jDNq(&tH9iGhdBI=JtMVop0)< zTvvd+|KqcD;redre2fu3kCB9d-pLfkh0$Y@%qCnAXOA9v=S1X0QM#_T<+AZ*wcl3F zuHJw6=VrbtV~Br#y0g7&_SU-i0E~D*1ruc@Mn2X|llA0u>f2V46U7rnLuk^A{P618 zH|H;E8}@DA^{ys*Q;I^8R+X4rtknm8Jeoghu34EB!0NApWIXUT$t)M>;OneG^e0HDYK1OR}G z;zd$>WO@(9KQ`cFu3$(GS~JO=q^Bh43!;c({t<807*qoM6N<$f<|k3pa1{> literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/167.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/167.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb1404f21acab00685c900d006beb960c69fba8 GIT binary patch literal 2008 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/169.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/169.png new file mode 100644 index 0000000000000000000000000000000000000000..f34b806b0dd213e8b8db54b37b1e07c5c2e51240 GIT binary patch literal 1942 zcmV;H2Wj|;P)oH_TtkG13Y*(5mRL&&6X zQXs5Ikib7cAO%G<6d+MiAX-YQ2vPA1C}}8DQIZBxKp8?pL`Y0xKPUe7``EX;_YB2- zCIpVQSe;_dxpQWQcC3XY2$GP?1rh)V2#^3USngOi!bqbPk-=bu%j@K$hS9=o3xPGB2V7J3jQ}BJ zERb+PfK5j-m}-ZlN%Bz*5(Y?}R%d5x8v@NhFa~P}>qg=~l|cyrXU?8o-&lV($pC>Q z0^!O{YX<=GBc&M`nYBQp8s}7t&ky(ql*W8p5HJ?AMOjWxEiLu?eYOk&0s$ZifsDbr zfx*0NlpHP?<8$c$D<#hk`1q60??3EUO|P!TgYr-BE^PJhJ-1WK*ojE)O{2ykLC_@q zi=rcP^48Oiajv&??&Wv3A8#)#wx0B#zOXdYq_V6>i)UW!Z`?jOSXXlEM7B&xs*@TA zD0etOOa=Z7F_$ra?|ty;mtTFmvpG2T%89)}9gFV#{M^pw!FYGH{@Z=lX{I<~oru8b z=A+uH1X7Kok&;6S2m}e^G#&sr7|6io^Ox$$`3DdBv%O+aR-M9TXN#-XUjOCiJKZ9T z1_xd_gPMBmb!x^n00!oRXR9(;uucTYKmysl3DBTX(9rtDcK4nB&l&^KLHRT0%=rokR$}jwYs{xu~okP?zJSR3J{dHLW_~^;t_N^xm*Y< zbgn4KYH#mAth{zK0*=z&rn&Mr00030|Ml5Lz5oCNj7da6R85x6Zd_FmgsZymogYue z`5EIZ5WzOsM6ig$f;9+>JC>=}Dz?%z4xEY2N= z7dYxuU0wAll&b0}57-*%(U*_Qy7%bur+a@KK6tRbHoEcr#Sf4>o9}!y?2JdF(bcS& zOwY!zUIhzpjYi$POYyp{DWsAlmr1VDRf`7y-@Ot0`}=QieRBKe=oNq3bF&cYAh#O0o7sG}m@np^eewCh(E&vu0HG<%NMae?%Z8DnxahBahgaF{KNQs{g&q0+Y24+HS%}~wH zUmyP39dw;KT{P3lN!>JcoT6v!C@5`jr*d6}r+Y#kFg3=lJGZBkN!u_P+Xl`ALaTx| z#$2gvIYZcDPHRVaFe@VkAU%4&*K6HKq%qMRhLS>PS_0Tnl2!(!@29t-QH33qm3;Yc zw<=l{+dN3Kr(RKJNq2XD(=!f-lk~=*OQc8*;gEhVU1dipbO+2*&j60-AcZuy6v+Ux zH#M+q;ALhI?jD?(B%G04;E;YM-3)|BC*dI6AVf^+!4gxMQvgHO>XUv%!hNOJFPahp zM1X`+asf#d<{}-XGC``FqmIKH!|B-tqPxR`C31cE@x#evG8hcVT&^$snlPA4OGF7w zgzP9YN-v{IGQRXP2(1iO1gnDA(dw9bn96JRk!yXx7P)YJ(n1gkds{0z+}s@yZoRja zn2f@W%?+wtkLc!bhXDqrVV65}BnnbN+H*2xCJ^dMo@|z|mmT$Ba9A0;M1&07*qoM6N<$f>lSLApigX literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/17.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/17.png new file mode 100644 index 0000000000000000000000000000000000000000..e265fb302eb3d9f2a21ca6d4cabe49f8b8bcf1fd GIT binary patch literal 1994 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 DoD@Hh literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/176.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/176.png new file mode 100644 index 0000000000000000000000000000000000000000..d1eeac672bb9ff7d100bae79d440badbefab61e1 GIT binary patch literal 1718 zcmV;n21)seP)0Ft==FLu63A2&E^m-n zG-{y=5;P21_5Wo^7!nPdWeAS+rkLGImS%edjC}GTM8yddapYSn69obzT^26wvvhP! zy2%(8E?KQ0G8+KEWz&NYN6)D3{|sbI3q~XwgP=h`3b!K#7&KB~I_AtPL zv-!hM-#zHwfB)?(yZgPx)f3Y*(__4sE?;6ILn`R*oxcG%7RHHOay*IA)%^5qy|?r5 z^wOEl&Cd1T)^FbavpIY0+v`_1w%Tv5zO}R0Ys^2=-Rche0}$s0p`#Q{f=2}uM*mw=QY*uVl1AhF7SM)x8XY}p~f)gT_>VHhlr zlh{L?jJvy7RL$6IMk8xn)zwvX&gWHNO%Vy?Kuxn_h&bcb?cVyOe)=urqq3Y0U%dP` z`S{}1^PT>Un_IWaa-*76tui(;POa2?WDX3{Vbyol`HAU>xugOnle)8bi%h&&n&&$o;_P6|tMJFPne!qWkaFFLYf#B9IsP>}chzOpw z`^1nasj3|uqFh?*Rbi4OUb(t?it762P6%;yGVGvx^x=3qJ~mHXc18vm&UG_*2HVEB z=0{N^L;w_p1Y~ZVd7sH#%Hz@1^_>)P^zHa$I9>$(J328Oce8u9($Kb=;|$@o_}9UY~Z8aI}|6byi8l`?d;FB)HT963lGB?yt2zpJe?B&IZ*OAwQH zJ$38h?X>{cu3!5;7^vS7gHs(v2!MnnXHi0ukal-=B`s8(jE(??V$R}sJvh+%<@dn= z404JJU?KvOq$DAwI?6mrNFUz6Cp2+mvMptL`1p|ufW>744!xEIurNScoWS>2z%cLD zr*6#>x#)CB6kAb!hYiKn_Eu3878=x4L*xJge1E0=o9?iUlQU&+IZ&lWLW0`3!K6Wi z1qBha*|`G%HJr5j&yA*a1TyGsj2p;Uu@H{o8_VSeAnkj*wD5o z`VYf*21U`%L$6QSPdNjSkSL|q?rJre!m+|+Qm=QwGDIoAI%tW10GCv((+i8vr~m)} M07*qoM6N<$f+89uLI3~& literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/177.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/177.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaa24ece82cee52bc9b3cbe5f66bec3801b96d9 GIT binary patch literal 1773 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 QU;qFB07*qoM6N<$f=+L&ivR!s literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/179.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/179.png new file mode 100644 index 0000000000000000000000000000000000000000..6d60bb001c5061a3d2875bbfba6d2eebbe39cae2 GIT binary patch literal 1946 zcmV;L2W9w)P)QXwn)|Vj)9g`6z|qV+Q8E zd(Uxk=8b3Z@{;%N@7&+VIe6p7dyPheh(sjD0DwfKDp{6=kc&u?q(qz~iK=!w=P?FV z1pojP5kw#&=e$S^Ap!t^ssbVa03va-*^Dt3XH-N)B+IfGqbhjsi3mVL$g`{?5)qMz zZ{7NAV`Ibnq`&{QBuN1?_X!a(GZDuaRYg@*)o3xZwMo;G_erT#M#Or( zzPr0eMD2E~R;zAqZm0@$)d3R?01<)Nv2%`@0l=W`KSX3^B0@xFXD>u#pH5CrMPy*0 zw!QtL**sKLW2`Df#Owfoh^D5d_V)IWh=|DO5Yf!cOu1ZMUS38t4^b721QB_kc%Q@= z0Kg&;LNML{z|4qfF)1#s1ke>dggnpl&CSiFrKRcVX#ns(an7e{Y9x{*W#$+IA_4$W z7s6;QEG(#k$vZnc8)Foa7$bV0h)7Q#EQ;ANJ7!iD5p~X$%Y9ka5fNt2vMkTDLL4CC z0s#>Lkt{FfB3ph8-5#onhyV%zb{8TvpGuC-I-NYvdWcDqW?2W30I;BBr(%r3#!3rx zyNjC1&bbhRh?Eoe<-*6~?|(Gd?~gP1?U$dM2m6nn{o6XvL=-@od4B%W`}dc$sGfR- z6-7=EX>4rt=;#;`?T^Wu6Tkknc=g?hk*jZ21};4PXM@weE5jot&0DS0Rwp>;5OIBd z9RSTyORNQwO>PUTP2ADZQQ-=FGX3H2fBcEy(^B8xj~{6WjVG%cYmd*fJZqh_TkWWt zMFCI%jZstuv5Rg>IOlvXQX<_cGwaF;egE}W@bX1-?Lic|n84vqlp+KN z(xN84aNvL_AbMzfLaK!L8@L1zhyy)D0;v=Z^jIz^ryc+ap_bk_r9o6KrP(Cw#&NRV zeLv=Ln0?Q|2Wu^@XTJBnneY2Vp-|+7T3=rWuu4f|%%u#uPmkZY z@$K5$8t*XEZj2$axUleIyWK`aV{$pV{>|5?7Z(>67e9LQ?8k4fY&?qp-r71gRQmJr zZZUw(u6h)A>(5L)H8Qqx{`}PRsq5c;fAi)KEZ}~V2dWGptfeq47^8Vd&MdtacjA?E z%NtSm^z*Ha2kod6XHsEhtkyXB(()U}o6o-Y{>8pj+fnqvl}opO`87!rA&~diYfLU` z6BA9XRk>V_*dPUXiO?4rIf~KW{JIQVSaw@g}I&GotNiZO%>ar;h%o~O-lLC zll{X~5{N|VUXqfvh~S*kZ&H5KOG``GY@SThB+D|U$QYxPvepJc?m|HjOpe!1REn*M z`tSGu-R<@J+I9~TLssNd{y*Xofki3**=S6rX+O&{qTC`lydXlW)!N+ri)W6A>Z2pk z_BKmAQ_SA$>~FRL6t1n8awM`sSRM=_!!$VC5X{g1{yum0$;!9kdkC#10JPRP_?}PhMBIs= zT{Z}uO|f=zMfB~Du0qIhgY$u7fbDc}bxwpa2!vx`;ID8bwDGrR6%j)Q&Q1VenOq{{ zUv(erFbXEb)53=6jh&0Tae|PC$Gr+d zfYcAQpFK{|0AP&q@P$AZvk_4s4jiBHhhA$^ZZW literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/18.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/18.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b8aa034a528e9c55d4175d21a91dee12c714eb GIT binary patch literal 2038 zcmV!F#}Zs-`MtO5^|tz*JRL z%*+gk{BA|>y>pI;%nSg`%sEHQ0)SOjbvm7@8k%WYZkOd&RSn}#R2ME>Xt)1jW)V@< z=gCAwd7fukPUNp#xzg=+W8@IB-Rdz`SQIr?MMOjdfb=9HW=?~MFd_nAn%z0)9GRK- zA%s9gsZ*8(5kthP8Uh$Ir#56}sv^Pw2C&m6l}5z$;(bUWAYxM7`#`j#iT6QO>-9#n zd0=&QMOB#@5k-WVy_uyA?0Eo~89L_x5I~9i?q*q*WmzsFX6C&&Gek`3qoX73c3Xr+ zG>xSys!HSIjzs;ZJJPMgv1K_U=2j^yvOz(1|f3V!d7;4EoNw1c!4j*^B@nge-)RG(~hVR%TYK zjS@8mgY{RB9bfow`RRJ!=kBHE{y!F0PR&g{SsNaoJNfpTmv4Okb-GqrmI*W>N_Ozx zQ*ym?X*(q%L~xEov@C^VwYjzR=ie*L3YK4h+$2qiBbSCQ$**z zA6DqSZ#J8UW@pgR(WA!}{#jmJd~)fn`HeobAMu&9=RW!9l)2G+zx{sg!;1+WRW;iI zlQ}v>Tv}Rkjz>)fJsC_RBe{eZ&Xzj$Ip*@ z-@JJ12%qk)=8;?kx6m?3Ul=)#3DEW`v8AR+x>ZR?5qh0@)%U)!Dj=bwGJ*=!F6?GSveR%^AM<;nuydt&DK`Pa0L zM4pt=N@-?gt@9yNE9H%i4W*FLUAerlcyaE=%DbPgEPZhGt#7}-f8*Mfn_vA9+<5Ov zGfmC%@^Y*7FCqy=oO9kgUR=DqzyFu;NXkj{m09(AgHjX?M|Lo@Cu-GhuSXc}+}%u5 z|E$&hWaa9?(Q*Bx{_>l(;q%>%^`9O+dMrs6nFD~?*;zIw6&P5XUcY{AXJ-c>IOnak zW0N|Y0z%{LnM)VnR0MnbhcC^(c)C8-@Asysr_P+NpMPWS*6m;J{rH73LvcKW0Dwe@ zh=ak9<2XSCYtu9}&1RE`y!Qa2pa2*UvD@vZ#vDFvc}xIdYkT*?`MJk`9NoJ8;Ny?p z8ML3@zxSQ!v2+g+5;3!4W;}JOZmq3UDxFSS!UurNj7W%RjPX8{;tHagnVCV3BNZGb zug^EOc6K{GIQz=E?e(vX8RkqxfFSLLh(v_7+LUuP1SlF#>qsdL0Mg{%ht#@K6f2z! z#-Z_Yy?Ua4aCCffy58>||Mu{Xz(X8D1n&bg3G#@Tl~NKDNsHE+h!BC95UEPd)5gv?rNm4zsd%Q-1Q1eS=k)^bgt0T6^U zL?t3+ZNJ;?$fw0|v0g}yKwF4SK3@PrySzyNL-0hjw6x@$L&QeoRp&+xO{ERT6A=Q3}yG)}}vObc@a3GuG~^X1F#wFBQt@);Q0^Bqd+z{HFzdZH#t8AnA!a3a z^XZWQFt5?faV0Zvk<1VT3=o13!HcbOIq7ygq5;yVh5M3QsYuHIkednspo%$CUP2@> zE!8dP$gTTgUXq3qEBV-fN@?jbDHf>$DuPp_LL|@o@V`rr=LCd_Lds$V6Dx%9A2Hza UC#mg9@&Et;07*qoM6N<$f{0Puf&c&j literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/180.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/180.png new file mode 100644 index 0000000000000000000000000000000000000000..ce69e836968bf031ea04b881233105eab3848eea GIT binary patch literal 1763 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 KMNUMnLSTX<7+Y@u literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/183.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/183.png new file mode 100644 index 0000000000000000000000000000000000000000..36af4701ec123a79a6414385dbb0bd9fb10c557d GIT binary patch literal 1749 zcmV;`1}gc9P)e?xFZ* zc8#>fXm|E^&pr3tOIz8L1VsRVAjzBbK+8cu4geqkDZ(Ql0HCEW0d?=--rMi|`uOo2 z1t2hABRc{OB&8N1Zwr&~2yfbF8Z4uQ1Ufi)e>N*GFE0U}oSe+j>1BrX9Vm&b6zc?4 ztXhq7(4Ytja##jhLaQl30_=z#R1UEHi44{o%!`49H}b0O5dsLb?ZXT-0EjgtSO$2D z?ks9$r7mdz1Ca#A7VR~>>7bn`2(+$ofd&YQkOSW7NbV)!p&Jh}kcuU|fu!^wvLz=d z2?Ur&=%tl*8jfg(IgF|`E%DKHF48flV4b8|E|meKNjbz}AR*3#;F@8+#+d4*|=t@WviK+9->VTqR0vSL<} zMqAkgAUR^GSSOeF_V)fdJaqR&fA@orKm7DTb!wPtxj#NDMo)hK?ddN+kN$kt7Jz~5 zvXpj6k^=~^EG?0|0hu=I?EG9HEYPyAzWwos@4wj{?z}ea-5!LszRfPrPLGazEj zeR_1%wQ_Cja&?vL+UOSx4a>lc3c_#4QPrrX;Or%jeunTi?fBaDWrk++2>zIzyXqV-E3~&7>`F6=NIl)OzXOCPL5xq zX+o9_hl6yfQWTM*CtZ3uq7TKcML zK22yw*J9S8>rit@<`5dIffzvO@4x*D%4RkhzFqW=^hq~+{`{!b@`FKtG#XZQ2*K`0 ztGm0|b~m>Wtgb;uqCs=U?HkMj1e&BO;)iTr2lI9BeMquF9Hna{>B+m#zos5v#KXrn76h2r9~rDdX-LElTZUkejN%}gst-wXn1cF9Z<*)0_cZ}CKONrey7HubTyAFL z`_Zr%Uz`tAtD?ABuIB59rTMz9Jk>FM+C>Z|tu_zy3ULRPlRkvKn83ocxWVyzUCpj9 z|6V^#XN%(Y?V#W9FPBSrU+pSrtAPy;zSfYy%m~d>pOe8N9Vpb1@l$9`7M+q!}<<+ZiVuryZ!)v6Qjv|l@Fp8tL;d0V7eX_VVAV5F}W&s33V>^w_H6`NS z^OBoWBw8lGr_Xvj4{8fEP+2-gQuwelrbRFj121T*%Xrw|HtM%2@zn^^i*?2nJrw?l?BTOI@MwW&O+Lo+? rh#X%*Tv{O1R&5SPPyYZo#3b@R>MgF literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/184.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/184.png new file mode 100644 index 0000000000000000000000000000000000000000..1a98d7150dd011339a6720d4f4011e9aabb380ba GIT binary patch literal 1855 zcmV-F2f+A=P)2&- zDiS5AAqEL0Cd7@23voe0LR}aZ?)(gH{5~3uAA!V#8o^4FQm`Nu0V}lk-uKTu$HlzG zWVX*aXU=b)Ap%KCfG;}(wXHi_ z01k(T5FjZD$pOekb^-uEIdAT!EysvJ>jVH9xTMgq8kKP6RJ~qrT$ULm!IhPjd)qr` z6$OC^{9jjKAdI=9ydvxvjEqLotE4(92}zQeX8{J2)J|m#F62FEDUl>;y!OTVFE=+B zjgkF+ziMiN){Xty!RqN#Z>^qMzy4(tbuc^}4~HPzmn}d7a0Et>5b{nPz2fWw0wkk> zV943|`pH#{>#4b3e`5OFne#gjw=aKog($9me%b5P)*-6tFI_s<_p>`zVobmM!QWIY~jY~J|p#~)r@UO2)A04LsDz4Y-V zzPtxO>&0B3^m*`?!)Po6yYEXT%hY}`M2=ACc9 z{w6CdEiXUZeURC(^B=5%y1Di9-JNYt*+kK!tl2LQ4i2(T)`bK@E^E<~w>Ex- zz-a6S>jX#`r+QS5UW|5kb{7^G&b@m zQObfp0OGG8vE=WtV8x0hiw0=BK)hlKQcLS7k0ypZ>Lj-B%=uW%T)P$0UEIZ;bI$$d zd=H&z&HzxaqF^LNpkQf?G&3X1(U_h~i_3@q9?UN;%r_Ul`114CT>H_^!;LrIeYEw{ z=C5}u#AR}~lik&km8dDB*(eA^$T%1?7!+D~3#BNU_1XRX-EQ~yi=)xt^z7nv_{W2- ztL>FuZ~w{OiN-P!QDlRxJYPC^e2)@a@vXX z*#%Snar$JpmomZGV8Cc_fP!X|q$HN=3XQq;^NTMNDlloYt6iB(_MM|nB+Do!{e!;5 zOwI&XmSU623#XEqr$_a$5`PB|hcpz89L0Qq$q@-vW(K8{kk4n{QlLl%koz(B%l8bZ z07-n{b)nsYh&UAmOB09%6LLBxM1Z-4`Ha3IYb7wLo18IOq^RT=A{3}R8$6R_b52Es z!5EAo`+FXoayC3mCGx;208A-1;Q<8V)A~cfnB+tl$(W-~dIvz^%u zRf_N#$Hc=F2*!b->M_}hocNM&r+h2|A#HleGWnnqB|sTzqbNpkN~1tnnvDZXW3=VV t%S%g3d4KpE6nW}O-~^KDs=NRf`5zWB9ai`goHhUe002ovPDHLkV1n{paOwa6 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/185.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/185.png new file mode 100644 index 0000000000000000000000000000000000000000..23c08eb843d9d8ccfb073ef0764b606e2643bd5b GIT binary patch literal 1868 zcmV-S2ebHzP)oZ&XzjU2C6n?o0>DM~k$iK`bH0 z6bJ%-z=IzN#u)5_KY|}3#>B)Q;Ggh;#CM+z#Kags57Q`|h>&TI*~g6z~iZ5+DEo0USFvyS}~-2>@sy!AKGiK!l?HMGg=I0LBSg1P$`4 zoAMrE3CjQL4$#Ihkb?vWc?CmD2n9oe)W8E0LW^cqrIe9JQU)06UIfUOeQB`J5U;*_ zb1K5&84xYNB2>Z>021<`v`C8w z4;_}5lFKt7$ZJxy0qOMFbFj$RmKQsbeX&)>Bs-^G|EWrXnc?kv*%4O{{1c0zq%UT7?%VtKw;!ArhF+?VyFf%i| zvAGFA61dmdcA^!l@>8?yX- zdjkR_Rq+RDX=>_lx7#HRWMF7n(Xq6TX#xN(!BW-QEX>TEUO4^Htsj4zot^5v*m?M9 zt=+bMe|P)YzoXHx-0L|2E+o&pRqB_PmbzP8Y)qEtV4WjYbgC-~&-E4yDa7KHnT4;u zxOVZvsqO9Oe=M(jeC51ZcK5sYmOYnit82ZT=a$Sz*?mY0q}4m7j;uiY4*&rF|Fz+t zqW}N{UP(kjR7I9OZ(KzbhTr$h%=N}=uRpYF1qeof5`v|06=?apP9LP z_05|%ZeM$C=j(62|LV)n4({B1_~_B&!++jCcyD`4PEP*qyOuNGW)x?!keUqdFQ1CSvHGTG%KD4$(@#DahVJdR z7Ke`?1_wDZ$ z^I??j=yrNtgDEWL;c1#S@9nKyw?`={7D2c1D#U}J1o{a;=Om?MnsUHpvO))lx1j+6 zdW#LxV5uttKw5F3OYE1f2wZ?TN=27Rr|Z)VP$)h>!(x{?oW~phQV+m1(p7MQ6hKDP zxr~<52|=!$UxN#vgA1#=E#x3ew8qvnu`f?H&0jGXRP)q&vqUX*G6*!n4B|*vLSJJpF8x}D{w3=TMvf0c)?5XJ zrjUX^4^;@qz_((%sWk|6FpaPT6M%G;4Gk#Jl*JMzaHHK?0zJqqb1-w(X7=p zQYsiMwXjtBnKvi{S(8~LTplq?1E7{7DUb+yz({9hxAlL86dxj{+BvTP0000X11tO-p0A^+(cvW?d*VfjVotcS4rXgZxa=dvsV0A@!NVvHg9<#O3>w*i2Noy$Z-BzoV3;8QIk0ssIL zQ8PtMDj_1cvMd*iMNyP_&Z+HS&_6ghXqslZtj#pW$joNI%tRbQ2*KBN?R}#vNhpAH zf|*^e3K7hVoy!q1O-+O%GMP;3y7Jy9#XFs@sv-g+iNvO<=kwDT)9eO-0AL2`o`^1J zFaTg??siw5a{w?HY|Q6#?;G!%jg3JFA%u`+c^XP2)^%0aRnyclimF`bU}oo~5z!3N z^F#~)a9NgSKtzd|1jckaZJH$!0ayq=#^Am0_3kj2K<)LlkInSaqfc9{)_6Ql_RnX3 zw+fn{p0o=K%h`N-)M>4aj`yo-a;^$dx+D{bsF@Kn6H%V$MNwv1mgfZ`scMX2Wo7Vq z@3*(d|8-iiEP>fgCSwr^QO#7$RrN`y+wb?UCq|R{$sekAZnUB(_~OX2JQ48l;ls1D zcysrUXZx=Kov?vF;Jv$MH`rmicqkXCA@DQ+(Naaop# z$tGx~BEsyBj*f0@eYeE^m0oA~=5X(;yT>Q>Y&P9{eEZeG$Ok_izq{IRo5gm?i)x`7 z*4KMiuYQDxRkcV#l>EVYo~IR^H)Ku-wtBleJNKUcx;Gkqcz0Y4hi`W7^q>DTTrB1) zkY|V}!{K3FoyI63`Vf}0*|cez)(I= zrmCCIcUG$E^yx3(esaBIrdu}$F~*HSx3|9Hm=k`v;}8O~bIzUfM4a&X9{>RV|I;O6 z@Bjb~ZZyQw*fAjI)u4&vhu@gvxD5w$@5(o%zLMm`7oDdiOAO1NcL@9_W zjjGZEF*J!|yLKF}y}NJbahTn0*u!3S_1?^HejmfCN<<-K-Un-~swzbK{^2Lz{`k|K z{oPG5Uo98G!~5?Hj-G_+>~gCIdpp~I{P|QQ0$`Mq2?0P=4P?`}soFAtiO5Xc^n7yi z=vF`Mzr{a%_gT4FeevnNpMO0*A5U)d{MqR!3;EgjQlh#fSs*jSlv1zP%k#{}Y3L&& zdGDFYL|fNYRaGL9$iEoDH(!2y^lWtZ&aG-aWlYchdU^8C%NuX_(dcBkTzXP)TGlbJ zB9cogB7?!8D2nzD2LQxu>7lA3BIej4aeuh|`03cCcrm^FAx zmZw`=Z}07GKm7WmN5B1!E>`6lQYkT3b>+Z$N<>J+v)Rn1+HDq=fMf$veI0e}1?XIg zvDmEsCc1q-zEat&t`@xvRDnqeHF)$sc<+hWdk^3ci3pjQh#PV;dvmBR`BHM`yD6oX z4~fVRhwqlX*^Sp;h&Ltb5q2DSFZK7nwn*DX)v?K=e5^9jdl$!nQ!Go{n^92ByHvoWPWftU` zCpp(D+w!4P$My1UIp`e5d!J=_p7*Q?+Xn#9`(Rjg4cVJpAJuNcO_sKRHkyI!!#4%7 z*_U&U*>{=TdUYdSeC^!LiLTp3IuEyx%$}K<4KNHLBeF1WqWIw8z>p;JL~I>n2Yt(; zP71E;%=qVhXv;@c={9962oXOAW1W(7P66OQl1%1q`>(Zs00000NkvXXu0mjf(yzb0 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/187.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/187.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c9e37f7ab33393c2b4f9f0eee76779761c5d65 GIT binary patch literal 2017 zcmV<72Oju|P)H4Rb~c2=bV`_BB?475s{f8BC}IfGZ0BJCJ|K?kz{575JG`SF~%4hW_Hdq zv#O+&Qc7mvoDU%&qKFKKLk2Jaj4=WL00KZt5daVokr2U5^Dh9HX^hRebLZ~eyNk%) z2LOmM)^#nCn4R|?5mQQL#>|t+gaH5mm^r)QocG>)ADEelh&ZEoG5oJ*4yqN-^s+w7hO}pK`bm?-hH#3<`uU`F} zh*d>Z0YF4jiqEJx=dw@{6-fZd0A^;0L`16Uy>FT(#+XtR$=2)X(`RGT^!xo@zc(6< zHa9nScPmxR3J{Tqvj=8oW+I|0*>lb>tEz|sz;JlDswx0OBml^)O*Mp2Rn_LkMt^p& zy85%3W-X!_D&x4UfQa&Sb~c~+VMOSa{PwFaUpTvbbn)o+&f^!BPJVUm+NWQB zQ$3lQDI#aeIWquwDu@vg%d(X#m=k-ZLqyF~RnM=S`tZGXUwY-W=GLn9=VnQc&J+ab z%l0SVUH|=`>c{IpW%_28>rF(?F#zUAD5I+?Kz8;ZD>J+D(fiB80j4xN-a7yBm50Cm z()C;vVfVpbUDh-0c;U@AKKuInJncltOu3M`ODQELI|_`&Vlw*c_1vnO?L zeCWvhsEy-lJifUa9&J*bR@L6@(wT)*FRJVK?fV;5wSNCm#zmw&*x3L?V&^;&nt_?+ zbA5fC*|p0s*AB-Qo)4C0JN-k)PYf0oi*8T$qttsPCY(8xo{SGKpIK_bw>R%hn?yt* z_`0qUA&-=*atK8xZe{?62OljAW|kJ8>$F~hQ~&Y zQ7DStMsED^XG&33^TKGFnAaEQG;**{qoT?dmDGA#Y~5_+KHZYltp0V4em00960 zotg-5000AsNklF+*(@{g)v2*=K#)_Vj9J* zbv|3J+gGE*{e$IX9PD(Ki)CJK1gjZ;_F2r;(I;QM{q2|J*B>l)X>U6?-t-XK1TV1amW?))}AMZB9!Kp->X-cyVj3)mp#z{t?&Nn|}ZL z?)H3^O=mOWdPSl8=f#W9l~T0wXfFvNj4^Q>Z8n=;ZzqYCSEB((tovTOUVHRtFASUO zyG0=I-E{iu-!TnonZ0CBIkST99gzh=T`6UZZME9-`IJO$I2`7Ara@?9u&_EwS634T zlg&DwMad@1DPtuh+uW|&2q>JhjLCz8gVicVWK#0=I;o5W=^tafuyzr})>_V4Q5a*2 zDjkIZAQ=?OPRBUs7=5_8nGkvev6NB>!MW)5dWb;nE9FTk5g9oxYiVq4IbyCv1|B|4 zYfVb<^5wUAo|BZ*KZv+oE&u?L5krKKLP$hXNh+D}!3XI7?~=EnjPbLxGp(~HPmYW! z(lpgNCrt(b&KcQD&+|ObBWGB_?OY|}4DsPf2!M>LGo~mCjffW)f0LzQj8k*Y0i{4B zwc_P&uZksnTva$!bOlGQi;>x*ii{}`8Tm_kb)6>&_|9*Ftm~3OJW{!`K3BdmVnIH2pQhX1s00000NkvXXu0mjfscFn? literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/188.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/188.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1e07cbb2a8fec02fc7dbd322aa30174daaea13 GIT binary patch literal 1751 zcmV;|1}OQ7P)Gk0V78u2=WiUcYyBclPo~2zU#f zgpeR0*?dWm2reY%{}7Y$gAh82lh{QpcV^G_KJGlzT~!2Sub8ZRW~#nd73SO^f;#{> zA|jHzn^|1CI{+Xe0GO$}izEObA^>1!W=6zPs+pRZsscD7AtDjF12;_{0BWtO)y&Nl z0L&Z_qG%l5Et2A|OGHprcR)l$G&3`!rfCon5fCY^0DveUTdwW_L_k(uS(q?A*VloHWiqFPl|1NHUw_0`oCvxHpCOvKE> zOre#TbzQ5fi0JOBc7FaH0000^r}J8CttHN?3IOgNY7!9{bax_B)qvt2Vxnpd z_WQaaF@S{1Ip?s5nIDV|-9iCoiLN2Hh^SVP1c1zBW&rUQ1wMBR%NQV_ftjb2A376J z)AU3n7`PiVi3lRNJ0gl?A{G%u3jahT$VDIl5CAwt2tid%L=Z8h6m`usFd~vWl+uOs zM3hnrK+zAt%}li-(gCz10{8peP*zyAArT}mmXE2XIFVP*jli1_U6jE|0n0GM+kA`vO2h=@D5o0&a6nSK7r$47&~ zWIURUM`rfq(FwVY#?!^)lW)KI>i6d_R@c`tK!|2#&&=Ak-Q3(Ro;(47!Jyxks%D&fB5Au>-|yO=etd@L?hfE7HBHkKNl{K! zsq0$R+I8(=Pq?b?c5j!b%Tnsi?Ong$UoIB^ynMCZY{&iP&E0KVlvqlwlj&?S9;Mt& zM?*6s5=5-El+x8&x^7oW;hdYpZgMjtqEb2{y1m)voQA{Ua5${BjK>pVT5mRpv|7EI zj*dptnSiY~+vRe3`Pb!(KQANJW*W;%)c{-~Sn-aTyRMBLpt_&i-ELP4yOqmKB{{E~;*g9pg#dDf zqdRl%c@#xaM%jSH3x4wzqUtTU0y{cyK&b9dv zA>EJ}Z~*Nz%3)Ech%j>qA%r0WKX{+bnB||%E;IXKIMrw8u1=?;QdUd-;E$)8OSjo> zK7RT$=QPz$a2saIIThY}B1XX7wpDc6m4V@R1; z|N8tnrhGa#U@ufsb<{T^RuP2`uh;9Y>v2&jMR*>R?xpKjt7X$ZuW#Pmyk4mmUEeoN zb6r(+UH|;ymmhxo>Hhv6Mg+9MSt8P+D9v(8vFmzOg(w0WW{N3^s0e!xsgXr>O=eAd zsTNC%;g64>4)yuVm%o7}Kz{%J`=)6CHBOKxWCXjI<@r4kr&hhgaY-j&6# zzx}>_I?k7KcX#*j@IYkFx!c>@&1OqPT$We3cQb=r11_+EnV7jKO6T07S`g*sV)1VM zc7Lk3yIlxA=LFXqFU9`L060wnMwk&Z&Dmsz3;u-+KrB~RRWjMvZ9jyvEK`ci#H=DR zStd`kMY_o&)|keEue_T@)QpzPMF^oN%Bos8=VA<9_kw^$L?Q@a!pvr4T$@6asj7f| z^XX7BP3ee;hQY%};qtIByqVX}$<8ccD~N`QC~Ro9>6{G-WezD|hM=>?$d-sG#)uAt ze?X5>J=8mALrNHnh1H0#*=Vg;M}(l6Q<|fnU}_#QMm!Q39DYnEfE3VzS(7eKY%xOz zqg!&$A~^oI3&JN&fpu0>z#x-H^R&zVAexY8G%mVjqT$G_5CTu*tFOjinVSc5vz$-K tj_0(2T%`)##ovJeJf#(oMzJUA{1?jeCg;8kGKK&E002ovPDHLkV1l_>PgVc` literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/189.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/189.png new file mode 100644 index 0000000000000000000000000000000000000000..e87a95c1f6a8a09da318ee1bd5795b79f91e92c1 GIT binary patch literal 1735 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 M07*qoM6N<$f^f8`D*ylh literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/190.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/190.png new file mode 100644 index 0000000000000000000000000000000000000000..64ffdcc85913d3ecd3f038fa7d865d0f93d9936e GIT binary patch literal 1810 zcmV+t2krQYP)&L_t(YiA+?xjvQ4GJ*RH>JePgWu5B#rwXHRQ zg@tS*0)$8ih(SVv93&EAGK+){@IMgq5&QuOvH{z8wGZ#Zo}Jn0?wRgehv4=achG9p z?OUhLIaNhwCJApnBoRnb(dB{*0*nBd83UOcNRSMq5rK&5A86rnfk1kb1|xH0X3UJi zXas>MucM+8;QDACL`u!f0MbaK<$;;O0V4vna2RMzw;(XkAfZWRO3@)e7d+T<+P-;% z!5EC0F%Q-W%#ED@1B^5(y5_NEW}uOQAQeUHWda~UXsIPZBp6eWB#g|=`WXNQ!bnn* zYS$trxg;S9K&!0)A+Q_RCL!5!2LZE`i$;*l%sK%^>x6`Qd2}gLD5o8$uvoDKrKfa<$%jFgAu_PYX6pbXe zHn(QebCU}aTyjSgBoLBPEdXegOSOAh`@GR2-W?SLyqt!&ov*+AqMS^RC-WzNKKbL{)5-X#C<>SF z+}`=?@sreha3%j!`^gpB2{I<(+Oy<}bpP)5XCL4A?blyaRAtSLtGCWh_WK(f{lVbc zwJTdA+dF)Huy+JNQZf%pt=LXzux^%yBF!@`Ro+g(qo2R|>HDwZJYL>hreb$E7%Xkh zj`m+q>v?s4`nouq&c@^7qNWQ~(}w^cV{V92bfYQ38qG|u$G<H@c z< zyg5I3bv`M|qSn0ZAe@e?iuuOo%BT0=KR+uv{cg7#{@-N@hOKCsTy4}P2c%A~TgT?% z!ymCUDkqh}Ezi#n_Fjw^z0T6X^QVnBtE)?UyGQ*__D+wBMH4c^BDN;K1tWt&P!veG z27>{Nb!Nex2M-B3RzBF7}?lLSEy-{av!&&FcYtN4-G!6$n=G<7{z}rhX zZ5N}dj&IgOQOw{{^auAo+`f9HZsMHFgO&AiGREMFYA@!qJQPQh@o;rCuO_pynif@6 zEu!P}SY1w^_*>H~z>&)~qZlYf4E@9Jtf`RZs8e@q>CP&7YPm4vGwHc8RB!vX`r0PdQ*NOGvi#j z(@KZw#Y*k;be@CJ7^_ts)h!AaI!Ta}iQWTqHza`7y8Qju?>D7x1hnVFjN~YT4<9d< z#inv~y;$VlyX9urSnr#V(4_z<%3qvnGRY7p+D7~7$rEGT-SOzr{jc*~Q`hEtaee;p zY^QBiRz*?1dq4efnQyDQX`R)c`oO7^kT?zmBuN40PJmMQxqIv!=}K=^ zyD9Z@eUq8I^H-?$L0^WHNvQW`quMBzLX*~g7cc+T z^%e(5&Nd(CE2Z>&U0yEN0o*!%{KJp)%OzzZ3TlU*)X_Ny1|=4K?jSvPCIx->VC+Dx z^=<2P)wq{v;y3I= zdSIT6C($1V4%V~VL+4@Sh#t4U#I`6>_?-H~2OoiA&&Tu6|9XzV@C@J4#xn=LWki|i zL@j!xzPwR|VvBZHB6cAWkGW4(ELGY$c`xU{|DQ}=PuHrqb^rhX07*qoM6N<$f*M?G A*#H0l literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/191.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/191.png new file mode 100644 index 0000000000000000000000000000000000000000..6535177a75293448ed5b620a8e50568e74381fe9 GIT binary patch literal 2128 zcmV-W2(R~vP)A5r87!trPQrkw;nurkaI$mh?sNkbY261$z(hl9eO_t!860+;^N-k z9y2jBGXsDSLI?o>%pfIdZKRYrX8=%2$);%wfl8_U{R6EPGYcUQv8pVh^xj>)`sR}- zyE#+I8IMQI0PymgQc6lG1OkARQfniGAYw$cwpCSD96!FOwNXkVq7cHlnYFEp7cX_Y z-4J}v*}186F2;~^76OO}Kp-L_meNF-nGq!b0I-xwYonB^DqGi$w6-M#B8n15#2CY1 zFqlrq-un$z>_;Dcyt%n~`}Xba?d^iW+S=N9JgMuZuA8~J`KD>F zteh9dROKlpOMXf*#wY~joP|IlBFY7jg1D4QN>!F1$}vU&u+|)P7d7*iOM z0Km*Srgw+9Zc33Thv12bh?ujK%33P~G6N!ByLPSD>ltITHq1oC)>>=pR;y{6 z_PKNC#^XuODaJrVqSdOQpz{hxW=biQu7wyxsgx2z5Rnk5wbt4gW0=V~XN+mJnnJ0R zG6c`eTAQ-5Qc4Q}0D>r&kyA>AHvk|arIc-VmT$akn$GpN-sx`bgyEBifBhL#oQ+0O zzMLt>P)aMMOQ))`MP`bKa?VB0M8wPh0)PR8lz8**XE*PD^4|K|&clt(jj=p&v_5~a zvvi8*=KuZe*Td~C5u^7$rL2@vN*QCyHi#kwFSXXpkaI?qQWjAQ0A}W@-TwTW`}e>8 z_H_Hq^T*xpRvPq2OryzY9EMNa{xjm#K67@ow<{5qQpQwDX(^=;z|0|poHH`BbF&z| z_s)Blb1EAk%1^(#ckhcY!TY0~*lASLik&uGUtgX-29y#4ot$5I(cL_9>UE{G5Ew#m zZnm^^(m4mfA^4P{tg2RlCFfKWSuEhjhj)JZ;k!rMkOPcId)8Jt4Hi!}2m6mFHg?&=%+KIl>oSM}C{a|ue=Y0 zz~$w$&bi5Cq7bnJn3;%$U;tQtV?6*22k`c~={>94ZK515UA{aV4iS0fLg@7lgwWRN z5I_JZrOJ_)YE@PB`+aMx5WFJdSI7VW6YD|Nj|X1P1^B1EEPoK~!Cq?N1v= z5XNVA_I$?1*pM{P1gaFJQq+Fvrz+4tzG{`Ki7F%%Rjt$zNO>^^J8PF?T5i` z)cv$~(#`J8%k%u~Lc%~L*BEnte*WX5Ck9}B1L{gzU$X#n*)&181qk_k2FTV@mfb`V z5eAX1r#rrBy4`M?cH6cAfFwznnTROHxWB(Y9* z@x}3cUR70bb9+0TUd?7x=iJR~R@aWbHwc5_dT(V#wNiwcIfUT7w;}=nZ{NOA>Cjwd zr>B^1o}Oj%`=e*iwtD?uSv4Py?w)KWF>+B9Y1&OwSCnOp5uy-TLJYw>=TzGfA%q|z zhKPu)wTT*q9&`5ln|JSjzMhsRg))V`y&iOaJ1)g$XR z#^>{^$v-D27q_=J#~=PW`ujX0o*ch#+m?OXR+Y7uL-5|KB8Z6AH3T0c(AwG>;)B5w zS)~eV6Ef!V@L>4e^Yy`CeENx~m`tu)-%PJB?(T1^s_?BZ?(Vy33QZ$5?I=KLd z2s9dPXc3GtT5x9WbUHdRCkMYxXD9v5UW{@%KAub_m8&{w%HD^@br2Dvh$svoA`vYF zKO!0cq~UM`fSpdq7-Ht_?d?3zRl4<3+4TD8@SrdlS614#Vd3IFtFs%!3=lP32tgzc z2CGfeETTV91Z`}5VT{p7M9lLX5tm%G)Tn%Nx%chM!(U&QpQhDaCLFXKRD)v_5pk}L zF(SgU<9oe6zIgF+Fc>iNB6L&)T7Hj+Nz!TC#<|)Uvv{dvj{tfbl z=ytnA^y<|fk<~IP%MvBp2wDc+h^R({5Q6uCnQ1T>YOV4-R~JRprZoU@cX!u0Cn80W z7e%3Gt7K^gaIqG8{J#|+;8!Frxl@Fdf|$81D{HN87Ql-{766Ip^W^A+en#5yzZwAO z)DZw!nOdMCP5T|mRyYp%n1=|ZM1n}1Z||n!hZo_|DRl&kjBpd00000uTWJ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/192.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/192.png new file mode 100644 index 0000000000000000000000000000000000000000..410fd9dfd5a8be961fa7b0635850dbcd1474242a GIT binary patch literal 2052 zcmV+f2>bVmP)_o}Vv+nc*hFFx#TyiaganZi%OhGK?+}PM$U0oA_ZntY~2LJ%X7~3>W+cwM`LTH-0ZENRT&N-!sh$5MY5m6~cMC#wg z)>@?)kz(`!2p|+=Y}+=*;Jp_SW~~%E=Kur%VvIQ_@7v*UD3TGu7^AgjHbkhDV%E%B zL`0;#v9q(|y+cGISS%K5b@dt|mJ|TXS27= z3;-h1?e>f@_wIfD^5x5%6Ej;|mC8Du4kFg|GK7GLh*;N+QYzu2K`BL~LI`c!rj#x& zF1V^X-n*0_=bUpU0z`~4AcEEw0E{s)QdM=D##L3Pn6LF(N|A^bi+PMuBzs@dB{}Du zQ~7kxNv*A2LnI;+5v_GqRlQ!nM2%UMt$u%1DQ=pksw%CG2&9yj%d5Ixrj%j~DWyUp zr6iI?ih4#wCQ^HQd(WT$L4+wK@12NPTQRc;D5b2ethL*>cg?kG?dHG$&L^|8<5%w3 zrK|WZd%5Tqou=E1P~5cC*-dhx`d^})#;a?Izm za~&;fQ?2)xug*gVL<9h(&xtT+iZLLfDv= z&96SYyPmHPwgySk{>_87ZU=*b7uTacBw)}=DXzG9fJi0or>Cbxs*EVq+AwngcmMvk zC#NT8XRnWsk2h}J9DcF282=3*Umo6FF)K$;k9K!`oE(!VN!fcBQ$!$UMl4hmkwQcO;R1(<-oBmPxN+lhF+V>)SIi%Oa=0e; z*|VR$cSpZHna(H6Srabf2fMq|za}q!e<1=9LJBA%Mq3dnQ>dsbMTi6d{{R30|No;k zNjd-k19?eAK~zna!EPKy5Qe*|x_Z{T4ziu#IGe0PK!O|)CnOGlxN=840umCB6>&v8 z0vCi7amWRNkZlkov5CEF?A`UubXQe#sNEHF+MOA7*HrcQ|3CTk5mD80&VV?bP5ZvT z|M>9o-`8J!{^h;91RMl2BBf5Hf&xwec(SOZmGXPK(RS_v>`p2{9hW7D?pB`QP{{FikP>Aon@p#eB zU!A`wrC4hiFd}!-mYQRXh(r`s#Y}zal$w+pa@BOo&D2@1)w;#a?)|$zKYKdl(esmE zmN(1keEMkr?Y6s-UV7=lP^CnS4L1-lgsQ4Uktn8=T;7R@nA1i~{E!i`+f&=+ufO_c zdAaDj{`S`XWcQ&~o&Gajwu}AUdyDxZ_dOVJObF<98)HnVaj=+q<)bbjh?r6u47N68 zbl1zH(daMLuS(XFN# z5K*lbBO~JZ>Dlqg@%WubZ|>g7xtw2|&#&gHMj@6i6H?;F$x5jqip&ua0fH-snUQbX zG|gZz*sSh@@h@u^%fFBQeD(4)$7&H()Uwtr2pDR0Jz!2wz+^JHyquYtd-eAAHVlWO z7$b8U42I0i%sFQOKqQf(Dt+J88ivCWKoD`;3W(s*1^|ennK82$Yo(^yijkQa z0Nj;gj4`q!!LqXbs9ibe1M3!wKb}>c3rntG*m54*1B)#4e(&$J>2*+`YnJJ zZmzE$6dVX|bO;_v%z;-mXFlh?l;Vfdx7-9#RgJ!X2*JZh2m!$SCI47o(QO?O%{-gb zS}lZVrU2fqRjupnjkTJYV))-RnM}-7RdUWE;?;_jwr%^q+awWH6%qGv0NmNxkyR}0 ibIzrd5JD-%XYd~#`DaPR4D-wY0000~P)YMP=UslHYT)4 z3RnpeEGEW;nh=8vV^SBc2z&nnm#*EI=th<%x^RI;F}g5D79bBzrP7!{foZ2R%&RkV z?>&#t#j$M8;@tCn_xJiftX9Vm2@#c2%&c`>E|-Z|Yt?SIlO)db0zimJ1gtg2m@FGP zXGH`606-}X0Ei$0&RORi0El>I#muy_^0srfDDphdt#u-PG#d5$-Bzn!O-rRxS!=DeW>$#ky$@L9I8{nH=Wup*uF+@&AX;k?an2Eu zQksZFy!Rdeh!_z?1QA4}C<;VG#6ZJ)=e;kAoQRZCh~&NZ-dSrn&kIBZKxQT)5fSmm zm{2Anp>+@;Tp|(?S!=!b&YAE&U=OWCyfKAyj+uFJadCTl+c|5Dan1!P_MnMU5h8dm zBHlR{$n8;7fl!uZA|fJ)SgX}`cl*{_0AOaVHKu9lIW9ybqHqwgbCy|!ufaNI);dy3 zdmo^fq9{UZ5%Jz5g7-dzMQg2fgmIh%yAi=!M}$Ff5dn};CL+unTwzv00c)Kxg@_Ol z03c#;0uh;2nwF9zRZ4NGR3ah(0RW{qz_Hd^Yn*e=SrOP{h5%qp9&E2xE3>n+tyU{& z<-G?$W)(%zp+i$5qO~SsR!WKZ;8>{K%M661hZ7MGOf4LK@o1DzOddSaZg2N{oxxx* zGc(g@G{PILqc~2KimbJP77=5Tq@n5a?f|fV|NhZvG#Cs-BrR1J7GIx!sXTsgaBAk| z-~ZrdziNu2y>tKHwd5z*!PPVrjQ55HSo+PQ( z5mzczW`#&vYx+M&G#n0ly&fQ(IP;#8yw&K6^=FpOmL$3G%EZ0L53jG?duKVV%cJA- z%WHS<5dsmH%atTamC{iZg%Eo0xmq0ygC0eZ)_Q(^-g|GYWmf0kdVkn&)W%AA?wZZM zR`H+fyI*}j*cTr@HD9R@dX&i2Y(8kuZ$H^c(^4EKh^Q2cfH8$JrYH)o)h5CkSzTSd zaA9R*W20WL6H$_ufpn`=JbJh@7#dT!=1ymBZtBa=K6=(pe*H~;{z=X)zOlJ`6ObDCl8E) zxK5{c=l18WGrQO}FREm}J zr+@tA_Rf>dJkN|V#+a}%t+m$L{{R30|NrZpil6`h1LH|VK~!Z{O;1}#6uo!my=NN( z7Cc;outFih5u`v=8fOte?W)A^zHW0uc z-~x|O`_0$wV(bT1XE{%A=FYk2o^yClk8e4;v$MUhu+W`K)vC2-v%wu#DA{Oezqc*2ZY1T0$bFz}vU)0ALt4 zjWMZIYH@LKWMt&w!w(r_4Ix}NaqHITAAh|u3YdX^-bh3@{g&VB_my@lj5}UO^1a#a z^{3yT|9zCpjrxAy>gsCScE}jwH*O3IA&fDMF=Nci%F5Ex(xXS8ou3D;YmRG2t{Yx9 z<5~(O^}T!J2M5(;((^noolZ5I;rLi4-FI{I*Kf3v)oQg^EY8o*zk0Q4j1>=RL1d@V z4zn?|v9aO%eGeYYOijMCx4%!K3M_`mr>DoZw)Xq`{Y2a)p#FZpUcb1wtR0rtjnPEL z7@g1OJ3BjfcXwNciilb(0JN&3wTj2%09YvexwErfuGQ|0kA3{fM~4Roo4*|-60wn+ zncY(HgZHP)mEiDoJ>EetpRH-Fty2-v%*@Q%+NwPr5pjHcs;z~fwL)aW!^6d5Q7Or} z!#O(-0_2=?1K6EO`xBG*E9L5!Uwr=L$hYj8|>^(lQ~T~7glf! zg+eZuD-;S=eHmi_*1*vL0MGL*c{%6LpZ^R%lamvrQVD<%F$_Z?gi;q$sbp8W(Ue50 zUVdRM#KM4xTU%R^7+bTlUmeaJW3;6ZV~jDJot=C9_-jPe+5mu3N^7Z&Hu*$`+U5#I$XtI@Hk;)G16d*hu$L1e3K43pg$NUgL^_=gf`Ew5&d$Ox zJUu-nGA%fWYy@f7{h#vfnL!XZS}V_s1;M#R$rvp}Xk+Nf$w|Fl=bRbS%2iRNQ69Jk z%hiLfdP3-gVc2Xo!?0wC@dXq8|==&z(A!^vBA)C z!A2UJ3KhUr9I~H@uCOLDy}doh$H#3zC@MVKDVNKL43Qxc03)J*0Tgv_`3g3uM*si- M07*qoM6N<$f{H&D`~Uy| literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/194.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/194.png new file mode 100644 index 0000000000000000000000000000000000000000..bba22cbfbf8a4af9650237d9fe4914301d6794b7 GIT binary patch literal 2045 zcmVB2Y7zd6RICp5`f8al297r5Eao~t(fMAP;fD{SXTPXGc^mT9VJ?GoY z!FQ>%lYMsfUi-KA`p8;PgKLg)>i z8YCb9B#<-$NYI#>q#j#A(Jc>pt{n!N(MT47nL(0-sKh{WNAzQ$R)D-z_UXnwwGQ!HwzfSy=B12xewkfWbS_ zihw|p%y!g4OiWDNx%C%ofqae&0$CLOXW#g0bCXL?7cJDXq9Noj?%R3jz}{=q&29bJ zjceaNTc1<(En_CfArMijJcPb{`^d;#a}EH5g?g^&X_<}w?Wa$EIsbTeqt%AhT>!IF zC-+aDJ$C7*tDSCFp?3bA&u(7-F_xuz=Py<6-H7Pkjp}-Uv9-1Vg1Mn`xd?iz43X#G z`sSbJpK|Y%5x}P(pKi4~ckeCVo_Q=}7V;BEchCI2aP-jY^UbNM+(a^C>4>f<0?aKa zD*1lP1j#`M$IdM+G|Nh*>OiFBPgXkHh8stZ>>U_vJX_g3_vTAiuHPFTDu#CKUw-sQ zt>&XIjC%A~R_+cXGqXGxTxl*vhs(=Yt#zylH5;lovQDQRtF@xY-+yOfv%N94Z{UOX z&dfIFFJ8QOfA-%K6MJ^;Y&?0o^!XQGudTH2-kEv2xZLe_lYtQB?aE*T$zWSgo=W#l zx!Kw9s?}G|kBsj+_3GHqzf6yf4&1!;;NU0@jqSPg!*@@XSEir=Of2C~(aXNwEV^9!p>bH53W^jKt;JOtoB00030|48v+mjD0*w@E}nR7IB0Yg|*N0U z7iJ$lZ0C7zVSe_H2b)@S`-S^`dF|%yl`lShXa4f+{gsW+KDoC3Xn%L>es6GCMvK^p ziFk2L9inOxUtL(JB$eHr9RQ%F>1eG{`}?nlTie~BZg!@=Fn{6TAfK9QD&))0uTGz> zU3ulDP#kV=AGD^<{d)6y5qh+V6Txr~XLCWY-EQyg?NLYqq%eW{Ua#M1j6lOb?Zf3e z>)X4BNh0sRec{>ZrUGAmedF8fKdo&%$@t{K%Fi(dLlXg5atJA7sTP6OPC^82Hk+Nt z|2mg8PCcUq)n(8y(rER1gQQZ=MryCW_F|q7mVR3W{hM!G>1=EJ&&Bn%TQ2x|EilTR%?>H|NA2r5Gnrm@9FhWNLvxzLNtJl<3`vZcRIG>J8Ktqyb)zPs=t$t_e zn|}YuXb7RffT>UjQs^k&!I6ohcT9w-W5qF%T74|fxBBrw)W;ZFt%;fGW+m}OcN@h~ zeGF$N&p+N+9%z>pXSWItlhs6oWHLEgN=GcCVxl&_+1a#-(-0BhBt128mYRBBP1EY> zr>EyGUcSBbLuYGMk>`0{uCA&Ph{{Bm2t@#8=qiL2DRkSK}1vyDsYnc zk@2UVJ3q6sdRM8>IfN*ph8TOn(p*Ed zD=}Qt%heCBE&jL&g&{>UFPTSBH4+SEM}z7hAVO3X<`Yq2JBt8ND2R7Ic#o-L;+Qyk znY%dm{f+MsmBLo5MJGmC2$__zW_+fQPCzg{Ge#!>Oz1SKRX-f|;p}rj81unNcS+`L zMX7kny!}Yhga{#O)S;+B$_kjQd7&@gK8fF@ZHKQJh^Ak z#u&aNwkg|CPpzO7B5@}`*BBwRX4j}x)o5ZuD4<4T0V0AxRR;=@asxxWb&i<}h*FKr z9vw|d%U;*=r~f_0aVSDm1q!7TKt&5RhdJpm>)NuB?SMu-Gs%;E6k3GxOhBo&B!p#J bI0E<&QqXJb*Q8O=00000NkvXXu0mjfpm5d8 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/195.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/195.png new file mode 100644 index 0000000000000000000000000000000000000000..34b099c3de8fb606dcd55ad1aca4e4aa0e32a1af GIT binary patch literal 1655 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 b&8q(Z&iRT_qztTE00000NkvXXu0mjfu~&Bq literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/197.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/197.png new file mode 100644 index 0000000000000000000000000000000000000000..54daa784b1db6b0ce658a25fc9903fee1cec22a8 GIT binary patch literal 1765 zcmVz`Pfq}sws7?fsq~rkAxRt?r z1p`$l2)=B5whAy$4haGPxIhA6Afo|*0{|qDFfbUc9|5v3MpNU++eKqA2>?_lt&&{r zEznLUK!Tt#KOpaJ*$)E%qp5Z^uG+n7lpMm7Cr`Cf$>n#6z`bT?r zK|)gP09XbFV=zccu4O~(Mi4BFWq<&elCrsK()(qTT642}0szUat*wiTi!2&|k|5<^ z7z~7gU@(AMCN-|c0}YTBW@T)Z3Lvcvj0WT5&mTjrQF%IyN>Y*|P{$!bv@+&hpI5Q!uZR)iMb!mJws_$r}xxD5Q{*5+QE#f_c4 z{STf#dU!cszP*}B*9vlDj1LbFCzA^pAxtI{2((_zktJ^kxKJ~Mcmq*8c=54i7e>i>fwm;~+dUbYiaDV&8%|SKa#_Wp+J3qXf&KCNLGx(JfD3 z{p|)T0&^j*tEZ#@W9|;gcRcLx-~0KeAA`kM#GOIM`=&!k>E+dO1+>2=Bzc{X1R$^sE#%i>+<)-k_v0635j(wZ5sOvPtE$ClJU&>? z?hM0g+t|C+`MAr|CCRw6Ih>W_QHaMc|7!bRC)ExI3;-gH8MaQ@sj3Q&<6obHY*OlL zHLq1qmbdSGSd^u2-(3~|^=6As7}d7yqI+_3QkErwwUTlnNm7dtnSVL|0{{U3{{mp* zL;wH+_en%SRCShJZyQAvhR=IuX6ui{p)N^46$wx-N(DkHQX~2sP%8c^{{pz+0tHdj zMkH})4D#37Uhl`u94=;d*RH~7wDwv%vvZEmd7oE72VoNH90B#D<9;$LNh#Iq?=92x z@aSlCH~w|9UT{x!_C~j3z5l@@T{+Xe9gUvw=9jB634QzgdA7>(B5x{_#d@(qpr>Cx zjWQ`hLPcqFjXOzkKu75`WVvpGoG+)zRUHS+*=X!_oEVtB;d^(4W zd_Hd_l1RnoRy>(a04T*lZ65DwX3ngCaXPGQIa^oz%6&%U%<}iKJyGkcHPUpUwLUKM zi@U|U`4YhO_4Temi6RDo*o|Ji^Phk5cS+%O&=bS&}d!`^LWIuAOJxVTx`s4gs^#>e=zZU#o%yU>*zx`6fU9=!itT z_iT%cH&>p7ghY1MhEEmEgaQF11j0_3L>|&(Nf0-0VvQ>IHx)UOi zoi*pL&R@U&Gl-jl;Yd;1qHYWbA!+l$QUaVreh#{40YoW1tvSpc? zKN--C%OIlnkSm@LQUOFeq(GjCLA7ISt_UD$PadPwfnwtCi7uQ71O!|=Aq62%?*3=* z9W2h1ugjp_S6-Z*1;bOP5~M(0$Okkb;+G<5W3HN*P)8OTZKneRd4eHR00V}>9Hlt8 z>n5vF53qf^odDjx`QPCwY$INTLJ8DW2mlZfrPTYo6A|b?MYY{(y{8eG00000NkvXX Hu0mjfmQ6cv literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/198.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/198.png new file mode 100644 index 0000000000000000000000000000000000000000..2a18555a9b6c177bb419c23dc123e7257a3199f5 GIT binary patch literal 1758 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 N002ovPDHLkV1nm!V)p<5 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/2.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/2.png new file mode 100644 index 0000000000000000000000000000000000000000..7853c07323ec68f23bb7fc82208b455c9449ed90 GIT binary patch literal 1747 zcmV;^1}yoBP)^wQc#RQLE<5cEo2)Zkirsylnpx&KfxNYWy!*;EZ88$0vw@;NH`eVA+NFL(cLrC zkGd?XdTgK;rP9@{d(S=RR8a#02mn9;0tzT8YJdO<0=d8dsYoUu0G#ZkJJ`D#P^2O} zz}SRYWs_k<4BQfdCN!x40|=0bx;y&roO`}KxxrmyEND_E&bF;m;Xp36x1`s)+Wr`YrChGON5qsw8Td9$; zkzBx*r=|i-Sr$8x{7V}Gc`<>eV-kSki6kC*b>nKiTHV^((u4w8)l@*E+3X%2WdcPg z*8m2{M2tWR#^qEqM;DzQ9_babfiB+&v?dJ@jz$6~0^(?yt5imli4+6Ds!%Ql*3$%vkobFblsadBybUMr3}HU zNuAQkSJbvM0XX_7z{bYL{=or&#=?57e*WpE&v@F8Mtx(lTD>_K4uVQ0 zP0?O#zH{xBZ@#--4*ZqXjmAv;>&{O`M3DeAP*RTY%t1fxJh(@A?p!AdGtVzW2T(pq z!&#;LcDp@@S*;lN)QaAh=380uI$O%u^|CQ@hF%L zNR>kebAD=kQiDh`wiC8-ho0{{U3|4QbXf&c&l?MXyI zRBcwtZWBQet*V~I9@`<7;}GKz36Q`b5ro8npoj}Z3UGl7|G*FMC*0u!2zRb<03i{i zECPu{$cc@ecpclZGoJ3|&@=6J!e}%a%~D-eull{mGzfC~1R!EIA-Rll`QpiFdS1KJ&Sz)*6Rgyl%QvsQe)VE=r~LW*fn(vDw;!wfpPKE;CXr`<*H%}nwOupxWcpVh ztdtKArNL;5AT7dB2nmE_^@o8FvQlrm2}eqhfL*`WY&ExkRX7*V9^Kpcuu=QFIhD9N z6&J~vLDfD4h)8=3$e8WeDa%e+ws*BS*BcB+FdJ|NXa`|v*zEH59`>t=LS z1k*|a=N6AhTMExh6D0^_I_U}_`h&rY=N9HKa*=G+cmM2v1AwD?UH{7v2mlcQkuf}* zzN(;9Djgp;1b~!s9E>a?$4PO)7_r5Ld4a`lk8l5Y-)iisIn-B*oC`*zK!z_e(+5N@ zq|ic!=sKC~?4s)=yMC?fS3ycN1evsoAV#Lfv{1SN24EvRU3+Zd6k>Xab(QK%2O&Y2 zBuo-|gdSmvFwHQ-FvD<$#Y%Yw9JTL+;VSe35X%-JFaU$6_~IC`~xR+-=mdNc|iaG002ovPDHLkV1kN;CX)aF literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/20.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/20.png new file mode 100644 index 0000000000000000000000000000000000000000..d07124bb0cf0ad9e70f445cd7f093c43d16b07db GIT binary patch literal 1752 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/21.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/21.png new file mode 100644 index 0000000000000000000000000000000000000000..529a75b828351e77e403fcfd994648274dbb5a20 GIT binary patch literal 1738 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/23.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/23.png new file mode 100644 index 0000000000000000000000000000000000000000..87206fcfe3e8669271c034949ddfb28bb40fdf99 GIT binary patch literal 1890 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/25.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/25.png new file mode 100644 index 0000000000000000000000000000000000000000..facb5400f6cba9eaaff060402093f057df95c71c GIT binary patch literal 1769 zcmV$qvcm zKoEtX9n=mgB><@HesY4-r%rXd-6$m+kZ1*!IW7p6orh{4{2tgsK9RvtUQAn+T zP_hMErm{<^5F>*BPNYc0uR9T{wv3?!J|v7@#P z+7@L9V`K?zO!MTS@qI5vODY3GKxH34@#^>I&H2446j9dj?wJqw zy;2-#@BQS{E7R@S3%^{NYIFU@YK6AXOt0VH7@5Iv7}PX^T!W0n5K9rIkPjEdco~Ci z4!wNleEl|dHeOlv)khGwVMz6{n|cq`4?w}3K;=o$y?*FtbhJ#{OcblUw?7<{SQB`T|3+yw80yO7@Y>7uBOjzrDG)b^K&BJ)et-#su|?N|&x} zm!XY5>yH%qW3LobkwRF~GP7v}yrNaDn`Pbd-be3$_tl4!vy`K z+FJ2G9NfKodU`5=?G0fkx;X#=uONAI`$pZYye1*Q&CTlR^RQZ8o;`o@&Re@@CX zzbDi4=vHmJYMqNQPM$qWHzv96#9X@oh9DuNC7N`5+49-!{Kfe9i}`}Ka&0}G{xe@( z`t`C6^xjiL8qip@s8pa(FfHsWLP@BRmH^@O3XckLKAnu8{U8LjVauL$p!Xn#m5GPLM7}ma049R3NCLCnx<4V4)uX5K@RvvK5fB z{a*Fc`}bo{9+Khd*gy6V*TTX1NWr0DHvmC3q;B^b6;v}XGH2%tvB#3KW?=rKj;uVz zW#wYiz4}r*z+QqZ#a$Ws627}90#KE-&?xETj8vsqw%2!e-`?NvVq`!xXN?|o>9jAm zG5I2c?8VZ7(;UDuOMfgt#nSvPYXCbtJA1o(4<0_m)hDBJ!^*amEyE4r(D1clM!L@p z;Wfe*d<76-|Mu-`)|%vK0V!_*-o0~2${z!8%aEk1I)yDuaD8)gxtJ3OiU_PrpS3s! z#s55qhX?hd_TJ?w3PnPbr6pk!rV3iSa?Y3SldGNVzdJwi5+&eYDix{686=io00000 LNkvXXu0mjfpkrX$ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/26.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/26.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e2fb7f7111c9138cdf30d325093ba4a1cd38e GIT binary patch literal 1973 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 Z{0Cr=8tJ2_YeE13002ovPDHLkV1g2hiID&R literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/28.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/28.png new file mode 100644 index 0000000000000000000000000000000000000000..4b89a3e6ddad535948e672a00b2088b959e49fed GIT binary patch literal 1815 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 Hu0mjfHE2iF literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/30.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/30.png new file mode 100644 index 0000000000000000000000000000000000000000..fbfbba5af4b6c8f665f6246ec178148d9b69cb65 GIT binary patch literal 1741 zcmV;;1~U1HP)y}$-d$`10&I{m zwj~0j#fShRBmyK5FTe{B_!%7X0>r!l0TN_n#Kc%2JHQ5v*84l_`RT5zLr^p8Ewx(J z-PLvKp6^^;-rhPqItDs1iJ=pn6op_g#g38y80=yUf<^VBI*0(Hpa>f=BvH&@w;y{W zh>OKCKom(DNt37wn^BzI&E2czu{Xk5ZEQ>P7Y3E@m(l z48@ipicV@Wqo9o-AWBI9)eQEcy7#Jxc8?-K3TktkHZDvi7q_+)!s91@R}c`Pc@m{g zjDwOi4iYS@vkerpuygfb3h3+-K!RqZA=}loxgh}+Y=TJ81$9z|zPi|kYP})n88(YbM(77$dO2E(}aDE74rx&Zcpm9(qqLl5S zS}5C16$nz0#Oj!x=)x*v)hn^K5@=9ECnXV}IeuE|QLYEMPK&ddRre;FvOZh3d-K(o zU$j6c(Ij5p*#Ybo?ItFO+Z!7>=Oi^U1u|4OuatyDY(N1Kq$tggkNf$o^#Q`B)LLsX z)b-ltn|4xY^cwWKCK=adMd`!4cXw}%-oJHi|KRk`zn)HB>VEz0j~nmq{`k``)vJ8g zbq{K7QTq_Lq5|@H^jhg7qV&-RH^062+2@~rqR@@Ec1B&=Kbnt6<3|r4&6fS5FJ6Z* z2#It?SOk$qLD>YesIEqmZL})r`rDU&`0ks3_h!#d^TGZh)r-@`)@1UOSuWZbrFqJw zxZo%m!aDn{nrz3{MzK+8r4{Ic0+RIc?v0>c`SkIBK03*Z z{%AVCvUBnFTd$s+&JPYxx-JE&6G;MsC?-Q+-B$xiq-Aw)57oavc+l`pf`aJb{=KhR z*6F-=N_+kCpMGF6-rt+gr$Iw=8xoEihLifWQx{rn5I-KIsg+7!E!zKd<$ zBQdIIl7#uV4S2G*7o|qoDW|8WXMg@(H>|d8T{p|+ zs;V}(cMr3-XG~4o_2r}hU>0_ECR58)E}4TQO1&f@>>9IyyDkDY7-D%}9X{Ln_W9Qj zRa0#?)&0iE*?ifz-F)%!VO_7*bxP=Bif!-qcKJuo8Gt0ouxA;M9zZVtt z-SO4Urde;_z5j4^Q!lUYZf>gE`-h9gt%Q^if+;3RBn?PFlnRohn>_4?oMp7b8tP$G7)vscQJNU@p@Ae#Ml58*vZ|^;`UjS8bFkv~ zFJ8F9{1QlzfE33GF=t=O_T=L*NG~E@$V<|^Re1aK74r=aBpIc(V>}4vg|#$BsYz-C j0@J}L#G@O$1SQ}&6f#>7sd5FsZH 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/35.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/35.png new file mode 100644 index 0000000000000000000000000000000000000000..b483fb06670c106b70b48d5db3e0c504752a73ab GIT binary patch literal 2149 zcmV-r2%7haP)(ImU4E9aXp6(^>-n5hY1$eSPEh?b}bE4n#ymoO6hTh|F-&O*O`VR5k=BbQ~Zl-61+r8YM=0f0F&^WNSoW308V z)oK}I0f0{)BJS+$05q!j;>GQT3_#TC>V`4K7|Sea+G(}Y;cz4Z%gd+g+E1r*YfYMV zl+wmnB5c&f7-9^FWQ;*X5gCn!|7*W=X*eb%b+FF)nBBIvUKWMs(;HukN=*{imEEBYTnQg5s?xRA`%fI1Ze90B(iJ_AON7&*U$9({qZ;pA$afe zd_0>?0idc%@9R9D?Cw6Us?vKOLKKm^ckc}b1LvG`iF0maV`Dm<0w91e#}gmWpaXz% zF3Gav5W-}V<@sbbE9$x~ipgY><@va-D`rLnXYGwEA1^qKASi5&2@K3}IxS*k=Ey9F z)a2@f0{}o*)%@JK&E4Hy5w5C=h+>RQa)?N4^WC@KoNwXEVrS`0e*$*z*Qg{AE_m5J78w@{2|Iq*sUt%361Pd?dnoo;L=Gs2Q(P`u^=3KYV^YzInO0vf_)} z)zfFspYibNi_wuNy>t2UA%q8Q_3GAW8_x4YEqoocr`*1DTF zZvxm`+6%ff7>s*o~iF1jv)&YptWw2S|K#=Iybkl)bL7YjfLd$koH15wqm+IhXaHy~ol^Ah;qOH; znHS^xcRo8F{Ij&V)k|Ato~0!6=0*E#|Lwu+IND1w?7hp3HHjva*ld!uwn0})#TaI@ zsrNO-7?`=Cna|5+R|#Zvu%8hTrPFG0W#60L)`wk^6vF}8xo{aQc${Cs+C}a6oE7^ng)PD8x-tJ9cX4`FY>Y z?r@kmdtJS6_sxF4uHApNT9uLkfXJyTA&B$m%Ne#Kkr?_PIK&>xWO~UUfn7<7!d4(R zl?;mHTH78Eq?3H_SsT)c6TqXT0rbp%aY=?a6wBcB1zT6r$j^+Z$wPwa?Yxy z>eU;AdT*nD{Kt!V(`fq7XZCs7twoUWqw_j(m3_QJhGjfQt%l8+Hh9S2F9b&VJ zi1_sB55wWmplmTSF_T3$;&lY7762X3uiji-KK}e*994=gfL@QzQfy;fUB&KVew9lB zbUCG@%HA{c@$oT{H)Q9WU7OYp>qJEL`T)zR|IWt8uaCbz{H|TaMOQTRE~e9I!rA); zXo)Fjg_yNh_e1DaRnKslnb{-avu8gJheI?G+T82_%h*yB5xw`DgInK!^X0rv5O0*cy?v)`TV_v0-Uk46L|u}UwM%K8 z!>+FT{r;`NU=TuO^Fefmz|72yh;D7O77>n!5K$x(@q-7S5|MLc|AC0RyE}+jii#uv zFyh^`jhwTpK6&!Qu4Rpc?%&^=&*v5qAym$xeM3Y|vm_$RPV-*xLyS=*m6EN{Ip=QQ zzKw`omktlV6_J-OUl<#Ac6J^;ddvq02PY>Z0CkSMXH@{`tlFO{r4_W=11P2vrCbGXtPVGNIW4h!{d(W}|kD(F~cHjjTp0BDNSXnjm6T b)!y^}?v-|AN(zL^00000NkvXXu0mjfwh|;M literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/36.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/36.png new file mode 100644 index 0000000000000000000000000000000000000000..dd753fa626c21b4660592d1cd95f54bbbb5282b9 GIT binary patch literal 2064 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 Z`wv08sG}xoIDr5F002ovPDHLkV1g$AW6%Hq literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/38.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/38.png new file mode 100644 index 0000000000000000000000000000000000000000..58cec03c61823dd295d9267e6b40cfe7cebf64e4 GIT binary patch literal 1956 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

        hi+$FF&oi;nd`@<>lE% zy>-JI(7eEyPQ^b>yKhTw}Z_4x##A&BRT-35`2BFa3=_ql1lCP_{52c z%@=!P`uM9aKWsHuck7cIPwwaYeH%oNUMwDx zZmv{9h@uCQMHrmr%F#;gNWW|S{s9o4tv4KTZ@2r!-COm|u2brb{hQZo67F5Rvhwi$ z_U_iBUb~56<@it$5Gtt>q_QZImeQCauMsp%6Ruf(4p{XTQ@Ov>|Tr>lSb_5k=Fx+wD>00030|Mf?Gw*UYGFiAu~RBcwx zZqry4{?56!6WdLjgtP%VXjFcxB7`($79$~GGc%7cJOeMoW|p&=mzY6-hFQUeA5jTW z=oG4`f(DT$4sGMaiG9y3?zNK^uIww@SN_ib`Hn-1Z6Ad|BpD?Dw9d4iOb-3lyH?a0 zU0Dy$oSQHEp6gMyR=NB8oqP9QVBCK8As(mBg0s}?Mi1`)YulIgffeM~Pg?4=T6ez- zLLpBeU*hgueWCeXwI3b0WsJw!a5QM1UR-WQKVAQ2kj9JE*MI!kdjDoOK8i$4r^$^F z0id|-5J)mT9K;|p!$&h7xFSj1HqrFq}E3LOXm)Cy& zu=}~}(bndZ@hAozLkAOa=t`!M=2b?hRcleVrT;uG@bY% ze}BHF_3-tECLIJpKlJ@UKU!T`z5n-v5;OWA)3S3IRkO=VxSnXUepsPW z;;GQ{y!Z<%2SE@V^u|G@s=R1t^J%U-S#+WzS(FuJ0;`3XZJdoTLY592jr!5iK%oq+ zTvt`93xr_xhbwP3{_3<_Ac9~TUPJ7;&xu^lc}yT6MNn+2@zTYM+uPe9B1I6CN^_-h z7*^`ZFit0Q=KF_YAvl*#|m7oX&C?c1sq{vftcbQ6xeTRJ~s8!4tD1vD)Op8m4 zhEVOr1VxwDR?R7xh#VF}2F5dl!bQd=5J<7f4av0SFXLi;TzBJY%GC!TlB4JGnTjbg zVHQLHA~PrCaD)>}rs!vvmkpL3wk$g5=_X>>)V6fraM4pfFZ^8#;IPfXMqfs7RdxuSO7`2nJ}$2dZq=?H`E8f zb_``ovlI+4Zrr+QO_=fqLCinLwEN2Ya`FNAAL`!#3k^eQH2?qr07*qoM6N<$g1IZj A4gdfE literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/42.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/42.png new file mode 100644 index 0000000000000000000000000000000000000000..571e260b8657d6689e53c2a49e6eee1c45f995bc GIT binary patch literal 1901 zcmV-z2a@=SP)6VzoZyN$^Dr3ZhcM2Os(_g5ZM>VxI)@LDAw5TC}#MMPky} z((Pume@%8ayF2q;AHJDQ90ukxbMO7mJ?Grvpr?%pfVRLl(l!Esgb`?h0D%wyAOaE^ zAgKWZ1R?+g0ATC`AfO2Vp#Xpq5dgbJ0udvk2t^oyA_Oo%2#7!g0w}-$Z6iY?BTXZM z2!RoFVv98pSfJWdY>EgV0+2QjjA|@E8>oG_eBTekknx)seS}HHqX@tQnnutT0T2SA zL?|TA+kb|QEmB2@z{I@(m^fgZtO(VPlLCQ}sJJsM3C8J(M50qHKq!$mjDdG90^OMm zEh{eJ5Gt-zfJ-D56NF1>M4z~?{_Lx-bQ&q_)e>+BkMIbMs8;O0;7jV zG~w`nla)*5PO`-J{*w?hCIDT+Dr_~h6nms53}C>}m{htq-POCe_+p_{yI(70l1`)H z|8eEZjs}`=Nll2LC1QoN-0D59_r|2Qeg^<9J@L%5r_OIw5BedGOiuLW`mU^Qj*U+o zKmL5HWlCGC3UC!&S|KGAD1walCZ*WXEuxi-rgq$?md{TvoV>Pnci_R?$M2j@df~tM zonw>3^+w~zUw@iCHr}6`+r0Cer)Yqdkw7AMSteXXSj2@0*Rv^5STBCRyL9wu5#$J1kI&QFk4?pMXv(&P`7jHw*UfA%G%sxzUm7 zCnazmJ$fkH?S6OZa(-+3;fH#E{{7m*%&-x;S15*I@Yu}6)oWKnLuqeo?Kb_gM|y-N zND81yt;uFP*sl8q02l(H$oTZ>+coE#OE>a`;v26mJ@@p&Tkl=)o2ZnFcMG+Ap`=Ji z_{i9xgWWs%q6wRhgj18l#d~>08oLC7mOumWecvAFl6L8{4@}OVnD0(InM9*fsZ5Oz zxDLMl_J?%J9n2jlSMNiDo%(ivPg+T^z2i3a9jC!GWT1f@6ocoEUxBk|nLQAM?>1dS|7%?(FnT_uFqjdfrJSvSa#S>ZslAkk3|^m#$rnzTDqcaWfls2A88E9RM~r))HGL%Vj5* z0XT$_534tKbAB(<`B|sGb*u5y<44bad->PFtM9(rn9b7%AR;ql4A!Qa-p z(P)%qqa;f#b9Hptxiyp)Kfl)29(@19&(Ht(y~xL8i$?6A{kyZbrbqxN6|u_|h+PsX zB5z`{7lTvhjC8|%=PC{8;K^lVQ2+e(*ZZyY<%T!oNjm6WbpC6%mC{!lb**D!3o`5` zmqwUzgMkvo$m(+gu#fc73fYR_pEQX#`RL>L5q7vb@sm z^_Zvz(tu%h!E(hsmY3ES7jH+pmQFfJI!v=sR!qb6FCDB(!|IJ2=iP4UdNs^_V~Q0N zkzkD0qe=nxO zMA1xMWj*0pFm;BD6tu);q5u$>6-bwNAO*0O7^K2&nP>c2Vj74(-rkm>I{&Pym{n8_ n+TGcaJ1HV&7Kuy7e8|E7?xnA>iEX4x00000NkvXXu0mjf&WDZ4 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/43.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/43.png new file mode 100644 index 0000000000000000000000000000000000000000..e1359a31133b7e7652c9916dc8cf7ab1c0914fab GIT binary patch literal 1903 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 Bu{Hnz literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/45.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/45.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd31dba54fffd69246326e826b075a4d9f595f5 GIT binary patch literal 1781 zcmV2mwhL81g{r?n%3CSKY(H?gS(+YEeF~dv4JdH{_$rKntLO z0dkP=0!W?#k|xi9AOQl%kYE)<0u8jPuE${n17i(~kW_Z?0*gebAqM~m03^_8QF2Tl z1Q5V{jf5pyghc=h72^VO`N&WMfC@l{N&r0D3?YX!pFJz@ZlB$R=l^j7AAS4@;{oFW z7HNT@VytIwNo9l_46wL7YSeGMUvpMRE|3H~Pv5VYgAJvv(cb@eyol9Lf3kwHE}WgeIXTAF@W8B}_B zer=143wfEP;z?mGk&d$5tFuPGEjiH`B zsmyQ|-=sHbmrDgI@Bw9jXJB6h8bSm>rXxU@Iy%+HGc3+zo*~WA(Nu;>EMS0Ur7HXS z?w!%*(E^cGgEC5jmr1O=kY*O#_j2TtpS{)A@hFDyV$*HAE*IB?K7r283=E`6q8Vsp z-2#{kP$vgr_ezH&5G? zDu84l0~kP?){qt%7fj9c2H?@7->1U7*;_IN`|{y~4=-+CS{+lmy1G0$J+1p|r_`R; z^#P!!!aS{Mw@ES}RIFP|hX4&e%E$X3ybon*4iPj+@7%fN!qcnY?%r6s``P)~kI%c6 zbb500@sr0E<96GTF~)#Ufq@K64eMj8TY~Zol|W1K(lpI_y(W#ceTDJuH(#$d*Z*|G zbx$%>RXuJu_v-#~ox85<`~KYn_IZpfJ5QDxs}30(!c|6;KAM-IGtg-1kITz>GL{$; zY4j7Ds$C)JUC&!1Rx)kcgkCpVeEU! z11$p6OQ-!3I?1oTctA6$ESD#>@~fddY&Y2Lp8LW5rC%JBXV*h78-}5{+!h3scgh{y zAs2kg<6i&(0RR8iNofKA00S*aL_t(tmRoPzMi7P1*`-9{reKg-Q)nfpBN`|=O;ZZavI+?L5CuhKMi&c&9ENyL?K6+}+Y&fcDn?mvG9 z2+-2TVY9`P)G?h-#+LH-{Jb=Kw|BP-+x_)!I@oVwc2C@VugSj|cvBbG^UZh1$-Cp^ z=UFAL0zexr7R&ojcY$3HOB;9N#D%3bTl!~te(}YA^yK;cVNQ0EWbbO6LEOK&gEzlT zi}|LSWc8E8INEtUD2h^9*bQFryzyf^lMcYi+Q zMY<3ZHO_gMp5>398ixnvvp@*d7`7D{3nJhQN+baUFMgTStJU)9)4|PT zQI#9ojxng~rgn0ZL2MEyv2(7a1wlSfZmHb2}4>MOEA1!I*MSm&R@J3JnO}?`HJY<0kf!(p4P03sp)MxznLLz>-uv-Ls2*NDOPsCLdDlk;w_|UlO_Il$lV=0YRGmHD52!XtyeE3 zA!Y9Xhg6k?X{R-f4DKViAV8e1zIea2Cv1V(qKyz|t=*=qNs}f`Q$YR$ X@)iRT5oIR-00000NkvXXu0mjf+Gk${ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/46.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/46.png new file mode 100644 index 0000000000000000000000000000000000000000..a81672afaadb480a385907c34d4e2f0a856122d6 GIT binary patch literal 1853 zcmV-D2g3M?P)V+30x|~#BuGw35WqvKBBu`Ee1dX}Pkdz&Q1O|dQ%T7kph+xYQj1X)P7!74> z76?|s>Ht74pY^N*NhQy-zQ7@uFhMffe^e0&iNVx+gaDF}tc+EF0RpJp^hP?MZV6h8 zq|Vi6WkF&z7)f#vtPUImpj?Liy}c)o9($A2=7>OK2Ta)kAQ-YMizHm$BqdjNWXT1o z;D!-^4FcK`@wi8Cm6GWdSGx6d-nH zfu&8-@)7E?1Qz4CBBLpbm06&YpSj4&tG&y`1uJXS+S=gO^@Bx9qm}yZgQKS}7bKA- z<-$sklCv_nlvE;7y@M!N;gCCwFo#RY0qmb&y>Ri|dxtl6$Lkww8~YcpT-o#))4hj( zfBw~Xvo^Cb26?x@Sa`mqKzij4h2Ek$;p%in;zIT3gk!*H+Tn$#c)2@;> zM%77bpFMs2=ff8~|Mu$6)(_u)dGp$Kkxj|>cXm}Oymuv6a)V1<_BNNbvdg9Hu`(MD zF6>VpKY3oIrVgAR&rj#AXW!hNTsYX8{q|!&ondnGm+!wGMaw6hx9P9@kG#w3T*=?K z_4;Ic5=whuARHjcm$T!I?waz$)$sx5Nt4rS}fRiN_h}+t;Ox1 ze)l$`_oW7oqobpyX_h7{Sl}vkdw6&lDg*I+dfLpJd7E;dV)UyQcb&s|7oJZSQ>=u# z#{4O&`qNK7jznQlk{}R95Vk~bMxI51J9q9#NXe(OMJtUArzi9AXw>%U<@6*qb2qK3 z=^UOMUAlbZwU6GtRvHWfmtC2p(Ucv51Q5t*Rt2jAjdH~p#_OXO|D1BTF)(Wvi&%xY zbJd0;cf7DkL+k7DAHUx9*|RFx`yYO=HQ6q$lcn0pe*pjh|NkLG4MG3_113pCK~!y4 z%Z?jG6g}rwx!d++?8yLvz+#YiNFW71V=VD&EcpT?Sg^_hHW6q>$pRD>z#<}bSF7sYy03GNqZcUzPMAO;1O{OPCkmy=(b05Mt?#@xy{g4& zmtv#crYy^`>)c=vo6P{~$K@CIemp<_p{{GYp1Y9{5J<@RAwWWbq#=PMAls@M4U6BN zUcNeU>us~E7VDEci_Kn2sdni&DnUn*emr*&|tSV!u z5Vg9l27)JlJ}X2%{_y1aa)U0s_vSGNhv>rg#o}VMP4B+dGPPamt>=%V035v-E<%8W zcGu7m0wpx6cal^mld+QX`Klba_uqb_ipBbRRn=`2nI05wbbR*xqtCy5n0wrYPC)^k zI2m~=Kp-dyie%?eec?1gytHlb13#TiK6vNO)5~Su>~4*R#X;GrUtc%grB6S*clmrx zA)RE<%}g%N9TaecQELwv3Xs|*B^?n$a85!>^JUeBbbL5&+cq>!SxDP8Uw!@P{NdxC z&q>0OE<1Dn_K;4*i$bB$q(mlX2sLU^`eNWiNYGd}?d!*f33#^J_)&3nwK{w7^EdZ@ z0&`yuN5iNI0*cU@-yFa?*N{||AQTiLYP;*&E&|$i-L7t8h})*UHTJ(h`Q!e#zdZi+ zGOG|Fgr~F9>FuM7iwg(|DwO5P6iHQ)>Q3uu{6!~l%na2C0Vq~OkfYmAe9F_kNe$^?plxIhPD0J-w4MJ z*gNu;^skJN)C#M1I;j<{F8~x8_c&}X-Df5%+IjtmNBayo8^nFxEDmE+ z`EMNit^VH@5F~x6X!{<`N?53>FXti0-j^Y#^hQ!=vl*@0B;BOUHL-+}5Ne1N16oa8 rLP(mlpH+?f`2MwQ8gjFOUO@g0%*z;}BvRAR00000NkvXXu0mjfM`dxp literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/47.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/47.png new file mode 100644 index 0000000000000000000000000000000000000000..af333a8e1748cb4a1fff8dafef2c684bdab7c56c GIT binary patch literal 1726 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

        ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
        ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
        ","
        "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
        ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
        "; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/js/main.js b/legacyworlds-web/legacyworlds-web-main/WebContent/js/main.js new file mode 100644 index 0000000..545e799 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/js/main.js @@ -0,0 +1,311 @@ +$(function() { + /* + * Main layer location + */ + var _viewportHeight = function() { + return self.innerHeight || jQuery.boxModel + && document.documentElement.clientHeight + || document.body.clientHeight; + }; + var _viewportWidth = function() { + return self.innerWidth || jQuery.boxModel + && document.documentElement.clientWidth + || document.body.clientWidth; + }; + + var _handleSize = function() { + var _h = _viewportHeight(); + if (_h < 560) { + $("#extframe").css('top', '280px'); + } else { + $("#extframe").css('top', '50%'); + } + + var _w = _viewportWidth(); + if (_w < 950) { + $(".internal").css('left', '475px'); + } else { + $(".internal").css('left', '50%'); + } + }; + + $(window).resize(_handleSize); + _handleSize(); + + /* + * Tabs + */ + var _findTabs = function() { + var _found = []; + $(".tabs").each(function(_container) { + var _data = { + container : $(this), + tabs : [] + }; + + $(".tab", $(this)).each(function(_container) { + var _theTab = { + id : $(this).attr('id'), + title : $("> h3", $(this)).text(), + contents : $("div.tab-contents", $(this)) + }; + _data.tabs.push(_theTab); + }); + + _found.push(_data); + }); + return _found; + }; + + var _hideTab = function(_id) { + $('#tabb-' + _id).removeClass('selected-tab'); + $('#tabc-' + _id).css('display', 'none'); + }; + + var _showTab = function(_id) { + $('#tabb-' + _id).addClass('selected-tab'); + $('#tabc-' + _id).css('display', 'block'); + }; + + var _prepareTabContainer = function(_root) { + _root.container.empty(); + + var _titles = $('
        ').addClass('tab-buttons'); + _titles.appendTo(_root.container); + + for ( var j in _root.tabs) { + var _theTab = _root.tabs[j]; + if (j == 0 || location.hash == '#' + _theTab.id) { + _root.selected = _theTab.id; + } + + $('').addClass('tab-button').attr('id', 'tabb-' + _theTab.id) + .attr('href', '#' + _theTab.id).text(_theTab.title) + .appendTo(_titles).click( + function() { + _hideTab(_root.selected); + _root.selected = $(this).attr('id').replace( + /^tabb-/, ''); + _showTab(_root.selected); + }); + _theTab.contents.css('display', 'none').attr('id', + 'tabc-' + _theTab.id).appendTo(_root.container); + } + _showTab(_root.selected); + }; + + var _prepareTabs = function(_tabs) { + for ( var i in _tabs) { + _prepareTabContainer(_tabs[i]); + } + }; + + var _tabs = _findTabs(); + _prepareTabs(_tabs); + + /* + * Hidden descriptions + */ + $("div.auto-hide").each(function() { + var _div = $(this); + _div.css('display', 'none'); + var _visible = false; + $('').attr('href', '#').text('...').click(function() { + if (_visible) { + _div.css('display', 'none'); + } else { + _div.css('display', 'block'); + } + _visible = !_visible; + return false; + }).insertBefore(_div); + }); + + /* + * "Jump to planet" + */ + $("p#jump-to-planet").each( + function() { + var _form = $('
        ').attr('action', '/').submit(function() { + return false; + }); + var _fdiv = $('
        ').appendTo(_form); + var _select = $('').addClass('input').attr('type', 'button') + .attr('title', _title).val('X').css('cursor', + 'pointer').click(function() { + $("input.message-selection").click(); + })); + }); +}); diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/IRCApplet.class b/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/IRCApplet.class new file mode 100644 index 0000000000000000000000000000000000000000..6ce2e985a6657fbea34fd9316ea1069dc0da6300 GIT binary patch literal 3158 zcmb7G=~ok16#oqgOc+PRh%5?KP%|QaRnzZ z62d_lC;9ahFQYQXLg)+OepZReIIUm>&d7K`#)B(x7UvXH;UNVpp~)DR5of)Gf;G@( zOem;j(J zDD7yr(>F0e!n9+h+&3kyn~4#}Hq1#0Yg?ihv}vs~shN|VLfFj~)wJ&P8+tNvQlBN0 z>SW2^nwHkZFw&aVl14&vbO8$6`o#=|GGb-yxZZEYGieE{*!yrYGijK8)4EBvw=WTb z&-$_P3wqpfgQ}t^1awqOW+>r3{|&m>nu>kcFXMR?m#|+#^#TXNor)K5S;dRIxn^PW zve# zEnz(iiFaL_DsBzi*0hn(Z5gkscnz;J{taHP9(zE7Qq z7G1xEw;B3QNpJ&G+N53p)-C|)q|8JSx)1NFcn|NZ_y8Yz@t0O2TmDGJy|_=s0Vecg z6`$bK0%zKc)7hW2W}@1hm2p`4GZ~+&_yS)_sB&p#m8dqZCneM_@GJ`PKxSfsGpioq zD$b;ub=$V==B{QHU*T(BzESZlj|Q<@V$&+*kIj5HU;0WCoVqHBpU%{JZcT0=Xonu{5k zGvj@;5{~+-)+=vciF#dl#wRNDz+w^6rkhJU=bkO*AYq%|tLJ0MF0S(wc@F80$BEm2 zt2ljMVbdX!j{!54amXN*u!Pp-y%<)fPnCvPy{CKA29KYeE$-YahF@rj?q$S`sis&& z?@@m^?$~N7%&C%GylskL!&0dhw%O*{TgI`_XCf|NTM2=`pM=E6o=a&>lG>Nbv81J$ zn%2VLFWF(%7~yq9$)1Ep54F@TArFaUZuaJdDtfHMVz;O_?opCEnqlg;8@1Oou6!zG zneH5?d&L5FQ8m_vgBmZALPxP%{Y_Z3rDPuT&v)Du*D%~{H_R_D6M==1E-sys)wTJ$#rl&;D z@<s#NFGhGhF}9Hzu{MGjQoO)Su{riS!{{~ zX}N;VC@F1@1#;Mu#clMyHI~P=SPt96Em^d-WkEjMa%j(@V@&XIi9QVkAAQBVnu$fG zxrSX_hax=P9+Ajvf%SeI@>t(W95Cw*LfZv}JA*`iEYLPGj~xZb;afv?E&&<95zosG z?`#`|m$m!|-yx1_*I(FuH5$J2D(T9oqiwC&Q24cZ>KMTh&?7?;uEJ(0s0bA$7?kR=sx;i9@v>NFf HoYTTTSj$U@ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/background.gif b/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/background.gif new file mode 100644 index 0000000000000000000000000000000000000000..569d4bd29514e96baab2ea93e473bfb9cda7dea8 GIT binary patch literal 17704 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�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

        IC?Bq? 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx.jar b/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/pixx.jar new file mode 100644 index 0000000000000000000000000000000000000000..144dd8feb4d5f1ba4a40cf9b2597a1722d17b799 GIT binary patch literal 70487 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/securedirc.cab b/legacyworlds-web/legacyworlds-web-main/WebContent/pjirc/securedirc.cab new file mode 100644 index 0000000000000000000000000000000000000000..f2109edd42ee44af0298bd050f794eda1ee17542 GIT binary patch literal 7788 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/pom.xml b/legacyworlds-web/legacyworlds-web-main/pom.xml new file mode 100644 index 0000000..099a1af --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + + legacyworlds-web + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-web-main + 5.99.1 + war + Legacy Worlds main site + + + + com.deepclone.lw + legacyworlds-web-beans + ${project.version} + + + + javax.servlet + servlet-api + 2.5 + provided + + + + org.freemarker + freemarker + ${org.freemarker.version} + runtime + + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.0 + + true + true + + + legacyworlds-web/legacyworlds-web-main/WebContent + + + + + + build-main-war + package + + war + + + + + + + + + \ No newline at end of file diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/BannedPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/BannedPage.java new file mode 100644 index 0000000..2e899ac --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/BannedPage.java @@ -0,0 +1,35 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "banned" ) +@SessionAttributes( "language" ) +public class BannedPage + extends PageControllerBase +{ + + @RequestMapping( "/banned" ) + public String banned( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + return this.render( model , "restricted" , language , "banned" , session.getBanDetails( ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/CommonPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/CommonPages.java new file mode 100644 index 0000000..d77a90e --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/CommonPages.java @@ -0,0 +1,54 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionAttributes( "language" ) +public class CommonPages + extends PageControllerBase +{ + + @RequestMapping( "/scope" ) + public String scopePage( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + if ( session == null || !"game".equals( session.getSessionSubType( ) ) ) { + return this.renderStatic( model , "external" , language , "scope" ); + } + + GameResponseBase response = session.getEnemyList( ); + return this.renderStatic( model , "game" , language , response , "scope" ); + } + + + @RequestMapping( "/rules" ) + public String rulesPage( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + if ( session == null || !"game".equals( session.getSessionSubType( ) ) ) { + return this.renderStatic( model , "external" , language , "rules" ); + } + + GameResponseBase response = session.getEnemyList( ); + return this.renderStatic( model , "game" , language , response , "rules" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ErrorHandlerBean.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ErrorHandlerBean.java new file mode 100644 index 0000000..d9697fe --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ErrorHandlerBean.java @@ -0,0 +1,86 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import com.deepclone.lw.cmd.MaintenanceResponse; +import com.deepclone.lw.session.SessionCommandException; +import com.deepclone.lw.session.SessionIdentifierException; +import com.deepclone.lw.web.beans.session.MaintenanceStatus; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; + + + +public class ErrorHandlerBean + implements HandlerExceptionResolver +{ + + private MaintenanceStatus maintenanceStatus; + + + @Autowired( required = true ) + public void setMaintenanceStatus( MaintenanceStatus maintenanceStatus ) + { + this.maintenanceStatus = maintenanceStatus; + } + + + private String getLanguage( HttpServletRequest request ) + { + HttpSession session = request.getSession( ); + String l = (String) session.getAttribute( "language" ); + return ( l == null ) ? "en" : l; + } + + + @Override + public ModelAndView resolveException( HttpServletRequest request , HttpServletResponse response , Object handler , + Exception ex ) + { + if ( ex instanceof SessionServerException ) { + MaintenanceResponse maintenance = this.maintenanceStatus.getStatus( ); + if ( maintenance != null ) { + return this.maintenance( request , maintenance ); + } + return this.offline( request ); + } else if ( ex instanceof SessionMaintenanceException ) { + MaintenanceResponse maintenance = ( (SessionMaintenanceException) ex ).getMaintenance( ); + this.maintenanceStatus.storeStatus( maintenance ); + return this.maintenance( request , maintenance ); + } else if ( ex instanceof SessionIdentifierException || ex instanceof SessionCommandException ) { + return new ModelAndView( "redirect:player-session" ); + } + + // Other exceptions are not handled + return null; + } + + + private ModelAndView maintenance( HttpServletRequest request , MaintenanceResponse maintenance ) + { + ModelAndView mav = new ModelAndView( "ROOT" ); + mav.addObject( "container" , "offline" ); + mav.addObject( "language" , this.getLanguage( request ) ); + mav.addObject( "type" , "maintenance" ); + mav.addObject( "data" , maintenance ); + return mav; + } + + + private ModelAndView offline( HttpServletRequest request ) + { + ModelAndView mav = new ModelAndView( "ROOT" ); + mav.addObject( "container" , "offline" ); + mav.addObject( "language" , this.getLanguage( request ) ); + mav.addObject( "type" , "offline" ); + return mav; + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ExternalPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ExternalPages.java new file mode 100644 index 0000000..0bf7109 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ExternalPages.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.web.main; + + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.view.PageControllerBase; + + + +@Controller +@SessionRequirement( value = false , redirectTo = "player-session" ) +@SessionAttributes( "language" ) +public class ExternalPages + extends PageControllerBase +{ + + @RequestMapping( "/" ) + public String root( ) + { + return "redirect:home"; + } + + + @RequestMapping( "/home" ) + public String mainPage( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderStatic( model , "external" , language , "home" ); + } + + + @RequestMapping( "/no-session" ) + public String noSession( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderStatic( model , "external" , language , "noSession" ); + } + + + @RequestMapping( "/logged-out" ) + public String loggedOut( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderStatic( model , "external" , language , "loggedOut" ); + } + + + @RequestMapping( "/password-recovery-ok" ) + public String passwordRecoveryOk( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderStatic( model , "external" , language , "passwordRecoveryOk" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LoginPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LoginPages.java new file mode 100644 index 0000000..7437ad4 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LoginPages.java @@ -0,0 +1,46 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = false , redirectTo = "player-session" ) +@SessionAttributes( "language" ) +public class LoginPages + extends PageControllerBase +{ + + @RequestMapping( value = "/login.action" , method = RequestMethod.POST ) + public String login( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "mail" ) String mail , @RequestParam( "password" ) String password ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.initSession( PlayerSession.class , request ); + boolean authenticated = pSession.authenticate( mail , password ); + if ( !authenticated ) { + this.clearSession( request ); + return this.renderStatic( model , "external" , language , "loginFailed" ); + } + + model.addAttribute( "language" , pSession.getLanguage( ) ); + return this.redirect( "player-session" ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LogoutPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LogoutPages.java new file mode 100644 index 0000000..fb237d9 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/LogoutPages.java @@ -0,0 +1,34 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "no-session" ) +@SessionAttributes( "language" ) +public class LogoutPages + extends PageControllerBase +{ + + @RequestMapping( value = "/logout.action" ) + public String validation( HttpServletRequest request , Model model ) + throws SessionServerException , SessionException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + session.terminate( ); + return this.redirect( "logged-out" ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PasswordRecoveryPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PasswordRecoveryPages.java new file mode 100644 index 0000000..036dd79 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PasswordRecoveryPages.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.ext.ConfirmPasswordRecoveryResponse; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse; +import com.deepclone.lw.cmd.ext.ConfirmPasswordRecoveryResponse.PasswordRecoveryStatus; +import com.deepclone.lw.cmd.ext.RequestPasswordRecoveryResponse.PasswordRecoveryRequestStatus; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.ExternalSession; + + + +@Controller +@SessionRequirement( value = false , redirectTo = "player-session" ) +@SessionAttributes( "language" ) +public class PasswordRecoveryPages + extends PageControllerBase +{ + + @RequestMapping( "/password-recovery" ) + public String passwordRecoveryPage( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderMap( model , "external" , language , "passwordRecovery" ); + } + + + @RequestMapping( value = "/request-password-recovery.action" , method = RequestMethod.POST ) + public String requestPasswordRecovery( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "mail" ) String mail ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ExternalSession eSession = this.createTemporarySession( ExternalSession.class , request ); + RequestPasswordRecoveryResponse response = eSession.requestPasswordRecovery( mail ); + PasswordRecoveryRequestStatus status = response.getStatus( ); + if ( status == PasswordRecoveryRequestStatus.OK ) { + return this.renderMap( model , "external" , language , "passwordRecovery" , "sent" , true , "mail" , mail ); + } + return this.renderMap( model , "external" , language , "passwordRecovery" , "mail" , mail , "status" , status ); + } + + + @RequestMapping( value = "/confirm-password-recovery.action" , method = RequestMethod.POST ) + public String confirmPasswordRecovery( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "mail" ) String mail , @RequestParam( "code" ) String token , + @RequestParam( "password" ) String password , @RequestParam( "passwordConfirm" ) String passwordConfirm ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ExternalSession eSession = this.createTemporarySession( ExternalSession.class , request ); + ConfirmPasswordRecoveryResponse response; + response = eSession.confirmPasswordRecovery( mail , token , password , passwordConfirm ); + PasswordRecoveryStatus status = response.getStatus( ); + if ( status == PasswordRecoveryStatus.OK ) { + return this.redirect( "password-recovery-ok" ); + } + + return this.renderMap( model , "external" , language , "passwordRecovery" , "cStatus" , status , "cMail" , + mail , "cCode" , token ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PlayerSessionRedirector.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PlayerSessionRedirector.java new file mode 100644 index 0000000..fe457ba --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/PlayerSessionRedirector.java @@ -0,0 +1,45 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.ClientSessionReference; +import com.deepclone.lw.web.beans.view.PageControllerBase; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "no-session" ) +public class PlayerSessionRedirector + extends PageControllerBase +{ + + @RequestMapping( "/player-session" ) + public String sessionRedirection( HttpServletRequest request ) + { + ClientSessionReference cReference = (ClientSessionReference) request.getSession( ).getAttribute( "sReference" ); + String type = cReference.getReference( ).extra; + + if ( "validation".equals( type ) ) { + return this.redirect( "validate-account" ); + } + + if ( "disabled".equals( type ) ) { + return this.redirect( "reactivate" ); + } + + if ( "game".equals( type ) ) { + return this.redirect( "overview" ); + } + + if ( "banned".equals( type ) ) { + return this.redirect( "banned" ); + } + + throw new RuntimeException( "unknown session sub-type: " + type ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ReactivationPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ReactivationPages.java new file mode 100644 index 0000000..79e577c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ReactivationPages.java @@ -0,0 +1,42 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "disabled" ) +@SessionAttributes( "language" ) +public class ReactivationPages + extends PageControllerBase +{ + + @RequestMapping( "/reactivate" ) + public String reactivationPage( @ModelAttribute( "language" ) String language , Model model ) + { + return this.renderStatic( model , "restricted" , language , "reactivate" ); + } + + + @RequestMapping( "/reactivate.action" ) + public String reactivation( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "restricted" , language , "reactivation" , pSession.reactivate( ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/RegistrationPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/RegistrationPages.java new file mode 100644 index 0000000..47763c2 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/RegistrationPages.java @@ -0,0 +1,62 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.ext.CreateAccountResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.ExternalSession; + + + +@Controller +@SessionRequirement( value = false , redirectTo = "player-session" ) +@SessionAttributes( "language" ) +public class RegistrationPages + extends PageControllerBase + +{ + + @RequestMapping( "/register" ) + public String registrationPage( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ExternalSession eSession = this.createTemporarySession( ExternalSession.class , request ); + return this.render( model , "external" , language , "register" , eSession.listLanguages( ) ); + } + + + @RequestMapping( value = "/register.action" , method = RequestMethod.POST ) + public String registration( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "mail" ) String mail , @RequestParam( "mailConfirm" ) String mailConfirm , + @RequestParam( "password" ) String password , @RequestParam( "passwordConfirm" ) String passwordConfirm , + @RequestParam( "language" ) String selLanguage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ExternalSession eSession = this.createTemporarySession( ExternalSession.class , request ); + CreateAccountResponse response; + response = eSession.createAccount( mail , mailConfirm , password , passwordConfirm , selLanguage ); + + if ( response.getLanguage( ) != null ) { + language = response.getLanguage( ); + } + + if ( response.getCreated( ) ) { + return this.renderMap( model , "external" , language , "registered" , "mail" , response.getMail( ) ); + } + return this.render( model , "external" , language , "register" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ValidationPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ValidationPages.java new file mode 100644 index 0000000..5c01f52 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/ValidationPages.java @@ -0,0 +1,56 @@ +package com.deepclone.lw.web.main; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.account.AccountValidationResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "validation" ) +@SessionAttributes( "language" ) +public class ValidationPages + extends PageControllerBase +{ + + @RequestMapping( "/validate-account" ) + public String validationPage( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + return this.render( model , "restricted" , language , "validation" , session.startValidation( ) ); + } + + + @RequestMapping( value = "/validation.action" , method = RequestMethod.POST ) + public String validation( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "token" ) String token , @RequestParam( "empire" ) String empire , + @RequestParam( "old" ) String old , @RequestParam( "planet" ) String planet ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession session = this.getSession( PlayerSession.class , request ); + String uEmpire = ( "".equals( empire ) ? old : empire ); + + AccountValidationResponse response = session.validate( token , uEmpire , planet ); + if ( response.isValidated( ) ) { + return this.redirect( "player-session" ); + } + return this.render( model , "restricted" , language , "validation" , response ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AccountPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AccountPage.java new file mode 100644 index 0000000..ed4e213 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AccountPage.java @@ -0,0 +1,158 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.account.GetAccountResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class AccountPage + extends PageControllerBase +{ + @RequestMapping( "/account" ) + public String view( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + GetAccountResponse data = pSession.getAccount( ); + return this.render( model , "game" , data.getAccount( ).getLanguage( ) , "account" , data ); + } + + + @RequestMapping( "/set-language.action" ) + public String setLanguage( HttpServletRequest request , Model model , @RequestParam( "language" ) String newLanguage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( PlayerSession.class , request ).setLanguage( newLanguage ); + return this.redirect( "account" ); + } + + + @RequestMapping( "/set-password.action" ) + public String setPassword( HttpServletRequest request , Model model , + @RequestParam( "current" ) String currentPassword , @RequestParam( "password" ) String newPass1 , + @RequestParam( "passwordConfirm" ) String newPass2 ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + String challenge = pSession.createAuthenticationChallenge( ); + + GetAccountResponse data = pSession.setPassword( currentPassword , challenge , newPass1 , newPass2 ); + if ( data.getAccount( ) == null ) { + return this.redirect( "account" ); + } + return this.render( model , "game" , data.getAccount( ).getLanguage( ) , "account" , data ); + } + + + @RequestMapping( "/set-address.action" ) + public String setAddress( HttpServletRequest request , Model model , @RequestParam( "password" ) String password , + @RequestParam( "mail" ) String newAddr1 , @RequestParam( "mailConfirm" ) String newAddr2 ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + String challenge = pSession.createAuthenticationChallenge( ); + + GetAccountResponse data = pSession.setAddress( password , challenge , newAddr1 , newAddr2 ); + if ( data.getAccount( ) == null ) { + return this.redirect( "account" ); + } + return this.render( model , "game" , data.getAccount( ).getLanguage( ) , "account" , data ); + } + + + @RequestMapping( "/confirm-set-address.action" ) + public String confirmSetAddress( HttpServletRequest request , Model model , + @RequestParam( value = "cancel-set-address" , required = false ) String cancel , + @RequestParam( "code" ) String code ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + if ( cancel != null ) { + pSession.cancelAddressChange( ); + return this.redirect( "account" ); + } + + GetAccountResponse data = pSession.confirmAddressChange( code ); + if ( data.getAccount( ) == null ) { + return this.redirect( "account" ); + } + return this.render( model , "game" , data.getAccount( ).getLanguage( ) , "account" , data ); + } + + + @RequestMapping( "/set-preferences.action" ) + public String confirmSetAddress( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + Map< String , Object > input = this.getInput( request ); + + if ( input.containsKey( "load-default-preferences" ) ) { + pSession.loadDefaultPreferences( ); + } else { + Map< String , String > prefs = new HashMap< String , String >( ); + for ( Map.Entry< String , Object > entry : input.entrySet( ) ) { + if ( ! ( entry.getValue( ) instanceof String[] ) ) { + continue; + } + + String[] values = (String[]) entry.getValue( ); + if ( values.length < 1 ) { + continue; + } + prefs.put( entry.getKey( ) , values[ 0 ] ); + } + pSession.setPreferences( prefs ); + } + + return this.redirect( "account" ); + } + + + @RequestMapping( "/quit.action" ) + public String quit( HttpServletRequest request , Model model , @RequestParam( "reason" ) String reason ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( PlayerSession.class , request ).setQuit( reason ); + return this.redirect( "account" ); + } + + + @RequestMapping( "/cancel-quit.action" ) + public String cancelQuit( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( PlayerSession.class , request ).cancelQuit( ); + return this.redirect( "account" ); + } + + + @RequestMapping( "/toggle-vacation.action" ) + public String toggleVacation( HttpServletRequest request , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + this.getSession( PlayerSession.class , request ).toggleVacation( ); + return this.redirect( "account" ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AlliancePage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AlliancePage.java new file mode 100644 index 0000000..89e0321 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/AlliancePage.java @@ -0,0 +1,172 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.alliances.AllianceStatusResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class AlliancePage + extends PageControllerBase +{ + + @RequestMapping( "/alliance" ) + public String view( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.getAllianceStatus( ) ); + } + + + @RequestMapping( value = "/alliance-info.action" , method = RequestMethod.POST ) + public String info( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "tag" ) String tag ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.viewAlliance( tag ) ); + } + + + @RequestMapping( value = "/join-alliance.action" , method = RequestMethod.POST ) + public String join( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "tag" ) String tag ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.joinAlliance( tag ) ); + } + + + @RequestMapping( value = "/cancel-join.action" , method = RequestMethod.POST ) + public String cancelJoin( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.cancelJoinAlliance( ) ); + } + + + @RequestMapping( value = "/create-alliance.action" , method = RequestMethod.POST ) + public String create( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "tag" ) String tag , @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.createAlliance( tag , name ) ); + } + + + @RequestMapping( value = "/manage-requests.action" , method = RequestMethod.POST ) + public String manageRequests( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "members" , required = false ) String[] members , + @RequestParam( "action" ) String action ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean accept = "1".equals( action ); + List< Integer > identifiers = new LinkedList< Integer >( ); + if ( members != null ) { + for ( String member : members ) { + try { + identifiers.add( Integer.parseInt( member ) ); + } catch ( NumberFormatException e ) { + // EMPTY + } + } + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + AllianceStatusResponse response; + if ( identifiers.isEmpty( ) ) { + response = pSession.getAllianceStatus( ); + } else { + int[] ids = new int[ identifiers.size( ) ]; + int i = 0; + for ( Integer l : identifiers ) { + ids[ i++ ] = l.intValue( ); + } + response = pSession.manageRequests( accept , ids ); + } + return this.render( model , "game" , language , "alliance" , response ); + } + + + @RequestMapping( value = "/kick-members.action" , method = RequestMethod.POST ) + public String kickMembers( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "members" , required = false ) String[] members ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + List< Integer > identifiers = new LinkedList< Integer >( ); + if ( members != null ) { + for ( String member : members ) { + try { + identifiers.add( Integer.parseInt( member ) ); + } catch ( NumberFormatException e ) { + // EMPTY + } + } + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + AllianceStatusResponse response; + if ( identifiers.isEmpty( ) ) { + response = pSession.getAllianceStatus( ); + } else { + int[] ids = new int[ identifiers.size( ) ]; + int i = 0; + for ( Integer l : identifiers ) { + ids[ i++ ] = l.intValue( ); + } + response = pSession.kickMembers( ids ); + } + return this.render( model , "game" , language , "alliance" , response ); + } + + + @RequestMapping( value = "/transfer-leadership.action" , method = RequestMethod.POST ) + public String transferLeadership( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "leadership" ) String leadership ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + AllianceStatusResponse response; + try { + response = pSession.transferLeadership( Integer.parseInt( leadership ) ); + } catch ( NumberFormatException e ) { + response = pSession.getAllianceStatus( ); + } + return this.render( model , "game" , language , "alliance" , response ); + } + + + @RequestMapping( value = "/leave-alliance.action" , method = RequestMethod.POST ) + public String leaveAlliance( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "alliance" , pSession.leaveAlliance( ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BattlePages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BattlePages.java new file mode 100644 index 0000000..b46ba40 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BattlePages.java @@ -0,0 +1,132 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.battles.GetBattleResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class BattlePages + extends PageControllerBase +{ + + @RequestMapping( "/battle-{battleId}-latest" ) + public String getBattle( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable( "battleId" ) String sBattleId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long battle; + try { + battle = Long.parseLong( sBattleId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + GetBattleResponse data = this.getSession( PlayerSession.class , request ).getBattle( battle ); + if ( data.getBattle( ) == null ) { + return this.redirect( "overview" ); + } + return this.render( model , "game" , language , "battle" , data ); + } + + + @RequestMapping( "/battle-{battleId}-at-{tickId}" ) + public String getBattle( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable( "battleId" ) String sBattleId , @PathVariable( "tickId" ) String sTickId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long battle; + try { + battle = Long.parseLong( sBattleId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + long tick; + try { + tick = Long.parseLong( sTickId ); + } catch ( NumberFormatException e ) { + return this.redirect( "battle-" + battle + "-latest" ); + } + + GetBattleResponse data = this.getSession( PlayerSession.class , request ).getBattle( battle , tick ); + if ( data.getBattle( ) == null ) { + return this.redirect( "overview" ); + } + return this.render( model , "game" , language , "battle" , data ); + } + + + @RequestMapping( value = "/battle-{battleId}-at.action" , method = RequestMethod.POST ) + public String getBattlePost( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "battleId" ) String sBattleId , @RequestParam( "tick" ) String sTickId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long battle; + try { + battle = Long.parseLong( sBattleId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + long tick; + try { + tick = Long.parseLong( sTickId ); + } catch ( NumberFormatException e ) { + return this.redirect( "battle-" + battle + "-latest" ); + } + + return this.redirect( "battle-" + battle + "-at-" + tick ); + } + + + @RequestMapping( value = "/battles" ) + public String getBattles( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.getBattles( request , language , model , 0 ); + } + + + @RequestMapping( value = "/battles-{page}" ) + public String getBattles( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable( "page" ) String sPage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + + return this.getBattles( request , language , model , page ); + } + + + private String getBattles( HttpServletRequest request , String language , Model model , int page ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "battles" , pSession.getBattles( page ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BugTrackerPages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BugTrackerPages.java new file mode 100644 index 0000000..03a53d8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/BugTrackerPages.java @@ -0,0 +1,170 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.bt.data.BugEvent; +import com.deepclone.lw.cmd.player.bt.*; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.msgs.MessageFormatter; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.BugTrackerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class BugTrackerPages + extends BugTrackerBase +{ + + private static final int perPage = 10; + + private MessageFormatter formatter; + + + @Autowired( required = true ) + public void setFormatter( MessageFormatter formatter ) + { + this.formatter = formatter; + } + + + @RequestMapping( "/bugtrack" ) + public String listBugs( HttpServletRequest request , Model model , @ModelAttribute( "language" ) String language , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ListBugsResponse response = pSession.listBugs( query.status , query.ownOnly , query.first , perPage ); + return this.render( model , "game" , language , "bugsList" , response ); + } + + + @RequestMapping( "/report-bug" ) + public String showReportForm( HttpServletRequest request , Model model , + @ModelAttribute( "language" ) String language , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + GamePageData page = pSession.listPlanets( ).getPage( ); + return this.renderMap( model , "game" , language , "bugsReport" , "page" , page , "query" , query ); + } + + + @RequestMapping( value = "/report-bug.action" , method = RequestMethod.POST ) + public String postReport( HttpServletRequest request , Model model , @ModelAttribute( "language" ) String language , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @RequestParam( "title" ) String title , + @RequestParam( "description" ) String description ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ReportBugResponse response = pSession.reportBug( title , description ); + + if ( response.getTitle( ) == null ) { + // Successful post + String rTo = "bug-" + response.getBugId( ) + this.makeGetParams( query ); + return this.redirect( rTo ); + } + + response = new ReportBugResponse( response , query ); + return this.render( model , "game" , language , "bugsReport" , response ); + } + + + @RequestMapping( value = "/bug-{id}" ) + public String viewBug( HttpServletRequest request , Model model , @ModelAttribute( "language" ) String language , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + ViewBugResponse response = this.getSession( PlayerSession.class , request ).getBugReport( bugId ); + if ( response.getReport( ) == null ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + response = new ViewBugResponse( response , query ); + return this.displayReport( model , language , response ); + } + + + @RequestMapping( value = "/bug-{id}-comment.action" , method = RequestMethod.POST ) + public String commentBug( HttpServletRequest request , Model model , @ModelAttribute( "language" ) String language , + @RequestParam( value = "status" , required = false ) String sStatus , + @RequestParam( value = "own" , required = false ) String sOwn , + @RequestParam( value = "first" , required = false ) String sFirst , @PathVariable( "id" ) String sId , + @RequestParam( "comment" ) String comment ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + BugQuery query = this.getBugQuery( sStatus , sOwn , sFirst ); + + long bugId; + try { + bugId = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + PostCommentResponse response = this.getSession( PlayerSession.class , request ) + .postBugComment( bugId , comment ); + if ( response.isPosted( ) ) { + String rTo = "bug-" + bugId + this.makeGetParams( query ); + return this.redirect( rTo ); + } else if ( response.getReport( ) == null ) { + return this.redirect( "bugtrack" + this.makeGetParams( query ) ); + } + + response = new PostCommentResponse( response , query ); + return this.displayReport( model , language , response ); + } + + + private String displayReport( Model model , String language , ViewBugResponse response ) + { + for ( BugEvent event : response.getEvents( ) ) { + if ( event.getTitle( ) != null ) { + event.setTitle( this.formatter.cleanMessage( event.getTitle( ) ) ); + } + if ( event.getContents( ) != null ) { + event.setContents( this.formatter.formatMessage( event.getContents( ) , false ) ); + } + } + return this.render( model , "game" , language , "bugsView" , response ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/ChatPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/ChatPage.java new file mode 100644 index 0000000..55b36b8 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/ChatPage.java @@ -0,0 +1,37 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.ListPlanetsResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class ChatPage + extends PageControllerBase +{ + + @RequestMapping( "/chat" ) + public String chat( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + ListPlanetsResponse response = this.getSession( PlayerSession.class , request ).listPlanets( ); + return this.render( model , "chat" , language , "chat" , response ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/EnemiesPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/EnemiesPage.java new file mode 100644 index 0000000..a7ab5ab --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/EnemiesPage.java @@ -0,0 +1,111 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.elist.EnemyListResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class EnemiesPage + extends PageControllerBase +{ + + @RequestMapping( "/enemies" ) + public String overview( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "enemies" , pSession.getEnemyList( ) ); + } + + + @RequestMapping( value = "/add-enemy-empire.action" , method = RequestMethod.POST ) + public String addEmpire( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "enemies" , pSession.addEnemy( false , name ) ); + } + + + @RequestMapping( value = "/add-enemy-alliance.action" , method = RequestMethod.POST ) + public String addAlliance( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "enemies" , pSession.addEnemy( true , name ) ); + } + + + @RequestMapping( value = "/remove-enemy-empires.action" , method = RequestMethod.POST ) + public String removeEmpires( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "id" , required = false ) String[] sIds ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.remove( request , language , model , sIds , false ); + } + + + @RequestMapping( value = "/remove-enemy-alliances.action" , method = RequestMethod.POST ) + public String removeAlliances( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "id" , required = false ) String[] sIds ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.remove( request , language , model , sIds , true ); + } + + + private String remove( HttpServletRequest request , String language , Model model , String[] sIds , boolean alliance ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + List< Integer > identifiers = new LinkedList< Integer >( ); + if ( sIds != null ) { + for ( String member : sIds ) { + try { + identifiers.add( Integer.parseInt( member ) ); + } catch ( NumberFormatException e ) { + // EMPTY + } + } + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + EnemyListResponse response; + if ( identifiers.isEmpty( ) ) { + response = pSession.getEnemyList( ); + } else { + int[] ids = new int[ identifiers.size( ) ]; + int i = 0; + for ( Integer l : identifiers ) { + ids[ i++ ] = l.intValue( ); + } + response = pSession.removeEnemies( alliance , ids ); + } + + return this.render( model , "game" , language , "enemies" , response ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/FleetsPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/FleetsPage.java new file mode 100644 index 0000000..54e8480 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/FleetsPage.java @@ -0,0 +1,251 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.fleets.MoveFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.MultiFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.RenameFleetsResponse; +import com.deepclone.lw.cmd.player.fleets.SplitFleetResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class FleetsPage + extends PageControllerBase +{ + + @RequestMapping( "/fleets" ) + public String fleetsList( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "fleets" , pSession.getFleets( ) ); + } + + + @RequestMapping( "/fleets.action" ) + public String fleetsAction( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "selection" , required = false ) String[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Map< String , Object > input = this.getInput( request ); + long fleetIds[] = this.getSelected( selection ); + if ( fleetIds.length == 0 ) { + return this.redirect( "fleets" ); + } + + // "Split" is special - it needs a single fleet, no less, no more + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + if ( input.containsKey( "split" ) ) { + if ( fleetIds.length != 1 ) { + return this.redirect( "fleets" ); + } + SplitFleetResponse response = pSession.splitFleet( fleetIds[ 0 ] ); + if ( response.getInitialFleet( ) == null ) { + return this.redirect( "fleets" ); + } + return this.render( model , "game" , language , "splitFleet" , response ); + } + + // Handle "multiple" commands and responses + MultiFleetsResponse response = null; + if ( input.containsKey( "rename" ) ) { + response = pSession.renameFleets( fleetIds ); + } else if ( input.containsKey( "move" ) ) { + response = pSession.moveFleets( fleetIds ); + } else if ( input.containsKey( "setAttack" ) ) { + response = pSession.setFleetsMode( fleetIds , true , false ); + } else if ( input.containsKey( "setDefend" ) ) { + response = pSession.setFleetsMode( fleetIds , false , false ); + } else if ( input.containsKey( "merge" ) ) { + response = pSession.mergeFleets( fleetIds ); + } else if ( input.containsKey( "disband" ) ) { + response = pSession.disbandFleets( fleetIds , false ); + } else { + return this.redirect( "fleets" ); + } + + // Empty response - we're done, redirect to the fleets page + if ( response == null || response.getFleets( ).isEmpty( ) ) { + return this.redirect( "fleets" ); + } + + return this.render( model , "game" , language , "fleetsCommand" , response ); + } + + + @RequestMapping( "/move-fleets.action" ) + public String moveFleets( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( value = "selection" , required = false ) String[] selection , + @RequestParam( "destination" ) String destination , @RequestParam( "mode" ) String mode ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Map< String , Object > input = this.getInput( request ); + long fleetIds[] = this.getSelected( selection ); + if ( fleetIds.length == 0 || input.containsKey( "cancel" ) ) { + return this.redirect( "fleets" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + MoveFleetsResponse response = pSession.moveFleets( fleetIds , destination , "1".equals( mode ) ); + + if ( response.getFleets( ).isEmpty( ) ) { + return this.redirect( "fleets" ); + } + return this.render( model , "game" , language , "fleetsCommand" , response ); + } + + + @RequestMapping( "/rename-fleets.action" ) + public String renameFleets( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "selection" , required = false ) String[] selection , + @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Map< String , Object > input = this.getInput( request ); + long fleetIds[] = this.getSelected( selection ); + if ( fleetIds.length == 0 || input.containsKey( "cancel" ) ) { + return this.redirect( "fleets" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + RenameFleetsResponse response = pSession.renameFleets( fleetIds , name ); + + if ( response.getFleets( ).isEmpty( ) ) { + return this.redirect( "fleets" ); + } + return this.render( model , "game" , language , "fleetsCommand" , response ); + } + + + @RequestMapping( "/set-fleets-mode.action" ) + public String setFleetsMode( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "selection" , required = false ) String[] selection , + @RequestParam( "attack" ) String sAttack ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Map< String , Object > input = this.getInput( request ); + long fleetIds[] = this.getSelected( selection ); + if ( fleetIds.length == 0 || input.containsKey( "cancel" ) ) { + return this.redirect( "fleets" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + pSession.setFleetsMode( fleetIds , "1".equals( sAttack ) , true ); + return this.redirect( "fleets" ); + } + + + @RequestMapping( "/disband-fleets.action" ) + public String disbandFleets( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( value = "selection" , required = false ) String[] selection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Map< String , Object > input = this.getInput( request ); + long fleetIds[] = this.getSelected( selection ); + if ( fleetIds.length == 0 || input.containsKey( "cancel" ) ) { + return this.redirect( "fleets" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + pSession.disbandFleets( fleetIds , true ); + return this.redirect( "fleets" ); + } + + + @RequestMapping( "/split-fleet.action" ) + public String splitFleet( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "fleet" ) String idStr , @RequestParam( "nFleets" ) String nbStr , + @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Long.parseLong( idStr ); + } catch ( NumberFormatException e ) { + return this.redirect( "fleets" ); + } + + int nb; + try { + nb = Integer.parseInt( nbStr ); + } catch ( NumberFormatException e ) { + nb = 0; + } + + Map< String , Object > input = this.getInput( request ); + Map< Integer , Integer > ships = new HashMap< Integer , Integer >( ); + + // Get ship counts + for ( Map.Entry< String , Object > contents : input.entrySet( ) ) { + String k = contents.getKey( ); + if ( "cancel".equals( k ) ) { + return this.redirect( "fleets" ); + } + + if ( !k.startsWith( "ships_" ) ) { + continue; + } + + try { + int shipType = Integer.parseInt( k.substring( 6 ) ); + String[] value = (String[]) contents.getValue( ); + ships.put( shipType , Integer.parseInt( value[ 0 ] ) ); + } catch ( Throwable t ) { + continue; + } + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + SplitFleetResponse response = pSession.splitFleet( id , ships , nb , name ); + if ( response.getInitialFleet( ) == null ) { + return this.redirect( "fleets" ); + } + + return this.render( model , "game" , language , "splitFleet" , response ); + } + + + private long[] getSelected( String[] selection ) + { + if ( selection == null ) { + return new long[] { }; + } + + ArrayList< Long > selected = new ArrayList< Long >( ); + for ( String sel : selection ) { + try { + selected.add( Long.parseLong( sel ) ); + } catch ( NumberFormatException e ) { + // EMPTY - ignore errors + } + } + + long[] values = new long[ selected.size( ) ]; + for ( int i = 0 ; i < values.length ; i++ ) { + values[ i ] = selected.get( i ).longValue( ); + } + + return values; + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/GetPlanetPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/GetPlanetPage.java new file mode 100644 index 0000000..87d492f --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/GetPlanetPage.java @@ -0,0 +1,61 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.GetNewPlanetResponse; +import com.deepclone.lw.cmd.player.ListPlanetsResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class GetPlanetPage + extends PageControllerBase +{ + @RequestMapping( "/get-planet" ) + public String getPlanet( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ListPlanetsResponse data = pSession.listPlanets( ); + if ( data.getPlanets( ).size( ) > 0 ) { + return this.redirect( "overview" ); + } + return this.render( model , "game" , language , "getNewPlanet" , new GetNewPlanetResponse( data.getPage( ) , "" , + null ) ); + } + + + @RequestMapping( "/get-planet.action" ) + public String getPlanet( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetNewPlanetResponse data = this.getSession( PlayerSession.class , request ).getNewPlanet( name ); + + if ( data.getPlanet( ) != null ) { + return this.redirect( "planet-" + data.getPlanet( ) ); + } + if ( data.getName( ) == null ) { + return this.redirect( "overview" ); + } + + return this.render( model , "game" , language , "getNewPlanet" , data ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MapPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MapPage.java new file mode 100644 index 0000000..c7ec1d0 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MapPage.java @@ -0,0 +1,98 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.player.ViewMapResponse; +import com.deepclone.lw.cmd.player.gdata.MapSize; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class MapPage + extends PageControllerBase +{ + + @RequestMapping( "/map" ) + public String viewMap( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ViewMapResponse map = this.getMap( pSession , request.getSession( ) ); + return this.render( model , "game" , language , "map" , map ); + } + + + @RequestMapping( value = "/move-map.action" , method = RequestMethod.POST ) + public String viewMap( HttpServletRequest request , @RequestParam( "x" ) String xStr , + @RequestParam( "y" ) String yStr , @RequestParam( "sz" ) String szStr ) + { + int x , y , szOrd; + x = this.getInt( xStr ); + y = this.getInt( yStr ); + szOrd = this.getInt( szStr ); + + MapSize sz; + try { + sz = MapSize.values( )[ szOrd ]; + } catch ( ArrayIndexOutOfBoundsException e ) { + sz = MapSize.SMALL; + } + + HttpSession session = request.getSession( ); + session.setAttribute( "mapX" , x ); + session.setAttribute( "mapY" , y ); + session.setAttribute( "mapSize" , sz ); + + return this.redirect( "map" ); + } + + + private int getInt( String str ) + { + try { + return Integer.parseInt( str ); + } catch ( NumberFormatException e ) { + return 0; + } + } + + + private ViewMapResponse getMap( PlayerSession pSession , HttpSession session ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + Integer mx = (Integer) session.getAttribute( "mapX" ); + Integer my = (Integer) session.getAttribute( "mapY" ); + MapSize size = (MapSize) session.getAttribute( "mapSize" ); + + ViewMapResponse vmr; + if ( mx == null || my == null || size == null ) { + vmr = pSession.viewMap( ); + } else { + vmr = pSession.viewMap( mx , my , size ); + } + + session.setAttribute( "mapX" , vmr.getX( ) ); + session.setAttribute( "mapY" , vmr.getY( ) ); + session.setAttribute( "mapSize" , vmr.getSize( ) ); + + return vmr; + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessageBoxView.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessageBoxView.java new file mode 100644 index 0000000..de8ce04 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessageBoxView.java @@ -0,0 +1,73 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.LinkedList; +import java.util.List; + +import com.deepclone.lw.cmd.msgdata.MessageListEntry; +import com.deepclone.lw.cmd.player.gdata.GamePageData; +import com.deepclone.lw.cmd.player.gdata.GameResponseBase; + + + +public class MessageBoxView + extends GameResponseBase +{ + + private static final long serialVersionUID = 1L; + + private final boolean inbox; + private int pages; + private int cPage; + private final List< MessageListEntry > messages = new LinkedList< MessageListEntry >( ); + + + public MessageBoxView( GamePageData page , boolean inbox ) + { + super( page ); + this.inbox = inbox; + } + + + public int getPages( ) + { + return pages; + } + + + public void setPages( int pages ) + { + this.pages = pages; + } + + + public int getcPage( ) + { + return cPage; + } + + + public void setcPage( int cPage ) + { + this.cPage = cPage; + } + + + public boolean isInbox( ) + { + return inbox; + } + + + public List< MessageListEntry > getMessages( ) + { + return messages; + } + + + public void addMessage( MessageListEntry entry ) + { + this.messages.add( entry ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessagePages.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessagePages.java new file mode 100644 index 0000000..17b8188 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/MessagePages.java @@ -0,0 +1,487 @@ +package com.deepclone.lw.web.main.game; + + +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.cmd.msgdata.Message; +import com.deepclone.lw.cmd.msgdata.MessageListEntry; +import com.deepclone.lw.cmd.msgdata.MessageType; +import com.deepclone.lw.cmd.player.msgs.ComposeMessageResponse; +import com.deepclone.lw.cmd.player.msgs.GetMessagesResponse; +import com.deepclone.lw.cmd.player.msgs.ReadMessageResponse; +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.msgs.MessageFormatter; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class MessagePages + extends PageControllerBase +{ + + private final static int perPage = 12; + + private MessageFormatter formatter; + + + @Autowired( required = true ) + public void setFormatter( MessageFormatter formatter ) + { + this.formatter = formatter; + } + + + @RequestMapping( "/messages" ) + public String viewInbox( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + MessageBoxView view = this.viewMessageBox( true , this.getSession( PlayerSession.class , request ) , 0 ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + @RequestMapping( "/inbox-{page}" ) + public String viewInbox( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable( "page" ) String sPage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + + MessageBoxView view = this.viewMessageBox( true , this.getSession( PlayerSession.class , request ) , page ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + @RequestMapping( "/inbox-from-{id}" ) + public String viewInboxFrom( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + id = 0; + } + + MessageBoxView view = this.viewMessageBoxFrom( true , this.getSession( PlayerSession.class , request ) , id ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + @RequestMapping( "/outbox" ) + public String viewOutbox( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + MessageBoxView view = this.viewMessageBox( false , this.getSession( PlayerSession.class , request ) , 0 ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + @RequestMapping( "/outbox-{page}" ) + public String viewOutbox( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable( "page" ) String sPage ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + + MessageBoxView view = this.viewMessageBox( false , this.getSession( PlayerSession.class , request ) , page ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + @RequestMapping( "/outbox-from-{id}" ) + public String viewOutboxFrom( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + id = 0; + } + + MessageBoxView view = this.viewMessageBoxFrom( false , this.getSession( PlayerSession.class , request ) , id ); + return this.render( model , "game" , language , "messageBox" , view ); + } + + + private MessageBoxView viewMessageBox( boolean inbox , PlayerSession pSession , int page ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetMessagesResponse mResponse = pSession.getMessages( inbox ); + MessageBoxView view = new MessageBoxView( mResponse.getPage( ) , inbox ); + List< MessageListEntry > messages = mResponse.getMessages( ); + + // Handle paging + messages = this.setPage( view , messages , page ); + this.prepareMessages( view , messages ); + + return view; + } + + + private MessageBoxView viewMessageBoxFrom( boolean inbox , PlayerSession pSession , long fromId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + GetMessagesResponse mResponse = pSession.getMessages( inbox ); + MessageBoxView view = new MessageBoxView( mResponse.getPage( ) , inbox ); + List< MessageListEntry > messages = mResponse.getMessages( ); + int page = 0; + int nSeen = -1; + for ( MessageListEntry e : messages ) { + nSeen++; + if ( e.getId( ) != fromId ) { + continue; + } + page = ( nSeen - nSeen % MessagePages.perPage ) / MessagePages.perPage; + break; + } + + // Handle paging + messages = this.setPage( view , messages , page ); + this.prepareMessages( view , messages ); + + return view; + } + + + private void prepareMessages( MessageBoxView view , List< MessageListEntry > messages ) + { + for ( MessageListEntry message : messages ) { + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + view.addMessage( message ); + } + } + + + private List< MessageListEntry > setPage( MessageBoxView view , List< MessageListEntry > messages , int page ) + { + int nMessages = messages.size( ); + int mod = nMessages % MessagePages.perPage; + int nPages = ( nMessages - mod ) / MessagePages.perPage + ( mod > 0 ? 1 : 0 ); + if ( page < 0 ) { + page = 0; + } else if ( page >= nPages ) { + page = nPages - 1; + } + if ( !messages.isEmpty( ) ) { + messages = messages.subList( page * MessagePages.perPage , Math.min( ( page + 1 ) * MessagePages.perPage , + nMessages ) ); + } + + view.setPages( nPages ); + view.setcPage( page ); + return messages; + } + + + @RequestMapping( "/inbox-message-{id}" ) + public String viewInboxMessage( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.viewMessage( request , language , model , sId , true ); + } + + + @RequestMapping( "/outbox-message-{id}" ) + public String viewOutboxMessage( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.viewMessage( request , language , model , sId , false ); + } + + + private String viewMessage( HttpServletRequest request , String language , Model model , String sId , boolean inbox ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + long id; + try { + id = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ReadMessageResponse response = pSession.readMessage( inbox , id ); + Message message = response.getMessage( ); + if ( message == null ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + boolean internal = ( message.getType( ) == MessageType.INTERNAL ); + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + message.setContents( this.formatter.formatMessage( message.getContents( ) , internal ) ); + + return this.render( model , "game" , language , "message" , response ); + } + + + @RequestMapping( value = "/messages.action" , method = RequestMethod.POST ) + public String mbAction( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "inbox" ) String sInbox , @RequestParam( "page" ) String sPage , + @RequestParam( "target" ) String sTarget , @RequestParam( "action" ) String action , + @RequestParam( value = "selection" , required = false ) String[] sSelection ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean inbox = "1".equals( sInbox ); + if ( !inbox ) { + action = "d"; + } + + boolean useSelected = "0".equals( sTarget ); + long selection[]; + if ( useSelected ) { + List< Long > rSel = new LinkedList< Long >( ); + if ( sSelection != null ) { + for ( String sItem : sSelection ) { + Long value; + try { + value = Long.parseLong( sItem ); + } catch ( NumberFormatException e ) { + continue; + } + rSel.add( value ); + } + + selection = new long[ rSel.size( ) ]; + int i = 0; + for ( Long value : rSel ) { + selection[ i++ ] = value; + } + } else { + selection = new long[ 0 ]; + } + } else { + selection = null; + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + if ( selection == null || selection.length > 0 ) { + if ( "d".equals( action ) ) { + pSession.deleteMessages( inbox , selection ); + } else if ( "r".equals( action ) ) { + pSession.markRead( selection ); + } else if ( "u".equals( action ) ) { + pSession.markUnread( selection ); + } + } + + int page; + try { + page = Integer.parseInt( sPage ); + } catch ( NumberFormatException e ) { + page = 0; + } + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-" + page ); + } + + + @RequestMapping( value = "/message.action" , method = RequestMethod.POST ) + public String msgAction( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @RequestParam( "inbox" ) String sInbox , @RequestParam( "id" ) String sId , + @RequestParam( "next" ) String sNext , @RequestParam( value = "delete" , required = false ) String delete , + @RequestParam( value = "reply" , required = false ) String reply ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + boolean inbox = "1".equals( sInbox ); + + long id; + try { + id = Long.parseLong( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + if ( delete != null ) { + pSession.deleteMessages( inbox , new long[] { + id + } ); + + try { + id = Long.parseLong( sNext ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-message-" + id ); + } else if ( reply != null ) { + ComposeMessageResponse response; + response = pSession.replyTo( inbox , id ); + return this.showWriter( language , model , response ); + } + return this.redirect( inbox ? "messages" : "outbox" ); + } + + + @RequestMapping( "/compose-message" ) + public String composeNew( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "messageWriter" , pSession.initNewMessage( ) ); + } + + + @RequestMapping( "/msg-empire-{id}" ) + public String messageEmpire( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.newMessageTo( request , language , model , MessageType.EMPIRE , sId ); + } + + + @RequestMapping( "/msg-alliance-{id}" ) + public String messageAlliance( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.newMessageTo( request , language , model , MessageType.ALLIANCE , sId ); + } + + + @RequestMapping( "/msg-admin-{id}" ) + public String messageAdmin( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable( "id" ) String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + return this.newMessageTo( request , language , model , MessageType.ADMINISTRATOR , sId ); + } + + + private String newMessageTo( HttpServletRequest request , String language , Model model , MessageType type , + String sId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( sId ); + } catch ( NumberFormatException e ) { + return this.redirect( "compose-message" ); + } + + ComposeMessageResponse response; + response = this.getSession( PlayerSession.class , request ).messageTo( type , id ); + return this.showWriter( language , model , response ); + } + + + @RequestMapping( value = "/send-message.action" , method = RequestMethod.POST ) + public String sendMessage( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @RequestParam( "toType" ) String sToType , @RequestParam( "toName" ) String toName , + @RequestParam( "title" ) String title , @RequestParam( "contents" ) String contents , + @RequestParam( value = "rtInbox" , required = false ) String sRtInbox , + @RequestParam( value = "rtId" , required = false ) String sRtId , + @RequestParam( value = "cancel" , required = false ) String sCancel ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + // Handle cancellation + if ( sCancel != null ) { + return this.cancelSendRedirect( sRtInbox , sRtId ); + } + + // Get message type + MessageType type; + try { + type = MessageType.valueOf( sToType ); + } catch ( IllegalArgumentException e ) { + type = MessageType.INTERNAL; + } + if ( type == MessageType.INTERNAL ) { + type = MessageType.EMPIRE; + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + ComposeMessageResponse response; + if ( sRtInbox == null || sRtId == null ) { + response = pSession.sendMessage( type , toName , title , contents ); + } else { + boolean inbox = "1".equals( sRtInbox ); + long rtId; + try { + rtId = Long.parseLong( sRtId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + response = pSession.sendReply( inbox , rtId , type , toName , title , contents ); + } + + if ( !response.isError( ) ) { + return this.cancelSendRedirect( sRtInbox , sRtId ); + } + return this.showWriter( language , model , response ); + } + + + private String showWriter( String language , Model model , ComposeMessageResponse response ) + { + if ( response.getReplyTo( ) != null ) { + Message message = response.getReplyTo( ); + message.setTitle( this.formatter.cleanMessage( message.getTitle( ) ) ); + message.setContents( this.formatter.formatMessage( message.getContents( ) , false ) ); + } + return this.render( model , "game" , language , "messageWriter" , response ); + } + + + private String cancelSendRedirect( String sRtInbox , String sRtId ) + { + if ( sRtInbox == null || sRtId == null ) { + return this.redirect( "messages" ); + } + + boolean inbox = "1".equals( sRtInbox ); + long rtId; + try { + rtId = Long.parseLong( sRtId ); + } catch ( NumberFormatException e ) { + return this.redirect( inbox ? "messages" : "outbox" ); + } + + return this.redirect( ( inbox ? "inbox" : "outbox" ) + "-message-" + rtId ); + } + + + @RequestMapping( "/message-targets" ) + public String listTargets( HttpServletRequest request , Model model , @ModelAttribute( "language" ) String language ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "messageTargets" , pSession.listMessageTargets( ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/OverviewPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/OverviewPage.java new file mode 100644 index 0000000..ffbbf46 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/OverviewPage.java @@ -0,0 +1,55 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class OverviewPage + extends PageControllerBase +{ + + @RequestMapping( "/overview" ) + public String overview( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "overview" , pSession.getOverview( ) ); + } + + + @RequestMapping( value = "/implement-{tech}.action" , method = RequestMethod.POST ) + public String implement( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String tech ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int techId; + try { + techId = Integer.parseInt( tech ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "overview" , pSession.implementTechnology( techId ) ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetListPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetListPage.java new file mode 100644 index 0000000..1fc9540 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetListPage.java @@ -0,0 +1,36 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class PlanetListPage + extends PageControllerBase +{ + + @RequestMapping( "/planets" ) + public String planetList( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planets" , pSession.listPlanets( ) ); + } + +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetPage.java b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetPage.java new file mode 100644 index 0000000..e0afc3c --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/java/com/deepclone/lw/web/main/game/PlanetPage.java @@ -0,0 +1,236 @@ +package com.deepclone.lw.web.main.game; + + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.SessionAttributes; + +import com.deepclone.lw.session.SessionException; +import com.deepclone.lw.web.beans.intercept.SessionRequirement; +import com.deepclone.lw.web.beans.session.SessionMaintenanceException; +import com.deepclone.lw.web.beans.session.SessionServerException; +import com.deepclone.lw.web.beans.view.PageControllerBase; +import com.deepclone.lw.web.csess.PlayerSession; + + + +@Controller +@SessionRequirement( value = true , redirectTo = "player-session" , subType = "game" ) +@SessionAttributes( "language" ) +public class PlanetPage + extends PageControllerBase +{ + + @RequestMapping( "/planet-{planetId}" ) + public String view( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int id; + try { + id = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.getPlanetView( id ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-rename.action" , method = RequestMethod.POST ) + public String rename( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId , @RequestParam( "name" ) String name ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.rename( pId , name ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-abandon.action" , method = RequestMethod.POST ) + public String abandon( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.abandon( pId ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-cancel-abandon.action" , method = RequestMethod.POST ) + public String cancelAbandon( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.cancelAbandon( pId ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-build-civ.action" , method = RequestMethod.POST ) + public String construct( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId , @RequestParam( "type" ) String type , + @RequestParam( "amount" ) String amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + int tId; + try { + tId = Integer.parseInt( type ); + } catch ( NumberFormatException e ) { + return this.redirect( "planet-" + pId + "#buildings" ); + } + + int x; + try { + x = Integer.parseInt( amount ); + } catch ( NumberFormatException e ) { + x = 0; + } + if ( x <= 0 ) { + return this.redirect( "planet-" + pId + "#buildings" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.constructBuildings( pId , tId , x ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-destroy.action" , method = RequestMethod.POST ) + public String destroy( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId , @RequestParam( "type" ) String type , + @RequestParam( "amount" ) String amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + int tId; + try { + tId = Integer.parseInt( type ); + } catch ( NumberFormatException e ) { + return this.redirect( "planet-" + pId + "#buildings" ); + } + + int x; + try { + x = Integer.parseInt( amount ); + } catch ( NumberFormatException e ) { + x = 0; + } + if ( x <= 0 ) { + return this.redirect( "planet-" + pId + "#buildings" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.destroyBuildings( pId , tId , x ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-build-mil.action" , method = RequestMethod.POST ) + public String buildShips( HttpServletRequest request , @ModelAttribute( "language" ) String language , Model model , + @PathVariable String planetId , @RequestParam( "type" ) String type , + @RequestParam( "amount" ) String amount ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + int tId; + try { + tId = Integer.parseInt( type ); + } catch ( NumberFormatException e ) { + return this.redirect( "planet-" + pId + "#ships" ); + } + + int x; + try { + x = Integer.parseInt( amount ); + } catch ( NumberFormatException e ) { + x = 0; + } + if ( x <= 0 ) { + return this.redirect( "planet-" + pId + "#ships" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.buildShips( pId , tId , x ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-flush-civ.action" , method = RequestMethod.POST ) + public String flushCivQueue( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable String planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.flushQueue( pId , false ) ); + } + + + @RequestMapping( value = "/planet-{planetId}-flush-mil.action" , method = RequestMethod.POST ) + public String flushMilQueue( HttpServletRequest request , @ModelAttribute( "language" ) String language , + Model model , @PathVariable String planetId ) + throws SessionException , SessionServerException , SessionMaintenanceException + { + int pId; + try { + pId = Integer.parseInt( planetId ); + } catch ( NumberFormatException e ) { + return this.redirect( "overview" ); + } + + PlayerSession pSession = this.getSession( PlayerSession.class , request ); + return this.render( model , "game" , language , "planet" , pSession.flushQueue( pId , true ) ); + } +} diff --git a/legacyworlds-web/legacyworlds-web-main/src/main/resources/log4j.properties b/legacyworlds-web/legacyworlds-web-main/src/main/resources/log4j.properties new file mode 100644 index 0000000..774c437 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/src/main/resources/log4j.properties @@ -0,0 +1,5 @@ +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n +log4j.rootLogger=warn, stdout \ No newline at end of file diff --git a/legacyworlds-web/pom.xml b/legacyworlds-web/pom.xml new file mode 100644 index 0000000..67a4c72 --- /dev/null +++ b/legacyworlds-web/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + + legacyworlds + com.deepclone.lw + 5.99.1 + + + com.deepclone.lw + legacyworlds-web + 5.99.1 + pom + Legacy Worlds web sites + Root module for Legacy Worlds web sites + + + legacyworlds-web-main + legacyworlds-web-admin + legacyworlds-web-beans + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8f8a680 --- /dev/null +++ b/pom.xml @@ -0,0 +1,72 @@ + + 4.0.0 + com.deepclone.lw + legacyworlds + 5.99.1 + pom + Legacy Worlds + Main Maven project for LW + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.2 + + 1.6 + 1.6 + + + + + + + + + com.springsource.repository.bundles.release + Spring framework + http://repository.springsource.com/maven/bundles/release + + + com.springsource.repository.bundles.external + Spring framework - external + http://repository.springsource.com/maven/bundles/external + + + + jboss + http://repository.jboss.com/maven2 + + true + + + false + + + + + + + UTF-8 + 3.0.3.RELEASE + 1.2.16 + 1.5.11 + 1.2.2 + 1.4 + 2.2 + 1.4.1 + 1.3.1 + 4.7 + 2.3.16 + + + + legacyworlds-server + legacyworlds-session + legacyworlds-web + legacyworlds-utils + + + \ No newline at end of file diff --git a/runsrv.sh b/runsrv.sh new file mode 100755 index 0000000..d761187 --- /dev/null +++ b/runsrv.sh @@ -0,0 +1,4 @@ +#!/bin/sh +BASE="`dirname $0`" +cd "$BASE/legacyworlds-server/legacyworlds-server-main" +java -jar target/legacyworlds-server-main-5.99.1.jar diff --git a/runtool.sh b/runtool.sh new file mode 100755 index 0000000..30ba8b1 --- /dev/null +++ b/runtool.sh @@ -0,0 +1,4 @@ +#!/bin/sh +BASE="`dirname $0`" +cd "$BASE/legacyworlds-server/legacyworlds-server-main" +java -jar target/legacyworlds-server-main-5.99.1.jar --run-tool $1 "$2"

        gtz#7}&^L;R_$d#y7!w(t90_xrB@JHR`H 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 z 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/5.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/5.png new file mode 100644 index 0000000000000000000000000000000000000000..0a89ac083d87b2aaa7af14650f79fde819cb2ce7 GIT binary patch literal 1848 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 D&ZSE! literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/52.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/52.png new file mode 100644 index 0000000000000000000000000000000000000000..0733de548fe2e454f6b853afdfc84109248bd0ad GIT binary patch literal 1795 zcmV+e2mJVnP)fa1wO!U1@F$N$j*2s70@W2WE!xYz2mH+Qy}DF~Q*@|sRS$xI~ApbvU~h`Z~< z0TMzG6f*0!k$i1+?RaqPg?Ti%TaoU+Cni1V~ z-oB|4>vZN{e*e?w8@u0p_4Vz|?c&m-`F4ABH3CqUWwKP$s~D=BIWsI&X(~lD&m>cA zXAlAK`j6KzP`KJ%dHHP5qOGj16=gxunBr(W4nd2eq)3c0nN@VEQ0VRy*24{`Gy{Y% zz}=(Sb@U?IZSrWlo7=zcy>Rg9voGg63xuBx&&QLo#dvvjmFIa;mSrr<7#$T9ZcY*c zkR+)R;P4_@B~3^rz;?T}x!(Ql`7hnIjaJ?~Ilm-|>2w@mLBt`gcKhsX*y+q)TwGE~ z(9MauYmn6H9}=-5*-f-*nWm*(my7wrV!rUjlh5||_s16_Cr6XX*`R-0l+C<7nM_8b z@%sAe<>i%#92^`bO9bKIT?Rpmd%L@jugBwl zzkhRc9YlM*L(S$kca|)r<>jU0!HL6FBxIr6?e=;-svwXem5JrGmF=BvrHV(ZTBve| zxtI3z(@)f}xVUiGJJLq;--Di|Br4O%^x)uNcz)5Cn;Q;?22UxCMk54aL#d>S1flSH zGVLE8{RaR5|Njk$fiM6713XDYK~zLh$TJ z$zKS+86kzBM2bWdh{2Gs-pdTT>)E+<*WsaiW|zlNx4NgR>YVdQuq`4Y(#oN9s1yoe zvCdVM?GFz7{lmBwi;;Wxx|Ovij#umTbUL-pJ$(2G01R^^URd4%;Q$325m<#&Qb0j~ zmKIjY;dVAZzqr`kZTh35WtuwG`7&875)+v;O^=2{TUAW-`ql3sBH`21)APxB)QZ1x zB!&17C{Q@f9V&%YSpD;lztq_*+b$MMF`}U3&1#+J`F5K- zRcCG7ZduZI*Z(>=j%2!+ZOdF@!|h0n7_Lpj*KRZ#Wm!g`Ua$A+x7YW_!~UQ@{rtJI zZa!a>Wx37s?RL9fZ;Gk}K*XgeGm(f_GDRXSVZ&a}rj|zVth2MT>2yk2fr`y$PTt7gnqN+)gG2&39Cdb zJRA)VzB_n-{oaEQp^nUN)Inj*(^cb(EDWbmjE}~%*=@iRf4!d+VHVzT7!ff^g9y8M zB|14d+1(dxl0X26fXmBA-tPn4IlzX3z$x}=j95ZL>ZSuAP?DsR$>i$lig=%bnAFc0 zkMEED_JA$IEVYl;2;(>Gm8jNmD3`*=-uQSto6Q3h``!?7Bn{wrTJTQnbB*AMm6^zJ z+YlPEtXu6X!^B3iETd-f(9jOo0Eu?H<#Z1Q_jwZ7>#%~@mni&ucz$3|geKIC6`ms8 lX?4o7gb;&abze>d`U;Fd3N+4~_{snP002ovPDHLkV1n*LedPcE literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/53.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/53.png new file mode 100644 index 0000000000000000000000000000000000000000..c02ae8da1cce0c7cf3eac752ea947df904430fbe GIT binary patch literal 1988 zcmV;#2RrzQP)}TjQcA zn2ohoRU;5%Y`ods{bV+qMMSEKh(x3+%sijZSF4psXxm0aB1>znh#+E?<<2E(nrB&t zqtUjt_TIgFr>7_L`3yj_5Q8A4WL;&>3lMg48Nt$NN z#u!6HG#Ct@KmTGjn>Pee1oCk|I((h{$j_eD&(r$>cmu zvm{9)8xi5Htw&|KG{$UhZeCws$D-CcV~n+q*&re!#oZXA3P1hy^P4ws5Ybw*y}i>k z_3rNO>FL?Q!9kYg&N)PkMO1ix=OVoScYA2tLXh4Y$9) z|Mu-kn&wH8L_4Hu=3Ej&w^+ zwIXV|t|KDnoO7;iTSQ>y5WM$3B5m8Imt~(m-TrvJ{o}0p{I>h^tWs55tY^LA_3Pgv zC-1wXqkls1-iM;-Eth56)*%Gk*?DS=wbrF+cI#F#nVf~-1+!7rG)>Dg2_a-z)-;VsU^Wl$ z-~IaW-KpgL@J`G6qtyR?dieLrB1VL}4!B*fB0RM#~?bhQ>mQI;jIt@W7=5ydd^ z-k0Tn5tOR_^6i)B!5xkNJ@;-qEdFv^R15*BEEk*3x115k)vEG0tBa`~#LVQq7YRh9s)MyG8EiCdyWSs6FQyaD1vscObK;WXYVodB1Zdi(>pHl}$eW}? zq!5C0i4h4z&U>#4s?aobgb;%N?$Oqyk->0yF}*Nsi0o`OW9A*Mrb1X4TeXk-5=?e* z+F9$~cMe1Z0F1HBMA7de(lqt;^;K-qX!Njc+x{(Gm(_SYUXPm z?c0;_Oky)5fkX_EZGkK-B`a@OTf+WuHh_eX62OUt2HA<{VdEM1^y9vYMRm7Rt5&PJ z`rbNq>KryEODTpBnx^sI5m5+!v6y@B_g{TG8tu}~^OVx{_4VY7$q&Qwrot7PpRYc> z$-|w{KX=7l>9N%e()FHY)>_M)8Dlula{vq>D0@Xx2N&(U*n4nL-MlX%Wtn+VE{pB@ zw|VvNeZhnL=y@1J`f*}sWpqMB%*@v2%#28g03hCbiZOZbnx+cDi^zC9iZO@)fZWdS zVqJc{J2r+xh`-!COzdE@*@&cX*e$klwQhdBuh$-|&8@Y{xbBob1TT`9h<0{{Wmy8C zNUG~PB_TpYa?ZW}?qKcWr@M!`s#8j{QV6OqzuNyWzyDaqdC`0>p<001*Hv+DEV;nCIAhtcraPe*%yy3ywGakJT2gst;OWB7euA(D1PKNM-5 zgNl{16}6Ubo-E6l831)rLl;am-5m|Bd1d?_%G<5`YgM-+*-558q!g6|9UHJctfm^1 z5s^yn>FH@vY@KVA)!W+LKUVMWi$7MyqHqGDUF|J_#>-9!NhQpnUi;K(4zfo0} zh;@4yV-#dH765p5cJ}Vw+u3XuV{Dq*dk@e;+Nmk@5Xw^|01)ZYv_-wmnoOq7Icsxk zb3{}Q#u)0l)`u7qKs)^EGxSYou`s2mv(BAUONfXFBFPxzy;pOfB?g0mF4`D-_a~ia zfh^0i%qqW98~qi5)${b%0YD-?I5=n;*H1!>(YeNZukF?$>FoitVQ%d~2RI;-zU1CF zer9!KyWQ$m(I0s4ym$KX@$vCuu`q_UqV}DLtj$9R%%sas1)PYu!wP$wb#ijDTrPXi z07SQw?(o~&Tb(y8p=q4~d>Z;bxC5%~1^}*BOOd3OTUUGtUN3Qeetvm*2>_q9MGY$e z2oX}-5}Zz_RaNWk8vsyPl=GS-BFt>9>m=_@=32j8D{K&N7SGB9~I?f$2uJ&HNvr WP%3}dUB&$X0000?dSJBGl$~Y4veOl z8R?#L@0oip-|D+sGFY!F%8>-BC@%pZNgzm#U;z(E5+EQ51V{idfF&&f!4MH3;05QU zC!c|FGPueX@sB-eEmdHfENUi zj6e{MZ(Q$@00i_56Vh(7CSU+*9TI>hs)LGv?UCS`R$FoafFm7Yh`#07Y}Nv;K;WI5 zHy7tKavieWK?+#Mc49b^6K5RJH|&vKsw5xbrFCkA0V2=}b(A3zva2-!{oyFjR|59N z>b>weZ>9&qw3klj$@{ zw?6tf3f}vCl{s=?xMP_T3DHE^CYpY{_5+K z$aJyFpPrnY&1R1uKQ@FjObt^*1Ayo{(~_=Jjll8o@xuoX1k_S12)cdy_OFkAd;ZV! zPd>Qu#hv#K4kkA3J^bS|b?)@}v%jX(e09FcG6z{QG3-3i{Q-y|RZ(5t5O8{W8i6PP zofY`x$rG^o>HGWNetGxG{;mZ>@3NX&p(^LAE4!nj%(ARdh+A8@jlZg>?rW{t5OnP& zzH;2H58wU$mml9gJSejY(N{j^tGVe7mqo2)Fwe{VozZMDk0HuOOC;pM;o-|=)(Rd7 zl1O6-ZW=iP(&jAv{KGvY35@CYOw$HiH$69gHk~Gj+2Xt^imEJPpmj`$ge;;?PXDf= zYN?G1fbWKo&{=K064H|2eRF63@G9~pWR|O<%8RpQ{_MqkeC5s6vaxb?QRPJyqN+9q z!?}-jR4oN{I-{EpW;h)F7riqPfP0_5k6uJSZQ1i_%1isBy-_REmaFqc*0!E*uro}J zu_3CAYNaNsYsjtUK`>=eY=*@v(_g=FZIC7?1FCkV37mT|YqKWo4%*$M9QKrDi=%5d z&oWsGk}=#4m=3x-6EKD}o6DBw(*9)c&1=XOZB;9uqHV{6P*sf${^I4uWIR}w?bAOW z&E{E_R|a&(n2iqnKh(bf00960*%SQX0009NNkl@q8=J7XLDp>6VQUN!_X)}B;Zw*ZCs8AKlJVbB?q z=vDp=A^!UN<@XO}W#oP1GRI9+Hy`ut;0}3Sxu8epW|c2LuE1Qko*_n(mM0YnVnt8{ zB8-TPB7ns0{#h=6`T57-{9=>Wv1;P|i@z6l?@lg1EN|D@e>d6fW?z;~u8sTD>pps&+nv5ZF2Qxyp}( z6G2b3dimnT)qE~a837_vL}2LIH`A%Ur?6b_R?Ed=admZltq|7h9e~xg091_Jc8=Ru zm(mgj=%G!`>=}-kIlW+pW1h{%uU|b^4c}(vCNCIRZ}%VmT{$0G&rR(-bLg6u2f+J> zz8-0GsYFeh!?HNn*`Fl69xx5uz_+TgpfZX-(? z=r!P&C4e|)OC<6jqAw=ad8(QQ3{51+JR>j@Q5bL~*IagDk-@T4oI> zA^?`skZ-#~Kl$m&+duy7d%{SbIbJWlv+opMS_5;vS9BGK>_zqPusdy!`{PShG-%N z&L2JMXA}|S5b0z2&Co;&umnSB>zcY!+bm;%&a4_@6ti@l93%}IV5EqF$cSAE=>Z8j zG?);>$H+3t$=qdvo?posN>Sv*8{t^1FE`Yu7=wH>9*;i()Xg-APkj!K00000NkvXX Hu0mjfl3G;h literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/55.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/55.png new file mode 100644 index 0000000000000000000000000000000000000000..a68de007cc339ef0b65aec63ddc2a14402a6203f GIT binary patch literal 1895 zcmV-t2blPYP)v^BAD)wGH1s9BpnZcAL7qWYu(0(Kc07?!3SuoPb(qIGt0uBbU7a%E1$(0;g zN?vpe0EFBP^mW!cmu0zb)^N2`B*6s%ffU#)(Cz>%jD3TVg~6qi)MRCs3$B8Nu{1@8 z#4<3@D3_8l0|hB}KrI9dV;PV;PBthym4MbcS5eWG{OOUverN?kXaz!0R_B!f0VK_= z3=9SX9OuuSi!r(hE@Wx#-XyP*))~po3`Pc884QB5d!4+FUPVQ3Eo!Y(^k*)42Z!Xl zS9a^VR+85_SIO%Rog~YkKm=}$w*ip-KqE*#pMLzIUd%uNU@w5=No5(xGJt$(_vNatXrr#!+11Ne4)zZpJ(w)!le(T(VfE+!qr1QS{P^DOxLktIY-AZ&SSX9ZaImVX zV8apugFU@g3?v9*V{7NbuWx?w`BxXuj$^g#mti!jH%C}5pFBC(Z)UTt^XIX(JyM*{ z=P+6?*r2e&XeKJIBV5+fSImko*GU9`@b*U^e|qEHtxXIECQp#3ra7K3n^itFd|^I4 z98{@XEUI#YrCGmVFR(P01_QF%(gy}pa z{?_($M@NUF(Z<932W3yw=@bRrBLm@3%y1~VqTp`VuU{A1QmTCu;3zgWKKb(7OG5^t zu2!qX3eI{}&yMChJLA=AF6GhYaB=+iU@)+pm7GQiasgCwHQ84&&)4?-ty>Ua+}qo0 zLkPWa>cWM$E}g4@l#tfV^l%#2y*sym?G-}^b-l_SCyyuN@y@-wcbckVgao*}PWgB} zWIwN>H%XGUxzhOC?{`tq`T_m$#(VEapiW59>smz-4krhr;n>WU%SE-Unrc0t&HMe~ z>C{|D7G{M#eOKiA4*&rF{|xV?1^@s9O-V#S zRAp96j~hi0uCIE=_Im9VyKxqfl100UlnZCz5J9+s5JKGeAzb+r{0R65To4DYiIf)? zw2@H~ylb=L=R7?#-CZ2IXBkvD z=$+i^-nsK$mM0(*F}l{q>LM$MC}2ep?kF%s#PJPTA!CCU^I}DerBYKz*#mWRQyg@v zf2LPimUY6uWtq(;*V8w%X{5Njm~X6ljvr%h&D;OT&+XM>|Ig0w6*d76Plq|Vd0+Ln&B#0m%q zm>uX8n1BbLKA2ozxzHpc#@br{^z)CSvqOYwS#R?q&9~|EXHR;)qv`dmDhq8>fzGld zjbmMIwXGW!^NdLh0>p?yz<*CB%heJL0H^Q2nAaR@eFKSL4lQ zGmoOf;c$925o2s!<(u`MJUHoA&WM0S)E8fUIUbK2-6j$tEut+6nW}#A`)|=QI=Xj% z9nEX4uii|Im^j{8t*bmc9t@IA;+S!8cvw}{j?Dz#b0A;>ee}u4j~+kv={I^Q4M7Fn z-f(pL)K}QkM-Lt#5PfwpdebUY{N#liD$#mCe zkiy%F?PG!dBc*OBcY`>N(=5F>zbLEn{Nj8*U${{QgWg^)DI&4bjtWWRZua6gzeGp* z-StmC2)Ng%M@RWU?F|BUs>1z{4+3-)F}%<=`|EGNAqBS^qk+a{I@uu-BaT=+^jpeO zEFxfVFAytITkk)p!D)k57mfECjw=8F literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/56.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/56.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b683ac7c13256a2165c18ed38bb43b6b17a890 GIT binary patch literal 1969 zcmV;i2Tu5jP)LlJ@m>9jm5P}*syT0>{% z-t)P*cUsTl=H7FE=llJ>$6?r?XJ8;yk9|F2=s?g6lDrgq#8TuHd3n)DXCUMSfX?VB zFEwJtf&?Jhha-&;0!7}}BbouCnVR0RPTs5G)riv`0*wrejsW3PAV|LM(@z2*h_psf zEXAId3t^x$0E#?f0g$A~13+uiw1!kO2AQCzFMwhXfFuYI@Q?%nfT>F_W$datYG^jEmcrW zB~eMc#*#!(5(9$(55*o{5ExqPd;(&UcKiU0p<~9`u7Ftw5*~EMz!+GfEJI6q0Ep7a z8f~aN#H>S$;*q0A=nO`NX5r30nRVNmCLQUR_y$1|JpjCYZsyGNj3S@Q?Rr?LT$#Nx zfA^2EJ!6ZN1;yG?(wM}0JG(Ab+gWmnNI>Z6E%p^lwe=cez5n3{pI`Xu@PRkV1EYm} z{-1w0I`V~{j_!PS=km+tsgtKFiwhuN1_&NI=m3lXyg=i3@zGW%{1}SWnK z*|x3v76YS^W{w$0M_S9rgrG;UR60I={A%UOjayd_A3A#K#HpK?ZY(W6edRaLO`Ts~ zTYu}=$$I0}%JUa~vzg6g_V3%@)!A7pm4?bgUA^5ClLu+s*!K;2`t7mu-bYIdS-0!ii)S;Z&)&N8TeZ46JUG(RT`ZT&g?wSY zQVBA_`bKTFTCG$nlZPhjaWnORMoGiv;e1EFZ>Zk_w~<@<^rIiX`|;w`vD3MH{*%u> zzW?BUBWk`}Sy|g$9UUIKe(RdHVBT^;`^NgZGgprqedU3$E$gM-dv;&Dd7T;Om~rFd z;{yZzB$t<8o}PZESSp@9|K6R&dtZP5#oWEQ%Qr8-Hu(DD)5_Jk*$&rraQ~#=QkV@F z<`)zzt_z}EpMN!LxAyLy-ZR=Ii^OPca>F}O z@K05F@+RTQ<_t=IqD?AGc}zxi(P@9SGsOx@q-${dKmsxuFVsa}?{mofO6ZRs8U4jL~RBL{M0#*`r4f8?9@%K$0fA z<-O%vb^!)DaqmvI$<5FCSs{MX1%~P|qPK&kH8RvY^h9#BhWO{afUi+Xn z8jjA-&N}T5h<#EsxJWkzC=fsZ$Gl%ZxPNkQI-W$4>h*g%UuS7BGm8o{Xet8sMC2f9*rcoHq~NWDA`Bx<_JK@QPDF3;G+i-pcsl# zR+3u+0zE_w#p0ZgKye~#>#-x;0rJ)>BAb}>wffg^AQ^(UYssyj3X$hH5YuO$KM8R! z6z~gP3)r5u>4A_GJU}8q%$^muoC82Xtb}Bax4K;^8_UJfMQAdLmrAeOOVgA@f+|47p)T=> zSfJcSlpC@NT`Fd9=kPFG@c(OlQQ_9Wu$PyYVMV;g-=YwCi?qUJAOdx}T?(69jRM3W zY@AZc7y|$iQ^Z_WzF0p1(auX~qav}}+TVGQ5Q+Q;^0|14s2O-y00000NkvXXu0mjf D?~~iA literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/57.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/57.png new file mode 100644 index 0000000000000000000000000000000000000000..a88dc6d12dc18b3ffa6134ec5737ebc2182645d2 GIT binary patch literal 1997 zcmV;;2Qv7HP)Y5?;Xq{i3wD?Yn(* zXU=gkuS91#nfp7xuXAzBmKp$B>zs2$6hcsy5Q6t!MAChhRYW2HIG3qvQ8Yya5miMM zR8>R(6aZ?qTC-U&^VrxcW>BqmvTo|mOJ#*}60y%&i|3L-Mw7y|$rV}^(KBZ6~oV&XbhDpf=@#vqy) zLyQ3c(o{r~4z!ONLn0y~>6vqxh%j@yL_}+ys)|HJlT;GX|Gq&403c#SRD}>q01#13 za#V>3+rueQ7KzE05Xu;1z23XLyp$Nl7zr^EOm9FH5CIWmj3JaMKoL;|B9jJt@5|Dw zs;UC0s*0$pAR>U~d9Dhhqt8rDO^GNWA^@tYs%%(+A~A#@A^>fthzJ0TF(V@*)6>%l zIyI+lp8_H#LaKV_&Ru3AVn#HovOz}xFf}j1F%tkXyRF-H4eUGk{OD87HP_KI^yeSH ztmX4-`9exgRS`i1t#yb75t%t55F(1Sl_qlmz!*vi6Y;hkdxwsk92)89d2}T&r;ZK} z-=6E-J$SU)+OfGOdu{B6D_1U8s~w2OT9;By=n0Cfb;-Mp957KJBI~l3U;m)1Ln@o* zGuv&#$oS9Yg^Tk;PY(Qkd16!5zVza&Ib$OplTY97?y7`Vt6s}K{Omnr%)<&9W0-C7hL~;IRbx`ZiilZtv#WHr)`KeDn^|Ow zVsEXl^e`4?x##*RAX#^mDU-`Dd8vjD)%%nYCam`HPq`{ANm z>xeUJvluxF0NH0p`tvZG&u!i_xZ9}C+*=$R?EmKLAJ3lsj)=ef>f647!G)!z`}eMG zaOb1|K+Q&~CjEk(bH>nt{lmT#Ltq%0lU zx7Y41x7&}MwQFm4cDA20Q@vUJ;>*vUJl$_??fX#CTFbPFh&jlu=;3fEOA&8EYmLl` zF((R{;lc3i{gr#0k4Ag@$DPi9#_+~(TRS^1Q0v7zZ+-UZhhKkl|FC;jo{xL}VQY8kojE3ZbKyG-D^IoH z9og}(4>nyf+TS}^TDt!5&#lf;Z}C>%KR?oLlxH)~A8idz4y9BG#H>PKBJaJ2EUP9n z5zTPUmZYlGYK^N}XU%54D8jf1##BvKCxvUAZ~`_P0OmK-TR4^Pv0hfjEco zB{~%;rNEd9A`k^J9Jvf}L_}a#TANDsipiQL%Z-6NS6NLp8`lQ|>&M-fd+iWN_7)LS z6R8#1i%GD_^L#wEh#*QrL|SW9L$Vg3j;8Kh7D7h8zyIua?+Qezr~n{@5PL}S%pmHP z1a@_Gbz@^gYa`!lU5XVEIcJ@-TAL7vh@z!HVtEK<_wiB#0G9g|0YGHK7$ZCbz%0wO zHr5tJQHWus2$HCQs3+dc$*7^!BC+gPU4~OSxMZ7jI0k^yYcE`^n&^yz_*P1RiGZac zi(jTN5iy9lOf;qG0Wgcv3f~j}U%;584Kq0bh*%;EMhGE^hbl8!IrLb9<3CmL2bfTV zmUsaGl!9c@ckix7q)7#t9$%dE1Zgtlltm#uq?x3Jl+VT(M2(2fS!=COOCmnAio8_u fD8hvy3UU4iFgLt}t~ISs00000NkvXXu0mjfg^#+{ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/58.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/58.png new file mode 100644 index 0000000000000000000000000000000000000000..0390ba87a5263be3d673ef3497ec591bcc8fde66 GIT binary patch literal 1925 zcmV;02YUF4P)-;RpEbBY{- zh#*C(O%X;-zZX$d5JXhVXcx6;)jEi9Bh(*J8fL2`+e9?AiO|RyP0`U|biU4a-h20+ z7VlZU?Yo?F?)h;EBM1P<0sx`^i~#=sWdvYVU^IY$d=Qm|EM=+9NK%`XvQ>e>iis+@ z7>q2PZXl2(2>_BnfIac_)b!fg8l7~56Im>spt3-8ph!{@jjV!2v+>C21k`4?GSG-D zMxz;{GZ;un5J1#*ZB?)`Fc?Xz0*x?|P<lcY};ECV35 zxx0#*3_xw}?ILUtJ4OIjI^FVSn>X4#Y9WF2@yNn=?Af`pdJRU^2}T8&Z?i z=H37jk~11Q7$B$I)J-oOK$cRT-Lmu0!>>O6#3RYKEnOPzo4fCW_usySgGIG%c=LQ> z(@jiGR-KU4&7N)$lw=HMgSv$6ylwl;=^q#0c*oE4&Qy} z+41qoqsP9Vni^aD{jaB=Jp9AyUt`EOZmcbxU+f+RA4C@32Ppyg7XSeN|3PI*jQ{`x zXGugsR8^MUYg|;G0iMK}kwm zp-e(UYujihHi=2*``*2M*mp*~50`s5urFurvwv%)da~&4cKiJGnbWDUjmk^6VKpt+ zZeHKm{P^^A{L8OTo6V)O^U2}SaO;!q{+G8_I_ciM?<7|UrIBg|o4Y&Ay>gXShSJ@A zG93HNV7`DTDQ4`x{pL5{Zj)*ELGQ`_u?ViLEFB%4K6rG{YT)6+$GyGX(ey-eh1H#K zxX%nARhYfgiYw(|Niim5yqlfn_g3F;x4H)heaV(JZ-0Gv^J0*GzTcydyH}d8`X{5| z?sPf`^9ard5kLa2sZ+oZZSa{9WL87f&7D5D7+?H7xN-Z#PPd@RPo5t<-?nyR#D~ z_0nuw1!&=rJR_L0MoL-UY>sVE+89cTP(yCGS=<}|VK^X|x=o)|^`v;c9We2QD|kS= zUVU`q+Ka=NmOvqtLHKLe*F}BL1p0;3#=}(SMVxupH!{BGeo8UG*9kkW)wnd zNmM%p3C@EMg<;WwM$}sfn8!IFpb8SHqzIHCn8XASNI(=&h2x3W8=^MQHZSCDZF%;*Q4lOm6erM9pngiH>;Ry#8b+= z^L1o`Ms00000 LNkvXXu0mjf9C)=l literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/59.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/59.png new file mode 100644 index 0000000000000000000000000000000000000000..25f7f2118dadb36574fb02287ac9c1741f4214c2 GIT binary patch literal 1881 zcmV-f2d4OmP)ZX87vy^pHum+hJH*p9J@i6I1u zkSJNe0uKQkL~WR$Gt2n6LJ^T>Xz!< zbMHB)ae4U+5iuJPK}19Z01;6Y@4c$3YK+l2SJw?9r4)&Xh*OFp5`yo#E=GUt+O_TN zZ6apod;&m>fe=v@VhkeUy^k@55YC=`(|ey%>ie$mJ47Jj`S}HAN-2d9`o2|_Th86^)Pl2S^uSIEmT#xV0}G@48%01#tT z)szwu4hF;NbZSf{E~=ucA|fJ)fJi1kW<6gvhu2C(VvJd#43ScD&H^YAw{7d3L&P*I zRY4>~0KkhE-^Z$|iAY3L6#!HfKt&Wl^I-W40H^|Urm2X)Y>4PJ*J)mTRuKS*crX~U zF(%_8B4WOP7cRVaczBq1%FN6LKoOy|ytKU1o}MabCL|&vNfly@i15nj%%&*Hrm3-M z=F75Z+jiCiiC9&(wr*^1Z|98-EB@%6)ytQ!j91Rgg(E*$|NYmy_a5zi`_s>=I+KcC z3CV1VqR46BrkN8FBDB^OMVU>Bh&wxfGBY!O`N_K+T3Yn?Hc2(ujkfSYEXh?uh%4YP?cJ&0XfJp1FcY`(w$IOho<4*<+$jOFF!Rc1ycYn`g*1^`N_7nLM3tjk{>>})KL z9GQ6V_h_yxMk}Cn@?syK{pPHx);7zs_~yHN8Jmb+$;r&wTmNg|oO_wxloF6-?oLjx zu8rEG!`|DyhOrT2n&sTOa*Thd!0kmqH)}O2|uzNuj32P=ld$ zLgK`-gid$2J2QP4?dF<85BG4|+5L9r`+eRyWagA25vi&jlbHd@q3e<+U*ERfWHKSd z%bVNNCyzS_mB)7T$#?zT`VLsS2j7LtCjsxPY|H|H&N-UR=FBmrXbmt7F~+E>!W^6e zqDMGcE!MlXA$qc$zW?yCuIujZLs)$Sbx7@|jp^@yu75heLUhIN5X}OJnr31wi!tu^ zEi;>?um}pzn&y7j)^$B?8c+CXyPZ@R=Et||^?u;5rwxXto-TiR^Ve@z@3Lj7jgk4W z3!x67uBu>`mr}G&0KkEDNIW|V>&^DQ-Sd9utNP#6^g|Eb9(J2|ZM?j?+WPSH)rBgk zDziZDq?A&OgZJKNltC#VBF?!4)OLMJNY1fvI9@FvJYKDyo&WLuqt(1_j%m2|)ep~J z?D}LB003s|Q$mE45-k?Xl+rNtec#0x4U=YAs@f+Za-Lj8E{b^X-`{UNf&3;>mw(2@WyDlP6-qriI-0~d*iVFw+BWXyUP)9D6%l>4kK7OO+lLRD$ux5R{PpiY zpI=+NFq#-PY?4eg3Zb?nkx31ipjk@hZWxBdO{mBLfdEMAHb1_)xO}@lJ3G6%d274L z>Vr|z(17##LKR{hvj3qKcg_JQq8l@=BIh0M`czm}D4*@xh~hFFfrzS%Iz+HTuEk`T$nH1YW(l9N{H|u{0901 Tk#Md)00000NkvXXu0mjfl5LL0 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/6.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/6.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd0ab1cda2ad1a10ba8b8fafdc665ce4eaae969 GIT binary patch literal 1876 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/61.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/61.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2ff8715f54a867e3cdbf057d740e0a0568fb19 GIT binary patch literal 1845 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/64.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/64.png new file mode 100644 index 0000000000000000000000000000000000000000..cd940932f9f86850ecb0395cf0d908182c2d444e GIT binary patch literal 2043 zcmV*HeBveQDIbjGu00%gQ0|f91Ul@`?7(zfHGF6{6MCy>s5eS4HVHG{6PBj#IPFaC~C<^CWEiVWZC>u_CQZf{hlV(JN7&&QGb3}&lNsp)&qovEs z3(FVdCwqNgv?DUiU8<4%~UlM>4Z_V#__V;9jc8|`jq z<*&8l^|0E{*@~?R&Ncmffsp_%HGrc3-$9t2_^jUhp*b{LE`M~)!(utQ(&T8 z?#6LC4*mZC00960ZGD8#000A)Nkl^>;46&BT*a zlh?ogrqOJfB#8mXaiU@9cMh(stZw{qcY6GEm<~Vv_>;zNGgZl#pIzJh=ic7mdz(N1 zmWWt#H9#to3dA<`;=)_?wf6zKfB%7E-rm`nIQcR}{2*{jT4^<=oN}qOf7tQ+&)=M# zJ2^St4ZB=YHLq6jDs$D^x8L39G}>8Qz=oD$YK$@cAn5jb&1N$Qg7*H?{Z@-CQP!!!)bObX&LrK|;%h@>K#_>||xX}a@d&+*&`j~*Q!`V%u#H*ekSK0T70&?FC? zZL1_EK@RPMD0KH|P(#eJRn@+1a3deCNikVK|hL+-+kS zxUjI$>2z2TS-GH*U1K7KQ6IS1-T&@W+ii-``H+gmT2| z^}3~Di_g~97769hOtb7rU6ibY~00|RJfk_3R{)N4c} z2gg2OD*zDz^onK?N%5a(cuWqHOXLs~Q6kbeVgy4Yz0|~#3&qF-W+Zw>l-W;Ul6Jw)6CCd^b ZcmY3A=kgrLabN%d002ovPDHLkV1i-TuD<{P literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/65.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/65.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0f445af8be6cea2cb54648a0170b53165c57ec GIT binary patch literal 1634 zcmV-o2A%ndP)UZ89cm{kz40tr5V1zR3c@;Q715{oDiKR_hFaabTAc7mrz4QCYp)MA>7-blxR1Q>!kx>`~-69~Q z$`?1ja>3z)BdSoyVo+991!7Q?)7cCJg%H9)B}fnesGP$%9B%Gaa&wpi07)TojJFj% z8HHq!4B^SCgv^6%9w?-;Pcw&mjt2mDkZqzl93Z^Q1%yE$WDqG-W7yi-g2R)!d0qhA zz5UXdH|FM^d~a_rqqkL)yS1An*%B2-A(?-qy1BQ1;Ell?L>>bGBnJU^PX==&hxuqU z%9>FKV0U+SdwV;Jv9q(Yyu6H7yi)r?S*veHtyAAqs|-kZD@8XUnD_6!JOH5-dgE~C zMTv6|FU*5%cL%`>#k#^|*AobmfrT;?Z_JZDK_Mp#sRCYT0#63yVn7~eCe+SAC=5cC zE~sm*&CC`8+Z0(tiqx=6nyl+jj zv3}+1-+%6#Hz26eHYfDjdXWi*BP&ZGg;FRB0Z0rjjE?D`rDVN@AJ83Y*ycTCS~78Ag3e)Ij$ zcMo5A?WIpYd$%k_lvF@0MqGRUlgW6D|6S(FC{(ftlWNjliU5*%Z9WPr(d*LPtJ*E$ z_RTx{KmN9UdFAYE^75-MK7KU%^2SFYOuxJJZEM!d*ulA*{{;X5|NpE(FO2{I0^>Ykq25n{#4l0jNOk%Wz4lMNI&aUc}vhYa?gICNz27w8up8H|x5 zgAHCi5R!L2yFJ}i$HA@c(cq4nrmLtr_q+@Oz<^J=Xe`?1ycx>nARkH|y&-)JU*$TB6VTQYm!6gyoz@+! z5Bfd<&GE-aFJG50zWnUBU;oTo-Mn+{`7b}bZ_zuw)*&aW8qwr;StPAN-k5tLasBY{ z<=f3> z10O#9{N`e1z)-a9uP&GCeDd(YZesz!-Q(lQEks|pa6(d6_&$?GJ_A5OId9u;Wht5a zjiVcPj_>{c{BP1Bc8lh(Kb{5dv+FT@TR_!8L`uYnk*%|F#vf!EGHfV=JT1(u?}u?5 zw!_xkx^DUE#m_nS4BeB!v^!8M1VCG++1BgXBL&A2CWtYl?@hC6m+S7}I%yaGob~;? zfRUi2ni-g^dm<8T)dYAdVBE2F6qO;P&SMuNOvYp(mm1e&seq{Re`oda!48^=V9_4c z%4E4g?PP4-x)kf_TwPoL`|bi#T{xxF9+{-{-uqNT_9+pqgvmlp^C9}ar&C!VX;7ZP zAz_#r6b-_nTTIv7Ic*%OX;Rgo6Qsrxw*i>Pk&&hb6;+pv`c+3w5DA9uY=l*AJ24OA zSc?-Gjf!Ca$!La38LJGPV{7UL0@98Hz^xB&zc@Qn*+IVtU=~4zO5NBviqL>X$`%Tk zw~AKjmgws?zRp#!GAAZR(2a>8Q3R(YXY1BE8xOcN))Z4gop~%Tx_AFRech^PE-baX zO}(n-hRyOZTX^(LE<8fJ-ngi?(k$fyK@v%un}N|{>(kRy>_3`@PgZ;ob=ZK2@nmeK gQ8}3$skYw#07tM_CJ^gebpQYW07*qoM6N<$f*}tIc>n+a literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/66.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/66.png new file mode 100644 index 0000000000000000000000000000000000000000..37cb7dc606d618b229be60cd4c4f3e067c53edfc GIT binary patch literal 1944 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 v8|Pe%QR$ds700000NkvXXu0mjfNNar4 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/68.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/68.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b46c6392b314f0bac3bc1cd3c4ae8e3c879575 GIT binary patch literal 1994 zcmV;*2Q~PKP)YN*TZaK-E-pdBDsf&dkhI#Pxc;et#(9s;UA&5k@3c zMMNqeX2#5jXl4Ka0A`j_G&4j*#F8Bmo%47R1=eJ;Z3aYS2F|&yp zLgV1zU^bhns%lOt5n;|55dlC|0gRcQ^Uk?~q1WqgZH=p{E|{35U?sxka=F=Tmdkfo zXd(g;1DF}8W>qyaA}XK&tSAX^4xEU3y+OY}sH!TZRM_X70YEk9oMVhB#r3*j?<)W+ z84FU?Tyhanfj=6JRkcV@#8jBzv? zwQXB;0|4f8|5FO8MuY%ZdO=kYNi~-OMS~)sorkI#Z#Eq>GqbAYobTWN_Qi`A&Ux=E zL=tfTR@c=>AAdOgVE6Ks%UAZVY>l^O|II=O)9KE7-Sqpt^?Ge)L}&)8no_*b+$5z4 zV9X-o_V)Iexs;AEdhb(8mo8uW@~hjE$>iktxYzH6E}Wj6^0kB2YWeo`?e6aG(a~QQ zO?-}=h{^>Kv99Z?szV4xik#EKhlh_I{VL*!=+3=6w{CyYuG^E7)5&D==Jo5@e3oJo zasRw|6H|1~{qg%V)zXJ#21HmqAR=br!C(sjQ%W(0QuF!qKg}%X{Pj0?Z{E5&=nn^j zzL^b&!})v`Lo_oH?%K}G=JUCTv~9~Q%uIx3szjWK00582+ahcR7q)0=*u~_7k%`|5%1D|t7 zgi-?l%J5QgpIKDR`-+J7_xB%s_aMZ$TCJFQwOk(md+eNan>MD@G)=Q=LJU>yo2JQG zRW+q_zVTU#2i|+{y@>lC00960Lxjh5000A#Nkl???wo)Z5oQSSS;#I-L|c>P6f=&!jffqo_9N) z%sFqZS+6T~XcJ>>+ilx!+qOA46h$hEl39cq5>VtHk5B9M`f>W`oI``oIwCrdIzjsS z_3u3IW?8ODr>sFlYm61)gR%h<0Cv0G)3ej#;gLX^{dlt0#t>iTFJ(~@Q3&B}^;T7t zbB-cWq<(KOpT9ci5y4u^OaPD)FtdsR0Khq?w#>{`RmBkVUWRBw2-Rk@SjKR^He{om2(xZCX-G%--q zG7xW$4qUzRrEyIb~@Sq1E6W8W~+WHBFl2Q zUcHIP=g+@y>U!I3KYsiz>vV^M5dehH67AFzV`QcnBLFay2m^rabn-*|YR^$8nM@{S zS!(cB)n-|i)BmRRrbz;jU_PHC;-^o)&So=aV&?bnPwToq1gdT~rDVPLhhC+V$n!je zuv{*!wHFr`d7f`J8xi(CQ^CKztpET3pP!$-cg#GQOs3Q6$;nAoRfn)tBt=ClRCe39T^3T4VN*p#qW;C>PZ>L`2!P>&eEb zd=L#Y-`?J8=heoyU;0qpFr}od2mPkrQs*Grp>)6@%W|bT5h22tFMmBeJSbgsMFnHu cltHooANUBcF=j%``Tzg`07*qoM6N<$f^u@uBLDyZ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/69.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/69.png new file mode 100644 index 0000000000000000000000000000000000000000..76e2a64d1f786a225aa2540afb1919ceee0473f4 GIT binary patch literal 1724 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/73.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/73.png new file mode 100644 index 0000000000000000000000000000000000000000..37225c7b986bf5821dc314f5b8463238a5051e64 GIT binary patch literal 1862 zcmV-M2f6r(P)OMw8~6iWd*hvnKg{q8h{l8%6Gds!2nyIkpdY84kC`+3U0%!#urDS% zJ2UTES0i-6b(g8q%@Mf`kvOYJ`2qP0?V%82YT06DO-yUWMj5* zZDcS2tTqG!84MB=vn;WxB$;hp`~12OCh;Iw5!p_d1w{F%^x=dylOehn5vshijwKLY zX#i0WBv}@iSfym0lw|d$4@Bc+j-+l9~+-U~V$E6P^UPP5r5m7o}gbPNn3A###4FK001tW~Br&jxi{r=#v z;%r#}AeWCzm5wM$%`^~!G|C&2E)ZZ7R8!;~T2)0{obUFY?Npz>nbkDK?uzwv%cv38f^lu`jQ> zi?lU0*IijXyD>M%>6wL}?`<(TeA(MByDyC)Bx_wu=^_R8Ag{=uuV$i0FYXlY=ux52;_n1yFgo=(Qa z+c%&ttMKjzH;yiSbZ&EZ<>KDui_6EmgU7wUJJW;5dw+Ja`C>Tu^s_Iw9^9|{1~Ro8 zRl_eZwPIY<00g{MnG=i@kr2cW3!@f7i^0{o?muep5mi zrl&h@I<~Yl91dZ1U#yjcdT4{>^#XD8t83l$KXRW+(sXD^VGswjcR;#+Yy6QV8 zNUl&wP*D{X$yI_%8Aiv)M+f<0_1~)ccyjdh{QBab>+`Fd`RkY8U(T0{kBj@;<>q1S z9guIStxmGoKkN)W69t@^1O+IAdPt@S3h+n|4iAcp+xo|E-^}Ni@9wWw>t)+j>ra3u^d+Qb#OfP^6EB-boNkU{opM!Eg) z{^Z$7;i0+jF6ZmMZD%hJR+~G8vMG!k_6{FZ%aPdZRLOLZKqO(w1BgF=|Kq3Gul?4% zM!v0o`R-@mRl8lU*$Y(@H1)Poj;zZ}Hr^V0r#YMn?;-%{2s+L|(y2j3B^C}w5iFO* z53j#MNA7y9UrjLS%@+5I&BK~p*7e3ZB^z%V&{K;;Qo00@$08ArqyO6 zGEhG1MrU_77g_FK%)Y6bs_m{qwyV}Vt7*L%I&V4vWm%e8oFaFZgyE!JqLVzf5LBSh zJV35|L*Flski2BLcf6KG>QnhkGscDI4q#i>L{JlaTe=<4p#^}!8;5<7!J3T!GAVDRl zi6f{KAsiMu&Z5vm05awA6!?h|2YFo67}egLa7Iy$RRW-+prcI3dBS}V8hzV&XKbCV zrOd~{<^eF;Ho#55EUI|QU)!8 zPx# literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/74.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/74.png new file mode 100644 index 0000000000000000000000000000000000000000..a00d0f1ce891c6b05aabfda34a14040831775202 GIT binary patch literal 1891 zcmV-p2b}ncP)WlTp_I4JPkf|Xdz0i;9N9B?i@+biW z05}3b@oS_5D#nzUpP$=p9srO)!p$b;`@O@xy|U4IM-gON%Df*4y`X+nFDeKT$fF#Q z8bA8r{RfRkVl)tdkqJ>TIzm9F+Y15!FI~EPg{R97z)5E(905G>u@zz#A+tOLF9b;d zfRrp79WXmTzq`LLK!OpDwBbEKAP8Ox00aRx5Nh>$E5zFB`DPxU1a*UYQSHq4g0iS6 zIG{|X1c3+~Hk&C~CMO+BB!M7#DUTXN^`g8WAp#NL%ItL3c`6_m1msfGa2H@iN;)7h zN^)e`7^R|81bhL9;YSQfM9GSq%_Iite+7!rgeVyuhO02s2#o>;l8*uq0V4}7H41hl z0hS0O2?&T%1fqt5CM1rb^H{O~F9kuPb}FC?yGRhQg3zS1GLdlDe9|}{gQzU3(AP_O zQ64C|HV6TTKoAycF9sn9vvYF=#VABT5-UcGGRNYKStmqFl31+QAMPG{dGB*znE(9Z zb7zMU3jv#(n~!#OI8<=xuo0)~>r2b8-MIPfOG_K8uU`A~ldpQcq}gl)pV>&aDpmCM4SHRiz|2THt+rU)9u^eA4eaXH1^Cn z4tsVu^eAQrMkc_@@*7V>eB5dGv+gTvYg_lW^I)ZNIW0}(DjghE&!0KnZZ*2yE`V~m z6hp9M=mM-nI{v3!1Pn+>0+H7Bna_`$y`>{jORY;m91e%5nNoF#W8Th`XF_}*$~q5I3Pd%5?Wa`gDo zw`iiQHUSA$A>D$L3J}(-$GSgs)_jplWm3lD{vZ)uyL0Q}GGwVddA9%Y`*#<6t&^jR z7tbCPm#6mC%%_Rae41FvRBQ5;3TZqNRYP&95oyLOO-}kJMbI?Aa&|Ue>~z{b9PAyq z!S3*M*LH2Cu2c;nMmpDZ;y?v5skKz8kxwfiM6IgQd#`X=noY~F*lpdsv2^?9_0b^j z??3tD_Xk?1S)H$D1xx!>=x(G=0WadoTsV$OA_Ad_%m_@UlRWb=;!3O6ZC#Jr)^V7e zZ*6V;WUDLCYPCZsjoV)6NH1_;;)tMdKm-zVyn$X(HBAFiOa`&+$IlyfA7lil}PkmS#~SHk-SJ8x#;zy<(5{I3Ju+6mjT2|@zK3|(yZbdY(-#xi>j*7rEAwLwq4f|4P*cWpis=zt#$vIi4Yi^ zooXoUpd=G30%^*rRDl{bqw(0nLokOhGh|e)RA+;YDbFx68IOgGjV@*diHb_qk%el} dOf&?d>i<4dwAwG{e8~U+002ovPDHLkV1nq3gEIgC literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/75.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/75.png new file mode 100644 index 0000000000000000000000000000000000000000..330ca646bffc3c43a5c4bdefb3f6f36e856e37f9 GIT binary patch literal 1652 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/77.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/77.png new file mode 100644 index 0000000000000000000000000000000000000000..4ead7cd0d8c8ee83b34bbf43d12bc81de09dcdb7 GIT binary patch literal 1773 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/81.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/81.png new file mode 100644 index 0000000000000000000000000000000000000000..20201a07d1cac5a8712cf599667db7bce46cf3a5 GIT binary patch literal 1907 zcmV-(2aNcMP)WZ&g(k{=T)&QUzQ@|M@tufTY9K)kATR@oXaGT>sOdSq6ht~`0MrbTR@8eJ z7cT#K2@24l1^{RP(|7KeU07dR10)GiLyZ&wAhi%A=`e54(9l#;0|lZ^^^lG*fwFy3 zK=MHi08j%G5+JsXu-EI(&Cac@ZvaA6P_&>3L_Gpct)y-=+6hQ7hh=2Z1)XFfsCuA8 zQyP^7AV~CFQPXnJpinbx5!(WMgalw2X`mY|qdAheG?28MUeYpJ24H#lIHFEi%sR{` zVEH3LC*0N>&_Jh`v>cX$PI&P^X-QCw_yRzY=XEsF&u1%1lqnQpF*Uh0T7~TeFots`|>mE2rK+d42q^-!7kj{h2quKKI>$iN&7pyLtDg+c&-R@xL$s>Q+?4 z0SHCi-ZX6#0Xn=eC}0`XfMC|47f&Xij$L_5E5rg&I@`dUBH~(3aLWoDEhX7#S4!pV1OIp#Q1BeQ0RBbLE z>OVbIW-6aObmGjJv*&;KeR86_ef#b&7gjbm>x)0H5@lxNo^?DMo1dQ_#ij*>IXx%c z0MK)!w6(XDfmUx#$QDn1cJ!-n&Xt|~%P&5C@158B-TcT4`>(IwxPSlt=GL~mhZMu+ z>a`nbAm{}=gE_qfGkE?#00030|Gw1;IsgCzZAnByR8^MCZX8t*hX1NM-P6X76B{Il zL^z3A#K<8AB#>ADLF_Jl@}g8EPwvxPSxDmFYiwd4}-U$>a`;hl8jjT*%WX@gK+X!L`-O{ ztE{V_;r8vVyW>B0@9us4?#){teN~@yE6W$h-4FN5Z_HzPw1xn(LNx#&$-#oO`wo(W zGnhd;qT(Ep{EzQol8jvO>CI2R{P8pA^U18tLSA$Wb^Y+(-Xm19AWxTvwUM^<48-IL zki`1~VrYPQn3mN*ZcZ$UeJX(Tz3!Wq!Bm)p4@}l&~75(*(HDJN_+5y2rXxi!HQav}bT05%i&U@dfBhJk9 z((3ADI)h{j3k$7R5F?tWPY59?hJ-mKZHkfTEHkss>({oo|MqQAV^fO2A@I?3Mv@V6 z7mQel(pUXbNJw&k!P3V}KnyGZ8ip#_-Q59*SXRzosAe_E=*;4B>jQD#!^eRry&%1V z0OM#Iid|(rD$pNV1n;oFW=G=^V316!3dDe>h9Dv0jcYFg6i*mX5K}Z7Oie?|lNg8E zK?5v+IB7PHtK^UoxdI?^MHDq8cMRXw7O`py^|4V>_?dc`w_zFv@TQM6tN`Gi`+x-^ zw$KvbgGNPXS$^Z~ciwpOMtqRCSc*z8RX~a2yjZ`2Avy`fra;$y7bE-Vf%97s8EZ{igh-qbr_ss tm-;@ua%C-%B{a#G@d*16wpeMz{{b2V4CX1j<%<9S002ovPDHLkV1h^*n)Ltx literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/82.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/82.png new file mode 100644 index 0000000000000000000000000000000000000000..0e164caa539a002578fdb29addc91eab76df3b72 GIT binary patch literal 2034 zcmV zQ346&qaZ{A#E(Ei5YRLs#Kgo6A&{83a^=F63s){R2BVT7A%;YwaiKAQA0a5pmr^V( z6kAGR3U#K#%)EDxi`O>Z+{I09?*D(!@0@$tn++OLJy8O9sU@@|00ammfCLf-1f&1} z1_(&kUg<#?0U%2Tga*w-0TB=YTGGbN zn+b#jfs!*La?aWV>jRt|TWX?#SA;m&V@wImN}PBBRX7!e-u znnjj2NC(q901hCjxm_b7vMDvZa>lGtfY+?^j!d8cG{UD^=Bqm*QJP2yaHJy)AT1N+ z*Y^)tSj=VI$juA&R^#UIc_qzMT-rD^2801ddWmEJIQ=iwMnuNEGe;OxtZrlfzMhpY z9X#|_6{V?W`0hK0$ELGOm#sVa`Wqvo_a-Z&anb@A5+q4@K|n~h8FNOLhKF<0kpzm) z2oy^T2M)YBZA$~@$^6JYQj(zd{(c@n)=*%Ad;K-WQJ)@I(-^A_F%aQ~pLQ6}IHxh~=Yh!C_UDgGRP|JEVR_Gj@yQ2kSFhNxZslhuzj6!%xpH?k@K~v+2^68+Y$sH^N9G62SxYL^Usqj2SYY!U7<* z1TQRKwPUJUsm)aPzPNV%s_y>2-sy)^N}A3E7q1Q#^5J`LzjpHDBiC;H6UWU1`wu%p zK+~(5=-upe*gdg|Nq>F6M+B#19M44K~zna z%WoV-5XQf+d!9SqUGF1noESy6i9xYMA|Y}BMM&Wh<;I00ch3ANIU=|x7sLUfoC214 z1Og#ML?9AuV@JfsCPrTGdOb7U#i6&yJEz@IO?Ayw)%W}KOsEYIkt9mL!%5mOD$Mi2 zxux?n-8x|b_1Ue})w{ptg(eM^e(?K~E3aSJ-0shG8#h0{-%iz|Usn`_1VKd>qay&E zPXYp^$gvfNm$%-$VodOG5duM)Jxjx-$91Vv86e5KMiGb9pR*DqBDY!eP z5L*h3k*Qkpcxxxmb5QmVirxQ4@4t7o+irgN!Mn4)?xhP0U)=tsmZs-UckbW)bTAlH zGVBNnQcr7Tfl|f`TnLPa5y{IUil>f`^Jaa@BDCT_6<)i%Tu*E*Noq-W@8<`lMAt4a ze|zi3&dy^e#(^Jqk`UpUNEaf7pcFCUAOjI}y4}P6aJo4gCkdzrg;qL=q9{T{NSD<5?Cu&4hsG4v6kwR98Enz4g>%of zOUpN2yR^2p@pNzW>dWW*Pc~M+{DgpzM#PBQGl=5}!1`DsPzc18KlUTz&@c#VSvyOc zX`IgVP63Q+-7M+s@2>0N-uCt%gQEjS?84)kK8XOVsj<*mz=%v39tiNl!u-biI>9iA zT8-{h)(L_*OY47c-YZ52?ol_91}F7tpHKiMih=)QeFXghjzaX0MT!crz}2_kxpU{c z!+zhXuXvLp;<4x{z(lcPo~xolf=qlU0Rkc<;elF((Hjosiwg)v3Pc1tCQIiI{Uwzh zk_iLgH1dQR&No2hBwl;-;dg*K2m*&m0ZI`~x}~!dxvO99o)F>)3D6bpi<9vZAmEsc zFh)nD^>Qr}A4lP2Bsg)B3vk#Hx+bv-7&{$*BmrfC7nhb~vQkv<2t_EuO)@9Gdm(6d zI#y1aqybGQGh;1q&1b4;C&nLDcHag!Mb^(%)!xd8gbD%1Zy}gq84+mxKPh&~Z|C53 Q<^TWy07*qoM6N<$f`{Y3-T(jq literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/83.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/83.png new file mode 100644 index 0000000000000000000000000000000000000000..4d50b6d3065e01fcc4de56c23f233275ef25f1f3 GIT binary patch literal 1967 zcmV;g2T=HlP)L_t(Yi9D3eZd^qWh3l{HT+fWh<2cwR1dJ60 z$O06yLkJO&5E4P`V3!q}AhxV{4t6{OkHAAj$RaBsK^BRBGPdW=-@V;kRV+I8rk7oH z&Ua2B5di=qmKTu#;Qsylj~_o?E|>0(h|GcrI;*M*kwgMB72k7CDJ6HmckkYlCx1?- z)23+nsuGc$bIvJ*p1Y-#E+HoX;JRK*DVphEu>RItdnqMmPAR7p&8z@VshdxZ zzWMCqjX3$>=GL&nWwO!unwl4q?hry{rd`*?*r}?S7EWB(YlUYBq3ha|VhOmrrxbI} z8#Vp<<9FYG`H39;jccQB*6a)i$h=-b)2ceSyP2kx%I+ma?v6-R)#JfnSOjiwzjktR zqMBE$RZ6jKS7!R@t*zgFegtR7&E#|yb<*aD6~rYN08=T2L#)myKxQpEMmwMvf8E`-HQbGK;Q zHl?_~zYl=SA|fIc5xG01lYkET5i^VRD4tUX_}4zTKCQbR-{8jm-Z%jMqQ-o?fFD~rncRn^OE zDYFpqu%eac;r1J+FJGRWPtKN+N7vVHzCFEYrn4q-xV1Gj&8c01X(_XrPNx^le0X>W z0Ohy;0RRC1{}TMZivR!vO-V#SR83YrbK_JLy&q4K<2d&2urZK^EVOC1V25%k^8@%V z`4x23H2e*^v@%YKUdhgtG&pF098-iCU1rTPV zuY7&=1zx^p+q&yF*=Et@PwxEH-?JHKXOro9vfKXlygX3btCk&*+13I^vkP1W^-h21I%XsRJ+Ctgecy7LFzG4 z?LnlsZ@1?iHNJc`{B(u>C4L}pN7$^7vNS+7+y>$8CGTW-)3u_4>59* zIp+mHL?)AoP8AU%VxH%SKyX}$c=Q$`B4f;tzy7|DJf2?p<#K1asrPNb+4~Qzi1S_m zf`AWE5LLA6x>h_CaQ$Sp8e#jNp5p^^u*6YjZbY5-i-EQlAvE3A#y6d`XUAYiL z6z?1o8S@Eh9cDyQFQU7m8q& zz4zXGorBY~Kq3do6gLq-1n<4I9W#waqY!*mm1>0EdmR}f1`zdHk!Y<|kL+30w*l2u zHNh!gl~GBO0tgX#?=^#JQDYJj3Bh+=r`DvMi!p={`hy=CE1&qQz@9vY!C+vmMLf_> zMA9@>5!QsNn<9Mxlw*6augE7~AV&Sg;eyUN07w#}`k~QLgRCNnh?<4;Seio8G*zs0 zQGevqdns{`K^U1?|Exn3qbR5Q+<#i6ZCk}k*Z%`He_=wyVUqv=002ovPDHLkV1lbb Bu9g4* literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/84.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/84.png new file mode 100644 index 0000000000000000000000000000000000000000..197372cb6615e2c9add7b2858910c1be543eacbc GIT binary patch literal 1802 zcmV+l2le=gP)Tv50IC+s+h2_$xG$GhwGPIo^JGv0Mted(_1SFc`G z7hwbefFuZd0|`h;5Re5xQfn=|6^=#-N;%g_bym#CLgQeBkwyTD86@EdVY%oCBLoo0 zg0X>C7QI==frO+a)k#UnQWn_qYpgAnpe)jxvXIr}0idODP6S3I!FV29ic-o*ZE`Di zLX(8D+M{Gj8LKluK79DF^eJVE|rHz zM*wI92?L!q0VU05Gf9fMAqaAn0nec?FmoTEJ2Kee`y+azGm;F}?RPWP$|WdfU4*!} z&Qp2x<)h~>c44HMyMS&C&I;ccnhFER$}L=yQii~Wbt5bDebpb_zjt?YV`Dy_&!?wPpZ*%_dL_#;QWJZ5DUse7jLw=o0MMIt zJp{!ReE8(r#}Dq@TN|!*yWOg)`n}$jt6ODR{{Gvu)7kv-D1}92~6b(X1`NlU5e=euv-yltq*6qik?EJK!3{_BrFm9_diK!4CH zilVOTsw(^af%l>46nn4sX0vI^ImQ@502u29&Heb(4^2bT8@-WKl9B*8I4(<1wnJjP zF%F$huh%oPSl6@JsrP=gzBVYU7-LzMMN#~-x3@N0^F9m)WmT4k$49%bUM`6@bJIG` zEHu;c!tc+@DNQDm#bS|jPAU1|>R2BipLDz3qUb`H&*xQDy?*^~2!8j)t`GifaR#=d zi5+K!x1Rs@`|n&kO@-Ca28yESgm7i+^1J5M zzGS;{Dl4rjr%>$_uKY`aAU`gR9YBZ!H$e~s22uw`l0pqdQQQY9a(8F$Nink&wHPe6 zntS)m-18k_C((jfn3(|p=(-MsfB*TfD2u$v_xpWa)%B*nxw$dGW%+Kqb6M6l?eg|^ zGMzY=dGCAkk~=9~R0RM6Bu#v@Vxm~)&G&D-4>0U@5BKZ)ZQBlhm@npw#eB6~tyZh& zFP_(Ro9CHRUEi&P1(=Y?|;62zdJk-Q?;oI$*T1xdab(il1BfC9s+=g%tCQi ziii(^i3n(#rmE_;X}9ebW@TAUr<1yF09)RzKL7Ql?+5a*A=FjP5mO*XLd*;h2~kMC z2w>=j{q}*0%n}#R&ljqaWm%SGFTZ)&)J@xNyF*u&#iuX7@7fR93@fHwdXpmOFC zT1N)O1wsfxRP!uz&gFSd%udyNA42GdK}7nlXW=a$KK}YCQksOBqVW)U08my*(`#uI zk{1dSlaZ-9A_^7``$O0DWm%L((QbEVWwE|n+mx?A{&v{yF@#4j5FsFvSqQ|Vf5VV~ z$B9B7#+mNBL)Z5P1EFo(`_1Ori}Sbd-X2Q(@XK{|SD_E5m^|X>;^KmJo?l&Eeg5Om z#6nB$C*~+egh?hvUM!}wyeMYRW>wqNO{1&=t~XVR5pha|aKb*;S)S}+2 z{$3m$B4TCEl$hXwAy7!UD0R;ajA4n0nH|g!E&9k_MH)T9+Wo85;=IL~H zyIc|{^*NKl{O#R}bu=rLn3NEVK?p`hvCmV`CzVoaI|j-T)~v!#$Z<-d#3WG;A}0i( z57q}VBsHQyKq?ShHyl-yC($e>?bz>VAWjtkDKn*3(y648Jnk9`0Z$Sq37tI5oNC0> s%}h+*`{d+fhbhe;yEHoa9_1R>|8ROUgik0$zW@LL07*qoM6N<$g4Ib~B>(^b literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/85.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/85.png new file mode 100644 index 0000000000000000000000000000000000000000..364f60fb84a41820cda29965264ff32e2856c866 GIT binary patch literal 1936 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 s!w?yz$Y~a6nx~#|91tZcSt%p literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/88.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/88.png new file mode 100644 index 0000000000000000000000000000000000000000..2f14f3d0a0babf043df0c3dd9dd192676c5928fc GIT binary patch literal 1888 zcmV-m2cP(fP)L_t(Yi9A$YZ&XzjU2E@i?zH2;P}%~;Qi8?+ zqDTyW1Oq1UVhsKk^*0%PP#-iJ6T<_E0*NLNNk~-u0NRc%?Q~jNrqG#t&hp{jnVX&a zu=hFpti9IW8<(!U&u9z=CxbBr@Y;1MNMj5JT;SAGP0C2$pceUWlp}iwbfbfP{?Ic%E)l@oN`4d zjq}Imdt001>>%Mrg2q;>HP{;*Us%}cZ7Efy6Gn?}!S;rO46&9dkGrH6mNufo7#oeb z7mpq}HviJem)AEomKGmvb$e?MJIK;V6&fu%oM6=gRlmU*ZQS*AGMH79;#PTLqw(1f zUr!&JzHt6RGfq7C_s_z^zIMBPcxGeyv2q4U8x3Y95~?SS!Q2WbSalmoE1X6KyLjp1 z((>ZmiG}Mw-MD-E*Ur*ngm;#f_qX?-J$*Lq4e#IkeR}Tj^WA6V-mt2mx=16VSu}bD zx>ZOTO9+noI_cDFXFmSq(|ZqpyZ+0y{~j;Dd-AGpx0y(e$K@y^2s5Bj~`sRIXJ zIezlm&p)OzHH+r@${LL2uwW0f99?7 zX*ttA)P3BY+JCUW+vjszm_Od%?eFYtgH+0h28d2Z_laPQKsNv=Rn2g29q5v;6n^>RQ@MIp-K7quFG%X7pCUhAS%% zlgg}=-3nLIXq6Je>dGpJ4?ev5LbGw==!q}B{Cw`n(eJN)%LeZJbvy6n)2Cj2y4~;f zx?U9Jvq4Iw?Tgk3RyZUjR6~j~E9rj#00960Qelk)000A1NklE8SBgO7Xt-lGSP2gieaB|jd#+}+;Y z-+y{?a=N~@t`eGgg`j38d61y2%x1MsOPf}l*EEVskRT9jZ*8^PE3=|-a2_2VzPkK3 z+eACIFE1}Uo1JgI{`SQmzwhkq^!_{=Urkn5S4V%JYY25wfYVzJk@1I?qe)+{$Km7dtufP3rb~232Mwb_@&>9YgRZ#(`iqfMH z#)Hp4>%Z(vR0P#5Xci<7!P7_R5dnz6$j0ir-g{?nv(tV4;(5$t@96N&CvRWRt{-hb z8J&;vyfrW8)-*ATjDjE%bTAwkC@Pw1qM?X->l0Go=%$a;Pv89*Vz&S8(|*5~t+cGR zyK!y&dYr|4Hk~pdoAZnF>3DiQ9@9(&Wm)1*kSwGymlPNh1Vm951Or5R{hp|5R8MA!ek^Qu zH%EUBhsS4~2U|^1?>>AuFXqF+(9A&ARb?xpt)N+0;xejcx)cD%w_msBF{QtNwZY)| z>}XuMd*}Y{PWSN}XGh1yWHu|N+K!$%-p@4XH^>j-xh5O;?{zjdP6j8EhrHdY>zX7h zqZvy}Ik5;Y3E~izRzi*D0Z~z#6Vm|)fQ|WM*pPaijahX zL`(sc)InTzl9;5mkq+UYO}Zx#SlLJrKuEwA=Al9}z@>)Kn?Q4AA%gg)9@Kts5(OTG zK8Oo9aX6B;fEYz3X$#YSap8odK}67yFw|siY4w|`WhszyvyF&|P~r2I1}P~PK*Z&5 zE@Tbei;~L8jmP;`eiV1)TRn8u^@Ye~hyVW}An>-ZN#&Q&M} alEi;XRNKOthpk!w0000BKHU zC4>lOCSnl91P2ZsD5$}K=)gbW--se2PMwGYabSqxgD7Ie-~+pZcG9M+I^ES(b?csc z&e;yG`Ulq9Yk!M{-EJ?X7($4#&N+)1W;Vu%7$Q>DoO8~ZnE`;AnZ;UL*L93Fv*etJ zSXEWCDgbDVF{S8zLByR-7ny|!>$*lnW^v9F(SLGcjIq`+Ga{-gGb0irsA^r;Ww~g) zV~iqF*8uF0S5{WNFN&f#ckZzmb5RuD zdjJ#>RVAYH=g*gAsj8|;#HgyZwmIKgtC|r28g)dp*7kZs?+arL5gTKO2mnM3B8mtR z$5_W$7e#BiT+ZjSqHsGqf5jNBwJD`;cdaZ-V=ObLl&Dc@f{TbTw$*AEMIj>26-0R9 z!i76`c8j90)`=JZ%{dcMSuVNG8u;umOd^s}ViplG#u#H#%0#qWmO1CeVxDtKDQQ#5oO4cys0!YDB1Qxv zMnvbla~=_`b$z+^T452E^MF`b=KAX*^i^aUEmbU1;`10l3d$iKs zOcAX$IoCPG|IL_XV`HPLf^(h-Rlyjenz`L>6EP7T9NbgQDa9C5j4^~N#=5S<#_0Ha zA6yx2p8e#r-_AaI>e#W>@p%5+vrlc^8nZx(frvzenL?-=V9e4OhY)yet>0?35YhXB zS(;v|W&l8>`%j+z@S}IGfB)?_-^Jg5`D1!G4^?%zKe=(^*TJAe%!qmO!PC>})ELVw z07^tD#S;fdCPaV&WxV9^6uxu{>tmGUHtOe z^;Ti4IvmYrptUi1@9*6h6A?9#8texLhpGwy-0Ka9Xf)b9bLPzU_LizPgo*gv6K{?- zPr2-O_xOveKTP(<+gpEbZ|zJEXKTHpEK3$7Bx0(TWzI=eQ;H&jNC41G98ISO&e@wc zZ(hB66#zy49iP>~XybwYL#OY%bn%6g$AfJ-M3^4VPChU=zTSW2;hwWtl~q+k%DJgl zjCE7f_4VUrxtPt4Mx#v@F-^x)ip+utG1hfmub+Cl@GBpG`qkdYQUm@Z3ZWX0$1&CbdiU;Kw$=gw5d$b9=By!9IpUu0O|dT&Has2T~SPNFWp%7O-T+jx7=! z{%O0U6{?h~AQ4nmyqbhabxE9uKi|j9uo&CRD_zapJLjA^hf2xbErf`OA~nX?G>z2! z)z_a<`0f61|K%^-Hul5!-|RoUTS~p0&91NJ<8fPR%@WMiU#6cbH*U!H@{C0c$!_(7uZ{ME3c=2nl8Bh-&f7Es9{lyhpGRO!} ziU7dMON@vR2@wgveC_3&d`F0jZT@O&XL`T);{pyQyAMA741n{9T16qftVR00ssKyoJuK+?rPC}{^ZHgv!7lDs%@X%y#BjO z9Wrc>%j-A4&o1VQDHkc3nH9i%I7CF`)scvo4cs7|2CC}EoNm56eEjO@czkF0^y$y< zFD|*Etu0#Qce#sVNUFWqH(R)-ydol+DIzhmnK2OqfCHdvB9(~Rb|c29wKKv&f7tZ& zuYb-tz~0_y&|Y3&Y0e;3QWmi6+t-Iqgsusn4-o}balaI)zHDQRZn=m!Y|Ht{AJ_9e zVhs&RJ)2(KE*3%R0!=3m#-$`?_D_pQDcP6nnyI+%?Axv1?+4EkvFA?UX(jgWDpZ16 z3W6p?AT$67A$W`cfRq+FCjb-?k>b;4Hy~AYnIIx_0{~_s;?Nl)wUIzeNsF!FU^E(y zwnqK_M$^Q>VCc>TfM$Ad@WpgG^?m>VUT*tV^Ymxxt0rDWzZ)@1|lvGPI_sgE9ge0KJ)hya*hAfgx}a}W`C^RAnR(5Pw% z!3=7x4;pRn-6>tjnz|(>#y( z^c{A8POXKRQ|dx!%v`tR*oF{t&H(1W_aAs!zd=q67x(JSKCMe?*IS*07*qoM6N<$f^K~L0{{R3 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/9.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/9.png new file mode 100644 index 0000000000000000000000000000000000000000..ee17497216793c9552c85fae570f629e016b1223 GIT binary patch literal 1829 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 V*JE8gG*JKm002ovPDHLkV1m27!W#ep literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/92.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/92.png new file mode 100644 index 0000000000000000000000000000000000000000..97cff19a1a7f7f3570f47fda7bbe8eb05a63e3c5 GIT binary patch literal 1952 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/94.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/94.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f7c206990b1784cb1a718a053518be9b8c54f1 GIT binary patch literal 1865 zcmV-P2e$Z$P)IZ(T(Yov+<{-?N_`;v|-$06_|( z2*OCvx=gwRq$EHQAyH632L&w+9UUD7KPCAeAPT^aUTi1v`+oQC?9NbZUXrPqeXT-XD+0rR0=SDcQ{2oi>3;Ap{~yDW%lALnT*JB0@xnsG7{&%n*TJH2?ra zn9XL0sHy;7N~y)nOvLVRaB#4@yL)OiZyT7!sn3W(%xW(I)F^onDQ4Ktfr&KbaS&ed!pQlW># ztvV>afB(VJ(UYyMZDvM9GbdtZjf%LWtGNAp~Y2;*|OiKX~Ws&p!U-=JnM&AJ6gczy2Hs`}L1U zXY1_lAw&R(G1fLjR7ycaW-g`h{{GdRGZBk~Teoh{X7jck#@N(bol^h(x1az1+m9dJ z+~1Au^2Kx@rVc01=NB)H*6YRjq%-pv<6y8ALhw!0EiyCj?Okq~mWT#};mOHqDY>$! zru^>9Pk;LPE9mEz@(jJl3lkmq;@OkaDYiRI%7lw$t|H8gncTgaLPY9qATw*4wp#x1 z@Nl(SPA2D*$$3hvZyw%-l|TlH5$N3}Y-ejq`_}bKBkpJGMOv*^b@@4G07ywybz^!k zGbyDsP0K8$|JglFQDW;gW&mM{$G0j)RHQ;(`lDV06>D2 z^yS%;$W)V=5%FL!===VE00030|K-Fr#{d8WFG)l} zR85x4Z`(!?#%E@CDbkLWCNO%ad+Egn0u)700qXqu$<1gD#6e%NV<1MP*cL5O5=n7) zW^x!UksBYt%;@y0%_!Vq{kwT7}I*s;X?;ZH#d~pD`zA;Y>t{ z93lazWo?>G)31+?Uashv`}I*-U0l5XJYUV`kM&c%-t+>6q60uP164(YuIriirfq`Z z%-mJgdoN+c_G6&(_bKv`DI$to@)B9cEXbm!i~uN->?$H`BdaPY zC9JB0kr=%9%xuU1E&&pes(Md|gy@|k05of~i1uo?H!B@?&6Q=D)eW3;;}7#lGe~0s zW}!UfV^9EKPRz;91dyRX)z0V2vLbRso(Rn#vmAnHOD2&$c~~!*`OTX@&d<*;FaJs@ zF(*@B5n;CSvWTjRE6W2jH=7?TsH%#jaWL$G2#FlgzR=A4?%msA7{;DuGdCENy%t&Z z5eX3x-FGPGET{;HaKBfFxt zWFZCmDK2~JLa-fTAZ z+YYo?EOP$<0KE4hgu*#*TxFqE)hNi)^EbMU)KNdl>x&pbH^$&va5;00000NkvXXu0mjf D1tE6P literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/95.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/95.png new file mode 100644 index 0000000000000000000000000000000000000000..1b19de3544b936d76894da24aad47ac1f140be8c GIT binary patch literal 2056 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 eAV@?#RR04|Rp%M%6NF^|00005GqxB?tR~L z&dj(tQJlqDoioEc&+j=nJ>6ARYYif)YDx(}OA!$Oq?DMmwN6C3-ELhsstN!h1Y>N@ z36Y2>=Ug6&XpA+H0RU#E5ULP@wayqbH+P%}Rn-_{tpxx8AR_O*_kL{bP^Z&1#yICD zCLVImmkT1?G-AJsL;xVAXq|J$SVWAmNhwZEO>J$BL6?a%*L2jtJUxKt+lG! z?REx(K~=R7$vJC`wbr)V?ZSd{fe4v%&WVVKNVQm^oz9Wra0H;2F1>8l*VoHHYb_!g zV+uksHv9Yg<&CQ1zZGN5IeYI5U@0XcDjukoCE)n++0D%jRb5?OE$yVNrV2Ty5JFv# zikXP0Dnt}Q5E1WN%$b>+rV-($86D_goCu4kNLH1NjSXhbIjiaci>greC8FVQ7(xXA z1*Z@yYhCw|=N}B>`K1e)H+Of3%J#?WAEmTcRV@*z>k$#DO5tZ|X(^?2+1f9Pn?+9?hmhBd+&$qclP^hMbeaF&bgdKw7U9p znP(6YKmouQJ3l`kWA@$`cD-+%U3_Dh2AOqlFcQU+k52uxdUy8d;g8>c=hM%=lQ93p znKR4F-;_+H6h%Ztc6J_=+yQ_A07OJ2L>LZh?;RqQaLvtKxbxe}sBRi|Rn>MTvbsOl zdK2S^I@6Qqmri}~$+zd9eC|PSxW0BfrC35&7Aif75D^gotaTv-BIBG>)rEzHm6g>_ z_hb?jp#8?WYLZzNPR)qYwYT58`tFCl?fBT4b31*hY`FRP)fj74`5$tms)%3!&^hZ| zD5w#Uh^(!xUB3M0t=l(;qvo|&FWy@D-TE=k&E8($ITxGym6x9V0RRAr$QV<8Gh+-QqI15gTE>_%psq)V2w1h-)1xL%PmS-?lfIgaF%E~jsyI0{ zb8L40*wL9=%fDvv&piFq>o0V!TzRp?s4!BJj79EZgLA%o07bc+WiS{B_`i4M;)PS^ z7G?qT;m%P}U$88{bZhPR zKmUHbu`=12n4gy}WBpOpEcLG^=|z=ev%0qTs4yW+^4g z^VZ(pzRTZuG9hqetn1-@?{=Yx{~li!(^GRrc6)uEx29UH&P2PIXwN=cd*4)wNnV)f zJFS?b3#H2xfQ6!%9k*y@WpywZsET9PAgij>A1Xp!Rw-uL^-Z5Rk9j9!5~&`2_~7fW zo-^G4@ba5f-!TV7R23()qlTH;rJN{STwM4M=2%swNe`f9GE5rIPET%o^4|Pxdvc~X zB#~;eojv|wV%WQU^W&RxaOUTz%J%klzdzXB9d!(smR3ZBh+@o`*;PEZEfT1;!ahAm9vvmd)@C53BXd45Zryq%}!OxO)7*yga8NtF~%&* z5s8^!eDQf%_UbxiOe*s2%b#0O7w5vlv|ze#M>yDj?KM?Z1ps4jchgptP!zKb#R7me z^DvQ=W!b^Op{hvgKY8-e)zwuNW8|#YtE-`&9{u$0zaukkuy2i~p=*Y(hoYGA-_AhK z4XWx{$ZJv6)6;*<%9MJ&-o>X+H+OemF>{``{OLp#!iZ9Sbf?o6Q6daeQ-!KFrfMND zqQ@H@>!Is;N;M*;RCl}G7^73w_xQOE5a-wG>cg9x8zQ3h^>trODfyk_Sm5zQM120t zQ6vGt($X>_Wm%qOIddF;h@)!|@$m4_ffG{FhS^{S9+;YpHcBEPFcHno&G-BFW;PfM zm?I*1`g2%&1I%CyB=4B>z|0H)&BTnFAjE#hI5d=H8Dr)`ud1Gu5J^=K$!ruxouoct zA|h2o92Gupw~K3|uL1xe5CAZ9r_&iv5|Q#e_mJxEh%xg?Y;0^al@Ts4KX~?RyJ^J; ztRb*VlNr=??fngb8@!J!(W&EaYUF{;tlRC5_NdzN@zKuCjyv2KsYEyy6Cx53Rcqq3 sV&k=2TOXU5BXy(=IJ$Ciana2F2NR_OkDu#A)c^nh07*qoM6N<$f~Y{?lmGw# literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/99.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/99.png new file mode 100644 index 0000000000000000000000000000000000000000..2a984ffc785daa4eff7b44c1060b2b7064a88aa1 GIT binary patch literal 2039 zcmVr=B{0MI0=Ws)yTmmOJgoB+362~}%UB^z=-r1S%s^ZYGN259P zRKI%l>Qy1LAR;rl10oVptJM|}L_{QJUS3`vk6))0nVFdm4)$Y=%%1=r$B_^WG z8o&`brI?#RBYK$?Zlu|;()F!M zlDpUSjF~%~l9_XinYsfJWzskpoXXV!;E7fzwgG^4yTi(PFcG?@mh1dUV-`H5~x++NtGhe@T@Ba6bX|1X$B_a}$JbF2$nX(AG zyP0RcW)@?knuyrlK3;oo{nF)X^m6U&=_=Wk_4Q(IaPiYGmXI`S;Bj zW8MN;33p3L0e}cOd)eLG!A#9eRowvquAJ?^c{3Sy+p(_CUA?|AS5|Ki^yrYm_V@Sf z-xtzq-?@Hm{NMKDo&7u?c{Yz{2+W+1jp6y<@#X?1?6qZaZoXTVXZpQbefh)Ne{XG_ zzjSf-{K<6dkCjh854~P9-o4y!uYLCA&hE>bH*Y#p1Br3azp$4pW8BnG2I@%JYi}dHLE$4}N%ni1)wy_TJsQs;Oz} zx}N2iJDu*~;UTjybKV{zvazvo{@mHU@d#2pH<<5ryQeR%9#z$Fad5c3RV7GA2czAc z+5X68)7kXRqrY|@Z#{cEnarxHiOs85uTB=k{{R30|Nlcs6d(Wq1F%U%K~zna&u<%5 z5XWcc?XK-)V>?lbn>4mU5{m;DAf)YqD^e74N1_M*nj#?tJs~)7v zF@qO`C;ids$lw3%{;+-gtl8>PE|;G%s1~l3P+4Q!y>Rl^a!weA=bf_;wl-_Enuv|0 zokV^e$FVGni0<6^D30U3y+4(m)gti5a)r;f)XBD%S;G4{Mq z?%v(q-5rg+DDbt87@+i8sWbKNeo*gryUpkI(~~1$^WLpnN3CXcb#-Ck21R~#ZSCP7 zyZ<$xJ-GkNKc4gW$=@9vdN4Y$Jh_u!K?7D8hKM(~r##F0o)wSwRKYqWpx!G(s zR+bhI{@u3;Z@>HY%NNaQh@8UA4-cO7Mi<7IIM$az6Eg<@RVd6dGa{_7uQwVEV`5oa zN9}gob=}jmPNUfv^m|7yUpNZDvPXmdQfao{8U6aW-W~eJ#Nv^Yz9glTA|j;}0ARVi zEC#u}ynJx*G?Al7>_rNd$z)}dg2+~Q{YH83uYG1C#T4O8qEBo<{sREi^t3ASN|ponN{YAOiA;cyhkIwc@PBx7RcN#fJ5`W_sZ>%=);f|aGaF-K@eFw-WSB-#N=eQUacgT!at46R zpd2S7yoN|bYA_fG+(|ndW3-OMoRuQ2HM2=Qt6VM*heM%TK@g?X;o%`75=q%WIgWEB zWpLFSm_f29m<52$0-e$!NQ6NUBwf!$2!M{`NSg>JPVE1x{-tCm03zFk!gq~*q?F+@Iw2N|vqUO+&8bewkpLj*Y1>lm3zz__3@Rr#g9Onh6OaHk{trnN V_U2Y!vc3QS002ovPDHLkV1gd~=s^Gg literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/js/jquery-1.4.2.min.js b/legacyworlds-web/legacyworlds-web-main/WebContent/js/jquery-1.4.2.min.js new file mode 100644 index 0000000..7c24308 --- /dev/null +++ b/legacyworlds-web/legacyworlds-web-main/WebContent/js/jquery-1.4.2.min.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
        a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

        s 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 Ef@8x=9{>OV literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/93.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/93.png new file mode 100644 index 0000000000000000000000000000000000000000..19117da65ef0523de1a1f5eaeade1cd1eab84ad5 GIT binary patch literal 19570 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�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 N002ovPDHLkV1hM2FpdBK literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/96.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/96.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5359d729b07ed01e3b8d10d0549bda429c901e GIT binary patch literal 20110 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 B4!8gS literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/97.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/97.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc324b11bab675bc087f99742247092e4052d68 GIT binary patch literal 18416 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 XYoGH!JH!;R00000NkvXXu0mjfzQ^OF literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/98.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/98.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1e44674a14bf8f458d9fdf78729c2aed3c8f40 GIT binary patch literal 20133 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 Y2Wgr4Dc?_cssI2007*qoM6N<$f(S(A8vpecJ& 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 Y2lvAo(|<)R+yDRo07*qoM6N<$g6-q12><{9 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/100.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/100.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4f8a93da7b3bd1c3ef713dda8d2197fb6e2fea GIT binary patch literal 1780 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 Z)cb9#l#Jz*7e}C9r52YKDeXz<2N5MLurS z=~cjydWH&G!IP)XyAy^6a4TJ^ybWFT^@eU6!U4)PkY_L4rz>6q3rKWp-)s4)90-qNKtjv;c)#ZoYB5oozy? zLE~zfVxkt5z&rtPcl%%09k3o211#n1>|f57r=C=|1w_lLd}U|%-tOBUzxV$0XSjT2 z~!E#%SB-h~SrlkxQ5{r$xm{(ic5da_(D4reo6U&r1)zWVyx zYP1FlwICH4fJIoUt4i`;m@^{^3DiKXK@FigIX>RrzICwwylLAP2a9KWhoey~q9-Sd z7++ZG>Jqy#UVi;8hW&0NskZ``;!nA1rib!EiFiNNVMC5kO&1^@F9c}(5}2$$9BFP z$BzBp+(R+*UY;!%qtVlyd(S=hoa;a*Nisl>A0I%W6feRGl7IaEY^&R8w>AcYzgz7) zGhAL?oSq(UcQqcrxSgTl@YchfBo!n`_$FMISj4PFdIGQYcV9ezUgS$CzzhKBoy$UD zw>Ni<=H~tzd!*ag*d*P5|K>#)cDH+*o#yDmefh?c272WQZgUnW@{C0ln{PKJ@{PWK~865u;X`<8y zA?cFy%v$jT5Gr7KqA(x}LC*WkXN~^r`;+k~6wDe~qv=-RerZ9 zjev9+A<}_9O0uWRq=1k^mgmLw^;M!;If|iJSy8}wqw| literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/104.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/s/104.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f7049f6b11f927befcc0e3dc6030b89ea7f026 GIT binary patch literal 1935 zcmV;A2XOd_P)J?Fdgel+hjX_~Z2YZIHk zHmSwbs3?kUt!RoZT9txO5JlaIZd{8l{0jsT1?@^*2!fy@f~bowidIBQtu>~JX<}cJ zCNDA1zRb+M-{)fHg?1LhaPOV(obQ}-KeA8(02t^%0Z3N_4C+CbZCOa5si}tdkcj$Z+0J=CE1blPQR{J_b{>;H0C6QXtzBK?s9- z3rTZzG5=ZpvGMVh8!NkOL$1Wdg@tNY7Zl$6j3z*ez!d=kn&-_F8l057Nth{Jv3Fa4 zD~>IT4FL79(6M>b`)A%eeC&bYgF}B@{q^zjC%SsJ4vp;V+c`LQbtZVFIJyEP%Eiep zhpDLt>7-Q6uFs((N9*(TxOD>rGL=nhckFrPjh8?9<^!ho=@)0Zt3BTPU4yqZmzx(a zpC36e+S%KC{n`R3ZE*}5Ow%lfq!Ta~H)2>>nm0`m5(|liq`R;Cs^=&aoJ*zH3DwS~p{+{Emb-tL+Csm63;acRCbFdUrr_w8cr7MACdRuZ>j1aB5# zx-mSO%{9Q}mQg`KoLMl_S6_ea$%jwhZ>-B3egPD`^)*QnOQ1da&DqWQ$Pu>5{$8SG(Pkb1II*PF0?AxzM~T1);{FE!0RR7+M7cQt00U1+L_t(-mc4HyRTRa~z3+|f zVVuNCh!gFSNc*9%NQ=ZrLxboM9|bif5`O?K5)~CC)JX6TKu1BhC1tXU5E5kBO_bPP zdmN85o|*UFrMNSWcVUXr*u~X-_nmuwhsBrTa`C133c-sAfRo3M)9JXsdoVAGv(u;h z`}e;4^2hhz`y?!aVe`l7!&|rSP9~E@k*Dc+G9H!rB|roM8<-ZE7O^E0k%`R84y&gI zNQhwL{q7f^f4wLddF3}c+oz+`Z+`eHN!H$Z{oS&3Pfnirs_J&vhv&m=mbt1DVVI~k z1=4Rz99ant5Rk2DB>^Hk+b?g&duL~7N5@C6z4FHQKYi=2+*LNuX0!CpB?o&opB

      S7&Cb|d&!?X?&k2@xw>A}3 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 XJ(RLvP{p%~00000NkvXXu0mjf4vgJ9 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/198.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/198.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8177857796ceb3ee4914e4499b242515dd7446 GIT binary patch literal 17179 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/25.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/25.png new file mode 100644 index 0000000000000000000000000000000000000000..65b029b8c1d3caa8d1c4a8b82868cff194e77229 GIT binary patch literal 16868 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 z zWdjhOK6Z3@c|lTYe(!hSy&q1kq^Tb zGnil+28T*AbEFXkQko2k6e0>CNGa75RM-O+X>oJd(RiXRRI0TYc^<&3uQk2nQ7M-z z`epwE00960Tevi1000P6NklzYf9LKS0Ui;#TT$(Z|MHCg=T52svqU0zhm4hE} z07p9J=xYx7fZXyuK@LKKoMI(NfFv;F#1AFE zeOS!SRKKdKtE#KJtH&Y;0amVF4a1Jb{(5c<23nKiQ6Jl*)n9TI1 z;QOS$8XmM{^qY=hGH06Ba#NlF3V5|%ZyC}I43wtxfUwiacsZ02m(*n%%3~rSs`E|S ziU7(GX`*Fjjw+?-hW(D?(B1boMuWi@Uwr-i#dl|CXRb?!N9X^1`c3m>0052p^3v;b zgF(O7A3fV^vM4-0IzY$qT*pBk_`W2H7y}{z$))T^+#?1=BhHu*TuSAab`c%dLBt^w zQl`5E5z-@Xwmi^_QVA~7PHE@El%z+z+J%_^1QRA=h9}1|V+<{wM0HkSqQ{nDX1HYf zkbSTSBRL!O!@&37T5YtBkKg?M_inzu`kP08+T4D*v3|Evzuc%V*J`uBe)L!pM5Dpt z#p>eX(#4Cf^*YCcK@W+0zRx9}*WbN+=b7n0pMo+|LQI1(H#5AV9JB~v=CF>rnlP9w_Nq786SkB-t1O9Puu?j} z0R)TMr$;y6xmBL6efj0TiviqxyS~2h-n~0-_PVD?tQ(#-8mqg{57utI6$C*P#g6N? z&(6a0Q;;zi0?-8#k`EceQFxMsaDNvRu^%H>KgIgzT96*d{O#p+Zn&s<(< z+_>`rAGVL0C-2_A#^MMOqS0vY#S1|AiN_7uF}aj$(+EdhhV+`^^L zKmVEuxw*BoyR(H}sZuTv`u&5K``zvUNbK(HAUZJ7Pb+%GIPkc?NG#GNh5CotL=#lgQkfeYhCXWm0#pjNURR^Lds#Yq)4t|LV4z#e%!?#_Gb-vKv%_a&0*1k>hc~k{e64>ybbT;Q|Rs z96Ui-E%_ApC{8wy005!`Fj9wkvVuhcbi#0B4p zUT0JSTmk&#%*ebHOecNulqr!ML;mPanv_$# z=H^P%z&g9*`RKZ{^Gn6@h1%=Oj^m=^_rli3`uZRL@O#E%7Dt>#f-~Zbq$rn5ug%xm zXJ=s;S~g!^d@n34oU~eUlHxTnHPNKB#L>eCKmF_9{yugsC-9g9wq9bzL2Xdxq4j(i zl4Xba`C7Z()})d-0?0%i*)BO<1&)b?S#ny2Q>tTFBrps@?nb6sv6$g9N)n6R~f-$7*tw z;lzr~vh>oUsWTM;^j)Beul1UNB@H$90mgxZ^;$w^(r1L~)Vh%jEv;uQ>~=e0NJdA}pgUFzGuTD5@2mBC9t1Qt5U}c|>xdQvCM;(L<$y$#YnHdz|3~+J z_|;cWb!n7kLoi~WCJd|43T75Cumc7>0W|w->A$$RbkJ;O#E9{%CvKEOv}4d-{ko1Lq?A*z zZze5gOit7+V$HK~680yn-Q3vC*FKF5>EE0hFpJW}DHe)j!{pWvZcS`Tx+a4u3z))3 z84t~)rqwb_s!k?yBDl;Ey>#i)+S-~KWMW!U*tdIbG{Y21nE>KMdF-27XJR{FA$F|y z4FIbYYS_3qRe`?IrMaObydw| zUD{ZaneMLYdiP^`%yJri#)@{v;MqYWTleY{hQ95krL!zU7v$~30&dwL>JP+P9nqMs z;3M|QW&_Y_wu<5vkke%wjplS(0BHxwM&hL=?(FRR@%S)n5kqxYvJRI;0Zj@7_btJzwya`2I5?P0ayA75 z{;fBa`-n@%LfpfQKg8uqetYj;1vv@|dJ!VrvbO-5qK1v%=>0vL%5;Jl@;vfO5j!w) zNNRku!ueQU7|E!#ZoJsx`%;Rb5eX6<4EnwE^C`Qpav#LG?{psU=U;zOeGY|B zKKgjjA2^!bTwCCV2|w&zK;(ZP-oCB!?Y-;QZ3X>!CmIRUZFAA?1>&l*7iB;o)5mJ!G*{5Y(xuBvE4NxG4akz&lPn>SJF z45OjuA5$+K*K0jH)9%^qywz+`k{0AXqU-nj>}jLXsKBp-4+ge$L6i~be3<%^uP%gr zpC;B;*Yw85TYvxa+~Ek8VT=J731nhd*mt$vZfDuV##24$E5dT1=axED zcG1QFT)uSa>#x52?)x89x>0i8r$z3_#s`ICLN5ym4R$+L69Q95GZ!gNe%Ts zQ~L z%QYT`+4IV>Ez6Q+%d3p2uU-QzQvKJlH=t;42nBZ>~B9N^Q{3+GAp$R#sNrS1Tq+AyXN^%uQv0<+ranWyj1} zl@|-Z7!gSU$O|Xj3lS8^*WdjkT2oy-h-0`#8l8x$gEp2KrA0{hgmy`wy;7wvW!~jU zprEBESFnpqOL3to|5FRDeg2tP+WPz-pFVx~-9y2-QW=!>1x-@VVPg`_)0wuC^$m-J zFo_0OpwsCnfcVkETy9`=XerAUGyVVokZUA@9}D?Y@_!f!C}XDV+S=OR{XY1`N;0-N z;{#yFZDA*YxCk-~Yyu6T%FfKpWO;tdJWa2ZR0CSA*7^B+=PO=%J8)qF65?zno~b0xs=izXDY#T7 zaK)o?!k-*luh&c0A|`8~w-Pgcf^_NrXvx#g5{9ok&vW-t0BXw0S6}ZR9FW^HH{wb9 zs|#wvl9KEXUza;c=001_OsX;yf z? zY{`deYo1)$<>h6SAMuI+#9r9K{KC%84x}A1ma9hh?(XU;0T=+b8Jmy-Ns_psFxma( z=VpMBNlAaow=PV_CnrtX^Xu-es^Z88T_9_~e3_SDO>DQ@`$h3#G~%p5UT+4t-@bQz zbUb`F#2(Lnm&}zFBzOEUG!MlEaW^1ck{~i|?V*ptKwe_bijx+%Ndij!Zs4r^Ft%U{N zTzZJIKNwGO694x6Ie;**DW%nK?f`hSz6RijuJ}@aBF)d=1S;R2=!Q&_F{n#X0zO(_ jKRX+~c+m@ADfs^Y$Hw#=g*enl00000NkvXXu0mjfo$}`+ literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/26.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/26.png new file mode 100644 index 0000000000000000000000000000000000000000..00e4b117486ced9666d90183276db743152456bc GIT binary patch literal 20325 zcmV*7Kytr{P)`ZrccXiEj zMelY&xjvzEo^8nUsNCH432>3u>Q34qENf0!` z$bm4UpZIb_UePBh#<(T9ND*wBaIG3jwtH94DiB@lwbBdU`3xs7$P1< z60qu&zX$*nR1je`$TJsRIj#y+O+L0ki{dYk zOq)Uf*1^HSx369WYmpHEPkA#C^b-S&UHQxDDnk%#rXcZxi}IaRn5St}6PE8Uqf3!> z{`z=T6||}OGmgPF){%m9q6w!cUQc<9+S}VZd3RFTwuN$%g~g_yx4h3bKYkOhJKaau zHIg7X@V6g-baHy~i{0Ieiwj={@K#CBMrKCR*wc=?kc0#!VcFymnns-~{+4MC`e*|{ za25JJ7Lx$o+q`#kb5p6w0CE_%XN?6yLM;VFLN69405&%6ESJlmV-n=S!NGh!@78mc zELuqDteDuGY6EOiEO+M2^&IS{cRvX@zc}w`v@QA4drEUExEF9oW$2=lmZj?I&HPjJ zy8x`9_!UR4lfVA`Z~uAy`ewO|B{G0C4r@Dia^&fG#6s)LmjZz0I7W(RL+A5(dyr8Bb47 zr{GQ+@kGK3AfCT?addPP*NslCPFjvPqwz-im;a73;PT8-zIXTD&CN}vXKCmD&ehd5 zYSft1p|*_@+g7KNy&o!R(W76gd=i<~>n_a!!`azcfNo8`3LrS!+k&vQxwSZ1L=!C* zcR)9rGW7VieQc6_o|3m@QY%1f*9~*4l~ryQb(B<5Ko(J~Gu^#=_x$`kTP~$s6TLo} zn&I4q%EJJ*ceWR&iwT9Yg|CP@pQpBp7+cOe(2IfsA(=*LOpA9Xv6(b-AP1uv2g3O2 zXP?HMHRE6|NN5&u&P#4=Y{YtPc_MqBi9-EWE+B4LxZDYIi&T$Tl0&UuG&SVedU0`) zfzBcVStpSoX0w^{ZkVOqy$G7vfY^EO{w|Cv=^?gu4DgE*$|H(KOSuGonRsE@4x%Lz8c&e!q?XiK&)^J3g|Dtdp8TR-04-XH0%xryjy}XX3YS^{km(@~f zt$F{0_m7T_khSvu@AeO0ecMqqFbrEWw8t%O{c-*yqOY(U6y4ltjr3%#fvRHiBQvY~ z)6#wKL#-j=$*(_LoSwn}B8@2{mz8Cw1?c;j`YDawZu!}>XUE6KMTV)B-N*?6fJjOg zmlyul_RjXz)fF=M;aBAr!uN@le!|ATeDU&|e|-~WBSD%U&s*rj==EQ2PHu&V?OBsd zYWs8FSW4bCUmSsaoqf)i)`YZiJ|-+(!MhIWoEa#quO!Q%OZk&+7M;a%HD@J+-G&)X z=2?Sg@8S-Gk{H$~Ah*1gE$EO@W9^Esp@Jc{j<>ubGN<>^ZbKbts;*?AAlqE%dPeCY z4nei4;kRl4X=vIqqpO>7%`gx{Hmr3%b$wpa?(XiItraaW(7MkR4t?GR)q-d&k4kni zG8p`0_|R?KYMQcV!dhhg;3Opd4*&rF|C1u&ivR!#97#k$RCHQdZyd)FuIgiE_TcW4 zT9LX8@K8jFf}~hS1ly2d#6jQyf`I&hAVB_8@{*qsBQTKU*|38kN}_8;OC&9c;;AKf zmwU}jS04JDkv!nTa(AY?=Bux(zN&5(fEz#tP;^ERkqrgOyIl)&W$i`tz2S?C?;*_* z7nc^7SC+NV@{$<=b-UkH!glIvwW?(SA|msKxh4d-{yq^9+`D&A3p`M?x3in2sqL?* zEX_jnoq`Jg^(=F#l_P4GYdbj$)kfh8TOh`p=mfr&b|w!Kp*&sv&?s&R1%vA6!(K`d zlYB1)0SLbO%~#+2^&1LAdb!!+7C2hhhBI39y}HnEWfP3+6Bu>iI_JT@inq`vQ1kwd z-2{kOt=ERbVd1whQGu^WF8=J|ix)3!&1MwQ2eb(laPugI_t=ZGm;<@}7DxQxHOQ9o z;hG4cx9HoBBLLuw^&hm|HfVvN6%Y8Ob*B}hX6P`;>eh%CzUaX8@1q+^np0uhxs>i~ z*L3ab+QGpA1O}v8W@bn9>BI(JWVR||c;n-rZ*Fb{ba8Q!KmkEUPT>Mw>qwVz`&&Pzx^v$7pb=k2LO9<1^-00Fh~^ zxtkrhDu{|<#v=Dbf6fHP0R4kD*}w-zc5s*U2EwIF zm)6(UHSVX{r;d+%7tVh)8V#A?Q50{#eO;|qd&kEHSqHb{VyX6Y+vZ_{Ev+_Zl}$EQ z97E|6e)H2S4f87c`$2yYylp^u<5-)Nz%s?yKp3u?@FQcTMdnf!IA;&mtX$syKldpY1A8yrPB-Zl8Z*8x%K0#e?9zu zXKxpf4C}*?7$WOv8lRjgiKJv=;o zFPB&vGfnpg)+5Cs~#WDVCR( zKDqnJ(cozR;Gp166K;!*69fY4JnP)Kb7%YY8xOaIrBLfR(iG#bZaXux85?vf4f48P z&^=*gYi2(K0MWw20x%R(f~(r??`vyUbhy;!w`NyiAX7xBuRayKAB9@X*wQ{lO&1b zxYz5&GD6@OR=K);Tj)Tb!B+tg{PVl-Ems_C>8G-8>EgU9ZN^6ovZ!%-7{F6M?DC15&#>#U5sH@8Hs%-=0K!T+S3zzFI~?D&`4Pz&JB>QmWVM z3C4vKqv1$4B@vNQNs=U$N|xnGk}%FE<1u6wWv8!fsXBn`jy7p>#IMD8-d*7(SPyn#~cDpd6#*!fuf^mN3>a{O^`RjMx{?YNMJ-;~D zzEG{Vf-zV+K`eYVkT$1(MWRzOT3x_|%v*MIriy{5mx2NKM(tbhyw%J~`)UB7YTKmUHHe`vL4V<~sG zciiSixvVH&h*76-qW^aEyJUIZ!cXsx2l?%p!N6luER2%7ZI=`?Cl%77ju)p_unhuUOU+o>d91gpK z!Qpt^SCnxsbg3IfQKQjNDxW(w*Jw6@AWq^qiYk@L*>h*-=H?C$5C8b*KWWwAb}o(K zC2{F;Ku`?(5E^`W_wL>2&pX|B-Ow@r2LJ&7{|CT+F8}}yMM*?KRD4@Wa2r>8{@>Ew zXf#0VB)|nAB$5(IQKaM%t%Z`TcOAblpn9O8x z%9Hq#RLV(8wpCNfXhya)k}YeY7Ly=IO56Z~0I~P>-pc`71El8_iq&W|8tm`;-~ayq z`~TNi15jprr%8(dUDpK{mSrN*_Wh1Dx1CuzeVlWlN3CcVqf91aTGqFs-xb?5YrpY$ z^7QFT9?!^;BQGDHe5J21SSVC7nRQjI+E&e_m>8R-;$AMBBLow|eLg9j%2aC=qh85n zx3k;NU6P0d-QT_V@|*9x6%HTK)TFmBEJ>;W5L{TMju3FpT`mO^f)SP^830Vn z;C&CCY*PXUrc3kRMeWJdk)1KP6iOWA za2e)49o=&h+$aQ`4_MTfV+md=`s_cD8pPJY1~T%7(o?eKHXU`oiI`&CGB(tZA;9lgHkA z^UBD`;L6J8i}kgk!H}%ra5#AG?1{mcIyXCM=+-~{)5rgJrvtmSeBJer#mFIqJyzYr3x5fg8O5` z{R0zY;}=HabEaKMul>4IDk?IHj}C8dWpcSa(=@pa*=(s&*~?}#3l|nHUAz>J$K&zD z{(fO_Ffx1cc)48v`s=5gTe(cOl3sm5sT2tGz5C9k_y73qukJmIMqMlERBpdqG4x}T zCkgkv-F{|S_1eB|+ZZEBl3c3G+vio?Zqu}E#y-7%jSKG77LSe{&FAyI&(Z^ZkF~X) z_Yl-tgCMz85o^r@A%tx+00;#`g+if;{y_)lB%uAPEe;%nb*aaVDN?Cc5ki;{uP-tX zojN*p-mI^=TWMn;-x8?X?%XySv4!Z=4JG;g!pC zHQh20CBh#J#3-ePQK1w8fadW4!oY=X+jT=uqv2MC5$nu*DXpBV*o&jBuf$nEDsKb z=Vp_aFP$D9iATbLdR-Hzt@4nc~9iJFoN@dQRNuHiRvAG6>V8)E% zehw2%B${4d-QH<6B|3I6IIORLc%^LRCth;qSb)b(9d6||)re>!z*-Y~i2X;NO zL&vmRp=noE>=c4J3o>+QYZu}%MwARhM~S3hO!L_s0&E#N15+=VHs{Il=;p=-Ac)1H zcfNS6x;=VzpD{}?TObtxAu7p~NBTp7fUmzl=<|DrheKz+Gi6w$R;||SwQx8%J{Da# zKNX1tB#F3H`PlKJH*PNKHun2GJDI)T-d$RJvf*}nPM?at{rcoqMk(%Bb-g4jcx_{C zV`IIg_Bhc;4k%i12mpY_E-=*UALxYU-Jo}!cMOuv?>ciR)$O(|t2;vPIqrD;w)dZ! zYP1@3lY|gLKq(Q98GsOSsa{MKgb)%0A!6Hgz+9EQl}b4faS@Cev!|zLTrRa-t|Q=; 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 IM6N<$g3$#qod5s; literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/27.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/27.png new file mode 100644 index 0000000000000000000000000000000000000000..f620162077a5b8fb4fe5e8ddb8f578078f9628c4 GIT binary patch literal 19454 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/28.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/28.png new file mode 100644 index 0000000000000000000000000000000000000000..75d8c8678cb7dcebf6360f6824cb55da85189108 GIT binary patch literal 16661 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 literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/29.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/29.png new file mode 100644 index 0000000000000000000000000000000000000000..5586111c5dedb25e323aff221944c241b4cdb3b4 GIT binary patch literal 15468 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 i9=^Z2`tIcd0D!-2anJ1QPucjQk{R& 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 IM6N<$f~5#Ob^rhX literal 0 HcmV?d00001 diff --git a/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/31.png b/legacyworlds-web/legacyworlds-web-main/WebContent/img/pp/l/31.png new file mode 100644 index 0000000000000000000000000000000000000000..9e15ac7b78d95a6015f1eb78380fbb7157cd96e4 GIT binary patch literal 18207 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