MariaDB Connector and Sonar Scans; clean nl 89/15189/1
authorChristopher Lott (cl778h) <clott@research.att.com>
Mon, 25 Sep 2017 20:07:54 +0000 (16:07 -0400)
committerChristopher Lott (cl778h) <clott@research.att.com>
Mon, 25 Sep 2017 20:09:15 +0000 (16:09 -0400)
PORTAL-50: Fix to get the Sonar coverage for ONAP
PORTAL-72: Sonar scan - resolving severity Blocker issues
PORTAL-86: Remove internal att.com usages from tests and other files
PORTAL-102: Fixed the page refresh issue on App Account Management page
PORTAL-103: Fix to enhanced notification ticket source for ONAP
PORTAL-104: Replaced mysql DB connector with mariaDB

Issue: PORTAL-50 PORTAL-72 PORTAL-86 PORTAL-102 PORTAL-103 PORTAL-104
Change-Id: Iae78ad34ed9ce5ae1f2d36fcbb93fbc1e39944e5
Signed-off-by: Christopher Lott (cl778h) <clott@research.att.com>
353 files changed:
.gitattributes [new file with mode: 0644]
deliveries/Apps_Users_OnBoarding_Script.sql
deliveries/README.md
deliveries/properties_rackspace/ECOMPPORTALAPP/system.properties
ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCatalogItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCategoryFunctionsItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppContactUsItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/SearchResultItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/AppsControllerExternalRequestTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/AuditLogControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/BEPropertyReaderControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/BasicAuthAccountControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/DashboardControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/EPFusionBaseControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/ExternalAccessRolesControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/FunctionalMenuControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/MicroserviceControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/RoleManageControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/RolesApprovalSystemControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SchedulerControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SessionCommunicationControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserRolesControllerTest.java
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/WidgetsCatalogController.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserApplicationsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AppContactUsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/CentralRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointAccountTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppCatalogRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesRequestDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsManualSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserNotificationTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPWidgetsManualSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalRoleDetailsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemAccessTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemRoleApprovalTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/FunctionalMenuItemWithAppIDTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/GetAccessResultIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceDataTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceParameterTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserAppSelectionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserWidgetSelectionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ResultTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/SharedContextTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/UserIdRoleIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogParameterTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetParameterResultTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/AppContactUsServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/DashboardSearchServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceCentralizedImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ExternalAccessRolesServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/FunctionalMenuMockServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/GetAccessServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/LicenseableClassImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ManifestServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/PersUserAppServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java [new file with mode: 0644]
ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/test/exceptions/NoHealthyServiceExceptionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/pom.xml
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/controller/EPFusionBaseController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/ExternalAccessRolesController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/FunctionalMenuController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/PolicyController.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/SchedulerController.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/TicketEventController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/UserRolesController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/WebAnalyticsExtAppController.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/EPApp.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/EPRole.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesRequest.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesRequestDetail.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/MicroserviceParameter.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/PersUserAppSelection.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/domain/PersUserWidgetSelection.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/RestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerProperties.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerResponseWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInt.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterface.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceFactory.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceIfc.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerUtil.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpBasicClient.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpsBasicClient.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyProperties.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyResponseWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInt.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterface.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceFactory.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceIfc.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyUtil.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/RestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/rest/RequestDetails.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/properties/VidProperties.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/GetTimeSlotsRestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostCreateNewVnfRestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostSubmitVnfChangeRestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/RestObject.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/util/CustomJacksonJaxBJsonProvider.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/GetTimeSlotsWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostCreateNewVnfWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostSubmitVnfChangeTimeSlotsWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/SchedulerResponseWrapper.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/AdminRolesServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/EPRoleServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/ExternalAccessRolesService.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/ExternalAccessRolesServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/FunctionalMenuServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/PortalAdminServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/TicketEventService.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/Analytics.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/CentralApp.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/CentralRole.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/CentralUser.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/CommonWidget.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserRoles.java [new file with mode: 0644]
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPerms.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetail.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescription.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/RemoteRole.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitle.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/ueb/EPUebHelper.java
ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/service/sessionmgt/SessionCommunication.java
ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppCatalogControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppContactUsControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AuditLogControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BEPropertyReaderControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BasicAuthAccountControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/CommonWidgetControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ConsulClientControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardSearchResultControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/EPFusionBaseControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAccessRolesControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAppsRestfulControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/FunctionalMenuControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/GetAccessControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ManifestControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceProxyControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RoleManageControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RolesApprovalSystemControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/SessionCommunicationControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/TicketEventControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserNotificationControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserRolesControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WebAnalyticsExtAppControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogMarkupControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/MockEPUser.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/PopulateSampleTestData.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RemoveSampleTestData.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RestURLsTestSuite.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserApplicationsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AppContactUsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/CentralRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointAccountTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppCatalogRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesRequestDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsManualSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserNotificationTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPWidgetsManualSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalRoleDetailsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemAccessTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemRoleApprovalTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/FunctionalMenuItemWithAppIDTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/GetAccessResultIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceDataTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceParameterTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserAppSelectionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserWidgetSelectionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ResultTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/SharedContextTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/UserIdRoleIdTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogParameterTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetParameterResultTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/exceptions/NoHealthyServiceExceptionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/ApplicationCommonContextTestSuite.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/FusionLicenseManagerImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/LicenseableClassImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCatalogItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCategoryFunctionsItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppContactUsItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/SearchResultItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/AppContactUsServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/DashboardSearchServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceCentralizedImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ExternalAccessRolesServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuMockServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/GetAccessServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/LicenseableClassImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ManifestServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/PersUserAppServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java [new file with mode: 0644]
ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java [new file with mode: 0644]
ecomp-portal-BE-os/README.md
ecomp-portal-BE-os/pom.xml
ecomp-portal-BE-os/src/main/java/org/openecomp/portalapp/controller/ONAPWelcomeController.java
ecomp-portal-BE-os/src/main/java/org/openecomp/portalapp/portal/service/SearchServiceImpl.java
ecomp-portal-BE-os/src/main/java/org/openecomp/portalapp/portal/service/TicketEventServiceImpl.java [new file with mode: 0644]
ecomp-portal-BE-os/src/main/webapp/WEB-INF/conf/system.properties
ecomp-portal-BE-os/src/main/webapp/WEB-INF/jsp/welcome.jsp [deleted file]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/OpenIdConnectLoginStrategyTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SessionTimeoutInterceptorTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SimpleLoginStrategyTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestOSTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsOSControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ECOMPLogoutControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/LoginControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPLoginControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPWelcomeControllerTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerOSTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockEPUser.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockTestSuite.java [deleted file]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/RemoteWebServiceCallServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/SearchServiceImplTest.java [new file with mode: 0644]
ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/UserServiceImplTest.java [new file with mode: 0644]
ecomp-portal-DB-common/EcompPortalDDLMySql_1710_Common.sql
ecomp-portal-FE-common/client/app/directives/search-users/search-users.controller.spec.js
ecomp-portal-FE-common/client/app/services/notification/notification.service.js
ecomp-portal-FE-common/client/app/views/dashboard/dashboard-widget.controller.js
ecomp-portal-FE-common/client/app/views/functionalMenu/functionalMenu-dialog/menu-details.controller.js
ecomp-portal-FE-common/client/app/views/header/header.less
ecomp-portal-FE-common/client/app/views/microservice-onboarding/microservice-add-details/microservice-add-details.js
ecomp-portal-FE-common/client/app/views/user-notifications-admin/user.notifications.modal.controller.js
ecomp-portal-FE-common/client/app/views/user-notifications-admin/user.notifications.modal.page.html
ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/new-user.controller.js
ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js
ecomp-portal-FE-os/client/src/services/recommendation/recommendation.service.js
ecomp-portal-FE-os/client/src/views/applications/application-details-dialog/application-details.controller.js
ecomp-portal-FE-os/client/src/views/search/search.tpl.html
ecomp-portal-FE-os/pom.xml
ecomp-portal-widget-ms/common-widgets/events-widget/js/controller.js
ecomp-portal-widget-ms/common-widgets/news-widget/js/controller.js
ecomp-portal-widget-ms/common-widgets/pom.xml
ecomp-portal-widget-ms/common-widgets/resources-widget/js/controller.js
ecomp-portal-widget-ms/pom.xml
ecomp-portal-widget-ms/widget-ms/pom.xml
ecomp-portal-widget-ms/widget-ms/src/main/resources/framework-template.js
pom.xml

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..38b6a85
--- /dev/null
@@ -0,0 +1,21 @@
+# https://help.github.com/articles/dealing-with-line-endings/
+
+# Set the default behavior, in case people don't have core.autocrlf set.
+*        text=auto
+
+# Explicitly declare text files you want to always be normalized
+# and converted to native line endings on checkout.
+*.css    text
+*.htm    text diff=html
+*.html   text diff=html
+*.java   text diff=java
+*.js     text
+*.jsp    text
+*.less   text
+*.properties text
+*.sql    text
+*.xml    text
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
index 2d1adfb..5c358ca 100644 (file)
@@ -1,16 +1,17 @@
 USE portal;
 -- insert apps id 2 to 7
 USE portal;
 -- insert apps id 2 to 7
-
 SET FOREIGN_KEY_CHECKS=1; 
 SET FOREIGN_KEY_CHECKS=1; 
-  
+    
 
 
-INSERT INTO `fn_app` (`app_id`, `app_name`, `app_image_url`, `app_description`, `app_notes`, `app_url`, `app_alternate_url`, `app_rest_endpoint`, `ml_app_name`, `ml_app_admin_id`, `mots_id`, `app_password`, `open`, `enabled`, `thumbnail`, `app_username`, `ueb_key`, `ueb_secret`, `ueb_topic_name`, `app_type`) VALUES 
-(2, 'xDemo App', 'images/cache/portal-222865671_37476.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/welcome.htm', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(3, 'DMaaP Bus Ctrl', 'images/cache/portal944583064_80711.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(4, 'SDC', 'images/cache/portal956868231_53879.png', NULL, NULL, 'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal', NULL, 'http://sdc.api.simpledemo.openecomp.org:8080/api/v2', '', '', NULL, '78ot0W94rpB0o4FYzVoIOg==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1), 
-(5, 'Policy', 'images/cache/portal1470452815_67021.png', NULL, NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor', NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(6, 'Virtual Infrastructure Deployment', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/welcome.htm', NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', '2Re7Pvdkgw5aeAUD', 'S31PrbOzGgL4hg4owgtx47Da', 'ECOMP-PORTAL-OUTBOX-90', 1),
-(7, 'A&AI UI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://aai.api.simpledemo.openecomp.org:9517/services/aai/webapp/index.html#/viewInspect', NULL, 'http://aai.api.simpledemo.openecomp.org:9517/api/v2', '', '', NULL, 't1oqm6wCXrGUXUSL8mS7pQ==', 'N', 'Y', NULL, 'aaiui', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1);
+INSERT INTO `fn_app` (`app_id`, `app_name`, `app_image_url`, `app_description`, `app_notes`, `app_url`, `app_alternate_url`, `app_rest_endpoint`, `ml_app_name`, `ml_app_admin_id`, `mots_id`, `app_password`, `open`, `enabled`, `thumbnail`, `app_username`, `ueb_key`, `ueb_secret`, `ueb_topic_name`, `app_type`,`auth_central`,`auth_namespace`) VALUES 
+(2, 'xDemo App', 'images/cache/portal-222865671_37476.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/welcome.htm', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(3, 'DMaaP Bus Ctrl', 'images/cache/portal944583064_80711.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(4, 'SDC', 'images/cache/portal956868231_53879.png', NULL, NULL, 'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal', NULL, 'http://sdc.api.simpledemo.openecomp.org:8080/api/v2', '', '', NULL, '78ot0W94rpB0o4FYzVoIOg==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL), 
+(5, 'Policy', 'images/cache/portal1470452815_67021.png', NULL, NULL, 'http://policy.api.simpledemo.openecomp.org:8443/onap/policy', NULL, 'http://policy.api.simpledemo.openecomp.org:8443/onap/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(6, 'Virtual Infrastructure Deployment', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/welcome.htm', NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', '2Re7Pvdkgw5aeAUD', 'S31PrbOzGgL4hg4owgtx47Da', 'ECOMP-PORTAL-OUTBOX-90', 1,'N',NULL),
+(7, 'A&AI UI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://aai.api.simpledemo.openecomp.org:9517/services/aai/webapp/index.html#/viewInspect', NULL, 'http://aai.api.simpledemo.openecomp.org:9517/api/v2', '', '', NULL, 't1oqm6wCXrGUXUSL8mS7pQ==', 'N', 'Y', NULL, 'aaiui', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(8, 'CLI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8080/', NULL, NULL, '', '', NULL, '', 'Y', 'Y', NULL, '', '', '', '', 2,'N',NULL);
 
 -- insert ASDC users user id2-8
 
 
 -- insert ASDC users user id2-8
 
@@ -103,32 +104,32 @@ INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (12,
 
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%SDC%" and enabled = "Y"),
 
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%SDC%" and enabled = "Y"),
-       "SDC Team","sdc@lists.openecomp.org","",NULL,
+       "SDC Team","sdc@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
        "Service Design and Creation (SDC).");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Policy%"),
        "Service Design and Creation (SDC).");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Policy%"),
-       "Policy Team","policy@lists.openecomp.org","",NULL, 
+       "Policy Team","policy@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL, 
        "Policy.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%DMaaP Bus%"),
        "Policy.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%DMaaP Bus%"),
-       "DBC Team","portal@lists.openecomp.org","",NULL,
+       "DBC Team","portal@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
        "DBC.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Virtual Infrastructure%"),
        "DBC.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Virtual Infrastructure%"),
-       "Portal Team","portal@lists.openecomp.org","",NULL,
+       "VID Team","vid@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
        "Virtual Infrastructure Design.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Demo%"),
        "Virtual Infrastructure Design.");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%Demo%"),
-       "Portal Team","portal@lists.openecomp.org","",NULL,
-       "Demo Application");
-INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
-       (select min(app_id) from fn_app where app_name like "%VID%"),
-       "Portal Team","portal@lists.openecomp.org","",NULL,
-       "VID Application");
+       "Portal SDK Team","portal@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "xDemo Application");
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%AI UI%"),
 INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
        (select min(app_id) from fn_app where app_name like "%AI UI%"),
-       "Portal Team","portal@lists.openecomp.org","",NULL,
+       "AAI UI Team","aaiui@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
        "AAI UI Application");
        "AAI UI Application");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%CLI%"),
+       "CLI Team","portal@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "CLI Application");     
 -- end new 1610.2
 
 --
 -- end new 1610.2
 
 --
@@ -151,10 +152,10 @@ INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (16,6,'Testing',1,'','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (17,7,'Simulation',1,'','N',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (18,8,'Certification',1,'','N',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (16,6,'Testing',1,'','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (17,7,'Simulation',1,'','N',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (18,8,'Certification',1,'','N',NULL);
-INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (19,9,'Policy Creation/Management',1,'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (19,9,'Policy Creation/Management',1,'http://policy.api.simpledemo.openecomp.org:8443/onap/policy','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (20,10,'Catalog Browser',1,'','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (20,10,'Catalog Browser',1,'','Y',NULL);
-INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (24,5,'Create/Manage Policy',12,'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor','Y',NULL);
-INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (56,1,'Policy Engineering',8,'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (24,5,'Create/Manage Policy',12,'http://policy.api.simpledemo.openecomp.org:8443/onap/policy','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (56,1,'Policy Engineering',8,'http://policy.api.simpledemo.openecomp.org:8443/onap/policy','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (115,1,'Test/Approve a Resource or Service',16,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/dashboard','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (130,1,'Favorites',175,'','y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (139,2,'Approve a Service for distribution',12,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/dashboard','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (115,1,'Test/Approve a Resource or Service',16,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/dashboard','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (130,1,'Favorites',175,'','y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (139,2,'Approve a Service for distribution',12,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/dashboard','Y',NULL);
@@ -171,7 +172,7 @@ INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (313,3,'View a Resource/Service/Product',20,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/catalog','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (317,1,'Message Bus Management',6,'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (318,1,'Infrastructure Provisioning',3,'','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (313,3,'View a Resource/Service/Product',20,'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal#/catalog','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (317,1,'Message Bus Management',6,'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap','Y',NULL);
 INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (318,1,'Infrastructure Provisioning',3,'','Y',NULL);
-INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (319,1,'Infrastructure VNF Provisioning',318,'http://vid.api.simpledemo.openecomp.org:8080/vid/vidhome.htm','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (319,1,'Infrastructure VNF Provisioning',318,'http://vid.api.simpledemo.openecomp.org:8080/vid/welcome.htm','Y',NULL);
 --
 -- Data for table fn_menu_functional_ancestors
 --
 --
 -- Data for table fn_menu_functional_ancestors
 --
@@ -355,7 +356,7 @@ INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`e
 INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (13,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Portal','ONAP Wiki for Portal',NULL,NULL,3);
 INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (14,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Development+Guides','ONAP User Guide',NULL,NULL,4);
 
 INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (13,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Portal','ONAP Wiki for Portal',NULL,NULL,3);
 INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (14,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Development+Guides','ONAP User Guide',NULL,NULL,4);
 
-
 -- app thumbinals
 
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D099C5D6579FFBF67B9EBEC5B6626B364DFC91E12080142D87710595C0A5A37B455FBD75AB56A6D6BD55A6D6D6D6B6BAB15045111C50504917D95B0869090909DEC997DEE7AF6FFE77DCFBD333721C0850C3093BCE7C3903B73DF7BEE39BF73CEEF3CE7F7FE9EE7D1508B424021A01050088C4A04B451B9556AA314020A018580420045D0EA24500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0F5A6EC40C1A010500828041402A30F0145D0A3EF98A82D520828041402120145D0EA44500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A5088C28416B1A68E27F6A510828041402C718024110100423BBD3234AD0B1884E32668CEC16AAB5290414020A81318080E5F8642D6F44B75411F488C2A956A61050081CAB0828823E568FBCDA6F85804260D423A0087AD41F22B5810A81A31701A1B18A45CD331DFE182B823E7ACF7DB5670A81518DC08E1D83DC7BEF4EB98DAB5675306142F5A8DEDEB763E31441BF1DA8ABEF54081CE308B8AECBAF7EF5221FFAF0831289EBAF3B830B2E988CAEEBC7383207EFBE2268753A280414026F3902B66D73D34D6B79FF9F3E2CBFFB673F3D8BCB2E9B8E6128C756E9C15004FD969F9AEA0B15020A817C3ECF0D373ECB873FFCB804E327379D21093A128928704A105004AD4E07858042E02D472097CBF1A31B9EE1DA6B9F90DF7DD34DA7F3CECB6628823EE44828827ECB4F4DF5850A01858024E81F3DC3B51F5504FD6A6783226875AD280414026F39028AA0CB835C11747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB0353117479388DECA8C027E8DB4490EB26705290EB016B407E879FD9034E06341D2D568B166F18FEEEAA7630A2F26F5A450B5A55C7C86E975A9B42E02D4240117479402B822E0FA7231BE5D9787B1F23E8D900D97DF87D9B09522F110822F62D70B2E0E6E57704760A7C1BD0C04CA09989E1EF8ED5806EA0991510AD444B8C43AB6845AB9B8ADEB400BDE93888541DD9B6AA4F2B04DE020414419707B222E8F2702A6B54E064F1773D10FEEC790CDC4C48BA411046C86E163C9BC0CD41E095B5CE571DA4E961442D483C528516A900CD90DC8E66A25577A2371F8F31E522B4FA1947FE7D6A0D0A81114240117479402A822E0FA7571D153869FCDD0FE33CF8391919E33BE0BB829A4760ED47B00A41E0BA8956D18631F14C8C1957A2B79E1092B85A14026F23028AA0CB035F11747938958C0A0A32842789D87BF116DCD55F23103AF2DB4DC8AFB92F1A5A653BD1737F84563F538ED68CA8945284E67D444BE01FF93A8E6803D487C712028AA0CB3B5A8AA0CBC349926F90EF87D40EECDF7F00BF677DE1936F73945CF6F6970E141A48B8E813CE20B2E43352C7D6E28D523279DD8BEFE1F73C8F5E33456AE36A5108BC16028AA05F0BA1F07D45D065E024A2E3A0E779BCADB7E36DFC0941B6AB8C4F8D9D21C22DA2B79F823EE97CCC199783997C5D1BEFEF7F1AE7912F1039E9ABE8CD0BC3094EB528045E050145D0E59D1E8AA05F15A780207B006FFD0DB8CFFF1FC1E08E9199DC2BEFD8BCF5A38C3891657F8DDEB112BD711E98F1D7DE063787F3E89771D7FC37D10B6FC6987096923A5E1BB5637E8422E8F24E0145D087C3C9B371D77E9F6060AB24687FCF2304E9DDE5213AD6471931F4A6F9D2B6A7554FC098740E5AFDAC9793AE67E1EF79146FCB6FF05EBA97A06F23D1F36EC2987AF13137095914B90E7A6E38EC1FC7FAC93172DBAF08BA3C2C15411F062777C34F711FF834415E4CFC1DAB8B06D12AF471F331A65F8131ED32B4787D0846E0E16DBF0BF7B12FE377AF1B7AAA889EF13D8C59EF91CE91A37E11D6C921460E5F084E1E7E558A80927C0E3D1F144197778528822EC129187C09F7C97FC2DB7A1B41665F79081EEDA3444663BC1EF3946F624EBB2C9C44B453E46F5A4630B84D98BC8710889EFE5F18B3FFE4D8216841C99A349D176E5CE2F7024D07E26FC5F78FF693E4F5EF9F22E8F23053045DC0C9DBF63B9C873E2F650DE96356CBC108442A3067BE1BF384BF913730E79E8FBDCC561859F135CC851F073D72D4A327EE4B828A050F0B2A9626456935D408D0C2FB56E13D153FBFFC7450045DDE25726C13B4A88931B00DE7F1AFE26DFA257861BAB55A5E0D8122DDBCDC5E689EF02569D97B4356BD510CBACC042D2C322E16241C804B40CE87BC1BE0BA015EE0636A1A31D3A0361206D732BE9651B65A4A1150045DDEF970EC12B4A88FB1EB01DCC7BF8EBFF7D1F2D052A35E150173E127899CF4F760C4DE52A402E151470BC970580816A5A70AF2C3213715C9B705F61CDA521112879244715D22440ED71D126DA005E41CC8783EBD399FFD298BFDFD167927C0F1021CDF470B7C6246C0B82A9386AA38CDD5719A92260953470FD732AC5617C3EFB714ADD1F1658AA0CB3B0EC72C41FBDD6BB17F7DC9B1E3CE28EF7C38A251C6DC0F113DE59BE5D9F38EE89B0EF970416E10EC2CA25D3D64D39249BB428EA7E064190D0B223E38DD5D727620A859BC1B927DB804782252767C7AF32E2F7459F4E61CB2B64822D0B0020DBFA0377B22B9544CA0FA2E9A9BC7C4A73AA633BBA592992D55D4554431C4BAB5A1DB49E12B8E3DAD5A11747917C03147D041BE177FF3ADD27DE0AEF96E7928A951652160CC7C37D1D3FF334C1D7FCB96909D8BD41A68BE50802110AAB02E63683B08C87922E2CD3360B9641D485B3EAE0F9E1F485295E42C43E580A20745C7A33611A33259417FCEE140DAA1D7127F15045E903964E0ED83EFE37B3E7E10E0061EBEE71278E25F8FA4EED25A1B637C759C8698C6FC094DE1DCA2F84EF1427EEFB1258328822EEF0239A6085A249AB8CFFC3BEEDAFF05CF2A0F2135AA6C048CC917C83A1FAF3713B1EC2F78D9C030622ECD5C143C27485944B53DB6C78BBD3976A65C76A61D3674E5E8CA7BA41D8D8CE5E00BDD5844BB9E85E179E88120581F538811814F7D4594396DCDB4D7D71574643FBC19F822AAF62531FB5E611B84262D09DAC317A9EFAE8D2F483BF0B17D5FBE879527A9D9BC7FC54C3AC755A10782EAF5B0F6F71B07614C7E5211747987ED982268FBDE3FC37BE12610E53ED532E2081813CF217AFE4D6F3A418773768589BB21D942BCD0480501BB52369BBBD33CD365F14C9747BF15907675D29E81E30798BE4BA59F2111D844F048682E31CDC790D28329A58CEACA1A6674B631AE224E4484D6224A0E021128E307A1941112B420EA50BF766420ED11F81EAEEB84442DA3690FCFF37005613B2E932BE0B485139935BE16B320CF8848FA58226945D0E55D7EC70C418B7A11F61DEF0D6D746A795310D05B9711BBF47720EA528FC47270703CB4462929C8B8599072381198436767D6E5B60D0758D765B32FEDD2E3C5496B7149A49AEF92D0032A758F3AC365BC99A7427388E113D73C0C215CE8069617A1DFAC605C731B159118BA274AC70A32464A1BC2A9218857B2B4F89B27DE13441C482216E42C48DBF15C193D8BD79EE7E2FA01AEA7A189D7F92C13EB34CE5B3A9599CDF568F8324297D1F431B228822EEF401FF5041DA477491B9DBFF9370456FFDB5B4BC38862B42E43EB380D73F6D5A0BF81CA71C5E3EAA4F15EBA077FDF9304FB1EC7EFDFF2B6FBB7F5A6B9C42EBF0F22475ED16EC83921E977386F5A44AB9A9888D34DB27EC0833B06F9ED867EF63B06B66630E847707C0DDFB1A88AF8CCA88FD35913A53E1145CFF4E1A57AF173299C5C56BA2E021101FB1E8316F47911DAA6CEA2A65AB4190B35E6A0206548995946D0A15EED89509A90A0FDC09551B47C2DA2651129FB829885DC11FE1BFEF8F8AE8BE3DA684E8E981E70F6FC0ECE5B1436530865E863238E5604AD085A12B2FBE43FE33EF39DB74773D60D6939D31BE6622EFA24C6A4730B0E8791BE0803BC6D77E2BF7833EE8E3F803D0822F27B8BEB536B15E3895DFD2C5AB4BABCB3EF554785141D52B398F813C4A8E36B06BE1FB07130CBDD9B7B79648FC77EBF02CF088DC7819DA54273195F6932735C2553EBE218BE8D97CB92EEDA4F3E3D8863E5C9E52D5CD796137929CB67902A5A672DA4A1A989C0B6C3893FA95C08520E658CE26BB945051216842D74EC21822E21E4E218296F8888DA15DAB48B23E63F1C3171E971D2F446DE7FCA5C12868E9CE01CAACB3DD2E7C8081C92115C8522E8F2C03C7A2368CF92C927F6FDFF0F44E4FC562C661C2DD1282348D17E4A9F7016C6940BD11B8E7B8B92370A74B66F35CE837F45201BD10690EF0FEB8AC82E2F6FDEA225C711BBE6F91121681929173655389185D52D6B7B64ED803BB70FF0D8CE4176E60D5C2389661818BA89A1F94CACF0985897A4A53A4652F3D06C1BD7B2B133830C76EF259F4D63DB16996C56EAC4AEEF918D34D230653EE3C6B586BAB2EFA1090943C4CF7E48CC45722E9275F15F215F841383C311B378EDBAEE10897BAE3B1C5D7B1EB663E10A95C473195F1DE1B2A5535838B995A8A117DC1D85F4F1A398A3154197771D1E9D042D1E81B7FC264CDD1EDC5E1E1247384A448DA2A09031F783E8CD8B0A6B7B3BAFB0822C200867FB9DB8CF5F87DFBD8620B52B9CF07A9396F8B5FB6437F2235D849C204D7281262D725BFA73DCBFB597A7F6E5D81B6B0E73AC038D58E0D2561130B93E416B65942ACD1EF2310BF9C2C967C9A57AC9F60F30D0DF8D95CB60E7F3643359529E4EC6A862CAFC65348FEF905639690191138021297B624250FCBDF8BBD09905714BF942481D05D78688A40F913464042DA26741D04592F67D6C4744D10E81EBE0E472B4D5E87CF0BC1399DDD91A4E488682C7512D7728822EEF0A392A09DA3FF02CF69DD7C812986FF6A245ABD01AE76174ACC498FFD130821E858B683AE0EFBA4F4A21A2E98098F87A33969122683909878FA7C1133BFBB9FDC51E36E5A2E48C04B611C3F05CA2F84CAE3139AE394175C44017A41E88A70431D916E0B90EB9C13E327D7DE407FB1918ECC1CEE4B0F27906B2797AA964DCD4794C993E8398190953B8A52B4310B2F837F4498BDF872368A1390BDD3AD4995D394958785D42C245B22E12B4EB384304EED80EAE277E5C1CDBC2B0D35CBAFC382E5BB180642C8226273EC53EBC9D37F837E3EC185EA722E8F2F03D2A09DAFACDA5F8DBEE280F812319251EAB279D87B9F4F3E80DB3DFF214E737B4E9F620CE93DFC2DF7E17229B7244BA8B976C48FCFD1B651DE9D7B71C5CA85364FB0951C30D74B6F5E6F8C5865E9E1ED071A2893043D0F5A8323CDA6B624CA98FD310054338354A547749AE769E74CF7ED27DBDE4D2830C0EF460A72DAC7C96DDB98044DB2CE62C3A9E8A8A4A49CCC2972CA366797318D6990F92388250AE2812F6101117648DD2285A4E18BAA1E54E46D18508DB16B28BE7E2899E968E8D9549735C5B1D9FB8FC4C263454A369E2E629321D1541BFBEF3E8E81B7DD411B4A8B466DF76E588134FE9A1D79B9760CCBC0AADA205AD6E067AE3DC317566B8EB7E88BBFA1B6107F211963B62EF79E2F5E321095952A2A4249164B2664F3F4FEF49B1C38EB0336F92F185633920E6DBCC1F5F43B5E15117D3881B05122BA64F0F293B3EF9CC207D7B77911DE8259B4E3338D0473E9D23E3B8C4A79F48E794695455540D4D060AC786FCEF9049C1E1DF45C4EC1C44CEAF48D04E48C87282D00DA3E7A22E6DD9B69C2CF43D1BC7B1C85BC2F2E771ED25A772CEE25918BA70AA88041645D063EAC27A1336F6A822E820B513EBB7EF20E85AFB264035BCCAF8D56BD0AA278E8D88F93048E47F309920BDE74DC12876E9EDE89DA7BFBE754B3B9B706978B24646D685AFDFF322FBFC24D9682522B74F44B871CD62725D8C79E31232EB2F8CB443395A96D728D4D090E288EB4A79A36BD776B283BD58990C03FD29329914079C08275F752DF18889CCF716E9DEC5B24842572E44C862278A041C46D182A08563637842B07432B0F85A4C1C7A43045DF041BB6E18450B0DDAB2A4FE2C2418DBB1C9BB0E5A3ECDFBCE5ACA9F9C750211532790553B8EDE45491CE51DDBA387A07D07E7EE8FE26EFCE99BE656D02295444EFBB7B06BC8185DDC47BF8CF3C437DEB4AD8F5DF44BF449E7BDAEF58799819E4CD6C8A273DF867DDCB2C3213013385A4C929A48919ED118A7B3364195970BED76D2922688BA506DAEF0AD527E701D327DDD74EFDC4636DD4F2E9B61A027C5817496C15813175E750DBEE30C45CF82A48B245CF4380F5BE9428D59BC1F46D0E1EF87BA358674E6E2C4E050041D927351E6102E8EC0B1E5F7DBAE70A638C434978F5F761A172F9D8121DC1C52E278854C9DD785EEE81CAC08BABCE3727410B4886CD65D8FFBE8970872DDE5EDF9EB19A519E8F5332439EBE34F1A7B4D51858CE1E5711EFC2C42DE1879BBDD70E9CED885BF40177EEFD27A70C5A240AF8079B1DEB2706EDFFDC25EEED8D045AABE1D373024D655584C6F8CD35E1D23E2B918854A756175A3E145FCE6E9A07B019E6D91EAE9A27BD736B2A901B2B90CFDBD29B6A55C262E5AC9FCB9B343392308B30385AD4ED4D8184A4639C8EB3C4CC842372E7A9E8B12C610593BCE505AB7533A29E83838452747E0625B7902DB9263C5053868392493493E7BCD799C3FBD49EC32BA22E8D773851EB5638F0A829605901EFF1A81D537F2074A74BA3EF59B98733F3846276D02DCA7BE8DFBC43F859994872EA27F60690714DD402BCD70946C2192404AD29045DB2B59AE332448BD6A025AB245BED666BF07BDE37499622252988533A248D6438FEC850247A2BEB2AC4317183CB3B397DFACEF62AFD98863C6F00257AE43A466CF6E4AD092142E8D32EC81528AF064324AAAFB00DDBBB64B592397C9B2617F9696E356B060F102022B47E08B6CC1128F7321392524DC421D8D82BFB9384E44C132922EF89CC3ECC1A29D2ED49A053917DF77E524A1156ACE52F670C8590E9A97C77534F6EFCCB2DFAB22DFDA8EE70DF0FCD72E624A4DAC509D4F24AE1C5C1675E44FF0B7678D2A822E0FF7A380A0039C073E83FBEC7F94B7C7AF6754A40263F285984B3F875E3FF3F57C72F48C75F3B84FFF2BDE965F0F6F53AC6EE8B5B005EA95E387DF8BD74265C7F0FBD14AB48A5634235E1410A076329815720EAB58B728CC5216948CF40ECB1F517FA2F023A95546D282EB75C4DC5E54D788E8A1FDF8862776F374DAC48D26080283C07749EA1E136AA2B45747881D142D9746CEA54A6DB10F958F9DCF91EADA4FF7EEED64B329B2D93CBBEC2A169E722E15C9B8D4808BA45B9A2D38246B14ABD215A48CE29821CD596607869380421F179F731C7B6832B0286738628C63E18BF7A4CCE160E75D02CBA6F7A51EF6AEDF47CEAC21367F01D9C66AFEF2CC4EFEF2AC9924A2A0FB1ABA2C6E7DF42D8AA0CB3BA6639EA0835C9724684F68CF23B908729E7E854CD11EB3E42CF070F304B903F2DFE2A2D54D7B0DA45E9D14427A0CFF2F26E67C7C59252EEB06A41D9F7D595766FC651C9F8CE591737DDCC2849EA60798862EB3E66A22260D0903CBB1B977A7CD3EDB9451B24714337098506DD2561B23AEB98542FBC3B98507EF4089C12E0CCAB1F35952DDFBE9DDBD834C2E454A54D86F5DC09459C785E42CEF188592A142DA2868CCA5045DEA6F2E92B9888E4B53B8858D2E4C5A0909BA48E0C24A17A67887041D5AED7C3C274FC4F278E9B92DECDFB8172DA3E3E9519C8E0ECC8573A8AC36F8CA550BB962712771B123C2CC71144E172A822E8FACC6344107D90378EBAEC35DFBFDD03236528B192772D25731269F1FBA35D4328C80205AADD0F6296BD39B73E9B321E56A64DC80941DD093B125613B5E6892F0440D8D02A9CB24104DD46DD33074D1BF4F7424F118744D9C20228958C365526D84D64484B819BA3B6481FC728F83F86E2B47BAFB00BD7B7791CE66D9D59F63E2E255D4D7D687645CC80E0C35E7E1449450BE10863EF1B790788BA45B2A6DC8D4EE82C75992B41827A40DE1E010E9DCD2EB2CA40F1BCFB6B11D07CD7798D652CBC9D327B167D376BCACCFB34FEDE00F773D8F1B4DE2B58DC35FBA9089ED493E7CEA24DEB9A08371C9E106BC47536F4345D0E59DCC6397A0453AF7F6BB70EEF93382CCC85AC6F496E3895DF95079081E6DA3645FBE304216C9D6C51E7FA5D5E5065C8FD53B07D995121D4620E31B7242CF2F481C82600D024C4DC7D075F442417A41B122CF2F10937C22CAF57DF2521E10A590345C4D481B3ED59ACDA2B64A0C1F7491B42199B91825CB02D00583434995BBE1E70349AE5E3E4BBAA797BEFD7BE94B6779B1DB62E189A7529D88E3A1CB0A766252505AF264BAB6D88ED04A17DAECFC421AF7C13536A47D4E96112D789CA5AE2C3CCD3E8E889285B75910B72DD629A2680BCF72F13219668EAFE53DE7AF64765B3DA669629A70FD0FEEE6CB7FFD1320229BD006679F46B6BD9D96448EBF3B6F16EF3E7E62D815B168F72E3CB78CF5D34E1174794770CC12B494361EF922DEFA1F85CD3E4768D192CDB2E8BC746B1C934BB14DAAC0542F31196BB283F54B83393675A559DF07592D2A2701A503423C8D8B76513AD4C4848461C81FD1E5DA1C9A272C8823225B0F64946DB9E2C7A7CFF2C8D86194D95E5B495B8588B143CD5A9775374A3BC28A770A5AC641253A430D5C4817BE20E8BE3EFABBF6B3BB37C39E7C8C79F317509988CA9B81E88452ACAFE1FBC58247226F6798984B4B850EC91A8290658D8D83AD73E27D1125FB2285DBF5B12C4F5650F4FC1CBAE5B368C2781A2339CE5E71022DCD09224682542AC3BF7CF397FCE8BA87087413D3D7E8EB68A1F2E453B0123E57CDA9E2BB572F2FECAB48E229765E19FBBAB422E8F2C865CC12B4DFF52CD62D6785A535476A31A244CFBD514A1B8736151DA9AF18BDEB292ACBC566AB855ED9F2CF3A5D399B67F7A7D8D827122B4CD2A688443574DF23AA7924220615D11815A6415264F50D3546152E8D029916495570A3E45CAD10750B7FB14ED676A503A2B62A4E2408CBA58AD653A2C6864CF12E74DC96938845538988CE75D188B564C63270F16D8B7C7F2FFDDD5DBCB0378D956C64D6B4A952FB16DB5DACB921562DEA39CB4E2805B943481A6219AEE35C8CB043194390BB4C462990743199C595B246585AD4B184734344E52EDD2F6CE5FCC57338616127B95496D3CF9A876926D8B1753F5FFADC8D3CF2E84B843DBF0306741B6DFE71C416CF63D9D41AAEFF9345D4C6C4934C98C473B4E8D18AA0CB63823149D0819DC2FAD10282CCEEF2F6B28C51A22468F4829FA1D54E2963F4D1386428264597C5E803990CD263793CBB67807503016922328A132363814D753442752C414C4E64899E7E61A0EB16026FBDE08A93997E251284142C869414591B0E3F083DC4B82EBAEF080B88ACC521A5132326234C0C83401335A1CD90D865C966596EAEB0F6403658D1752F8CDAAD0C07F6EE63F5F61E264E9D496763B57487084D1C5F4CF6850F5FC311F470F2496979D183B205EDD04A5724E7A25B43DAEB44753A173C51903F9726D3956560FB368C9E1C99BE34FFF0CD0FD37D600FEF7A9748E4091D1A8F3CBC817FFCEA4FD9F8C25E342D82E7EB58BA8F3F7D0A0D272EE2FCA575FCD5B9F3185F119337BDA3A53E8722E8F238646C12B4D54FFEBF43DFED482DD133FE0B63D67B0FF6048FD4CAC7D47AC20ED50E3A2F0D5A3C2BEA616475F2BA298BC9EB1E183A3455992422427E084B82CAC7EF21A9342C052A5D120769A701811ECA2132AA16516BB16EB2F005CB4ED8521426E71BE8461C5DD8EECC381866988E2D3E26B2088BB2967487143569999018B6B8127BE0FBF41CE865DDCEBD4C9E3C85A6AA78E8B8D07402D1D43510242F9253C2087A285BB0B04DC58494616B5D18410F47D607CB1C395754A60BF7899C4D76C77E1A4C93DE3D7DF4F7F5F1F75FFD30BB766EE4F2779E8B666852833ED095E56B7FF7536EFBCD13327BD04378A05DAC649CE8B2C54C387E027F73E12CCE9AD1425411F498BA92466263C72641A7F720EA498CD862C6899EF793B0E3C9B1BA14345E99D517681CC839FC7E730F075C13DF48485434DF23AE05542522544544342DDC0EF29D30242E4E2DFAA1FE20125104414B322E261BCA529D61EB28D9F95A140EF25C701DA947677D0D2B8044552391681CCD8884845A1281CBE8B650BD2E944FC2C85DC6E28198001465472D8240978D65D2C2DA6646658358D9AE4A4A1CA2EBB6B81784DB22BAA2941274A9DC21FCCBC59E83A254E870C5BA509209A3690FD7B1713C1BCD72493DBF9B591DEDC47483679F59CBA92B8EE3A413A793C90EB2EACC2572F2547CFF9A67B6F1CDAFDFC2534FEC243084D061E2EB2EA2E7BC376306D5A72EE45DC78FE32F56CD05F8E9980000200049444154A035190DA59CB12F41A322E8F28866EC11B4C8127BFC1F711FFF4A797BF81AA3B4783DFAC4B3892CFD3C5ADDF41159E7985C492112CD3A3E7B07F36CCBF8ACED71F08CA8E45E91541237022A2286AC2057CC1B09FB9E849379B2EBF590F61CF276283F87EE084D4CAEC91467D1FE29D470450A74266FA1099B991E27EF413499A4B2AAA630F77B88BDAE90F957ECB83224CC14826841B8A1C02D32FEC4A45F78F310FD0085BC216F0E224897DEE502F10E15DD0F2D7787764329FDDD91FEE642012441CCD25A27925544F289456D328696CEB26BF5666A9249E90469AC4F72E925A7626879DA3B5A19DF568BEB6ADC73CFB3FCFC670FB2E6995D64D3BED4D50D7103110A8C48F4696B2376C6494C6C31F9F8E993B970763B8948A1EBCA18676945D0E5B1C49823E860701BF91F2D94B5258E78D13459CF3972F237D06AA71EF1EAC6E60A42660B894E63F5CE3E9EE9CACBC2F89A1E911367E2C1BB361125618849AA70E2AEAC4508C2821045042AAAB78908339F95C48CE7627BB03FEB9173A0B1AD938A9AFAC2649F30C2BDBCC3753159446E6D8971A758CB43BE2FC3E2F0CDC3950D3D2821454A1B0737782D7A9D8B29DC323A2E494E2926A014A366DB11892A3681936362758CE5D3A6A00FA6184CE564D1A38898344D98B4B737D1DED68C6906446326B93C7CEF7BB773E30D0F92C91452DE8550248F45B8EF7E5515C6F22598131A58DC11E5DFAE58425B9DA8892DACE4633B8C56045DD615246BB5648523680417AD57642B8CD0128BE82463C3F508DC67FF13E7814F8FC8DA450F3D73D917308FFB008849A86364199E6A2AB82B0AD1A7E5C3CF9FD94F774444B326119953E25111D1A88A849639C97D8714292AB1E90E491B61990DD1C5DAC6CDE724397B82E8EC9C7CB477759DAEAC478F15A1B9B595EA9A5AA9718B6E2261958F83097A989CC346AE434B21422F9276D875FBF0CD5E8B641C16E50F5B5589649430221E766A94164112BE67910558B4DC494943C8197E2133D0168E911CA66F71F1E2494C6B692016C0E0604E626598060DF595D4D6C6D1759D4824413C5E496068AC5EBD99AFFCED4F79716377F81C229374C2671291DAE3440CFC59D3491E3F8F9A44C0CF3FBC94E9CD95614B2F45D0C7C4D53AA6085AF4D3B36E3D8FA0EFC5233E385AAC0663C19F61CEFFD8A86D5375C43BF90A2B18266831ED1652C2BE812CCFEDE9678B5D8DA78B093F5F3A2112D2D32CD22884AE1B6AC16191A38397E1782E407444153286487116197D5E3E272500291F68263BBB53EC1DB4E998328DFABA3AE2B1F8505D8FA2C9EFD06A78A551B2F8E6E2EF52832E1072694D8DD22248A58E8C62042D09B91041BFAC2A5D21F124CC142C46D0218187198285FD131DBAD3194C2B4F1D0133C7D572C292195455E8C4A249A2B118A6283AA2F998119DAE9E1CB7FCE27EB66EEDA6BEBE86CD5BBAD8B6653FAE250A2709D8C4646B44EE8F30037A41805D5B4DCD49228A6EE53FAE9ECF19936B0BE246F118BC3C921E0BE4AD22E8F2AEEE3145D0EEFA1B71EEFBF383EA4A94B79B2F1FA5D5CF2076E9EFD02ADBDEE82AC6ECE742822E265F6BA42D8F3F6ED9C7D69C8615AB938FD9A2FD5345CC2026324F8417B9CCB929E1D7F5F2966C3725C9D9B664F42C4A9C0AC259BFCF626B5796798B16D0D9DE84212ACA8571B7DC2A59FD4EBA42866F0282188BCB417246B1F3F7219DB75FAD0892889C65328ACC16149383C3D1F310514B1B5DF8775943A35846D4F711DD508487DAF65C74C72261E789BB79E6774C62EFAEAD9C71F2121AABE338A64977574E584E68195F41736B1D4F3CB19D4F7FFA7BA4D28284435D7EF98953B9E4A21359BB660BB7DEFA0039CB0C495A3CBDF82E9609C90573A858BA808F9DD5C9B527761211369AF02E75F0E469E15146A6B31464ABD14AD68AA0CBA38F3145D0F61D57E36DFAC588B4B3D29BE6117BF7EAF2503A2A4785F634E16858B76B802777A7C957544A8FB1889E45C45C1B8FBD42058C62E28900264C139471B8AC71E162A70764B94F41CE72324E94E8F46D2C3DCA6F9EDDC3CA534FA6655C3D81E34B57B5F8FF2B2D879336A414209256640DE7E18EDB8746D087D6D810A42B2606C537CAB2A1E277D925254CDB2E56A62BED1F28AC7FC29D1188F7456ABA206B57E8E73ECD519DD3674C20EE7BF41CE867DAD4F154C4C57A3D1E7D7A3FFFF3BDDFC8CE2A9FFC8BCB58B56A11BFBFF349BEFDED5F93F54C343F82E66579EFBB8EE7739FB99275EB77F2B9CFFF2FDB76E540BCEF69F86E8A5CE0109D3A9571AB4E65C5C25AFEF2C27934579A4481D05B134A49D20EAE891F0DA320FBC80AB1D24613DEEE0AC9FBA3E26C56045DDE611833041D0CEEC0FAD58523226FC82481D665C4AEB8BF3C948ED25182D0BAD2791ED9D2CB012F8A174F8471ACE8986DE854C5A2AF52A26838C295AAA92067619B732CD96A4AE8CDD239E1D9B88E4B2A30D9D29367E2ACB98C1F57876B87198622320F55D7972FA5E45C94354AF56741CEF2F7C2A460D1B75C2A6FBCAC4A5DC15227C958A6758791F210418B424BC2FA57F8BBCC0A141AB46C572592516C3C51CFD9B1995C5341936FF0F8236BC8D80133A78CE3E20B961389EA7CFE0BB7B271F36E342360C1DC164E5CDC29E645B9F781E7D979004CDD2011B178F7554B79EFBB4F2195F2F9D6B77EC1A3AB77E3D92EB1288C1F5F41B2A282A7B67553BFE2541293C6D1520BB515D05C9564666B3D6D0D5574D625A88FE8529212924A65DC90FF1613C38B754CC4113BDCE4EBDB717A2B822E0FF53143D061D1F96F1CBEE87C79FB3A3C4AF89E57FE1BC69C6B5EEF27C7F4F862E4296B55482B9AC6B3BBFB796C9F875E511146589E4D4483642C8A71D8C48850B32EC664923885DE6C0BBD398B9BCBE0E6B272124D44CF8EA7B1A13BC70B072C8E5F348F299DE3110FF122CA139B5070C1BD0CD7C3C91AA5242DFB1116A48D22098BF75F4EC8C54A75C35EE7522943F89BE5EF25353686BBA18814F490A045FF40E1950E2C9FD481019A8D80E3A775F2C4939BC858018F3CBA86CB2F5949A66F0F7FF197D7F0B14F7C8F0D9BBAD0CD084BE78DE7C37F72226D2D06916805DFBFEE3E3A3ADA9935BD93CEF62AAA2A7574DD249509B8E79E27E9EDEBE18A2B2F62F2E426366DDECB97BE72231B064C2A16CD837852B6D615C9E862A2559471B5BD3C7AE0501D37185F6370F58A49CC6F6F607C659CEA9849B450C44AC847A58E72F9FCF3364D362A822E8F4AC60C418BAA75EE0B37806797B767AF324AABEA2476E583B22BF7B1B98436B5BC1BF0D4BE1CEBFA020253D49F0B307D979829B46761A913DAEFCBA3DBE149C6F0F1DAB32C1C41CC96F81996360449BFD4EFF2E4DE2C53A64D67C9AC293241239C637C659B5829391749B9F45F91065EAA3317A50D31A6D8F0B57432301C2B087A385296A45C283B2A12518A2543A537BB245B50C81F610DE8D0BD91EBCAF3E2531B684BC225672F65CDBAED38BEC9D66D07386E7A070D35011FFDD8152C3FEDB3387E42660C365519BCEFAAE59C7C621B11C3438FD5108B4464612943F3D145828A261C1E11A2F14AE992314D8D6CDEE697BF7E9A7FFBF7DB493911F4A67A3022B2E1811635312A931889387A55257E65054E24826DFA541B1653C655B268623D67CE6EE5F8CE3A92C23F5DB0F14979E835DA90BDD9D78522E8F2101E33046DDF7639DE96DF96B757AF31CA987D0DD133BF3722EB1AB32B09020EA42D1EDD99A1CB8FE1EB614C1C0D7CD9ED5AD46A2E54B57FD92E16095A5AC37C17279BC14EA7F0EC9C94396C613D135A74E0B3F6804B2A5EC7890B6753138D86135B929B43DDF9658EBD42C1A262647790A451485211045D1A4D17ED73C508BAF87B314B3024F0E1087AA87E46C1032DE50B37246F31AE94A045228D903564228AABF1FCC3EBE9DEDACDE23993B8E8ECE3D0FC1C1B37EDC5334C2A2301975EBC9C5CCEE6437FFE63FAD38EB4D9E164B8F0AC595CFDAEE554C504C746314C9388114117F545D089464D62A2B398A1631886ACD3B16B6F3FFFF8AD5F71F71FD66106313C212A17F465D1D6C0D17DCC680C3D99C4A8AAC4A84A12D4D762B677E0450D0C3360767B928B17B470D2C446A6B55493940D69DF7E0FB522E8F298E3D823683D22B567BD797179081D45A364E05A48BB1607FEE91D3DACEB75D12AAAF17571F107C4651B2AE1B31DF6481F0A812C312AB3F4449FBD3C766A1027932AF8853D1C3B2F33025FECB6C946AA5930FF38EAAA2A0BC5F88B6B3B4C645E24E0121BDDC1B24668AF9313838531A5DEE6A2065D8CA4C3BE826171FE506B0EAD7EA13BA390A4228A3249096398A045D76D51DF597640112E0E3B4B65D4A47B571FABEFDB4A6005B434C4387BE5143A9A1368668CDEC114B9748E8A8A2A5E7CF180D4944D532797B769AC8B73F2099D1C376B3C095323E3983CFDF47A6CCBA3B373A26C58904A0D62E811AAAA222C5F3E9FCAA4CE60DAE2B1D59BB9EBCEA7E93990A6B232414F6F8A679EDAC8A489AD2C5C3C8DFBEF7F8E7DFBFA993C651CA7AC9A8FA399DC72CF0BE8C90A2C714C1BAA699F3591899D2D34D646397F7A152B66B7D19810425368510CDB29840A7538A1F8E653B822E8F288E5982368BD712EB1773F3EF63A7397773C5F635468ED12015457C6E5EEE776D16F561215FA73A11E7ED21417AE68562A29F07039290482C0A53BC3C1CDA5B15329F9AFA843E1F83ABE9D664B46E3B16D3916CD9DC9F2E3A6C9758A08503BB8B4DDD0F61E6E42B0F8A620D9904386C9B9288314258DA2CC51FA7B585F232C235A4ACAA58E0D59856EA8C9AB983874B16D0BD713FA738067E54906164B674EA4677737B7FE622DA9816E2EBB7019EFBC7839BD5DBD3CB7712777DEF3047D030EFBBA2DE29128FFF0E9F3A9A9D0C8BB3E158908F535E2A9C424168BF19F3FB853661876B435B164D15CE2C988F464F7F4E4B9F9E63B983C793CD75E7B05D555BA749A7477E7C8641CAAAA4DBA7B72BCEFEA2F326BFA243EF8E1F3F8F94F1EE2A9273672C1852772C699F348A72CAE79FFBF138D26A9AA8A921CDFC89E4812AD7D025A730BE36A3C4E9BD9C0BB4F9ACCE28E46E9D609B3436505ABC275F1CAAE9A11390D41D5E22813C8B141D0A68B7DFBBBF0B6FDAECCDD7AE561E6E24F1159F1B5235ECFD85B41C16825224A74B67465B877DD3EB4867168221345689281465C3C92CB72FA32982A743339786FC5C49E2E745A3131984961675292C8022F8FED050C3A3A77BDD88F9BACE792954B6916A5320541CB28FDB51D1B61465DB8C83C944281A56281FDC3D9E90ED59C65642DB304C32EDC45821EAADD2CAD7FA2F0FE702FC1A20DCFB6457D0D11417B44BD3C0BDBEA583167221586CEB6032EE9812E96CE9D44476B1DBE11E5869F3FCA3F7FF7F70CA41D3CD3208ACEF7BFFA4EEA2B5D3CD15D46B82B44701A89E193E4735FFC1F2E7FC7E92C5934858A8A2855D555242A4C296D7CF39B37F3F4535BB9F2DD6773F1C50B8919A20094417757370D753544E3557CE04FFF9AC6DA06AE7AD7E974ED4BD1D337404B6B0D9515115C4BE3FFFDC5FFA09926E79CB78464BC821FFFE271F658106BEF20B26C31B6E130B71E3E79C66C2E3B7E52A1BAA008A0C5F4A3005DD68F7D531715419707EF9820E8447E07F65D1FC2DFF348797BF52AA3A2EFBC1BA36DC511AF67ACAD406AB9D2D226A2508DD59B0EF0D4AE0CC9D6567CD15B4A14330A3462824D8AA923C345EA0EDA5DC9B1560E5768CF9934563E856BBB18760ED77378B227C6635B539C7FE652164C6D2370C42D4168CFA113F7D0E5708E0D912C534CC428D598C5670FF53797CA1CD2DF5C48020927050FAEB75194368A3EE8A1641459BC49A470FB389683232622DD3CD31A139C377F0AAD0993B809664D35C9A8B8E178442231D24EC037BFF32B6EFCD573785E8440D4A2D63596CEA8E6FCB317336D5223B1427DEA4832C97D8FADA7B5B193B6E6188978841736ECE5D9E7B6327FFE4CCE387D0935B5716EBFE3596EF8D14FF8D2973EC07173DAA5D4B267F71E9CBCCB9E7DBDF4F5F5D13EBE9588E9239AF08A42FEA29B8BB0F10985B9FB80472E97A7ADAD8AC71E7B81EBAF7B845456C3094CFC855349CC9D493652C1C2D608FFF927F399D35415362B9085AE7499A8A4087A745CE16382A063FBEF97F53782DE0D47849A5E3F5BBA3788561ED17A46FB87C389B5D0A72C0D71B28646802BFB004257CEE18117F69237AA885726866A4008028DCA1653C58E27AF10F0FA0176AA17279DC6CD67F0F27949108E98300CA27CE7D16EDE73F14AE6743622BE54FA718B0D4F4AC03B5C128A0CE0048DCBFC1321C90CFF1489FCD02248A5B24691A0852C52EC7A52D49DA5CE5CA8FB2C9D1905DDB9B4F8BEEBBBB8791BDFCDD15615E19CB993993EAE964854F4103449C46398A22E891123123788C76264F23E37DEF2000F3DB199CEB6361E79683DCFBFD44760E75836A7853F7DD7623ADBEAC86434FEFDFBB7F3E71F3C035D8B70E73DEBB8F1D6A7B182288E35C0F4CE6AEEBDFD6FE94F7BFCD5A7FF83258BA671ED47CE95B54BBABB7A181C48234A57899E878303199E58BD81A79EDCC6C4894D9C71E602B66DDFCBAE97063969C53462B1F02964CBA6FDFCE29627E8ED4F3363662BEBD674F1D29E41EC4651EA602EB4B7B0A833C95F5E3497D327354AFFBB903ADE6C155A45D0E5B1C8D820E81DBFC479E40B048347D6B95BB4B28A9E7B0398C9F2D019D5A38AE9CF61265FA807842F7D21D816EA1E3B3EF4E75DD97D7BC0F2C9381EBDB68F25EB6A0839A3F8F9508B14057D0E2A1577E8A3AE206FCFC5EADB2FE50DCFB2B12D0B57A47613B0291D636BB682CBCF399EB858A31F66FD1D6E795582F6C4A3FDC1045D9A8052943986A3E7302BB0E8C41822E5621124A9290FD77216759D0357746D11138661328D90385CDFC3CD0E521F373963CE44668F1F8768B12584A1A86952D790A0321923669844449317DD9451772A67914E79C41311FEF0D07A3EFEF99F4A1FF909F3C7F3BECB17D3D1524126A7F19DFFBE8D0F7DF07412D12477DDBB9E1B6F7D8AAC6DE0BA29E64CA9E70FBFFE222FED1CE0BAEBEFE08C558B983EAD01C7F1C80929C989B06B6F9EBBFFF0088DF515444D839FDF7C3FA79FB9844B2E3D953FDCF5383FFCDFDB39E7DCC55C74C90A2A2B62128FBEDE2C8EE7D1D454CB7F7DE71E1E7A68037A3C8AD5D244F4C4A5588918735A63FCDFFB9731635C95EC4A1318A1E4351C498F6C58AD08BA3C721913041D7DF187B87FFC7B82EC81F2F6EA154689C2489193BF0E46EC88D6337A3E5CC8E62B5E3B525F0E3B64F7E63DFAAC9098BBB32E693BC00944BB284D7A730BE59B0F22681971BF56E28248DC736D72DD7B70B2697CCB91936A2222CDF83A776D4D71FA69AB98DA5E876F0B4DF3B5C939149A87E56E593B5AB6A23ABCDFB954831EB2D405616D8DB09091F85CD1AD51A85257ACE15C88A25D3B4CA41111B3746A48EFB3D0AA1D92DE202B66CF60FAB866366EDACD93EB7630904EC9AC9AB9D33B58B67812F36775D0545B81EF59E4450125272097CD61D93932B918E7BEF79F9938BE91954B27B262C9046AAB23B87A941B6FBE8F534F5EC2F8E64A76EF1DE0C7B73CC9F3CF1FA0AE46E73D57ADE0931F3B87DBEE788ADFDFF118975F7E0A2D8D49C19632FD7ECDDA3DFCDF0FEF62DDBACDBCF39D2BB8F28A93D9B9B397EAEA18F58D49F6EEEBE3A1079E67F2C47666CE9EC4E64DDBA9AC8CD1D9592FC1CD657D3EF5E91F31D02BFA48826546C877B661CE9E85555BC5972F9DCCFB4E984CBDB8F3489D235C868FE0C809D38AA0CB6391B141D0CFFE23CE93DF023757DE5EBDC2A8C819FF8D29DB5A1D2DA5458B151634D2B6477FDE21E3F8E4029D03695746CBB2B934A2C9AA8802C30AFAA2A4671825178B5B0E5F8C52147995EB505AD6AC3C9903BB64D6A02726D46C9B8CA3F15CB7CD93FBB2FCF507AE20A20B7B5B28B11CBA1C94882227270F2E21FA4A9981F221A130E137AC4317124E4469D342224A91B40FB6D37961995069AF2B383764D53A91BE1D7A9DC58D47773D8E1FDF447F6F0EC7D648A732385E9EF1CDB574F76519D790E0B9B55B696A1CC79927CFE2DC5366E13A1676DE2697CF33386873EF231BD8D735C8CCC94DB4B7D6938C0AAD188C68820D9B77F3C4532F71FCE269B20C695F7F9EFDFBFA98D0398E19B326B0F1C52DDC76FB6AC635D672C53B575095D0A5FD2E5911E3C9275FE4A187D7CA4495450BA632635A13BA1E953715F17420BEC471024CC3249DB1F9ED6F1E116D1C39FBDCC524A251D2A93C7FF7F7B7E0BA1102DBA3A73743CE30099A9AF0DAC7D3B16432E72C69E7ACA9F59C34B355F69A0C6D78B200F5880AD38AA0CBA3B2D14FD0864BE48F9FC37DEEC8134B84FEACB71C3FA2275A79308FFCA89052C30833E3066CECB6D89D71C97922D013979470B7CA82CE0521599AE786FB01BEC14D1276302F9B26B57F275E2E2B1BA48AA2F5FB3206B7BD3848754B339FB8E81459D02A54410F26E843ED74A17BE4E57A73E9B8C3799D87248E12A786187750379482DF59DE5464324AD8C1457CB658783F7003F29ED8870C86956566CB380677E7F8D91D4F307B4A3B1FB86225F1B8869DB7C8E71D49763FF8C1EDAC7E6E278D4D4D7CFAFDABE86C34A56DCCCAE71948EB7CE9DB3FE7E295C75355A5CBF65DF555111A6AA2B2FE46241AE1073FFB2303FD196A2A13AC5CB984BA9A38AE67D3DD6D71EFFD8FC908F8AA2B4F236E0A6923C340CA4133A2C4A26282D70E1D3162424188D3F2F00A374A207F04A3CA7ADBBECE9EDDA271408ACE090DB2029E382BD6AEDD851718A407036EFBF5A3BCB4B34F4A3879132267ACC26B6E605A93C797DFB180B3A70B794778DE45275E71AB5511F41BBC6CDEF0C7463F417BBD987FFC1CDE869FBCE19D2C7E50F89FF5A6F947BC9EB77D0562C61D106D11BA320EBBFAF3ECCB055832522E542FF30359DE532ACBB2EEC6F0B4E1CBB7BF34821E7EB760851EFA83ECF957D06807F7BE842F9C1C8E8DE5FAACEB0AF8C3F634A79FB294F38E9B24279A0AA6ADE1CF9724A214A3E1E277149D1743C45C42DA877A9D0FD69F8733040F47D0A57537647BAA42828A2C7A24BBA104D86E1E2FD7CFC49A4ACE3D7E111FFF9BFFA3BABA8153164CA0637C0BBFBEF75976F6F449FFC9E5672FE4BD979E483693E5A777ACA5B936C15567CF0527473A9B12FDCEF9E12F9FE48107D613AD88E004010BA6B773C959C7D1586D08C3057937CE9AE7B7B16EC30E4090BB88BCFB686A68E1B24B4F66DAC47A6286905C3406D236BFBEED61FEF8C4063EFD89CB18D7501936CC95A4A94B0B5E36EBC8CCCF6884B03142A1AFA460EFAEDE14CFAFDD4C67BB68B555174A165A848D2F7471C30FEF65DBF61E594D509C0156472B15272E215B19E1EC6915DCF8C193C2F415697B0CCFAB915A54045D1E92A39FA0AD7D988F7F166FD32FCBDBA3571935B6093AAC9F519C5FB77D9F8D3D595E1A74487B4658A54CD7A4C62C62D762E727D9B95A62F2C666E64B2F49499E9E879DED27B56787943A44169ED0B71FDA65B379C0E79A4BCE607A43A5D4B24B09FA952604C34D1B2E7C344CD007BB3786258D42C3D9429660A9AC213E5B1A41CB946ED13CA0904558DA915BE8E69E982414371C2B4D53D4E7ACB9D398D2D2C6D91FFD365FF8C47B3975F1447EFCABA7F8DF5B1E473345395593A8DFCBDF7CE2024E3E7E269FFED2F7A96968E6AF3EB08AE66A91F99792938DDBF7E4B9E5F6B53CBD790FFBFA2C1AE206579C398BF3CF9C4522A6614685B32646366FB0BF6B90FE8134C97884F1AD0D744EA844D610742D1C342C2BCA962D7BD8B5B78F850B3AA888990579CAA367D0E7DEFB9E938D676B6AE29CB6721EF3E77662BBE942D6A6C6FD0FBCC075D7DDC505179ECCD967CF97D98B77DEF1240F3EB89E7DFB2C904D02C4790379313F31A593CA139630AEA5921B3FB89069F549793E89E256C508FA35E729CAB8521541970192B8698EFA9657D65ECC3F7E166FF3ADE5EDD15148D03272150E559150A7C1F6812C9B7AB2A47D51DB423831741CDD43383644728520E54016030E67E18B9DAF87A0293B102A991E2AB499129D52ACC13E52BBB7E13A79A93FEFCBC05DDBF3548D6BE5FD179D4432081FA7C36D18962F8AAF4B0F914C4A2929B87FA853A35473169F2BBA338AC5F60FD59D8B042DC95A44CC857E82B2334AE1C70B7CACBC2027F1378B79CDD59C3EBD9DBAAA18BD76824BFFDF75BCFBF4395C71DE095CFFBB35FCF2FE0D61179920C0C9F6B3727633FFFAB50FF1FB479EE1C7373FC8673E743673DAAB480FA6B1DC3C96E5921DB0B9E9EE17B9FB8F3B69694EF2912B4F64E98C4634C3A53AD904A6B80159619AB51960EA3A51334AA2BA194D384ADC0C795BE7F7F73EC9AF7EF7282B4F5DCA79A7CE2126928A74979D7BD2FCC5E76E606FB72D356A31A7675B69CE397D0E9FF9D42A7C574C2C06F4F4A67966CD36D94477F1E2690441826F7DFDA7AC7EE245B448122396C0F0C2BA2B82846D4D67A03641ED8AA5CC98DDC45F5F308F55339B10A5B3C2E8BBEC93E755AF5745D0E5D19922E8F2707A5B47C94C3A4D931EE66D5D2936F7E5C8184939D96914E48B8C8804458DE382EE5B24C7305DFBF012C66BEFD4B0052FECF9272268177BA09781DD5B65D71441803B07E1AE1D361D53A7F2DEB317127545BA83D046C3AA69A12F3B5C4A5FCBDFFD973B36C4DF0FAD4A375C00A93019284A7F160A2B15B3030F9A142CE8D1B20FA2C44614DE0F35E83019C5C2772D702DCE9BD9CEB249CDD2EB6C6BB59CFBE7FFC1BF7CE9232C9D5DC7F76EFE23FFF5F3A7C08C482D56CFF4F1D90F9FCE490BA7F1D9AFFE90CAEA717CEA9A93E968D4490F0E62D9196C4F279D8971C3AF9FE681A776B2EAA4697CE01DF369A88960C422FCE496C7E9983891D933DA185F671217968A888EEB193CF8C85A2AE31AA7AD5C246A0BB2FAB95DFCFD577E4867CB383EFF990B68AAAD92730FDB77F573CDC7FE879C1B0B537F021D3B6BB3604E2DDFFDF6D532B925D06C742D86615648FDDCCE67652A7B4F7796679FDDC2BD0F6CE0F98D3D44021D5364558A3040B83D0870A6745073C672CE9A5DC35F9D771C53EB92AFD256E1B5CFA4434728822E0F3345D0E5E1F4B68E129AA3E5796CECCDB3ADCFC6D1A204BA29BDB9A2B09BD05145C3D7B001529831286D03AFB01CA6A5E06BEE5F512316F537EC811E06766DC5B1454B2B871DA980BB77794C9D3993F79C311FD31D8EB25E89A04B13504A23E822391F9A8C529A3D2826D44A53BB8B045DD4A08B5E6841C8C5085A24A8086B9D48F2081353B244038789D5559C3AA38DCE862411334AACB292D33FF67F242B2A3973C9049A1B6AF8ED7D6BB089CA4CBE93E67770D1394B18CC64B9F1670F31ADA396779E3E07138B6C368365D9ACDDD2CF8EFD197918F6F5E6A9ACAC64D9DC76AA2A626CDDD5C70D37DF4375A28271E3925C76F65C56F6ECE2F600002000494441542E9F4ECA8AF0A31FDF475B5B0D0BE74D66F2C466621193ADBB7BF8F92DF7D3D6D8C439E7CC26198FA3FB1E7BBAFAF99BAFFF86ED3BB3E4F3AED4A0135138E7F4195CFBBE95B8B29598C58E97FAB8E79E3554D72458B572A14873A1BB2F232596471F7D89EBAFBF8F88AEA3FB01AE485011A78F68ED555745E28255D4D447F8D35327F3BEA513A98F475EF33C29778022E8F29052045D1E4E6FF1A8E1A40041CE83AECF969E0C3BD326AE8C633C9C00B26E801BB6D90E7BF9BD89CB90D3C2B5C90F76D3B7630B8E9D95A4B72BE373DF2E9F0953A6F3BEB3162314F1701EEBF0BD04C3505A3442092BCD95BA380EADA9513A2128E50E69A5B30B76BBE16E28C5085B960A15FAB4A8F72C1BBEBA327A96A46D7B8584141BCDCDB2A8A38565D33A694C68C462069188705918DCF3743FDFBEE17744137196CCEDE0C25366316B6A27F73FB691B696763EF5B73F6057F720A72C9CC4973E703251D325675958B91CDBF6E6F88F1F3FCA9F5C7916EF3A773EF94C967FF8EFBBF8F99DCF485C4CCDE7FFBEF54192A6C73D8FAC2716D3B8E6AA553CF8E456BEF2ED5B98377322E3C735B0706EBBB4F1897D58B771A7B4ED2D5F34998AA429A360218D740F183CFCD80BAC5DBF95DA9A4A4E3EF138664F6BC6F35204BE284C65F0F8D39BB9FE477772C6AAE339EB8C053CB5662BDFF8E62DE4AD28AE2B52950ADD1F45FD0DE9D81025397C5C53C39B3189CAA58BA8A886EF5E398F93A736C94317CA1C4796B8A208BABC8B5511747938BD65A3E4692F66E80B9A5FCAF1D9DC9767F7A08555E842276A26E47C911518BA34E4E55248A51EB24295CA1A877077F91174F1422CCA1342CAB4A5C4D1B363236E3E2735E8BD599F07766BD4B775F0C10B9713D38C50CA286CC3A1124758C9544CF689ECBF509429B5D21DD6565778049772856841E5879F1F766984D24758CB397C1D367C2DD6D870E5CD44764E716DB2FD39A6348DA3311963E9F446664FAA236A6898310333D6C8ED0F6FE0C6DB1F63E38EBD2C9A3F8D96867AEEBEEF71264F9AC4FA2DBB686FACE18A55B3B8F8A44EAA6BAA71FC80AD9BB6B265771FB7FC7E03D7FEE9859C38A7153F6F71C36D4FF1AB073690496798DA56CB173E76169695E1F70F6F67C3D67DAC38711E0FADDEC4DD8F6DC4CD8425528F9B51C9B7BE740D6DCD757CFFC6DBB9E99607F8D7AF7D94C5F3DAF19D5C88997892F20DB2962BEB474784AE2D4AA54A8BA3B0DD451848B96CDBBA9B86FA18CD4DD5FCFA8E67F8F677EEC430AAA5475ADAE870E571105DDBA563C31713CD60D75753B57C095A5B1DFF72C51C2E3AAE45E69E86245D284FFA06AF0C45D0E50137FA09DAED09270937FEACBC3D7A955163C3C5115AE88A997E3B072C9EEFCA91173193268A43EAE43D8F9C78542F55055F4D673E34B82EC9DA7BBDA006AE8333D847D7B60D78D92C8E93A73717F0E83E03B7BA9E0FBF6315B551531244B1B46891A043D2966C7C5021A4A2AC513A41585A204946BF41584CFF95AC74227B50269D48CD5964040A19C339A8F8BE2D9351845FD963CDBA3E3C4B448B1AD79C3B87F79D3D839A6840C48C10ABACC0D3A2ACDF76805BEF5EC3C34F6D61206B61B92E139A2A993FB59365F32631797C82E6DA186DEDED18A6CE0BCFBFC0819E3E06337166CE6EA5BED294FD05F7F5E4D9DB93931A7543459CFA069F6CDEE4A6DFAEE3B67BD7108B2749673C328E256B74882784E5F31AF8F2272F65F6B476563FBB9DAF7CE326FEF29397B17CD94490859184BD50C81182A8455ABC2DDCD1E019F8BE8E70F9AC59B38B3D7B7A58B6741AD55526E203BBF6A7B9E5D6A7B9EF81E748A79C822FDE970D033C471488124D741D74238A1B89139B3D83CAC5B3F9C87993F8C8091D54897E68E209A95058E9F59E3FC5F18AA0CB436EF413B4E111F9E367472651E5AA47467DA1FE7042509744B4B32FCBE63E87415FA4DEEAD2F79C753C6CDF905ED7D219F5D735117898C24505D5E155CF1A39D5278A09A507D8BFF9799C94A8C591236D3BACEB8FB1211FE7A23357B07C5253C16257F05F9746D28526AFA51A7451C628FE6D485316581C525FA318359746CF42069004ED7B8852A143B63A9198229C1CB25D958393CF5315093869C102563FFE025535AD3CF6FC0E164F6BE02FDEB984C60A88181AB1448268348A6E98ECDE3FC0D69DFBC966F39214639180AACA040931A997CFCB47FD8E09AD3436D492CFFBE4F396246BADD8FD44A4DE8B92A6AE2B13595CCB2197CF48FBD4B63D19EE7E7823DB77F7326D721BAD0D491E7D720B0D0D157CF0BDA733AEA19AEACA28220774E3E6977869670F0FAF7E01C7F53967D5024E5E36155364120A4B9E63C93EDF791B0C23206F6B5C77FDED18BACF1597AF24168DF1E4531BD87760102BAFF3C0C34F93CFDB9C77F672060607686CACE1C0BE2E3C4F67D6EC697CF73B374B32F7AB6BA85CBA8459CB3AF8FC457358D159272D9DBE5E9C8E7E63D29A22E8A385A0233A9167BE86FBD43F832B2E8837BE442FB81963F205A3BA58BF8C32358DFD83799ED9D54F464F821112F440CE262BB2C5C4A36DA1C07AE9E5F17A2E95C3F93A5ED5EB515CB9B0AFE50638B0E939F2FD7DB2925DCECAB22717E3F1BE04D367CEE4FDABE613C8BA1FE11A4B270A05798A4941C9F525B5360E4D46092368F1E82DBAA184F5358A51F541D982059D5910B9F8BB23258D82AC213307056187EE0D3B635111C007DE790EE3E319D66E4BF1AF3F79800B4F9EC79F5DB8105377D1A326D5958942F53D61C71384EA228A2B897E8BE96C1ECB1637823C563E47E0384CEC6CA3797C2B6622269F0C743C06F3067B0F0C4AFFF2C0608E6432C6B8BA4AEA2B22D8763F962DDA6841FFA0452AEB9248681858FCFC77DB59FDEC06162D984ECECA71D292E95C728EA8EB0CF73CF002DFFCCEEDAC796133575F79325FF8D455AC7F612735B5513A3AEBD9BE2DC58D3FBE8F8ECE24175DB092FD7BF7C93AD46DADF5BCB8F100FFF29D5FB16173376D4DB55C76C54AEAEA74162F9C295D2D56D6A1B2CAA4BEA91E5D8BF3FDFFB999813E83DFDDF128FD4D6D542E9FC307CE99CEA74E9B4E5C78DC656661B16EF7EB39F3C2EB571174793C36FA23E8884EF4F9EFE0AEFE47027BA0BCBD7A8551A250BFB9F0E3A08FDC6CF4116DD0613E2CC82CE7073CFAE27EFAFC18463C5EC808343890B3B134A1136A8812CE2398795BF66E08C274ED0C3D9B9E23D7DB8393CB62E5B2F45BF074BA023BD9C417AFB940DAF1867A7F9756A513E45C983C3C1C411F5C6363B84555697D8D525B9DACAF51F03A4B0DBAD0BEAAD8EC5554AA13B52A703CF6EC4DC9CCB9692D0D5CF73797F3ECF39BF99F5F3EC8DC9953F9B32B57D13A2E89AF9BECEB4D317D7C1542CEC9A4B2B2C7A088C48543C3CAD932C1C5B2F2E49C3CB5B535B4B7B4128D478956082F739CADFB737CE55F7EC9DA8D3BD9DF93C672908E8CE6BA1873A73773ED7BCFA4BA52C74D0F4A4D5CD4CF10371622113EF4C55FB0A3CB420B5C34CF65C1F47AFEFEB357B064EE4499F1B77D678AEB7F7C2BADE36AA9AA6AE09BFFFE332E3E7F059FFCC43BF8ED6F1FE4AFBF701DE79D731C1FFFC8A574B4D7C93ADD426E7AF299ED7CEDEBBF664FF720313DCF673F730573664DE69E7BD7B07AF533B434D7306DCA783239970B2E398FA953EAF9C5CD0FF2D5AF5C47AAA299DA734E65E9DC66FEF9EA654C4C98050DAED8D5A1ECD36768A022E8F2301B13041DDB743DCE637F4790DD5FDE5EBDC22863DE47889EF20D30E247B49E37E3C34305E9029F6777F7B3EE409E644D9D4C991673F639C7A74F5CC8087216133AA12821FF79BD014CC18957BA1FAFD0E864A8E5959453A4842C269FF2F46C594FA66B3F7666102B93216BD96C722AD998ADE41B9F788F944286DB1A163305C3EE289444D0826CC5F2B2D6557E2855944A19C5A495E1FE8161D42CE48BE264A19C189456BA30ADDB96F2874D904FD3D6D0CA434F6C6560C0E56FDF7B22C7CFEAE4406F3FBF7A681D8E11E7FCB397B1FAF10DDCF5E85A2E3E753EEF38750E6D8D7172D99424E79CA5E15869A2318D8816913246BC2A492216150F38E4F538773EB49E1FDCFC304F6DD8433C9E90B53722C2DC261C24A257A3888A67B471D945CB387E4E0B869F93DB8F6FB2E5A5149FFCD6EF481391BEE4381E679F3285BFFAB3F319DF5089EDD9329DDB301274ED1FE0D6DB1FE4C1D59B9933B583ABDF751A9B366E67D3A67E2EBDF80462A683655B589E887303EC40E7BBFF75071D1DE389472D664E6E63FD0B5BF9F7FFFC151133C6C7AEBD185D37F9C63F5DCFC4C9CD7CECA39713040E37FDF40FECEC75094E5841DDF83ABE78D93C2E98DA50A8F1A208FACDE082D2758E09828EEFFD03F6839F21E8DB74447868F533885FF9304485D97FF42C438625F1388FC60D7FDC4675739B2439F1C09C760306F236AE26AAF0C9A4EE90280BC4FC7AF939A4F68397575AC7CBFE2EA3618FCCDE9DF4EFDB49A6673FB9C15E9C5C9A8CA7F1A2D3C0F2732F65E994163CA18BCA4941C1C98592A28568BAD4D75C9A2D18EAD122B12424E82152164938C5D655B2546858FF39EC27188E15846C89DFC5EC9967E1DB2EA201AC20D7A6CA4A3E7FE5198C4BEAF4A7323CFEDC1E3C372F1FFFFFF7CE75DCB57E3F3927862977D89451E607CF9DC9C72E582823D93B9FD8CE3FDEF07B164CEAE423979D4847438CA4E9138BEA44A2097A2D8DCB3F7BE3FF67EF3CC0ACAACEF5FFDBED9439D30BD319981960E8D23B82A0A8891A6BAC29A6F7DEFEC9BD3726F7A627D7146F62A229C6A8B125512CA8A8802220BD0E7D18A6F776EA3E7BEFFFB3D63E0706053D5272AF66B60F0F32B3CF2EEBECFDAE6F7DDFFBBD2F075A7A98775E2535792A9FFFE8E51CDE77446A6578FD1E8A470EE7DB3FFC235DC10C36EF3E484196C167AE9DC7B2B915C4AD08A613E0C6CFDD49BF290208958C3495658B2732764C392B57AEA7E148339FFDC8E55C7DC554E962138B0A77700B4DA6776C3979C762B654A18BC735EE7B6815BFB8F369028174465595D1D6D6C5F471D9DC74E3321E78E859FCFE346EBCEE02145DA33F14A6BCA4587E57ED5D1D1414E4A16A169B371FE43FFFF33EC2E7CD451B59C2D22A1F3FBB6EE671D12DA1FD721ADB50049DDAA0BD3D00BA7303B1173E87D3B13DB5BB3AC55E8AEEC7FB813D2881A2333ACE59FD70C2BD44469B8AC3919E101B9AE3E81EE1741227E63874456CC2A2334CD564FE5CD0F04E24C09DD52B7A938309AEAC45A4A79DDE96467A5B1A0876B7486D68A110D71E0FD0513E979B2F9A438EC099B840679195750B7E227A7E2D38BBC09BB0A63AD61DF8FA08FA58349D10D73F46A54BD85589283A2AA874C228362EBA1C6DA93DD1D91FA3B9B5939F7CF40A1657E7D0D0DEC3577EF30263CB73B8EA82496C3EDCC1BD2F1EE0506B5C52CC4C3B4C866671D9EC0AA68ECE273F3B83E7371DE2A1557BB04371668C29E6C3974F656A550E5E03E24A1AF73FB795DF3EB18B505F275FFAC0855C30B98CC9132AF0790DA9156D9B361DFD7D6CDD7D8467371CE5DE475F116E855CB168145FBA71219A3D80E9683CB67217BD4131F1D81C69EC64DD96161C5D98CF86890D04F9B74F5DCE37BE70312DAD1D3CFFC2368A4AF21835B2180783D5EBF6B273E7513E72CB6232B2D2F8D3FD6BF8D91D4F62DA5ECC6888F2920CBEFB95CBA5D0FFF77EF62899593EBEF7ADF7B27D571D7F7B6213975F3C9BEBAE9E8FEE31D8BAFD00C1C800C545053CFCF04BBC14CCA63337979AAC280F7C7C51C21C3E2943FAD69FBF21804E6DCCDE1600ED379B89ADB815BB61756A77F5067B79DEF3185AC545677C9CB3738044549930AE306D8515DBF613CFAE9020261A5204D7B92322AC47C54E2E0BF53863E3F4A297D3BF7637D6173248B1503F031D2D74371DA1BFA59EE8401F91984938E6B0D1338E65E7CF654E4D398665CA6298E87A14138EC4E8C1C541DB923A1012A093DC68E16C92307B3DB13BD04D79B862FB6EF1F07554BA9809428FC48A10150EDD2187C3CD411ADB83DCFEC94BB86A5A213B0F7771F96D8FF29E59D5BCEFA209ACDDDDCAFD6BEA68E80E93E9D1C84C73C822C2A76F5C4ADF401F79197E0E3675F3DB47D79199974F535D1D5FBD611E972F18236979BB8FF6F1A33FBF80E1CB60E69861541705F8C8F5737114836028CAC04018BF57473344FDC0E07FFEF2140D6D0EAFEC6A223D4DE56BB72CA0A2409379E8984863490A9DC6C69D2D7CEFCE55988A8EA3DB38E1305FFEF8C5DC7AFD0CC20321F6EF3B443466535D554A7BB7CDB7BEF317F61DEAE4131F5CCC65974C61FBB646FEE7EE2739D21EC289EB32EDF1DDAF5F4A46208D1FFEEC11468EC8E72B9FBE8C47FEF112F73CB09E6BAE98C67FDEF6613A3A43FCFBB7EFE4AAF7CC63E182892C7F6A330FD546E8C81B468ED6C7B35F5CE2A6A9A4C7A4D00F7FEBCFE11040A7F616BE2D005A745DC59EB8FEACB87A6BA3AFC373C93DA98DCE39DE2B11344B2924C1DCD8D5D8CDAABD8D948CA892790101D1BD11E88C5852E3D9CD030F7A194ED6717226B21B27BBDFD71DCFFD81742119E8A1AFB581CE43B5F4773449801674AFDA78319EE2D1CC993289492386E1157AC5223123DC4B060923C9885802F471AFC06403CAEB54E912D655526FC37485F68F19BECAE614578B2466464044D8669CEC4C3F0BC68EC4B61522518B25532A1916D038D4D8CDD7EE7C8E8B678D62F1C4E13CFAD23ED6D6F5E0317432358BAB178EA5B3BD930963CA098623E466FA39DAD84ECF401453F5B273F77EAE3E7F32E5055E06A20AF7BDB897879EDFCB8D974EE7BAA53514A4EBD2626AF781A3540E2F2533238DE6F62E0ED71D61E1F4C992E7DCDC61F18F557B7879D35E96CDAEE48A4535188A70A7B1D8B9BF995DFB5BD871A09DB5DBDA7144CD44D0DAE271468D18C6D47139BCFFEAB94C195B4267CF00CFADDEC5F2957B58BDFE30B198C69C89597CF5F357931BD079716D2DBF7F701DF547FBF0E90E1FBC7E0AB3678CE6851737A1281AB3A68D95935E5D7D1B1326543275EA6899427BECF1754C9F3E8ADC9C4CFE78EF4A9E3E1441193716D5E967CD5716CBD670292025D3D0A7961538D52B3404D0A981CBDB03A0BD1AB1E5D7621D7C3CB5BB7A83BD14231DEF47EB51FE0FF812BAF460297E40D85278E4E57DF4797C9414E449301639C58EB04D8F10DA10E02C0D5106472BA78BC6A73F8C32E52852BC227232C3447A3B68AEDD4957FD7E9987B6A3033446FCB4798A482F19CDC5F3CEA3AA301B4B74A909FA9B743E71BB0C93002D9A5092CC8C6379E6846EF3F122A12B1DEA02F4F1085A449D82B9216450456130160BCA966E33AE909399CE2D8BA730B7A698CC808F17B71DE268632FC387E5B163DF3EC6578DA0A727C4F20D07C1EFE7D259A3C9F32B1CA96FE6C08123CC9C310E9FC79014BD7DFBEA78F79259F83C3AD1A84D9AEED0DDD3C191CE28BFFCC7665ED9D3CD7F7C703197CC2A21CBAFB362DD5EFAFA07B862D96C29C224AEF977F72D67EAC4092C9B5D4D4BA7C5F31B0EF1E7E5EBA92CC9E43337CE23C70FDD6195EFDEFE08DBF737513EBC90BE7E4BF2A5354DF0A155E2518BD2BC087FB8FD134CAACC055DE3BF7EF138773FF03271DB8F1989F29B1FDCC485E78F47B1426CDBD5CC776E7F926DBB5AF0185E46975B7CE93357CA7CFE5F1F5A437757841BAF5BC89C59A37865C34176EE3EC89C59E3A81E59826A183CBD621D1B361F615FC44FE6AC29C408F3E297CFC727177F2E956828823EFDF7E9CD3EF92F07D06240BC573F8B5AB6E0CDC6E69CFFDEED78B625F61EED0CF3E09A3D148CAE22CB2B3AF15444EB417BD8A63F96606B9CF32B4AFD042222564503486480B603BB69DEB78B486FA7644B74866D7A1D3FDDE92398357B0E4BA78D910EDA22D5612554E88E6B6CB85D82C7DCB813EDDBAF7546B107E59945AE3B09DC029C054759A64DE282B9102266C531C30EDDBD712E9A51C317AF9985473778EFF71EA4F65013D3CB73F87F1F58847053F9FD935B79EA957D8C2ACBE72BB72C233F5D65F3CE7A543BC2D489C3A5EB89B0988A5A3699693E2C33447666366D4D6D7474F6D2D4A772C73F36B2F15037D7CF29E1B3372C24C36BF0D7E736515E5EC8ACC923A96B6CE3BCB115DCFBF73598C0A7AE99C7A18630B7DFFD142BD61F66DE79357CE9FD7329C854680D3B7CF5DFEF62F6CC69DC78ED5C0E1D69E3377F5EC9FA1D6285A2A29961164C2BE0E7DFFF38A5394234CB61E79E56F61C68A72FE4D0D1D1C6273F7011861A053BC6BA4DF57CE7F615EC3FD283A2EA5CB67034D75D3607AF07D66FACE50F7F5ACE55572DE0C61B2FE6D39FFE09FB0F1D62F1A2697CE93337A0F974FEED5B7FE4D5CD0DA48F1D43C545F3315593155F5C40BA8C2D5C95C5D3715A198AA0537BD7FE25015A9FF54D8CD9FF96DA089DE3BD441422F278EBF735B272672BD5E78DC327B514544236B484E284E3A75A42FEF323689975948C3BD7C854B1A2F4341EA679DF767A9B1B880CF4110E0E108EC669338AA898BA984BCE9F454017AEDA0A8EC84927981C96A4D125CC5E0745CCAFCD3B4BFD8C41CD2749F076F59DDD766E91F270E216B1480433D6C7F8B2524CD28944427CEE86F33954DFC257EF5E4986C7E0FAF913B9727E353DFD31566C6B94ADD8B3ABF3193D3C93E52F6E60EE941A8A057D4E350864FAF1780D34434CA436E118787418E8EBA2B72FCEC18630BF5EBE8D757B5BB8FD2BEF61D6A84C0CC561F596FDB4B5F5F0BEEB2E213B53A72F14E547BFFC0B4B16CDE192E9D5F45A3A1B0EB6F18BBB9EA52C3DC0E7DE378FDC348BCEA0CD4F7FF157AEBFF6122E5D3A51AE18B6ED6FE6C7BF7D9C504861F1EC712C9C554D557996E44A4BDE8FE391D2A46271250D73A33184359910107F76D54EBEFD932769EB73D0741FA34BD3F1C7A30C2F0D70CD758BA9AB6B276A06292BCD65CD9A7D8C1E3F82C58B66E3516D56AFDBC58BAB6A797EE556BCD515542E5B886DD82CFFDC5C32E56ACE5DD90D01F4B90389B70D409B6B842FE16F211E3AF3D1300278AF7A0AB568E6991FEB8C8EE04AF1F7C5151E787127FD5A265555A5A8F108263ADD5187D6011353E49F4F83EE7C4697F6261F96D1BF34034076D585DA9BE8ADDB4DC791FD7435374B3B2CC1A8684B1B41E6F8455C38F73CCA3234ECB85BE893A90CE16F28803541911BACEF7C2C829646AF2EA73999061111B4C837CB7F4B9A5D18D190220A8B66D0E45DF3E7306A7809F150174BA78C42157E7C1E4853559ABBFB68EB8C70F30F1E624F4B04CD085093E3F0C5F74C9682F5AB37EEE243974E27A6F87968CD6E1E786E27936B4AF8E6871633B9A2905FDFFF38E98100572E9E4B6BC3513A43264F6F6DE6AF2F1CA6AA3893FFF7FE0554157AC8503D1C0D3A3CBF612BCD2DADD4540FE7CA8BE65098E9939D7BAFD4B6F0F51F3F4A575794AF7DF8022E9A3712D58CC97674512C35BC3AF9B9D93285613B2A5ED5C0B4A2C44527A960C2881491F87FB12C114F919CF4145984154EE58A1D97A92891BFEE0AC153CF6EE2A18756B178F1242EBE702A15C539B4363773E4681B5959856CDEB297E933C771FBED7F22AFA084EA9A49FCF72F1F4133A4510F81CAE1542D5B84EDB1F8FB276792257E282DD54E4FC47F28824EEDED7CDB00B4B5F7414CC1853EC36615392C9A0763EA17D0E7DE96DA289DABBDC403AEB8207CCFCA9D78871533A22417C516A0ACD311B4690D99B251E5ADD7C9CFCD452714A71334BF84D4A9484B840718686BA4E3E01EEA776EC0944A7751FA940CBAB36BA89E349325D36BC8540598B8A2476EEED915DE7F9DD9AB28048A7D04E80EF212143F8B460550B9EDDFD2834FE8520BA797B84347D022BF60381D5D3D0CCFF1F1EDF72D66DBF61D8C1951C48C51C3D974B49DDF3DFC22EB9B606F7318AFA671D3EC726E983D9C83F5CDAC5CBF9DCF5C339FA0E3E7AEA737F3E48606C65464F2EFB72E64EE980A1AFAFB8974072909A4D1DDDB43674F2F073AA2DCFDE44E3C812C469764529619E3D64BA7A27935344F3AAA9646C0AFE26816BAEEE5177F788CA63E87F5B51D14A4F9F9CE272FA2B4C88B1535B14362A511C774A2E46467911908C8894CB42B498F492909EA4ED7429B251E170A83A21148E482C57322BE1321CC1FC5892B6E4F90A611770CEAEB3B292F2D4053A2C4A3415A3BC23CF7F201D66FAA63C3E69D5CB8E47C9E79661DA6ADE3F77931851D9623689D161963CAA8BA6801966EF1B74FCE9011B44C710CE5A0CFCD8B9638EADB06A09DBE7A624FDF82DDB2E1988CE5E98F8C825A3A0FEF35CF9DFE21CECA274504E2B0BFAD9F3FBEB09BD2CA6ACA0B32112D0716BA04EED6601C4BD2EB5E2341774C1B63D0859CF0B3C16C8FE43E2791B17BED71DEA40699AC511EFB58C252CBB16C62E11003AD0D1C7AE5597A3BDD2EC3483446B796472C7F0C93CF9BC2FC89A3F16A8256771CA093290D195927981DA245F9C4EEC0C4BF851B8AF41374591B02A0ED585416E10C8F8F57EB43744684CAB1C6F8F23C968CCB9574C0EB2F9ACAAC51651CEAB779FFB7FFC49EDE742C5BC5438C4B261672C3CC52BCBAC5FEA39D4CAFC845F3186C6BEC66DDAE26C6561470F9BC1A32020196AF59477E7A16D34795D3D3DB416747AFB4897AB9B69D07D63470B4AD8B65F34673DDBCD18C28CE241E8E2452242A597905EC3DDCCADD8FBFCCCA17F7505452CC47AF9EC527AE9E8162C788C42CFEF0C87A0CC3275BC2C754E6332C2B204156342505C3260D2D5D7409479D8843437B90EEBE20FDFD11A96F921EF09395994E699E261DC005FB64586E3AC2C65040A9AA8B62652CA1FAE7F0FCDA43FCECD7CFD2D51B930541316A49BB34F15D688AC8928867CF266F4225232F9C434C35F9C7C7A71348E6A08700FAAC20C1A90EF2B601687103F10DDFC7DCF07DB062673C286AC124BC37ACFB5F174E1200FDEA9136FEB07A1F93274CA434C7475C11D1A34ECB80497348E41913F29D83F8A62E01E4D439E89355D68FB146CE70F4125DDFC7F59E931D8D62E96DC668DBBB85D603B5F4341C20D8D5268571426A80504E2517BCFBBD4CA82844111A19423B43E44C85425EA21B5000BD00665344C6096ADDE0085AB6710B2FC4A4BFA0480BC462A8668459E346F1CCEE767AC21AC53939146579A8CAF370C1B4914C1C9E855F57E973FC7CFABF1FE1F13D2255A649AAD9CC8A4CAE9C94C3D8021FAD9D3D74456164413A238BB3F1FBBD780D15DD9FC18EBA3646E406D044039119A7ABBB9B48FF008663A17B7C3CBCA985A73637D3128C32BA20939A51651CAD3B4AC0508859363593C6B2F2A56D34B60D50539AC907AE98C6754B27929BEE9500DC3710E7435FFF2D55230AF9FC872E939D8642DF595CA7C8313FF0CC761E59B18D1DB50DF405E3320DE65155A9C02744F6ADB84644E8B4587DE464FA98589DC775EF9ACA82E91520A26C494237E5337FB825CC8F7EF5349B76F724D267B6D4821691B8C85DD98AE0E9086D68B8B6DBAC0000200049444154F7392B9B359EE18BA711B50678FCA3B3E513298D225EA3AA98EAA33594E2486DA4DE56006D376F20FAB74BC00CA676776FB097925D85F7DD0FA1E48D3BE3639DC901C463BEF640237F58B39F69E74DA12CC78B684BB16D8DE6605CFE912DDEB22960F0262A42A73EF371807ECDE7DE4A5D5102EFEB3F70B2E0FD9820883064ED6AA2BBA19EF643B5B41EDA43B0A39998E510D4B3F04DBE841953A75053988962C52485CD357E75B9CD326D3108A0933E8372BF24F7391A763D06A520BF89190E529D97C1758BE6D0118912B11546E4E79217F09091263CFF84E59FD07AF660695E9EDF7E845F3F53CBDE862EDAFB2CAA0B7C5C581360C9E812B23C2AF73CB785E125C31857293A4E856B8D82E928043C2A23F23339D2D2CD81CE8894171D9EA1519A019A1D27A807D872A49B977635B3F560BBBC0EC712024A82871DC7AB397815583CA78AAB2F98C8E2E923C8F40B8714D77641AC0A0E36761248F752989D8EF05314631DC760EBBE16BEFCA3BFB3A74E00AA978047A3A0C0436B530F936BCAF1EA0EEBB71C46248D8533555F5850A7A3CC9D52C6C76F399FB165B9684E08413B178E914290E927BF7B86755B9B133C66D7BC57344149912BD9879268A4B26D2A174DA36CEE646CAB9B473F3C47A637444A6508A0CFE4ED7FF3CFBEAD009A7898C8BDD3717A0FBEF99DBDC91E8A27137DDA17D1677EFD8C8F75260710F0F7D2BEA3FC6ED55E664E9BC6F05C3F36222FABD13C10A741444A8A50DF3B19509EFBCCF4C9087E273BABCC8BCAC8CB41318344FB7A659761FDCE5769DDB75DE6A84D5BA5BB700A199553993D711423F203A882B72C73D089A25F92EB3C485F4344D002A05DAEB385191502436EA150880F05548B2B674E666ECD08D23C0E8AE641D76C54D54155353445435555148F1745D3246DEE4047880DFB5B7962DD5E46E4A771DDF935F86361FADADB69ED8DCA2EC0CEBE10D1B8499AA4D7C1A4AA723C19693CB9763FF7AFDE8382CECCE1395C34A588E20C01C4AA2CEA7504159EDBD3CE11918EE81542FF0E695E83E23C0F13471673FD4593292D10A907054D17D7A6618B13D831E29A5F521185283F8E8EED68ACDB51CF2FEF7F81F53B3A89251C638A7333F9E42D0B58B76E3353C755929B13E0CF0FAF60446905078F76B3657FA7745911E3317B5219B75EB3800995E9B2482B24B762B6CE3F9EDBCFF7EF582E5DC1454A488E95D0B2967E648A2BC895B0191B7BF17C8AA78DC16B7771EF07E7BA1C68E9C69268837D8B2FC150049DDA80BDBD005A4413DB7F87F9C26752BBBB37DA4BC876E68C469FFB1DB4AACBCFFC7867708457EA5AB9FDC92D4C993C99B1E5B9600B912183B688C3A1DE1831C74D71BC267E4EB97098FCEC5BA5439D2AD87E2D408B55F1894D8D82F32C5AB223F4341DA271F716BAEBF6D1DFD986198B13F11760948EA7B2663C534795499DEFA43595E04BBBC2FB2ED739A9F12C53209610DE8F6346232E50C74D86A57BB9786215E755E4E3F778F16AC2EC5C14E73C58AA87A86899D73C78BC3EB27C6EBF8F4851689A2EB9CD5DFD11D27C06F959E9C4A3513AC32677FF63A3C4C7FD878E503A2C939EBE209565E518BE007F5DBF9FCE9E28ED7DA23A675193AF73F3F92319374CC710D1A7EE45511D59609346BE8E23CF251A5EFC690659997E0A72B264E1B02B6CF2B717B7B0EB40334BE74EE082699564FB5D5F402148D5DE17E3AF2B76F2C0333B38DA1EC60C45583CB59A6B2E9D8C19EC615CF570F61E6AA6BDBB4F6A880845BD9AD1C54482260D6D7D1869593CF8E44676EE6DA0345BE5EA8B26F39E25D518C2100295AE8108F54D21D7CFD23669E930B9EB9EA768EFB1510C0FAA68F2741C4CDB64FAB54BC91D534645468C1FBF678A0C2204A8CB89F934E28421804E0D30DE76004DAC8FC81FC7E1843B52BBC33701696DECCD180B7E80E2CB3DF3E3BDD5232410706B7317DF7F781DD5636B985153816345A4F75B8FA9B3BF3BCA80C08264D76182DE264EF5DAF76230A09EEA776FF6F354332027D412072937B9B42B7191C2845488FBF7D3DF7A94AEBABD341DDC4BFFE1EDA8964D9FAF0C5FF54C66CD9E4E41C070991882929028FEC512396801C43149B38BC94614272614EB6212B823668C9955C5DC346702E90298555532297AE236B58DDDEC6BEAA6A3A783886033E0E7BC9179CC9E54C1F8D21C1C3386A65A32BA56745D82BA652BFCE6C9EDFCF2B12D44C226A1984561A687F6EE7EF20259A4F93DEC12D29B9683660BD5B838178C49E7BA9925641BD0D21BA1B12344F5C86114A48928DEC1301CD23C017C5E3FBAD7405563A8DE00583E7EFFF87A7EFBD4767A223AB99E105FFDE022A90DA2AB22E7ACF26A6D3D9FFFF19352C449F8079A7D9DD23FF1875FBF16271EE7AE0737B06977036D7D21D90894E6D3A828CDE657FFF62172D2355EDEBC9FEFFEEA310EB79B92765791E3E1CF3FBD018FE2B22FA4988023FC5A84588A494CCBE2A7BF7E8615CFD7A2FAD3A4EEB86C22B2E3CCB9E922B2471631AB348D2F2E1AE9D6AC132DDEA781CF4382FD2962C5DB0FA001F3C52F10DFF6EB146FF18D7753F3C7632CFC316AF90567E5786FE9200952C5FEAE20B7DDF7121945C52C9B3D1EB19ED69D3803B68703BD269DE1B8949F74D31CC76546DFD2B9CEE9CE276769BB4C2C0B27D24FA4AB95D6FA031C78E93962A2E3D08181AC4A72269DCFA4AA0A728CA8044DDB52888BDC74425F437A0B8A42A088A00548C74C82824B2DF635C32C9B38822B678D93FC5FC39BC10BFBDAD9B6FF103B9B06B0550F5FB8763EB5879BF9FD632FB1647A15A1602F15A5657CE3C6C5F824B7212ED30C86A653D7D9CBF5DFF8131BFAF3DD82992AF2B842D75A41B15CAEB1A27951054D109B2C9FCA7BA79470C9B85C2CC7E2278F6E667B5D37238A037CEBCA69B23350D521EA78E8891B0C44A394E76530A2D027F59FEFF8DB36EE5EB193385ED2F520DFFDE4C55C37AF1255D41B1483675FADE77DDFFE078E6690E3B7B87EC978A6560F931A214FADDDC3777FBB12430F8010531257246889F10897CF2CE20B1FBD52A62A9E59BD8B67D71F60DB8166AC5090E7FFF0297C7A58E69B053B44B6DE3B269A62D03CA073F7FDEB79EE859D685E9F6B6D25D22D3ACCBAF142F287E773C58422AE99982781FDB58C9EB7F2880D45D0A98DD6DB12A0ED968D44FF3A3FB53B7CB3BD140D6DFC076467E1FF8A0CA9E3D012B6F8CEC3AFD01054B969D90C7CAA2DBBF484C1D7A13E9BC67ED159E882A0CB7375E3DC5389ECBFD92D9FFDDF2762A8D75D902B4729A237271624DCD7CDA1575FA153E876743711B675FAF3C65154319AF1E5B9D22F302E4D4F5D668654B4139C60F1FF42465476134609C5903A2023B20C2E9B3E8EAAE2610C381E1A431A773FB3815B2E9A21ADA57A3ABA593C71047D11879D8DADCC9E54CAD3AF1CE5570F3DCF17AF9FCFF431E514667BC80E783034C18080BB976FE44B7FDD03A23BCFCD35B86C05416770DCBCAC224D6F05B726CEF080CAF4AA42429110F5ADDDD2C75080FA4DB34B19579E83A378786CD3519ED9DE48576F3F534695F1A30FCD970982BFACDCCBFD2FEE46513C8C29F473DBA72E61628968A2B6B0149D47571FE1D33F7E12C3A392E977B8F38BEF964A79ABB61FE5BF1F7889C65EA18EA74A0307D934925CFE845BB962C9443E75CB52A90BFDCB7B5FE4D9B57BA460D4BDFF752DD5E57EC984110174D4B4E80AC568EF8E73CFC36BD9BCA71DF0C8274DA438E28E495A410653AF58486545161F983792F38609929DE05DBB63733ADB1040A7366A6F4B8076A2BD44EE2C962FC9D9DAA45FE13F3D17ED86D05114EE5ABD87DF3EBB9B1BDEBD88B18569AE9A9DEA70B4CF626F97852DB4A045482791396989727A2FC7D91AB3138F934487E3D1B46001C8FC66A2A941FC6D0F7433D0DE44DB9143741CD84647533D617F11C5131750555E449A139251B274E016AC0E91738E455D4F4091EEB063D803212AF3025CBB702A0579B96C6CECE7D57D8DCC1B3F8A8A4C1FC3F3540CD544D7BCA0EB688A28C6093A9A23B58E1D7C6C6D0B72DB9D4F307B42259FBD7C1A25D93E34D1E8A1298CBCF54E8EF4795144D14F4E8D3AB6E8469486B78A3403C8F55AE4A57B38DA19251277F0C50778F9E737317EC43039A1FCF1C1A7C9C9C8A4ADCBE468284E5B5F9CF5BBDB69EC1EE0BD8B27E25322747675525C94CBF4F1C3A92A2DA0625806861391DF73C8F6F0AB8737F18B07379395A6307FCA483EF1EE1AFA43369FFAC183B4C7BCF8155D3ABBCB967B4744FBEEFBA0C8E6C230D72D1DCDA50B26F2F8EA6DACDFDA40635B9C8F5D359E9B2F9B4C38D48BAA68D4350FF0AB7B56B17177379AD020571CD951292D212C074B8D3366CE04C6CF1ACD85938771F5E4323C89EFF474F3CFE2E843009DDA5BF8B6046862FD44EE9B81D35B97DA5DA6B097B1E40EF4B1B7C882D23F6D4B584889F33D53DBCCD7EE5DCD94A953B8625AB9FBD2290A4D0371767599B2502838BB6E249D781165DAE3FFC2969C284F4C75B8854301D222F8749D0944CA231E0B11E96EA3BD762B0D5B5EA63718225E3E93E155359467AB1822C72C0A81827E970468C1E410D1B465931EEDE58A3993995E3D9CFA5E93BBD6D63160C6F8D2BBA6333EDB83AAC4B00D1F2D41D8DB1AC2B21C72D374A657E592ED17AC62A86D37F9F9DF5F26689A7CF6B2192C9E301255B1D134856FFD65356B76B5CA0E4E51446CEE8DD36F09F70111559A8C2FF470D5DC115497E6F0F8EA5DB4F645195592C737DE3B8382AC34D9C5B7BD56687CF453DFD4C9E40923A9AA2C63CDCE467EF78FADACDFDDCCC4520F5FFFC845CC1A5342A6A1BB5443332A530AA27B7BC0D6F9E9FDAFF2BB27F690996673D1F44A3E73C56436EEAEE79BBF7A9A982F0F4D86CC82BFECE6FC45E94FA4617461D86B47397F723E5FBAF5121A3A82FCF1E1977875472B372CA9E05337CC23141E90CF577D5B88FFB96F1D1B7777A088204040BEFC3A8571818D2FCBC7AC4BE631615C3E57CD28676A71967419175CEAE3CCA2B71E280C01746AEFEDDB13A0AD28E6DAFF20BEF9F6D4EE3285BDD4E14BF12CB90325B32285BDCFD22E12C0C4C38E2C067EE6AE67E9B4FD7CEB86F9C2A44FE63E7B62B0BB3B4657C4CD4BBA4ED9C251E5E479DFB374656FF13083A3E7133FEABEBA6EC7A4B851D1FE2022512516A1B7E930F51B9E9352A5DD6923304AC75153964B8E1AC30E07654AC315438AC9885A44D0F198C3ACB2742E9F35994CAFCEC6A3BD3CB1AB93F29C00EF99594145BA435C0FB0BD23CAE35B8EB2E17037C2012B60C0F5F34673F5F44A8AD34D6268B40C44D975A495E2DC74E68F2997C0AD8A49B12F486B77580254534F88BFAED9C7939B3A08590A694E90DB6E59C0F5E757E1B1E334B5F7C9083A3F379D7C617FA5D832EAB41C3FE1688C50344AA6DF4B7ABA977E74BEF9EB95FCE1E97DCC199DC3AFBE7115A372546241A1BFE1E6828576B548A1F4391A3F7B600BBF7FAA1645A419EC5EFEF29D9B254FFA6B3F5F8EE9CD4195939F28584A5DA4E3E228B62639E68BA61570D9F96379F8B1F56C3B3C40C8D4B879E9703E76DD1CC2E101F9BD347646B9FBAFEB78695B23A801195523849644711087B2D165CCBA643ED3AA035C755E3185012F9A08D11DE1EE73EAEFFDCD1EA021807EB311727FFFF604682114D3B11D73D557B01BCFDC65458E84E6432B3F1F7DFEF750F3C6A7367A67B897CC5424F29CA2A9E19EF507B9EDA175DCFED9EBF1119536514243A1330207BA06E8347509CD2EA8FF5F02E8D40742AAE149FEACD0BDEAA3E7F00E5AF76CE1486337E1BCD1949416539D69E304071202492E408B3FC26F50B7A27CEDDDE7939F25E86C1E5E38D44B7D5F94778D2F6378A64654F1F2974D0DBC58D7475D579490A8AFCA79D0A130C3C3D4615E3EB264148B46E7E0185E9ED97A98C6EE20372E18C7B0805746FBBAE0AB25F8BDCDC118773CBD933B97EFA6330CDE583F5FB9FC3C3E71C514BC4E0455C0BAC03431F5D8AA6485C8158323920F02F1D5844E8650C8D0B873F9666EFBE32B1465194C1B53C2F0FC0025F9695417E530B3A6149F21F2DB1651C7E09E670EF0DDBFACC7A32A8C2EF6F1D5F7CEA2AC28979FFEE9399ED9D48C62A4498016AB2D194C8B71552C9C984D49B6C2973EB098EA11053CFAD4569E58B38F8E7E93EFDC3A8B0BA695108985E598C42216758D5D34754758B7AD83CDB58DF447DDA274667E3A3396CEA1645421EF9998CBBC113918AA822681F9CC566F43009DDA3BF3F60468716F560C6BEF03C45EFC3C986741E12E315EDA8865782E7B08297FF64FD8645CE922358783261FB86305172D5CC0D4522F51E1462DF29F8E4E437F84ED3D36A6941E15F969F1B9337B49FE09B7F7BA530872972CBA89175CB035BA9A69DFBF83BD9B36D1172823B3743863B31CD4900BD0A250285C524491301A0E316944011F9B7F1EB6E610D7023CBAB38DEEF000EF9F3D8A228FC38E1E2F5FFBDB469AE2DEC47798588ACB85878D1AECE6FD73CAF9C98DD3244DACB93FCEEA3D752C1C57C6D8C23C2C2D8E070F0396CD81B65E1E59BB9F075F3C446F30268969237254FEEDE625CC2C139E91A62BBBAA3A38BA9781709448D096CC88CC7C0F9982F121DCC565C940C1D1143A623A5FFDC5638CAA28E3506317ABB7D64BFD8B9A0283FFF8D8C54C2C4B9391B4781E9EDAD0C6277EB512C3F0936E585C3E65189FBB7EB1EC64FCCFBB5F606753D08D78E5F420645BC1107F625D7CE4DAF97CE8AAF93CB5660777FD6D3D2D9D31FAC2511EF88F2B28CBB23085238AE81CB44518E04E48ED418DBFAFAEE56F2B76A0FBD21933A38AE94B67E3D743BC6F5A09E38A3265FDC3ED527DEB698DC10FC31040A7F6F6BD7D015A3C96DDFB30577F15ABEEE9D4EE3695BD541D63CEB7D1A77F3995BDCF6C9F64114D3EF482F0A5F0F3E7F7F3E4C17E3E7ED144BC8897DBAD96472C83550D03F4C5F50407F5389BE3CC2EE2DC7C5ABEC26F44AA1691A688FC82DD52B3A3F6A517E85272F0978E605C868D1AEE77BDF912006D86C3A42B36EF5D348D490519E8C2895AF353DB0BF95E8551D9C291DB6175639C6F3DB593A0919158F24BF16A771345B4F0004B47F879E0B38B5D4686D7CF139BF731A62C9F29A5C3A400BEC8F3FFF685DDDCB97C2B755D71FC9ACE4D4B2671DEC85CB2BC3129A664C44258A2F8A829C46C833D473BD85FDF2AA14EFC1154C16105394C1C554E6E9AC7A51B8A31D1344251C8F07BD87CB49B6FFFE16536D7F6123006F8DA07E672C3B49128AA255923ABB7B7F3F1DB9FC624434E665FBF7936372D1A2BF3192B371DE16BB7FF9D889D8662884E53E12A13271EB1F9CA0D53F9F0B58BC8CBF0F2F3FBD7F0837BD6A0AB7EF4581F8FFCE47AD2957EF9ACB9591137FA562D15C7EBE381A777F1C747F7905590CFB21B17935F964D893FC2B5934B2913097CB90D01F4B9796B5E7FD4B735404BB3D19D77115BF38DB3A2CF911C1EC59B85EF63CDE75E482909D072D9EF46D107FB4C267DF3413EFFDE8B9855918F1D176DC72273EBE195A63EEA07043FD7EBE2CD6B10F0CC629A933F72A936AE9CECD3A7BA1E9183161E8B12396321826D0DD4AE5A415BD487BF78046302266AB84FFAFA49808E8650A261168DAB66E9A44ABC6234349BA0E6A3C14A6798DF4FA1164151636C6857F9FA937BE857B3130A80421759A4844491D24089F4F3AE9A4CEEF9D02C2C4DE795031D3CBFF520372F9DC884924C6C1191DAF0C9DF3FCF1F9FAB43F5A6737E75806F5D33839AC234D7762B16C7D04494ABD3692ABCBCF9203D7D034C9F3A0DD51790E90DBF1966C7BEFD7476754999D5CAA20C297A250B8D8A85D7B6E85302FC74F96EFEE71F9BC18C70EDEC32FEEB9645788C18B61263E7A13EBE79F77A763545E524FD891BE662F77630A2C0C3FCE9A379FAE5033CFB4A2D750D3DB2F53D274B61C6D891FCE7976FA0BEA59DBD871AD976B09BDF3DF2AA5C818C2B31F8E9672FC2AB4425033C6A6B0CC47421F62108D1F49A0A77DEBF922DFB06C82DCBE77D9F7D2FBAD5C3BCCA4CE6570D23CD487EA367BE721B8AA05383F8B737404B94B230577DF9AC35AEC8615375F471EFC758F84330A4B9CF39DA121CDB63045611BBA92CFBEFA7597FB8971B2F9AC19289A57884909088EC84087C5F9CCD4DBD0C38BE44EE53148A34B7927F963779C893A0EC1B46C6295C83CBE54E04B642FBBABF87FD2F3F4B634F8C404E29237C119C50A72CD2093124AF1D63E98431CCAD2AC650A2A86A3A8A1143D1FD2CAFED655B731F1F5F308A919982C29BC513B5ADFC62CD11BAE33E6CD18227625A278E27DAC7DC0A0F3FB8793195E996A4E1B53B5E8E76F533AE20409E5F45B7350EC72CAEFBE1636CAE07DD037346A4F3A1D963983ADC4FBA1694EEEA82DF7CA4B5875D473B28ABA8E6A117B7B2727B1D39E97E0C4F1AF54DED8C294EE3D6F72C24CF17A73CDB4B71769A8C5B35C5A47140E7377FDFCA63EBF69393E1E5E60BCFE3AAF963C8D2FBA51B8A62E95214E95057905F3DBA96155B9BB1AC00A61964E1A4726EB9741607F7ECE4F26553F1797C7875039FCFCB532BB7523DA18AA757EEE0378FBC420C956CC564D9CC6A6EBC6402697AD89DF01D8D577775F1DDDFAF268AA0D72968899E7D6F96C265D72C65D4A842E6566633AB220BBFD01E7DAD77CAE9D3A087687629BC276297B73F408BC59D705BD9F28BB3CA8B56BCD9E8D3BF843EF9936048F5DB73BA09CD037773787047335FFCE32AD233F3F8E0B249D4148BE5BA483A2385FCEB7A4DF6B485E8B184D3B72AA351B9B41E243F7A0EF0FAD8FD0FEAEC7ECB6372A2E7ADEB08120F0539B4FE799A3BFAF0650EA354741586BB880B3D0FD362644136174EAAA128DDC0706CB20C0B47881EE91E36368768337D2CAACC23D788E2D321AC66F08FBDDD3CB6BD9EFA3E9794A863727E652E9F583286C9C5E2FBB4A522DD4BFB1AA4FCE9F935C578B0112CE95575DDDCFC3311D10710A2C8AA196252B6C2B7AE9ACE84121DCD51A52A5E7BC8A6A12FC60B3B1A7878F52EAE5A3A93922C91065058B7E728AF6CDBCBF88A3CCE1F9DC794CA02A65697A2A971A9B35CD7EDF0ADBB9EA77DC0E413574E67D9B4110444641B15AB0BE15C28F44C5C9EF3DEC620BF7F62232B77F710313572FD0A8134132516E373EF5F2A0D6DD3FC5EE6CE3A8F7FFFDE9F30B27289C4140E37764BB1A425138BB866F1388AB314B7655EB1885906CB5F69E2F7CB6B31142D61E61BC7D162CC59369B050B27C962ED053585E407C4F3255B57DEF2F77DAA0F0C45D0A90DE53B02A0E33B7F4FFC95DBCE8EDBCAA07153B22A31E6DEE636B088A68773BDC93E0893EE98CA771FDBC8BDAB0FB06CE604AE59300AD556E58B2596E0160607BB0758DF2C981E82CD90C80ACA94897B91C9C0F75C01F5095A1C27199753A5375E0FD03656344CFDA697686CE9262D9045A13A801DEEC58E9B882EF7B4DC128A0B8B49D354B2149B1B2666CA8611A17571B027CA9A86089606534B73995F16C0ABEB4455832D2D415E3ADC230B6239693AD74C1FCEA83CD1AA0DA6EEE5F7ABF672DFF39BF8EA3573B9694E952B9FA9EAEC6AECE4DFEFDBC8CB7561FA2DB79839C21FE17B37CC65D230034D50E2148596A8CEFE8E28772CDF40477F9C4B678D61E7FE2384A336572F9AC6531B76B3B7AE91F74C2D614665010B278E24CD7079CB5DA6CE1D8F6F24666B7CF9FA79E47B5CFD6BD9491917290D211AE5DA5B39AA8F836D11BE73CF8B6CAFEFC134C554E29095A631AA3483E68E7EE98358599ECFD6DDF5D2E24AE83AA71BB0786201375D3C8EA24C1D251E952DE962C68AC40D1E79E930F7AE3C8221532F82561761FC946A165FBE80BC0C8D778FCA6074BED0E410359204B3E52CBD0343009DDA40BE2300DA1968C2AABD9FF8969FE384DA52BBF354F65214D482C918F3BF8F5ABEE88C2BD7A99C529AC83A50DB19E44F6BF6B2B539C284AA32A6541692A9DBB23025E0376239ECEB8AD21C84B6B045548ACF27D1F9383CBABD226717A64F06BEAF3D432AF9F04482072716A163F7461A1ADBF1682A39561F56A44F1609459EB6C75F424CCF92CC429F15E3474BCAA84C17195D13212BB5B3C3646D5D177E436771753E05191E46E606500D0F4121066483DF6790E773D00C95DA96309B8EB4D113B649F368BC6BCA084617F82523428826C5559DDD0D5DACAE6D6563FD00B190C9F85C87C5E38A18E613EC606121A5D218843DED26773CB15136B59C5796C3DA5D4770743F5FBB6E012B36EC62FDDEA35C33633853CBB35838A182748F8056240FFB6073377B1B7A8888D94541E689FB4C15331AA73C5767CED8620A33F4447D42E795DD0DD43674D3153668EE8971B0BE959E601F31D3E5410BE794CC4C3F63CA0BC84933C8F6D94CAAC8A6B2240BC7162C14C1F470B08496091ABBEAFBF9C3937B39DC1AC67234662CAC61EACCB10CCBF731BED0C792EA3CBC32684EEA20A6F2ADA6F2940F7512A6364AEF901487C4207380F8DA7F23BEFD2ED735E22C6E5AE5BB30E67F0F2567F4B90769D970E76A01B7854DBEBB7C078F6C6EE0F27913B9A0A648AAA3894D134A632874871D6A7B22ECEF8D1376C402DD7D890699AF9CC591383B873A06E62EC7102D16C269D8CBE1C30DC4234102F17EE2E120038E418FAF90605A29961648A4794CDE5D6071F3E41C0A3C31544DC1D0BC7446743635F7B07CDB61AA8665F3E98BA793A65B44E351F27C06217442A6437E513E7F7E7E27B58D1DDC306F1CB347E690EE111AA442AED32379CBE91E4D1AA58A16FC97F6B4D2D33640558E8D6345319C38A6307045A533AA53D71DE70FCF6F6757733F372F988A6599042351B2337D3CFDEA5EC2C120EF9A50C0B491F9CC195D86CF10B436712BAE13CAAA1D6DFCF0B19DB48685C1208445F389A331CC30B971C1486EBD681C9A1996E02A3C62510C229642E780C9C1967EDAFB061818084B100FF87CE465FB18939F85DF2B0AA371B90A911DE08A228D07C26614BFC783138F108ED9BCB8BD9FBFAEDC415A410157DE742139E90A63867958505940AE57979DED6E7AE30C12CE27796C8622E8D4DEA57744049DBC55A7EF08D1BFBD0BA7E7406A779FEA5E7A1A5AE5253292563286A7FAA9D3DB4FA639C432D835FCBCEFD5437CE58157C113E09B379DCF884C11BDB90C32B154B6559581B8C2FAC630077A84FB8AC877B8CB51D169265E4C378A3E45DAE3B5B98A37CB5DBCE95D25E0571EC7CD560FEE377B5DA4EDD878CC20FECE23D4D6EE271AECC71B0F4AFFBD1E239B604629713DC395B694DAC336B9D16E3E7A5E018BAB33F0383174CD902245225ABE6B631B475BDBB960D22899571D0845B87CD638F6B7B4F2FC8E064616A5130C4679EF828954E679F02B96549CD3FD016A5B43FC7DCD2E164FA96478718EF4F07BFED53AD22C8B09855E29D4A4C6632852AE53A725285AF11D7637F7F397976AC9C9CA627C45812C806DDEDF42381C65414D21D3CAFCCA875F6A0000200049444154D4146532B62C0F552810A1CB083A62DA3CB1B589FF79760F41D1FD27F929315735CF8C73614D163FF9E07CC9F397D90E6187620B7D0C370A8F0B072BD1D7628A5597A06288261221702464EAA2529343C4FB62D2198819BCB2A389FDF50D4C1F3B9AD1A5D982C7C18A4D4D6CACEF66CA82998C189EC398021FF347E54870D6456BBE6884392169F6A60F404A3B0C01744AC3F4CE28121EBF550767A099C8DD95A9DDFD5BD94BF3A0F80BD0465D25E549CFE9964031F19E09AD88DD1D41EE786E272FECEB65CEB8E15C3E6F1C99822B6B09BA9410CB51080B011A47A73B62B3BFBD8FDA6E8BB8E6435544AF9BCB99960D0909E0948BD6415A20C7EE47EC7AAC16741C4E8F81AC8BF927D94EFCE1A9922AF2F0426744008CA390AEC49990A7D077643FAB366C23DAD7836E866857B308665660EA4238CAA5A7C989C7B1B961B8CDD563D2C9D54CC92BD6849091F85B35888A3CAEAA60A4A511B5BCF4471D3C5E0D5553C9F4E86479E368B649567AA6E4302B9AC3917E87BB5EDCCF337B3AE9300DD20CB7655B48720A10152DDD3E254A45BACD6D978E47D38504A949D4D4D8D1D84F6B4F98E2D20AB6377473A4AD13D37298515DCEC8C2743A5B1A29CA30185F9EED1E5351082B69DCF55C2D2B76B611C64758E42824BFC3BD3F81BA996A844F2CA9E2BDF3CA5D0EB5E2A7BD3F427A204D4E2A829E18B54C99BD127C7291AF76A406B7C0F0B8D431C112A93085159B0EF3D8C626BAA37EE296894F084759114A0AB3587AF1F9A4E767621831DE35AE8011593E3C862205934EE66B79B69EFB21804E6D24DF511174F296C37764415C986D9E9BCDFFE9DE7356341CBC9014FA0CB26D4251A90B9A5CFAFDA7D8DB1163FEC4726E3C7F02E542F75D2C7E85672171745100D20CA923BDAEB18FFAEE103D118798EA939AC2C20249B6054B6C160B5797EA762CCE1D146527E3DF63B07B2C8F9DA05BC976E6C4F84ADEDDA920F9B5C0ADCADCB1BC3347654C86C38C620F3BB7EEE4E9B55B88F77649879596CCD144FD0538F2DE124D2662668846B9E7DD65142903EE1D081B2BAF079F306E151D78BAA01F0A4710074315943701B6A02B068E6A6328BA04660C1D5DD389695E7EFCEC3E7EBBA681A8A6BB4A4A22272CD6F6B2A53E21391A47D2F41EFCF044F2552104EB8AFD47F1B0E7681F754D1D8C18399CF4DC6C29AFDAD3D24A5D7B3799012F3347E6C922A5AB8C67D318D4F9C6BD6BD9DBEF47F3A4C973298EF826458DC1062BCEE4020FFFEF9A198CCAB5D17583C35D2A3F796015F9F9994CAB1AC6F8E24C86650A8EB7489988DCB9473E070290AD81303ED5D5CF8E2906CBB7B670DFAA8344A30AC2E550083269AAC9D20B6670C1D29968911E46E76BCCAF2A244D17CE07EE126D08A0CF0D7EBC95A3BE23013ABEED37986BBE7A56DCBF4F36985AF9628CA5BF41C9283FEBCD2C2766FA5C80164B5E1109FF78C50EFE7B85D054B09834A6882F5C3D9780EA6A31A8426847A2AAE0442B44342FDDD138477B821CEA8AD2167288383A9668C490FA0D83531183EE72702A24991E49C2EF2007E7E3B44037BF795CBC6910501FB3FF4E08F9C8E388285E38975AE4191A17946A940614D6ACDFC1332FBD2AC5FC4504DA523417E704654121D0A3A0C5C3FCED8A5274332A2DAD36B705D9D212625A4511938BBC147A44BC2D96F526AA21C0589334324DF5A0796C74250D29DA6608FB409D305EBEF5C45EEEDBD28EA28B494380931B891E97DE76530B7A2CC27D375452E2890B0F1239430989D2B8E1A52B14A7F650832C3C8AF1280C2894161753989381CF11EC89648C6C115132F8FB9666EE5F7B884E4B70B53D9229A1D9624524581C312695A6F3B9774F664C81876D47BAF8CBCA5DBC7A6440AAFC79549B456372B9EDFAA99236D71F5359B7A785BD4DFDB4076DB29508375E38950C8F28FEA9BC54DBC3EF9FDD4D5F5095FA2E79393E162D9ECC94A955F8D52863727D4C2DCF255DF88539A2BE212E36B9DA7A2B7092FABE4311746A63F58E0468612E2B5C57ACA32F20F2D2677D13BCE3A219E8D3BF22859594AC9167FD1489B0D1D581932FB72515CE1EDF58C7832FEFA739AC525494CF799545E405340A33D3F07B451E5380AF800F055B1380ACD21D3269E9138A78367D518B7E11652584E8E57906119B4F88AA05409F84AF775CA73D11469F346F9DA0FC258491E4491272CAEE2464519CA631BF340D3D1E65C5CB5B7876CD3ACC8101C29E2C7A8AA6268A820298937DE3AAA03AF0E9C9B9E4F80DEA7BC2BCD2D0CBBE9E18C3FC1E2616A5B16C7436E3730C8A7D22B72CF2B57EBA438E144DB2359B989A260B80938B3DA4193AAAE6E53F56ECE7771B9A712495528094183F916A107F89EB762DA14A7D0EBF7E572901CD211A17CD1E96648EC8A2AE2AF8E85E4C61AF251CC0FD0A9A484158368EAA21F487064261390C1E7F169B5B4DEE5973504E9E8E88DC45FED889E3885CB4580D1065CAF04CC60F2F62F5F6831C6A17FB098A1F98164C2A54F8DDAD33885926AF1EEEE1CE277772B0DDC4527D646A11DE3DAB9205E3F2C9F2C0C6035DFC6D733326E9548ECC64D6CC7154550C23DB30A9CED1A9CA4F27DD10ADF762B5F6BA769473F26C0F01746AC3FACE046871EF5614C18F16407DCE3691DFADB9C12D1EA6159C3D86C7A0303A19C8897CA8284E25E3B0B547BAF9DC9FD7B1B7A51F5F9A972BE78E65D6E852B2035E3CAA852D8A44B2582872D4C95672C1A5D6B045AAE384944432E9EDE61D9331B004E76301F16BA87BAF1BD4443130E1EC21AF3BA1017DBCC894B0EB1201AE9B00478D3BF25A1F79660D2B5F5E4FD849235A301AD3275AB593A98D44449B3CA7084745514C74094AB1204935702B66A14EBEB47024378ECD96D6547511953FBF7A941DAD3199EEE9366D0CC7E2F6EBA67181D087F6387CEFF97DFC6A6D2B66427848E6BCDD3CD0B19C304E0CC30AF3AD459514A42B1C68EA40B51DE65764135005DF435C86681CB2E404105704DF5A90EF2CDA6206AF369AACDFD784C7D018969FCBB3DBEAE9890B0EBB2601DD4D1CB94C0D4D5A6AB98029FE3BD68494982CC43EA3B21C7EFD91D972E2F8C3CAFD3CB4B10D5BF54A9689E81ED4E241AA720DC60ECF278443766139E3C6955298E3274B8B5396E3A7BA2040814CBDB88EEC82F5214B828E98E8CFDEE37CB2F76F08A05343A5772E408BF7B57E25B1A7DF7F760C664F319E4A7A09DAE86BD0C77FD0A5E1C997FCEC6EC7F2C489B484789D43A6C5AA836DFC7D733D2FEC6E2564AB8CA8C863D2F062C616E75051E095CD0AB2FC2F8B72E2D51B649825C133F912BA12A0C9A8DDFD3B193D275CA6A573B72B24F446EFAE5BB4728125A91572D29AA23CBD0B82966D72EFDF9EE5C557B713CDAA20965526B5AF4FD85E97E23E36750DAA6A0A7B9A7E3E35B3840F4CCAC2346D9E3C12E4AEF54DB4C404854E3ACBCA22E5C46C9B5BE7D7505D94C15D6B0FF0D8AEDE04C73C419191E74B8C91046B1182C7A9CED2C9F4281CEDE8265DD3B86E5C0E73CBBDA489DCBE6AB85DE58A22036FDD8EC963ACAA1BE0DE2DFD34F40BB08DA31BC2515C914D311298ED845C68623674D34F8A9B6E11558664DA494CB4D24B50919CEE5B6697E231749EDBD9C6B6237D325217CB2D2B1E45D72C0A32BD9C377638D3A68EA17098900A35199EA95095EBA338C38F5F7F2DBFF95851E1EC3EC02739DA1040A736C4EF688076822DC437FC80F8EE3F21D21EE76C33D2D14AE7635CF04B372FFD4FD844E55ED0ED9AFAA3BC72A89D5F3EB7978DF59D6478BC9415E673D99C6ACAF3B2C8F31B3267E936C02473ACAFAFD00F8A9BDDC0F5358A652E5E253C0693E09EC88D1C67D489A324402D21D2EF8275721B4CBB3B9EB7B66C9BDFDEF70F5EAE6DC4CCAF266E641D97C23BF6E1C1087D62A63ED147E99E2432C08D130BF8C49C323AFA42FC6A7D13AB1A22C445FA22999B7104788629CF36C8494BA3AE2B4297C0D2E48A4102B2E0AF25E7AC44342DA9273109D46267BFE2704985C10D13F3C822445B44677D53AF34899D9067303ADF900C9A27F60EF0A76DFD745BE2DF9614E777437E573A5644FA72D844ADE1585F51621CA59F43625A4C5C9334E1722C32B430AA6A108C2239CD8E6D636830B22C8BCA91C58CAE2CA6B424879C804A40B1284833985C964196474BF262FED708F343009D1A48BCA3015A1A69069BB00EFC9DF8965FE2F49D3D8BACD70DAF28CE154E43CD1D833EF5F328E75CF43F69122AA854710EB60DD0D617A1351467435D072B763648C3509FE1252DDDCBB0EC348A7202146405282BC8425745AE34017449C3D1632965F7D8B2A162502419883631A3F1E7F8E35D3C31EA77123864C4EC724D8E83B350AB4BFC549CE38446C6041089F1932C0C79009BE756ADA525A262F9B2254809B6810BED8949258995493A59E2E7C9CE4B37E214A4064B6A550CCFD088991607FB1DFAE309EC4D9C4B90142CC1F1156A88526E5314C404748AF4C2F1CECBE48426D4E9A45D97B85E995E71ADA544AE789861511550284C536818B0D8D32BEA9FC262CB6464965772940FF798D4851462028005BF5D887927274BD16E243D055D435A29C1EA0EEAB1BFE5E429CF271644E25BB1F0192AB99959E4650618599E4F69491E693E8F6C7F0F786DF2B2FC146779A54468815FC3A722E975018FB04E73574567E288921ABC9C7AAF21804E6D04DFD9009D1C837898F8E69F13DFFCDF08C3D973BAA9064A7A29FAE48FA14F3D87F9EF647E22F1A225B156D83BF5454C56EE6FE7E57D4DBC7AB0833D4D4182111BC3D0D07D3A395969927D20013A918E108713AD2D2E68BB9B649008A8B51D2EF0EFE08B590F5365EF256CE92CEDBA936E2B4D5E45F233C9683919272763E7C1491141B2139B889F05DB4D80A3E5C4B96C5A19934797A32B22FF291201EE5E492A4572A290E792AA6BC92B4C80996B9AE2325964938F9B6291FA2512DC0400BB91B1C8F10A3D1301B871D13822D3406E94ECA6710605CFC9F191054357E3C2E594BB1387885A85B9AA6EBBCC0E29572A24525553E0289663B8632C9833096D8D586212702738C16116809FE430278E993C76C22DE518688B2F58B1C8C90E503AAC8874BF419A17B94AD245D38F62519CA35390E1931D94E9BA60B124925B623C4E103C7AB384D5B97B5386003AB5B1FDD70068F9D2DA44EF9F8DDDBE3DB59139C3BD04481BE7FF04ADF232295F7AB6373766158821F29DE2E5B66405DEC56B0122AA9070A7251C67D59E4656ED6E626FF3004D5DFD0C44E238B228E482B0CC838A3A9BEA46A14923EE2408E66B7DFC34EF4EE67977CA1F0985B5C7C3F3F88F9E0F21F806F2B3C97487B48B7217EF026865DC294E25FF08817B910756E4D25FF8FF698235615B7CE0C209D494E5488A9CD09493544089D1C7F3A4121A251E27D20F12705C6790E426582BF26A1202F92E8F595C872D8B80627F01D0925F2D8B716E87A2EB66ED46ED525AFF58E2DC1D4B39A5481D6B710DEED8B9B9E204584BE016002D605A3407895A847B9D72A2905720181F6EB47CFC04AA7B4F897B914D408955CBF1C9CFDD475CA725CF6B4BA716C7114A243601CD20434CBC3E4DF2AD856FA084643131C9F11F5C5F48145C4FD08C3D6995E06C3FB2271C6F08A0531BDE7F1D8016E9436134BBE72F38C1E604952AB5413AEDBD743F5AD565E8533E235BC4153DE04A979E35A10C1798DC629B28048AB84E808D6B3C2A5F4CA1D0868268DBE989DA74F447E80D9928826A702CA79C04D004208ACF5911887693D6B38BC2DD3F23D0B951024372B38D4CBAC67E9C9E9A8FA37A335165C12B015C09F84970014EB8DD2458BBD8EB829EAA3804445E54152C08F77E04582663E82458CADF25532E890B3996914844FEC7FCC513FF76FF72514F46D072C044A12DB9424870B49379F564149E484027825E773293BF4BD8DF0E5A7D24AF4174F3090075F984EEA4E0AE5092D1BDDBAA2E521C6E047EEC72DC887FD00FA4A8913CDF71F094BF561DA9E1E15515C95B1634BF0C8F815F97EE88C70EE84273227F7D02FEBEBE187CDACFF7197C7008A0531BBC7F298096AF8E1924F6C40DD80D2F9EB34696930DBD225C98ABDF835E733D4A76154A7A596ADFD05BD86B70F34812CC8EBD9BC9B6EE24C56E70C13E991F112F756C00A7FF28D6E127A4F8D49B6D6AC95C8C853F411D2678CB2772AA8F058A83EB7BAF39E071B878839D5E7B11830027195F9F78EF83412D71DC934C8A278B1B8F657812BF749B24075DDBF165CA2016CCB1B03771A583417070C224F9EBD74A779EB84F72184FBCEDE43113CC9CC4BCE3AE33DCEB9314C91312FEC78BC1C99F9FCBEEC0377B5606FF7E08A0531BAD7F39809620DD7F14F385CF611D7E32B5513A8B7B295278E95234D1E4925DFD4F310348468D6E92F5D8EBFCBABB72C21DC477FD1167DF23D8ED5B53BB6B45C558F07DF4C99F76696C12CF12803128FA3BE5C14EB9BA3E19609FC9523CC5E3BDD16E8327A093D8CAA43EC5B8D3CAB1FD4F2264754286E558642C47F778F35062F5343861F2465F9ADB8872266398DA2391CA5E43009DCA28BD83E44653BBDDC45EA230D3B08AE8DF2F3FEBD2A4295D87607C94CC412D5B885A3453B23F8410D3B9DA8E4764C948EDC497546868DBCDEBB18FBE407CE7DD6F7965A18DBA127DEE7FA266559EF5F4CDC9A3C8D31DA9D742E85906AB5321742A1E6129CE1F8366D8B33B34A73BA4A7F9B921804E6DE0FE252368198744BAB0F63D2C41C9AA7B4A0AF4FCD337CD8B923902357F028A2FD73DBDC85B8FBD113577EC391364B2F63D84D3B91327DCE946BCE14EECF66D38FDF5098EEF5B1C094F065AE902B45157A38DBE4EB62E27530F291D2965704AE968A9EF94F2798FEF783C33742A707F83387A505A69F05E838F3438F374F21B1994BE4970CEFFAF44C5A90FFC90607FAA63F52F0BD02E3259523BDADCF853ACFD8F9C5567F054BF80D7EDA7EAAEBE477A99747351726BE41F35BBF2F40C6CC53DF61DC16EDF21EFD56ED980DDB60527DC7ED69B770473C5B3E47F50472C3BEDDB1FFAE0BFC6080C45D0A97DCFFFDA002D41DA96AC8ED88A0FB985C3FF2B9BD075105AC8423E53F7CBBFD5FC4912B41105C761534E79A52212B69BD7E2F4D563F71C74279E7848AE1284F38C6BB1716E3625B302DF07F79E9B830F1DF51D330243009DDA573904D089718ABFFA23E21B7F8213EB4B6DE4FE37F63AE696224AF66FA0F9215B82651FE03905E3530D81EFD6032819679FA5F2BF31E443E73C37233004D0A98DEB1040BF669CE23BEE26FEF23771A23DA98DE0D05EAF1F01D5409F702BC6C21F82E61B1AA1A11178DD080C01746A0FC510409F649CEC96F5C41E7D979B0E18DA4E6B04145F0EFA8CAFA24FFC1818C2B6EA9FBF59B643DC168D1DAA94003D934D3492C4E289261551CBD514A96732B49DDE080C01746AE33604D0271B27A125BDE107D81D3BB17BF6E3F4EC97EDC843DB5B1B0125AB1263C10FD0AA2E3FF6C14387EBC98AB69ED095F86647D5F38713C82B427B0340EC0BC739DA1922337494EC78171E3B422866138C5964FB7514C34B9BA78C3E238FD2FFDFDE79874759657FFC3BBD646632994C7A01124A48082194109080D2150404042C14CBEAAA587077ADBBBABA826B57102B82B00A48D31510842010405A2091165A422009E965D22799F27BEE1D3229A4CC40767F3BCEB9CFC31F64EEFBBEF77ECEE4FBDE9C7BCEB9DE4AE855D2361FCBC2B8AF96D5A0C4500DAFFA0278D7E5C164AA4769553D98E8B32066AD4202B15C8962893F2A255A786A5408D0CADB15EDBCB25A949596C2B7F68AFDD9F54229AA852A54893D11E4EB05AD87C491E871FEE2C92BAD41655909BC4C8590F0D2A6B65629D2A0D623005DFD34908AED074CF2CFCE67E6C2B3361712763C582BAD9E9D1A2E54A256A28140AE81BF56CED3C83B3B7C9A04BAA36FBDED7312E8F638996A60CEDA03D3E185B0E4273B46947A351290282119F81788E35EE43FAB335B7170E90BF0339CB295D874B05D89B80FEA4193D12F4405590BC13199ADC828A8C4F9F42C18D20EA07BE15E04D4654165A96876F71AA102E9CABEC854F482266A38A68CECDFE6D37F39958FA28C53C0A523E85A9386D09AF3FCF4F096AD4AA842A6220279F2AE30870CC49851B7C0DBD3A3CDFBAE4ABA0C8F946F106DD867EF532354C220D1A350160CF49D8C4923A2F98ABFA3565A69C4D65D87E075612B826B2F4261A9B65F522809C0C9C049881E320203BA6979E53BD6D8BB65C7D2D711547A1C326BEB61A546811CE5622D0CF24094EAA2A1098F41CFB01084F9A9788A7967351268C748924077C4C96AE6F53B4C47DEB41D9FF51F8C80E86828AEF4B940E10D51C47D1047CD83C03B920F3DCF6084E4E33110189D731D6DF2BA1FE74326E391E18108F751345BCD5DB86AC06F4989D067EF4158D549A8CCED6FF2D60AE4C8D4F483E8AE45181C76EDD4962660734B6B70F8EB7FA24BED3904D56640CC0AF577D0D8AA334F1A8A8C417FC290C1B1F0F7644767356F6C85FFF9F65398716201D4E6EB2B2AB2B322777A4EC1A8079E819F57DB22DF70D7E2A2221CFEFA6D0C2EDFD5E2741C7698B70807D4637038F47E4C1E188CF8300DBFACB0A20E82256321ACED78239C15912A11FBE0AA220CF921A33164D46884FAA83B42E1F0E724D08EA12281768093B5B694AFA0CDA757C29CFEC38D257338F09CDF4B17A1361CA2B89720EA320602A5AF7D5A978A6AA0F97C9CD302BDD1EB7EFCAABD1DB3E2FC30BAB797DDD551536F41C6A144089396426FBCCA8BE13BD2D89FF04B23BFC0D8984024F4D4DAFDD317F3CA71E8781AC61C7E1A925656CC1DDD3B4D198B63114F60FAAD7D10A86DEE42C929356243E231CC38FD17C82CAD1F1E512AF2C6D6B88F317B4418BC942D4E9469F27096CC62C8BA00C3F2475A157B765CD651D52DD8E03517A3FA06E2DEC17EFCEA1BE1CF84BA48E2879CB8673068F8ADD028DA1E57477C9A7E4E02ED182D1268C738D9925A6A8AF83FD389CF613EBD0230B7EEC773F496BFB77E028907C403FFCCB30979981D3F84B5B1B5148862B10F1235139121EBD92E0A83480B9354831903FD3026D226D0C51546ECDAB50FFD2E7E05EFF2F3CD56917BD4E391EC3194FB724D1041CC4E3C178830B16C3D226A4FA15628C7AB418BE1A5D5E0EE81BE18D855836DC7B3E199BC0CFE4547A133E6DAC7735AD10FEC7E9542352FEBDA508E55663522ACF63CA694ADB6F735438412890F4E77BB0FA3A7CD8246D1180A995D5A8B4D89C7703717689B7B81CD3B47DA0509153BF9FF59E1A3D7821743E71F88BF4DECDAA6CF9DFDD2AEFD2111779E64AE232B7E55DDC67DCA31D547B82BA641A0D77BCDC56DD101981DEFDFAA40B7E42FB318799D0FEFFA224C2B5D05B5A571A57D41D51FFB42E6213CA217EE8ABDF9B20424D08EFDF693403BC6A9792F530D2C3907507FE0A5FF5A7DE91B19E67FF31A61403C24C31642E837B0CD14F596029D2F0904735F9C91F7ED70A8CC8FFADCF850F4F453C26CB62231E512EAF6AFC42D255B9A89F3173ECFE2A22C02CCB7CB1ADB57948A84A8B758A1AC37A0A7F10C2697ADC622FFB721947BE0AE583D8234429CDDBB0D83339743632AB18FA54E20E52F90ED9E77D9CF6254B033A57855552B826AD331B5601982EB9A9F1C5F2CF5C78E5BBEC41F4704DA45B635813EA388C125594F4C285B6F7FE62B811FC1ACF6C5A3C383B8CFBDB57631BF0A9BBFDF8CB957DFE61F3386CCE73EA2FC67EE5B7654A09BF2679B89CCBDCF8ECE62FB03D1352978A8E843FBE3D94A7AA9DF8BB8AAE983CF67F7EAD05E1D752081EE8890ED731268C738B5DA8B1519321D5E04135F4DDB0E0875AF2600441288639FE22B6781EC7A9F6E531E6D09F4798F180C0BF744400BB740D36BBBFB2810EEABE41B55ECC081CFD6ECC4942B1F40672EB2773309C4F86BE0125489D43C9A22CC478101A16AF86924A8309A7128C380ABA5B5A8AFAD42B54506854C8229B17AD4D75643B3E72D44571EB66F5E32713EE431025BB577A346A4844A2A420F3F056EEFE3CD43EC58D8DD85DC4A9C3B9284D1856B115A77C93E0EF67278ABC797B86B803F6E8BF0E23F6F4BA0D3E47D31D1B0DEBEAADEE639153BB49331384C87C76E0B6A35A263E5AE73084E5E82D8AA5FED02ED61A9C0AD3721D07D823C302AC20B4595F53C9C30EBEC09DC9BF697662FBF75BA0770C0E356AC7A38FAA6A33A48A01D530A1268C738B5D9CB5A990373DAB7305FDEC153C6D941B53CB5FAF7DC58BD105D044F4117068F80B8EF23FC40828E5A7B02FDCCA860C4863AB609F5536A1EAAF72EC7C8E20D4D56BB32EC578FC216ED0C683C9898DBC4B4A79FA2D9B0982F78EB89627E502C2B783F2E4A07D1A58350EE5F0C7DDD55DE97B91AD8EA7699FE2928140A84EAE4981AAB474F7F8F66F1D4CCDD71E862092EEF5A8DA1F91BEC1B94B54205FE11F43EC24303F05042203FE5A42D81FE453D01B71B3622CC6873D3303FF412FF9720D387E0A9512108D2367713B150BDE5EB133137E79F3C72833DEBDFDA7BA033156278C5CE1B5E410F09D360F6107F782A6CA7FFD4E45F42D6E78F416F2AB0F3DBAF1A8DEFBDEEC59B3322E1EFD976986247DF037EFF9A1AAC5A95823F3E7694775FBD7A14A64FEB0589A4737CDC8E8CC115FA904077A2952CC5A7613EBB9657C863F530D80AFB77D54452B05A1BAC0E8864E45208A48E096A0383CE12E867971DC0F3597F6AB69197A28CC78F5E335129F7C313B705A37F68EBEE8186B1B07866A3C9761C57F5B67721485E6B375595508D0FFDFF863C712017F0FBE3FDDB4C74A93359F06372367CF6BD8DA88A43EC5447D40964F8D26701323CA23131468FA9B13EC829BBDE07CD5E02ABF44F20BE722FC618FE0D0F8B2DBAE5B06A3836783F88F89E7AFC2121D03E2E16FBFCD1D6B318F9DB2BE85297CE7F7E5C19CF5F4A432B7F41424562A7097459411E5296BF8A986A9B80B296AA8CC35ADD83981C1F8E097DBD6FEAAB4D02ED183E1268C73839D58B9D7BC80A2F99CEFC0B5656AC88152A72F126F0898128E4560883D9BF040824ED0B606BD36D4FA01F1A16803E81CDC3CB989B4229634761358FBFFDE0D335989BFB8EFD116CC5FB8DF7A348560E45989F075E696783ADE5B8AE9619B940EBD236DA3FCA90F5C227BE7F419D508E3BFA78DBA320DA32E1EED3F928DFB302830A37436EA9814920C166ED0CECD38C45422F3DEE89F3454955FD759B844CA057FA3C8900731EA6172D47B031833FC220F2C23BFE6FA0778F103C39B2B1A6C9A5A26AACDBB20F0F5DFA2B77C5B0D573A27A029234E331CEF0038675A24057E667E1DCB23FA39BF1827DDA49EAB1F8413B0B63FB0674C8A4A3AF3B097447846C9F93403BC6C9F95EA66A58F28EF2D29E96AB0760C9DE0FABB1D4F9FBFC3F5F2150FA4018780B449173210ABDEDA66A6BB414E832910E3F7B4EC119652C220294D0B5082D1388C4080BF641BFAE5ECD328D535614000018B149444154E27E78F7650C2FDF6627C3922B56EA1FC329457FCC1FC9E27E3D1DA6969653C105BADB95CDF66B0EA846F28D37AB58863BFB7A63DA80C650C1D66E7CEC5219D2776F40FC956FA0B294DBE29055A3B0D96B167A87EA704F9C1F3F65A66514071768DFA721170B3035FF0B44571E811066B0B8EAF55EF36089BA1D4F8DE96A7FE47707B3E0F9EB12C41912F9CF7224A1D8A09B831C59379B4097778E8B83B96E8A2F9F43EDD70F43696974D7ADD13D8C43AA044C1BE08F293719C94102EDD8579404DA314E37DECB6C84B5221B564306ACA61AA09E09F76198D3BE81B5AE79B6DB8D3FA4F3AE64BE65E657E6E54CE53AB0D03996B2CD6A3D4374737EC79602CD36F58AC5BE2817B15864C1751B4F15224F9CF31D8DA8F8040CEEEEC5A331583BB8682E7AD59EB44F3A57128CF5BAB9B828EB85A5F745D8FDA88E50399651C2053A2A7FBBBDFB6A2E44C3E1AD9261D6205F0C096F5FF02F1454E3D09EBDB8E5EC07D09A8AF849E1A714B158A97F027EDE6ADC3FD81F5AA5A855815EE5FB34A2BAE8A02E3A8D11E73FE469DBEC2F824BB21ED81FFE38C60E1F80C86B7F59FCB8760D62CE7DC1639FD9EA394935063B3577422E93624CE9460C2EDD71C32E0E1631323652875A9305E72FE5A14FD60674496FF4F15F968563ADEE21E44842F0F74961E8EEDBDCB7EF08EBA67D48A01D234602ED18A7CEEBC5E2A98D06580D9760C93F064BD62E5872F6DB4F37E9BC07397727A1771F08BB8E85387236A0F4B3F997859DBB61E36CA2044FDCD04E87A8CF38CC880B828FDA369E33AF4F84BFC9B6A1C7DA39791FB0641626D45FCEE905A5B49D52AC2DB01CB958CC05BA6FE1CFF64F3EF57D1E698A6874F5566076BC1F7AF9B75FEC29D760C44F49BF21E1B7D7A0AFCBE5029B268FC6329F67E0A154F2CDB7602F699B023D2E360825A5E5884A7E13BDAA52F969E02C1264B7D714486F9983E9037CF90A3CFBCBC7A1CA39C237130BC57EDCCF9D270902D34AB6613AA0D8B9303BF617CC2ECD44B048120F99107E0A337415E98828DE037FE365EEAE6968EB74F370C86338EA0552AC7CB0F74D178A228176ECF79304DA314EFF815E565B46A2B90E96A2933067ED8535FF082C45A7612DCFFC0F3CAFC52DD90100BEFD210A1D0551F72910A8436C2BE4FF6079506705BA214E57DA7D08EE8BF747E0B588868BAF8D6D165EC7123E98406749BBE18B3911372DD05FEBE723C5231E11FE4ACC19128010DDF5A9DB4D695E2EAEC59EA443B8E5D45BD0D5E7F31574B2C72D60A22653D8043A54276B53A06FEF1F0C9D4288EC7D9B303A7BD9B5CD4F014E7A0CC2B1FE2FE39E41BEA8349AA15AF3006425369FF0554908DEF37F0D66910C7E0A2B4614AE775AA0D98B84F9CB994B8635E6E967BE6D96D8C35E020D8D25F92CD7CFC709C54048C5222C9F1771D3DF4F1268C71092403BC6E9BFDACB929D0473DE11A0240D968254582AB23AE5F942EF4808BC7A40DCE76108030677CA3D9DB9494B812E11EBF1A3E74C1CF318C2DD1B2D4BF188AC661E151115AAC37D83FDECA15D4717DD8BF0DAB3F647174802C0B2E6CECB23F1F99CDE4E097472BA6D05DDA7A07105CDA222767A4E4254A00AF386FA77185296965B8594DD3F63C8C54FE0692AE1598B873D12B0D16B36E44A0FDC1FEFD7A1402774F7C4F25FCEE3FE944721BF56F8E8A4A23FD687FE19B3E2FC915F548ABE7B16C0BBC656092F4BDA15EFF8FF036291087E4A0B12F29D17E8B66CC75E306C0ECC05C53228F7AAC6E1B07A38CC120FF8AA25786B5AB833666FB52F09B4630849A01DE344BD3A81409B511CCA18EED36C88C16DF9A861DD3D798C7443C9CBED6F3D83B8AAA4C6151E8458A17F12BF29073ABD823E9D5DCE053A3C6B8BFD7E29CAC158E3FD07E8759EB82FDE0FD141ED47AC24A515A264CF2A0CCAFF9EC7263337C05AEF87705439147E1A195F41EB55E27657D07744EB702ABB02A1DFDC09519D2DDCEEA2AC37BED1FF1152AD2F220DBF6254EE2AEE7FB66D428EC446DD3C0CECA286B7CC0C6DCAD74EAFA0596A3AF3F3570B9B47CFE48B0371411E89C3AA04B0841DC63D4023C59CA1FEFCA5D51965B049A01DFB852281768C13F5EA04029D1507FDF5E20F31A96855B311FDDBEB1EEC538DC6C773FB3AB58266892B55DBDE85FE6C63981D8B8EF8C0FF555EE3994560C475B355836BADD59BADD872F40A3CF7BD87E8CA8360AB7EA350CE57B7F9E2009EE4C256D09E8AB63709998B8309342B075AFCDE4428ABF3F8A3988FF827ED349C500EC2F4929588AD3EC4EFCFE2AC3FF17D0E59CA081E8FAC1699519FF485D302CD7CFC3F6A67F2BA254D1BAB3362821816A188676E0678CA3073A02F58B6617B35B99DF98A90403B468B04DA314ED4AB1308749640BFFDAF5D9891B1101A73E3B164D9D2AED8EC390393A6DC81E890B605B5E534AAEBCC28D9BE14D263DF72DF2B6B4C0057E8E7E38A672C26F5F7E31989AD3596EE7D2EB71267F6ED40F485E57C839035B6C1F762D0A75CE00677D370F70C7B4E6B61762C8AA341A059ADEB759F2DC6C8ABABB86B87B919CEC9A2902E8F405CD53EF8D6DBEE9FAA1CC4135C82F52A5E08E972BE01757B9D17E8A6B538FC3552BE19DAB4DE365B392BA54244F87BA0A7BF1252AA07DD09BF05CEDD8204DA395ED4FB26087496406F3C9809E9C12F704B5963681C1BD679791476F57E112F4CEEDDE64AAFCA68464A463182F54A74F5B1B92E4EEFDE02D9FE8FA1ABB7657EB2CD33B6E1B8CEFB21C4F48FC1CCC18DD97C4DA75F60A8C5FE7D071172F22B84D5A4D937D65826E28BC19FF00DB53B63BC79F5B7B652BD5B0AF4A24DA770D7E917E057DF18A5D2F4994CB417F9BF89324530CF729C31D0173B4FE4DEB440B74CF5BE09333B7429ADA01DC244892A8E61A25E9D41A0B3043AB7AC16ABD76DC1AC9C0FA1B0366669B24DADCFFC5F44BFB8384C1A1074DD908FA697E0646631B417B6C210311953E242789D8CCD072F40BF67217AD69CB48B2CF323335FB479E8C3B863D8F5C58158AAF885F3E9C8FFE96344180E354B3B672E8355FAC7D14527E7197751811E0E0BF496947C54EEFD0A634B1A63909B4E8455EAFBD4F72F50AB5578747820BFF78EDFDC53A0338FE663D93BC770BE85A5C57231A6BE3416D33B0A363118B0F5BB935899D85856F5AD1563D0CDA3A3F0520B3233B3F0F1375578F0A9484436F983EDC4D73BF0C64FED1FF220556AF1E8BB4391A0EFF8B78A56D01D33A21E9D44A02D813EA78CC1A8DE5E3CD2A1B5D6C3578960AFC6CFEACD16FC78E02C5447BEC2A0F2DDCD2E2994F8E357DD9DC80A198750AD185DFCD4FC6CC122430DB4977F41CFC2DDD0D417E3C3AEEFA247908EFB70F34BAB91BBF73BC45D5D0B0F73E3692F2C4331D96F32F2226620CC4F8D10BD12ACF6467E791D2E6415C133F7286EBDB4D45E898E0DA45CA8C552BF1790270DC6A0AE1A5E729495F2747405CDAAC9BDBF26090BB25FE0FEE6966DA5F71338E63118C13A055E9FD48DDFDBDD04BAB622137F1F73085B4B8DC8BC508696E7F3088402F41BD70B1FAD1CD7AA08D657D7E3B34736E29B320D6E9DD20BD3FAAA80736731FBA533903C380EA75E0B6BF71BBFEBF5B57866A710C1B70FC2BAE7BA41CDEB4B55E3E7D7F7E0B92F2EE2C4D5B6AB5AF67E7C0C563DE08F6ED13A783B90F74502DD49E243B7E998404B8166E15C6C43CD2C10F3129E2C9BB0B596E47337EAFB4EC1A47EBE50CB6D31BBC67A334E5FCAC7956DCB30BCF8876697311F729D5006E632158984B058ACBC3CA8D86CE42B5D9685F7B7A025B04A143C957B528C378A0C5558BB331513CFBDC12BC33534B6923689E4FC3E7C83CC6A85D90A98CC16882CF5CD4E47F9513B0BC714F13048BD111BCAC439080AA92DFBD1518166BFDABB4EE5A3F097551857B4A6D9BCD88A9E654C560A35E8E1ABC0AB93BAF1CFDD45A073362562F8B399C0E0FED8BC24026D2D40CB3727A2D76397A18E0EC193AF24E01F931BF6102AB072E646BC711C48393C03D55621942A295432216032A1C4500293C40BBE9AD657D0A3466D42E433133162D3A778F9B81E9B0FDD839E0A9B7D4F9CB022506F84556C81E16432E21EBE82E7BF9C8A075A943A97A8E4F052767CE66483E149A03BD615EAD149049C4D546978ECBFB5B3B0DF6B02660F0D44420FADDDBFCCDC0CE947F7C2B8F34304D465F38DB58E1AF32FB3C35E5F095A0CAB588A89D1DEFC54159B881AF1C996542CB8381F42ABE5BAB3FEDABA377BD1B01AD41FFB3C8FABD250BEB1F6CEF4EED02A6DA53B9D1168D6979D5FF8EEAA1D987FF535FBC625FBF932FD029C50C64220102236448567C7DA4ABCFEFE05DA8AEC1FF662FC82B3F826F501845D48C6B0B864844FEE8EEFBF9F709D592CC63AFCF4EA5ADCB94E8A67FE391A1FCCD0C354978337E276E0ADB42ACCDF361FEF8CECE89BD2F8B9C564C191CF7E42D9E4788C0E16E2ADC1FFC206930F528EDF7BFD4D2C16AC7EE4337C103E09475F6C2C74E5F8D39AF72481BE5172749DD304CA6BCC28FB6832A435C54E5DBB597B37F669C66174A4370F7B6B7ABAF4E18BC5D8FEEB694415EC44644D2ABC4D05FCF8A7968DC5FC321165A16F7BD5E378CC345B8D4FE9E783F17D74F6EE39A57558F7CDB74830FC0CBDB980C735B7753E215BA99789BD705A1E8B7DEA512812FB412814A2979F122F4FE8D26C082C9C6F7DE2714C3DF322AF1BCD5E14279503F0ADCFE3B8E35A985D43040573A3ACDD710C61BF7DCAE7C41ACBF8FBC8EF65644AC3E12113E381A10118126E737E269ECC43D5DE151850B40D4A4B252FB67444351CDF6BEF6D76E415CB78947E3E11B25ADBA9312C4D7C83D71C9C9347E17F7A93D05C84AF9F388CF484A17879A60A079EFF166397D461FAFD43F1DDF23EAD88A419A95B93307041019E7D7B34DE9EEA8577EFDA8A85BFE461E43B7761E3230E387FF95D2DA82A29C3D6A5C9F83C558EA5EF0F4278F96F18187304C27E3D91727C7C8B675B50FADD76043F7A05DFA5FD111303AE7D6CB6C02410F08585B3E7A293403B2515D4F96609ECDEF26F54A6A7C068B2F0F3FD1C692715B1C890F7C29D7DF598D6DF87BB431A1A5B451F4C372035B304A82A45B7F4F5F0AACBBBEEDE9542159255C3F87D2C4229BAFA78204C2FE7279E34F56FB3FB7E989805182BE0517C0E3E85C7E063CCBE6E98EC7C42162F7D54958052B11E569104DD7C943CD36E5A7F5F7BDD90860B0D3526FC7CFC0A7A64AC4775561AEA8552B04CC1E3EA04DCD5DF0FE3A3BDED616C2C1EFA6C8E01670F24C23F63339F0BCBBADCAE998272890E51412A3C3D2A180A89ED4FE5333906649F3A0ED5A5DD4059362A042AFE0262E7298EE9E3C7E3B0596363C8FC6131AA2F9FE46E1F1666B75B339E8F7F780F2D2F0CA5B956B0DF11BBDC4C1FA7A2380C065CAC9221D0478E334947F0D7F18791332E120BFE36140F0EBEBE6893D564C2DE553BF0F02639DEFDC740C48A4BF1D81B69A88C08C7B697D80BCE011783C984D2A222ECDD968D9F4F8A30677E6F0C0913E3C86B6B11FF4619864D4A40D2C6986B08EA9092528CFC82526C7D7937569C1360C3868695BD18BD033CA0EEA9825A2E4647DB8F2D999240DFCCB78CAEBD2102EB930B70B1A006D5751DBB241A1EE02113F1F303D999846DB8AAB9006D3856809CB23AF004943A33F76BB3F70013248D5CCC8FD50AD6CA30A99F1E7A55DBBF2E6C157BEA6A150E6794E37C7E0DAFE7CC0AE637D4A66E78B7B07BB0534FFC3D259810AD6FE6D6680D0EDB045CB8F5326AEA6D1B80BE6A29A6F6F741DF60765A4BF3F55546610D561FC9479EA1CEFE6C768C1713D286BA244D9F919C59819D674A70B9C476282D2B1AC542F1D8BF86C69EBFEA601E77E7B0D86C9140C0398C89D421AE9BBA5959D71B32AE83173925D04DEE19ABFB0CE7BC7DF1F5F6A998D146C679EDD56CBCFEC42F502E988CA7038AF1C6B349C8888BC3070B2210AC6A5F9C57AC3803639D19A8ADC585D3B9C8D20461648F86DDBC1AEC5B7C04EB2F8BF0E8EA795832C9F672284DCFC2276FFD8AF7D6E4A3B44A8D898F7641A3734389BBEFEE8191236FEC8003126807BF50D4ADF30830F1CB35D4A1B6DE71816685FB59324553F7466B232AAF35A1A0BC9E0B50598D893F83EDEDB14367BD144CA09998B28D21C72ADE95569B905E5083C2CA3AB0ACC1B26A5B0815BB1FBB878F5A8A102F19BC55920EC7D630DEA399155C1C1B049AA5B9B7362FC689CD23AFDCF66CF67208F751B4591B84ADBCAF14D772816652CF04BA9B5ECEC7D6B4B128942CF602339AF93D994077F196F339FDB7DA0D09B4211F5E5DB761ECA2F1F8F2317FB49E8E54839DAF6EC1A2CD22AC39743B2EAC3C84057F3D813F7C31110F4C0E477B8113977F4945DFC9FB515E757DF44C532E72B516EFFE3A174F44D97E5A9C568C038B93307F7536AC4313B06F5B3F3456F1BE39A224D037C78FAEFE1F26C0048B7DC18542F095A1B3FEBFD6A656516BE22B72994808D97F51D0FE8731DFD0D09C17E85A1C782F11E376E890B271287AB45A1EA51A89FFDC83173ECE44FFE7A660C9340196FC3511AFAC2CC1EAEF2762CAE4F68A3C95E1C0A622641973F1E97DA938DBB52B9E59D4B399D0161F48C5735FE643A80CC7A6EC0918DBA40AED63776DC18AD47A7CB4711C1EEDDF7E795A678091403B438BFA120122D029049C13E85A1CF8F4573CF7561A5EFBE17E8CEED7CA010AC55998F77436C63D158A6E56118223FD21CFBC84BF3FB9054B932C58F6FD44CC991CDEC2075C8375EBCE23C5A0C5FCFB03A03119316DFA16F49C702B1E1CA142AF18359A9691DAF2CC7798F9691E4483E2717CFF6074BF462273572AE6BE9F8B898F0FC01FC7FB40DD8929F124D09DF275A39B100122E00C016704BAE4502A1E7AEA30361FD7A3A86812B4DAA62E9B726CFEFB212CFC3C03FF5C3309838707E25A68322A2F6661D19FB7E3CD1FABE1A9EB820FF68EC6EC28158475F5D8F5F6F798F79901C366F5C2CBAF0E45A44A8C948F3662E4F1EEC8FE32069EADE44CAD9EB71A0FAF2E8464E4309CDA3E00216CC2E585F8ECF9BD7875BF0ACB360DC7841E4A34388AAA2F5FC5C7EBD3A18B8FC1C3C31CAF0FD3942309B433DF2AEA4B048840A7107058A0AD65F8EED9BD78FEA34C5CEE1B8D82DD09D0AAD8FE81199BB79CC6CC59FB20888FC486C5F19814D3BC6C2A5087D4F5C9F8D39F92B13BC7DA2CB2472291A2CFA8287CB86A3886EB01EBB163E83FF32866AE7F002FC4B69ED1BAE681D578E8DB424015802F5367E0BE50C0907A16CF3E9B84157B6A9A1C710088C44208BBFAE1C94523F1DE7447C3FAAE474B02DD295F37BA09112002CE107058A07372B070E111ACDCD5582FA3E1393D8786E295F76F439C57FB4F4EFFE9285E7AF70C52726CFDD46A298E25DFD3ECA2D3AB77E3A98FAE60F1CE7B10A5697D2B3177F31E4C78F90A4CFDC2B0F0E918DC3940CD725A7174E551BCB6341DE70DB65BCA3CA458B8F51E4C6A888376064C8BBE24D037018F2E250244E0C60830815EBD3A150B9E3DC66FF0D557233165720F4824CE460ADFD8F35DE52A126857B1148D9308FC8E08D4D6D6E2C08173F8FE87743EAB39B363111B1B4C024D2BE8DFD1B79CA642045C9480D168446E6E2ECACA6C872E04070743ABD5422C6EAC5FE2A253EBD461D30ABA5371D2CD880011708480D96C465555159850B3A652A92097CB21682B4DD4919BFE0EFB9040FF0E8D4A532202AE40C062B180FD634D24129138B76234126857F826D318890011704B0224D06E69769A34112002AE408004DA15AC4463240244C02D099040BBA5D969D2448008B80201126857B0128D91081001B7244002ED9666A749130122E00A0448A05DC14A3446224004DC920009B45B9A9D264D0488802B10208176052BD118890011704B0224D06E69769A34112002AE40E07F5EA05D01228D9108100122E02A04042515750DA7D2BBCA98699C4480081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D0808DC6296344922400488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D08FC1F8024C458BED69FBE0000000049454E44AE426082 WHERE `app_id` = '2';
 -- app thumbinals
 
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D099C5D6579FFBF67B9EBEC5B6626B364DFC91E12080142D87710595C0A5A37B455FBD75AB56A6D6BD55A6D6D6D6B6BAB15045111C50504917D95B0869090909DEC997DEE7AF6FFE77DCFBD333721C0850C3093BCE7C3903B73DF7BEE39BF73CEEF3CE7F7FE9EE7D1508B424021A01050088C4A04B451B9556AA314020A018580420045D0EA24500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0F5A6EC40C1A010500828041402A30F0145D0A3EF98A82D520828041402120145D0EA44500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A5088C28416B1A68E27F6A510828041402C718024110100423BBD3234AD0B1884E32668CEC16AAB5290414020A81318080E5F8642D6F44B75411F488C2A956A61050081CAB0828823E568FBCDA6F85804260D423A0087AD41F22B5810A81A31701A1B18A45CD331DFE182B823E7ACF7DB5670A81518DC08E1D83DC7BEF4EB98DAB5675306142F5A8DEDEB763E31441BF1DA8ABEF54081CE308B8AECBAF7EF5221FFAF0831289EBAF3B830B2E988CAEEBC7383207EFBE2268753A280414026F3902B66D73D34D6B79FF9F3E2CBFFB673F3D8BCB2E9B8E6128C756E9C15004FD969F9AEA0B15020A817C3ECF0D373ECB873FFCB804E327379D21093A128928704A105004AD4E07858042E02D472097CBF1A31B9EE1DA6B9F90DF7DD34DA7F3CECB6628823EE44828827ECB4F4DF5850A01858024E81F3DC3B51F5504FD6A6783226875AD280414026F39028AA0CB835C11747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB0353117479388DECA8C027E8DB4490EB26705290EB016B407E879FD9034E06341D2D568B166F18FEEEAA7630A2F26F5A450B5A55C7C86E975A9B42E02D4240117479402B822E0FA7231BE5D9787B1F23E8D900D97DF87D9B09522F110822F62D70B2E0E6E57704760A7C1BD0C04CA09989E1EF8ED5806EA0991510AD444B8C43AB6845AB9B8ADEB400BDE93888541DD9B6AA4F2B04DE020414419707B222E8F2702A6B54E064F1773D10FEEC790CDC4C48BA411046C86E163C9BC0CD41E095B5CE571DA4E961442D483C528516A900CD90DC8E66A25577A2371F8F31E522B4FA1947FE7D6A0D0A81114240117479402A822E0FA7571D153869FCDD0FE33CF8391919E33BE0BB829A4760ED47B00A41E0BA8956D18631F14C8C1957A2B79E1092B85A14026F23028AA0CB035F11747938958C0A0A32842789D87BF116DCD55F23103AF2DB4DC8AFB92F1A5A653BD1737F84563F538ED68CA8945284E67D444BE01FF93A8E6803D487C712028AA0CB3B5A8AA0CBC349926F90EF87D40EECDF7F00BF677DE1936F73945CF6F6970E141A48B8E813CE20B2E43352C7D6E28D523279DD8BEFE1F73C8F5E33456AE36A5108BC16028AA05F0BA1F07D45D065E024A2E3A0E779BCADB7E36DFC0941B6AB8C4F8D9D21C22DA2B79F823EE97CCC199783997C5D1BEFEF7F1AE7912F1039E9ABE8CD0BC3094EB528045E050145D0E59D1E8AA05F15A780207B006FFD0DB8CFFF1FC1E08E9199DC2BEFD8BCF5A38C3891657F8DDEB112BD711E98F1D7DE063787F3E89771D7FC37D10B6FC6987096923A5E1BB5637E8422E8F24E0145D087C3C9B371D77E9F6060AB24687FCF2304E9DDE5213AD6471931F4A6F9D2B6A7554FC098740E5AFDAC9793AE67E1EF79146FCB6FF05EBA97A06F23D1F36EC2987AF13137095914B90E7A6E38EC1FC7FAC93172DBAF08BA3C2C15411F062777C34F711FF834415E4CFC1DAB8B06D12AF471F331A65F8131ED32B4787D0846E0E16DBF0BF7B12FE377AF1B7AAA889EF13D8C59EF91CE91A37E11D6C921460E5F084E1E7E558A80927C0E3D1F144197778528822EC129187C09F7C97FC2DB7A1B41665F79081EEDA3444663BC1EF3946F624EBB2C9C44B453E46F5A4630B84D98BC8710889EFE5F18B3FFE4D8216841C99A349D176E5CE2F7024D07E26FC5F78FF693E4F5EF9F22E8F23053045DC0C9DBF63B9C873E2F650DE96356CBC108442A3067BE1BF384BF913730E79E8FBDCC561859F135CC851F073D72D4A327EE4B828A050F0B2A9626456935D408D0C2FB56E13D153FBFFC7450045DDE25726C13B4A88931B00DE7F1AFE26DFA257861BAB55A5E0D8122DDBCDC5E689EF02569D97B4356BD510CBACC042D2C322E16241C804B40CE87BC1BE0BA015EE0636A1A31D3A0361206D732BE9651B65A4A1150045DDEF970EC12B4A88FB1EB01DCC7BF8EBFF7D1F2D052A35E150173E127899CF4F760C4DE52A402E151470BC970580816A5A70AF2C3213715C9B705F61CDA521112879244715D22440ED71D126DA005E41CC8783EBD399FFD298BFDFD167927C0F1021CDF470B7C6246C0B82A9386AA38CDD5719A92260953470FD732AC5617C3EFB714ADD1F1658AA0CB3B0EC72C41FBDD6BB17F7DC9B1E3CE28EF7C38A251C6DC0F113DE59BE5D9F38EE89B0EF970416E10EC2CA25D3D64D39249BB428EA7E064190D0B223E38DD5D727620A859BC1B927DB804782252767C7AF32E2F7459F4E61CB2B64822D0B0020DBFA0377B22B9544CA0FA2E9A9BC7C4A73AA633BBA592992D55D4554431C4BAB5A1DB49E12B8E3DAD5A11747917C03147D041BE177FF3ADD27DE0AEF96E7928A951652160CC7C37D1D3FF334C1D7FCB96909D8BD41A68BE50802110AAB02E63683B08C87922E2CD3360B9641D485B3EAE0F9E1F485295E42C43E580A20745C7A33611A33259417FCEE140DAA1D7127F15045E903964E0ED83EFE37B3E7E10E0061EBEE71278E25F8FA4EED25A1B637C759C8698C6FC094DE1DCA2F84EF1427EEFB1258328822EEF0239A6085A249AB8CFFC3BEEDAFF05CF2A0F2135AA6C048CC917C83A1FAF3713B1EC2F78D9C030622ECD5C143C27485944B53DB6C78BBD3976A65C76A61D3674E5E8CA7BA41D8D8CE5E00BDD5844BB9E85E179E88120581F538811814F7D4594396DCDB4D7D71574643FBC19F822AAF62531FB5E611B84262D09DAC317A9EFAE8D2F483BF0B17D5FBE879527A9D9BC7FC54C3AC755A10782EAF5B0F6F71B07614C7E5211747987ED982268FBDE3FC37BE12610E53ED532E2081813CF217AFE4D6F3A418773768589BB21D942BCD0480501BB52369BBBD33CD365F14C9747BF15907675D29E81E30798BE4BA59F2111D844F048682E31CDC790D28329A58CEACA1A6674B631AE224E4484D6224A0E021128E307A1941112B420EA50BF766420ED11F81EAEEB84442DA3690FCFF37005613B2E932BE0B485139935BE16B320CF8848FA58226945D0E55D7EC70C418B7A11F61DEF0D6D746A795310D05B9711BBF47720EA528FC47270703CB4462929C8B8599072381198436767D6E5B60D0758D765B32FEDD2E3C5496B7149A49AEF92D0032A758F3AC365BC99A7427388E113D73C0C215CE8069617A1DFAC605C731B159118BA274AC70A32464A1BC2A9218857B2B4F89B27DE13441C482216E42C48DBF15C193D8BD79EE7E2FA01AEA7A189D7F92C13EB34CE5B3A9599CDF568F8324297D1F431B228822EEF401FF5041DA477491B9DBFF9370456FFDB5B4BC38862B42E43EB380D73F6D5A0BF81CA71C5E3EAA4F15EBA077FDF9304FB1EC7EFDFF2B6FBB7F5A6B9C42EBF0F22475ED16EC83921E977386F5A44AB9A9888D34DB27EC0833B06F9ED867EF63B06B66630E847707C0DDFB1A88AF8CCA88FD35913A53E1145CFF4E1A57AF173299C5C56BA2E021101FB1E8316F47911DAA6CEA2A65AB4190B35E6A0206548995946D0A15EED89509A90A0FDC09551B47C2DA2651129FB829885DC11FE1BFEF8F8AE8BE3DA684E8E981E70F6FC0ECE5B1436530865E863238E5604AD085A12B2FBE43FE33EF39DB74773D60D6939D31BE6622EFA24C6A4730B0E8791BE0803BC6D77E2BF7833EE8E3F803D0822F27B8BEB536B15E3895DFD2C5AB4BABCB3EF554785141D52B398F813C4A8E36B06BE1FB07130CBDD9B7B79648FC77EBF02CF088DC7819DA54273195F6932735C2553EBE218BE8D97CB92EEDA4F3E3D8863E5C9E52D5CD796137929CB67902A5A672DA4A1A989C0B6C3893FA95C08520E658CE26BB945051216842D74EC21822E21E4E218296F8888DA15DAB48B23E63F1C3171E971D2F446DE7FCA5C12868E9CE01CAACB3DD2E7C8081C92115C8522E8F2C03C7A2368CF92C927F6FDFF0F44E4FC562C661C2DD1282348D17E4A9F7016C6940BD11B8E7B8B92370A74B66F35CE837F45201BD10690EF0FEB8AC82E2F6FDEA225C711BBE6F91121681929173655389185D52D6B7B64ED803BB70FF0D8CE4176E60D5C2389661818BA89A1F94CACF0985897A4A53A4652F3D06C1BD7B2B133830C76EF259F4D63DB16996C56EAC4AEEF918D34D230653EE3C6B586BAB2EFA1090943C4CF7E48CC45722E9275F15F215F841383C311B378EDBAEE10897BAE3B1C5D7B1EB663E10A95C473195F1DE1B2A5535838B995A8A117DC1D85F4F1A398A3154197771D1E9D042D1E81B7FC264CDD1EDC5E1E1247384A448DA2A09031F783E8CD8B0A6B7B3BAFB0822C200867FB9DB8CF5F87DFBD8620B52B9CF07A9396F8B5FB6437F2235D849C204D7281262D725BFA73DCBFB597A7F6E5D81B6B0E73AC038D58E0D2561130B93E416B65942ACD1EF2310BF9C2C967C9A57AC9F60F30D0DF8D95CB60E7F3643359529E4EC6A862CAFC65348FEF905639690191138021297B624250FCBDF8BBD09905714BF942481D05D78688A40F913464042DA26741D04592F67D6C4744D10E81EBE0E472B4D5E87CF0BC1399DDD91A4E488682C7512D7728822EEF0A392A09DA3FF02CF69DD7C812986FF6A245ABD01AE76174ACC498FFD130821E858B683AE0EFBA4F4A21A2E98098F87A33969122683909878FA7C1133BFBB9FDC51E36E5A2E48C04B611C3F05CA2F84CAE3139AE394175C44017A41E88A70431D916E0B90EB9C13E327D7DE407FB1918ECC1CEE4B0F27906B2797AA964DCD4794C993E8398190953B8A52B4310B2F837F4498BDF872368A1390BDD3AD4995D394958785D42C245B22E12B4EB384304EED80EAE277E5C1CDBC2B0D35CBAFC382E5BB180642C8226273EC53EBC9D37F837E3EC185EA722E8F2F03D2A09DAFACDA5F8DBEE280F812319251EAB279D87B9F4F3E80DB3DFF214E737B4E9F620CE93DFC2DF7E17229B7244BA8B976C48FCFD1B651DE9D7B71C5CA85364FB0951C30D74B6F5E6F8C5865E9E1ED071A2893043D0F5A8323CDA6B624CA98FD310054338354A547749AE769E74CF7ED27DBDE4D2830C0EF460A72DAC7C96DDB98044DB2CE62C3A9E8A8A4A49CCC2972CA366797318D6990F92388250AE2812F6101117648DD2285A4E18BAA1E54E46D18508DB16B28BE7E2899E968E8D9549735C5B1D9FB8FC4C263454A369E2E629321D1541BFBEF3E8E81B7DD411B4A8B466DF76E588134FE9A1D79B9760CCBC0AADA205AD6E067AE3DC317566B8EB7E88BBFA1B6107F211963B62EF79E2F5E321095952A2A4249164B2664F3F4FEF49B1C38EB0336F92F185633920E6DBCC1F5F43B5E15117D3881B05122BA64F0F293B3EF9CC207D7B77911DE8259B4E3338D0473E9D23E3B8C4A79F48E794695455540D4D060AC786FCEF9049C1E1DF45C4EC1C44CEAF48D04E48C87282D00DA3E7A22E6DD9B69C2CF43D1BC7B1C85BC2F2E771ED25A772CEE25918BA70AA88041645D063EAC27A1336F6A822E820B513EBB7EF20E85AFB264035BCCAF8D56BD0AA278E8D88F93048E47F309920BDE74DC12876E9EDE89DA7BFBE754B3B9B706978B24646D685AFDFF322FBFC24D9682522B74F44B871CD62725D8C79E31232EB2F8CB443395A96D728D4D090E288EB4A79A36BD776B283BD58990C03FD29329914079C08275F752DF18889CCF716E9DEC5B24842572E44C862278A041C46D182A08563637842B07432B0F85A4C1C7A43045DF041BB6E18450B0DDAB2A4FE2C2418DBB1C9BB0E5A3ECDFBCE5ACA9F9C750211532790553B8EDE45491CE51DDBA387A07D07E7EE8FE26EFCE99BE656D02295444EFBB7B06BC8185DDC47BF8CF3C437DEB4AD8F5DF44BF449E7BDAEF58799819E4CD6C8A273DF867DDCB2C3213013385A4C929A48919ED118A7B3364195970BED76D2922688BA506DAEF0AD527E701D327DDD74EFDC4636DD4F2E9B61A027C5817496C15813175E750DBEE30C45CF82A48B245CF4380F5BE9428D59BC1F46D0E1EF87BA358674E6E2C4E050041D927351E6102E8EC0B1E5F7DBAE70A638C434978F5F761A172F9D8121DC1C52E278854C9DD785EEE81CAC08BABCE3727410B4886CD65D8FFBE8970872DDE5EDF9EB19A519E8F5332439EBE34F1A7B4D51858CE1E5711EFC2C42DE1879BBDD70E9CED885BF40177EEFD27A70C5A240AF8079B1DEB2706EDFFDC25EEED8D045AABE1D373024D655584C6F8CD35E1D23E2B918854A756175A3E145FCE6E9A07B019E6D91EAE9A27BD736B2A901B2B90CFDBD29B6A55C262E5AC9FCB9B343392308B30385AD4ED4D8184A4639C8EB3C4CC842372E7A9E8B12C610593BCE505AB7533A29E83838452747E0625B7902DB9263C5053868392493493E7BCD799C3FBD49EC32BA22E8D773851EB5638F0A829605901EFF1A81D537F2074A74BA3EF59B98733F3846276D02DCA7BE8DFBC43F859994872EA27F60690714DD402BCD70946C2192404AD29045DB2B59AE332448BD6A025AB245BED666BF07BDE37499622252988533A248D6438FEC850247A2BEB2AC4317183CB3B397DFACEF62AFD98863C6F00257AE43A466CF6E4AD092142E8D32EC81528AF064324AAAFB00DDBBB64B592397C9B2617F9696E356B060F102022B47E08B6CC1128F7321392524DC421D8D82BFB9384E44C132922EF89CC3ECC1A29D2ED49A053917DF77E524A1156ACE52F670C8590E9A97C77534F6EFCCB2DFAB22DFDA8EE70DF0FCD72E624A4DAC509D4F24AE1C5C1675E44FF0B7678D2A822E0FF7A380A0039C073E83FBEC7F94B7C7AF6754A40263F285984B3F875E3FF3F57C72F48C75F3B84FFF2BDE965F0F6F53AC6EE8B5B005EA95E387DF8BD74265C7F0FBD14AB48A5634235E1410A076329815720EAB58B728CC5216948CF40ECB1F517FA2F023A95546D282EB75C4DC5E54D788E8A1FDF8862776F374DAC48D26080283C07749EA1E136AA2B45747881D142D9746CEA54A6DB10F958F9DCF91EADA4FF7EEED64B329B2D93CBBEC2A169E722E15C9B8D4808BA45B9A2D38246B14ABD215A48CE29821CD596607869380421F179F731C7B6832B0286738628C63E18BF7A4CCE160E75D02CBA6F7A51EF6AEDF47CEAC21367F01D9C66AFEF2CC4EFEF2AC9924A2A0FB1ABA2C6E7DF42D8AA0CB3BA6639EA0835C9724684F68CF23B908729E7E854CD11EB3E42CF070F304B903F2DFE2A2D54D7B0DA45E9D14427A0CFF2F26E67C7C59252EEB06A41D9F7D595766FC651C9F8CE591737DDCC2849EA60798862EB3E66A22260D0903CBB1B977A7CD3EDB9451B24714337098506DD2561B23AEB98542FBC3B98507EF4089C12E0CCAB1F35952DDFBE9DDBD834C2E454A54D86F5DC09459C785E42CEF188592A142DA2868CCA5045DEA6F2E92B9888E4B53B8858D2E4C5A0909BA48E0C24A17A67887041D5AED7C3C274FC4F278E9B92DECDFB8172DA3E3E9519C8E0ECC8573A8AC36F8CA550BB962712771B123C2CC71144E172A822E8FACC6344107D90378EBAEC35DFBFDD03236528B192772D25731269F1FBA35D4328C80205AADD0F6296BD39B73E9B321E56A64DC80941DD093B125613B5E6892F0440D8D02A9CB24104DD46DD33074D1BF4F7424F118744D9C20228958C365526D84D64484B819BA3B6481FC728F83F86E2B47BAFB00BD7B7791CE66D9D59F63E2E255D4D7D687645CC80E0C35E7E1449450BE10863EF1B790788BA45B2A6DC8D4EE82C75992B41827A40DE1E010E9DCD2EB2CA40F1BCFB6B11D07CD7798D652CBC9D327B167D376BCACCFB34FEDE00F773D8F1B4DE2B58DC35FBA9089ED493E7CEA24DEB9A08371C9E106BC47536F4345D0E59DCC6397A0453AF7F6BB70EEF93382CCC85AC6F496E3895DF95079081E6DA3645FBE304216C9D6C51E7FA5D5E5065C8FD53B07D995121D4620E31B7242CF2F481C82600D024C4DC7D075F442417A41B122CF2F10937C22CAF57DF2521E10A590345C4D481B3ED59ACDA2B64A0C1F7491B42199B91825CB02D00583434995BBE1E70349AE5E3E4BBAA797BEFD7BE94B6779B1DB62E189A7529D88E3A1CB0A766252505AF264BAB6D88ED04A17DAECFC421AF7C13536A47D4E96112D789CA5AE2C3CCD3E8E889285B75910B72DD629A2680BCF72F13219668EAFE53DE7AF64765B3DA669629A70FD0FEEE6CB7FFD1320229BD006679F46B6BD9D96448EBF3B6F16EF3E7E62D815B168F72E3CB78CF5D34E1174794770CC12B494361EF922DEFA1F85CD3E4768D192CDB2E8BC746B1C934BB14DAAC0542F31196BB283F54B83393675A559DF07592D2A2701A503423C8D8B76513AD4C4848461C81FD1E5DA1C9A272C8823225B0F64946DB9E2C7A7CFF2C8D86194D95E5B495B8588B143CD5A9775374A3BC28A770A5AC641253A430D5C4817BE20E8BE3EFABBF6B3BB37C39E7C8C79F317509988CA9B81E88452ACAFE1FBC58247226F6798984B4B850EC91A8290658D8D83AD73E27D1125FB2285DBF5B12C4F5650F4FC1CBAE5B368C2781A2339CE5E71022DCD09224682542AC3BF7CF397FCE8BA87087413D3D7E8EB68A1F2E453B0123E57CDA9E2BB572F2FECAB48E229765E19FBBAB422E8F2C865CC12B4DFF52CD62D6785A535476A31A244CFBD514A1B8736151DA9AF18BDEB292ACBC566AB855ED9F2CF3A5D399B67F7A7D8D827122B4CD2A688443574DF23AA7924220615D11815A6415264F50D3546152E8D029916495570A3E45CAD10750B7FB14ED676A503A2B62A4E2408CBA58AD653A2C6864CF12E74DC96938845538988CE75D188B564C63270F16D8B7C7F2FFDDD5DBCB0378D956C64D6B4A952FB16DB5DACB921562DEA39CB4E2805B943481A6219AEE35C8CB043194390BB4C462990743199C595B246585AD4B184734344E52EDD2F6CE5FCC57338616127B95496D3CF9A876926D8B1753F5FFADC8D3CF2E84B843DBF0306741B6DFE71C416CF63D9D41AAEFF9345D4C6C4934C98C473B4E8D18AA0CB63823149D0819DC2FAD10282CCEEF2F6B28C51A22468F4829FA1D54E2963F4D1386428264597C5E803990CD263793CBB67807503016922328A132363814D753442752C414C4E64899E7E61A0EB16026FBDE08A93997E251284142C869414591B0E3F083DC4B82EBAEF080B88ACC521A5132326234C0C83401335A1CD90D865C966596EAEB0F6403658D1752F8CDAAD0C07F6EE63F5F61E264E9D496763B57487084D1C5F4CF6850F5FC311F470F2496979D183B205EDD04A5724E7A25B43DAEB44753A173C51903F9726D3956560FB368C9E1C99BE34FFF0CD0FD37D600FEF7A9748E4091D1A8F3CBC817FFCEA4FD9F8C25E342D82E7EB58BA8F3F7D0A0D272EE2FCA575FCD5B9F3185F119337BDA3A53E8722E8F238646C12B4D54FFEBF43DFED482DD133FE0B63D67B0FF6048FD4CAC7D47AC20ED50E3A2F0D5A3C2BEA616475F2BA298BC9EB1E183A3455992422427E084B82CAC7EF21A9342C052A5D120769A701811ECA2132AA16516BB16EB2F005CB4ED8521426E71BE8461C5DD8EECC381866988E2D3E26B2088BB2967487143569999018B6B8127BE0FBF41CE865DDCEBD4C9E3C85A6AA78E8B8D07402D1D43510242F9253C2087A285BB0B04DC58494616B5D18410F47D607CB1C395754A60BF7899C4D76C77E1A4C93DE3D7DF4F7F5F1F75FFD30BB766EE4F2779E8B666852833ED095E56B7FF7536EFBCD13327BD04378A05DAC649CE8B2C54C387E027F73E12CCE9AD1425411F498BA92466263C72641A7F720EA498CD862C6899EF793B0E3C9B1BA14345E99D517681CC839FC7E730F075C13DF48485434DF23AE05542522544544342DDC0EF29D30242E4E2DFAA1FE20125104414B322E261BCA529D61EB28D9F95A140EF25C701DA947677D0D2B8044552391681CCD8884845A1281CBE8B650BD2E944FC2C85DC6E28198001465472D8240978D65D2C2DA6646658358D9AE4A4A1CA2EBB6B81784DB22BAA2941274A9DC21FCCBC59E83A254E870C5BA509209A3690FD7B1713C1BCD72493DBF9B591DEDC47483679F59CBA92B8EE3A413A793C90EB2EACC2572F2547CFF9A67B6F1CDAFDFC2534FEC243084D061E2EB2EA2E7BC376306D5A72EE45DC78FE32F56CD05F8E9980000200049444154A035190DA59CB12F41A322E8F28866EC11B4C8127BFC1F711FFF4A797BF81AA3B4783DFAC4B3892CFD3C5ADDF41159E7985C492112CD3A3E7B07F36CCBF8ACED71F08CA8E45E91541237022A2286AC2057CC1B09FB9E849379B2EBF590F61CF276283F87EE084D4CAEC91467D1FE29D470450A74266FA1099B991E27EF413499A4B2AAA630F77B88BDAE90F957ECB83224CC14826841B8A1C02D32FEC4A45F78F310FD0085BC216F0E224897DEE502F10E15DD0F2D7787764329FDDD91FEE642012441CCD25A27925544F289456D328696CEB26BF5666A9249E90469AC4F72E925A7626879DA3B5A19DF568BEB6ADC73CFB3FCFC670FB2E6995D64D3BED4D50D7103110A8C48F4696B2376C6494C6C31F9F8E993B970763B8948A1EBCA18676945D0E5B1C49823E860701BF91F2D94B5258E78D13459CF3972F237D06AA71EF1EAC6E60A42660B894E63F5CE3E9EE9CACBC2F89A1E911367E2C1BB361125618849AA70E2AEAC4508C2821045042AAAB78908339F95C48CE7627BB03FEB9173A0B1AD938A9AFAC2649F30C2BDBCC3753159446E6D8971A758CB43BE2FC3E2F0CDC3950D3D2821454A1B0737782D7A9D8B29DC323A2E494E2926A014A366DB11892A3681936362758CE5D3A6A00FA6184CE564D1A38898344D98B4B737D1DED68C6906446326B93C7CEF7BB773E30D0F92C91452DE8550248F45B8EF7E5515C6F22598131A58DC11E5DFAE58425B9DA8892DACE4633B8C56045DD615246BB5648523680417AD57642B8CD0128BE82463C3F508DC67FF13E7814F8FC8DA450F3D73D917308FFB008849A86364199E6A2AB82B0AD1A7E5C3CF9FD94F774444B326119953E25111D1A88A849639C97D8714292AB1E90E491B61990DD1C5DAC6CDE724397B82E8EC9C7CB477759DAEAC478F15A1B9B595EA9A5AA9718B6E2261958F83097A989CC346AE434B21422F9276D875FBF0CD5E8B641C16E50F5B5589649430221E766A94164112BE67910558B4DC494943C8197E2133D0168E911CA66F71F1E2494C6B692016C0E0604E626598060DF595D4D6C6D1759D4824413C5E496068AC5EBD99AFFCED4F79716377F81C229374C2671291DAE3440CFC59D3491E3F8F9A44C0CF3FBC94E9CD95614B2F45D0C7C4D53AA6085AF4D3B36E3D8FA0EFC5233E385AAC0663C19F61CEFFD8A86D5375C43BF90A2B18266831ED1652C2BE812CCFEDE9678B5D8DA78B093F5F3A2112D2D32CD22884AE1B6AC16191A38397E1782E407444153286487116197D5E3E272500291F68263BBB53EC1DB4E998328DFABA3AE2B1F8505D8FA2C9EFD06A78A551B2F8E6E2EF52832E1072694D8DD22248A58E8C62042D09B91041BFAC2A5D21F124CC142C46D0218187198285FD131DBAD3194C2B4F1D0133C7D572C292195455E8C4A249A2B118A6283AA2F998119DAE9E1CB7FCE27EB66EEDA6BEBE86CD5BBAD8B6653FAE250A2709D8C4646B44EE8F30037A41805D5B4DCD49228A6EE53FAE9ECF19936B0BE246F118BC3C921E0BE4AD22E8F2AEEE3145D0EEFA1B71EEFBF383EA4A94B79B2F1FA5D5CF2076E9EFD02ADBDEE82AC6ECE742822E265F6BA42D8F3F6ED9C7D69C8615AB938FD9A2FD5345CC2026324F8417B9CCB929E1D7F5F2966C3725C9D9B664F42C4A9C0AC259BFCF626B5796798B16D0D9DE84212ACA8571B7DC2A59FD4EBA42866F0282188BCB417246B1F3F7219DB75FAD0892889C65328ACC16149383C3D1F310514B1B5DF8775943A35846D4F711DD508487DAF65C74C72261E789BB79E6774C62EFAEAD9C71F2121AABE338A64977574E584E68195F41736B1D4F3CB19D4F7FFA7BA4D28284435D7EF98953B9E4A21359BB660BB7DEFA0039CB0C495A3CBDF82E9609C90573A858BA808F9DD5C9B527761211369AF02E75F0E469E15146A6B31464ABD14AD68AA0CBA38F3145D0F61D57E36DFAC588B4B3D29BE6117BF7EAF2503A2A4785F634E16858B76B802777A7C957544A8FB1889E45C45C1B8FBD42058C62E28900264C139471B8AC71E162A70764B94F41CE72324E94E8F46D2C3DCA6F9EDDC3CA534FA6655C3D81E34B57B5F8FF2B2D879336A414209256640DE7E18EDB8746D087D6D810A42B2606C537CAB2A1E277D925254CDB2E56A62BED1F28AC7FC29D1188F7456ABA206B57E8E73ECD519DD3674C20EE7BF41CE867DAD4F154C4C57A3D1E7D7A3FFFF3BDDFC8CE2A9FFC8BCB58B56A11BFBFF349BEFDED5F93F54C343F82E66579EFBB8EE7739FB99275EB77F2B9CFFF2FDB76E540BCEF69F86E8A5CE0109D3A9571AB4E65C5C25AFEF2C27934579A4481D05B134A49D20EAE891F0DA320FBC80AB1D24613DEEE0AC9FBA3E26C56045DDE611833041D0CEEC0FAD58523226FC82481D665C4AEB8BF3C948ED25182D0BAD2791ED9D2CB012F8A174F8471ACE8986DE854C5A2AF52A26838C295AAA92067619B732CD96A4AE8CDD239E1D9B88E4B2A30D9D29367E2ACB98C1F57876B87198622320F55D7972FA5E45C94354AF56741CEF2F7C2A460D1B75C2A6FBCAC4A5DC15227C958A6758791F210418B424BC2FA57F8BBCC0A141AB46C572592516C3C51CFD9B1995C5341936FF0F8236BC8D80133A78CE3E20B961389EA7CFE0BB7B271F36E342360C1DC164E5CDC29E645B9F781E7D979004CDD2011B178F7554B79EFBB4F2195F2F9D6B77EC1A3AB77E3D92EB1288C1F5F41B2A282A7B67553BFE2541293C6D1520BB515D05C9564666B3D6D0D5574D625A88FE8529212924A65DC90FF1613C38B754CC4113BDCE4EBDB717A2B822E0FF53143D061D1F96F1CBEE87C79FB3A3C4AF89E57FE1BC69C6B5EEF27C7F4F862E4296B55482B9AC6B3BBFB796C9F875E511146589E4D4483642C8A71D8C48850B32EC664923885DE6C0BBD398B9BCBE0E6B272124D44CF8EA7B1A13BC70B072C8E5F348F299DE3110FF122CA139B5070C1BD0CD7C3C91AA5242DFB1116A48D22098BF75F4EC8C54A75C35EE7522943F89BE5EF25353686BBA18814F490A045FF40E1950E2C9FD481019A8D80E3A775F2C4939BC858018F3CBA86CB2F5949A66F0F7FF197D7F0B14F7C8F0D9BBAD0CD084BE78DE7C37F72226D2D06916805DFBFEE3E3A3ADA9935BD93CEF62AAA2A7574DD249509B8E79E27E9EDEBE18A2B2F62F2E426366DDECB97BE72231B064C2A16CD837852B6D615C9E862A2559471B5BD3C7AE0501D37185F6370F58A49CC6F6F607C659CEA9849B450C44AC847A58E72F9FCF3364D362A822E8F4AC60C418BAA75EE0B37806797B767AF324AABEA2476E583B22BF7B1B98436B5BC1BF0D4BE1CEBFA020253D49F0B307D979829B46761A913DAEFCBA3DBE149C6F0F1DAB32C1C41CC96F81996360449BFD4EFF2E4DE2C53A64D67C9AC293241239C637C659B5829391749B9F45F91065EAA3317A50D31A6D8F0B57432301C2B087A385296A45C283B2A12518A2543A537BB245B50C81F610DE8D0BD91EBCAF3E2531B684BC225672F65CDBAED38BEC9D66D07386E7A070D35011FFDD8152C3FEDB3387E42660C365519BCEFAAE59C7C621B11C3438FD5108B4464612943F3D145828A261C1E11A2F14AE992314D8D6CDEE697BF7E9A7FFBF7DB493911F4A67A3022B2E1811635312A931889387A55257E65054E24826DFA541B1653C655B268623D67CE6EE5F8CE3A92C23F5DB0F14979E835DA90BDD9D78522E8F2101E33046DDF7639DE96DF96B757AF31CA987D0DD133BF3722EB1AB32B09020EA42D1EDD99A1CB8FE1EB614C1C0D7CD9ED5AD46A2E54B57FD92E16095A5AC37C17279BC14EA7F0EC9C94396C613D135A74E0B3F6804B2A5EC7890B6753138D86135B929B43DDF9658EBD42C1A262647790A451485211045D1A4D17ED73C508BAF87B314B3024F0E1087AA87E46C1032DE50B37246F31AE94A045228D903564228AABF1FCC3EBE9DEDACDE23993B8E8ECE3D0FC1C1B37EDC5334C2A2301975EBC9C5CCEE6437FFE63FAD38EB4D9E164B8F0AC595CFDAEE554C504C746314C9388114117F545D089464D62A2B398A1631886ACD3B16B6F3FFFF8AD5F71F71FD66106313C212A17F465D1D6C0D17DCC680C3D99C4A8AAC4A84A12D4D762B677E0450D0C3360767B928B17B470D2C446A6B55493940D69DF7E0FB522E8F298E3D823683D22B567BD797179081D45A364E05A48BB1607FEE91D3DACEB75D12AAAF17571F107C4651B2AE1B31DF6481F0A812C312AB3F4449FBD3C766A1027932AF8853D1C3B2F33025FECB6C946AA5930FF38EAAA2A0BC5F88B6B3B4C645E24E0121BDDC1B24668AF9313838531A5DEE6A2065D8CA4C3BE826171FE506B0EAD7EA13BA390A4228A3249096398A045D76D51DF597640112E0E3B4B65D4A47B571FABEFDB4A6005B434C4387BE5143A9A1368668CDEC114B9748E8A8A2A5E7CF180D4944D532797B769AC8B73F2099D1C376B3C095323E3983CFDF47A6CCBA3B373A26C58904A0D62E811AAAA222C5F3E9FCAA4CE60DAE2B1D59BB9EBCEA7E93990A6B232414F6F8A679EDAC8A489AD2C5C3C8DFBEF7F8E7DFBFA993C651CA7AC9A8FA399DC72CF0BE8C90A2C714C1BAA699F3591899D2D34D646397F7A152B66B7D19810425368510CDB29840A7538A1F8E653B822E8F288E5982368BD712EB1773F3EF63A7397773C5F635468ED12015457C6E5EEE776D16F561215FA73A11E7ED21417AE68562A29F07039290482C0A53BC3C1CDA5B15329F9AFA843E1F83ABE9D664B46E3B16D3916CD9DC9F2E3A6C9758A08503BB8B4DDD0F61E6E42B0F8A620D9904386C9B9288314258DA2CC51FA7B585F232C235A4ACAA58E0D59856EA8C9AB983874B16D0BD713FA738067E54906164B674EA4677737B7FE622DA9816E2EBB7019EFBC7839BD5DBD3CB7712777DEF3047D030EFBBA2DE29128FFF0E9F3A9A9D0C8BB3E158908F535E2A9C424168BF19F3FB853661876B435B164D15CE2C988F464F7F4E4B9F9E63B983C793CD75E7B05D555BA749A7477E7C8641CAAAA4DBA7B72BCEFEA2F326BFA243EF8E1F3F8F94F1EE2A9273672C1852772C699F348A72CAE79FFBF138D26A9AA8A921CDFC89E4812AD7D025A730BE36A3C4E9BD9C0BB4F9ACCE28E46E9D609B3436505ABC275F1CAAE9A11390D41D5E22813C8B141D0A68B7DFBBBF0B6FDAECCDD7AE561E6E24F1159F1B5235ECFD85B41C16825224A74B67465B877DD3EB4867168221345689281465C3C92CB72FA32982A743339786FC5C49E2E745A3131984961675292C8022F8FED050C3A3A77BDD88F9BACE792954B6916A5320541CB28FDB51D1B61465DB8C83C944281A56281FDC3D9E90ED59C65642DB304C32EDC45821EAADD2CAD7FA2F0FE702FC1A20DCFB6457D0D11417B44BD3C0BDBEA583167221586CEB6032EE9812E96CE9D44476B1DBE11E5869F3FCA3F7FF7F70CA41D3CD3208ACEF7BFFA4EEA2B5D3CD15D46B82B44701A89E193E4735FFC1F2E7FC7E92C5934858A8A2855D555242A4C296D7CF39B37F3F4535BB9F2DD6773F1C50B8919A20094417757370D753544E3557CE04FFF9AC6DA06AE7AD7E974ED4BD1D337404B6B0D9515115C4BE3FFFDC5FFA09926E79CB78464BC821FFFE271F658106BEF20B26C31B6E130B71E3E79C66C2E3B7E52A1BAA008A0C5F4A3005DD68F7D531715419707EF9820E8447E07F65D1FC2DFF348797BF52AA3A2EFBC1BA36DC511AF67ACAD406AB9D2D226A2508DD59B0EF0D4AE0CC9D6567CD15B4A14330A3462824D8AA923C345EA0EDA5DC9B1560E5768CF9934563E856BBB18760ED77378B227C6635B539C7FE652164C6D2370C42D4168CFA113F7D0E5708E0D912C534CC428D598C5670FF53797CA1CD2DF5C48020927050FAEB75194368A3EE8A1641459BC49A470FB389683232622DD3CD31A139C377F0AAD0993B809664D35C9A8B8E178442231D24EC037BFF32B6EFCD573785E8440D4A2D63596CEA8E6FCB317336D5223B1427DEA4832C97D8FADA7B5B193B6E6188978841736ECE5D9E7B6327FFE4CCE387D0935B5716EBFE3596EF8D14FF8D2973EC07173DAA5D4B267F71E9CBCCB9E7DBDF4F5F5D13EBE9588E9239AF08A42FEA29B8BB0F10985B9FB80472E97A7ADAD8AC71E7B81EBAF7B845456C3094CFC855349CC9D493652C1C2D608FFF927F399D35415362B9085AE7499A8A4087A745CE16382A063FBEF97F53782DE0D47849A5E3F5BBA3788561ED17A46FB87C389B5D0A72C0D71B28646802BFB004257CEE18117F69237AA885726866A4008028DCA1653C58E27AF10F0FA0176AA17279DC6CD67F0F27949108E98300CA27CE7D16EDE73F14AE6743622BE54FA718B0D4F4AC03B5C128A0CE0048DCBFC1321C90CFF1489FCD02248A5B24691A0852C52EC7A52D49DA5CE5CA8FB2C9D1905DDB9B4F8BEEBBBB8791BDFCDD15615E19CB993993EAE964854F4103449C46398A22E891123123788C76264F23E37DEF2000F3DB199CEB6361E79683DCFBFD44760E75836A7853F7DD7623ADBEAC86434FEFDFBB7F3E71F3C035D8B70E73DEBB8F1D6A7B182288E35C0F4CE6AEEBDFD6FE94F7BFCD5A7FF83258BA671ED47CE95B54BBABB7A181C48234A57899E878303199E58BD81A79EDCC6C4894D9C71E602B66DDFCBAE97063969C53462B1F02964CBA6FDFCE29627E8ED4F3363662BEBD674F1D29E41EC4651EA602EB4B7B0A833C95F5E3497D327354AFFBB903ADE6C155A45D0E5B1C8D820E81DBFC479E40B048347D6B95BB4B28A9E7B0398C9F2D019D5A38AE9CF61265FA807842F7D21D816EA1E3B3EF4E75DD97D7BC0F2C9381EBDB68F25EB6A0839A3F8F9508B14057D0E2A1577E8A3AE206FCFC5EADB2FE50DCFB2B12D0B57A47613B0291D636BB682CBCF399EB858A31F66FD1D6E795582F6C4A3FDC1045D9A8052943986A3E7302BB0E8C41822E5621124A9290FD77216759D0357746D11138661328D90385CDFC3CD0E521F373963CE44668F1F8768B12584A1A86952D790A0321923669844449317DD9451772A67914E79C41311FEF0D07A3EFEF99F4A1FF909F3C7F3BECB17D3D1524126A7F19DFFBE8D0F7DF07412D12477DDBB9E1B6F7D8AAC6DE0BA29E64CA9E70FBFFE222FED1CE0BAEBEFE08C558B983EAD01C7F1C80929C989B06B6F9EBBFFF0088DF515444D839FDF7C3FA79FB9844B2E3D953FDCF5383FFCDFDB39E7DCC55C74C90A2A2B62128FBEDE2C8EE7D1D454CB7F7DE71E1E7A68037A3C8AD5D244F4C4A5588918735A63FCDFFB9731635C95EC4A1318A1E4351C498F6C58AD08BA3C721913041D7DF187B87FFC7B82EC81F2F6EA154689C2489193BF0E46EC88D6337A3E5CC8E62B5E3B525F0E3B64F7E63DFAAC9098BBB32E693BC00944BB284D7A730BE59B0F22681971BF56E28248DC736D72DD7B70B2697CCB91936A2222CDF83A776D4D71FA69AB98DA5E876F0B4DF3B5C939149A87E56E593B5AB6A23ABCDFB954831EB2D405616D8DB09091F85CD1AD51A85257ACE15C88A25D3B4CA41111B3746A48EFB3D0AA1D92DE202B66CF60FAB866366EDACD93EB7630904EC9AC9AB9D33B58B67812F36775D0545B81EF59E4450125272097CD61D93932B918E7BEF79F9938BE91954B27B262C9046AAB23B87A941B6FBE8F534F5EC2F8E64A76EF1DE0C7B73CC9F3CF1FA0AE46E73D57ADE0931F3B87DBEE788ADFDFF118975F7E0A2D8D49C19632FD7ECDDA3DFCDF0FEF62DDBACDBCF39D2BB8F28A93D9B9B397EAEA18F58D49F6EEEBE3A1079E67F2C47666CE9EC4E64DDBA9AC8CD1D9592FC1CD657D3EF5E91F31D02BFA48826546C877B661CE9E85555BC5972F9DCCFB4E984CBDB8F3489D235C868FE0C809D38AA0CB6391B141D0CFFE23CE93DF023757DE5EBDC2A8C819FF8D29DB5A1D2DA5458B151634D2B6477FDE21E3F8E4029D03695746CBB2B934A2C9AA8802C30AFAA2A4671825178B5B0E5F8C52147995EB505AD6AC3C9903BB64D6A02726D46C9B8CA3F15CB7CD93FBB2FCF507AE20A20B7B5B28B11CBA1C94882227270F2E21FA4A9981F221A130E137AC4317124E4469D342224A91B40FB6D37961995069AF2B383764D53A91BE1D7A9DC58D47773D8E1FDF447F6F0EC7D648A732385E9EF1CDB574F76519D790E0B9B55B696A1CC79927CFE2DC5366E13A1676DE2697CF33386873EF231BD8D735C8CCC94DB4B7D6938C0AAD188C68820D9B77F3C4532F71FCE269B20C695F7F9EFDFBFA98D0398E19B326B0F1C52DDC76FB6AC635D672C53B575095D0A5FD2E5911E3C9275FE4A187D7CA4495450BA632635A13BA1E953715F17420BEC471024CC3249DB1F9ED6F1E116D1C39FBDCC524A251D2A93C7FF7F7B7E0BA1102DBA3A73743CE30099A9AF0DAC7D3B16432E72C69E7ACA9F59C34B355F69A0C6D78B200F5880AD38AA0CBA3B2D14FD0864BE48F9FC37DEEC8134B84FEACB71C3FA2275A79308FFCA89052C30833E3066CECB6D89D71C97922D013979470B7CA82CE0521599AE786FB01BEC14D1276302F9B26B57F275E2E2B1BA48AA2F5FB3206B7BD3848754B339FB8E81459D02A54410F26E843ED74A17BE4E57A73E9B8C3799D87248E12A786187750379482DF59DE5464324AD8C1457CB658783F7003F29ED8870C86956566CB380677E7F8D91D4F307B4A3B1FB86225F1B8869DB7C8E71D49763FF8C1EDAC7E6E278D4D4D7CFAFDABE86C34A56DCCCAE71948EB7CE9DB3FE7E295C75355A5CBF65DF555111A6AA2B2FE46241AE1073FFB2303FD196A2A13AC5CB984BA9A38AE67D3DD6D71EFFD8FC908F8AA2B4F236E0A6923C340CA4133A2C4A26282D70E1D3162424188D3F2F00A374A207F04A3CA7ADBBECE9EDDA271408ACE090DB2029E382BD6AEDD851718A407036EFBF5A3BCB4B34F4A3879132267ACC26B6E605A93C797DFB180B3A70B794778DE45275E71AB5511F41BBC6CDEF0C7463F417BBD987FFC1CDE869FBCE19D2C7E50F89FF5A6F947BC9EB77D0562C61D106D11BA320EBBFAF3ECCB055832522E542FF30359DE532ACBB2EEC6F0B4E1CBB7BF34821E7EB760851EFA83ECF957D06807F7BE842F9C1C8E8DE5FAACEB0AF8C3F634A79FB294F38E9B24279A0AA6ADE1CF9724A214A3E1E277149D1743C45C42DA877A9D0FD69F8733040F47D0A57537647BAA42828A2C7A24BBA104D86E1E2FD7CFC49A4ACE3D7E111FFF9BFFA3BABA8153164CA0637C0BBFBEF75976F6F449FFC9E5672FE4BD979E483693E5A777ACA5B936C15567CF0527473A9B12FDCEF9E12F9FE48107D613AD88E004010BA6B773C959C7D1586D08C3057937CE9AE7B7B16EC30E4090BB88BCFB686A68E1B24B4F66DAC47A6286905C3406D236BFBEED61FEF8C4063EFD89CB18D7501936CC95A4A94B0B5E36EBC8CCCF6884B03142A1AFA460EFAEDE14CFAFDD4C67BB68B555174A165A848D2F7471C30FEF65DBF61E594D509C0156472B15272E215B19E1EC6915DCF8C193C2F415697B0CCFAB915A54045D1E92A39FA0AD7D988F7F166FD32FCBDBA3571935B6093AAC9F519C5FB77D9F8D3D595E1A74487B4658A54CD7A4C62C62D762E727D9B95A62F2C666E64B2F49499E9E879DED27B56787943A44169ED0B71FDA65B379C0E79A4BCE607A43A5D4B24B09FA952604C34D1B2E7C344CD007BB3786258D42C3D9429660A9AC213E5B1A41CB946ED13CA0904558DA915BE8E69E982414371C2B4D53D4E7ACB9D398D2D2C6D91FFD365FF8C47B3975F1447EFCABA7F8DF5B1E473345395593A8DFCBDF7CE2024E3E7E269FFED2F7A96968E6AF3EB08AE66A91F99792938DDBF7E4B9E5F6B53CBD790FFBFA2C1AE206579C398BF3CF9C4522A6614685B32646366FB0BF6B90FE8134C97884F1AD0D744EA844D610742D1C342C2BCA962D7BD8B5B78F850B3AA888990579CAA367D0E7DEFB9E938D676B6AE29CB6721EF3E77662BBE942D6A6C6FD0FBCC075D7DDC505179ECCD967CF97D98B77DEF1240F3EB89E7DFB2C904D02C4790379313F31A593CA139630AEA5921B3FB89069F549793E89E256C508FA35E729CAB8521541970192B8698EFA9657D65ECC3F7E166FF3ADE5EDD15148D03272150E559150A7C1F6812C9B7AB2A47D51DB423831741CDD43383644728520E54016030E67E18B9DAF87A0293B102A991E2AB499129D52ACC13E52BBB7E13A79A93FEFCBC05DDBF3548D6BE5FD179D4432081FA7C36D18962F8AAF4B0F914C4A2929B87FA853A35473169F2BBA338AC5F60FD59D8B042DC95A44CC857E82B2334AE1C70B7CACBC2027F1378B79CDD59C3EBD9DBAAA18BD76824BFFDF75BCFBF4395C71DE095CFFBB35FCF2FE0D61179920C0C9F6B3727633FFFAB50FF1FB479EE1C7373FC8673E743673DAAB480FA6B1DC3C96E5921DB0B9E9EE17B9FB8F3B69694EF2912B4F64E98C4634C3A53AD904A6B80159619AB51960EA3A51334AA2BA194D384ADC0C795BE7F7F73EC9AF7EF7282B4F5DCA79A7CE2126928A74979D7BD2FCC5E76E606FB72D356A31A7675B69CE397D0E9FF9D42A7C574C2C06F4F4A67966CD36D94477F1E2690441826F7DFDA7AC7EE245B448122396C0F0C2BA2B82846D4D67A03641ED8AA5CC98DDC45F5F308F55339B10A5B3C2E8BBEC93E755AF5745D0E5D19922E8F2707A5B47C94C3A4D931EE66D5D2936F7E5C8184939D96914E48B8C8804458DE382EE5B24C7305DFBF012C66BEFD4B0052FECF9272268177BA09781DD5B65D71441803B07E1AE1D361D53A7F2DEB317127545BA83D046C3AA69A12F3B5C4A5FCBDFFD973B36C4DF0FAD4A375C00A93019284A7F160A2B15B3030F9A142CE8D1B20FA2C44614DE0F35E83019C5C2772D702DCE9BD9CEB249CDD2EB6C6BB59CFBE7FFC1BF7CE9232C9D5DC7F76EFE23FFF5F3A7C08C482D56CFF4F1D90F9FCE490BA7F1D9AFFE90CAEA717CEA9A93E968D4490F0E62D9196C4F279D8971C3AF9FE681A776B2EAA4697CE01DF369A88960C422FCE496C7E9983891D933DA185F671217968A888EEB193CF8C85A2AE31AA7AD5C246A0BB2FAB95DFCFD577E4867CB383EFF990B68AAAD92730FDB77F573CDC7FE879C1B0B537F021D3B6BB3604E2DDFFDF6D532B925D06C742D86615648FDDCCE67652A7B4F7796679FDDC2BD0F6CE0F98D3D44021D5364558A3040B83D0870A6745073C672CE9A5DC35F9D771C53EB92AFD256E1B5CFA4434728822E0F3345D0E5E1F4B68E129AA3E5796CECCDB3ADCFC6D1A204BA29BDB9A2B09BD05145C3D7B001529831286D03AFB01CA6A5E06BEE5F512316F537EC811E06766DC5B1454B2B871DA980BB77794C9D3993F79C311FD31D8EB25E89A04B13504A23E822391F9A8C529A3D2826D44A53BB8B045DD4A08B5E6841C8C5085A24A8086B9D48F2081353B244038789D5559C3AA38DCE862411334AACB292D33FF67F242B2A3973C9049A1B6AF8ED7D6BB089CA4CBE93E67770D1394B18CC64B9F1670F31ADA396779E3E07138B6C368365D9ACDDD2CF8EFD197918F6F5E6A9ACAC64D9DC76AA2A626CDDD5C70D37DF4375A28271E3925C76F65C56F6ECE2F600002000494441542E9F4ECA8AF0A31FDF475B5B0D0BE74D66F2C466621193ADBB7BF8F92DF7D3D6D8C439E7CC26198FA3FB1E7BBAFAF99BAFFF86ED3BB3E4F3AED4A0135138E7F4195CFBBE95B8B29598C58E97FAB8E79E3554D72458B572A14873A1BB2F232596471F7D89EBAFBF8F88AEA3FB01AE485011A78F68ED555745E28255D4D447F8D35327F3BEA513A98F475EF33C29778022E8F29052045D1E4E6FF1A8E1A40041CE83AECF969E0C3BD326AE8C633C9C00B26E801BB6D90E7BF9BD89CB90D3C2B5C90F76D3B7630B8E9D95A4B72BE373DF2E9F0953A6F3BEB3162314F1701EEBF0BD04C3505A3442092BCD95BA380EADA9513A2128E50E69A5B30B76BBE16E28C5085B960A15FAB4A8F72C1BBEBA327A96A46D7B8584141BCDCDB2A8A38565D33A694C68C462069188705918DCF3743FDFBEE17744137196CCEDE0C25366316B6A27F73FB691B696763EF5B73F6057F720A72C9CC4973E703251D325675958B91CDBF6E6F88F1F3FCA9F5C7916EF3A773EF94C967FF8EFBBF8F99DCF485C4CCDE7FFBEF54192A6C73D8FAC2716D3B8E6AA553CF8E456BEF2ED5B98377322E3C735B0706EBBB4F1897D58B771A7B4ED2D5F34998AA429A360218D740F183CFCD80BAC5DBF95DA9A4A4E3EF138664F6BC6F35204BE284C65F0F8D39BB9FE477772C6AAE339EB8C053CB5662BDFF8E62DE4AD28AE2B52950ADD1F45FD0DE9D81025397C5C53C39B3189CAA58BA8A886EF5E398F93A736C94317CA1C4796B8A208BABC8B5511747938BD65A3E4692F66E80B9A5FCAF1D9DC9767F7A08555E842276A26E47C911518BA34E4E55248A51EB24295CA1A877077F91174F1422CCA1342CAB4A5C4D1B363236E3E2735E8BD599F07766BD4B775F0C10B9713D38C50CA286CC3A1124758C9544CF689ECBF509429B5D21DD6565778049772856841E5879F1F766984D24758CB397C1D367C2DD6D870E5CD44764E716DB2FD39A6348DA3311963E9F446664FAA236A6898310333D6C8ED0F6FE0C6DB1F63E38EBD2C9A3F8D96867AEEBEEF71264F9AC4FA2DBB686FACE18A55B3B8F8A44EAA6BAA71FC80AD9BB6B265771FB7FC7E03D7FEE9859C38A7153F6F71C36D4FF1AB073690496798DA56CB173E76169695E1F70F6F67C3D67DAC38711E0FADDEC4DD8F6DC4CD8425528F9B51C9B7BE740D6DCD757CFFC6DBB9E99607F8D7AF7D94C5F3DAF19D5C88997892F20DB2962BEB474784AE2D4AA54A8BA3B0DD451848B96CDBBA9B86FA18CD4DD5FCFA8E67F8F677EEC430AAA5475ADAE870E571105DDBA563C31713CD60D75753B57C095A5B1DFF72C51C2E3AAE45E69E86245D284FFA06AF0C45D0E50137FA09DAED09270937FEACBC3D7A955163C3C5115AE88A997E3B072C9EEFCA91173193268A43EAE43D8F9C78542F55055F4D673E34B82EC9DA7BBDA006AE8333D847D7B60D78D92C8E93A73717F0E83E03B7BA9E0FBF6315B551531244B1B46891A043D2966C7C5021A4A2AC513A41585A204946BF41584CFF95AC74227B50269D48CD5964040A19C339A8F8BE2D9351845FD963CDBA3E3C4B448B1AD79C3B87F79D3D839A6840C48C10ABACC0D3A2ACDF76805BEF5EC3C34F6D61206B61B92E139A2A993FB59365F32631797C82E6DA186DEDED18A6CE0BCFBFC0819E3E06337166CE6EA5BED294FD05F7F5E4D9DB93931A7543459CFA069F6CDEE4A6DFAEE3B67BD7108B2749673C328E256B74882784E5F31AF8F2272F65F6B476563FBB9DAF7CE326FEF29397B17CD94490859184BD50C81182A8455ABC2DDCD1E019F8BE8E70F9AC59B38B3D7B7A58B6741AD55526E203BBF6A7B9E5D6A7B9EF81E748A79C822FDE970D033C471488124D741D74238A1B89139B3D83CAC5B3F9C87993F8C8091D54897E68E209A95058E9F59E3FC5F18AA0CB436EF413B4E111F9E367472651E5AA47467DA1FE7042509744B4B32FCBE63E87415FA4DEEAD2F79C753C6CDF905ED7D219F5D735117898C24505D5E155CF1A39D5278A09A507D8BFF9799C94A8C591236D3BACEB8FB1211FE7A23357B07C5253C16257F05F9746D28526AFA51A7451C628FE6D485316581C525FA318359746CF42069004ED7B8852A143B63A9198229C1CB25D958393CF5315093869C102563FFE025535AD3CF6FC0E164F6BE02FDEB984C60A88181AB1448268348A6E98ECDE3FC0D69DFBC966F39214639180AACA040931A997CFCB47FD8E09AD3436D492CFFBE4F396246BADD8FD44A4DE8B92A6AE2B13595CCB2197CF48FBD4B63D19EE7E7823DB77F7326D721BAD0D491E7D720B0D0D157CF0BDA733AEA19AEACA28220774E3E6977869670F0FAF7E01C7F53967D5024E5E36155364120A4B9E63C93EDF791B0C23206F6B5C77FDED18BACF1597AF24168DF1E4531BD87760102BAFF3C0C34F93CFDB9C77F672060607686CACE1C0BE2E3C4F67D6EC697CF73B374B32F7AB6BA85CBA8459CB3AF8FC457358D159272D9DBE5E9C8E7E63D29A22E8A385A0233A9167BE86FBD43F832B2E8837BE442FB81963F205A3BA58BF8C32358DFD83799ED9D54F464F821112F440CE262BB2C5C4A36DA1C07AE9E5F17A2E95C3F93A5ED5EB515CB9B0AFE50638B0E939F2FD7DB2925DCECAB22717E3F1BE04D367CEE4FDABE613C8BA1FE11A4B270A05798A4941C9F525B5360E4D46092368F1E82DBAA184F5358A51F541D982059D5910B9F8BB23258D82AC213307056187EE0D3B635111C007DE790EE3E319D66E4BF1AF3F79800B4F9EC79F5DB8105377D1A326D5958942F53D61C71384EA228A2B897E8BE96C1ECB1637823C563E47E0384CEC6CA3797C2B6622269F0C743C06F3067B0F0C4AFFF2C0608E6432C6B8BA4AEA2B22D8763F962DDA6841FFA0452AEB9248681858FCFC77DB59FDEC06162D984ECECA71D292E95C728EA8EB0CF73CF002DFFCCEEDAC796133575F79325FF8D455AC7F612735B5513A3AEBD9BE2DC58D3FBE8F8ECE24175DB092FD7BF7C93AD46DADF5BCB8F100FFF29D5FB16173376D4DB55C76C54AEAEA74162F9C295D2D56D6A1B2CAA4BEA91E5D8BF3FDFFB999813E83DFDDF128FD4D6D542E9FC307CE99CEA74E9B4E5C78DC656661B16EF7EB39F3C2EB571174793C36FA23E8884EF4F9EFE0AEFE47027BA0BCBD7A8551A250BFB9F0E3A08FDC6CF4116DD0613E2CC82CE7073CFAE27EFAFC18463C5EC808343890B3B134A1136A8812CE2398795BF66E08C274ED0C3D9B9E23D7DB8393CB62E5B2F45BF074BA023BD9C417AFB940DAF1867A7F9756A513E45C983C3C1C411F5C6363B84555697D8D525B9DACAF51F03A4B0DBAD0BEAAD8EC5554AA13B52A703CF6EC4DC9CCB9692D0D5CF73797F3ECF39BF99F5F3EC8DC9953F9B32B57D13A2E89AF9BECEB4D317D7C1542CEC9A4B2B2C7A088C48543C3CAD932C1C5B2F2E49C3CB5B535B4B7B4128D478956082F739CADFB737CE55F7EC9DA8D3BD9DF93C672908E8CE6BA1873A73773ED7BCFA4BA52C74D0F4A4D5CD4CF10371622113EF4C55FB0A3CB420B5C34CF65C1F47AFEFEB357B064EE4499F1B77D678AEB7F7C2BADE36AA9AA6AE09BFFFE332E3E7F059FFCC43BF8ED6F1FE4AFBF701DE79D731C1FFFC8A574B4D7C93ADD426E7AF299ED7CEDEBBF664FF720313DCF673F730573664DE69E7BD7B07AF533B434D7306DCA783239970B2E398FA953EAF9C5CD0FF2D5AF5C47AAA299DA734E65E9DC66FEF9EA654C4C98050DAED8D5A1ECD36768A022E8F2301B13041DDB743DCE637F4790DD5FDE5EBDC22863DE47889EF20D30E247B49E37E3C34305E9029F6777F7B3EE409E644D9D4C991673F639C7A74F5CC8087216133AA12821FF79BD014CC18957BA1FAFD0E864A8E5959453A4842C269FF2F46C594FA66B3F7666102B93216BD96C722AD998ADE41B9F788F944286DB1A163305C3EE289444D0826CC5F2B2D6557E2855944A19C5A495E1FE8161D42CE48BE264A19C189456BA30ADDB96F2874D904FD3D6D0CA434F6C6560C0E56FDF7B22C7CFEAE4406F3FBF7A681D8E11E7FCB397B1FAF10DDCF5E85A2E3E753EEF38750E6D8D7172D99424E79CA5E15869A2318D8816913246BC2A492216150F38E4F538773EB49E1FDCFC304F6DD8433C9E90B53722C2DC261C24A257A3888A67B471D945CB387E4E0B869F93DB8F6FB2E5A5149FFCD6EF481391BEE4381E679F3285BFFAB3F319DF5089EDD9329DDB301274ED1FE0D6DB1FE4C1D59B9933B583ABDF751A9B366E67D3A67E2EBDF80462A683655B589E887303EC40E7BBFF75071D1DE389472D664E6E63FD0B5BF9F7FFFC151133C6C7AEBD185D37F9C63F5DCFC4C9CD7CECA39713040E37FDF40FECEC75094E5841DDF83ABE78D93C2E98DA50A8F1A208FACDE082D2758E09828EEFFD03F6839F21E8DB74447868F533885FF9304485D97FF42C438625F1388FC60D7FDC4675739B2439F1C09C760306F236AE26AAF0C9A4EE90280BC4FC7AF939A4F68397575AC7CBFE2EA3618FCCDE9DF4EFDB49A6673FB9C15E9C5C9A8CA7F1A2D3C0F2732F65E994163CA18BCA4941C1C98592A28568BAD4D75C9A2D18EAD122B12424E82152164938C5D655B2546858FF39EC27188E15846C89DFC5EC9967E1DB2EA201AC20D7A6CA4A3E7FE5198C4BEAF4A7323CFEDC1E3C372F1FFFFFF7CE75DCB57E3F3927862977D89451E607CF9DC9C72E582823D93B9FD8CE3FDEF07B164CEAE423979D4847438CA4E9138BEA44A2097A2D8DCB3F7BE3FF67EF3CC0ACAACEF5FFDBED9439D30BD319981960E8D23B82A0A8891A6BAC29A6F7DEFEC9BD3726F7A627D7146F62A229C6A8B125512CA8A8802220BD0E7D18A6F776EA3E7BEFFFB3D63E0706053D5272AF66B60F0F32B3CF2EEBECFDAE6F7DDFFBBD2F075A7A98775E2535792A9FFFE8E51CDE77446A6578FD1E8A470EE7DB3FFC235DC10C36EF3E484196C167AE9DC7B2B915C4AD08A613E0C6CFDD49BF290208958C3495658B2732764C392B57AEA7E148339FFDC8E55C7DC554E962138B0A77700B4DA6776C3979C762B654A18BC735EE7B6815BFB8F369028174465595D1D6D6C5F471D9DC74E3321E78E859FCFE346EBCEE02145DA33F14A6BCA4587E57ED5D1D1414E4A16A169B371FE43FFFF33EC2E7CD451B59C2D22A1F3FBB6EE671D12DA1FD721ADB50049DDAA0BD3D00BA7303B1173E87D3B13DB5BB3AC55E8AEEC7FB813D2881A2333ACE59FD70C2BD44469B8AC3919E101B9AE3E81EE1741227E63874456CC2A2334CD564FE5CD0F04E24C09DD52B7A938309AEAC45A4A79DDE96467A5B1A0876B7486D68A110D71E0FD0513E979B2F9A438EC099B840679195750B7E227A7E2D38BBC09BB0A63AD61DF8FA08FA58349D10D73F46A54BD85589283A2AA874C228362EBA1C6DA93DD1D91FA3B9B5939F7CF40A1657E7D0D0DEC3577EF30263CB73B8EA82496C3EDCC1BD2F1EE0506B5C52CC4C3B4C866671D9EC0AA68ECE273F3B83E7371DE2A1557BB04371668C29E6C3974F656A550E5E03E24A1AF73FB795DF3EB18B505F275FFAC0855C30B98CC9132AF0790DA9156D9B361DFD7D6CDD7D8467371CE5DE475F116E855CB168145FBA71219A3D80E9683CB67217BD4131F1D81C69EC64DD96161C5D98CF86890D04F9B74F5DCE37BE70312DAD1D3CFFC2368A4AF21835B2180783D5EBF6B273E7513E72CB6232B2D2F8D3FD6BF8D91D4F62DA5ECC6888F2920CBEFB95CBA5D0FFF77EF62899593EBEF7ADF7B27D571D7F7B6213975F3C9BEBAE9E8FEE31D8BAFD00C1C800C545053CFCF04BBC14CCA63337979AAC280F7C7C51C21C3E2943FAD69FBF21804E6DCCDE1600ED379B89ADB815BB61756A77F5067B79DEF3185AC545677C9CB3738044549930AE306D8515DBF613CFAE9020261A5204D7B92322AC47C54E2E0BF53863E3F4A297D3BF7637D6173248B1503F031D2D74371DA1BFA59EE8401F91984938E6B0D1338E65E7CF654E4D398665CA6298E87A14138EC4E8C1C541DB923A1012A093DC68E16C92307B3DB13BD04D79B862FB6EF1F07554BA9809428FC48A10150EDD2187C3CD411ADB83DCFEC94BB86A5A213B0F7771F96D8FF29E59D5BCEFA209ACDDDDCAFD6BEA68E80E93E9D1C84C73C822C2A76F5C4ADF401F79197E0E3675F3DB47D79199974F535D1D5FBD611E972F18236979BB8FF6F1A33FBF80E1CB60E69861541705F8C8F5737114836028CAC04018BF57473344FDC0E07FFEF2140D6D0EAFEC6A223D4DE56BB72CA0A2409379E8984863490A9DC6C69D2D7CEFCE55988A8EA3DB38E1305FFEF8C5DC7AFD0CC20321F6EF3B443466535D554A7BB7CDB7BEF317F61DEAE4131F5CCC65974C61FBB646FEE7EE2739D21EC289EB32EDF1DDAF5F4A46208D1FFEEC11468EC8E72B9FBE8C47FEF112F73CB09E6BAE98C67FDEF6613A3A43FCFBB7EFE4AAF7CC63E182892C7F6A330FD546E8C81B468ED6C7B35F5CE2A6A9A4C7A4D00F7FEBCFE11040A7F616BE2D005A745DC59EB8FEACB87A6BA3AFC373C93DA98DCE39DE2B11344B2924C1DCD8D5D8CDAABD8D948CA892790101D1BD11E88C5852E3D9CD030F7A194ED6717226B21B27BBDFD71DCFFD81742119E8A1AFB581CE43B5F4773449801674AFDA78319EE2D1CC993289492386E1157AC5223123DC4B060923C9885802F471AFC06403CAEB54E912D655526FC37485F68F19BECAE614578B2466464044D8669CEC4C3F0BC68EC4B61522518B25532A1916D038D4D8CDD7EE7C8E8B678D62F1C4E13CFAD23ED6D6F5E0317432358BAB178EA5B3BD930963CA098623E466FA39DAD84ECF401453F5B273F77EAE3E7F32E5055E06A20AF7BDB897879EDFCB8D974EE7BAA53514A4EBD2626AF781A3540E2F2533238DE6F62E0ED71D61E1F4C992E7DCDC61F18F557B7879D35E96CDAEE48A4535188A70A7B1D8B9BF995DFB5BD871A09DB5DBDA7144CD44D0DAE271468D18C6D47139BCFFEAB94C195B4267CF00CFADDEC5F2957B58BDFE30B198C69C89597CF5F357931BD079716D2DBF7F701DF547FBF0E90E1FBC7E0AB3678CE6851737A1281AB3A68D95935E5D7D1B1326543275EA6899427BECF1754C9F3E8ADC9C4CFE78EF4A9E3E1441193716D5E967CD5716CBD670292025D3D0A7961538D52B3404D0A981CBDB03A0BD1AB1E5D7621D7C3CB5BB7A83BD14231DEF47EB51FE0FF812BAF460297E40D85278E4E57DF4797C9414E449301639C58EB04D8F10DA10E02C0D5106472BA78BC6A73F8C32E52852BC227232C3447A3B68AEDD4957FD7E9987B6A3033446FCB4798A482F19CDC5F3CEA3AA301B4B74A909FA9B743E71BB0C93002D9A5092CC8C6379E6846EF3F122A12B1DEA02F4F1085A449D82B9216450456130160BCA966E33AE909399CE2D8BA730B7A698CC808F17B71DE268632FC387E5B163DF3EC6578DA0A727C4F20D07C1EFE7D259A3C9F32B1CA96FE6C08123CC9C310E9FC79014BD7DFBEA78F79259F83C3AD1A84D9AEED0DDD3C191CE28BFFCC7665ED9D3CD7F7C703197CC2A21CBAFB362DD5EFAFA07B862D96C29C224AEF977F72D67EAC4092C9B5D4D4BA7C5F31B0EF1E7E5EBA92CC9E43337CE23C70FDD6195EFDEFE08DBF737513EBC90BE7E4BF2A5354DF0A155E2518BD2BC087FB8FD134CAACC055DE3BF7EF138773FF03271DB8F1989F29B1FDCC485E78F47B1426CDBD5CC776E7F926DBB5AF0185E46975B7CE93357CA7CFE5F1F5A437757841BAF5BC89C59A37865C34176EE3EC89C59E3A81E59826A183CBD621D1B361F615FC44FE6AC29C408F3E297CFC727177F2E956828823EFDF7E9CD3EF92F07D06240BC573F8B5AB6E0CDC6E69CFFDEED78B625F61EED0CF3E09A3D148CAE22CB2B3AF15444EB417BD8A63F96606B9CF32B4AFD042222564503486480B603BB69DEB78B486FA7644B74866D7A1D3FDDE92398357B0E4BA78D910EDA22D5612554E88E6B6CB85D82C7DCB813EDDBAF7546B107E59945AE3B09DC029C054759A64DE282B9102266C531C30EDDBD712E9A51C317AF9985473778EFF71EA4F65013D3CB73F87F1F58847053F9FD935B79EA957D8C2ACBE72BB72C233F5D65F3CE7A543BC2D489C3A5EB89B0988A5A3699693E2C33447666366D4D6D7474F6D2D4A772C73F36B2F15037D7CF29E1B3372C24C36BF0D7E736515E5EC8ACC923A96B6CE3BCB115DCFBF73598C0A7AE99C7A18630B7DFFD142BD61F66DE79357CE9FD7329C854680D3B7CF5DFEF62F6CC69DC78ED5C0E1D69E3377F5EC9FA1D6285A2A29961164C2BE0E7DFFF38A5394234CB61E79E56F61C68A72FE4D0D1D1C6273F7011861A053BC6BA4DF57CE7F615EC3FD283A2EA5CB67034D75D3607AF07D66FACE50F7F5ACE55572DE0C61B2FE6D39FFE09FB0F1D62F1A2697CE93337A0F974FEED5B7FE4D5CD0DA48F1D43C545F3315593155F5C40BA8C2D5C95C5D3715A198AA0537BD7FE25015A9FF54D8CD9FF96DA089DE3BD441422F278EBF735B272672BD5E78DC327B514544236B484E284E3A75A42FEF323689975948C3BD7C854B1A2F4341EA679DF767A9B1B880CF4110E0E108EC669338AA898BA984BCE9F454017AEDA0A8EC84927981C96A4D125CC5E0745CCAFCD3B4BFD8C41CD2749F076F59DDD766E91F270E216B1480433D6C7F8B2524CD28944427CEE86F33954DFC257EF5E4986C7E0FAF913B9727E353DFD31566C6B94ADD8B3ABF3193D3C93E52F6E60EE941A8A057D4E350864FAF1780D34434CA436E118787418E8EBA2B72FCEC18630BF5EBE8D757B5BB8FD2BEF61D6A84C0CC561F596FDB4B5F5F0BEEB2E213B53A72F14E547BFFC0B4B16CDE192E9D5F45A3A1B0EB6F18BBB9EA52C3DC0E7DE378FDC348BCEA0CD4F7FF157AEBFF6122E5D3A51AE18B6ED6FE6C7BF7D9C504861F1EC712C9C554D557996E44A4BDE8FE391D2A46271250D73A33184359910107F76D54EBEFD932769EB73D0741FA34BD3F1C7A30C2F0D70CD758BA9AB6B276A06292BCD65CD9A7D8C1E3F82C58B66E3516D56AFDBC58BAB6A797EE556BCD515542E5B886DD82CFFDC5C32E56ACE5DD90D01F4B90389B70D409B6B842FE16F211E3AF3D1300278AF7A0AB568E6991FEB8C8EE04AF1F7C5151E787127FD5A265555A5A8F108263ADD5187D6011353E49F4F83EE7C4697F6261F96D1BF34034076D585DA9BE8ADDB4DC791FD7435374B3B2CC1A8684B1B41E6F8455C38F73CCA3234ECB85BE893A90CE16F28803541911BACEF7C2C829646AF2EA73999061111B4C837CB7F4B9A5D18D190220A8B66D0E45DF3E7306A7809F150174BA78C42157E7C1E4853559ABBFB68EB8C70F30F1E624F4B04CD085093E3F0C5F74C9682F5AB37EEE243974E27A6F87968CD6E1E786E27936B4AF8E6871633B9A2905FDFFF38E98100572E9E4B6BC3513A43264F6F6DE6AF2F1CA6AA3893FFF7FE0554157AC8503D1C0D3A3CBF612BCD2DADD4540FE7CA8BE65098E9939D7BAFD4B6F0F51F3F4A575794AF7DF8022E9A3712D58CC97674512C35BC3AF9B9D93285613B2A5ED5C0B4A2C44527A960C2881491F87FB12C114F919CF4145984154EE58A1D97A92891BFEE0AC153CF6EE2A18756B178F1242EBE702A15C539B4363773E4681B5959856CDEB297E933C771FBED7F22AFA084EA9A49FCF72F1F4133A4510F81CAE1542D5B84EDB1F8FB276792257E282DD54E4FC47F28824EEDED7CDB00B4B5F7414CC1853EC36615392C9A0763EA17D0E7DE96DA289DABBDC403AEB8207CCFCA9D78871533A22417C516A0ACD311B4690D99B251E5ADD7C9CFCD452714A71334BF84D4A9484B840718686BA4E3E01EEA776EC0944A7751FA940CBAB36BA89E349325D36BC8540598B8A2476EEED915DE7F9DD9AB28048A7D04E80EF212143F8B460550B9EDDFD2834FE8520BA797B84347D022BF60381D5D3D0CCFF1F1EDF72D66DBF61D8C1951C48C51C3D974B49DDF3DFC22EB9B606F7318AFA671D3EC726E983D9C83F5CDAC5CBF9DCF5C339FA0E3E7AEA737F3E48606C65464F2EFB72E64EE980A1AFAFB8974072909A4D1DDDB43674F2F073AA2DCFDE44E3C812C469764529619E3D64BA7A27935344F3AAA9646C0AFE26816BAEEE5177F788CA63E87F5B51D14A4F9F9CE272FA2B4C88B1535B14362A511C774A2E46467911908C8894CB42B498F492909EA4ED7429B251E170A83A21148E482C57322BE1321CC1FC5892B6E4F90A611770CEAEB3B292F2D4053A2C4A3415A3BC23CF7F201D66FAA63C3E69D5CB8E47C9E79661DA6ADE3F77931851D9623689D161963CAA8BA6801966EF1B74FCE9011B44C710CE5A0CFCD8B9638EADB06A09DBE7A624FDF82DDB2E1988CE5E98F8C825A3A0FEF35CF9DFE21CECA274504E2B0BFAD9F3FBEB09BD2CA6ACA0B32112D0716BA04EED6601C4BD2EB5E2341774C1B63D0859CF0B3C16C8FE43E2791B17BED71DEA40699AC511EFB58C252CBB16C62E11003AD0D1C7AE5597A3BDD2EC3483446B796472C7F0C93CF9BC2FC89A3F16A8256771CA093290D195927981DA245F9C4EEC0C4BF851B8AF41374591B02A0ED585416E10C8F8F57EB43744684CAB1C6F8F23C968CCB9574C0EB2F9ACAAC51651CEAB779FFB7FFC49EDE742C5BC5438C4B261672C3CC52BCBAC5FEA39D4CAFC845F3186C6BEC66DDAE26C6561470F9BC1A32020196AF59477E7A16D34795D3D3DB416747AFB4897AB9B69D07D63470B4AD8B65F34673DDBCD18C28CE241E8E2452242A597905EC3DDCCADD8FBFCCCA17F7505452CC47AF9EC527AE9E8162C788C42CFEF0C87A0CC3275BC2C754E6332C2B204156342505C3260D2D5D7409479D8843437B90EEBE20FDFD11A96F921EF09395994E699E261DC005FB64586E3AC2C65040A9AA8B62652CA1FAE7F0FCDA43FCECD7CFD2D51B930541316A49BB34F15D688AC8928867CF266F4225232F9C434C35F9C7C7A71348E6A08700FAAC20C1A90EF2B601687103F10DDFC7DCF07DB062673C286AC124BC37ACFB5F174E1200FDEA9136FEB07A1F93274CA434C7475C11D1A34ECB80497348E41913F29D83F8A62E01E4D439E89355D68FB146CE70F4125DDFC7F59E931D8D62E96DC668DBBB85D603B5F4341C20D8D5268571426A80504E2517BCFBBD4CA82844111A19423B43E44C85425EA21B5000BD00665344C6096ADDE0085AB6710B2FC4A4BFA0480BC462A8668459E346F1CCEE767AC21AC53939146579A8CAF370C1B4914C1C9E855F57E973FC7CFABF1FE1F13D2255A649AAD9CC8A4CAE9C94C3D8021FAD9D3D74456164413A238BB3F1FBBD780D15DD9FC18EBA3646E406D044039119A7ABBB9B48FF008663A17B7C3CBCA985A73637D3128C32BA20939A51651CAD3B4AC0508859363593C6B2F2A56D34B60D50539AC907AE98C6754B27929BEE9500DC3710E7435FFF2D55230AF9FC872E939D8642DF595CA7C8313FF0CC761E59B18D1DB50DF405E3320DE65155A9C02744F6ADB84644E8B4587DE464FA98589DC775EF9ACA82E91520A26C494237E5337FB825CC8F7EF5349B76F724D267B6D4821691B8C85DD98AE0E9086D68B8B6DBAC0000200049444154F7392B9B359EE18BA711B50678FCA3B3E513298D225EA3AA98EAA33594E2486DA4DE56006D376F20FAB74BC00CA676776FB097925D85F7DD0FA1E48D3BE3639DC901C463BEF640237F58B39F69E74DA12CC78B684BB16D8DE6605CFE912DDEB22960F0262A42A73EF371807ECDE7DE4A5D5102EFEB3F70B2E0FD9820883064ED6AA2BBA19EF643B5B41EDA43B0A39998E510D4B3F04DBE841953A75053988962C52485CD357E75B9CD326D3108A0933E8372BF24F7391A763D06A520BF89190E529D97C1758BE6D0118912B11546E4E79217F09091263CFF84E59FD07AF660695E9EDF7E845F3F53CBDE862EDAFB2CAA0B7C5C581360C9E812B23C2AF73CB785E125C31857293A4E856B8D82E928043C2A23F23339D2D2CD81CE8894171D9EA1519A019A1D27A807D872A49B977635B3F560BBBC0EC712024A82871DC7AB397815583CA78AAB2F98C8E2E923C8F40B8714D77641AC0A0E36761248F752989D8EF05314631DC760EBBE16BEFCA3BFB3A74E00AA978047A3A0C0436B530F936BCAF1EA0EEBB71C46248D8533555F5850A7A3CC9D52C6C76F399FB165B9684E08413B178E914290E927BF7B86755B9B133C66D7BC57344149912BD9879268A4B26D2A174DA36CEE646CAB9B473F3C47A637444A6508A0CFE4ED7FF3CFBEAD009A7898C8BDD3717A0FBEF99DBDC91E8A27137DDA17D1677EFD8C8F75260710F0F7D2BEA3FC6ED55E664E9BC6F05C3F36222FABD13C10A741444A8A50DF3B19509EFBCCF4C9087E273BABCC8BCAC8CB41318344FB7A659761FDCE5769DDB75DE6A84D5BA5BB700A199553993D711423F203A882B72C73D089A25F92EB3C485F4344D002A05DAEB385191502436EA150880F05548B2B674E666ECD08D23C0E8AE641D76C54D54155353445435555148F1745D3246DEE4047880DFB5B7962DD5E46E4A771DDF935F86361FADADB69ED8DCA2EC0CEBE10D1B8499AA4D7C1A4AA723C19693CB9763FF7AFDE8382CECCE1395C34A588E20C01C4AA2CEA7504159EDBD3CE11918EE81542FF0E695E83E23C0F13471673FD4593292D10A907054D17D7A6618B13D831E29A5F521185283F8E8EED68ACDB51CF2FEF7F81F53B3A89251C638A7333F9E42D0B58B76E3353C755929B13E0CF0FAF60446905078F76B3657FA7745911E3317B5219B75EB3800995E9B2482B24B762B6CE3F9EDBCFF7EF582E5DC1454A488E95D0B2967E648A2BC895B0191B7BF17C8AA78DC16B7771EF07E7BA1C68E9C69268837D8B2FC150049DDA80BDBD005A4413DB7F87F9C26752BBBB37DA4BC876E68C469FFB1DB4AACBCFFC7867708457EA5AB9FDC92D4C993C99B1E5B9600B912183B688C3A1DE1831C74D71BC267E4EB97098FCEC5BA5439D2AD87E2D408B55F1894D8D82F32C5AB223F4341DA271F716BAEBF6D1DFD986198B13F11760948EA7B2663C534795499DEFA43595E04BBBC2FB2ED739A9F12C53209610DE8F6346232E50C74D86A57BB9786215E755E4E3F778F16AC2EC5C14E73C58AA87A86899D73C78BC3EB27C6EBF8F4851689A2EB9CD5DFD11D27C06F959E9C4A3513AC32677FF63A3C4C7FD878E503A2C939EBE209565E518BE007F5DBF9FCE9E28ED7DA23A675193AF73F3F92319374CC710D1A7EE45511D59609346BE8E23CF251A5EFC690659997E0A72B264E1B02B6CF2B717B7B0EB40334BE74EE082699564FB5D5F402148D5DE17E3AF2B76F2C0333B38DA1EC60C45583CB59A6B2E9D8C19EC615CF570F61E6AA6BDBB4F6A880845BD9AD1C54482260D6D7D1869593CF8E44676EE6DA0345BE5EA8B26F39E25D518C2100295AE8108F54D21D7CFD23669E930B9EB9EA768EFB1510C0FAA68F2741C4CDB64FAB54BC91D534645468C1FBF678A0C2204A8CB89F934E28421804E0D30DE76004DAC8FC81FC7E1843B52BBC33701696DECCD180B7E80E2CB3DF3E3BDD5232410706B7317DF7F781DD5636B985153816345A4F75B8FA9B3BF3BCA80C08264D76182DE264EF5DAF76230A09EEA776FF6F354332027D412072937B9B42B7191C2845488FBF7D3DF7A94AEBABD341DDC4BFFE1EDA8964D9FAF0C5FF54C66CD9E4E41C070991882929028FEC512396801C43149B38BC94614272614EB6212B823668C9955C5DC346702E90298555532297AE236B58DDDEC6BEAA6A3A783886033E0E7BC9179CC9E54C1F8D21C1C3386A65A32BA56745D82BA652BFCE6C9EDFCF2B12D44C226A1984561A687F6EE7EF20259A4F93DEC12D29B9683660BD5B838178C49E7BA9925641BD0D21BA1B12344F5C86114A48928DEC1301CD23C017C5E3FBAD7405563A8DE00583E7EFFF87A7EFBD4767A223AB99E105FFDE022A90DA2AB22E7ACF26A6D3D9FFFF19352C449F8079A7D9DD23FF1875FBF16271EE7AE0737B06977036D7D21D90894E6D3A828CDE657FFF62172D2355EDEBC9FEFFEEA310EB79B92765791E3E1CF3FBD018FE2B22FA4988023FC5A84588A494CCBE2A7BF7E8615CFD7A2FAD3A4EEB86C22B2E3CCB9E922B2471631AB348D2F2E1AE9D6AC132DDEA781CF4382FD2962C5DB0FA001F3C52F10DFF6EB146FF18D7753F3C7632CFC316AF90567E5786FE9200952C5FEAE20B7DDF7121945C52C9B3D1EB19ED69D3803B68703BD269DE1B8949F74D31CC76546DFD2B9CEE9CE276769BB4C2C0B27D24FA4AB95D6FA031C78E93962A2E3D08181AC4A72269DCFA4AA0A728CA8044DDB52888BDC74425F437A0B8A42A088A00548C74C82824B2DF635C32C9B38822B678D93FC5FC39BC10BFBDAD9B6FF103B9B06B0550F5FB8763EB5879BF9FD632FB1647A15A1602F15A5657CE3C6C5F824B7212ED30C86A653D7D9CBF5DFF8131BFAF3DD82992AF2B842D75A41B15CAEB1A27951054D109B2C9FCA7BA79470C9B85C2CC7E2278F6E667B5D37238A037CEBCA69B23350D521EA78E8891B0C44A394E76530A2D027F59FEFF8DB36EE5EB193385ED2F520DFFDE4C55C37AF1255D41B1483675FADE77DDFFE078E6690E3B7B87EC978A6560F931A214FADDDC3777FBB12430F8010531257246889F10897CF2CE20B1FBD52A62A9E59BD8B67D71F60DB8166AC5090E7FFF0297C7A58E69B053B44B6DE3B269A62D03CA073F7FDEB79EE859D685E9F6B6D25D22D3ACCBAF142F287E773C58422AE99982781FDB58C9EB7F2880D45D0A98DD6DB12A0ED968D44FF3A3FB53B7CB3BD140D6DFC076467E1FF8A0CA9E3D012B6F8CEC3AFD01054B969D90C7CAA2DBBF484C1D7A13E9BC67ED159E882A0CB7375E3DC5389ECBFD92D9FFDDF2762A8D75D902B4729A237271624DCD7CDA1575FA153E876743711B675FAF3C65154319AF1E5B9D22F302E4D4F5D668654B4139C60F1FF42465476134609C5903A2023B20C2E9B3E8EAAE2610C381E1A431A773FB3815B2E9A21ADA57A3ABA593C71047D11879D8DADCC9E54CAD3AF1CE5570F3DCF17AF9FCFF431E514667BC80E783034C18080BB976FE44B7FDD03A23BCFCD35B86C05416770DCBCAC224D6F05B726CEF080CAF4AA42429110F5ADDDD2C75080FA4DB34B19579E83A378786CD3519ED9DE48576F3F534695F1A30FCD970982BFACDCCBFD2FEE46513C8C29F473DBA72E61628968A2B6B0149D47571FE1D33F7E12C3A392E977B8F38BEF964A79ABB61FE5BF1F7889C65EA18EA74A0307D934925CFE845BB962C9443E75CB52A90BFDCB7B5FE4D9B57BA460D4BDFF752DD5E57EC984110174D4B4E80AC568EF8E73CFC36BD9BCA71DF0C8274DA438E28E495A410653AF58486545161F983792F38609929DE05DBB63733ADB1040A7366A6F4B8076A2BD44EE2C962FC9D9DAA45FE13F3D17ED86D05114EE5ABD87DF3EBB9B1BDEBD88B18569AE9A9DEA70B4CF626F97852DB4A045482791396989727A2FC7D91AB3138F934487E3D1B46001C8FC66A2A941FC6D0F7433D0DE44DB9143741CD84647533D617F11C5131750555E449A139251B274E016AC0E91738E455D4F4091EEB063D803212AF3025CBB702A0579B96C6CECE7D57D8DCC1B3F8A8A4C1FC3F3540CD544D7BCA0EB688A28C6093A9A23B58E1D7C6C6D0B72DB9D4F307B42259FBD7C1A25D93E34D1E8A1298CBCF54E8EF4795144D14F4E8D3AB6E8469486B78A3403C8F55AE4A57B38DA19251277F0C50778F9E737317EC43039A1FCF1C1A7C9C9C8A4ADCBE468284E5B5F9CF5BBDB69EC1EE0BD8B27E25322747675525C94CBF4F1C3A92A2DA0625806861391DF73C8F6F0AB8737F18B07379395A6307FCA483EF1EE1AFA43369FFAC183B4C7BCF8155D3ABBCB967B4744FBEEFBA0C8E6C230D72D1DCDA50B26F2F8EA6DACDFDA40635B9C8F5D359E9B2F9B4C38D48BAA68D4350FF0AB7B56B17177379AD020571CD951292D212C074B8D3366CE04C6CF1ACD85938771F5E4323C89EFF474F3CFE2E843009DDA5BF8B6046862FD44EE9B81D35B97DA5DA6B097B1E40EF4B1B7C882D23F6D4B584889F33D53DBCCD7EE5DCD94A953B8625AB9FBD2290A4D0371767599B2502838BB6E249D781165DAE3FFC2969C284F4C75B8854301D222F8749D0944CA231E0B11E96EA3BD762B0D5B5EA63718225E3E93E155359467AB1822C72C0A81827E970468C1E410D1B465931EEDE58A3993995E3D9CFA5E93BBD6D63160C6F8D2BBA6333EDB83AAC4B00D1F2D41D8DB1AC2B21C72D374A657E592ED17AC62A86D37F9F9DF5F26689A7CF6B2192C9E301255B1D134856FFD65356B76B5CA0E4E51446CEE8DD36F09F70111559A8C2FF470D5DC115497E6F0F8EA5DB4F645195592C737DE3B8382AC34D9C5B7BD56687CF453DFD4C9E40923A9AA2C63CDCE467EF78FADACDFDDCCC4520F5FFFC845CC1A5342A6A1BB5443332A530AA27B7BC0D6F9E9FDAFF2BB27F690996673D1F44A3E73C56436EEAEE79BBF7A9A982F0F4D86CC82BFECE6FC45E94FA4617461D86B47397F723E5FBAF5121A3A82FCF1E1977875472B372CA9E05337CC23141E90CF577D5B88FFB96F1D1B7777A088204040BEFC3A8571818D2FCBC7AC4BE631615C3E57CD28676A71967419175CEAE3CCA2B71E280C01746AEFEDDB13A0AD28E6DAFF20BEF9F6D4EE3285BDD4E14BF12CB90325B32285BDCFD22E12C0C4C38E2C067EE6AE67E9B4FD7CEB86F9C2A44FE63E7B62B0BB3B4657C4CD4BBA4ED9C251E5E479DFB374656FF13083A3E7133FEABEBA6EC7A4B851D1FE2022512516A1B7E930F51B9E9352A5DD6923304AC75153964B8E1AC30E07654AC315438AC9885A44D0F198C3ACB2742E9F35994CAFCEC6A3BD3CB1AB93F29C00EF99594145BA435C0FB0BD23CAE35B8EB2E17037C2012B60C0F5F34673F5F44A8AD34D6268B40C44D975A495E2DC74E68F2997C0AD8A49B12F486B77580254534F88BFAED9C7939B3A08590A694E90DB6E59C0F5E757E1B1E334B5F7C9083A3F379D7C617FA5D832EAB41C3FE1688C50344AA6DF4B7ABA977E74BEF9EB95FCE1E97DCC199DC3AFBE7115A372546241A1BFE1E6828576B548A1F4391A3F7B600BBF7FAA1645A419EC5EFEF29D9B254FFA6B3F5F8EE9CD4195939F28584A5DA4E3E228B62639E68BA61570D9F96379F8B1F56C3B3C40C8D4B879E9703E76DD1CC2E101F9BD347646B9FBAFEB78695B23A801195523849644711087B2D165CCBA643ED3AA035C755E3185012F9A08D11DE1EE73EAEFFDCD1EA021807EB311727FFFF604682114D3B11D73D557B01BCFDC65458E84E6432B3F1F7DFEF750F3C6A7367A67B897CC5424F29CA2A9E19EF507B9EDA175DCFED9EBF1119536514243A1330207BA06E8347509CD2EA8FF5F02E8D40742AAE149FEACD0BDEAA3E7F00E5AF76CE1486337E1BCD1949416539D69E304071202492E408B3FC26F50B7A27CEDDDE7939F25E86C1E5E38D44B7D5F94778D2F6378A64654F1F2974D0DBC58D7475D579490A8AFCA79D0A130C3C3D4615E3EB264148B46E7E0185E9ED97A98C6EE20372E18C7B0805746FBBAE0AB25F8BDCDC118773CBD933B97EFA6330CDE583F5FB9FC3C3E71C514BC4E0455C0BAC03431F5D8AA6485C8158323920F02F1D5844E8650C8D0B873F9666EFBE32B1465194C1B53C2F0FC0025F9695417E530B3A6149F21F2DB1651C7E09E670EF0DDBFACC7A32A8C2EF6F1D5F7CEA2AC28979FFEE9399ED9D48C62A4498016AB2D194C8B71552C9C984D49B6C2973EB098EA11053CFAD4569E58B38F8E7E93EFDC3A8B0BA695108985E598C42216758D5D34754758B7AD83CDB58DF447DDA274667E3A3396CEA1645421EF9998CBBC113918AA822681F9CC566F43009DDA3BF3F60468716F560C6BEF03C45EFC3C986741E12E315EDA8865782E7B08297FF64FD8645CE922358783261FB86305172D5CC0D4522F51E1462DF29F8E4E437F84ED3D36A6941E15F969F1B9337B49FE09B7F7BA530872972CBA89175CB035BA9A69DFBF83BD9B36D1172823B3743863B31CD4900BD0A250285C524491301A0E316944011F9B7F1EB6E610D7023CBAB38DEEF000EF9F3D8A228FC38E1E2F5FFBDB469AE2DEC47798588ACB85878D1AECE6FD73CAF9C98DD3244DACB93FCEEA3D752C1C57C6D8C23C2C2D8E070F0396CD81B65E1E59BB9F075F3C446F30268969237254FEEDE625CC2C139E91A62BBBAA3A38BA9781709448D096CC88CC7C0F9982F121DCC565C940C1D1143A623A5FFDC5638CAA28E3506317ABB7D64BFD8B9A0283FFF8D8C54C2C4B9391B4781E9EDAD0C6277EB512C3F0936E585C3E65189FBB7EB1EC64FCCFBB5F606753D08D78E5F420645BC1107F625D7CE4DAF97CE8AAF93CB5660777FD6D3D2D9D31FAC2511EF88F2B28CBB23085238AE81CB44518E04E48ED418DBFAFAEE56F2B76A0FBD21933A38AE94B67E3D743BC6F5A09E38A3265FDC3ED527DEB698DC10FC31040A7F6F6BD7D015A3C96DDFB30577F15ABEEE9D4EE3695BD541D63CEB7D1A77F3995BDCF6C9F64114D3EF482F0A5F0F3E7F7F3E4C17E3E7ED144BC8897DBAD96472C83550D03F4C5F50407F5389BE3CC2EE2DC7C5ABEC26F44AA1691A688FC82DD52B3A3F6A517E85272F0978E605C868D1AEE77BDF912006D86C3A42B36EF5D348D490519E8C2895AF353DB0BF95E8551D9C291DB6175639C6F3DB593A0919158F24BF16A771345B4F0004B47F879E0B38B5D4686D7CF139BF731A62C9F29A5C3A400BEC8F3FFF685DDDCB97C2B755D71FC9ACE4D4B2671DEC85CB2BC3129A664C44258A2F8A829C46C833D473BD85FDF2AA14EFC1154C16105394C1C554E6E9AC7A51B8A31D1344251C8F07BD87CB49B6FFFE16536D7F6123006F8DA07E672C3B49128AA255923ABB7B7F3F1DB9FC624434E665FBF7936372D1A2BF3192B371DE16BB7FF9D889D8662884E53E12A13271EB1F9CA0D53F9F0B58BC8CBF0F2F3FBD7F0837BD6A0AB7EF4581F8FFCE47AD2957EF9ACB9591137FA562D15C7EBE381A777F1C747F7905590CFB21B17935F964D893FC2B5934B2913097CB90D01F4B9796B5E7FD4B735404BB3D19D77115BF38DB3A2CF911C1EC59B85EF63CDE75E482909D072D9EF46D107FB4C267DF3413EFFDE8B9855918F1D176DC72273EBE195A63EEA07043FD7EBE2CD6B10F0CC629A933F72A936AE9CECD3A7BA1E9183161E8B12396321826D0DD4AE5A415BD487BF78046302266AB84FFAFA49808E8650A261168DAB66E9A44ABC6234349BA0E6A3C14A6798DF4FA1164151636C6857F9FA937BE857B3130A80421759A4844491D24089F4F3AE9A4CEEF9D02C2C4DE795031D3CBFF520372F9DC884924C6C1191DAF0C9DF3FCF1F9FAB43F5A6737E75806F5D33839AC234D7762B16C7D04494ABD3692ABCBCF9203D7D034C9F3A0DD51790E90DBF1966C7BEFD7476754999D5CAA20C297A250B8D8A85D7B6E85302FC74F96EFEE71F9BC18C70EDEC32FEEB9645788C18B61263E7A13EBE79F77A763545E524FD891BE662F77630A2C0C3FCE9A379FAE5033CFB4A2D750D3DB2F53D274B61C6D891FCE7976FA0BEA59DBD871AD976B09BDF3DF2AA5C818C2B31F8E9672FC2AB4425033C6A6B0CC47421F62108D1F49A0A77DEBF922DFB06C82DCBE77D9F7D2FBAD5C3BCCA4CE6570D23CD487EA367BE721B8AA05383F8B737404B94B230577DF9AC35AEC8615375F471EFC758F84330A4B9CF39DA121CDB63045611BBA92CFBEFA7597FB8971B2F9AC19289A57884909088EC84087C5F9CCD4DBD0C38BE44EE53148A34B7927F963779C893A0EC1B46C6295C83CBE54E04B642FBBABF87FD2F3F4B634F8C404E29237C119C50A72CD2093124AF1D63E98431CCAD2AC650A2A86A3A8A1143D1FD2CAFED655B731F1F5F308A919982C29BC513B5ADFC62CD11BAE33E6CD18227625A278E27DAC7DC0A0F3FB8793195E996A4E1B53B5E8E76F533AE20409E5F45B7350EC72CAEFBE1636CAE07DD037346A4F3A1D963983ADC4FBA1694EEEA82DF7CA4B5875D473B28ABA8E6A117B7B2727B1D39E97E0C4F1AF54DED8C294EE3D6F72C24CF17A73CDB4B71769A8C5B35C5A47140E7377FDFCA63EBF69393E1E5E60BCFE3AAF963C8D2FBA51B8A62E95214E95057905F3DBA96155B9BB1AC00A61964E1A4726EB9741607F7ECE4F26553F1797C7875039FCFCB532BB7523DA18AA757EEE0378FBC420C956CC564D9CC6A6EBC6402697AD89DF01D8D577775F1DDDFAF268AA0D72968899E7D6F96C265D72C65D4A842E6566633AB220BBFD01E7DAD77CAE9D3A087687629BC276297B73F408BC59D705BD9F28BB3CA8B56BCD9E8D3BF843EF9936048F5DB73BA09CD037773787047335FFCE32AD233F3F8E0B249D4148BE5BA483A2385FCEB7A4DF6B485E8B184D3B72AA351B9B41E243F7A0EF0FAD8FD0FEAEC7ECB6372A2E7ADEB08120F0539B4FE799A3BFAF0650EA354741586BB880B3D0FD362644136174EAAA128DDC0706CB20C0B47881EE91E36368768337D2CAACC23D788E2D321AC66F08FBDDD3CB6BD9EFA3E9794A863727E652E9F583286C9C5E2FBB4A522DD4BFB1AA4FCE9F935C578B0112CE95575DDDCFC3311D10710A2C8AA196252B6C2B7AE9ACE84121DCD51A52A5E7BC8A6A12FC60B3B1A7878F52EAE5A3A93922C91065058B7E728AF6CDBCBF88A3CCE1F9DC794CA02A65697A2A971A9B35CD7EDF0ADBB9EA77DC0E413574E67D9B4110444641B15AB0BE15C28F44C5C9EF3DEC620BF7F62232B77F710313572FD0A8134132516E373EF5F2A0D6DD3FC5EE6CE3A8F7FFFDE9F30B27289C4140E37764BB1A425138BB866F1388AB314B7655EB1885906CB5F69E2F7CB6B31142D61E61BC7D162CC59369B050B27C962ED053585E407C4F3255B57DEF2F77DAA0F0C45D0A90DE53B02A0E33B7F4FFC95DBCE8EDBCAA07153B22A31E6DEE636B088A68773BDC93E0893EE98CA771FDBC8BDAB0FB06CE604AE59300AD556E58B2596E0160607BB0758DF2C981E82CD90C80ACA94897B91C9C0F75C01F5095A1C27199753A5375E0FD03656344CFDA697686CE9262D9045A13A801DEEC58E9B882EF7B4DC128A0B8B49D354B2149B1B2666CA8611A17571B027CA9A86089606534B73995F16C0ABEB4455832D2D415E3ADC230B6239693AD74C1FCEA83CD1AA0DA6EEE5F7ABF672DFF39BF8EA3573B9694E952B9FA9EAEC6AECE4DFEFDBC8CB7561FA2DB79839C21FE17B37CC65D230034D50E2148596A8CEFE8E28772CDF40477F9C4B678D61E7FE2384A336572F9AC6531B76B3B7AE91F74C2D614665010B278E24CD7079CB5DA6CE1D8F6F24666B7CF9FA79E47B5CFD6BD9491917290D211AE5DA5B39AA8F836D11BE73CF8B6CAFEFC134C554E29095A631AA3483E68E7EE98358599ECFD6DDF5D2E24AE83AA71BB0786201375D3C8EA24C1D251E952DE962C68AC40D1E79E930F7AE3C8221532F82561761FC946A165FBE80BC0C8D778FCA6074BED0E410359204B3E52CBD0343009DDA40BE2300DA1968C2AABD9FF8969FE384DA52BBF354F65214D482C918F3BF8F5ABEE88C2BD7A99C529AC83A50DB19E44F6BF6B2B539C284AA32A6541692A9DBB23025E0376239ECEB8AD21C84B6B045548ACF27D1F9383CBABD226717A64F06BEAF3D432AF9F04482072716A163F7461A1ADBF1682A39561F56A44F1609459EB6C75F424CCF92CC429F15E3474BCAA84C17195D13212BB5B3C3646D5D177E436771753E05191E46E606500D0F4121066483DF6790E773D00C95DA96309B8EB4D113B649F368BC6BCA084617F82523428826C5559DDD0D5DACAE6D6563FD00B190C9F85C87C5E38A18E613EC606121A5D218843DED26773CB15136B59C5796C3DA5D4770743F5FBB6E012B36EC62FDDEA35C33633853CBB35838A182748F8056240FFB6073377B1B7A8888D94541E689FB4C15331AA73C5767CED8620A33F4447D42E795DD0DD43674D3153668EE8971B0BE959E601F31D3E5410BE794CC4C3F63CA0BC84933C8F6D94CAAC8A6B2240BC7162C14C1F470B08496091ABBEAFBF9C3937B39DC1AC67234662CAC61EACCB10CCBF731BED0C792EA3CBC32684EEA20A6F2ADA6F2940F7512A6364AEF901487C4207380F8DA7F23BEFD2ED735E22C6E5AE5BB30E67F0F2567F4B90769D970E76A01B7854DBEBB7C078F6C6EE0F27913B9A0A648AAA3894D134A632874871D6A7B22ECEF8D1376C402DD7D890699AF9CC591383B873A06E62EC7102D16C269D8CBE1C30DC4234102F17EE2E120038E418FAF90605A29961648A4794CDE5D6071F3E41C0A3C31544DC1D0BC7446743635F7B07CDB61AA8665F3E98BA793A65B44E351F27C06217442A6437E513E7F7E7E27B58D1DDC306F1CB347E690EE111AA442AED32379CBE91E4D1AA58A16FC97F6B4D2D33640558E8D6345319C38A6307045A533AA53D71DE70FCF6F6757733F372F988A6599042351B2337D3CFDEA5EC2C120EF9A50C0B491F9CC195D86CF10B436712BAE13CAAA1D6DFCF0B19DB48685C1208445F389A331CC30B971C1486EBD681C9A1996E02A3C62510C229642E780C9C1967EDAFB061818084B100FF87CE465FB18939F85DF2B0AA371B90A911DE08A228D07C26614BFC783138F108ED9BCB8BD9FBFAEDC415A410157DE742139E90A63867958505940AE57979DED6E7AE30C12CE27796C8622E8D4DEA57744049DBC55A7EF08D1BFBD0BA7E7406A779FEA5E7A1A5AE5253292563286A7FAA9D3DB4FA639C432D835FCBCEFD5437CE58157C113E09B379DCF884C11BDB90C32B154B6559581B8C2FAC630077A84FB8AC877B8CB51D169265E4C378A3E45DAE3B5B98A37CB5DBCE95D25E0571EC7CD560FEE377B5DA4EDD878CC20FECE23D4D6EE271AECC71B0F4AFFBD1E239B604629713DC395B694DAC336B9D16E3E7A5E018BAB33F0383174CD902245225ABE6B631B475BDBB960D22899571D0845B87CD638F6B7B4F2FC8E064616A5130C4679EF828954E679F02B96549CD3FD016A5B43FC7DCD2E164FA96478718EF4F07BFED53AD22C8B09855E29D4A4C6632852AE53A725285AF11D7637F7F397976AC9C9CA627C45812C806DDEDF42381C65414D21D3CAFCCA875F6A0000200049444154D4146532B62C0F552810A1CB083A62DA3CB1B589FF79760F41D1FD27F929315735CF8C73614D163FF9E07CC9F397D90E6187620B7D0C370A8F0B072BD1D7628A5597A06288261221702464EAA2529343C4FB62D2198819BCB2A389FDF50D4C1F3B9AD1A5D982C7C18A4D4D6CACEF66CA82998C189EC398021FF347E54870D6456BBE6884392169F6A60F404A3B0C01744AC3F4CE28121EBF550767A099C8DD95A9DDFD5BD94BF3A0F80BD0465D25E549CFE9964031F19E09AD88DD1D41EE786E272FECEB65CEB8E15C3E6F1C99822B6B09BA9410CB51080B011A47A73B62B3BFBD8FDA6E8BB8E6435544AF9BCB99960D0909E0948BD6415A20C7EE47EC7AAC16741C4E8F81AC8BF927D94EFCE1A9922AF2F0426744008CA390AEC49990A7D077643FAB366C23DAD7836E866857B308665660EA4238CAA5A7C989C7B1B961B8CDD563D2C9D54CC92BD6849091F85B35888A3CAEAA60A4A511B5BCF4471D3C5E0D5553C9F4E86479E368B649567AA6E4302B9AC3917E87BB5EDCCF337B3AE9300DD20CB7655B48720A10152DDD3E254A45BACD6D978E47D38504A949D4D4D8D1D84F6B4F98E2D20AB6377473A4AD13D37298515DCEC8C2743A5B1A29CA30185F9EED1E5351082B69DCF55C2D2B76B611C64758E42824BFC3BD3F81BA996A844F2CA9E2BDF3CA5D0EB5E2A7BD3F427A204D4E2A829E18B54C99BD127C7291AF76A406B7C0F0B8D431C112A93085159B0EF3D8C626BAA37EE296894F084759114A0AB3587AF1F9A4E767621831DE35AE8011593E3C862205934EE66B79B69EFB21804E6D24DF511174F296C37764415C986D9E9BCDFFE9DE7356341CBC9014FA0CB26D4251A90B9A5CFAFDA7D8DB1163FEC4726E3C7F02E542F75D2C7E85672171745100D20CA923BDAEB18FFAEE103D118798EA939AC2C20249B6054B6C160B5797EA762CCE1D146527E3DF63B07B2C8F9DA05BC976E6C4F84ADEDDA920F9B5C0ADCADCB1BC3347654C86C38C620F3BB7EEE4E9B55B88F77649879596CCD144FD0538F2DE124D2662668846B9E7DD65142903EE1D081B2BAF079F306E151D78BAA01F0A4710074315943701B6A02B068E6A6328BA04660C1D5DD389695E7EFCEC3E7EBBA681A8A6BB4A4A22272CD6F6B2A53E21391A47D2F41EFCF044F2552104EB8AFD47F1B0E7681F754D1D8C18399CF4DC6C29AFDAD3D24A5D7B3799012F3347E6C922A5AB8C67D318D4F9C6BD6BD9DBEF47F3A4C973298EF826458DC1062BCEE4020FFFEF9A198CCAB5D17583C35D2A3F796015F9F9994CAB1AC6F8E24C86650A8EB7489988DCB9473E070290AD81303ED5D5CF8E2906CBB7B670DFAA8344A30AC2E550083269AAC9D20B6670C1D29968911E46E76BCCAF2A244D17CE07EE126D08A0CF0D7EBC95A3BE23013ABEED37986BBE7A56DCBF4F36985AF9628CA5BF41C9283FEBCD2C2766FA5C80164B5E1109FF78C50EFE7B85D054B09834A6882F5C3D9780EA6A31A8426847A2AAE0442B44342FDDD138477B821CEA8AD2167288383A9668C490FA0D83531183EE72702A24991E49C2EF2007E7E3B44037BF795CBC6910501FB3FF4E08F9C8E388285E38975AE4191A17946A940614D6ACDFC1332FBD2AC5FC4504DA523417E704654121D0A3A0C5C3FCED8A5274332A2DAD36B705D9D212625A4511938BBC147A44BC2D96F526AA21C0589334324DF5A0796C74250D29DA6608FB409D305EBEF5C45EEEDBD28EA28B494380931B891E97DE76530B7A2CC27D375452E2890B0F1239430989D2B8E1A52B14A7F650832C3C8AF1280C2894161753989381CF11EC89648C6C115132F8FB9666EE5F7B884E4B70B53D9229A1D9624524581C312695A6F3B9774F664C81876D47BAF8CBCA5DBC7A6440AAFC79549B456372B9EDFAA99236D71F5359B7A785BD4DFDB4076DB29508375E38950C8F28FEA9BC54DBC3EF9FDD4D5F5095FA2E79393E162D9ECC94A955F8D52863727D4C2DCF255DF88539A2BE212E36B9DA7A2B7092FABE4311746A63F58E0468612E2B5C57ACA32F20F2D2677D13BCE3A219E8D3BF22859594AC9167FD1489B0D1D581932FB72515CE1EDF58C7832FEFA739AC525494CF799545E405340A33D3F07B451E5380AF800F055B1380ACD21D3269E9138A78367D518B7E11652584E8E57906119B4F88AA05409F84AF775CA73D11469F346F9DA0FC258491E4491272CAEE2464519CA631BF340D3D1E65C5CB5B7876CD3ACC8101C29E2C7A8AA6268A820298937DE3AAA03AF0E9C9B9E4F80DEA7BC2BCD2D0CBBE9E18C3FC1E2616A5B16C7436E3730C8A7D22B72CF2B57EBA438E144DB2359B989A260B80938B3DA4193AAAE6E53F56ECE7771B9A712495528094183F916A107F89EB762DA14A7D0EBF7E572901CD211A17CD1E96648EC8A2AE2AF8E85E4C61AF251CC0FD0A9A484158368EAA21F487064261390C1E7F169B5B4DEE5973504E9E8E88DC45FED889E3885CB4580D1065CAF04CC60F2F62F5F6831C6A17FB098A1F98164C2A54F8DDAD33885926AF1EEEE1CE277772B0DDC4527D646A11DE3DAB9205E3F2C9F2C0C6035DFC6D733326E9548ECC64D6CC7154550C23DB30A9CED1A9CA4F27DD10ADF762B5F6BA769473F26C0F01746AC3FACE046871EF5614C18F16407DCE3691DFADB9C12D1EA6159C3D86C7A0303A19C8897CA8284E25E3B0B547BAF9DC9FD7B1B7A51F5F9A972BE78E65D6E852B2035E3CAA852D8A44B2582872D4C95672C1A5D6B045AAE384944432E9EDE61D9331B004E76301F16BA87BAF1BD4443130E1EC21AF3BA1017DBCC894B0EB1201AE9B00478D3BF25A1F79660D2B5F5E4FD849235A301AD3275AB593A98D44449B3CA7084745514C74094AB1204935702B66A14EBEB47024378ECD96D6547511953FBF7A941DAD3199EEE9366D0CC7E2F6EBA67181D087F6387CEFF97DFC6A6D2B66427848E6BCDD3CD0B19C304E0CC30AF3AD459514A42B1C68EA40B51DE65764135005DF435C86681CB2E404105704DF5A90EF2CDA6206AF369AACDFD784C7D018969FCBB3DBEAE9890B0EBB2601DD4D1CB94C0D4D5A6AB98029FE3BD68494982CC43EA3B21C7EFD91D972E2F8C3CAFD3CB4B10D5BF54A9689E81ED4E241AA720DC60ECF278443766139E3C6955298E3274B8B5396E3A7BA2040814CBDB88EEC82F5214B828E98E8CFDEE37CB2F76F08A05343A5772E408BF7B57E25B1A7DF7F760C664F319E4A7A09DAE86BD0C77FD0A5E1C997FCEC6EC7F2C489B484789D43A6C5AA836DFC7D733D2FEC6E2564AB8CA8C863D2F062C616E75051E095CD0AB2FC2F8B72E2D51B649825C133F912BA12A0C9A8DDFD3B193D275CA6A573B72B24F446EFAE5BB4728125A91572D29AA23CBD0B82966D72EFDF9EE5C557B713CDAA20965526B5AF4FD85E97E23E36750DAA6A0A7B9A7E3E35B3840F4CCAC2346D9E3C12E4AEF54DB4C404854E3ACBCA22E5C46C9B5BE7D7505D94C15D6B0FF0D8AEDE04C73C419191E74B8C91046B1182C7A9CED2C9F4281CEDE8265DD3B86E5C0E73CBBDA489DCBE6AB85DE58A22036FDD8EC963ACAA1BE0DE2DFD34F40BB08DA31BC2515C914D311298ED845C68623674D34F8A9B6E11558664DA494CB4D24B50919CEE5B6697E231749EDBD9C6B6237D325217CB2D2B1E45D72C0A32BD9C377638D3A68EA17098900A35199EA95095EBA338C38F5F7F2DBFF95851E1EC3EC02739DA1040A736C4EF688076822DC437FC80F8EE3F21D21EE76C33D2D14AE7635CF04B372FFD4FD844E55ED0ED9AFAA3BC72A89D5F3EB7978DF59D6478BC9415E673D99C6ACAF3B2C8F31B3267E936C02473ACAFAFD00F8A9BDDC0F5358A652E5E253C0693E09EC88D1C67D489A324402D21D2EF8275721B4CBB3B9EB7B66C9BDFDEF70F5EAE6DC4CCAF266E641D97C23BF6E1C1087D62A63ED147E99E2432C08D130BF8C49C323AFA42FC6A7D13AB1A22C445FA22999B7104788629CF36C8494BA3AE2B4297C0D2E48A4102B2E0AF25E7AC44342DA9273109D46267BFE2704985C10D13F3C822445B44677D53AF34899D9067303ADF900C9A27F60EF0A76DFD745BE2DF9614E777437E573A5644FA72D844ADE1585F51621CA59F43625A4C5C9334E1722C32B430AA6A108C2239CD8E6D636830B22C8BCA91C58CAE2CA6B424879C804A40B1284833985C964196474BF262FED708F343009D1A48BCA3015A1A69069BB00EFC9DF8965FE2F49D3D8BACD70DAF28CE154E43CD1D833EF5F328E75CF43F69122AA854710EB60DD0D617A1351467435D072B763648C3509FE1252DDDCBB0EC348A7202146405282BC8425745AE34017449C3D1632965F7D8B2A162502419883631A3F1E7F8E35D3C31EA77123864C4EC724D8E83B350AB4BFC549CE38446C6041089F1932C0C79009BE756ADA525A262F9B2254809B6810BED8949258995493A59E2E7C9CE4B37E214A4064B6A550CCFD088991607FB1DFAE309EC4D9C4B90142CC1F1156A88526E5314C404748AF4C2F1CECBE48426D4E9A45D97B85E995E71ADA544AE789861511550284C536818B0D8D32BEA9FC262CB6464965772940FF798D4851462028005BF5D887927274BD16E243D055D435A29C1EA0EEAB1BFE5E429CF271644E25BB1F0192AB99959E4650618599E4F69491E693E8F6C7F0F786DF2B2FC146779A54468815FC3A722E975018FB04E73574567E288921ABC9C7AAF21804E6D04DFD9009D1C837898F8E69F13DFFCDF08C3D973BAA9064A7A29FAE48FA14F3D87F9EF647E22F1A225B156D83BF5454C56EE6FE7E57D4DBC7AB0833D4D4182111BC3D0D07D3A395969927D20013A918E108713AD2D2E68BB9B649008A8B51D2EF0EFE08B590F5365EF256CE92CEDBA936E2B4D5E45F233C9683919272763E7C1491141B2139B889F05DB4D80A3E5C4B96C5A19934797A32B22FF291201EE5E492A4572A290E792AA6BC92B4C80996B9AE2325964938F9B6291FA2512DC0400BB91B1C8F10A3D1301B871D13822D3406E94ECA6710605CFC9F191054357E3C2E594BB1387885A85B9AA6EBBCC0E29572A24525553E0289663B8632C9833096D8D586212702738C16116809FE430278E993C76C22DE518688B2F58B1C8C90E503AAC8874BF419A17B94AD245D38F62519CA35390E1931D94E9BA60B124925B623C4E103C7AB384D5B97B5386003AB5B1FDD70068F9D2DA44EF9F8DDDBE3DB59139C3BD04481BE7FF04ADF232295F7AB6373766158821F29DE2E5B66405DEC56B0122AA9070A7251C67D59E4656ED6E626FF3004D5DFD0C44E238B228E482B0CC838A3A9BEA46A14923EE2408E66B7DFC34EF4EE67977CA1F0985B5C7C3F3F88F9E0F21F806F2B3C97487B48B7217EF026865DC294E25FF08817B910756E4D25FF8FF698235615B7CE0C209D494E5488A9CD09493544089D1C7F3A4121A251E27D20F12705C6790E426582BF26A1202F92E8F595C872D8B80627F01D0925F2D8B716E87A2EB66ED46ED525AFF58E2DC1D4B39A5481D6B710DEED8B9B9E204584BE016002D605A3407895A847B9D72A2905720181F6EB47CFC04AA7B4F897B914D408955CBF1C9CFDD475CA725CF6B4BA716C7114A243601CD20434CBC3E4DF2AD856FA084643131C9F11F5C5F48145C4FD08C3D6995E06C3FB2271C6F08A0531BDE7F1D8016E9436134BBE72F38C1E604952AB5413AEDBD743F5AD565E8533E235BC4153DE04A979E35A10C1798DC629B28048AB84E808D6B3C2A5F4CA1D0868268DBE989DA74F447E80D9928826A702CA79C04D004208ACF5911887693D6B38BC2DD3F23D0B951024372B38D4CBAC67E9C9E9A8FA37A335165C12B015C09F84970014EB8DD2458BBD8EB829EAA3804445E54152C08F77E04582663E82458CADF25532E890B3996914844FEC7FCC513FF76FF72514F46D072C044A12DB9424870B49379F564149E484027825E773293BF4BD8DF0E5A7D24AF4174F3090075F984EEA4E0AE5092D1BDDBAA2E521C6E047EEC72DC887FD00FA4A8913CDF71F094BF561DA9E1E15515C95B1634BF0C8F815F97EE88C70EE84273227F7D02FEBEBE187CDACFF7197C7008A0531BBC7F298096AF8E1924F6C40DD80D2F9EB34696930DBD225C98ABDF835E733D4A76154A7A596ADFD05BD86B70F34812CC8EBD9BC9B6EE24C56E70C13E991F112F756C00A7FF28D6E127A4F8D49B6D6AC95C8C853F411D2678CB2772AA8F058A83EB7BAF39E071B878839D5E7B11830027195F9F78EF83412D71DC934C8A278B1B8F657812BF749B24075DDBF165CA2016CCB1B03771A583417070C224F9EBD74A779EB84F72184FBCEDE43113CC9CC4BCE3AE33DCEB9314C91312FEC78BC1C99F9FCBEEC0377B5606FF7E08A0531BAD7F39809620DD7F14F385CF611D7E32B5513A8B7B295278E95234D1E4925DFD4F310348468D6E92F5D8EBFCBABB72C21DC477FD1167DF23D8ED5B53BB6B45C558F07DF4C99F76696C12CF12803128FA3BE5C14EB9BA3E19609FC9523CC5E3BDD16E8327A093D8CAA43EC5B8D3CAB1FD4F2264754286E558642C47F778F35062F5343861F2465F9ADB8872266398DA2391CA5E43009DCA28BD83E44653BBDDC45EA230D3B08AE8DF2F3FEBD2A4295D87607C94CC412D5B885A3453B23F8410D3B9DA8E4764C948EDC497546868DBCDEBB18FBE407CE7DD6F7965A18DBA127DEE7FA266559EF5F4CDC9A3C8D31DA9D742E85906AB5321742A1E6129CE1F8366D8B33B34A73BA4A7F9B921804E6DE0FE252368198744BAB0F63D2C41C9AA7B4A0AF4FCD337CD8B923902357F028A2FD73DBDC85B8FBD113577EC391364B2F63D84D3B91327DCE946BCE14EECF66D38FDF5098EEF5B1C094F065AE902B45157A38DBE4EB62E27530F291D2965704AE968A9EF94F2798FEF783C33742A707F83387A505A69F05E838F3438F374F21B1994BE4970CEFFAF44C5A90FFC90607FAA63F52F0BD02E3259523BDADCF853ACFD8F9C5567F054BF80D7EDA7EAAEBE477A99747351726BE41F35BBF2F40C6CC53DF61DC16EDF21EFD56ED980DDB60527DC7ED69B770473C5B3E47F50472C3BEDDB1FFAE0BFC6080C45D0A97DCFFFDA002D41DA96AC8ED88A0FB985C3FF2B9BD075105AC8423E53F7CBBFD5FC4912B41105C761534E79A52212B69BD7E2F4D563F71C74279E7848AE1284F38C6BB1716E3625B302DF07F79E9B830F1DF51D330243009DDA573904D089718ABFFA23E21B7F8213EB4B6DE4FE37F63AE696224AF66FA0F9215B82651FE03905E3530D81EFD6032819679FA5F2BF31E443E73C37233004D0A98DEB1040BF669CE23BEE26FEF23771A23DA98DE0D05EAF1F01D5409F702BC6C21F82E61B1AA1A11178DD080C01746A0FC510409F649CEC96F5C41E7D979B0E18DA4E6B04145F0EFA8CAFA24FFC1818C2B6EA9FBF59B643DC168D1DAA94003D934D3492C4E289261551CBD514A96732B49DDE080C01746AE33604D0271B27A125BDE107D81D3BB17BF6E3F4EC97EDC843DB5B1B0125AB1263C10FD0AA2E3FF6C14387EBC98AB69ED095F86647D5F38713C82B427B0340EC0BC739DA1922337494EC78171E3B422866138C5964FB7514C34B9BA78C3E238FD2FFDFDE79874759657FFC3BBD646632994C7A01124A48082194109080D2150404042C14CBEAAA587077ADBBBABA826B57102B82B00A48D31510842010405A2091165A422009E965D22799F27BEE1D3229A4CC40767F3BCEB9CFC31F64EEFBBEF77ECEE4FBDE9C7BCEB9DE4AE855D2361FCBC2B8AF96D5A0C4500DAFFA0278D7E5C164AA4769553D98E8B32066AD4202B15C8962893F2A255A786A5408D0CADB15EDBCB25A949596C2B7F68AFDD9F54229AA852A54893D11E4EB05AD87C491E871FEE2C92BAD41655909BC4C8590F0D2A6B65629D2A0D623005DFD34908AED074CF2CFCE67E6C2B3361712763C582BAD9E9D1A2E54A256A28140AE81BF56CED3C83B3B7C9A04BAA36FBDED7312E8F638996A60CEDA03D3E185B0E4273B46947A351290282119F81788E35EE43FAB335B7170E90BF0339CB295D874B05D89B80FEA4193D12F4405590BC13199ADC828A8C4F9F42C18D20EA07BE15E04D4654165A96876F71AA102E9CABEC854F482266A38A68CECDFE6D37F39958FA28C53C0A523E85A9386D09AF3FCF4F096AD4AA842A6220279F2AE30870CC49851B7C0DBD3A3CDFBAE4ABA0C8F946F106DD867EF532354C220D1A350160CF49D8C4923A2F98ABFA3565A69C4D65D87E075612B826B2F4261A9B65F522809C0C9C049881E320203BA6979E53BD6D8BB65C7D2D711547A1C326BEB61A546811CE5622D0CF24094EAA2A1098F41CFB01084F9A9788A7967351268C748924077C4C96AE6F53B4C47DEB41D9FF51F8C80E86828AEF4B940E10D51C47D1047CD83C03B920F3DCF6084E4E33110189D731D6DF2BA1FE74326E391E18108F751345BCD5DB86AC06F4989D067EF4158D549A8CCED6FF2D60AE4C8D4F483E8AE45181C76EDD4962660734B6B70F8EB7FA24BED3904D56640CC0AF577D0D8AA334F1A8A8C417FC290C1B1F0F7644767356F6C85FFF9F65398716201D4E6EB2B2AB2B322777A4EC1A8079E819F57DB22DF70D7E2A2221CFEFA6D0C2EDFD5E2741C7698B70807D4637038F47E4C1E188CF8300DBFACB0A20E82256321ACED78239C15912A11FBE0AA220CF921A33164D46884FAA83B42E1F0E724D08EA12281768093B5B694AFA0CDA757C29CFEC38D257338F09CDF4B17A1361CA2B89720EA320602A5AF7D5A978A6AA0F97C9CD302BDD1EB7EFCAABD1DB3E2FC30BAB797DDD551536F41C6A144089396426FBCCA8BE13BD2D89FF04B23BFC0D8984024F4D4DAFDD317F3CA71E8781AC61C7E1A925656CC1DDD3B4D198B63114F60FAAD7D10A86DEE42C929356243E231CC38FD17C82CAD1F1E512AF2C6D6B88F317B4418BC942D4E9469F27096CC62C8BA00C3F2475A157B765CD651D52DD8E03517A3FA06E2DEC17EFCEA1BE1CF84BA48E2879CB8673068F8ADD028DA1E57477C9A7E4E02ED182D1268C738D9925A6A8AF83FD389CF613EBD0230B7EEC773F496BFB77E028907C403FFCCB30979981D3F84B5B1B5148862B10F1235139121EBD92E0A83480B9354831903FD3026D226D0C51546ECDAB50FFD2E7E05EFF2F3CD56917BD4E391EC3194FB724D1041CC4E3C178830B16C3D226A4FA15628C7AB418BE1A5D5E0EE81BE18D855836DC7B3E199BC0CFE4547A133E6DAC7735AD10FEC7E9542352FEBDA508E55663522ACF63CA694ADB6F735438412890F4E77BB0FA3A7CD8246D1180A995D5A8B4D89C7703717689B7B81CD3B47DA0509153BF9FF59E1A3D7821743E71F88BF4DECDAA6CF9DFDD2AEFD2111779E64AE232B7E55DDC67DCA31D547B82BA641A0D77BCDC56DD101981DEFDFAA40B7E42FB318799D0FEFFA224C2B5D05B5A571A57D41D51FFB42E6213CA217EE8ABDF9B20424D08EFDF693403BC6A9792F530D2C3907507FE0A5FF5A7DE91B19E67FF31A61403C24C31642E837B0CD14F596029D2F0904735F9C91F7ED70A8CC8FFADCF850F4F453C26CB62231E512EAF6AFC42D255B9A89F3173ECFE2A22C02CCB7CB1ADB57948A84A8B758A1AC37A0A7F10C2697ADC622FFB721947BE0AE583D8234429CDDBB0D83339743632AB18FA54E20E52F90ED9E77D9CF6254B033A57855552B826AD331B5601982EB9A9F1C5F2CF5C78E5BBEC41F4704DA45B635813EA388C125594F4C285B6F7FE62B811FC1ACF6C5A3C383B8CFBDB57631BF0A9BBFDF8CB957DFE61F3386CCE73EA2FC67EE5B7654A09BF2679B89CCBDCF8ECE62FB03D1352978A8E843FBE3D94A7AA9DF8BB8AAE983CF67F7EAD05E1D752081EE8890ED731268C738B5DA8B1519321D5E04135F4DDB0E0875AF2600441288639FE22B6781EC7A9F6E531E6D09F4798F180C0BF744400BB740D36BBBFB2810EEABE41B55ECC081CFD6ECC4942B1F40672EB2773309C4F86BE0125489D43C9A22CC478101A16AF86924A8309A7128C380ABA5B5A8AFAD42B54506854C8229B17AD4D75643B3E72D44571EB66F5E32713EE431025BB577A346A4844A2A420F3F056EEFE3CD43EC58D8DD85DC4A9C3B9284D1856B115A77C93E0EF67278ABC797B86B803F6E8BF0E23F6F4BA0D3E47D31D1B0DEBEAADEE639153BB49331384C87C76E0B6A35A263E5AE73084E5E82D8AA5FED02ED61A9C0AD3721D07D823C302AC20B4595F53C9C30EBEC09DC9BF697662FBF75BA0770C0E356AC7A38FAA6A33A48A01D530A1268C738B5D9CB5A990373DAB7305FDEC153C6D941B53CB5FAF7DC58BD105D044F4117068F80B8EF23FC40828E5A7B02FDCCA860C4863AB609F5536A1EAAF72EC7C8E20D4D56BB32EC578FC216ED0C683C9898DBC4B4A79FA2D9B0982F78EB89627E502C2B783F2E4A07D1A58350EE5F0C7DDD55DE97B91AD8EA7699FE2928140A84EAE4981AAB474F7F8F66F1D4CCDD71E862092EEF5A8DA1F91BEC1B94B54205FE11F43EC24303F05042203FE5A42D81FE453D01B71B3622CC6873D3303FF412FF9720D387E0A9512108D2367713B150BDE5EB133137E79F3C72833DEBDFDA7BA033156278C5CE1B5E410F09D360F6107F782A6CA7FFD4E45F42D6E78F416F2AB0F3DBAF1A8DEFBDEEC59B3322E1EFD976986247DF037EFF9A1AAC5A95823F3E7694775FBD7A14A64FEB0589A4737CDC8E8CC115FA904077A2952CC5A7613EBB9657C863F530D80AFB77D54452B05A1BAC0E8864E45208A48E096A0383CE12E867971DC0F3597F6AB69197A28CC78F5E335129F7C313B705A37F68EBEE8186B1B07866A3C9761C57F5B67721485E6B375595508D0FFDFF863C712017F0FBE3FDDB4C74A93359F06372367CF6BD8DA88A43EC5447D40964F8D26701323CA23131468FA9B13EC829BBDE07CD5E02ABF44F20BE722FC618FE0D0F8B2DBAE5B06A3836783F88F89E7AFC2121D03E2E16FBFCD1D6B318F9DB2BE85297CE7F7E5C19CF5F4A432B7F41424562A7097459411E5296BF8A986A9B80B296AA8CC35ADD83981C1F8E097DBD6FEAAB4D02ED183E1268C73839D58B9D7BC80A2F99CEFC0B5656AC88152A72F126F0898128E4560883D9BF040824ED0B606BD36D4FA01F1A16803E81CDC3CB989B4229634761358FBFFDE0D335989BFB8EFD116CC5FB8DF7A348560E45989F075E696783ADE5B8AE9619B940EBD236DA3FCA90F5C227BE7F419D508E3BFA78DBA320DA32E1EED3F928DFB302830A37436EA9814920C166ED0CECD38C45422F3DEE89F3454955FD759B844CA057FA3C8900731EA6172D47B031833FC220F2C23BFE6FA0778F103C39B2B1A6C9A5A26AACDBB20F0F5DFA2B77C5B0D573A27A029234E331CEF0038675A24057E667E1DCB23FA39BF1827DDA49EAB1F8413B0B63FB0674C8A4A3AF3B097447846C9F93403BC6C9F95EA66A58F28EF2D29E96AB0760C9DE0FABB1D4F9FBFC3F5F2150FA4018780B449173210ABDEDA66A6BB414E832910E3F7B4EC119652C220294D0B5082D1388C4080BF641BFAE5ECD328D535614000018B149444154E27E78F7650C2FDF6627C3922B56EA1FC329457FCC1FC9E27E3D1DA6969653C105BADB95CDF66B0EA846F28D37AB58863BFB7A63DA80C650C1D66E7CEC5219D2776F40FC956FA0B294DBE29055A3B0D96B167A87EA704F9C1F3F65A66514071768DFA721170B3035FF0B44571E811066B0B8EAF55EF36089BA1D4F8DE96A7FE47707B3E0F9EB12C41912F9CF7224A1D8A09B831C59379B4097778E8B83B96E8A2F9F43EDD70F43696974D7ADD13D8C43AA044C1BE08F293719C94102EDD8579404DA314E37DECB6C84B5221B564306ACA61AA09E09F76198D3BE81B5AE79B6DB8D3FA4F3AE64BE65E657E6E54CE53AB0D03996B2CD6A3D4374737EC79602CD36F58AC5BE2817B15864C1751B4F15224F9CF31D8DA8F8040CEEEEC5A331583BB8682E7AD59EB44F3A57128CF5BAB9B828EB85A5F745D8FDA88E50399651C2053A2A7FBBBDFB6A2E44C3E1AD9261D6205F0C096F5FF02F1454E3D09EBDB8E5EC07D09A8AF849E1A714B158A97F027EDE6ADC3FD81F5AA5A855815EE5FB34A2BAE8A02E3A8D11E73FE469DBEC2F824BB21ED81FFE38C60E1F80C86B7F59FCB8760D62CE7DC1639FD9EA394935063B3577422E93624CE9460C2EDD71C32E0E1631323652875A9305E72FE5A14FD60674496FF4F15F968563ADEE21E44842F0F74961E8EEDBDCB7EF08EBA67D48A01D234602ED18A7CEEBC5E2A98D06580D9760C93F064BD62E5872F6DB4F37E9BC07397727A1771F08BB8E85387236A0F4B3F997859DBB61E36CA2044FDCD04E87A8CF38CC880B828FDA369E33AF4F84BFC9B6A1C7DA39791FB0641626D45FCEE905A5B49D52AC2DB01CB958CC05BA6FE1CFF64F3EF57D1E698A6874F5566076BC1F7AF9B75FEC29D760C44F49BF21E1B7D7A0AFCBE5029B268FC6329F67E0A154F2CDB7602F699B023D2E360825A5E5884A7E13BDAA52F969E02C1264B7D714486F9983E9037CF90A3CFBCBC7A1CA39C237130BC57EDCCF9D270902D34AB6613AA0D8B9303BF617CC2ECD44B048120F99107E0A337415E98828DE037FE365EEAE6968EB74F370C86338EA0552AC7CB0F74D178A228176ECF79304DA314EFF815E565B46A2B90E96A2933067ED8535FF082C45A7612DCFFC0F3CAFC52DD90100BEFD210A1D0551F72910A8436C2BE4FF6079506705BA214E57DA7D08EE8BF747E0B588868BAF8D6D165EC7123E98406749BBE18B3911372DD05FEBE723C5231E11FE4ACC19128010DDF5A9DB4D695E2EAEC59EA443B8E5D45BD0D5E7F31574B2C72D60A22653D8043A54276B53A06FEF1F0C9D4288EC7D9B303A7BD9B5CD4F014E7A0CC2B1FE2FE39E41BEA8349AA15AF3006425369FF0554908DEF37F0D66910C7E0A2B4614AE775AA0D98B84F9CB994B8635E6E967BE6D96D8C35E020D8D25F92CD7CFC709C54048C5222C9F1771D3DF4F1268C71092403BC6E9BFDACB929D0473DE11A0240D968254582AB23AE5F942EF4808BC7A40DCE76108030677CA3D9DB9494B812E11EBF1A3E74C1CF318C2DD1B2D4BF188AC661E151115AAC37D83FDECA15D4717DD8BF0DAB3F647174802C0B2E6CECB23F1F99CDE4E097472BA6D05DDA7A07105CDA222767A4E4254A00AF386FA77185296965B8594DD3F63C8C54FE0692AE1598B873D12B0D16B36E44A0FDC1FEFD7A1402774F7C4F25FCEE3FE944721BF56F8E8A4A23FD687FE19B3E2FC915F548ABE7B16C0BBC656092F4BDA15EFF8FF036291087E4A0B12F29D17E8B66CC75E306C0ECC05C53228F7AAC6E1B07A38CC120FF8AA25786B5AB833666FB52F09B4630849A01DE344BD3A81409B511CCA18EED36C88C16DF9A861DD3D798C7443C9CBED6F3D83B8AAA4C6151E8458A17F12BF29073ABD823E9D5DCE053A3C6B8BFD7E29CAC158E3FD07E8759EB82FDE0FD141ED47AC24A515A264CF2A0CCAFF9EC7263337C05AEF87705439147E1A195F41EB55E27657D07744EB702ABB02A1DFDC09519D2DDCEEA2AC37BED1FF1152AD2F220DBF6254EE2AEE7FB66D428EC446DD3C0CECA286B7CC0C6DCAD74EAFA0596A3AF3F3570B9B47CFE48B0371411E89C3AA04B0841DC63D4023C59CA1FEFCA5D51965B049A01DFB852281768C13F5EA04029D1507FDF5E20F31A96855B311FDDBEB1EEC538DC6C773FB3AB58266892B55DBDE85FE6C63981D8B8EF8C0FF555EE3994560C475B355836BADD59BADD872F40A3CF7BD87E8CA8360AB7EA350CE57B7F9E2009EE4C256D09E8AB63709998B8309342B075AFCDE4428ABF3F8A3988FF827ED349C500EC2F4929588AD3EC4EFCFE2AC3FF17D0E59CA081E8FAC1699519FF485D302CD7CFC3F6A67F2BA254D1BAB3362821816A188676E0678CA3073A02F58B6617B35B99DF98A90403B468B04DA314ED4AB1308749640BFFDAF5D9891B1101A73E3B164D9D2AED8EC390393A6DC81E890B605B5E534AAEBCC28D9BE14D263DF72DF2B6B4C0057E8E7E38A672C26F5F7E31989AD3596EE7D2EB71267F6ED40F485E57C839035B6C1F762D0A75CE00677D370F70C7B4E6B61762C8AA341A059ADEB759F2DC6C8ABABB86B87B919CEC9A2902E8F405CD53EF8D6DBEE9FAA1CC4135C82F52A5E08E972BE01757B9D17E8A6B538FC3552BE19DAB4DE365B392BA54244F87BA0A7BF1252AA07DD09BF05CEDD8204DA395ED4FB26087496406F3C9809E9C12F704B5963681C1BD679791476F57E112F4CEEDDE64AAFCA68464A463182F54A74F5B1B92E4EEFDE02D9FE8FA1ABB7657EB2CD33B6E1B8CEFB21C4F48FC1CCC18DD97C4DA75F60A8C5FE7D071172F22B84D5A4D937D65826E28BC19FF00DB53B63BC79F5B7B652BD5B0AF4A24DA770D7E917E057DF18A5D2F4994CB417F9BF89324530CF729C31D0173B4FE4DEB440B74CF5BE09333B7429ADA01DC244892A8E61A25E9D41A0B3043AB7AC16ABD76DC1AC9C0FA1B0366669B24DADCFFC5F44BFB8384C1A1074DD908FA697E0646631B417B6C210311953E242789D8CCD072F40BF67217AD69CB48B2CF323335FB479E8C3B863D8F5C58158AAF885F3E9C8FFE96344180E354B3B672E8355FAC7D14527E7197751811E0E0BF496947C54EEFD0A634B1A63909B4E8455EAFBD4F72F50AB5578747820BFF78EDFDC53A0338FE663D93BC770BE85A5C57231A6BE3416D33B0A363118B0F5BB935899D85856F5AD1563D0CDA3A3F0520B3233B3F0F1375578F0A9484436F983EDC4D73BF0C64FED1FF220556AF1E8BB4391A0EFF8B78A56D01D33A21E9D44A02D813EA78CC1A8DE5E3CD2A1B5D6C3578960AFC6CFEACD16FC78E02C5447BEC2A0F2DDCD2E2994F8E357DD9DC80A198750AD185DFCD4FC6CC122430DB4977F41CFC2DDD0D417E3C3AEEFA247908EFB70F34BAB91BBF73BC45D5D0B0F73E3692F2C4331D96F32F2226620CC4F8D10BD12ACF6467E791D2E6415C133F7286EBDB4D45E898E0DA45CA8C552BF1790270DC6A0AE1A5E729495F2747405CDAAC9BDBF26090BB25FE0FEE6966DA5F71338E63118C13A055E9FD48DDFDBDD04BAB622137F1F73085B4B8DC8BC508696E7F3088402F41BD70B1FAD1CD7AA08D657D7E3B34736E29B320D6E9DD20BD3FAAA80736731FBA533903C380EA75E0B6BF71BBFEBF5B57866A710C1B70FC2BAE7BA41CDEB4B55E3E7D7F7E0B92F2EE2C4D5B6AB5AF67E7C0C563DE08F6ED13A783B90F74502DD49E243B7E998404B8166E15C6C43CD2C10F3129E2C9BB0B596E47337EAFB4EC1A47EBE50CB6D31BBC67A334E5FCAC7956DCB30BCF8876697311F729D5006E632158984B058ACBC3CA8D86CE42B5D9685F7B7A025B04A143C957B528C378A0C5558BB331513CFBDC12BC33534B6923689E4FC3E7C83CC6A85D90A98CC16882CF5CD4E47F9513B0BC714F13048BD111BCAC439080AA92DFBD1518166BFDABB4EE5A3F097551857B4A6D9BCD88A9E654C560A35E8E1ABC0AB93BAF1CFDD45A073362562F8B399C0E0FED8BC24026D2D40CB3727A2D76397A18E0EC193AF24E01F931BF6102AB072E646BC711C48393C03D55621942A295432216032A1C4500293C40BBE9AD657D0A3466D42E433133162D3A778F9B81E9B0FDD839E0A9B7D4F9CB022506F84556C81E16432E21EBE82E7BF9C8A075A943A97A8E4F052767CE66483E149A03BD615EAD149049C4D546978ECBFB5B3B0DF6B02660F0D44420FADDDBFCCDC0CE947F7C2B8F34304D465F38DB58E1AF32FB3C35E5F095A0CAB588A89D1DEFC54159B881AF1C996542CB8381F42ABE5BAB3FEDABA377BD1B01AD41FFB3C8FABD250BEB1F6CEF4EED02A6DA53B9D1168D6979D5FF8EEAA1D987FF535FBC625FBF932FD029C50C64220102236448567C7DA4ABCFEFE05DA8AEC1FF662FC82B3F826F501845D48C6B0B864844FEE8EEFBF9F709D592CC63AFCF4EA5ADCB94E8A67FE391A1FCCD0C354978337E276E0ADB42ACCDF361FEF8CECE89BD2F8B9C564C191CF7E42D9E4788C0E16E2ADC1FFC206930F528EDF7BFD4D2C16AC7EE4337C103E09475F6C2C74E5F8D39AF72481BE5172749DD304CA6BCC28FB6832A435C54E5DBB597B37F669C66174A4370F7B6B7ABAF4E18BC5D8FEEB694415EC44644D2ABC4D05FCF8A7968DC5FC321165A16F7BD5E378CC345B8D4FE9E783F17D74F6EE39A57558F7CDB74830FC0CBDB980C735B7753E215BA99789BD705A1E8B7DEA512812FB412814A2979F122F4FE8D26C082C9C6F7DE2714C3DF322AF1BCD5E14279503F0ADCFE3B8E35A985D43040573A3ACDD710C61BF7DCAE7C41ACBF8FBC8EF65644AC3E12113E381A10118126E737E269ECC43D5DE151850B40D4A4B252FB67444351CDF6BEF6D76E415CB78947E3E11B25ADBA9312C4D7C83D71C9C9347E17F7A93D05C84AF9F388CF484A17879A60A079EFF166397D461FAFD43F1DDF23EAD88A419A95B93307041019E7D7B34DE9EEA8577EFDA8A85BFE461E43B7761E3230E387FF95D2DA82A29C3D6A5C9F83C558EA5EF0F4278F96F18187304C27E3D91727C7C8B675B50FADD76043F7A05DFA5FD111303AE7D6CB6C02410F08585B3E7A293403B2515D4F96609ECDEF26F54A6A7C068B2F0F3FD1C692715B1C890F7C29D7DF598D6DF87BB431A1A5B451F4C372035B304A82A45B7F4F5F0AACBBBEEDE9542159255C3F87D2C4229BAFA78204C2FE7279E34F56FB3FB7E989805182BE0517C0E3E85C7E063CCBE6E98EC7C42162F7D54958052B11E569104DD7C943CD36E5A7F5F7BDD90860B0D3526FC7CFC0A7A64AC4775561AEA8552B04CC1E3EA04DCD5DF0FE3A3BDED616C2C1EFA6C8E01670F24C23F63339F0BCBBADCAE998272890E51412A3C3D2A180A89ED4FE5333906649F3A0ED5A5DD4059362A042AFE0262E7298EE9E3C7E3B0596363C8FC6131AA2F9FE46E1F1666B75B339E8F7F780F2D2F0CA5B956B0DF11BBDC4C1FA7A2380C065CAC9221D0478E334947F0D7F18791332E120BFE36140F0EBEBE6893D564C2DE553BF0F02639DEFDC740C48A4BF1D81B69A88C08C7B697D80BCE011783C984D2A222ECDD968D9F4F8A30677E6F0C0913E3C86B6B11FF4619864D4A40D2C6986B08EA9092528CFC82526C7D7937569C1360C3868695BD18BD033CA0EEA9825A2E4647DB8F2D999240DFCCB78CAEBD2102EB930B70B1A006D5751DBB241A1EE02113F1F303D999846DB8AAB9006D3856809CB23AF004943A33F76BB3F70013248D5CCC8FD50AD6CA30A99F1E7A55DBBF2E6C157BEA6A150E6794E37C7E0DAFE7CC0AE637D4A66E78B7B07BB0534FFC3D259810AD6FE6D6680D0EDB045CB8F5326AEA6D1B80BE6A29A6F6F741DF60765A4BF3F55546610D561FC9479EA1CEFE6C768C1713D286BA244D9F919C59819D674A70B9C476282D2B1AC542F1D8BF86C69EBFEA601E77E7B0D86C9140C0398C89D421AE9BBA5959D71B32AE83173925D04DEE19ABFB0CE7BC7DF1F5F6A998D146C679EDD56CBCFEC42F502E988CA7038AF1C6B349C8888BC3070B2210AC6A5F9C57AC3803639D19A8ADC585D3B9C8D20461648F86DDBC1AEC5B7C04EB2F8BF0E8EA795832C9F672284DCFC2276FFD8AF7D6E4A3B44A8D898F7641A3734389BBEFEE8191236FEC8003126807BF50D4ADF30830F1CB35D4A1B6DE71816685FB59324553F7466B232AAF35A1A0BC9E0B50598D893F83EDEDB14367BD144CA09998B28D21C72ADE95569B905E5083C2CA3AB0ACC1B26A5B0815BB1FBB878F5A8A102F19BC55920EC7D630DEA399155C1C1B049AA5B9B7362FC689CD23AFDCF66CF67208F751B4591B84ADBCAF14D772816652CF04BA9B5ECEC7D6B4B128942CF602339AF93D994077F196F339FDB7DA0D09B4211F5E5DB761ECA2F1F8F2317FB49E8E54839DAF6EC1A2CD22AC39743B2EAC3C84057F3D813F7C31110F4C0E477B8113977F4945DFC9FB515E757DF44C532E72B516EFFE3A174F44D97E5A9C568C038B93307F7536AC4313B06F5B3F3456F1BE39A224D037C78FAEFE1F26C0048B7DC18542F095A1B3FEBFD6A656516BE22B72994808D97F51D0FE8731DFD0D09C17E85A1C782F11E376E890B271287AB45A1EA51A89FFDC83173ECE44FFE7A660C9340196FC3511AFAC2CC1EAEF2762CAE4F68A3C95E1C0A622641973F1E97DA938DBB52B9E59D4B399D0161F48C5735FE643A80CC7A6EC0918DBA40AED63776DC18AD47A7CB4711C1EEDDF7E795A678091403B438BFA120122D029049C13E85A1CF8F4573CF7561A5EFBE17E8CEED7CA010AC55998F77436C63D158A6E56118223FD21CFBC84BF3FB9054B932C58F6FD44CC991CDEC2075C8375EBCE23C5A0C5FCFB03A03119316DFA16F49C702B1E1CA142AF18359A9691DAF2CC7798F9691E4483E2717CFF6074BF462273572AE6BE9F8B898F0FC01FC7FB40DD8929F124D09DF275A39B100122E00C016704BAE4502A1E7AEA30361FD7A3A86812B4DAA62E9B726CFEFB212CFC3C03FF5C3309838707E25A68322A2F6661D19FB7E3CD1FABE1A9EB820FF68EC6EC28158475F5D8F5F6F798F79901C366F5C2CBAF0E45A44A8C948F3662E4F1EEC8FE32069EADE44CAD9EB71A0FAF2E8464E4309CDA3E00216CC2E585F8ECF9BD7875BF0ACB360DC7841E4A34388AAA2F5FC5C7EBD3A18B8FC1C3C31CAF0FD3942309B433DF2AEA4B048840A7107058A0AD65F8EED9BD78FEA34C5CEE1B8D82DD09D0AAD8FE81199BB79CC6CC59FB20888FC486C5F19814D3BC6C2A5087D4F5C9F8D39F92B13BC7DA2CB2472291A2CFA8287CB86A3886EB01EBB163E83FF32866AE7F002FC4B69ED1BAE681D578E8DB424015802F5367E0BE50C0907A16CF3E9B84157B6A9A1C710088C44208BBFAE1C94523F1DE7447C3FAAE474B02DD295F37BA09112002CE107058A07372B070E111ACDCD5582FA3E1393D8786E295F76F439C57FB4F4EFFE9285E7AF70C52726CFDD46A298E25DFD3ECA2D3AB77E3A98FAE60F1CE7B10A5697D2B3177F31E4C78F90A4CFDC2B0F0E918DC3940CD725A7174E551BCB6341DE70DB65BCA3CA458B8F51E4C6A888376064C8BBE24D037018F2E250244E0C60830815EBD3A150B9E3DC66FF0D557233165720F4824CE460ADFD8F35DE52A126857B1148D9308FC8E08D4D6D6E2C08173F8FE87743EAB39B363111B1B4C024D2BE8DFD1B79CA642045C9480D168446E6E2ECACA6C872E04070743ABD5422C6EAC5FE2A253EBD461D30ABA5371D2CD880011708480D96C465555159850B3A652A92097CB21682B4DD4919BFE0EFB9040FF0E8D4A532202AE40C062B180FD634D24129138B76234126857F826D318890011704B0224D06E69769A34112002AE408004DA15AC4463240244C02D099040BBA5D969D2448008B80201126857B0128D91081001B7244002ED9666A749130122E00A0448A05DC14A3446224004DC920009B45B9A9D264D0488802B10208176052BD118890011704B0224D06E69769A34112002AE40E07F5EA05D01228D9108100122E02A04042515750DA7D2BBCA98699C4480081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D0808DC6296344922400488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D08FC1F8024C458BED69FBE0000000049454E44AE426082 WHERE `app_id` = '2';
@@ -364,4 +365,9 @@ UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D494844520000016800
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D077814451BC7FF77B94BEF8D143A842EBD188A056CA8F40E52444405C52E62C5F2D995265644451114456C6001A4F7DE413A2421BDE7FADDF7BC7399CBE648729BDC5DB82433CF1325D9D9D9D9FFCCFEF6DD77DE99514024A1805040282014F04805141E592B5129A18050402820148000B4E8044201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540185C562B17868DD44B584024201A1409D56C00668C1E93ADD0FC4CD0B058402D7580185E26A8786C26C36330B3A3D3D1D7BF7EE8556ABBDC6D51497170A0805840275470102735C5C1CBA75EBC66E5A0A6A0668B3D98C356BD6E0EDB7DF46DBB66DEB8E32E24E85024201A1C03556C06030E0C2850B8CC12A95EA6A40EB743AFCF8E38FD8BC7933FEF7BFFF5DE3EA8ACB0B0584024281BAA3406E6E2E060F1E8CAD5BB7222020004AA5D2066985C964B2141515E1871F7EC0CE9D3B05A0EB4EBF10772A14100A78800204E881030762C3860D080D0D2D65453340171414E0FBEFBFC79E3D7BF0FAEBAF7B4095451584024201A140DD5080003D68D020AC5DBB1611111150ABD5A52DE8FCFC7C01E8BAD117C45D0A0584021EA68014D09191911503FAB5D75EF3B0EA8BEA080584024281DAAB00F7419305ED10D0AFBEFA6AED5542DC995040282014F03005F2F2F2D820A14340EFDEBD1B02D01ED67AA23A4201A140AD5680003D64C81001E85ADDCAE2E6840242811AA900B938860E1D2A0FD0AFBCF24A8DBC495169A18050402850131520400F1B364C00BA26369EA8B350402850BB15900DE85DBB764158D0B5BB3388BB130A08053C4B0102F4F0E1C31D5BD004E8975F7ED9B36A2F6A2314100A08056AB10234483862C408C780A6A9DEB367CFAEC552885B130A080584029EA50059D023478E940768B916F4C90B19389394E559777A8D6A131CE083B64DA31116E4E7B006B4BAEBD1B369B89496EB306F5DC81011E28F4E2D63E1ADF2AAF0760D46338E9E4B45727A7E5D9045D63DC6460431ED1CA582223D8E9D4F43464E91A3ACE2B80B15080FF6C375CDEA21C0CFBBC252C982960DE8975E7A4956159FFFE41F9C49CA9695B7B6670AF6F7C1FD83BBA25BEB7887B7AAD519F1C2676B71392DCF61DEBA902122C40FAF4DBD05D4992B4AD9F91ABCB67803923304A0B94E31118198FBD89D0EBBC9B173E958F8D34E64E60A403B14CB8519C8607B6A5C2F348B0F7708E851A34639B6A077ECD801B9801EF3D20A84852831F016C756A30BEFD9E38A3A7DDE88AD7B7578704837DCD8A9B1C3FA156AF598F2C62F68D64885DE5D7D1CE6AFCD19761DD4E3F86903E63F7127A242032ABCD5F49C42CCF860B5D0AD58A53F376A909A61C6B2574738EC227B8E27E1FD65DBD0AB8B0F9A375639CC2F3238AFC081637A1C3C6EC08BF7DE88364DA21D027AF4E8D1AE07745CB4171EBF2FD8F9BBA9C125EC3EA4C30F7F14C907B4468F296FFE82AED77963D4DD1543A906CB22ABEABFFC53842D7B7498FFF89D880A7300E8EC42CC98B35AE856ACECC74BF371F6A25116A0771F4FC207CBB661E45DFEE8D6BE6E1B05B23AA60B32FDBD59837FB6685D0FE8175F7C5156F5C6BEFC2304A0010EE80706779567416BF4B8FFAD5F0568007040CF7BACBF2C403F3A778DD0CD0ED0DFBD32DCE1F34A16F407CBB70B403B54CA751938A05F9844167494430B7ACC98318E2DE8EDDBB7E385175E9055CB7B5E5929000D09A00775419F8E8D1C6A57A43560EADBBF551A34B42D596A4A167C7DBD111651FAABA5A2631555283FAF083326BD872F57963DEEF0DFF18B58BCF037BCF9E1F40AEF6BFE9BCBD1A75F2774EADED2E1FD4B337040CF7DF40E4486FA57782E0D703D36EFCF4AEB4685EA7406688AB4080D0B2A758DB42BD9888E094351A11626931941C1D63AF4EF3103F562C3F1D5AAB2239AE8F89A9DF32B75AFAECECC2DE86F5F1EEAB0E8BD279231E7FB1D02D00E95725D060EE8E727DE80D68D232B2C98967B1E3B76AC3C403FFFFCF3B26A39FED59F05A025809E4A80EED0D0A17604E807DEF9BDD2A02198DE79FDA3E8DDB7E355C0ACE898BB014D909BFFD6720C1BDBB7CA809E33E37659807E7CFE5F95D68DEE7FFFAE9358B36A1B9E7BE3DE52728CB8E559AC58FB1656FFBC155792333179FA401BA02B02B02701FA9B978638EC737B4FA660AE00B4439D5C998103FAB9897DD0BA9163408F1B37CE31A0B76DDB26DB821680B636277771DC3FB0336E906141D320E183EFFC5169D0108447DD3E0B770DE98DDB06F44042EB9297C16F3F6EC6D67F0FB25D18B8B5BB73F31164665843F982430218D8291DDAFB1F2E5F4C63FF26AB975BD0E74F27E3D8E173B63E7AE7905EB0B7A0A565D2714A3F2C598BB57FECC4F36F4E46A3A68E43BEA40F01B7A03F98719BAC41C227E6FF5D69DD2A0BE82DEB0F302D67BE369155F5F285341CDAF71FFB77EF9B3B62E7962338B4EF349E7C691CFB1B69F4DF894BA574B37FD0A5BAD1B1FA0DA3D1BE4B82533CE016B42C409F48C6DC1F760A0BDA29C52B77B20DD0137AA37563C72E8E7BEEB9471EA0E55AD0135E5B252C683B40CBB5A01F7CB76A8026984E9E3E8001815B7BD46DC8A29BFFD5533677C43FBFEFC4C7EFFF883B87F6868F8F1ADF7FFD0F1E7C6218EA378CC27BAF2E45971EAD10DF301A17CF5DC1D18367F1C25B9331E7F56588AA178AD6D735613DF14A5206FA0FEE692B73D3DA7DB8782E15DE3E6A767CE4845B6C8096FE5E996E6C03F423B7C9B2A09F58E07E40FFFDDB0EDC747B17787BAB199CC9F20E090B64B775DBDD3D30A6FFF336F7C6B143E730EF8D65886B1065D32D3B330F0F3C5EE276A0B620D714E9A6D3EAB1F2BB7F31EB7F93D0BD57DBCA4875555E0EE8252F0E76580E59D0F304A01DEAE4CA0C1CD0B308D00E2C688A831E3F7EBC3C403FF7DC73B2EA39F1F55F04A025809E32A0936C17C743EF553E1A81FB8BDFFD74067EFD61133A7469812ED7B7C23B2F2F61D6715474A80DA66F3CF725E21B4661D4C45BA15279E1A7EFFEC581DDA7980B22F9523A264DBB9BF9630946CBBEFC9B41FFF79FB6E08917C6A25E5C046BFF3E6DEEC7E29F5EB49559969FF9D8A1B3D8BCEE00EE1ED69B01BFB28903FAFD876F9505E8273FFCC7ED16B4F41ECA728D48DD1BE41AD9B5E5281E7A72984D377BF707B505BDE8487B473EFFCAE8C701FDF50B831C9E46809EBF6297B0A01D2AE5BA0C1CD0CF8EEF250BD013264C700C68DAF65BAE052D006D6D4CEEE2900BE842AD01D39C00340DE82D5EF82B62E222406E06EE4795BA23A450A03AF2630489C0203F761E250E0C02F4DB2F2D4154BD305B0F3D7DE2522940A7A76663E13B2B70E1DC15DBA0E2E675FB997F77C6ACD155EAD91CD0EF3D7C2BA21C0C12A6E714E1A96A06340D1E92054D2FAFFB1E1EC85E84F680FE74CE4A844786D8EE9FBE3CA4FE6B01E82A758D1A7F92DB002DD7829EF4BF5F85052D05F4DD1DD15BE620E1B4F72B1F2E26B5BE08D0DF7DF117D46A2F141668B1E9E867A5FCC55501F4CE2D474B7D9AD31342B0914671F0688791B73ECB20E432404FBF459605FDD4C2B5D56A41930606BD115AAD1E1FBDBB02C3C7F7C3C3E3DFB101982C6872138D9BD2DF06148502080C2A8948A1B6D8F0F75E787929E11FE8876F7E7D05FE01BE4E03885BD05F3D6F1DD8AC28ED230BFAC7DDC2827624940B8FDB007D4F4FB492E1E2983871A23C0B7AD6AC59B2AA79EF1BBF09404B007D1F01BA7D0387DA15E98C98EE24A0E922F4E09375F7C33F6F22363EB214A0C9D25DF9DD7ACCF9E2090685FB47BECE3EB3DB76688A796F2CC733AF4E60FF7E78C2BB6C00913ED1673FF519C64FBD1337DDD6C5760F0579453640E7E514A2B050C38ECD98F81EE67FFD14E6BFF9BDC310BC8A04E116F4BB04E8908A67A466E46AF07415014D7EF6990F2D6083AB238A7DE79306BF82662DEBE3A36F675E15C5C1EB4CE17959C503AD4B3F5F83E1F7F4C343E3DEB2017AC35F7BF1F64B5F63C28377D974532A14C8CB2DC48A6FD6B1A8116A8BF65D9AA3792B6BDF50AB55888C0E65FFB67F913AEC3C920C1CD05F3E37C0E169FB4E5DC1020F07340F79B4BF9994A40CD6BFAB2365A4E5203C32184AA5D2E9CB7140CF244037B4BA0DCB4B1466270BD05BB66C815C404F7EF377B7039A0669E8D3BA4D87A66CB08B125992F4F9CD53CBB68D9845420FD3C5B329A5A21B9C56594601DCC571DFDD1DD0EB3A398036E0E10F2A1F2E46D6EB82B7BEB745177CFBF91A165130FBBDA988880AB10D68DDFFA875D0887CC63CBA80A2067854023F8FF2BCFDD123B63209363F7DB7BED41DCF7C75227B0950993F2D5DCF2C414A0BBE7E1A6B57EFC2BAD5BB5D02E877A6F59305E8673E5A57250B9AEA4C9114DF2E5A53EAFEE83EF8318A78E1AE1F9E895C43F3DFFA9EFD7ACF94FEE8D1A71D9E796801EE9972872D0A83AC68D288273F7F5FCC787614D3EA9EFBFBE3C2D9142C5DF42708349422224370EFF4012CE285DAA247EFB655EAB31CD08B67DDEDB097EE2740FFB4C7E516344135A938228857A2B2B1F0FC3CEEAAB3BF191A0BD97CEC7387F7E88A0CF70E7D950DB6F3787867CAB4017A5C225ACA00F4A449931C5BD004E8679F7D5656BDEE7BEB0FB7039A20439608B712A962E4F37CFFB5A568531C6D40801E36AE2F7B00C822E10F9DAC9B7041260EE8C97711A0EB3B2CB14867C02373AA168DE0B0F06ACC705BD78731F5B121CCAAAC6AE216F4DB0FF59505E8991FAFAF32A0AB5AC7B2CEAB4C1C7459EE266E5D3B53270EE82F9EBDCB613104E80F57EE7539A0798865E36671B63AF4BCB13D8B82A96CAAAD807E66ECF5B2007DEFBDF7D62C40D36729019A4299468CEF671B88224093EF930F4CD15B8F06CECA02F4AAEF37B24F54F209F2B0B0CA761C47F94B00DD5E9E05AD35E091B9351FD0F4703AAB6909A06F466488839984B94598F9F1BF350ED0D457A571D2D49F125A356031E8CEA4CA009A5C1C0BDD0468BA07693F900E60D331FAD2223F3D256968287DD11C3D74D6F6770234B9CDE86BA447EF76CC0547892CE8D53BE661C5376BD9EFD263F405A2D71BD8DFA59A96F5DC1337C87DB17FF729C604AA0B31837FFDF4E9DB116F3CFF95CB2DE8A7C75EEFD0C541617693274F760CE8CD9B37CBB6A0A7BCBDDAAD163401E0ECA9CBE8757307BCF3F237F86DCB07AC21E402FA9BCF56B306211FAB8FAFB7D371A7E53D4C1CD0F7DE49809661416B0D9831AF6AE162CE3CD09E782E07F45B0F12A01DFBA09FFDC43300BD6DE32190A52837D1E4A0DC9C02963D20D00F9D7BB4927B6AB9F938A017CD74BCDCE8FEFF52AB0DD0524389A25FB41A1D9B364F69FBA6C378E695096C22D0D9FF92D0B899756213BDAC6EE93C1D770CBC9EB991C828EBD3AF23DAB46FCA004DF1E76495EFDD71823DFF335F9BC0DC6B143EFADA9C075859BFAED8CCC652522E67D89EFBA2221D2E9EBDC25C74F4E2D8B1E908068DBA8131A16B621B3C39752E1B68A7AFC0437B4F83267CD1CC5257BA389E1ED34396052D1BD03367CE94D579EE7F678DDB01CDDFCED2CF1F29A0C9274B6FCB75FB3FBACA829EF5F04216DF2B9D7127EBC62A9989037A52FFEB6403FAD1F9558B46A864D53C3E3B07F49B0FDC240BD0B33EDDE01116B42708CB01FDF933251124E5D58B00FDD1CFFBDCE2E2E0CF28BFB614D0347EE4E7EF638B6AE1CF31195FF6E70DBEF1297CB8E419D46F14CDBE9CC9974DE0264053E44BE3E671A081EAB96F2CC3CDB7776183D78F3D3F061DBA24B0B5547EF8FA1F982D16DC31A827222283995126AD0B019A5E8E8347DDC88ED158D6E3F77D80FFCD7B88C5B0A72667E2F12973F0E9F2E75C0AE8A74677770868B2A0A74C99E2D882DEB46913E4027AEABB7FBA0DD06471905834238B3E9FA8610BF28BD8E83901FAC9FBE7C2C7570D8D468F795F3EC91AC9DEC5A129D2E189297370FE4CB25B17B69102BA673BC70BF6D35A1C8F2DA8FA609727C0C15575E0807E63EA8DB200FDDC671B05A08BC5E780FEECE93B1C360701FAE355FBAB1DD054B1579F5984ED1B0FB13A92AB912C54724B7C3AE767AC5EB9051F7EF30C9AB5A86F8BE7A77CF680960E12F2630468E9809E743D95E9F7BCCDAC6ADABDA8459B866C5C8A002D758310A09F7B6461A9312B770C123E398A00ED78C1FEFBEFBF5F1EA09F79E619870D4E191E78EF2FB7015A0A615E99827C0D1BCDB5777194F5E6B6BF81F2062064DDA8834C25806E87C4B68E01ADD1193D0AD0B48A9B5E6760964E75A71240DF8008073BAA64E669F0DC679BAA0DD0641048E3995DA90DC55693B5C72393AA523607F4A74FDDEEF0F403A7D3AA0DD004C64F3E5889773E7EA41468A992653D877C0C497ACC1ED07FEE9ACFAC5FD26DDE9BCB59E40B8FCFA7095B46A309BFADD884ECAC7CFC779C9641B07E39DB5BD0F6809E396D013EF8FC31F8FAF93057CC03A3DF642F0C57BA389E1CD50D2D1A540C680AB3930DE8A79FB6861E394A0FBEFFB75B004DE172BF7CBF914D9290CE50A34F9D4F96CD6230910E12960768EA28B9D956BF1F9537FBFDA98E6EA94AC739A027DE41802E19CD2EAF3002F4E31F961F8D409F6B278F5EB8EA749AE8E0EC023B65D549CE92A2144E458996E67465E280FEDFFD7D6401FAF9CF373B05687A60AF2465DA6E81D6C7E08351F6F745911A3FFCF3161B50A290380A97A39996AE986462BF7A5E5534E580FEE4C9DB1C9E7E9000FDCB01B758D01466278D9D973E6B149AE9A5F242A32631AC8E14D14216B4343C8FE7AF08D0348393BEA429AC94C2179FFBDFBD6C708F7E28D69F0661972E5AC3BEB8932EA6A349421C0B67A4D0492ABF2C0B9A9EB3E9E3DF61FE6A0AA124A690CFFCA7F5EFB814D04F8C244057FCDC10A0A74E9DEAD882DEB87123E402FAA10FFE710BA073B2F3F1D1BB3FA25BCF36B8F5EE1EB6CE478D1B121A88BB87F7C6A963174B1DA34C74DEEF3F6E61B1A7947EFC761DCB47C97E9949873DBA121938A027DCDE5636A09F5858FE6017F9C2BEF8F05756035A458DD6B8A0CE467E33BE825A25AAE730AB1C4097E5337458B08C0C1CD0AF4FE92D0BD02F2CDAE214A0E933F7E09E53A8176B9D3840FD69FA33656F19458026838056AE1B30BC0F830B4513B9624CC39580FEF8895B1D2A4D80FEE4D7832E07F4AEAD47B1F68F5DA5AE6FFFAC499F43AEB7F43C9A424F3E609AD0C3DB8216986AD834062DDB3462BA4F7B7A386302A55BEEEA6E1BF07FFFD5A56C012A4AD7756ECEDA89D2A205BF202DC5BAA175C326318C0904E0E8D87056264F3C469D7EA7F564766D3BC662DCC9A27636F138E8C747749505E8071E78401EA09F7AEA2959759B3667AD5B002DEBE21E94C906E8DBDAE07A9916F4931FC91BECB28FA1CD4CCFC52F3F6CB4DD3DCD0EA45956146E44FFA6639DBAB564032CF610A0CE48D623F9FF78D817851AD9039A9F4717A1E3741E9FAC41D6E688F1B7300B837C783CF489F2F2BAD0BF098494DAB66FCA46E5CB4B1CD0AFDDD74B16A05FFC62ABD3802E2FC48D5C67FB779F6455A5A9DB836F78128B57BEC4264591AB833468DBBE09C2A3426CE162A4DDE6F5076CB7C7A77C93654779E918856F11D4794818ADDB617FAC2ADD995BD01F3D6E5D55B0A274F04C3A3E7503A01D5DB72E1FE7807E6C4417B4A8EFD8827EF0C10705A0DDD16138A0C7DFD64696054D83844F7D2C6FB04B0A68F291CD7EEA73A45FC9C6B07BFAB25B2178D034E321373D8D81236E004DDAA185E709C434B59816463A7EF83CB3BCC982F874EECFB8636022FBAC238BE4E63BBA62E0883E367F1E8519D1E02A9D4729F97206060CEB8D4FE6AC64BFD3570D7DCED267FE0B8F7D8C944B1957D585CAEDD8AD05CB4F1318DAB4B72E5F5A56B2017A722FD0EEDE15A5CC5C0D5E5CEC1E40D3A0F49CFF2D6383CD34A87478DF69F629FDC682E9EC339A2C673ADEBD671B6685D18C437A71D1025364155248187DF5B4EFDC1C4FBC388EADDB4DED41D65BFBCE09AC2C5AB294DC547C6D6EFB78E1CAF6CD4A01FA741A3EFDED90CB2DE8CAD6B92EE5B7017A78175916B42C406FD8B001722DE8E973D7090B5AB216C7F8DB5AE3FA368E7DD03493F0E98FE50D76D9AF84F6C0E837F0DE678F21AEBE756D824726BECBDC371307CDC6A2152F3020D0834FEB418C9C782B03299FF54680FEF7AFBD78ECB931080E0D002DD04FEB4A48D79126F74A504880CDCFCA0770CA0B8BFA68E9B357D565E4ADB3644FCDE5807E75724F5916F44B8BB7396D41FFB96A1B028A1733E25B7DD157C3B18367F1E093C398B57CE6D465B628120734696CEFE2208B9BD6D97E7AF67836D59E26634C19F13AF361523BCD59F4B86D09526A272A4B3AF8E42A402F7CCCF14C4EB2A03F1380AED6F70307F4A3C33BCBB2A01F7AE821C7163401FAC9279F9475230FCF5B2F002D01F43DB712A01DEF2842807EE61379835DF680BEBBE763A506A9C8DA5DF6E7FF3079E8ABB65042FB075F0A68FBA541ED17FAA786A7B5260E17EF2012131FC966699605E81BDA4E454060C9AA6CBC2E6CD6E6ADCF22F1C6F678E99D2915F6250EE857EE4D9405E897BFDCEE34A0695D12AA1B250ECCB27CC2A48D2340DB6FA3C50716EDF779A401A9F1035F8682C646D6BDCDAEED2A407FF8A8F56BAAA24480FEFCF7C3C2827624940B8FDB003DAC131264B838A64D9BE618D0FFFEFB2F9E78E20959D59CB1608300B404D0E36E69851EADADA3D515258DDE88999FCA1BECB2073459753470651F12275D1BA22240D392A28FCE1A0DB5B70A85051A0CEF37B394056DEFF3AEC8821ED66F26BEFDEDD572C3F3E42C45CA013D7BD2F5080FAA7809CEAC7C2D667FB5C3694097E583E6CB864E796410546A158BB9A7A8024780FE75C5263CFBFA24162E47101E7AF3332C4AA1BC8D78ED978CE56B7A3BEA33651DE72E8EF98FDCE4F0F4C36733F0F91F4704A01D2AE5BA0C1CD033867644F378EBEA85E5A58282024C9F3E5D1EA01F7FFC7159B57CF4C38D02D0A500DD12DD5BC903F4B39FC9F3A54A814900A04F685AAAF29199236D6D447EDE817D9E90654193CFF4DE690398AFF4E907E723BE41149B8DC5634A69F49BA6DFDAC2A29EFFCA664167A466B3C819BA1E01FE9E012F213C22F8AABAD0C4204AA78E5F446E4E21C64E2E3F4E9703FAE5893D6401FA95AF773A0D6836D5BA78F7715AFA9366A8D13E84EFCEFE0663EFBB831DFBE0B5EFD804277B40D38067C3C6F5D8A0DF8923E7F1FCA31F23B14F3B0C1A75235E7EF233B69428C5D1DA039A5665A45DC5695DE91FBF5987573E78C06516F4BC876F74F8BC12A017AD3E2A00ED5029D765E0807E64480759807EF8E1871D037AFDFAF5900BE8C7166E128096007A6C3F02743D872D4C71D0B316C9F3A5528812ADDBD034C13A018606ED687ABB343DF3CA782C78FB079B3B8116A7090B0F66DB6151A2995CE46AE0162DED9F476B1A50A20D66A9CC75AB77B1B5A0297D3E6F159B8545897CDD8F3C3B8AAD9D4031A294E87A6111C1A0BDF7688D14FBBAF0BFD1E0202FB33C5138A05F9AD05D16A05F5DB2CB2940F32552797DC22282D8DA1094A4C7482F02368567EDDB7982ADD5406D21D58DCEA1DFE9EF3C7197CEA2F9AB986E3C714DE9CB87F290AFFF8F9FB7DAB62D73D869CAC8C02DE8B9D36F7078FAE17399F84200DAA14EAECCC001FDF0600274C98E3B655D832CE8471E79441EA01F7BEC3159F57CFCA3CD02D012408FE9DB4236A09FFBC2395FAAAC06B2CB24C7E55095729D398703FAC5F1DD6401FAB56F763B056867EAEACA735D19073D679A35F6B7A244805EBCE698B0A01D09E5C2E31CD0D307B59705E81933663806F4BA75EB2017D04F7CBC45005A02E8D13727C806F4F38B9DF3A556A51F7932A05FB8A7AB2C40BFFEED1E01E8E2C6E716F4070FF576D81D08D05FFE795C00DAA152AECBC0013D6DD075681E57B1054D330989BB6BD7AE45646424D46A3514B4771A0085C964B25086EFBFFF1E04E8471F7D54562D9FFC64AB00B41DA0BBB574BCB335B9385EF8D2395FAAAC06B2CB44332D0BF2346CB5304F49DC827E7E5C175980FEDFD2BDB502D034E188260C39B3951307F4FB0F5A3700AE281D2140FF754200DA91502E3CCE01FDD0C076B2004DAE658780A60C7201FDD4A7DBE0A50482839CDFBFCB85BA547B513ABD05451A0B46DDD41C7201FDE257BBE0AD0602FCEBB676451A33747AE0B9B19D6501FA8DEFF609DD8A7B787E81194613F0DE033D1DF67902F4577F9F84BF9F023EDE56CB4C24F72AA0D15AA0D559F0D080B66826C382A6E83959802667B59CF4F9EAE3B8946E5D8CA8AE275FB51706F76A82368D1C2F26A4379AB168F5715CC92EAAEBB2B1FB0FF055B34E1CEC6FDD73B2BC54A03130C8A4E55837AE150908F6F7C653233A3894E2426A017EDA721639053A87794506D729E0EFA3C23DFD5AA07E5440C57DBBA080CD3F7108E87FFEF907E4AC1649282014100A0805AA47017231D30C6E5980966B41574FD5C55584024201A140ED5680C2EC64039A02A645120A080584024281EA5180004DCB3C3BB4A0FFFEFB6F0840574FA388AB0805840242015280004D3B59C90234CD09AF6DC962014C6633BB2D15859E882414100A08053C44010234ED05EB10D07FFDF5175BB4A3B6A5BC223DD6ECBE8CD8707FF46A13CDD6E51549282014A85E05B47A13FE3D988C2317722ABC70937A81B8B9631C22829CDFD9A47AEFB06A5723403FFBECB3E5039A32FCF8E38FA03549F57AEB1632B52529BD5468D5EF3E04D76B06A3AE0817F7AD46FA4C14CCF10000200049444154993DB058AC16B5484201A140F528E0A5F645E36E0311D5AC6B8517CC493E89F3BB7F85362FBD7A2AE60157E9D2A50B7EFBED374444445C3D93B0A8A80857AE5CC1E5CB97919B9B0BA3D1E8015576AE0A168B0539857AACDE978E941C03D4DEFE0CCADE0A3D125B84A06D832078ABBD9CBB48359D7DF6EC59346DDAB49AAE563B2F939797C7FA757878C53B2C7BFADD67656541A552213838D8D3AB7A55FDB40613FE3D928993A96604453580B76F60A93C26830E7919971017A0C7CDED221011E45DE3EEB1B215A629DD7E7E7EA857AF1E1A346880D0D050D6BEB6A9DE66B3D9A2D3E9909393036A7C82B5C964AAEC753C2A3FC139293D0FBFEFB880139772E01B148EC0F03818F51A146426C3D7CB885B3BC723B16D7CB5429A560B94BEFC9A356B06FA71946EB9E516F6F9E3EA643018B067CF1E242626BABA688F2BEF8F3FFE404A4A0ABA76EDCA340F0A0AF2B83ACAA9D0A2458B101B1B8BBBEEBA4B4E768FCA43CB1CFCBCE50CF69DCBAF10D04D239418D2BB19EA85F97B54FDDD55191F1F1F84848430EB392020004AA5B234A009C8E4DA2050D3434B80ABA989EA7EE67206BE5F7B08074E5D81CA2F148111F150AAD4CC82D615E4A030FB0AFCD5660CEFDB1677F66A536D03872D5AB4C0F8F1E36DD2D29BF3EEBBEF46AB56D6A541CB4B74DEA953A7D8E173E7CE21232303DDBA7573BA89C8AA1C3264085B83A536A7A4A424B6D60C7D467EF9E5972CA4A96DDBB615DE323D0B6BD6ACC1E0C1833D4A9AF7DE7B8F595AA3468DC292254B30618275B9D48A12F519D2A0776FC70B2B392ACB99E3851A3D16FDBA1B9B0FA75408E8B6F50370DFC06EA81F5DF12243CED4C553CE254B9980ECEDED0D5F5F5F663DD3EF3C29C882A65F086C66B3B9C6C3F97C722616ADDA8EDD472E42E11BC22C6782334F0CD285B9CC920EF00126DDDD03836E6A0F7535B83BA2A2A2909E5EE2577BEDB5D7D0A85123870F99F43C727710A0BB77EFEE741FA3AF26B2CEC98AAECD69E3C68D0C665F7CF105860F1F8E175F7C111D3A543C459AB4A1BCEEF87271466B699F910BE85F7EF9059B366DC2FBEFBFEFCCA59D3E37BF488705CB3760ED9E0B1502BA6393503C32FA46348AADD9EEA8CA08C6AD660236776FD0F90A4BB1B95C93AD662EC4C5942C2CFC6113761E3E0F957F38FCC3EAC14B75B51F8B20ADD714203FED2282FDBD30F2B6CE18DBBF1BD42AF7FAA4C3C2C2909D9D6D6BB7575E79058D1B37C6C48913D9DF6EBEF966DBB1499326D9FE2E3D6FCB962D3873E68CED98F43CB290E801A644AB6351E84E4C4C0C4E9F3E8DAFBFFEDA768C5F842044D7DCBF7F7F997D495A1F8A8F1F366C98AD9ECB962DC3983163D8EFD263F6F7C10BE6F9695B359E162E5CC840C92DBBF2AE575E999F7FFE399A376F5E4A37FBBAD0D8CAAC59B3D82879CB962DD917C3CB2FBF8C8E1D3BB27197B7DF7E1B77DC7107DE7AEB2D562D5E669F3E7D70E4C811964FDA1603060C6071AB94E83CD298D2FDF7DF8F3973E6808E539D08EE543EFDFCF9E79F6C0088121D979EC7B528AFEDEDDB972C2CDE67487FD295A79F7EFA091F7EF8A1ED77D29ADA9EEE99DA9AEA4575A47BB2D7D45EB7323B84937F2C28D261EED2F5F87BF7B90A01DDA969181E1BD7B74E019AA49582994B6D03B493DA5FF3D3D3B3F3F1C6177F61EFB18B5007109C63A0F42A5957D5BE82F442A2A88E9C943308095063CC1D5D31EAF62EF056ABDC762F3400400F0A4FB367CF660F1B01A07DFBF6F8F5D75F6DC7BEFAEA2BB46BD78E3DE8D2F356AD5A8503070E80CEA54470FBF6DB6FD9BF09DE645DD3DAB237DD7413A80C2A9FE7A773A589EA42F9E8B87DA2F36813619EE8C1A7BA5C7FFDF5AC23F5E8D103CB972F6787A5C7ECCF7BF5D557D93993274F66A3D3524380D793DC08655DEFB6DB6E03FD945726E946EE1FFB7AF2F3A86EE7CF9F67FAF23C742DD28E2045C7C8BD44C709E094A64C9982952B57B26353A74E65F748FAD3CF9D77DE8977DE79078181D6C12D02AF56AB657A5379348643962A7DAED2A42FFA3B819F804CAE2C4ABFFFFE7BA9F3E86F15B5BD7DFB1248E7CE9DCBEA4CBA503D29D1F5EC279A51DB926B8CFAC18E1D3BF0D24B2FB117367D4A57D4BEEE7A00F20BB5950274E3B8087755A5C6945B2B00AD3718F1D8BB2BB0FFC4E552C2FB06472224BAD1558DA1C9CF4241C625984D25D12AC101BE983CB82786F5EB08959B2C697AC8294A8627B2E438682B82774580963EA4654196E05B1E842B02B47D59041B821B954580B6076D45C7E81C3A5ED679FC5859D793739EA332EDF5B107B414DE540702AD14E652F8F363D41E94087C04480E7CCA5BD631CA2B6D43E979F6C7E877E98BDBBEFE151DB3D7906B432F66AA1B819DA78ADAD05DF41280AEBCB2351ED006A3096F2EFE0BFB4F5CB2DDBD4E6F445EA19659D21501DACF5B89A08092DDA4C382FC316DD40DE8DCAA4129477DE5652DFB0C7B084B73791AA0093C04489EC83A240BDF11A02BB2842B826959D7231FAB23EB9ACA243FBE347DF6D967CCF2A6E46A40930ED2411C7A71710BDA194073B0F3FBA0C140FA62910B688ABEFAE8A38F4AB9382E5CB8C05EA4E501DA5E37FA5AA0AF1D772501E8CA2B5BE3015DD62D6F3F74167397FE8BB4426585801E7B47674C1FE57857E4CACB7A6D004D616464A1F3A810FA44A741C0EDDBB733DFA37DAAC88296C2947CDE04215AB3D611A009066421F274DF7DF731BF2BA5B2CAA4E3F6D635BF1E3F26B74CFBFBA3D03A1A202360F3E44A0B5A7ABD8AAC6BCA57190B5A5AAE14D0D4BE34B6402E137B17873D84C9DD71FBEDB75708E8EA1E771280AE3C4904A03D04D0349045C1EA3C113CC9E749D11A15B938C8C7CB272D9015D5B97367F600F35491D54ED7A070330A3B9326F21793BF92E04089C2F17EFEF967067947802690F3F3789904688A3D961EE365929B87A029F7584565DA1F2BEBDEE5029A62536910977CB66455D2CFBBEFBE0B2F2FAF5216343FE60CA0EDDB9EEE83BE00DAB46903FBF6A5AF98071F7CF02A401F3E7C182B56ACB04DC4A1496714B54110961E23ABBC7EFDFAA5F4E6BAF16395C788BC3304A0E5E924CD25005D8D80FEF8E38FD974FAF292D447C81F7CCA2B3D8FAC4B0AD5937E8AF2F30882DC5A9503688AF5A5B2ED13019AA0CFCBEDD4A913CB42E5D3C34D7F976E2E4C616CFC5859804E4B4B63EBDDD22C3EFB32A93C3E59A7BC63E59549EBC6C4C7C797F2AD523D49031AE82398D25642D244D114A41D852ED24B822C4D02134F4B972E65BF13A00972B404827D5B906E3CF163D2F3E8D8B163C758F9BC9DA46D687F8CF24BDB5E0A68E931D289EA4D6D43F05EBC78311B7CE589A271A82D28D1DFE9386F277E4C0A61FB6B0A40571EA0EE3E4300BA1A01EDEEC6B42F9F5C1C83060DAAD65967F67E66AA1359AD04037BCB5AAE1EE595C907E7CA2AC7DEA2957B2D91CF7D0A080BBAF2DA0A40D762405714E151F9AE22EF0CFBC13E3AEBF5D75FC7E8D1A3D92CA9AAA4F2CA1C3972240B692B2B25272733F7847440AF2AD716E7B84E0101E8CA6B29005D8B015DF9EE20CE100AB84F0101E8CA6B2B002D005DF95E23CE100A3850805690A09983455A1DF8D23E851A1DBEF8653BB61CBA5CE14CC236F583D89C84FAD1D678734A34812C34C8AFCEADE52E002D002D60231470B9021A9D01BF6D3C84EFD6EC416A665EA9F2553EFE15025A5F5832998B4EF4F351E3F6C4D6B87F586F848704B8BCAE9E5CA000B400B427F74F51B71AAC8046ABC7AF1B0F63C96F3B909557C4965EF0F60B8297B70F5B0258A52E992446B769361940B37C690906A34EC39607A62DEA06DE781DEE1BD2ABCEC1993411801680AEC1081055F77405B43A03D66C3D8A4F566C46A1DE8280B05806E7B2160662F762B140AF2D4061560A60D4606CFFAE187D47578404FA79FAADBAA57E02D002D0A53AD60B2FBCC05671E3891645A28914220905AAAA804E6FC0BFBB4FB1D9BD053A335B02D82730EC6A485B2C30E88A509099C4E03CE68E2EB8E7AE1E08F4AF1B7B1396A5AF00B40074A97E413305690BF8B8B838F6F77DFBF6213333F3AAD986557D58AFC579B4DE35CDC0A3597972122D35BA79F3665BD64F3EF984E93170E04039A78B3C6528406BE66CD8730AEF2F59C72C6982B477406809A46975498316F9E9976C701E795B973AE9D690CA27002D007D15A0F932A574A0AC85766A1A81681123BA27E91A2115DD83FD14715A5294EF7A51D3EEDD93EA4BAB4E12A4DFFB7A1D8A0C1604473580DA2F9841DA6CD423E7CA39580C1A8CBAAD33C6DDD59D456D94EB0AF1A41B73635D04A005A02B05689AFE2CDD3A89A607D3BA1D34FD98AF64C757C12BEF184D7FA6058CC8A2A5A9D43CD17AD634F59BA648DB1FA3C92A044A822C5F5C9FCE23F8F2EBD2BAD4F46F5E26ADBD4CB0A57D086991FDC8C848765D5AE7E2E2C58BB8E1861B6CD7A6C587E8CB81EA4CEB3C376CD8904DD3A615DEA44B7CD209E402E2EB3BD3EFB496344DADA64933A4034D33A775A5F9312A9BD66016092048FFB1F90816AFDA8EEC023D82A21BB2C1C29C2B67A18601FD7BB5C1D4E17DEAACCFD9BE8FD46A405FC9352120AC6401227EF3FAA23C14E5A6635CFF2ED5BA9A5D4D784009AEB4180FCDC2A374E2C409B6D12D2D144FC97E76225FCF81AF97215D6E54EE31AE0B2F5B7A9E54B3B22C613E0D9C8ED16C45BE79009DC72DE1B2CE23C012C079E2D3C6695A7A454BBF4ACBE5E71280F992A3345B927EA7CD5D29D1BFE947BA746B4DE807EEACA334042F334F0B28550CCE753594AE22AD6B35A0690BAC8AD23D77751780B6138840429626ED1AC2D73E96EEC44210E59B0CD0A9B4D810ADB8C701CD77F8A063F680B63FB66BD72EDBBACD949FCAA53C54261D236B9A438EFE4FA0A5414C6E9DD2DFEEBDF75EB6625B5910AE08D074AED4E541F748207516D0F67017802EFB09E42178DFADD98DACDCC23A1D4A57E7007D29351B3B0E9D436E81A64240B74F8847F776D6253545B22A20DD2A8BF6D3A30132FAD4E74B98F22DBAA47AD131CAE3C8BAB60734B912A4ABF211DCF8EA6B748CB669E289E04D10E63BBB48AFCF8FD9FB992B0234B949C865C293B46C672C680168F94F9246A7C71F9B8FE2F2956C4C1C783DC282FDE59F5C4772D64A0BBA8EB49D5B6E530A68BA80FD20A1A32DB66815396E713BB2A0A97CE9B2A5E5DD90D48D51DE605F652D682948D7AF5F8F69D3A631DFB6B0A0DDD2ADCA2D94763FA2088FBA1C4A57E72CE8EAED62B5EB6AF680A61D5A3EFDF453B6EEF2B871E3D83AC763C78E2D75D3B4E03F1D237873570165A0C1383A466B18DB839DD6B4A605F0C99DC11385B2AD5EBD1AB4B6321DE389A04CE0A7813EFA37F7EFF2E3B4EF624580969E479B0ED00EDAB488FDF8F1E3591134E8497E76FA122040F36334B848D7B21F24DCB66D1B033A4FE472A1DD5FFCFCFCAEF25F0B1747ED7A3EAAFB6E84055DDD8A7BF8F50866FEFEFEA596E9E40BD4D322F694A43B93D3EF04263AC621CC8FD3DFE818258ACCE03BBF7009341A0DA48BDF53281BE5A1BFD1319EA4FBF5E9F57AD0CE31D244C709B0748CEACE13BD5C424242D8AFFCBC808000B6BBB8F43E28FA82AE4D0BFC4B8FD1801FF9E2EDC3ECC8E72DDDFC97AEC9973D955E93AE4175A563555D6AD5C3BB8BA89E9B15B001BABAF72773F37D89E2AF81024D9A34C1B973E7AEC195C5258502355F81B262BE15665A171080B1A00085972EC16234D4FC3B1577704D141833660C962D5B764DAE2D2E2A14A8B90A28A00E09464043EBEEF4525033409BCD6664EEDD834BDF2D857F5454CDBD4F5173A18050402850C314B098CDD0E9F468F7F26CE60ABB0AD0E49FBBB26533F4070F2261E4A81A767BA2BA4201A18050A0E62A60282AC2DEB91FA0EDDBEFDAC67F38A4152693C9420319C99B364271E23812460840D7DCA61635170A08056A9A0204E8DD73DE478BD7DF6083DA522B9A019A46EE2F6FF817EAFF4E2161F8C89A767FA2BE4201A18050A0C62A60D01461D7DC0FD06CF66B080F0F679144A52CE8FCFC7C0668EFFFFE43C2F01135F64645C585024201A1404D53802CE85DF3E6A0C9CBAFB065162A00F429240C1D5ED3EE4FD457282014100AD458050C1A0D76CD9F2B03D0A708D0C36AEC8D8A8A0B05840242819AA60003F4827972007D12094304A06B5A038BFA0A05840235570106E80FE7CB00F4C91302D035B79D45CD850242811AA8001B245CF8A14C400F1E52036F515459282014100AD44C059805FDD14219803E71020902D035B39545AD850242811AA90003F4C7B2007D1C0983E459D05F6C3E89E5BBCED648416A4BA5BB3589C2CCFEED11E2E75DE55BCA2CD062E1FAE3D8FCDF952A97214E745E01959712A3BB37C5C49E09552EEC485236E6AF3D8A7319F9552E439CE8BC0271A101987A634BF46A7EF5767B6595CE00FDC947322CE8E3C791307090AC1A26BEF507140AC0C75B212BBFC8E45A050C060B4C6660E5437D111B625DD2B32AE9545A1E262EDE0C2F2F40AD126D59150D5D718E566741427430964CEE53E5E296EF3987796B8FC15B0D2895A22DAB2CA41327D2AAA03A3D705FEF044CE9DD42564906AD16BB3EFD580EA08F2161804C40BFBD1A71D15E78FCBE60599510995CABC0F7BF1762CF613D563E78B3F380FE720B7A77F5C1A05BC59643AE6D25F9A53DFD663612A283B0E45E2701BDEE381E1C1B88668DAC6B5E8B54BD0A24A51A3177713EEEEB458096F73564D06AB0EBB34F6500FAD85124DC3D50D61D25BEFBA700B42CA5DC93C906E8A9373A09E87C4CFC7AAB00B47B9A4976A936404FEC25FB1CFB8CCBF79EC7BCF52704A0ABACA0F327DA00DDB339A6F46A2EAB4066412FFA4C06A08F12A007C82A34F1BDBF04A06529E59E4C3640DF7F83F3805EB24D00DA3DCD24BB5406E8A8202C99D853F6395703FA02E6FD2B005D65015D706209A09B614A4FB980D660D7178BE400FA0812EE9209E8F7FF168076418356B5081BA0A7F4711ED0DF6C1780AE6A43B8E83C1BA0272456B9C4E57B2F60DE8693C282AEB282CE9F6803742201BA99AC02998B63F11772017DB7AC4213DFFF47005A9652EEC95402E8DE2E00F40E0168F73493EC52AD800EC412A7017D4A005AB6EAAECF5802E8A6F2014D511C5F2E9601E823879170974C407FB05600DAF5ED2BBB441BA0EFEBE53CA0BFDD29002D5B79F764B4017AFCF555BEC0F27D17316F830074950574C189A5009DD85456892CCCEEAB2F6500FAF02124DC7997AC4213E7AE178096A5947B32D9003D3911B1C14E84D9A5E763E2D2DD02D0EE6926D9A5DA003DAEBBEC73EC332EDF7F09F336FE272CE82A2BE8FC8936405FDF0453AE6F22AB4006E8255FCB04F41DFD65159A387F8300B42CA5DC93C906E849D72336D8B7CA173995518089DFED1180AEB282AE3991013A32104BC676AD7281CB0F5CC6BC4DA705A0ABACA0F327DA00DDA331A6F4682CAB4016C5F1CD1219803E7410097201BD60A300B42CF9DD93C906E8893D9C07F4B2BD02D0EE6926D9A55A011D8025639C04F4E63302D0B255777D461BA0BB37AA1CA0BFFD4626A06FBF4356AD133FDC24002D4B29F764B2017A4277E701BD7C5F8D0674618106BBB71EC34DB777718FD8D550AA0DD0A3AB7E0FCB0F26615E0D0674DA956C9C3F938CEEBDDA5683E2EEB9442940776F24EB22CC825EFAAD0C401F3C8004B9805EB8B9D280FEEAA3DF90975B68AB74C76E2D70C32D9D65DD84A765D269F5F8FDA72D1836AE2F766E3E82A09000B4696FF539498FB9ABDE2580EE86D820275D1CDFEF7739A0CF9CBA8C3F7EDA72D5ED07870460D23479A19C72B54B49CAC01BCF7D89055F3F5DEE29C70E9D437E6E217AF46967CB43FDD1D575915B67FB7C36408FAAFAF3C000BDE5ACCB2DE84D6BF7E1C0EE53B62ADBB7213D0737F4EB84E0D080AB6EBFA2633CF3FC379763C6ACD1D8BFEB24D6ACDA86E7DEB857B68CF66D48D7EBD1BB2DA2EA85C92EC395196D80EED610532A03E8EF96CA01F47E24DC7ABBACFA267EBCB5D2801E71CBB3A5C43F7AF02CEA378CAE91968FD168C2B9FF9290D0BA21162FFC15317111B87388751698F4982C31AB90C906E87BBA2236C8A70A25584F39955188892B0EB81CD039D9F938F75F32BBC6E7F35761E8D89B111119026F1F35DA769037BA2DF7A6E4007AF5CF5B7125391393A797CC94A5FEE7EABAC8AD7399808E08C092911DAB5A04961F4AC6BCADE75C0E6802684C7C24125A3560752BC82FC289231770FFA383D9EF67FF4B427CC368F8F85C3DBD7CD6C30B3163D628C4C647967B5F04E64EDD5B5609D0C494156BDFB2954D75A167D13FA0EA464B951B00800DD05D1B604AB786B28A6216F4F26532007D80007D9BAC42133FD95625404BC5A44FD3AF3EFA1DDD7AB5B17DD690E03C4D9A7637EE1ADA9BFDCAFF4E0FD4ECF7A7B2BFBDF3F212F6694B292A260C1F7D3B131BFEDA8BC2420DE8E1A363743DFA749A7ECFDBB8E9B62E98FE8C7553DCA71F98C7CA9934F815F6BBFDB1F36752D8DFCBBBDE57AB5EC6BB2F7FC3CE7BFBA5AFE1E5E5053F7F1FD0DF29D1315ECF85EFACC086BFF7B2BF0704FAE2AB55B3593DD352B3917E259B1DA3F30202E54763D8003DAEB39316742126FE78D0E580967622E9434A6DF1D1BB2B589B53DB3FFDCA78D6F6E5B5EFC8F1B7E0E907E7DBDA97972B6DFBF95F3F55CA82961EA3F6A7BE30F3A10530994C080CF2C7BB9FCC40E3E6719876CFDBACCF50FA61C95AAC58B2D6566D7E1EB513F52D3AC6CF93F580543213B3A023FCB164849380DE76DE2D80EED3AF138328253240D6ADD98D944BE9EC0B84F49EF4D00044C784D99E357EFBD959F9080EF167CF07D774F7D6A3ECF01F2BB7324DA97DE918B7A0E3EA47B26394F8F34B7D46FADC53BF98FDD467A0E794AC65FEFC525DE818B52F7FEE795D785F9B347836167E3B933DFBD2E7BE924D5666F65280EE6A7DA1394A0CD0DF2F9701E8FDFBE403FAD3ED4E039A2A4E6F676A78EA007DDADCCFDE7E1CE2FCD8FC37BF67D6CFE6639FB346DCBC6EBFB5F1BE5987C53FBDC8AC583A975C26FD07F7C49BCF7F8537164CBBAA4CB2A20AF2351839E116DC3BF4559C3E71C956E68C49EFE1DEE903F0DFF14BD8B2FE0056EF98C72C8591B7CE6265C6C447300B82EA49293FAF08CF3DB2907D56DB5BD0F6C7BE5CF85BA97A366FD50023C6F763F59CF5BF49CCF2EEDF6306D6EC9CEFA82D6DC76D801EDBC97940FF74A8DA004DD62E694AF74F9FB594A456106F5F3A4660A7B6A076975AC9D23E43E757748C975D96052D3D26ED33D41694DE58301DBC5F90E54D7D66FE574F2128D8F58B4AD9003DBC83EC3E609F71F9A114CCDBEE7E40D375E919A4B6E2EDC4AD647B8BD6DE8266E74C7A0F8F3C3B8A3D8794E8D9E5CFB6F4187F467FF8E7CD522F602A73F2F401ECB92FEB7AFC1867027F46F97348D7A044CF5B59FDA2CA0D20B5A0BBD4C794CA00FA87EF6502BA9F55344729F1F39D6E013435064F6461F5EEDB010468A9E56D0F76E9434A30E51096363EFDDB1ED0D2878D3714019A37309DC3DFEA04D590B040B4EFDC1CF562C35158A0950D68A9FB83E04D1D840025FDE4AE32A0C774446CA0132E8ECC224C5C79B85A015D96BF98204B89ACDD6307CFDA1E7CDE16520893DF31B641146B0BFA74B677716467E641ABD5B3F2664C7C8FF51D4780B6777F507B10A0A53ED16A01F4D0EB1C3D7AE51E5F7EE40AE66DBFE0760BBA22403F30FA0D66E90604F8319F74598026B8F397B33DA0ED7DD004D9AA02BA3C78D3F3C78D21B701BA733CA674A92FAB2D0D3A1D76ADF84106A0F7ED45825C402FDAE51640F7EE5BFA136FFCD4FE78F989CFAE39A069E0E29BCF5683069B6EBDBB3BBAF56CEB19801EDDC17940FF7CE49A027AD7D6A3F879D906D69973730AD0AA6DA30A014DF9785BDC39A427E8E5C9A14F8393BFADD88CD4942C561E7D25D5184087FB63C9D092414C594FB7241303F48E8BD714D0F4727CE7E56FD0B8592CEE1ED61B1FBEB3A2940F5AFA85C4AB2EB5A06B15A03BC7CB6A4206E81F57C80474DF7EB20A4DFC62B7D3803E75FC2236ADDD8F9B6FEF82662DEAB34F9D675F9F68F33BF38AD09B70C4845BD82711F995922FA5B1F38A0AB578F08961080D0FC2A205BFE0E09E53CC1D21D782EE7B47578C9F7A272BF3E3F77F4483C6F5988BA341A3684C7974300C7A233E9BFB333445BA52839B645DFDF0CF5BB2017DE97C2A1E9D359AD593C0B2FECF3DAEB3A047B6776E90902CE85547AF29A02B72719465414B3BA8BD8565EFFE90EBE2209FEA132F8C65835DAB966FC0A7735656BF054D801E52F510B3E54752316FA7FB014D63472BBFFB178D9AC6B028ACB20602C9A7CFBF40A583848E004DCFE153B3C7A345EB86F8FBB71D786DE617A52CE803BB4F62CEEBCBF0C25B931DBA38EE4C7C14CFCC9EC08210E8CBEC9D9796B0F3AAC582EE1487297201ADD561D7CA1F65007AEF1E24DC2C13D05FEEA912A0FBF42BB190FD03FD70C32D9D586350A246FD62C12FB86B68C99AB8770DEB8D1347CEE3AD17BE6650A32880EB8B43A5A8A19AB5AC8FD0B040FCF9EB76D6184545DA4A019ADEF8345897969285479F1B839CAC7CBCF7CAB7E875730706E8837B4FE18917C7C162B660E79623AC9EE4E2B87368EF52803EB2FF0CB31A1E787C28F47AA3ED18758C796F2C43FD46F5583D7FF9611366BE3A810DB4B8C4C531E23AE72CE8AC224CFCE5D83505F41F2BB7E0CCC9CB4C5B6A8BE87A61155AD0D2B02F8A2EA03EC52D687A80776E39CA421DAD9FE2076C16F42FDF6F6483BE6326DFCE069638BCCF9F4EC682777E804AE585F8065158B57C23B3FA1A358DAD5E1747B81F960C7202D04753316FD725B758D0BC5D48531AF0A3F11E7A462849014D2F484AFCD926BF2F85E5D1E0380FA5ABC8C54180EEDEBB1D8A0A34F8FBF79D98F0C05D8C07F485959591CBCAFAF7AFBD3640DFDEED1176BCF5754D70EBDD3D585DF84B9D8CB6D52BB7B081407A0E9B348F6306DD98FECFBBDFC5D1310E533AC5C932769905FDF34F32017D535F5985267EB5B7D280A64F59FEE0D045E21A4431CB599AF80020FF5BEBF64D1019156A1B180C090D44FB2ED69D0A8E1D3A8BCCF45CF66F1F5F6F160D909A9CC9E0479690F501DD6F1BD8931EE3FE447AA02945C786A3651B6B60F9BE9D27405602257EBD0B675370F19C75DFBEC41BAC7E427277505D2A3A46F94E1EBBC05E00AC73ABBCD0F3C6F6AC9EE427250850DAB6F110FBBBDC641B241CDECE7940FF7ADCAD80A6766A9A100F5F3F1F68353A9C3A76D1D686FC7EA5EDCEFB059DD7B0490C8BBC909E476E8CE44BE9EC541AB4B52FB3BC7E415F6C9468509ACAA4FEC8274548DB90974BA182E42A91F60BF27BABD42AB9CD243B1F1B2424400F6C23FB1CFB8CCB8F11A02FBB1CD052BDA5CF1ABFBEB47D793B4ADB903FA3D456A429FD2E7DEEF933CAF5A617A5B47DE93A74ECF0BED3AC1F911B8CF70B7E3DFEFCDAF799DDDBAC515E94384BA4CF9AFD735865F18B4F319C0DBB0000200049444154B44571748CC5948E7201ADC5AE553FCB00F49EDD48B8E96659754CFC7A7FA5012DABE06ACAE4CE019FEAB8051BA087B5456C60D5378D3D95A5C1C4DF4EB815D0D5A1474DBF0603741801BA55956F65F9B134CCDB9DE4724057B94275F0441BA03BC4604A47ABF1E528310BFA97557200BD0B0937CA04F4920302D08E9477E3711BA087B6711ED0BF9F148076635BC929DA06E801D658E3AAA4E5C7D2316F8F007455B473D539A500DD214656B1069D16BB7EFD5506A077EF44429F1B65159AB8F4708D06B4AC9BF4E04C36400F6E85D880AA6F107A2A5B8B89ABFF1380BEC66D6D05B42F96DC296FA3D1B2AABBFC4406E6ED4D1116F4356C4B1BA0AF8BC694F6F564D5C4A0D761D7EFBFCB00F42E02F40DB20A4DFCEE8800B42CA5DC93C906E8412D101BE0848B8300BDE6B400B47B9A4976A90CD0A1046879FBD8950DE84CCCDB27002D5B7437642C05E8EBACE3608E127371ACFE4306A077EE40426F79DBBE272E3F2600ED4879371EB7017A4082F316F45F6705A0DDD856728AB602DA074BEE90B78F5D99803E998979FB5385052D477037E5B101BA5D14A6B48B92751506E83FD7C800F48EED48E8655DFBC2514AFCE18400B42391DC78DC06E8BB9B21D6DF0917478E0E13FF3E2700EDC6B69253B40DD0B7C9DB85A34C409FCAC2BC036902D0720477531E1BA0DB46624ADBF21788925EDEA0D763D75F7FCA0474CF9218E48AEE2171C54901683735B29C626D80BEB3A97316748E1613FFB920002D477437E661800EF1C192DBE4EDC25136A0B331EFA000B41B9BC961D13640B789900F68B2A0FFF95B06A0B76F43825C40FF784A00DA6173B92F830DD0FD9B3809681D26AE1580765F4BC92BD906E85BE52DF25E26A0FF2340A70B0B5A9EE46EC9550AD06D22645D83B938D6FE2303D0DBB62221B1A7AC4213579E168096A5947B32D9007D7B23E701BDFE92B0A0DDD34CB24BB502DA1B4BFAC95B43B84C409FCEC1BC431902D0B255777D461BA05B87634AEB70591760805EBF4E26A07BC8DBF63D71D559016859F2BB27930DD0B73544AC7FD567B69DCAD563E2BF9705A0DDD34CB24BB501FA66792BA09509E833B998773853005AB6EAAECF680374AB304C69256F5717E683FE77BD0C406FDD8284EE3D64D53AF1D7F388085362447FD7AF8D2BAB02753CD3BF3BB43879D68895B7D4771ED01B93715D4B357A75A9FAB2A575BC399CBEFD4FBE2B4042B03796DC246F7A7099803E9B877947B230F0163F663C8954FD0A64649BF1E39A22DCD73214535A86CAAA0003F4C60D3200BD65B36C40F7FFEB1272F46659151099DCA3808F5281E57DE310E357750BFA4C9E1E0F6CBD8242A3C53D9514A5CA56A05D980F3EEF2D6FF6595985AEBA908F3947B2201E4BD992BB25A39702B8BF6528262684C82A9F017AD3461980DEBC0909DDBACB2A746D721132742659794526F728E0E7A5C0AD7101F05729AA7C817C83199B5335C83388976D954574C189D482B17E2ADC10237FDB33FBCB5E2C34625F86165AB378D9BAA049AA5C845A01D0CBB66588BC09640CD05B36CB01F4462474E956E58A891385024201A18050A0720A30406FDB2A03D09B08D05D2B57BAC82D14100A08058402555680017AFB361980DEB801099DBB54F942E244A140752960B158401FF2791919C84A4F8351AF8752A140786C2C82C2C2A152A90085025577FE54D79D88EBD4750518A077EE281FD0050505B8BC750B52BF5C0CB3D100D6F345120A5C73058A3BA2055058CCB098CD5058E81705A05440A150C26CB1300813AE554A6BE402FD9B76C0A1FC2090B3FC4AEB79F4634B02DFD7BC894505A05028E0DBA4099A3CF50C222222A056ABD9DF28294C2693A5A8A808A9A9A9B87CF93272737361341A856C42816BA7004158AF8745A301B45A78E5E6409D9509EFCC4CA87373A0309B411634C1997A2AC19828AD54ABA1B258A0A4F38B13C1D91814047D44240C1191308584C2E2E707859F2FE05BF501B96B278EB8726D528040ECE7E7877AF5EAA17EFDFA080D0D655F7F36409BCD668B4EA76360CECECE06C1DA6412D119B5A913D4847BB1984D306667C3989303537616909509A4A743919101456161097009C83E3E30F8FA41EBED0DEFCC0C98743A1428BDA08B8F4390AF1F7C755AA8345AA8B41A28B5DA52B74F70B6444402111140743D788585C12B2404AA901028BD451C784DE82BB5AD8E3E3E3E08090941585818020202A0542A4B03DA6C3643AFD783404DD6335927220905DCA500EF5FC68202685392A14949863E351586D45418333260CCCC80456FDDF49525A512E6E060988343D88F29240486C040688C4644FCBB0E3ABD1E3941C1D0F4EA8DC0C828F8984D50E7E7C3AB201FCAEC1C78E5E7C12B2F0F8AFC3C40FA75A8544215150D556424D4D1D1F08989856F5C1C7C6362A00EB6C6B0724BC65D5A8872850204646F6F6F10A8A5EE0DD6FFC882A67FB04F46F2D915FF5BC826147087024529C9283C7F1E0567CF409392027D7A3AF4599930E65A37FFB525B274C3C3618E8884392A1A0808802228088AA06078F9FA322BC370603F14EBFE8141A984AE556BF8F7BD0521A1A10CAA068381191D0672931414C0929F0FE4E742999909655626149999405151C9F5140AA80283A08E88807778387CEBD54360B3E60868D4187EB1B1F0F29617D3EA0ECD4499B55B01EAAFF4437DDADE2850588ACD196135D7EE4E70ADEECE505888FCD3FF21F7E851E41C390C436E0E4C4545301615C1623094AE5678382C71F130C5C533382B7DFDA0F4F385CA3F805918F4E3EBEBCBFE6F361991B6E833E84F9D623E65EF21C350AF5367F6A9C8014D5F845AAD967D19D20F8D961B8A8A60D66860D669A1C8CA84322505CAA42480DC2AC5060A7B48BCBCE0E51F0095BF1FBCC32310D8AC1942AF6B8F90D6ADA10E0CBA56728AEBD66205CAFA5AB301BA16DFB7B8B56A5280BFE43569A9C8DAB717D9FBF7A1E0CC19180B0B61319960B11F7CF6F1016262616EDC18A6F8FA4040A075A08F60ECE3C33EF9E887A04CFFE790A68E9C7BFA342E7DB21006F253C7C42062DA2388898B431059D90A05FB1AA4B114B2A4B9354DB02E056C72E9E9F5301A0CCCCFADBC7C09CACB17A138778E457F481301DBFAA34250CB1608EBD819611D3B22A041C3127F61A908916A125D5CA6562B20005DAB9BD73D37C7414CD0351B8D6C902EEFD449E41C3C809CC3875074F162E90B2B14B0D0E71BFD040642D1A4294CF51BC01C5D0F0A5F5F366A4DBE377B20739F1C81D98B2C5A0264B1FBE2C2CA1F91FEC7EFCC1A56F5ED87F80183101919097F7F7FF6A9C8E2A48B7F08D6F443E32B1CD6E4FE90029B8FC110D429AF3239095E17CE4371F9122C3939CCBAA6E8117B70FB444723B463478477EC8CD0B6EDD80B4649A3F05E5EB6903EE1C7764F3FAC0BA50A40D7855676F21E39902946DEA4D1C2585800437E01728F1F43CE9143C83F791246F2F14A93B7372CE4B7F5F165111396F87858E2EBC3121AC6804C3F7C60845BC8DC4A2658D3710232C1563AAA4D7529C8CEC2E90FE723FFC001C0CB0B010F3C8406ED3BB010252A530A44DBCBC40ED8046229B0B91B845BD8DCF236190C0CD0CAD4142BACC962D7E9A0A0414C72D1482C6DA58F0F825AB44448BB760869D90A3E915150F9FB434523F36AEBB66402D64E76C63A76BA00741D6B70B9B7CBAD4F02AF36231DFACC4C14255D46C1850B283C77169AA424E6B6B02502504020CC0101B0909B8106F6222381A8682809522A95CD4DC12DE5B280CCAD643E7022851AD589A09ABA67172E7DB304FA9414A07113D47BE021C4C4C4203030D0666597779FE5019BCAE5C026384BFDD7645DB30147830126AD06484B8322231DA081C6BC5C280A0AA0A01794C48543163459D734C818D8B429FCE3EBC327228241DB9BFCE464610B60CBED8E75369F00749D6DFAD237CEC165D2EBA04B4B83E6CA15145DBA88A2E414689293A0B9920203455A4806D228B2822C624B6808FBBF223C1CA0FF878543EDEDCDDC16DC4AE6BE64FA5D6A2173204BADE4F2C04575D469B5B8F0E30AA4FEF13B2C14EF3C78281ADCDC97CDC0A2807F3E122EA759A503E33C8A89FF5F0A6CEEFEE056361B70341860D4E960C9CB85252B0B168ADBCECD8532271B0AD2C9EE8B42151808DF9858F8C7C7C32F3E1EFE71F12C3AC42F2E1E5EE48B17B096D364752E8F00749D6BF2921B6680B25860282C40C1B97328387B1645172F409B9E067D5616741919304BE391C9EA8B8880393C0216FA090B83323818CAE01078050430284B812CB59009CA04633E4B4A0E90A54DC32DFABC94149CFBF20BE4EDDDC3FCD9C1D36720BE6953E6DEB08F21AD6CD396056CEEBF960E3812A0B90F9BC39BFE4FD129E6DC1C6B485F4EB635A42F3303C8CA2A6D5DD38B2B2C0C3EE164514722A0491304346CC4AC6D5FFAEA10B0AE6CD3D5DAFC02D0B5B669AFBE31E9E73D4D0EC9397A1479278E337785213F1FC6FC3C16FE56CA4AA678E47AF560AE17C306F594814150F8FBC3CBDF1F6A0A6F2B0E7DE36E0B1E69C1FDCCDC8F2C8DF3E435AB8C3F96EA4E904CDBBF0FE7177D06435A1AD0A60D6226DC6B736FD843DF99A6B587B574C091EAC181CDDD1F521F36738768B5301516C24CE184458550A6A6C22B3D0DB89202486646521DD9CB2D3010AAA060665507B76A8DE0962D11D0A00194EAD23E7567EE499C5BF3141080AE796D56A91ADB66ED151522F7C40964EFDF8FEC03FB98854C11182CF4CD7EE66854141BD033366A0C0BF99069504FAD869A42DD24A16F3C26D9DE6D611F785F1520DBDF249BEDAAD1E0D29A3F90BC74295B12C967F418D4EFD587B937E8055119F7466544B49F23207DD1F170BEF2FCD734E8C880ADD382061CD917495626BC2E5D82F2D24520230390FAF269D20245AB50644B501042DA5D87B04E9D11D6A103BC838285755D9986AB057905A06B41239602088594198D309B4CD0A6A723FBE00164EFDB8BFCFF4EB14FF0526E031EFAE6E303456C1CCC8D1AC3D4B021E01FC0DC11F63E64F2F1961769C1A12C1DDC73A5B464B1E6255DC6D9AFBF42C1BEBD40541442C64D408376ED58ECB3B3EE8DAAD6D51ED6F6C0E62E101E1D6203360D389A4C50141640917419CACB97818B17009DAE24A44F522902764093A608EFD205611D3BC13F2E8E59D74AB50A8AE255FC846BA4AAADE8B9E709407B6EDB5458331B94E9D35FA301CDD8A309218517CE23F7D851F64353A94BB92BBC54B0F878036A6F202418888D87393E9EC18E66ED1194A533F6ECDD16DC8F2C0D7DB3ADBAE5C6491A2C7AC36040FA91C338BB601E4C14F6D6AD3BEA0D1884D8C68D59EC33D5DD13922D24B138F6BAAC093357CD70A401478A27D7EBA1484F63E17C484981222F97019B85F4D94DF2A10891E096AD10DCA60D0BE9A3D996E476A2B03E451953863D411B5187CA2B20A67A575EB36B7E06455AE8737260C8C9812E3313F967CF300BB9E8C2056BA445894F814D83869F3F2C01FE405838101BCBDC168A9050781547599435B027755BD803B932BE63578845D0D31616E2D29AD5B8B26C29E0E303BFC14311DBB317A2A2A3AF8A7D76C5355D558674C20CF7A34BDD217CB091FBB0B94F9BAC6B364126ED0A14A9A9B0646640595404057D05D10A7D92681AA5B737029B37476093A6086A9E00DFA8683608A9A6A52BA9FD45AA110A9439D59B2F9674A5508BAD4959D018C552A31ED59AC5338EFDB50508CFCD42784116FC32D3A04DA655E052A0A54127C9C3AAF55221D3DB0FE9F4E31B087368280B81A3F037F8F9C14BA5663F349D9AA22E54DED615B4C8C76C3D669D1CE2A5F482822D8A4F0B87172F1E5E5DEBDB5B006F830E26A5174C5E2A982D66B65646E35FBE05CE9E4672783492FADC0ABFE6AD1010140C259B61E851AD765565AC6E7E9ADDC856232B5ECFDA0CB389A6A45B63B0E92B81A69E1BF4D675438C06EB34749A2064214B3A3B0BCAEC6CB63E76A8B610D1BA2244E98BE06B92ACDF4EF1D7E1E12C7C8F061C8D91F590191C8EECE070E4FB07C1AC28FED2F070BD3CBB355D5B3B6A8A06417EE8533F823D6F5250B3D5ECE86DBD33390BBF5FC842C7D870D75E5D94566905582C2EC5DAA6A6407FFE2C74E7CFC13B3B0321857908D2E4C35FA729B5959339300886C828E8C322A0090D439E8F1FF2BCFD51E0EBCFAC6495DA9B0DF0B1D8646F1F2B8CD5DEF02A9E92AC2C863114927568D9035CFD4F31DDBB3EE932749BD681D656F4EF3F90458EE84E1D47836F3E829A1649EAD403598937C32F3A063EF449AFB0AE0256B39275CB2EF61FDB2C4702B6894D003291CB83AD23A287516F5D3384AC6B82362DC5EAA7D3205857C47EFCF36843832CA833D3A1CCCFB3EE3A539C742A6FE4F907B11F6D781454F10DE0DDB829BC1B3606CD7C64ADECE96FB79AD5B095AEADDE64C6FEA434BCD5BB150B43950E76B31D55A8E1379E4FC5A1423346B76B52E90B88139C53C03649A4B000DA93C7A0FBEF14F417CEB2B591CD05F930D9AD636C51AB610C8B80AE5E0CF451F5D82E2134B00716FE56128F6C8DB8F02D8E4F2640ABA1F252318B53E9A58492C0267963973CA7D50F66AB82144A6746C1F62DC85EFA250B4F0B9BF6187CAEEB84CCEFBF81FEAF3F60F20F80B9FF4084F4EC83B0F00878FBFAD602C0145BD67CA9DFE2DD6208D6F4C35C224603B3AAF5E4DED2E9A1B7ADD0A7835943A17C45405121BC7273E19D7E05DEE9A950A7A5D29649259D931E7EF2550705B1979E4FB304F8346F019FE62DA18E8A622F646B1FB856EDEFDC735453CF2E3218F1FEE68378B76773361BB6D482FD04E8C2C2426C387705C70D2A01E86A6865DBC83FADB6967C19DA13475174601F0C17CEB14F598B5E675D8A536209997D7CA06BD018BAD838E8A26360F60F601690978F2F543EBEF0A14922B4146771289CD587EC0D959AD6B4A091FE92352D6C037BFC5E3DC482620B1A190CC8DDBE05053F7CCBC2D17C060C855FFF01C879F16920330386FA0DA11C320A11AD5A233028987D0DD42A0BB0B8CDB90D2C8DBFA63D16AD6B8810ACADD6359B3443A17CF47FB6A4AA0E26AD967D81C1A0876FF225F8255F86F79564280B0A4AF76E5AD889D62E2137575C3C7CAEEB08BF36EDE09BD04A58D6D5C0017E0902F47B1BF7E38D6E8DD8AE2AA5B6BC2240D3A6B1EBCF26E3A4C9072385055DD234C533ED6C0ECECA828C03963E614D14736C6271B0BA9347A1D9BF17DA83FB61CECAB05D8F3D94C52BBF59542A18C323A18B6F004DC3C6D0474431CB97ADFC563C63CF9BC05CBC14A7756A3501D93A638FBD858BA15CFCB4556397ABDAA5084034953BE7E07E687F5AC696FEB45CD7115EBD6E84F993796C453C43C72EF01E3402016929306EDD04FF9E3720B0F78D564857B67DAA56CD6B731607377787144789306017478130EB9AD6BF2E5E039B7E67BE6C8A773719A1CECC60B0F649BA0475F1D88575853E73699BD9CF0FBEED3AC0AF4B37F8B668C3B605A3303F5A6AB5CACF02FB40A299AB66902BADA6F4C9EA686C0D59D01BF7E3F5CEF5CBDE34363F3F1FFF12A0CDBE18D156B838986390A640275D8621F9125471F150C735280E5F72F4F967B57DC84F489F9E3493CC989106DDF163CC8FAA3F79AC54C81441875C1666B537CC3EBE30C4C4401B5B1FBA9838906FD91A8F6C1DD0F3F6F6818F6FB1DBC2A704C8CC6F45502E8654C94083A3BA5647F7937F0D8BC50AE8ACD3A7A0FB693954278FC1141E01D07A15470EC144BEE8DE37C18FEE75F3BF6C1D0C655434EABDFF91D59F5E237DD1F2F5299DB3B89F4997542D7687988CB49B0C59D9D68D0AB8754DFF27EBDB4481009A42F8A624C1273909EA8C3478513CB6410F2585FA49D75BA1094AF51BC2A74D3BF8B4B90EEA7A3150F8F9B3D98F647997BC142BEA6BD6BA1AD252A13F730AEA060DA18E8967D017EE148000FDC1C67D78AD737DB664EE55BB7A73409F30F962445DB7A0A9C39B4DD09E3C8EDCC51FC3989C04DFEE890899FC109B8A6B75D1493A23B76CC8A2217F714E16CC140277E922F4E7CF407FEE344CA9A940F1483B1B13527BC3E4EF0F939F3F4CC121304446431F6DF527B305EB556A2B907D3894ADAE0BA9852CB5924B8DFCD6602B922C68B2F8B25253A0FD6939BC766F8785E29B556A28755A1849AB464DE17BE6141445855637CF4DFD103E78147C8BD781AED55674792C97B8454843BEE093D57F6D80D140EB6097F65B5BDD21D615FAC898506567C23BED0AD4A92950D11E8E5A0DBC0A0BA1D0EB4A59D74A5A08AB49337893DFBA7E43A8C223A0A490CDB0705BFCB57D1B509DC87D95BDF8136837FC0375424B040D1D0DDFD66DD9649B3AD96692B62440CF910BE8E17519D034384333F00EEF47FEF225305EBCC0769056F5E98BE0C123E01B1A566A8495DC15C6B42B30A5A7C2987A0546B2B82F5F80293909661AD82B4E168582597FC6A06018E9FFA1E130444432178685F6D82B5EE18D222C4A7CC8C551172CFC4DC57E4AAD8D4C837B1EE643AEAA2D582294850123373B0B85BFAD8472D33A2825DB6259945EEC6B83606D080E81B66357F8F6BD0DE131B108A0DD588A17F477BA1E35BD003B7748C9824F46161D422E11F261EBF556DFB56D3BB06277084582786565B2A810554E1603B63A2F976DC22B8D1051F8FA41151307557C7DA81B3686574C2CBC22A3D946BC5E926DC1D8347D9D0E39BFAC8071F5AF5090BBA5452B040E1A09DFB6D7313F785D4E04E8B972007DDCE48BE175D6C5618573D1AE6D285CB502A6CB1761F6F282F6BACEF0EE773B429B25C0DF3F0096DC6C182F5D80E1FC59182F5F84293303A6AC0C9873B26DAE0B66257B7B431F1E69FD098B609116E6A0600664859F1F0B7763B3F6D8564E3ED6752E282E9962948B07F628D2823EDB4B5C173622D7D2FE6C5DEFB9202F0FB91BD741F9D76FF0A2D9749244DA6AEBC5A2B04317285BB743786C3C42C3C3E1439FDD5EE4DBAC596E1DF7376419112236FF7549FCB57D848841AF6510A7F5AF09D84A722715E4C12733033ED95950676740491BF24A1259D7F4E3151109755C7DA81A35818AC2F922A3A1D5E99075EE2CF46BD7C0F7C06E284D2678356A82C0E163E1DFA96B1D734F956E7502F4BC4D325C1C04E8617511D0DC723EB817052BBE8589A6DA9ACDC86DD711BA6E8908F5F5454056069417CEC194960A4B411ECCF9F9B0684AAF6D419FE0BAA87AD090BB22321A165F3F16FEA6A0D0265B7445692B9906F5D80F597F3CD28206F88A5D15B5CE4AAE8848346DDD6C4651413EB2F7EF8162D5F750A5A596FA12D1D48B456EF7DEEC333B242A0AA1E111F0A3CD5DC9075D3CC5D9FDD0ABA157B08F10217708A8AB9BADB1D7B65D6668B20CB9447874089F3CA38399DC1E9A22280B0BA0CEC9826FDA15F8A45D812A37A794750D6F1F288BC3F994E11150346A8A82D070E499CD50EFDD89C09347A1341AA18CAB8FA029D3E1DBA2B5DB16BBF2F4D62240CF9703E863265F0CAD6B80263853F4C0D1832858F635CC17CF5B07088382A08D89876F7616545A0D144603406B224806502C5E2AE8A3A2A1896B80C2D878188343016F6F2829F4CDB738FEB838D282BB2EAC16329FB157126D61756DD742B745659E8EE2B6D06A34C83CFB1F14CBBE82FAC2395602B9890AE2EA233BF146F8356C8CD0C828048784C22FA018CEB53D8AA3323ACACD2B05368DBD14C761B3BD268BF770249788BED87F6D28768710B8597488566B0B0B5515E4C32FE512FCAF24C33B2589C1D796A86D680B342F154CDEDE30F8F94395970B75A135EC4F41BBA64F7F12BE2DDBD4494813A03F940BE821750CD066B309FAD3A790FFF90258922E3BECDAA6804006E482468DA189AD0FB38F759121DBBA16148BCCA22D7C6D6E0B1ADCB3F9908BFDA4D5B1C890C39BF1C00CD65D5334C8A6493A5F7F0AD5B1C3CC6991DBA00932FBDE8EA0E87A088F8C42504828DBED9B74AF5571D01ED226D23544C8F5C736D3B5C560170F38DAE2AFAD96365BF0C968648B3BF9A52621E0E279F85F3A072FDA12CCC17D31483FFC147CEAA0254D805E2807D0478DBE182C13D045855A68B43A0FE94E55AB067542BFF42468BFFA1896CB763B5153589005285478411B1C0A4D7C431451F85B58048B2AA019792A6F8AB690FA90A5037BC5F1C8CC8F4C33B468D69E6BA7D5AAD52A0405FAFDBFBDF3008FA2DAE2F83F7D534880449A020A22F60E4840408AA4808A58F0292A3E8C140141A58874E9080822D828FA0011450445514A22A0204BB161C702811084501292EC6E92F79DBBDC65B26C92BBB39BD9C97BE77E5F3ED89DB97377FE77E63767CE3DE75E9F5EEDC952CACBA3398BEDFA44F4732DEA13B2CE4E934F7FDD2A847F63C591FA8D70AA5922626A26208E6EE4D8589121E94CC0A9E8D6F7F30F0460890847748CF92621A2688DDCBC7C918DE9CFA28535BD5DCA19FACE0D389E7587882CC773F388D01C2334D748C4F1A388CA3A8CC8CCBF6039FE0FA2838A11EEA1DB82292AE4FE47E1A8DF182567EF177F9E8751C70A090E465434196ACE85822B2A04E8F95B147CD0DF7B01E8F90B5663F7DE5F2B6ADBBCDB4B4A105662478FFC9FD0B8F8142CCE99114A95ACA2106CB35BB0BF3802A783C2702A380245C10485B0B3E9D261622E5EE79F73404F264C0867C5390772A5E8D0A07E2D0C7AF21EC4C645EB3EFEB17F4EE2B537D762FF1F87751FC3AF15455C6F311CB6025C6ACB46883D1FDF144522343C122111D10809A389F94344B243A0D292AFBBB6319EEC77B75F4FDB1F07FBF6DBDFB1EC9D0D3876FC5C04913F8E5BFA189423E09C42C439F993336780FA4C84F8151789BFE2624A8EB10BAB3BB8D88ED8E242C4C2817A4185681B968F8B424A4FCA46C7B321083F86D4C0A7E117232784E658A1368C7F00FBAA595C6C34BA776B83962DAF563A14017A812AA0EFBC522D5125ADEF74444706E186ABAA66880C5D5821B602D4CF3B826A79271173261FE1793658F21D08B39DCBAC729400C7118AC325E13858AD06F29BD4454854C4D9013D9A45CD99C156FA35BBF22FAA5FFEB023FB583126BF9086F8F838A50BC1D34E070E6663C2C425A8573B048DEA53E240E08B00344D689F9F87429B4DACE8425993A194DA7E16CE81FA955FED29142EAC97660E0CD44F28B3DD0D9BAC7877E5665CD3340C71D58C9A40EA9C61730ED6CE5C0211DE576043C48F99B830EF24EAA21009410E846A6E0F7B6810F2A3C2608B0E437E4C148E45554776543C0A23AAE6245879F925D8F3830D5D5313D1B54B2BA56B8400FDEA56450BFA0E45403FD1773AEAD50AC1E07F3B97E1A94AC519C85F8282FC429C3A91879339A75178E20C824F1620F474212CB93644E6D91193E780E58C1D4167AFC1E2F82814F5B809A1B5AA39012DE07CEECC8DF485AEF8280FD6EF6C98E42BA00F64E385494BD0FAE608DCD9292AE0DDE87C9DA68845070A0B9C596F1476181E118AD050E703D1489DDD051935F3048282C331DB8480DEB8D18A77DFDB8C86E9E67E00001894494441543EFF8A41E3866AAFD7FEECF052EB38163B23721C874F2274F92E716F099B3B0828B484222F260C6762C2504070AE168E92B84884D78C415C8D18C4C5452322325C844D06B2AFF5689379C481D90B4FA38B97807E4D05D0DF392CE8AA08E8BEFF0380B6DB1CC8CF2F407E5E210AF269E219FAA3D84F3B82CFD81156E84044810331A76C88CE73A0A44E2C42DA5C0A4B02A56007F6E291807EC147401F3C908D892602B4B889CF3E4045F85709101C1C24FE020D67FA6D12D0334D08E84D1BAD581940406B812616277014A3202717451B7F4648E649E4C685233736028591A1B05B425014158E104B1822C2C3106E0983253202515116444653D62C256605F661EC0BA0535313D145D1822EB03BF0BA0AA0BFF502D0FDAA38A0497CB2A2C50ACD8E22D8ED34E94C110A690E8342BBB0DE68E0ACC85E04388A10161484A8B868C4D58A4374B5489735A7A713FD5147027A828F803E70201B934D0868A911DDE8668A7891807ED1A4807ECF4480A6FB8906A04F669D405E4E2EECF4B619162CDE88222268D2AF3084478489C1B4F070E71B122D18E15C34422E1251F9EE427FDC8FF218D2822640A72A029A5C1C6F2A01DA6E4117450BBA7FBFAAEBE2D07608419ACCB44F567F89C399FFE0A1B414016CBAB808D0B6429AC7C019D369B1842326360A9648CAF80BEC1A7812D0E327F8E683260B7AF264F3B838CABA59A86F263DB70873973CEBCFFBC9EB634940CF78D17C3EE84D9BAC78DF4480A6689282021B724F9E41C1D9882FB110B18073A8B09245886AA8762A5C67975435D7863BA05308D0A9EA3EE885DB147CD0DFD82D485504F4804A06F4BB6F6DC0E2F96B111DED0C679AB3E419D4BD30017BBEFE19C3FBBF5C2A72416EA3FDD67DB00D2F4F7BF7BC7A15DD89542F2BF3181EEDD75500BB5864173AE7DFA50B8D404E6E0DBAB008CEDA550F2A3A76656C97801E37210D357D1824CC3C908D293A004DC0ECD9750C6AD4AC264E6FE088FBD1B2EDB5429B76D73C810B6AD7709D76EF4177A1437233B14D3C045347A16682736053BBAD3C9DCC06E869260474BAC9002DDD1CE44A74D00AE6414102C602CAAEF0D3B3095A5578922FED752B2DE8E4D444A428029A5C1C8B54019D72855A14C7C0FE956B4113A0A9DCF77047F1EFAD573E8E2DFB5E1780DEB2710F068EE8E1D265C023D3D16748775C755D2301E8DCD3F9E7D52BEFE63F7DEA8CB0A063AA4522A59BF3A9F7CDAE5FE0B0533C69096AC4C7A2C125755C3E50BA9608DADFEDFEADD4619B5ED550C43F1A5124A0C712A06BEA8FE2C83C988DA93A013D67F20A4C7EB9BF385DEA83E726F5120FD17B3B0EC7CA0D535C32BCFED26A5C7E7543DCDAE1060168AD253CE2C97902EE54AFBC427D4E7D2FFB7DFFAF993899E3CC44A3D764EA7BF7F2EDAE5F4BC504D7B930BEC2762AEA3B69414F9D613E0B3A7DB315AB4C6241938E72C057C651D377EEF3CA54554BB9ACEBC405E8944424AB02DAE1C0621540EFB55BA00AE8412602348925A1A007D074E313A00930543E5BBB1D5347BF853BEF6B233E47464508EB9020202FA8158B3FC391C3C7C5F61FBED92F1217464C7CB494E558D1CDEECB7609E831E37DB4A00F66635A25035ADB3F7A01AD85FEDE9D3F63D60BCBD1B8E945A85E23465864D437ED3ADFE49294FAF0E77D7F8BD8DCEC2339F8F3F7C31830F43EB4B8552D36B5ACBE91809E6246406FB2E283F70317C5519666DAE88EFF3520BB9FB30474923780B63BB0E44B0517C71EBB05C98A16F4600301BDF895B578F3E535655AD065017AD9C2F5983FE33D51AFBCE20EE85E778F47FBA49BD1332D455413EE8F43C7F058FF3B5C87496E31109FEC98233E2F9CB70675EAC5BBAC6F5FC0AB5A57027A941F003DC347407FB16137664F5C8E79FF19E6D1822E0BD0546FDEF4F7307BE1900A2D5B2DA0E74C7E0794C94A6F4DD56B563BCF2AA7F6A80FE72C7E06D562A384E5AD7D00AB6AEC693F023482C331D98480CED864C56A1302DA17BDAB5A5D09E8CE29894852B5A0ED0EBCAD0AE82445400F3100D01FBFBF15F5EA5F809D5FEEC398E9BDC52BB22717873BA0572CFE5CD4A37D474EEE25EA51D9B5FD2711FBDCEAB6EB4AF5BB27405F50ABBA184DA6927DF8385AB5BFCE94807EDE0F807E5127A0FB3E3005575C7B09C8DD90D22D11F73FD249844AB9BB38DC01FDF8BD1371CD8D978A7AF4207CA44FAAA847EE0E59BA746F5DAA9FDC01FDFDDEFD88BFC0E9DA292CA089E71DA506102B1BD0934C08E82F18D001E7B916D09DBD00F47F5400BDDB6E41D2E56A3EE8A79FAC7C1FF43F4772D0A94B0B217A932B1A887F5500FDE76F87CEABF7D3F77F62E4A0F90222D2AF2D7BD313A09F1AF900A2A29CCBD253A1412D0904FADCF6EA3434BAEC22B1EDD60ED7E39E073B20B6BAFE946B6FAF2C69418F1CE7BB8B63E614EFA338C8553179E4620C18769FF8E91736A8E5F2BF5704E8514F2DC0B0F10F8B7A752F4A404C356782CCAF3F3AE743F9FCA31D48A85DA3543FB903BA76BD78DCD8BCA94BB6C8280B2E6A58CBF599004D83BC34A776C34BEAA0EFD3DD41757C2DD2829E38DD7C3EE82F365BF1215BD0BE76B14FF525A06F4F4944E714B5280E1A245CFA95828B8300DD5911D0CF18006852CA134CDD0709E50022EDEFEE83D6AA5DD6364F80FEEDA703E7B946C8C27BAC7F57F1B0D0BA38DC7BB4BC6D3EF5BEA6B204F4737E00F42C9D80D60E126ACFCB1DD0DA814095680CF701623AB63BA057BEBD110BDF1FE57A70BBF7BDD68276D7BCBC6D15F58F04F40B2605F41A0674455D58A9DBB580BEDD0B402F5301F42EBB05B73755B3A0870EA85C0BFAE3555B8590A977B72E25280DC88D7DFAB552DF692306D2D7EF425E5EFE79F5CA83371DF3930FB6E18921DD85CF92CAA3778D455EAE333D5500E2E18EF8F3F743B8AF67475C7C693DF17A3EACEF5CD7F6071F4F466AB756220C8FEA2E5E3DB6522F0409E811E3D250C387288E4399D998AD03D0D95939220C72E838A725EC0E68EDE767C7F544F3565789AFA8DE2BD35762EC8B69E7D573388AF055C6B7F8FDE783CE70474D79A2C7244C9ADBDFF516336DCC5BD8B96D9F6B0F314878FB4DAEBEFF27FB0486F49E85FC33CE19175BB4BECAD5BFCF3EF192685FCF8C7412D0E3A799CF82DE9A6E4520009D73EC94087D3DFECF29D44C882DD54F957A1398F0E012D09D9213D14911D0850E07962B01DA664127450B7A582503DADFDA5328DDD2373E11376CAFFE5D51BD86337E57164F0381E5FD06772B9942C7EEEDD9A19445E7EF73D01E4F027AF8D834D4F0210EFAD0C16CBC34D57B1747659CDB86755F63E91B9F62E0F0FB85CBA4569D73B1D42A96B7F637B95BC9DEF66F59E727013DCE8C80DE6CC5DA55C646711CFC2B1BEF2C5A8F5EFDEF100FCF63474F8AFB8CC22169DBD123392E296F68DE14741FCAF048DA264353698A857DDFEC2F25BBDC46061485B9D25BADBC2EC865291FBE141E2B5DA0DAF04BD91ED5A37249937AE7DDF7FEBE8E25A03B7A0368BB03EF6C57707158BD00F4F02A06E8BFF61F16373F95EE0FB547D32B1BFA04E8A9A39688812E59FEFE230BDD7AB4F38B9F53E5A291801EE623A00F9B08D0F49093A5636A7397D54DDF790BE837E67E88DA756B9E5DA710C2BA6BD8A88E6BC05845634FFB48408F3529A03F3218D0145143209403F152331A079A33658548F4AA5D375E44D14C98D5474C86F4F66BEB70C5359708781384BB3FD81EAB5764B800BDEFBB3F109F108BE726F612F75397C4C178B84FAA00345D1714563969E4225C7BE3A5221B91004D6F4F140EFBD9DA1D3879C2191F4FE3481FBDBF55D42BEBBED77B1D94554F0BE88E8A1634F9A0DF55057447450B7A44150374451D411714CD1BE029E1C1535D4A035FFD4E866B53F3C42B85EBC3A822013DD40F809E63120BBA3CEDF272F3854B431BEB5C91D6ABDF4987CDE64CD3BFB871DD52C0AFA86E59DB25A0C79810D0DB365B611640D338C2DE9DBFA0FFB3F708AB973EAF7C6B83C835A090594A4EBAEC8A06221C72D1AAD1E78D3168A19FD27210868E7DD8D5F734A651BF612D91854AF378C831244A446A72797DD7C3C2DB87BADE6B425B4F02BA437222BC01F44A1540EFB459D051D107FDDCC0CAF541FB43ACFFE56348403F4B80F6C1074D16F4DC69E670715485FE92801E3DD57C3EE86DE9567C6C120BBAAC815E02B476905F05D09E069DE9812DC710C862BEA8412D3CD83B091F2C4F170964A3A7F51613FE7FBA663B766CF91E1D529AA1634AF34ABFC4B480EE90AC1EC5F1DE0E05170701BA8322A04732A02BBDB3CB6B4002FA9931BEF9A009D02F33A095FB52027A944901BDAE8A02FAB6EBFAE0E2C6CE37D04EA9CD71C77D6D5CE1979E004DAE8E0617D776F51BAD2A44EE904307FF41DEE93398396119E62F1B2E129A32FFCEC6964D7B71FDCD97E1C616972BF7B59E1D25A0DB2727C21B40BFAF02E8AFBD00F4F30C683DFDE7B73A12D04FFB01D0F318D0CAFD2201FDBC0901FD65BA1546039A9284268E58245C1904C823878EE1C509CB7073CB2BF0EAAC559830BB0F12DB5E2BC25229DEBD2C0BBA7B876158FCC118D10F1116E714A4B27802F4AEED3F62D5E6692E88BB77A0FB203E65FB6ADD1FCA1DEEE58E5A40B7F7C2825EA502E81D8516DCA668418F1914581707AD8442E174B2D0C08176D4DF4B5D3DEEEE29E142EE6844ACB38A053D78741AAAFB10C59175301BF3A7FBD7C541A174B22F643FD1EC76349B1D85D2D1E010CD52E89ED823B7D179934544AFB0142E4759829E2653D26EA32880FC3305E78DD297D7877AAE1109E81153CCE7E2D89E6EC5271F181BC52135ECF7D0541CCDCAC105756AE095FF0C135FD3140D1FAFDAE69299C261292263E7B61F5C619414F238FDD541E27B6DF82CF997DB77BE5984ADD2B1E531E5C1A81ECDAF220B0D1252DBE4E7166DAF1E23C264FB3F34557CA63059F79C0A3DFD5F511D09E8764989B84D11D0857607567FADE0E22040B75304F4D800039A468FAD5FFD284685A9D0D35926915424A2EAF6AA00E8A7FC00E8057E06F49D6D9EC6AC3787A051930B21FB893E5318160DDCDCD769840849D4CE48487D42BE49E9BB6CD1FA6A74B9A73506FF7B961885F7349F0AF92FE5B6B2E6DBA82C400F3729A03F0D10A055EFA9B2F6F36425FBFB7EF6F537AAD4D702BA9D1780FE5005D0DB0B2D68AB08E8F12600B476A4F744CE69BCB5E063116E73ED4D4DC4BC1BF44AB375F35EB18C0E8DFE535CE6B7BBCFAD44DE29B585784253ECE68EADDFBBF46F7DDBF5C2BAD35E349486FCEBD9701DAA3773C252D196AFB3A3A974BAA77DA48B63A01F00FD9A9F01FDFC53F3C572474F3CD54D845A757BA09D6B647DF9A2F57865FA7B689678A5887796912F14A7FCC7AF87D07FE8BDE27429DDBB41A33A98F2FC12D18FF49AAC8DE0A0FEA5C996562DDBEC9A44CBD3844833C6BE2DDAF6573F91055D121C8E612604F48E742BD6575140533F5DA9993296AE857B1E6A6F58D8AADEFBD0BD9E0474DBA444B4F502D06B5500FD9517809E60324093505A2B8A42712896B2E60571C2BAA6F932283599C2E32894EEC3151948BE2B110FF64EC6DC292B047C699F8DEB76E286669761C0881E6262797A2D2338D320832C54C75668C77303E6056C850F09E8017E00F4EB7E063459C9CFA4BD040A7BA242206ED8A8AEF83FB986E875935E69C94A769FEFDBFD82F734CA4FFBC8B4FBC7BA4F2817D0FE0EB592801E6A52407F5645014D092C2BDF76BA27A8D0020FF29AF1173C8D388E04741B2F01FD910AA0BF2CB4A08DA2053DB10A00FAFA669789C99124BC656A32C565EEDEF11386F59B8BB7D68C1329DB23A73C269257F67DEBF485BDF9FE683C76F77801684F596874419901D0FD7D04F49183D978C3CF80A61903972CF858A4C3CBAC407973C8B792B21664280BD0EBD76EC7DFFBB3F0F8A0BB44F201B59174674B24B7181410403F6342407F9D6EC5E75514D046C0D3883624A06F4D4A441B2F2CE875AA80BE5511D093AA00A0B53E2C4F3E4AB2E616AE1A7DDE5A77324D58029A06BADE5BBA115B36EEC5B817D344DAA95900DDCF0F807ED3CF80A6C13B5A458532F7126A55C7ED5D6F11F706E99A4B96D28629C2D7BC7CE17A8C9AFA6F11FAA49DF04A7B23490B5A6B096BB3D7B42BED787271549605FDB44901BD81016D0487CB6C430BE85BBD00F4272A80DE566841EBCBD4264B9AF25460A3383CA598BABB38FC0568EA0D8A1220B7C6D03E7330FDD581B46CA1292CE8BEA3D310E743A2CA91CC6C2CF233A0098AE44EA231026DA815C19456D4888EB1880C3FD273D2DC7EC247AC02E80792468A745E5A717DDCCCB452F5CA1A24AC2C400F9E6CBE288E9D19566C64409B02D0AD9312D13A492D5185A238D6EF5488E2D85A68412B45404F3301A02FBFFA62B11415150ADD5A307315A6CD1F203E6BA706A5CFB43EDD90C7678BC9E1EFEAD10E4FF69C26328E96AC1E839E778C1193C30F19F520260C7D037BADBF8818CB5EDD9C2E0E5AF4925627A6623640F7199D86581F009D9D998DC57E0434BD59C8370FD28B1EA4B29F526E71BA236491DB28E98016E17DF88E316255162A8BE77F849B6EB95C58E2940A2CDD54031F9D8101C3EFF7B856E59A955F883E9485E668A09570FCB91AB8F4410F3221A0AD19566C62409B02D0AD9212D14A11D036BB039FA9007A4BA105898A809E116040D3725634D22F4BC20571229E52161AF8BBF3FEB6C21D21CBD64D7BC53C00B2CC7B7BA898649E66C6A2350865916E0C19A3A9AD27B77DB7E737AC5BB50DC3263C12900B420E12A6F901D06FF911D0E492D0F6857B3F49D8926872DBF40503852B845C23CFF6712E23F640AFDB856B64CC9057316EE613E23BD94F721B7D275D20EE7D48DBA87F694C81067EFDD54F12D0034C08E85D19566C664007E47E948D4A174762522212BD00F4065540DFD244CDC5317370605D1C01ED85B3D108724DC240FC1609E8DEA37CB3A08F6666E3ED19FE4D5409841E65B5591971D02541E1E86F4240EFCEB0227D75601255CCD4E781FC2D12D02D3B27A2A52AA01D0E6C5201F4170516DCA26841CF6240BB168D0DC4052101FDD828DF7CD0E4E258CA8056EE4261410785A39F49019DC18056EECBCAD85102FA162F004D3EE874AB820F3AA3C082168A807E69F074445A827055937339F39571C2663DE6E71FEF0025AC04AAFC71D0816339C5E8E5070B7AD98C25A8151F8C06F54203753A95D66EFA67BB444291BFCA9E1F6C08098F405F13027A4F86155FACDE8CA68D42512D3AD85FA7CCC7F1428133F925D8F79B1D2D3A27E216550BDAEE40860AA0D30B2C68AEE8E2583A6D218E671DF3E2A7F3AEFE562022D2827F3DFB0862AAC7EA3E744EF631AC5EB012B9274EEB3EC6FF5BC5EA0935D0F3B9DEA63BED9FAC3F20E3838DB0E53B97F9E2121805424243D132B9356EB8AD99D20FB0391CD8A20AE8668A80B615DA50525CACF40378A7CA522008E1967011BAA6B7501FDA6D769450DC2017250582828285EE662B458E2238ECB44001F76560FB2608A161212050AB148AE2D8BA4BC1C5B1B9C0829B1401ADD230EFC30AB002AC002B50BE02345BE3972A80DE4480BE542D8A834567055801568015F05D0172716CAF08D0E9FB0F634D4E092EA95BCBF716F908AC002BC00AB0024A0A388A8A91F9D79F187FE345888F8F47585898CB6D1954545454929B9B8B1F0E1CC6C63FB270A6A000C5EC5B561296776205580156C0570508C80D6AC6A16BD3FAA859B3E6F980CECFCFC7D1A3479195958553A74E89A5D279D0C857D9B93E2BC00AB002E52B4003FC91919148484840DDBA75111B1B8BD0D0D073167471717189DD6E475E5E9E8073015BD07C4DB102AC002B6098026441C7C4C408385B2C1601671999154480266BD9E170883F726FB0F56C58DF7043AC002BF07FAC80043159CDF4476BAB6AC366F507D0FE1F8BCAA7CE0AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0AFC1776FEC638DDA41D8D0000000049454E44AE426082 where `app_id` = '5';
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EED9D079855C5F987BFA54957AA882E282088051535D244EC0876A3222A2AC1462C11A3F2370A0AA8281883062504BB066C815829828A801A4540015B0451A42ABDB848F93FBF91B3DE7B97652B7BCFCCBEF33CFBECEEBDE7CC7CF37E737E3367CECC77328C040108400002B12490114BAB300A02108000040C81A61140000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C6641000210C8D8B871E33630400002108040FC08646CDBB6ADD408F4EAD5ABAD4C9932F1F3021641000210D801815225D04B962CB12A55AAD010200001087841A05409F40F3FFC60D5AB57F7C23118090108400081A60D40000210882901043AA68EC12C084000024902FDD4B41FECE5E94B774AA5FF59FBDBA199D5BC24C71487976EC36808945A024902FDE0846FEDB559CB770AA3EF194DAC7DD31A5E0243A0BD741B4643A0D412608AA3D4BA9E8A43000271279024D0CFBCBFC89EFF68719E531C8737F073250423E8B83747EC83000412092409F490B716D82B3397ED94D05D6736B176FB33C5413382000420B0AB0930C5B1AB09933F0420008142124812E827A7FE602F7EBC64A759DD7966133B6ADFDD0B595C7A4F638A23BDFC291D021028188124817E78E2773666C6CE97D9F53BAB89B56DC21447C1307334042000818213608AA3E0CC3803021080408910C816E8A5ABB7D9C4CFCD14DA2EA420D1671E9E615576FB9525531C25D2A628040210282602D9023DFA13B38F977F61AD1BD6B41E2FCDB46F7B9F6815CBF91F9AF38BC56607EC854017537B211B0840A004092409F46D6FBF6DB37B75B0F7E6AF70E2DCAAC16F73CD0FCD5A6D0BD6FE6255CB97B116B52AD8B94DAA5AB709CBECE993EADAFC35BF58BDCAE5EC9C3796D898CEF56CF20F1BEDB87D2AD947CBB2AC56C5B2A688D3B52A95B1B92B3659FBFA954AB07A66087489E2A6300840A018092409F4F1076EB6BAFDC759A5F2656DD59D1D938A397FEC12CBAC5A2E49A02F1CBBD44676DC3349A05BD4AE60F7B5A965D316FF6C99D5CAD9F8051B6CE2C28DF6E3CF5BAC41B57236E2F8BAC5687EDE5921D07933E2080840209E049204FAEC96664F4DFFDE2E3D223387B50BD76DB6BA95CBDAC08F57DA21B52A58AF293FD9ECAE0DAC4AF90C27D07B552967E7BFB9C4469C50D75ABFB0D06675CDB455595B6DC2771BECED1F7EB6EE0756B36BDF596EB32F6A50A22410E812C54D611080403112C821D0C598772CB242A063E1068C8000040A41205BA0376C321BF34978AF273CEFA80C2B5FF65732ACE228440BE1140840206D0458079D36F4140C01084060E70410685A48A924F0B7BFFDCD264F9E6C071E78A0DD7CF3CDB6FBEEC51FBE60CB962D76DE79E7D9BFFFFDEF9D32D6CB8C7BF6EC99744C6EE75C73CD3576EFBDF7DA1E7BECB1C33C478F1E6D679F7DB6FBEEA1871EB2F6EDDBDB61871D56641F47BC0E3AE820EBDDBB77915FBE7CE9A597DA3FFFF94FAB50A142A16D7BE38D371C87366DDA14288F49932659870E1DAC4C99F82F2346A00BE45A0E0E81409F3E7DAC65CB9676D65967D9BA75EB6CFAF4E976ECB1C7167BD50A22D02FBFFCB2FDF18F7FCCD38665CB96599D3A752C2363C7DBC9CE39E79CEC0E61EDDAB556B162452B5FBE7C9EF9EEEC80FBEFBFDF0E3FFC703BE9A4934C79CE9831C3097F51D2A2458BAC7EFDFA45C9C20A2BD037DD74930D1C38B0C85C8A647C3E4F46A0F3098AC3C22170C71D77B851D7A9A79E9A542909EAC5175FEC8443CF2B9E7BEE392B5BB6AC1BDDEA77B972E56CF3E6CDF6F0C30FDBFAF5EBEDAEBBEE7202DFAA552BEBD6AD9BFDE52F7F7102B66DDB36AB51A386F5EDDBD78DA03552DBBA75AB13CB7FFDEB5F39406A04BD2381D6B923478E74E75F79E5953662C40827E283070F769FA9CC7DF6D9C724DACF3CF38C4978E6CF9F6FFBEDB79FDD77DF7DF6EAABAF5AD3A64D4DA3DECB2EBBCCD925FBAA54A9E28E57521DDF7BEF3D67DB01071C601D3B76B47DF7DD37C946E5D5BA75EB1CA22C5E5DBA74B1CCCC4CFBEEBBEFEC85175E70769D7BEEB956A95225AB5BB7AEF5E8D1C3A64D9BE67E2BA903515D2FB9E4127BEAA9A71CD7E1C387DBCC9933DD685A9DC9A04183ECDB6FBFB5FEFDFB5BF5EAD5DDDDCD9D77DE99835BA2402B5FD5F5ABAFBE72C7457720BD7AF572EC656BDBB66DEDC71F7FB42953A6381FAB8356C7F3873FFCC1715CBD7AB5FDE94F7FB2430E39C4EEB9E71EEBDCB9B3F3B1923AA9264D9AB8BF2FBAE8225737B50171555B12C70F3EF8C0B50F7D76F4D147DBFFFEF73FBBFBEEBB5D5B58BC78B1F3654113025D50621C1F0481010306D8279F7CE244FA8A2BAE7075BAFAEAAB9DF84A2474B10E1B36CC6EBDF5D6A4FA5E78E185EE62DCB871A31364DDFA2B49602444895315A9236809EA934F3E99E3D65A02AD119DC44249827AE491473AE1FDEB5FFF6AFA5E2226018B047ADCB8714E647EF7BBDF25D9973882D6744724D0BFFFFDEFEDC5175F74236FD557222FE1934D4F3FFDB4CBE3EF7FFFBB9D76DA6939045ADF492C35724EE475DD75D7D99021435C7D366DDA6462DAAF5F3F27D012612589A3044DE2A4CE4CE22BD1534728811647899FCE4B4C3A479CA34EA45DBB76D6B061C3A46352055A9D9F3A9A7FFCE31F6E0AA359B366AE43489D2EDAD9085A763DFBECB34EA035FD251157DD24DC8F3CF288ABA33A4EE51D2509F5D0A143ED965B6EC916707580127E7D5EB972E5425F330874A1D171620804341FA90B5BA3535DCCA973BB8F3FFEB89BA3D6A8F3DA6BAF35895224D0121A898B92845DA3494D3F442955A06FB8E1062750A9F3AEB98DA0958FA663F6DA6B2FD3DCB35224D01AA15E70C1056E54DCBD7B7737F255CA4DA0BB76ED9A3D7A57672091AE55AB961B753FF0C003EEDC51A346B9BB81D41174A29F5F7FFD75577F3153F9E2122509B538260AB4BE133795A10E43234B8DF023811E3F7EBCEB104F3CF1C4A4E6A40E45A367A568547AFCF1C7EF54A0D529A8037AE79D77DCB99AC67AEDB5D74C3EDC73CF3D9DC0EAFB4481163FD5435C0F3DF450676B24D09A27DF7BEFBD5D99E2A539F3D4BAE93BDD81A8038DA6927497F2C4134FB8CEE2FCF3CF7777130F3EF8A01B7517342509F48A152B0A7A7EEC8FAF59B366B68D2CB38BBDBB4AC4405D94D11CAEFED645A751D68E2E3E19A4D153345296D0E902D6C82F51A0256E8D1B37B6A38E3AAAD8047AE5CA95EE81E082050B5C99128044818E0A927D9AB691E01654A0AFBAEA2A37E25492A81C77DC7139043A91978E8B38258EBE131D97CA517717CB972F777724D1C83A12E82FBFFCD23EFCF043BBFCF2CB937CAF291189FDCE52EA087A47021D9DAFBB113DDC9458270AB446BAA79C724AB678268EA07724D0EA841F7BECB1A48E4953195F7FFD758E29B344DB773492CF4F6367049D1F4A1C1314014D4348A0759BFAE9A79F5A8B162DECFAEBAF3789C5983163DCADAAA62B340570F0C107BB51902EE4F7DF7FDF4D03E86FDDBA270AB4FED7ADAF4445F3AABAF5BFEDB6DB925671147404AD919D845923F11B6FBCD11E7DF4D16C81D6A84DA3448D4835BAD3E850237309811E786A24F8CA2BAF644F71E43682D67CA9EE10347DA0FAA803481D41EB7B7548E2356BD62C97A718CD9933C79521E19B3A75AABBFB10AF548196C06B6AA8418306D9771C91408B95F86A84A9C194F8AA3CB1D31CB0E67755374D3FE9D8C49497406BCA481DAB58687A46D342EAC8F46C60B7DD76B34E9D3AB9ECD4396B8E5BD31AB367CF767712FA7B4702BD66CD1AD3BCB63A1BCD93FFF4D34FCE07AA836C974F7497A472C4453C357216FFA8732AC8C58440178416C7064340A2118D0C135744E4F6B90458B7F089A3C9E8B34428FA4C295AC29578CC8E8E8FCE8DCE8BFE8F1E2CA6E69398C78E6C8D3E8B6C557EAA5FEA798975D677FAFFF9E79FCF758AA320BC72E3A232A272538F49E526BB732B3362A4EF73AB5FF4799447A24FF4775467D993CA2CFA2C9551E2B2BCC4F3537D987A5C6AD905B9887208B4EA9CCB0A9E82E41BCB6399E288A55B302A8D04BEFFFE7BB70A4349A358CD67EF8A35E169ACA2D74527BFD57BCA3CFB79F3561BF4EE37B6E8F693AC42D9F82FE42E087D04BA20B438B63410D0148FE6A0B50C4C73CA5AB5408A0F812481DEEFBEB76CDEAD27DADC656B6DF9BA4DD6A151AD6C4B35EFA6B58BBA1DF8F9E79FDD7C979EAEEAC185FED71A51CD95699E48437CFDAF792B3DDD3EF3CC33DDFCD5860D1BDC13CDE8964BE72B1F2D458916E9EB182D4BC9CACA72652B1FDD4E285F7DA627A32A4FF9143421D00525C6F11080403A092409F4B275599679EF5B6EE4BCB65FF222FEFFFEF7BF6ECDA5567AE81648B743BA356AD4A8917B70102D44D7F21BED12FAF39FFFEC045A02ABA7B4126309ADD66E6A82FEDD77DF75EB0CA3759C9AFF6ADEBCB95B485EAF5E3DB714470F1E162E5CE8167A6B725E1D8496BAA84CED642AE80E29043A9D4D8DB22100818212C831073D78F2377663BB4656B64CF256D28F3EFAC8B4665473547ADAAADD387AEABDFFFEFBDBAA55ABDCAD919E324BBCAB55AB66679C7186136889A8D6251E73CC316ED1BD9ED06A6792D639EA69B046D37A1A3B77EE5CF7A45A4F40F53B9A84D712966FBEF9C68DC0C78E1DEB9E866A81BBF2296842A00B4A8CE321008174126015473AE95336042000819D1040A0691E10800004624A00818EA963300B021080409240EB619E7611E9815ED5AA55DDAA0B45A8D2CE2B45ABD2C339C50DD04A0AFDE8819EE20468894EB49632CE4813E7A065BB7E14C12BAE49DB47B5C32BBF3173B5253835A04C71D74DCF066457F4FC20357FADB4D143E01DA52FBEF8C27D9C177305A7513E7A9641824069269043A015C54B1787045A1788566868CBA9B6BE2ACA96B636EA619DF6FD2B5A93A27D69F585B66E6AC5469C53A2402B8297D67D6A758A02A2E83BD5574B04B536F484134EB037DF7CD33DEC548018EDC157D272430544D777A79F7EBAE3A3285D8A68250E7A98AACF274C98E0E232A8E3D203506D1356795A8AA82DA75A7AA80032DA22AA73B42A45DCF5E0554161B49450F10B74BEECD183586DADD5F2426DCFD59662F1D7AA16D9A6F2E4336D6955D017C517506C051DA380318A52A687B68A68A6E3B5ED542124D5E1469D5594AF1E048B83DA42547785AE94CDEAC4552F7D2F16DAD6AB108FB25D11D8548602E8285E81F251EC03D910EDCA52E7AFB6A4B815F3E6CD73211915874151DEB41D58E2AE87C962A8F08DF2C3C71F7FEC98C8663DA056601D715084340D22947F648B56FE6820A1BCB5C5560F97359810BFDC82DCC7B9CD625BE926B04381D6084617A72E420984566A684FBB02AB68B99B0446610725D4DAAFAE2577DABB1EF7942AD08A9DA00B5D9F6B59A04687AAAF56986894A7D082123D8D18A3D0870A5EA33B0A45175327A52581BA8B9050EB78E5276E123EDD7D28908D045AE22D6E1268C54A50BE1220899AA25F291E80BED77A6F2D558CB69B6A1DB946C5B251DFC907EA10140B41211915E376E9D2A556BB766D17E74002267193684ABC155652F629C9A75A65235BF5B7444CC2AAF8B75AF2A8E03CB7DF7EBBF3E9C9279FECCE579C07896A62E72B51543D141FE188238E308582D49D978454E2AD7C159F409D85CA57A84A89A692F252A728A6EA84541FD9AFF8063A473131D41189AB96574AB83540500728C1958D8A4FA1A872126889BA56F928EA9B96668AAD6C136FD55BAB8DD4F12AB2596A2C87B8B757EC8340A99D837EFBEDB75DE42E2509A20276FFF2CB2FEE7F858CD4F240ADD5960068599F8443499D9136D548B0156C45AF4D9238456BC1B5D450EBB5D5C9693427B1D4765A8D5C25D61A792B088C924675FA91B84AACD5112A088EEE46D459A82C95AB7325E8DAC0A3602E2A5F1D66B4645122A7202D0AE7A8BC14B94B235B8DD015B92B8A0D106D02529017E529115647A20E401D93469A2A53C165F4B7C4508163947F9487EEA0C44382AA0D462A471D8C6C175309B6045165EB188D86B56C32124789A7363B296F754AB249DFAB23126BD92F5E1AEDAACE9A5A93C8EA0E409D8B3A27F9450CC54A62AF3A8ABBEE7634D2572C604DA768E9A78ED19D8882EE48F44910F08940A915E8743849C2A48D373ECCD7EF4A3E1A592BD29846DAD1C87A579647DE10F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B812481D6DB8D434B9A138D125BBD43F32EF58140D804184187ED5F6A070108784C0081F6D879980E0108844D2087406FD9BA2D4724BB501030C5118A27A907044A07812481EE39E633BBEC884CEB39FA539B78651BDBBDE26F3B03B53C4C6B59A34D0F05C1A3B5BE5A179CDB6BC7B55141AF454F4DDAD4A06DE4DA2451987253F343A00BE2358E850004D24D2049A05B0E996C1F5E7B8C8D9EB3D89AD6AE6A87D5AF9E6D9F3621684BB43674BCF5D65B6E1DAB767069E75C93264DDCAE3AED0C536C676D858E5E63AF0CB4A9429B34B449415B87B5414431A2B57B4DDB8CB541449B0824A0DAC1A7EDCEDAFAACA4E3B56B51C768A79A369068D384DE1E2C9BF45D7E13029D5F521C070108C481409240676DDE6AD5FBBE69D52A94B31FFB9E92649FC4308AB52031D63666C544D0AE31EDECD2E60BC53DE8D7AF9F7B8DBD624F68C79BB6DF2A69E7DAFCF9F3DD2E37ED4CD3CE33E5A11D631264C5F950BC05ED3E53D20EB448A0B56B4C82AF2DC5DA55A6D1B4768C699BF2C08103F3FD6615043A0E4D0E1B200081FC12C831073DEEABE5764AD33A39CED7565C05B2D1765C05C351901B05F151DC0AFDFEECB3CFDCD65AC54E50AC0A1DAF2DC31AED8E1933C68DB425E8C3860D7379286684A63624D08AE9A1EDD2DA82AC91B93A03C583508A5EB5A511B7B6F00E1F3EDC89BB5E95A500398A0791DF8440E79714C74100027120E0C52A0E6D9196786B34AED80C0D1A3428143B04BA50D8380902104813012F04BAB8D820D0C545927C20008192208040970465CA80000420500802087421A0710A0420008192209024D05A8D115A5200F72831C5119A77A90F04C226C0083A6CFF523B0840C0630208B4C7CEC3740840206C023904FAF365EBDC16EFFAD52B065773A638827369A12BA477362686A22D74469C586402DA613C69D2246BD5AA5591F30A2D8324813EFFB9E976EFA9CD6DC0C4AFECDE8ECDAD5EB5DD5C7DB50E596F6B563C0DBD2F4E2F19CD2D45AF338A2328043A8E5E29799BF47670BDC19C142F027AB72529994092401FF3E8549B70456B7BE4FDF9767AF37AB67FED2AD9476B37A0E26668B38876F4DD7DF7DDEEA5A3EAF524E07ABF5CE3C68DDD4E42357E8D50264E9CE8DE7EADB73A77EBD6CDBD9C349D09814E27FDF894ADB795472105E263159620D039DB4092402BD468D53E6F58A39A556C4EAF0E49474B7815284923E9050B16B8DF3D7AF4703137B4055CAB2514752E12E8112346B8A0491A711F76D8616E6BB8822AA53321D0E9A41F9FB211E8F4FA42033D4D6B282546B144A0F310687DFDE5F275D6AC4ED51C476A7A4391E4A2ADD653A74E75C18BF47AFBAD5BB7BAC8744AD3A64D73236AFD2F2197384BC4EBD4A9136B815610A7281CAA22E7A90E152A54C8C1418D28B7F94B71C8C8C870771AAA2F299E0410E8F4FA4561841F78E00177579D18461881CE8740EF0AD729EA9C46D9E94E3B1B417FF2C9272E509342A67EF4D1473674E8501B356A9475E9D2C545E8D38FEE10F4604902AC8EEACA2BAF74C7D4AE5DDBFAF4E9636BD6ACB19B6FBED956AF5EED824029ACEA8409135C1C6DDD3D2C5AB4C83A75EAE442A516477CEB74F3F4B57C043AFD9E9348EB7A4A4C08749A043AFDCDE1570B7626D01A358F1B37CECDAF2BEEB446FE125AFDADBB028535BDE79E7B5C4C6C8DB6155255E2AC39F6D1A347DBE0C1839D40EB2EE3F2CB2FB7962D5BDADCB973DD485A3FB366CD722155DBB66DEBEE3C24DAA4F41040A0D3C33DAF52116804DAAA57FFED25048938D6AD5B6755AB5635FDD6685F3DBC42A4469FAF5FBFDE854ED58FA63F3495A1E334E2D6D446E5CA95DDE74AFA4CC72969AE4DC7EA1889B7460D3A0E81CEEB72DD75DF23D0BB8E6D517246A011E85C05BA280D8B73FD228040C7D35F08741E02FDF9E79FC7D37345B0AA79F3E6D967B38AA30820033A15818EA733116846D08CA0E3796D96A8557A5D5AD7AE5D4BB44C0ACB9B00028D4023D0795F27A5E288993367DAA1871E5A2AEA1AF74AEA398D5651E93576A464023962716CDDB6CDCA646404C989298E20DD4AA520102C812481DEB465AB55EBF3A6952B9361EBFB774AAAF4800103AC7EFDFAD6BD7BF7A4CFB5A350EB86F5C66FAD6448779AB772832D5F97654767D6B08E8F7F6063BBFF168005814EB777281F021028088124815E9BB5D9F61F34C9BAB5CCB4FB3BFDF6704D19EA4DDB999999F6D34F3F3941AE56AD9A7BBBB7DEE67DDE79E7B92D9B5AEF3B64C8103BEDB4D35C5C8E74A5E3864FB30FBF5F651B523A19043A5D1EA15C0840A030049204FADC673EB6D7BE58EAF259D0FBC4EC687691406B67DC871F7E68471F7DB4CD9933C7962C59628D1A35729B37B4A9A366CD9A367EFC78B79EF898638E298C3DBBF41C047A97E225730840A098092409F4D2B559D6E6D129B677F54AF6CE556DAC4CC254B476DA69A345F43BDA8CA10D17FAD1E60B4DF62B66876258A46EE32C66BB0B951D025D286C9C040108A489006F544913788A85000420901701043A2F427C0F010840204D0410E83481A75808400002791140A0F322C4F710800004D2442049A0B5842EB454AB56ADEC2AF1903034EF521F08844D801174D8FEA576108080C70410688F9D87E9108040D80410E8B0FD4BED2000018F092409F4DC656BADDDA3536DFDA62D967577E7A46AE98D20F3E6CDCB7EF16BF4A691E820C5924E8CBD9C2E265FFDB8DE662E5A6D671D54CF0E1BF2AECDED751C73D0E972468CCBCDEDC5BF313679A7A6E9FA9C346992DBE54B0A87409240EFF697D76DD59D1DEDFFC67E6EB316AFB1B7AF6C935DD3912347BAD7405D70C1056E3BB7760F2E5CB8D06DF1AE57AF9E6B18DA45F8EDB7DFDAF1C71FEF5E1795AE74F5E84F6DE4CC1F6CF55DA72699C043C27479245EE5BEFCF2CB76D96597C5CBA862B266D5AA55BC4EAD9858C6219B24819EB374AD1DF9F07BA690A3A923E80F3EF8C045B3D3BBF6147B63ECD8B1AE2128AEEED9679FEDEA2281D68B5157AC58E1E272C42D21D071F3487AEC09F98D2A08747ADAD4AE2A9539E85D45967C634B200481D69258DDD12A068EEE60A38440C7B6D915CA30047A3BB665CB9659DDBA757340D4DC5EF486EEC42F57AE5CE90247EDE89CC48B456F11E72DDE856A9BBBECA44481966F468D1A65CD9A35B3962D5BBA32A74D9B666DDAFC36BD976A885ECD3479F2646BDDBAF50EEF14259CB9050BD3F4E082050BAC478F1EEE6DEF854D0A4C3678F060EBD2A58B356CD810812E2CC8989F87406F77905EB973F8E187DB4D37DD6477DC71875D77DD75F6ECB3CF9A2EE68B2FBED8CD59F6EEDDDB1E7CF0417BFAE9A79DE8CE9A35CB5E7AE92517BD4FF3F11D3B76B42953A658BB76EDEC9C73CEB15EBD7A59DFBE7DDD05F9C4134FD825975C62F7DD779F2B51F9DE7AEBAD2EEFB66DDBC6BC9984655EEA085A7E79ECB1C7AC7FFFFEB6DF7EFBB90EB943870E56A3460D173AF79B6FBE7142AC51AB845CBE97303EFFFCF3EE554DEFBCF38EA983EFD3A78F55AC58D1962E5DEA62A32F5FBEDCBD624D0FD4D5564E3EF9640772F6ECD9A629C3134E38C11DDBA2450B77AC3A7DC55DBFF1C61BF3055C22AD69C6C4C4083A5FE8BC390881DEEE2A8D86C78D1BE72ECADAB56BBBF9F69E3D7BDAD0A143DDC525D11D346890B56FDFDE5AB5FAF52D2DFA5C6F94C9CACA7217982E565D987AD79D1E940E1C38D0162D5AE4E6E875BE8ED7C5AFEFDF7BEF3DF7D203AD7C89C39B68BC69B1C56068EA085A235EBD68425305F2D58B2FBEE844531DB646B9EBD7AF77A176F500BC69D3A6B661C306F7105C3E9460EB6F75C037DC70838D1831C2BA75EB961D9637BA03D36F897724D0071F7CB0EBA40F39E410F7807DC68C19EED98EF292A8173621D0852517CFF310E8ED7E89960DEA628C045331AFA38B4A17A5DE2023418E56A8E8C2D6C3D2CE9D3BDB6BAFBD66A79F7E7A763C6C65AB63A3F3D5014471B3A3DB5F95A9D1B77E482547202E73D01A317FF9E597D91D7E711040A08B83627CF240A0E3E30B2C2921027111E85D515D047A57504D5F9E0874FAD853729A0820D069024FB10526804017181927F84EE0D5575FB5AE5DBBFA5E8D1DDACF083A2CB72609F49AACCDF6F58FEB6DF3D66D7674E61E61D5D4CCD8A8129C4B0B5D216DB0D283C050921E424E9F3E9DADDEA138747B3D92047ACCDC2576EC7EB5ACDE80F1493B09B5AC68F1E2C5A6DE590F35F424FBEBAFBF764FB9B506533B07F5E4398E2F8A4DF417021D58EBA53A10089C40BE045A0C860F1FEE56253468D0C01A376EEC461FC3860DB3ABAFBE3A5BA0759C845B4BCEB4A44CAB21B49E54C22D01D78A06C54190A05F7FFDF5258E16812E71E4140801081481409240BFFAF952B7CCDFC7480000071A4944415408FFBCE7A6E788C53171E24427CE5A642F81D6FACD175E78C1054F8A46D0D10E2A6DF0D0C27EDD76299D71C6192E129ED608FFE73FFF71427FD5555715C1ECC29D8A40178E1B67410002E92190E321E1A62DBF8A6A85B2658A649176D669E386C4392E09818E8B27B0030210C80F015671E48712C740000210480301043A0DD02912021080407E0820D0F9A1C43110800004D24000814E03748A84000420901F0208747E28710C04200081341040A0D3009D2221000108E48700029D1F4A1C03010840200D0410E83440A74808400002F92180406FA7B4CFBD136DE32F5BF2C3AC588E295726C396DE7E52B1E44526108040980410E8ED7EADD56F7C897BF8F5CB8EB2560D6A9478B914080108F8410081CEA740972F9B61B7B46F6CF74F9E67BF6CDF0E5F5417BFD2ED486BBB6FCDA266C3F9108040A00410E87C0A7493DA556C5DD6665BB236CB9DD1B375436BD3A0862D58B5D1AAED56CE9AD4AA62F5AAEE66173D3FC3BA1F9969FBD6A8EC824EED2C21D0815E55540B02C5440081CEA74047BC1BD6A8640B566EB4DE1D1ADB8C456BAC53B3BA56AB72799BB36CAD8D9AB9D8F6D9A3A2CD5AB4C6F4F283BC12029D1721BE8740E9268040E753A035C571418BFA3672D622EBD2A2BE7DBA648DD5AE52C1366CDA6295CA97B5951B7FB1792B3658950A656DF9BA4DD6B1591D7BFD8B658CA04BF7F545ED2150240208743E05BA489473399911F4AEA04A9E10088700029D4681FEA0675BDBBF7695705A13358100048A950002BD1DE7D8AF96DBA52FCC742FCC2D8934E0E466764DAB86255114654000029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C05302199EDA8DD9108000048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089EC0FF036DA3CE30CB0602C40000000049454E44AE426082 WHERE `app_id` = '6';
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EECBD07985C57952DBC6EA8D039A8BBA556CE39675996836C30C1806D8CC3100C0C434E33FC93FE6F12330FFE37BC37A4218C8D033080C1D8B2B171002CE728DBB2AC9C73ABA33AA7AA9BFE6FED734FD555BB2575CB92BB35AA82B6BAAB6EDD7BEEB9E7ACB3CFDA6BEF6D60885EB13BB6073E4C78A601D83E0CCF80E9039E11C0924F4C38A605C08411F80810C0E04F60008105183E8C20800F1B811CE7C30ABAE103088C5878570E10F8308C52048103580E3F95FFCB8FC1D358300C1B3E7A6106162C1FF00D0F401C7E1043607A809196F3C5DD243C38F0631E0CDF542D32B21D18F7D2181D0FD0DCE3A0335688C0F0D91898B0E049CB72AF5C0FE47AE0BCEC814F4E8BCCF4B7EF0E86E4A2BC3DEB8E1D816F98080C8B180CD333041C5D9320EC0B180B780BC01134F93E60868818185E088E1602D84040E07541ACF67D82B70D83C7C04760E409221B410AA6C177D4790358847F04BE8FC0F678115881058FE00F0B084C48A39046E073E1C8938522301CB05582F37D007AC594B17863CF0174984918310B81C7EB5AF009D6B957AE07723D707EF6C00507D077ED0994B54B20B4607A81401E41CF277ED29C860F33A02D6DC0353CB19E2DDF80011FAEE9211073D704021BB012804760766897C33613083C176EE0C2B763E0B74CCF4310A441FBDA342C3866026EE0C13003048101C3A4B51E082E7391E0F9D4EF2E2C0B705C1B26AD737E66A8B6F605E825134661EBBE43E88C17CA31B2BCF8862C30B957AE07723D709EF6C08506D0B8636F209C062D509F904900239DC0F76833F3C785E959423D109079A8007400B8B68BC052562F7C521C363F15F0B682344A3C179E6DA1DB00D201298B18EC208698E7A0DC74916701C71C07BDB6095AF2088A60F2DA6E1B4ACC143C33819E20015FAC765740BF302F0F1DDD2E3C338EA02F400740C24B63F954654177DAF9F0030F961583EF04C2CAE45EB91EC8F5C079DA03171A401B77EE0DC44A3600D315A2412C66E16D058A099C81B2A005A05DB1A04DDF16ABD5176ED8156A83C7D0A8B52C1BBEE7213FDD897F7CD72CECAC69C1833B8EA1CD8EC3430249C7C3F25185583C65040A8A93D8B87B1F5ED8D78AF678114CBF105ED08B3CEF383E75D12404AE8D751B0EA0D1CC9376CC1D5F85E5E392B8FF89ED684B94C3336815472CE810A0974D1983CD7B0EA03B5E048F0B0E2DF31CC5719ECECA5CB3733D10F6C08506D0E65D7B03D9F6FB2E92A91412AE0BC37709D1300D039E69A33399079871F537795F3AF482187C43CC6E18A055EDC3F0153D625806E0A430A3D0C66D37CEC6EE3A17DF796403F69AC5E8461CC54E37FECF876662FD935B51D3DA814F5FB702FFF2DB6D386C16C30C12308C1E94FA4DF8F92DABD1D191C6771FD880D7508E1E04B87CD6447C6806F0EFBF7C0DC70A47C1A3639100CDE7C7E644007ACB9E83CA82A62F53AD26390E3A37D3733D703EF7C08506D0C69DFB02C3F061B91DB87EE1447C607A12493FA43C60A0C907BEF8EB6D48E5952A879E410B9A0EC198B01F34B44DF2C5A44108944100C3F451D8D3822F5D371F9D0D298CF4DAB1E18D8378AAA7046DF142E4F5B6E03F6E988D679FDF85E30EF0CE55D3F09FBFDF8966BB04DDBE8DB8D786F72D9D808B475968D95F83DADE387EBEAF13A9781CABA78CC34D734DFCEB2FDF406D4925FC8056FF89009D24C531798CA2386205F0CC502A22FC46CE49783ECFCF5CDB2FF01EB820011A2E926E07D6541978D7F42A24D38E58A49669615F0B70EBF63AB4E79522F0E96A235D403504019AD486098B5237D3814FE7A049D43630D36CC7D7AF998D6FDEF53CD6CCAAC6D4C9A3F1CF8FED423A9EC09462139F5A568D31234660774D1DEEDB741C134795A0B327C0B3C73A5062B4E11BD72FC06F1FDA85D18934DEB17629BE74CFAB688F2570F1ACA9F8B39906BEFEAB4DA82926C511CFF21B94EB690E3A07D017F84CCEDDFEFFC81EB8D0009A4E42133E4A8C1EACAE32B176E22824BB7B94751C98A8F312F8DE6B7BD156504ED20326A570E49A058809D0593DB472345222E7E183D3F270CBF2B1787C73272A8A63583831894FDFF512F2E301FEF2BD73F1E853DB5196CCC33B574DC2FF7E602B6EBC74165E7861135E748BB1A03A1F7FF38E69F8E3B66E94DA1E2E9E5E847FFAFD4E6C6F6AC392393370F3AC18FEBF5FBD82C3A5A3E0D2B1498947487110A069412FCB01F4FFC8F999BBA90BBC072E348026C54180B67BDBB1B02885198900452E19683A0A2DB4D97978E4B88FD6781160DB80A7647614AE09BF21AF501A2194878702A7079FBB680CBCC656EC74E2703D0FEF5E361ABBF7772375EC20AEBC7401BEF6D327E0C48A307F7415FEDFF74EC08EDA1EDCF6E8661C0EE2F8C8CA3128F55CBCDE6AA327D58B8B168C4071CCC0F7EF790533172CC64DB34DFCEB2F5E464DE928F8A0059D03E80B7CDAE66EFF42E9810B0EA07FB22730292EF6525834A104B3CA02C425C084BA3603DD00EEDBD482B49D0CB5C62AFC4F685D58E24C14AC0EE2C243C7D18D2956376E79E732DCF3E04B38E459481BC09C71D5F8E2CA52DCF7C0ABF8C88756E1972F1EC09EC3CD9834B202372C9F80E3AD1D787CCB51EC69E9C547AE5E82471F79053BD27948DB0646C55D7CF3BA79F8D6BDAFA37CEA1C5C37DBC437EE7E1D35855514F385DEC1302231624153C5D191E3A02F94A99BBBCF0BA1072E34808EDDBE27F04C133E290BAF17063D7D0C27F13D188CF6A36ECE64F0099D7F2A1E4549EA18319854E1D8B4A4FDB83807E35E2B568DB23179CC48FC7E43233A8D387A6D2096EEC0D7AF5F80C79FD88DCE542FAEBF72018A933D38DA968747D6BF84CAA23CBCFBB269F8D5639BB17CD542FCEEF1FDA8B31370AD00899E66FCD5958BB0E9600D9A8D625C3E2B0FB73DB015C7F347844A122E126AE1202D93F05CAC985CAD22094F00E8210BD8BC10A64EEE1E733D70CA1EC838F3DF4A3F5D68006DDFB93BA096382030D3720E3B2FC848E818C742EE42E91FC8430B102A37621873187E28A1D92E980B8324B66B508A6781E7A2742FCFEB45400588C148C4B45CCF372D04760CA6EF21F01C04B6054334D631A419BC627A30036AAA1DC633226D9960C60ECAEBA8A90E2CB6818B890B33F0256F47CC0BB0724A15B6ECDE8F365AFE565CC2C8E9C00CE30E33923CCD5D2B9D5E56AAF7B6FC2E1709E999B7326873DFCDF5C030E881306A22D3121D49A1A61583D0B29B5D9D868754EAA0E6DAC7A70F899535241765C7C4EED81DB80468432549A29E99FF95FC1BFC8D099328A313ADB10693FEC2A5255387EA6C5AD71AEF088AF2A7B26E331992784265ACCB7F1470F2453D3503C2B968D007A93E31E53D15B0A871548E91187057A21DD9F62088C3F2022C9F320ADBF6EC41A74D999D5296A85BCB2C412138EAA112695BB808A9B69EC3F7A3F1E9C36082E59A90EB81B7DC0382137A471BCE1D0689454E1C450FF5FEC0E760F0C90B0CA0AD9FEC09486FD026D6C9914817303B9DB29409D04C76C46394F0596F5574E72A1863C225E6D208D986307824F30004A54F0468D229D44DCB47C46B02A92070F8C0981F247CD14A968304D4A87D563942C43A97DFD946BE6CD85E80A533C663C7AE3DE8B26C3812B26E48DE0F394D36895EEEF7AC5113357072BF67C65D6843E4C64C76777D8A3123D3F364E6667497AA0DB830E422625C9F72EC059F9A3A24C6EC905C947D14BF9DE9466D655932C844108C16B30268041E83BD43EB59BFA71D837AB50C019ADF531F85917D2A039E4A51AAED5EF594C4FA0DFF27A02B80CE4522C858C9729CB678FB18ED593E2B4C7F4ADAC38C096D62071EE22EF9730F6ECC80CB044EC2ABD3F9990D6A1916BF2B376B9FDE191E0C4C9433CCFD9E7B46031A0394E09E04CD749EB2BED6B48E021EC87C743E357348B072482ECA21F79947360741600B0093C755004DDB9499E708148C1CE47B613AD113D6515ACBA1C9ACE90BD2256F829B28ED116E77C23BEEBBA82A4E4A511C4C0DAAC19DD18BEAA532D86552D88905CDBF0DB826179010A07D0B0101DAF4E1584C830AD8F2B5E1144918AE6619888EEC0373BFE67AE07CEC012D79157A347B030AB4B5A1161AD9326D355E0CEC666F7DEFDC21C1CA21B928BBE468437DC034A1CCC96C48427CE50A0C100F1D810467460F12FC420B3AD397CA7A95ED89847B872C44F421F101841CB402DE88234EACE390E2D0DF059D824C37CABC195E98EE34900C784C454AA7A1247292AD912116B6D26573E556ADE1596D9FE70D44A2CD2C7A261354BB014C72EBC326E5A81EC1391B3AB76738FFC7809A7959287B33EFAC8C394E3FF9119FD2E09CE463AB2A87042B87E4A2C4C48686BAC0800DCFF560C74DF801415A25161238A5152BD55068851204C9F512E8C284FC3C4A142012DA0293923D2AEF0498D5DF1E734CD3E127CB6810FAE9A29FFBB06D0B8EE3C0B419ADC816510512A8A4FD868118131D312FB4654ACA53A63B65EA3CD30AD4F98D9858C75C4E4CCB86492589D0DEB4FC5D499D1A786A30B04D02DE62D8AB36EABF4FB68E6BAA458A1084F7D6F75C9A92899E5BBFA7AFA5CF23394B42FA46F52F171BB6435BF87A4868764E1DEF33EFAADC83B0392133C5CFB80352560AFB599D5FAF8619062B7C966AD154F711EE58C2C55203A5FA2CF4ADF242B218EABF436B48BEA317591FA66987FDA8DA1C6D83FE9D0BA5EF7B52CC41164DF514C2E3553F64CFA9EE2B7A8CFE5DB74DF56BC4F71B5E57F529FB246B04E8FB55FD1CED9FF31F1C55BF0C8884D004E439385E194C7CB6966872A99CA28748D178BA9795474815E890CA1EE177D41C50E3E664AFAAAAAA21C1CA21B9A802E84631482DCB82EB39A1EA4B292ED828710F1274D9971CD85234CA874DA0745D58026EA1A0261C1FC2251B047B72BE66F87D5FAEC187177DE907C2F76DDB0EF33EAB24FDCC96E79B74EE5196C7B25510758964D163651583B23A5AC774519AF0180169B3AC156BBB28BED90F3D906AA2EA89A9BA3B7A6D9EA3BF575F00EF0FDC4F046D0D646AA04601592D568A42E2FBBA5FE5186EF7C2C542FA2DDC1D084FAFC13C8223AC2C230BA506B030519538D043054E94DCE6F1A6C574B0A1FF20036491F7C3052BFA7DDDA610FAD5E409C1BDEF738CDE6FE6B3C8C8566D668E9750EE18AE3DD1C54A0177E439F5E1C0F4E4CD4CE4485BE4ECE1DF99059563532F466187B0CFA2D739291AE43E18540F48C2487892C387F357CF778E2731EBC4C7CFB91C3EA78867508F01CE8F53194C55179A055D57DB18D8E2C9736158317802684AB32103DB8E21CD20955072C7D54E56455AB3BE0268095C09C1978068D931B1F494354D8DB29A70323168E7FA1E62B1385CC79187C889AB141DB4D643558658C7363CC9FD41300E0364EC185CCE3926E1A7A8841699CB14A8016C2B297486944A0C5C59A12DEAB025FB5EE8AC147F647691E0ED3A4E5ADA9351E0458625277A2AE5A0BBBB53FED51699B678792FDA2A947543163B02B19BB11015C829CB512896701B28D63017C2D06AD0D6875A2CF46EC310508F8296E7F988C763B240F2A5813F0BFA6AC1E4B5FA82A6BE86B23C9555DE7711918537B298CA330AD5363CA70649DD2E35548213BE93DD3D850BA858CB6AB1E9BBC3E0F9F9D2A0291658E4FA5100EFBB28E8FBD08B9EFE9B6D8BC5380E15E0F3EFA88576B2730E0A9172079FD003B296DA406B4B3352DDDD2AC56F38E7619B70B9401BD9621F314B8D4FDF77C5382B2D2DC5B871E332464C7FDD7BC159D08D4DC703234823F0D212364DF506C19225AB3888E92CF4600B18FA6E0ABEAF26683C1693BA827C59EC685ABC0104E8BA7B52B0E3545410344DA452291414E4A3BBA757A80C9E3F9D72E4779ECB66B51306AA10944DD21A161C97F23E17F9090544298545D28E98D0C906528E02A2980124F84110834340E7B8487AF0520EE0D0824FC0E5CA1E33614921DAC82B00BA7B7A909797CC58B6D18F1558D8282E2E423CC66394E5AA64276A9B2C4669C60912EE1CD4D9B29CBB06655AFCB26884AED43E4E92701D525BC590EEE00E820B1FFF55DF535C3BFF16608B7CA61743B5D81134E937085B1D5E53CE935926420A20D3DA2CF5230C5164F1E079B860D242CA5AF9EA3EB58E5D6FB2A34CA48C2379B66A57A65E590A47EE295411292A253C5F8606D2540C0F0B7541E177C2BD5064039DDD4AABBE0C9F56781FB268CB82F0E696E6F0F6ADF70077D8FBF7EC456F57376C93735DE56B7768B0C46292972766C54451253B2A06A2596A47D3D4D484B973E62863EA2434C7C8CA5143C2360CC945F9381A1A8E072652ACDD8D96B66EBCFCCA265C71E51580DF83279F7C0A8B96AEC2BA071FC33BAEBC0C7F7CF4618C193D56B8E2B56B2FC7EF1F7C08EF79CF5528292941437D1DC68E9F80DFFEF65E2C5AB404E3274C806D5978E8A1DFC98ABA68D142CC9E3D179E949FB270C7ED77E283D75F879FDCFA137CF92B5F41617E3EEEBAEB4E5C73CDFBB06DEF11ECDE77185E570B16CD9B8E9EDE5E6CDA711485C545282B8CE38A4B57E057F7DC8F92CAB1E29C9C376B0AE6CE98863BEEFA3592B1189A5A1AB0F8921588053E1A0FD7E1D9173661E9CA155879D11294971487A0A90096A0D1D5D585BC3C16B415EEE14419A7800B50565E86782CAE060E9F56264C2A941646385C050A04500231690E8E38E59C543B095AF43AA827B4ECC39D48067043D0D3F487DAC22819627F0C9D962D4639BC13E899108F32D63AF7116C5BE4BAEABE14588A851969C389ECE6891249C5D084C79F009C272E1EAAFD2136862B9B8E57D256B87A04E174088FD17A790DEC72ADCC795431062E52C46EE5300EF97A2F14D9469F69664555EDE8F3B4DF3A425DE0672095B167D76EA47A7A90306D668808A94A139E01D8B1189C545A7C4C2AE59A32CCB8DBA9AFABC7FC05F305C44F068855552387042B87E4A21C4BF504E8202D72BACECE1EDC7AFB4FF1852F7C113DDDEDF8E5CF7F8A4FFCC567F1D9AFFE3DBEF4854F61FBA64DB8E5968FA1B7B717C5C5C5B8EDBF6EC5ACD933644BF29DEF7C170F3EF4206EBCF146DC76DBED48C61372CC876EB80E9FFFFCE7F0D24B1BF0F77FFFF7686B6F432291C4473FFA51FCAF7FFB377CE31BFF4BD21DFDEC673FC7273FF971FCDDDFFD2DEE7FF419BCEFDA0FA0C00AE0F7B6E181DFFD0ED5539660CD252BF1A95B3E8A1FFEC7D7B1EEE1F5F8D047FF0231C34251D2C30FBFF71D54544DC2B5D7BC176DEDC7F1D2E6ADB86AED25B05C1F1FB8EEE3B8F7FE5F4BAE10521EC2AF1B4CCCA7ACA9CEAE4EE4E7E56B7C3EC1132DD66710A0ACAC14764CC9F5387A3A3A3A919F9F8FCECE4E141515A2A7A71789784214267B76EFC6C44993D0DB93427979195A5A5A51565A2ADF7B62FD13B8F4B24BD1D3D38DFCFC027475F7A0AEEE18E2311B63C68C81EBD2C36A21DD9B4651713EDADA5A515A568AEEEE5E241209A19476EFDC81AA5155300C0BAFBFFE0656AC5C81BC645C38F6C3478EE0A9279FC6B8F1E370E9259728478CF84A2D74B4B763FFFEFD98BF6001DA5A5B656165FB3B3A3A6417316DDA34384EAFEC82FEF8C73F62ECB809983163067ABB7B108B5978FA99A731A27C04E6CC9D2FF7C26D69575727F2924901BAC71F7F1C6BAFB842EE2D954A63DBB66D72AFB4947A7B7A905F5080CE8E0E24F3F26457C5EFF5A65378E38D37B062D972A41D07896402DD9D5D28282C14ABF8D9679FC6D2C54B104F26A4C27BDA75B071E346CC9C395316D5981D83E7BAF258928904DA3B3B505458848E8E769494940AE7F4FC0B2F60F9CA1572EFCDCDCD58B972A5A2D5F8284FE27BB8C071F6F4B79F49FDA0EC15EDC1E1FE74F7EE3D6241C7E8A0374D89F1756C1A4E2DD87FF010C64F988251E52588B929E52B0AE7584B730BE6CD9B2B7320B348F76949E5C88A21C1CA21B9A800747D6D4085867472E0E0073FFE216EBCE923D8BA631F5AEA0FE103EFBD0A1FFDCB7FC4973FF3E7D8F0F493B8E683D7CB13193F763C366F7C03DB77EDC04BAFBC8C19D36760F1B225F8F6F7BE83471E78101DCD2DE84DA7F1C52F7F113DA914FEF33F7F805FFCE297F8CBBFFA2BE1993FF1F18FE39FFFE91F71FFBA7B5151568291D5A3F0FB071FC4BFFEF3D7F18B750FA12B0D5C71D1522C5D380D77DC711BCAC7CDC38A95CBF0E5CFFD396EFFCFEFE2CE9FFF0657BEEF7A246D0B13C68FC0873F7C23EEBDE731781E69985E58B142785E370A0BF2F1AEAB6EC4430FAD43DAE9128F7F945E601F747777CB64EF6F5088E45A00BA4C0089AFFBEFBF5F76115CA82A2A2AB075EB56F93E0166EEFCD9387AF4286AEBEAB16AC56AECD9B317A346560B20BDFFFDEFC1ED3FB91D9ED3231CF29871E371ACA10D89A4896993C760E32BAF61ECF8A978F0A13FE1C337FF19366FD980850B66A2A6AE160112686BEFC5A73EF111BCF0DC134249D5D4352330E258B56A15B80BDAB97337BA531EF61EAC4141320E27D581B815C7F4E9D3316FFE7CB1989F7DF6591C3B760CF3E7CFC7E6CD9B6551A81E3D5ADA77F1EA55D8B7730736BCF232521E29A17CF89E09279D42220EE425E2282C2CC5A1A37502DEFB0EEDC3DCD933F1EA8697F1FEABDF87DFAD5B878B2FBE1875F5F5282C2D41322F894B2FBD14F7DD732F46565662D7CE9D9831672E9E7EE619AC5DBB5680998B426343038E373763F1E2C502BEF3E7CD934569D1C205F8E177FF032525C5385A5B8BD56B2E456373336AEBEBB174C972ECDBBB17B66162D3C6D7B07CC9521CAB3D8645CB5760D78E9D183F6E1C1A1B1B71D38D37E06777FD0CD5532660DFDE7D98396D3ADEF5AEAB32522F4196219B7DA7C7C1E17384DEF1291F4A8FEF637F5D235CD29D4680A963AA4584CB8DE19E3D7BD0DDD589189DFE1C99664CEA91BEBA710BAA274CC52B7B0E62ED82C9981C4FC3A0892D34A925CF8BE3523BD2FBBBF70B8E836E68AA0B028F8E3A03899887471F7B04A61DC7FAA737E06B9FFB042ACB0AF0675FFD477CF50B9FC11FEF5F874BAF5C8B82C212CC9D33171D4D0DF8E92FEE466D731BFEEA4B9FC2F77EF45F9830753ABEF2E7B74836BC4F7EF22FF0C5AF7E055BB76FC7FE03075131A20A9FFBFCE7C57170CB473F8A7FFAA77FC02FFEFBE7F8BBBFFE1ABEF7DD6F63E78E1DF8CEFFFD36F2478CC23616927DF24F282BB691EAEDC6FEFA1E4C9D360533268DC1CCA953F01FDFF901565D76050AE2092C5F3E0FB7DCF211FCE4D6BB5158948069B9686AE84249693E0A8BF270D53B3E88871F7E10DD3D6D198765742B7D2A8026A213D4694193CF25886FD9B205CF3FFF3C5CD7C1F8F1E3D1D6D686499326A1BDA3031B37BE8A2BDF71255E78F165AC5AB95AAC095A7274722E5EBC100F3DF8200A0A929836653265D9D8B4750F8A8B92183FB6022F3CFB1C4ACAAAD1D4D48DCF7CF616DC79C7ED58BD7A311CD7C581C30D48E69560CD45CBB073DB6BF0BD340223819E548059B3660B2575E4E8511856125B77EEC7BC3933B1E5F557B060DE7CB11A972F5F2E2CCBA64D9BB07DFB762C5DBA542C674EA677BEEB2A34343460D2C40928CE4B62DDBA7B317AFC38CC9EB314CF3DFF02E6CC9E8DEECE66343735A0B878041A9ADA5058568EBAC65A4C9F32095B36BD8E0FDF7433EEFFEDBD282D2F434D6D2D0A8A0A3172743566CF9E838663B5D8B97DBBB463DEC2453870F020AEBDF65AB1B8B90BE1E240FE916D7CE699673067CE1CB1EE274F9A80DFDEFDDF58BA7409B6EDDC85254B97E3A5575E41D98811282FAFC0CEED3BD0DED28A919515983861826CAD17AF5C29F754565C22BE8BE5CB96E1B1471EC588F1A365B7505D5185CBD65EAE92D41273CCFE29A3E1038C43DD124D6EA9B40F622B0726BA8200871B9BD1D1DB8BAAD222549716232EEC9F8FDDBBF6A28B16347D4CCC926327D0E0D9786DDF514C5AB612EB37EFC59A91492C8977C92E89AC1A8D1F8EC11C40F779DE750D750135C4B661C1F37AE0B8295C7BDD0D98BB6019BEFFEFFF86EECE16DCFCF9BFC657BEF859EC7CFD357CECE31F4347AF87BC781E62E9767CEE2FFF166BAFBE0ED7BC7305AEBFF123F8C6B77F80A533C6C2320CBCFF9A1BF00FFFF40F22ADF9E297BE8CABDFFB7EFCEDDFFE1D6C3B869B6EBA01FFFAF57FC1CF7EF653FC9F6FFD6F3CFBCCD3F8ECA73F8B471F791877FDE237F8C0F51F42FD9183D8B96DA33810A7CE5B81CB2FBB0C66D08BD6C646FCEC97BFC1473FF917B002A0B0C0C22BAFBE846FFFDF5BF1EDEF7C0BAFBCFA1C5E7E6933FEFDDFBF8182C23CACB9E82A3CBEFE8FE8E9ED384167A92DE6530134396A5ACB23468C9041C4EFB4B7B76754016234F85455C4433EBB03050585B26BA01E9C8A0E7E87D6444141015A8E1F17E967221E87E3F848516520F4743A942DE6C17503949695A0BBAB1D011CD9C2DB89022A9750565282544F1B9DE268EDE886652785FAA00A87DBF69E942399FE0AF2E2707A7B51985F20967E6161A100344159288F50D9C07B2B2A2E462A9D42716101D8E88E8E3698311BB178A1502BC9441C81EC4C3CECD8B10B400233E7CE426FAA572894643C26D7E1B9A9DA217F44C78F158F212F3F1F5D6DED2A9B2059C7507E49A72B81D971A8F2005C4A24439F00DB979FAFEEABA5A116C9FC7CA49D344C2B8694E3209E501489A4E7F294239AFDCBEFA743D59015EAF34B8A8BD1DAD20A2B3F2974515141210A8B0A613068893C57CE821EE00AA072DF5022C5F99CF2811E8FC5A54915062849C4608B23D81380EEE97104A0391E0233861E3B1FAFD534E2D59A26380523B0ACC8C09523131248465A84738B3BBB050B16BC4979146DE0056741D7D613A04D91A97102E6E527B0EEFEFB306BEE52CC9C3201DD1DCDF8C30B1BB16CC912DCFFEB5F22EDA690760C7CE0EA0F60DEF4B178E4F1E73077E92A54151B78E4F1A770D12557A224E6224699146CDC7EC74F505C528A1B6EB8110F3FF298586ED5D5D578F0C107B1E6E2D5D8BCF90D5C7ED92572ED071F7800EF79F7D5A86D388E7B1F78002585F9F8E8876FC0B66D5B51505225562A8182C073F73DF7A2A5BD0BBEE360D5454B71C9256B70E8E011DC73CF3D9830613C6EBCF166A452E44E13B8EFDEDFE1BAEBAE851F38F2F007437168995A79797946FAA565679A9F8E4AD5A2722EE56C53C34B17D4CD48DB94870AA49C2D2B749688DC904013AA2CC489C7F692665165C624AD95687B55C51B5A1FA28E08AF132AF7F8B14A6F1591C569899D76146AEDB796BE8904D067508F9247392EB96BA5BC30696E8A32841F33D5ABF227125C0528459A670BE72B4DA1F6551C770C1072C5A32F1AEC50A3CD7ED2F2BAA8CC4FEF6CB2F240B5B5566D578E521D64A39CAFA11A260C7C60665C19CF5A19C2558D3C68E8A02525E205D42B850ECBD07F3B4094BAE00E535239E6C7099F43266A97F923C38C0B546FD127211302D8B977073ABB3BC549089F11CA31B81C87DCB6C492E87192E8AC3F84716509799FCF954E425AD00B172E1443E5642A8E0B0EA0EB1A1A5C7546510000200049444154A4DFC4692225ADD288C52DA9F547599D0483089FEB2261873EEF80BA525FC0D2B69348CBB3EB8561D15165C1777A2437B365DAB062319166893EDA8A094FCBB923123B9F9394166A4A30810E1F5A95D43F8B1C8F2B752FAD44EAA855208D254807B1A294D6DA80EBA6A57D0408FED02BCC874CD0A723CD32132A7A2D5045080603D03A228E1A4DF2C61A70952A4CA90594B39152210D88BABA7956879CD53A0BCE654047A9F542DD7998AD208C055196B568AB55549CE4E8962016AD0A51EA09514744C08B8E4A3EA98C0C2F1230A31126AAF638F177AE06047F95BD906D5116BE8A209511C0A2C1E17555702875EA0602EAE523CE2339948109A2A157578E120A99C54A4BE0C2FE8C6A944505A3B5E33A4252161D755DE93B06E09CF860144067648E2A5042B740DEE7B5D8759467E65E27EF8150ADA4D2FE86CF5F829CD402CDE72F8F87633F949CEEDEB70BDD3D1DC897DC38E4A1998C8D81676925DB74F360D1F0400ABE38EC95ECF4F8F1E3426F9D0C9CD9C80B0EA0EB1949C8AD89610A27CA008F9809A47C0B3689D3809183DCDA73DE7AEA69486875D692E17B12812C1255EA1BA99650323665C7A98929A1C02125A0408120CE7FB536991A583BB4729585A5020DC42453E945C374A3E1DAAD2216C30010ED00D461D0EA7B0449E50552C11E94F56435C87CFF541487BA1E904C72CB1D17303E31B0236B256B052E4FCFB673E1B1B8CDD3C09389E653E7142062ED30C1441549990D4AE1E7EA5ADADA544D611E12DA7FEC578217393C02A40AD737F9CC189E2F61E00A7CB426BABFA0141DD999B1AAA58A0E0D682EAC5EC602E67352A0479DB71CA00296B8B0CB24A5A5AC646DD2BB2138F3583B8C94944C85741B4964AA52D0E8A098EC62E7A988520960F061323294D6B658E059099E3E5E162F2B1B85496380C02BD18AE1B392C5A4CF4E820609ADE9E1943A6B38AE1399BC641C67A2B808FF47B34E3867A571E738945C3886856DDBB6A0A9E1182C5124D9F0641CFAF02C5F9C8A89A04076B3A6EDC1F019DDAAE626E71839688E8993A9382E40806E0A322946A94E24584BC5923047744475AB763B5A00ACB688922E29CCC92CE93168432B447E93737C20F9E925AB9ED64786E0AEE04C4F2565D9C93161218113077678F137552AD19652348A30AB283ED980D0007DAA55FDC4EB4713FCABC45399D00909C0602765894FE9FBF07D65656A678C8AE79429206C88B26CD52BCC3E284443981E3693DC8AA0CE6AEB74D0BCF99E070602CA532F3668864608339169FD71F894327FF639715FAD76562831704854012B2AFA5427D751BB87F062A155A78A49A89F4CCFF6C94B2E5FD3F2EA131A97B3A04F352694DE9CE0AB94FB993E660A87481F33B199C7374C0BB66123C1BCEC0890A67F811A24563B224D85184C2F2E94896F3952D554EF8424A0299485E6288EF0A9D4372880565B4FCAC76981B03395E52B53555754914003992EF209815881B2215557F83B7F344087F455F6F90F40CEA4CEAD4B6A6990E2C4631B95E2528D99F0481941CAB3AC2AAB88AD1C8924E177F83E37DAFAFD81C1943A6A008D3EE9E922E01C1EA3EF417F45AAC084FD295793FB5220A668067DFD907B1650E2D6918B940668F6532C6C2D45FE9C12FC2EE5930307C4E883CA66F0D6DF0FBDF9D2F97A915625CFFAEBA1930374DF4FC25E8E24CC917BCFE425C9463D66AE132E649A37D100ADFA2FFBD4C48088148ED0967D966EC905AA0C6C26A84E95DDAFF6AB069CF3228211F0E6ECF4D51FB2BB33F9AF0E5221F58C5EF8266D700BB6A7AC6AF2CF965076E1F923D183390B3A7C323535B5B2F1D4B38C734FA66264604BADBF30CB98CA4DA5C85196C852095058922AFB7B66029C4166CF30E15DD81C02810ECB25C8B265FC3B4C8023EDE4EF0AB06038DAB43AF15FBE2F56ABCA171D7DF5A53BFA0ED8930D94810DECFE8FCA5AB66A4792DD59848B5308327DDF57E35F5255090073D1CAE6EF561A6DA9809301685221FD03E229DBAF2D7C098BD7246498794EC05903B4DE2DBC95DE50DF8D522D1AA0152828158CFCE8454E28A3EC7D457766274BFA7EB6C6E75BBFD3F3EB0C99F918199302D22138EB11A07C1280E19960D24865A8D1D863621C3EC31E0434A0E84CF40C511AB9060DC2887F6200003D7AF4E8B762319D71E70FC945D9DA9A2347250B27FB9F966FC6EA08B7B6B2C9A48240B25165EB0AAA49A1F32F2BEB3BBAD154CEAB3024F744488CEE5123166A68A185F6B3B26D08CA7C84FCC9FEAE2C4465C567365D3A07B58034918C5554486EE9BF35D00FEE190D9CDAD0E78D2E0061C7462FD9F74987A39D695589D46AC086DCB1F69E07CAD1A6905CEF6E140BAD00984BAC025045A2A8BE622D9CE806FEA4832C82E16A4286A966254DAB0668A673E533E5F21CAEC6991266FD6C34A2EBC20046B706E1687227062E300028AA9AC93A5BFB3FA98C5F5D9F3462415B67C98018DCE839BF8FE6580895CF6280C9EE555200AB872B249A446432777BC83CC9000AEB8DC20D77E2266CDF81E9AB5D2C0D08CFF4C2CA496AE7A75FA73398A64D9B3680D174F6FB7D482E2A968BE7078C91A7851CA3B34E78896CF56BC5F5867F0B8884535EB6DAAAD9EABF2AAB9D721265362D91CDBBB287B204A2FEE69B102BDC9EF3B167DB13263E5519B20480543BB34F560F8AD0EA0BF8E0D91EC5D166817E700F6F50B91A64E046288148E18213AE2AB71C1248217068199340636812AA09A2CE275B46BDAF08FB5E81B95A086937ABA710D22302A30AF0F56B20009D59A1335FD2B520B3A58C94D5AEB9F4F0C0BE273F39C7D1EF03E86F2164A878C5880A71B4669A73AA7CC13A4D8AC6880C05C7020EAAC90492CC9A73063BBCC18D9EF3FB688E3FC9AF2ED588D4B8F48D00AE04F784554AC5925600ADE80F851196E8A55D3874720BB6F8B0FC380C563AB21CD1F7730E683FCB407BEA82731206046849AA8D10A0C3CA24B47E09B59932DA5A66A3805539079557F7C422647C3F14E4840E860C1EBD890FD5567066F3DAC7426475952C0FADE451BC3E1F2EDBA9E127C2C788834C5321B2048520CD0584D2BD810E85F0B8C1300499EDBF5EB04EE2808A027458BD8B002D478779B865132083BECFFB62488B7E43BB10430B5A6D361543AF16C9BEFCF9C0003A5C84F5E6441638FEA1CFCCBFB2EF651D767DFAB5BF7E3B4DDF9FA0CC300C09A1AF0C015A9F4EAB7F4261885AA735B91C2E6072EFA195A74C02E52F1140103A4E5982041BE9A5CC42AA7C18629064EE5FE7B9CA9A1DEA43E5BC8DBE04FCD9538A810B8D15A5C936C2F26DDA07C10557B547AD1C6AB9D6171DE4183D47876B0B9AC06CFB6ABCD17A26D7CC71C92E568E4202B4026FD360EA5F0B96AFA4750468D7225FED2A800E2C78A6A3C408E1181F4CF32F3C80160D58C69E1B4C5F9DD36343FB326B699E3815B4FBB29F3664BF99FD30AB3C39A78D969367D52683B9D69B5A1DBE31E0F70773B1411DDB5F7F2AB07B6B0ED4D33782003DA25C25A9123DB6D4C92467AF803460DA5ACF459239C23D1601B2C53AA6049450E791EE126061CA4B214825902661262562368805303C2EFAAAFEA66FF60854D2FAF37C4B0517191E1C8325D768456A9A4F296484680B33E2F1775FA2197DE43954D204024E2C1DC71212A6DF1B169BE077E388F3BAA0F2C191B6F17C043505D867E2D83D7D7F9EC9117AA12298EAA79EB1C9FA28B5942840CD35BD0B14FB2E637FA95DA0F21B9DD9E8B9F0007AF024EB993CE7DC77723D30E81E10802E2B432CAE2AED5053CB4DB7728492C2F2E47F3673968B3F995BEB009E945FE3DFCCA346B0A0984B297824A882013596C0A330A2DC25CADBA6C06CB837B14427C39C32122024E9593DB11E2DC60804363C46808685217CCB861B3A3413928D8DCA06A50B367C0658057019394A791A532B505D498ED6244FCB95801257D202C30BA007FDD0CEF11772007D8E3B3877FA5C0F0CB4071440974BFA5372F12C7F462B98F440E0C69010DC2485159360169BD49AE72288113C59F32EA5822024F4DB02989FD86718B12311841262CC0458BE0F8F5579EC84142596326FB0608679525C568263C08CE1C363CA5AD742CCB7E45883741B2D738B414C74E64AD48CDC2203A5A4F005CFCFA01809EE8949D42E1712F1ABB00832819DF41BEF2B0CA91E681F5D68C7E500FA427BE2B9FB1DB63D408066D6BA984D8066D425A90D715B01669EE4FA26D0F5C243CC60A161153599320C38868F98E18A554A0A83E5D93CA601302DC445FEA52C5C265BA2A5CCC843CF2419A1E809FAA1854FB57C3848C064A10982AD41E0B6D422C1A34D0781E521CD7C14B4E5030B0E65A901291213A6D7058311B1661C1E2D75522EC217F08E68462B073679DBCCF67FD83E91A16F580EA087FE19E45A90EB01E90101E8B211B0E3AA928D68894C575401293F0F9B0F1DC3D809A351650135F58DC82FAB40257D538C5E630E10AF5734B70C83776D03BB1B8FA3644405CA8D5E98BE0DDFCA037C077104E84CB958BFEB200A8A8B60F6A6B070E64C141ACC57DC0327518098CB2A201E6AD3060AEC380A186D6B2B30A7F829E57A68696A911C312D6E0A13478F45CC49B3C4808442D35A4FD0CA6638BE70DBE4D229355332560DD002DC8375645F40E32507D017D0C3CEDDEAF0EE016541974BC22DBE62BE299C6DDA32D0E9E5E3AE675E835F58882FAD5D88F52F6D42C58C299859508896DA3AA13C465755206EC5D0D6D28ADAE606EC69EDC0C4793331362F86969A26C46345A8AC2840DCE9417D5B177EB56D1F2E5FBD18BDF55D786DC3067CE283EF83954A61D7A1439830B20289FC7CDCF1E48B985655894B664E468BD78BFA86364C193316AE67A0B7B31BF52DCD38D0711CAB972E44C3DE8328CC8F614C4539EC745AC57A32302914F7280B5CE988A92C516A921C409F6A54E6007A78CFD95CEB2EA01E20409795D382563C7122D48CF75A369A61E3F9BD0DD8535B878B668D46434727AAA64C40FDD114DC861A54240C1CA86FC4ACA52BB069E3765C3A732C1E7E69032E7AFF5AECDCD786B2740F7A8ED561FCCC09583E792C5AEB1BB06ED7015CBB76352A61E0B6479EC682C54BB1F1D9E7B16AC10CEC3978108B2E5D8A4737ECC692EA4ACC2E2BC5DDEBD7A372EA421CAD3D8E6B2E9F823D9B0F624469110EB776209DB450525E81EEDAA358503D12D3CA99D03E0597E6B6A5B2228A7055386856BAB66148442C017AF8A83886DB70CB01F4707B22B9F65CB03D20003DA20C71164A60C63EF2C6868DB41947BB6FE3C51D073165E174FCE14F4F21595C8485CB66E3E13F6CC6A7DF7D1146270CDCFAA7E7E0E45763E9DC6A2CCA4F62FD1B5B50346B227EB1EE65DCBC7609E2ED9D385C7310D7AFB9081D0D4D58B76D073E78D525280C4CFCF8F10D88578E859D7630BFCAC4A123473165F17CBCB1AB0E2BC68EC484823C3C79E81052455578EAE9D7F085EB97E0F0B643A828CAC7E1960E948EAE46636B37F26C0FCBC68D41351CC4DC4E04311329910CC6956430B4A24D3F9653710C60A4E7007A009D943B24D7036F470F288AA35492B9D3B94606809234D788A1BB278E5776ECC6EC15B3D0D0D689BB1FF8136EBEF92ABCF8E201AC9D351693AA4AF1DD077E87F1B317A3C4CAC315D32A70DFFA673075F5123CF4E81BB8EEAA5528365C341F398A259326E2787D231EDCB113D75C7D05F6EFDC276599E62C5F8CC3358DF8C09289A8AB6F42C9C89178F9D55D583E612C9CF6663C5B578F194B57E0DE754FE02BD7AFC081AD7B505E988763ADBD983079060A8A0CEC3DD48232B70BAB275723E675C3B17CA49983422C66EAA8C39067F2D0B4A07332BB530EAD1C40BF1D332F778D5C0F0CA00708D015AC05198F878A6552002CEEE0C2718AB1F7680D468EAB4641C2C6ABDB77A37AF26494C62D3CF3E246B4A5BAB07AE51254968FC0734FBF2015D6118B61E9B2C5303D032FBDF2AA1480B864E13C8C2E2E40472A8D9F3EF52C627905185354842B972D15A7E46BDBB7A2A641D5585CB97C198E377563E38BCF63ED6597E2D1D7B7C08B17A3BBA3131FBC7C1E9A0E1F415E2286960E075E5E01F61EAE912217572E9A87729F4EC694241272A804A1CA431C9F94E0A9906715AB97A337721C74A407825CA0CA00A02277C850F480D24157C08A33FA8E0127B4309D30DF754C74D192DB8FCE433B8EB4CF90EE00012B9A1B012CA707B604A5C4E1B01C172D56AA28021BBECD1C113E620E93F850E86C209D2850DFF303E4F7F60AEFEDB322107F3C5F2479CC771CB70CB8E93482780C8E94D83260A628C663CAAA001EA576B625CE4CB627964E23CEEA4160C27A06A730288541350C9566F2AB306D6F2E37C8698759CE823E6D17E50EC8F5C0DBD3035BB76E43597905E2319644A2A44D0135E5692A631F256BACB8C2506DFE8FD6A7AD6A0E3236DB7354A635D3822B55839881CD86EBC5C439C702A7F4D049FC0BABF2F02B4C1064FA92A58D117F5211C473E53A22F4E341AC7EC3D42E6E0AFC85D91224B045624F54D93387FC3283651825E805520351441C4AFD0CCB6068B7CAA92CD546CC407EA8E6C8BD4EDE033980CE8D8E5C0F0C931E501CF408C4241787AAFFA89214A9E2057C4FA5220DDF973C10444E09F98011A424308521D8C44786A1488E083FAE127A09404BB85F08D290325FB0C2F25E52D98BE5B774642097002E0EA654ABB62C55EACD60997616DBE575188CC2F34A522B43405782533CD688D4499A780E43F280B0982E53AC7251A0E48E7548242AD2B64F59FA69983CA2B7BD1939807EDBBB3C77C15C0FF4DF035A074D2761B490AC805F08D8BA66A3543697A443524613362303FD9444F149AD4D29344E25088192259798B343E71557D767CD4D55E95CCAA8ABC83EFE97F51833694E7DA13B6C9BB407230D6320A60B28FB2C861C87C3A2C98C966178B700B44A764BEB5D650FA1354F27A12AF7C4058596B94A36145ADA7DEA66E6C688EA811C40E74642AE0786490F9C0AA03560D2824E330844786226295296AAAAD012A6C8B5543E69DFF5108FC7F1C4FA273065CA148C1B3F4EA2FC68814BBE0E46F78596B9048DA85475F07D172FBFFC0A66CD9A8392922295E6D530E18456B3695AAAF8AF1FA0A9B109955595C24BBB8EC48BAB94A6643A4875300708091AD793A2CC3CB76DC64470175D84A295D687C9E31816CDC801F4B0780CB946E47A200CF52E67B2A4FE2DE8D6D656747676A2A8A808A5A5A5686A6A8293EE4549692962F1189A1A5B85022170575757CBBF6DEDED282C480885C06AEE1D1D1D30CD382A465489C57DFC783D6CCB4245E558016BDB36E07A297475A6505A3602B53547C5F27579CE716391EE4DA1B9E9387CD394CC7B3FFAFEF771C39FDD8CF2F2327476B4C349A75152528EBC8202D4D6D6C9398B8A0A2542B2ABAB0BC75B5A609B36CACB4A60DB266AEB1A6411E1E77C298B3EF7D23D9003E8DC58C8F5C030E9815359D03D3D3D78ECB1C7306FDE3C01DA442281BABA3A8C193D0A478E1EC182C58BF0DDEFFC101FF9F047F0D20BCFE3CA2BDF21E0DCDED581DE5427468EA8C0D62D5BB160D142D4D51EC7FC790BF1E28B4F63CCD82A343634A2B878242E5ABD1AAEDB032B16E00F8FADC7CA956B70EB0F7F884BD7ACC6A1C307317DCE7C34D5D761545525BA7D605CF528DCF3AB5FE0FDD77D10B66DE1E8C10352B2ABB1A9050B97ACC4F7BEFF3D5C7FFD3578FEB9A7F0B15B3E86679F7B0963C64E42477B3B2ACB8BB06DF3464C9E3A13F58D8D18376E1C66CC98213B819C359D1D9039801E269333D78C5C0F9C0AA05DD7C58B2FBE88CD9B37E3E28B2F467D7DBD58A4C9988DE6F666AC7DE73BF0D8234FE2339FFA349A8F37E29E7BEEC1D469D3B164F912BCFADA4B081C47B2E45D71C55AA41D0379C902FCE557BF8835972C472A954247872F00B965EB462C5EB600AD2D1D58B17C357E76E79DF8EC5FFC390E1D3E842D3BF762C9C20578ECE107912CABC4B5EFBF1AFF7DE7EDF8F4E7BF2096FDA30FFD4E9231054602575CF501FCF6BEFBF0D5AF7E06B7FFE407B8ECB2CBB073D741AC5EF30E14E4E7A3B9FE307E7AD77F61F6DC85686E6943414101AEBDF65AA16F72AF1C40E7C640AE07865D0F9C0AA01DC7114A63E4C891B8EDB6DBC492A6D5396EEC68B4B4B5C08CDB78E0FEC7F0A98F7F0231CBC20F7EF8038CACAEC67BDEF75E3CFDCC7A549597E1B55736E2E69B6FC2DEBD87515D3D16F7DF7F0F6EBAE93A710A767604183D7A34EC18B5CB293CF6E8E358B5720D7E7E1701FA933870E020B6ECDA8B8B562C474949215EDBB203F989185E7DF179DCF8E18FE08D37DE40655909AA4655E2C9F5CF61CD6557E1B7EBD60940DF71FB0FB176ED5ABCB17917162F5D0D27954663DD416CDFBA111FBAF1C348A55DA16348DB685E5DF3D37D9DA5A7B3AE6981EBA2BB7DBF3BEC1EF8001A94B3A007D049B943723DF076F4C0A9009AC0B565CB1671AC15171763C28409929E948EB7445E0263C74FC09EDD07B060FE02AAE6B07FFF7EA41C173366CEC0DE7D3B50555181B696361CABAD45CCCEC3ECD9F3D0D3D386030777239D4A63CA94B9A8A8AC90E4FECC087DE4F0318C1E3D11DB36BF8145F3E7A0BDBD0D75CD6D48D8163ADA5AD1131858306736EA8E1E46634B2B2AAB2AD0D2D8A07288C4F23071CA4CECD9B3074B96CCC7E6CD1BC549D9D2DA8963B58D22A79B3D630ADC5427F61D3822CA137E5E525222F446B4D279F4EFFE2A606B550B9F8F9225AA57F4F7B7E3D99DAB6BE400FA5CF56CEEBCB91E18640F9C4E6647071AC14B6B8669298AC68E0A0A8FE5AE62E2642390493E694AEF442297554C284063E27E06095205E2ABE4FD9EAD3420810B532ACED251497DB4AF825A6C1B69DF43CCB4E0A41D98F1047812566181AD026B24B528AF6BD82A809BD23BB64F17F60D98D82E8680118A3CD6776032D31D152711CB37CA4347EF876DD780CDD3EBCFA2601C2DC4FB3F01A873003DC849943B3CD703E7AA074E07D0046672B4FC57C9EA426B31D42E53FFC008424AE2A4D0298F11C064515825C3531AE7B09A49A06A090A208ACC4EE9E32885E33122A7A37E5A6A0E32F2C554E5AB2CD64464815A9E5B05BEA8C2ED61E56FD16CF37B0C3B67860F5E538135B5D7AA7D59B08D82B006DEBE20ADA90FFD39FFE5317A21E2DF3C46EBC3FB5AE2E7EA999DEBF3E600FA5CF770EEFCB91E18600F9C0AA0F52968351384C8490BB0B1ECAB1B88748D793B98E7C263F0475891450246CC245CDF95A84082A5C54840021C43BA4D43E991791C0BC1327787D42F540B00C19AEF13540316919524FBA658E5AE43B025887BCA2AA625CEFC1C6C97EB23C6A016C9C7A18E13C33CD461335085750F696A1358A3C02B581F06E6E8DD4054071EE5A9D91F1AA8294FD4FDC2F734F00FB0FB87E56139801E968FE56C364A9585CFD415CAD074D12C62E789F6542A5DAB0D73A6B27DE477DE110390F9220449804518BEA162EEFAEB87B3D9D76FED5CA7036802D34B2FBD24804425876CF9A91BF659391B787DE3CB98B76801D2AE8FFCBC7CB84E2FD2BD691CD87308B3E6CD830707B615C7B1DA1A74767562FA94A9028EFC71D2296C7E6333962E5D269C30ADF454AA17797909A41D0FBB76EFC2F8B163909757887822893FFDF1115C71C53BA4B415230993F124528E033B2F0627E52066C410B3633870703F468F1B0DD771908C25E132C9522209DFF2B179EB66CC9C3E4BEE835AE8DEDE5EB4B4B4C8DF1515E4C3036907258694EF516D42108E822F8F2710E7E7E763EFDEBD98366D9A7C475BD6E77B6EB41C40BFB53935CCBFCD782DC671313C4C594DCA54092B2C67DEE067E41B2368F736DF597F1E7765D9E994678C5C53DB70666593FC10612A0A02310DB82ED743636FAF843D57E62591E4B65C724778924A53B6F1BAFE92AE902D303E3C5EA702E8B6B6363CFFFCF3A281A693ADB2B25274D017AFB954246EF3E6CEC67FFFFCE798366DAA2C4994E111BCA74F9F81D7376EC2751FBC1E8D4D4DD8BE6D8B009DB63A7564229D8EC78E1D93CF088E04C5B2B2323436360A2852D23773E64C1C3A74480265D89EABAFBE1AAFBEFA6A065493C9243ABA3A85A3EEECE8C0AA55AB44DDC1F612388FD5D488239094C9254C5FFAE8A302C6EDEDED983469925C9FE7183162842856D8B683070F62C18205387CF8B01CD3D6D621C99CDADA5A71E38D3762CF9EDD3874E86028CF3370D965970BD8339F885029E7793AD31C400F8FB9798E5AA1427FC3D4376126317529499E231B5E41EC8C457A8E1A32A8D39E00D6D278D91BABB9161AC1746089734900DBC0E1A6E3A869EE86A40A62D1D4EE4E2C9B3B0B098B5F51FCABDC6540A80EE956FDDB30295A7A2A803E7EFC3876EEDC29C045CDF0A851A304DC36BDB105EF7ED7554824E278E28927306244392CD3106B3495763061C2445153AC5CB90A058545F8E31F1E159024D81D3D7A54AC4D5A9FEC73022581995188353535983871A25C73EEDCB902D4858585D8B76F9F5C97DF2300D382E5F9C98D73D1E075290524B86EDAB40953A74E95EB2C5CB810070E1C10F0E467047B2E386C8B80B6E7C982C3F372813872E488003B178C6BAEB9060F3EF8A09C23954AA3B6B6569EE7CA952B71F8F0211C3B5623CA163A44B903E0391438F3C19EDFF9A673003D28E838BF0E56C09C1DA2D92D7F08D2DA98E69F19C01E1A8BF2A49A557D13D26466630B2D696EED990C1EC0F1DE5E6C3E5C83B163C7E0E97BD661F498F198BD680E366FDB8977AD59853C8349E309D06A29E229B989C8DCE97900D0EC1F02167F08403A24BAA797A1D5C57257B472F92F79651E4790221D41AB3BBFA050002B9DEAC97C9F604AB024E0F25F8230C18F80CCEB1134F5E7DA01177D4E045B02A8E6816518313748A8242168F318CD236B6A82C769BE587F47F3CA5195862CCD4190A137146D41FA422DB8CA52F6E487DFE7D088C5E2619E1272D05497287EFB7C7DE500FA7C7D720368B7C6360D4802D6069D452AD398501AA181CAC29DBEE1B3DE7258E96200173847874479434E465FD256EA5C6B9280131E5C58B0E004168EB477A1A6A60E0FFEE66ED41CDA2715A73FFAE9CFA36CF27854E52730A9AC445A4A4056654AC36C6F4348E9F4D775A7E3A065890A4153EEC734E1FA5446D031A79C65920429FC8CA9444973089DC1674E399CA79D7FBE005CD4A9A6F95DADA088EA9109C27D1D7051A544147CF93BCFC54522FA8ACAE1A4EDB2882840D70B80FE5D7F4F5F5724857AB88699EFB4EC50B7837F6BCA462F1AE77B6E8F1C409F2390191EA7151220EB2094DCC204682654271F4B1DADE26903E6E7359849D81E3280EE2FC526A9182E1B02AA4120CA0397E1C4411AAE1320B00AB0ABCD41BAB515BFF9AFEFA3BBBB0D2927C0F2CBAEC41537BC0F6E4B1BE68F1AA913B5A96C6D1AA087C743CAB4E27400AD9D661AD8646D5509E854AAD0508D41299C8021E99F30B78576AE46C9ACFE762D513DB2B660A3D17B51ED71EE0DDB5D0000200049444154D4AAD660A9178E6850495F479D0E2ED1117FBA03F4FB5150D5CE3EDDAEE8A2A1AFCFEF472D6FBD109C2EEA70983DFE7E9B9303E8F3E1299D711B0945610E5E99C6946211B469D9F0FD98E2646586ABF78D8CFEE18C2FFA96BFC849C9ED312DB6DE544A1C806C63D2B011B32D183103A6C52D6C028E61E3707B278ED5D461DB2BAFE2F13F3C8AFCA2127CEDEFFF1A87DADA70F1ECD918499998CC6225EFE0A657AC4CBD83380F280E0D40517582BC474A833B8C30D08389F575FA516A9E65932079A3952F82001DD50B47F5D4EC229D0D4F07854441BA6F22237D6CDF6092BE0A0ABD1068C0D4FF46A574FD59CA995D824BA99FDA2168F0E577A36D8D82BC5E104E4A9BBDE511FAF69D2007D06F5F5F9FD32B45077B661087502C600420ED078899AA54A7CB01AEDD2852022974152A736CC0AF7EADDE308A8D27D10070226DA122DBA4B2869679398EFCAD23E5B8FDD63FD29850432BBF8B764E59D57412F6063E5EDD7B18F9A5C528B0F3E0F829347675C0EAE9C1AA99D39114CB324479FE26E433551D0AB20673BF03EE983338F07416B406CBA8BEF76420D4375063B88255B45DFDB5B12FB847170C6D39F7B5D0CFA0EB87ED5772003D6C1FCDE01A161DA47D013A05A0A69DD22A17D5A5052860C86D08CA625B3171BB447AA964EB3A34F7542D88F289FADA0457EDC8EADB9EBE5B5ECD3DEAC00BCD31462D2485C551991DDF50DA3AA997A702DF582C0FCDAE896D876B903412F090465E7E1CB3465649515356C5A6E59891D9F156E5DB2CC544567A78BC0692B05FB7B4AF951A7D3FDA87FDFD3E3CEE7660AD88521C510B5CD32151A7E4C0CE787E1D9503E8F3EB799DB2B57DAD68425947CAC193AFEF4241F5582462166AF6EFC4A58BE660647E3E4C3F04385AAE16950ECCE610B21D7DAEA427870661521012E0E05047A11C565417D0EA5532A76C29233D89A2DBE628A0F4059B28F8F3386EE355CD3D559E89E59B849AE12E40AEE3C2830D2E4474DAD39FC4DD414C8C661EAF9C5516397702BBD0EE1AE28746B5D2DF833C1D4047B5CB7D77249AB7ED4B03682BF37C19E6512B3A4A85F4A5534EC6639F2FF739D076E6007AA03D751E1CA707B7F6A8F7027862672D8AE3015A8E1C444F470FE65EB41C1B77EEC77B562E40B1E9C122A279615922E16569712AB580B68635F5A08196004C2F3DFF8D7AD7A35D14F5EA8B4D1E26F0893A70A2C7472DEC13AD41DAB98A8AB0323A6806AA78E8A07AE35803108BC34BA7D178AC0EA3C64F10AD6C7B7B27F28AF3918C9BE86A3B8EE5CB960924F39BAA167620F77ABE501C7A11D32A8E6C7FAA808C6CA15772B5BAE02CA924CDDB865AF2611498A3C7851E139AF252F239D5EE68D4A0EA03B5AFA2844E49F3B47854CE16D9FD0DCFFB1D2C8CE4007AB03D368C8FEF0BD06D8E87DFBFBA155D8DC7F0D4FDF7C1F603CC5DB10297BCF76AC99D30B5BA1CF9BE038B9A5715E2A13297994A17AB7FB475D6977E885A677D01F664807B3A8BEEC4EF29158A025553723928679FCABA565F730C5DDD291C6A6842AAAB03E585F908622652BD3E3CDF44A2A4141D4D8D284AC6B06ACD4561584AA883D63B8541F0EDE7FAD10F84837EB33281098354CD40F5990230F5CA02960455EA2AE0E7FA460671FEA8C5AC7767AC16137548469523A4E908CE5C84383E993B84B94214D82B7DF489F73E7C764883E896CCA139803E935E3BCD77B2F2DA48E85B386754F45E3696ED6C5E3E4A71F0BC8D1D9DD878A4166FBCFA1AB63EFB0C6CC347D5E86A7CFE2FBF8AADFB0EE3E28573502040A5D23E42B29C655FFDF1DA0369EF401C52FD01FA9B796D5A518A8C20406BE851444700782ED229071E130581A930F92E83596C18561C0E7967CF438CFF26949243941BC30894A3FD793A80960A2AC9642621BD72A8320F8789969656E1AB189E4DF012D0169E5E297914E3A4A4780266C2DDAB4C25D9F1A85BA3922D650E19C8433F0BC7B06DA4CC6841EB17C19951944CE6CF484746193A4E1A9D9D5D72AF8EA3005BEF284E8C1C0C73019C85B60DD52972007D967B3E541E87369FAFF247844A012A0E0820B2D10EF9D033018BFEBCD6191DAC5851AEE85F53A6855F3CF11C2A9379F8D36F1F428FD38D2BDEFF2E548C1D8DD9E327A1BA305F38676616532A87508825E750DBE4FE2CE1B3DC65A73C9D8A04A3A3D094643807F61F94CA1F4C9E934C24D0DDD58DAEEE5E24F312E8EC68C3CCD9B370E4C85114E417E0785B9B64552BC84F0A7875F774232F9184E3BA282E2E92C843665E1B2E2F05D0157D8AC62A2B9860BC61C3CBA8AE1E255B7B866413B866CF9A8BCEF63678BE8BDAC6268C1A558192C2221860063B033B76EEC0A20533D0DCD282FC82128CA9AE04635528A89494A2FC4DD28B6AC7AB1AAF56C0237C78F27E644DD3BB186DAB660C8FF0316903F60C3A5559D004682EA98A16A395BC6DDB360947EFECEC861D8BCBEF4D4D8D282B2B41616191245FAAA9A945555595848D937A63BE0E91827358EB95FD246DCA046CC971CAE371AE56F181B447ADA0AA059523AB86C49C18928BCA7DF7876E6730984EF695D03E11CB45863651595C562A4F0F013AEBF01ABCC4EBA45402A793EF23EDD079E78A2ED64F24B1B7A51D758DCDC81760726025E3B09C5EAC62D62F4AEB18B841B3321C107DB5AA511EF02C76D3804FA5B7BA6C07CB2E710DE1046C6E6EC6983163D0DADA0E6A7F351F5E545C80AEAE6EF4F4F6CA82A31D96EC375A66FC5E322F0F6565A5A8ACA8082DCB0137E79C1EF866800E672A20392E76EFDE8DCECE0E4C9D3A4540BAA1A10163C78E87934AE1E8E123309371545694A2A9A101458595088C18EA1AEAB074D10CECDBCFBEB3B070C11CF8812171987C11A04D82B10C551B9E61CB2E4301B42B7FBF1D00AD9D7EF47B6880D677DFDDD5850D1B3660D6AC39A8ADAB17F46291DA8E8E368C1A552DD5C3C78D9B2006C5B871E305E42D4BEDB334F89E0AA4A3004DA7B27A9D23881ACC0E2E00AA72007D36E75C6885CA2AAC86BF3C6F9D0C5D246DEA13A54818DC38E86BD546D71A0219B780B42CB5A2827286CE204073770F761DAB45CA4963F2983118575488227296E24C0ADBC0506AC169ED6052CD1B6A0B5AB7412F14D265929B38EA08535B7AE971096D5609E3D577B3E58FD4EFD9E7AD542567F3F9BFB573BD19A0B3E62833D6F119B7B6B6A2B8B850F26B7477F7A2A0B01805C924DADB5AC16255AC52523D72240E1DAC454151191C378D823C80393BF2F28A503DAA2203D04A1FEFC120184B84A52D202D794A585965C8005A511C519F0A1329959797E3C081432828C81780E63326D53172E42834361E17EB9999F094E5CD31C29D6AF69908A3D3CF6B20C7BCB5277BE6DFCE511C67DE77FD7C5303B4629A694367784F728199ED6008DC8300E82850EADF396125DA8ED6224CD9B66B6FBF067F12043E2D22BE41AF3713D998617E3756C490B06F1F8EA72A75506827A58EA4AD0A04FB2A324EE4F9CE2D4510BD767F9C7856D5103234C2B7AA68399D1758817A76769E29B77E56874A3F273B1D07AD658A3AB190E4AD9000A34095AD621A565637115F590CA6CD7C1864E27B85CEF0034BC0984E5779F24201E8407A3ED5908E9335DB8329795022696ACF61079C6841C74F906946952BB1181D884C8CC4E2B01C9BCA24E5FD657968064851E171A264F464007D0E6FEB2D9F3A07D06FB90BFB9E20BB45D2D5D8D4B00F3DEADA9A1EE44E2AE3DC09B39A9183E48B7C2B338A7141709D3452E9344A4BCB24593A7F9F3E7D0AB66FDD81CA111538B4EF000ACA8A112FCA47CA75E598D6C626941617A1BDA70BC9823C2460A1A7AB1B0B172E00BDE9DAEA540017F590EBFB3EB7001D9D747D6BD0658136DA36D5AEBE6A87BE8ECB289573D687C0199E70203AE8BE0B8D410769C0884C17763C26748FD41134E2E287901250CCF927FE045DED4048B6B095CA94D0651054CE3F95A25505889FDBE7ABC71477454ADAE9A90C78DA828E3C4BB5C652AD425B83CE41BD28EBF7958A458059FC9C598A43CC8D01EC96B2FDA292720DF52B07D067FB09F4D95269A193A835A3CF7B008325DA340D46740C7100D39BCFD7860DAFA0BEBE0179F9F902A87CB92E5345AA4C618B16CEC7ABAFBC06CF0FD0D1D585A2B212049681C07331BA6A24766DDF8144320FC99262D88938CC942396D345175D84A2A2828CDC290BD07D07EDB99DC0510E5A26591FE765B48FA232C0682083FE5EDF47DD3720E66C0F85C19EEF741674DF124EB2BB892A31987B83F44E8635269805AA36A186E02CA795016821B6B433F64D12BD73FB7C75EAAA2840C7E2340C948350C67D267B1D2D63B52B0DE8DC14B9A5A6BA4869E84995CDD921DB477DA7039873D105492D5C43FBCA01F459EC7F256D0A6782EF86BC0233C829317D36BD27493E355AA2965D74EB1D05223A4EC83912ACC8C3F5F7521687B21C18E5C7014FF995E7A56058069C709CB32A735C6449AAE0663A9D423296276D9482A2A79C8F7AB989B6E05C4FE0413EA0C11A3D0398B4836CC1191F7E2A802695C59D5234C56686979714A3DCE62BC052811C063CE68EB66C780272AAB28E1A8B2A67B4244D0ACD4DF53DE59350E755832953E43503DCCA69F1E6053B6A8A0CA60B941495E395A9535DD7473CA60255B4C2868B07DBC9C50786E88E008379A06945ABF1A7683955C59CD4075FD1C5BDBF85BD3F5D3FA5A6A4476C2B4C819A99D03CA32A761B3DAF4A57A52C77452F4A7281B04DF40978617E6A46B3EAE4552A2BB93A5EF5B1EE53D9CF48908E2AB63B79D2842119A14372D11010073B854F39DADEE444F3A9DF08073739416E33657B458DB1760CAA4C103295FAB44673C87C480465BD15A7C5CCC178B2FCB6E17C82EF05D8B56BB77CB7A4B818C7EBEA112B48A0786405DA8F37A3209184159830ED38D28E23C7CD99390BF1BCB82C1AE1BA71927B7EFB298E814FF5B06D03D9C7464F3A6423F1CD77763A0B9ADF88523799B1422B526A137262AB1458945A1A521A8C5676A86FE7A21C52557CCE921B5A00459F57298C644C33317E48CD69D0572D5640A801FDAD07869C08D01E019A1674184948702650133499AB9C8E4C716852BB2FE0AC0C0DE1D87DAA3BC8BBA7A5A5043F05A86A6CA8F328EB3A6A1845FD1C328FC2EF4AE08B04BFE88C80EA5CAA8FD50C36994A200C14123A4E7D3BFC4C596BD1BE328C98CA2CC842BA6AC9CCD03119795F48E5F0318CACAA1892113A24173D9B00DD97D3CC58BF46801E184885AB683E022464FB9875C044B596921E923C61386868D5688F3D6BBFF1A513A96B2751BF16B4F64F1A90A00596462A2D2E41E7F1767831136563AAD0DDDE0EDBF5D1DEDA81B2912351535787DE9E5E2C993F1F166B4399CAE83FFDC3198E0567CFD4821BF81270AE8F3C1540EB2D7F5FCB50D11C814828130C79770218D401FBACCD487A83CAA13CB1D298A3440A7F49156E876A6749BD2AD9C199EC5E1E3C2B77B32F2DB8E25C0ECB8599EA98749A1236EA8CB58725BA682B481FDCEBCD00CDAA28E2F4F41C09C4E11C49C4188C44808EAB44FFCC5F2ED55428CBA3EA43A977141B42EE9D65B94C29A04B0026FD97EAE9956355F51525C1E43D7177C239C69DA77E9FFFFA727D75AFEAFD985085199E9E8B1C35E482E0AA008129518DAA0801C15D392B1510B35A3A6B188873D6601E19FEED885124D67CB8D3763CA657652A60A0AA72C4E9A7E3E03A7C40470FC945CF04A0DF6421F7B93D5935431ECC370CD07577B03B85970EB7A3B228814595F91813B761691357EEDC9749405D2AE59AD104441C2404660E98BE8BC0A97A364A8F642C020E56D7811BB324E0807614B5CF6C02ABA77822ADF211E3273A93DD903D99018D9BFFD1079D4A66C771C17A809491C56296EC7C4879C8B384813163C7A2EEE831E4E717A3B9AD15C93C0B85F909B4B7B563D4E829282A2AC4EE5DDBB9838793EAC5C47163D0D0D08458220FB1781E6A8ED5A2E6C861CC9B3353E498070ED7E08A775C85E3F5C770F0C07E548D1C85BBEFBE1BFFFCCFFF82AEEE9E30078BE6BB95A578664E455D3EC180173050C5433C460B5A011FCFD9D3D5893F3CF628C84D1F6FEDC1656B2F47797931DA3BDA2470E7D08183D8B2651B56AE58898EF6768930ECECEAC073CF3F874B2FBF02D563C6E29BDFFC26BEF6D5AFE2F6DB6FC79CD9B3B068C142DC76DBADB063163EF6B18FE1473FFE31D6AC5983E2E2526CDBBA45EA1C7EF9CB5F96E2BB0C8C61EDC59A9A6398BF70219A9BDBD1DCD626CED835AB5749D1DA8E8E4EA5CB6F6B473299270652221E135F106B3CF27C9595ACB5588B8A2A150DE9A61D8C1F3F0EC9441C5BB66C5121EB868931E3C6E2D8B15A54565461DAD4C943322387E4A2670AD0279368F505EFB461E058DAC17FFCF10D3CB5AF054536F0C955D370D3A289A02D2C369EA1EC0015B867A0A7B72753FAE784FCC77DA0A87FB95BF620D9BA85DCA00AEFE5021EF28E2C2FA4F669928F4306BE845047DB144AFF86ECC9FC8FC6DE01DDDCA902551860B37EFD7AD4D7D7C99698C55819BCF1898FDF82E75F7C490AC23ADDBD282DABC0FA279FC6473E76039E7FF649E1730B4AAA71E9256B70EB8F7F806BAEFB005E7B75034A0AF2D1D4D8847113A760D3E6EDB8F683D7E1B777FF0A17AD5886FD870F61F4B889983E73369CEE0E3CFCF0EF71CD35D7E2FEFBEFC7DFFCEDDF8915AD39E8ACD2E16C02745C516D818F82641C3FFED18F505E5686445E1EEA8F77A0A0A808A954373A3BDBA5606E5B6B1B366E7C1D25C52512594A3D347D2BFBF6EDC7873FFE09B89E872D5B3623D5CDB9E648D18799D367E00F7F780C13268E97809F8E8E0EBCFBDDEFC288119578FEF9E7049459517CCAE4C9D8BD6B17962C5B26E05B545282CD9B77A027D58BA54B1663FC9851D8B8712366CF9E23FD3376EC3858764C8AEE5EBCFA22A93ACE4595DAEDDDBB77A2ABDBC1ECB9B3B17BD74E94141563FAB4A9983D7B16BEF5AD6F61D9B2E5122979ACAE1613274E92E8C8BFFAEA978764460EC945CF04A0A3338B80C6E49AFC69ED48A1B9A911ED6D6D121C52513512C9927C1C6EEFC6371FDF83CEAA69483ADD981B1CC7D72E9F893256970E030BCDC043AABB17DD3D29E433DC3A163BA1D8A6C2D2373B114F39CB4327858C6B061FC8162BAB43128555C897D192A6C51C928C92BE93C9EBB58C69406832EC0FD25BEFC10C354DDD64B7E959FBEEDCDFF0A942BDA9DEF9F18F7F84E5CB9789EE9D0B32ADBA9B6FBA11F7FCF63E4C9A3205FB76EDC2D8B19370A4E618AEFBE0FBF09B5FFF02B61543E5C809B8E6DA6B70EB7FFD0037DC780336BEB641B2F931E8A36AD418F4A41CA41D17BD5D9D282D299490F8F193A661D1D265686DACC313EB1F477149A954E5FEDAD7FE1F3956BDCE9E05AD551CDCDED35051015EA4266C3CB57E3D36BCBC01F3E6CF47A2A01485C52578F9E5E7B178F1622C5EB44040F9CE3BEFC4D429D3D0D2DC2221DF2C804BA08EE5E5E392CB2E43DCB6F1377FFDD7F8E217BF80E6E34D98336B367EFD9BBB0594376FDE2C69046849F3F5FAEBAFE3F2CB2FC7BA75EB24A43E66DBB878CD1A6CDEB255E8C386C66604A689D5AB5662EEEC195877DF7D225B1D37662C9A9A8E4BE839BF3767CE6C3CF9F49358B16C39B66DDB8AE953A7A1A1B919E3C68EC38B2FBD2014C7DAB59763F6AC9962D92F5CB808C9BC7CECDEBB07ED6D1D9838650AAE7BFFFB063380CFDA201D928B9E09408BCB4F1C0794EE0738DCE5E0A5BDF57865F336C40DA0282F89EE740A3D5E80E9336660F18C51F8F5AB47F1E8CE46142285AFAC998C0FCD9F089B593D597DD8F5D1DBDE8A7CE610C84FBEED916CCAC71F91340FD993386B63E9C413092E937755D59CC9AF4AD27F710304707D2A1B42F916F7FBA1FCC534F9A4B9F41A30590A8CCFDB60CE0A75866C8980C172AC03BFCF5371D09CF0DC6ECF983143DD572843237FAACB4129599A2CEFE22863B49DE2585DF8811F2A13C2283B2A15424E95C680CA10A7FA4C49149936807D452E57658BE3FB2A28EAECBD44CA26A42C836EB40E5AC9459533D0178024AD435D379DE05AA5A27377906F6600CB9B5F8A9F4F3B29518124E209E19BF56E5417B6E5DFBC47D248FA3E5522AA6CF5747E2FF3779835D0237D9876B077FF3E4C9E3E0D49EAB7BD303C8D1C366F8B857AA948A163D5A39356519ABC365FBC26FFD6DCB87A166A8CB13FCACBCA8764860EC945CF08A0C532F5903280A31D2EFEF4FC6B706063C2F4C9889595210D0B493380D7D6869AFD0751D7D286792B16CA56A62A2F86E9A5169CE6E3A82E2F97C913B71388C76DED0F18B202AD676F8A0DB333A9EAB2522546B9664D989C29C22A499289D077AE222C61AA3C14866F432A18841E792D8992D349FDD530E8E11CC6869F4EC5C1894B4754B43E5F345FB2D2492B8056BA6615FAAE25952A784349E4A2B2B393E9C1A33E90811C7F262341951D536DCE70D0043AEDD709E57F2247EBA37A52F7D157AB9C851611A3F07BE1353430F75571E876F777DCC976B219354DA8A07119D92855899463960B82A8B99493491909E1B127A846C26022BEA75FD16B8E1C397248B072482E7A26002D468519A02D08F0ABA737C1F40C2C9A3503F5410A0FBFB113875A7A501533F09E39D331A9A404BB1BDAD05C77001F5ABB1CB1AE56FCE0473F428FEB61C2E891F8C2673E27455915FBEB0A9084354CCE646CE7BED35F0F4432BC72C7C3A4FCC45D79F61C75921D4A852010B74D838139045F7ACD5525EC4C3E92FF9FBDF700B2F3BACE04BF9763E71CD00139E740309BA42952924965C9164507057B67EC2A8FD763EF6CD554D9B3B35B5B3B6B595ECD682C590E4A54A4324951CC0104488044CE6834321A9D5FBF7E396D7DE7DEFBDEDF0F0D7440B7BA01BC57D564A3DF1F6FF8EEB9E77CE73BE379496671E44EC4E230D6DD78C55ACD770A9C758CC1024C8AEEA568781381AD01AAE2C49889CE9BCE8014FD170DC60AA0958BC3FCCD802A9F5D59963A7468A5BFC9F9666F38B6838A1799423B8DCD4130F43BF3FD54DF55DA4A688BE49A6B7D853CF2ABC7B6BE93955CA07149B13DF4E2698EADABAB9BC51177ED1E9B939B4E07A039C663D91CCE0E0CE36B3F7D098F7DF04338373482BF7DF56D0CB82B8463EAB1DB51171BC517EE5983BBEA7D787BCF2E2C58D881E8B1BD3875F408B6DE7D1F7EF0BDA7F09FFFEAAFD1D9BE50E43DB3E441DAB9D22A5A4EE933432D60751ACB9C5574302641D8EC2E647276A9121E4D2511CF01D51EB7B8AA9472B2AAC9A8FCF13C8F2E10E5AB679F299FEBDCB838B815167A99CD96A78599EADCE3818B1568F4F2A41351C602B4B5D5AF150C9F2E684DA547955B25233F790693E6081700CCAE32278D58D6984C3F8B05AA85C80C255E2A9F93CA9A4F26313C6EFD849AFC2C9C719DDE4D80B44A0B5C93562B0BBEDE5DD105438076F05E426894EF58968DEE3203DC562EBBD5AAB75ACEA6CD3B3A3AE6041CE6E4A6D302E82C10B2013F78E13578DCE5A85DB206FFE3855D783D1544D415105D67769E379DC092CC10BEF4D85A5079AB279CC0067F06C7F6BD8335EBD7E1D7BFFE15BEF0879F454B638B68CE929297CE51645E09C9973E33D402669E6A473B7DD16AD2D991CCD990B0D971E0E809B8BC7ED89D1EC412692C6AAA46BDDF2581536E4D39E7ECDA1FCDE25802D0A25048FFE2EC15999DC8C5C1096C2C4CC3CD556E0BD6613425A0CC68528257856DBBF97DAC8BC30AEEA6078AB7F5C55B7FE36299A11E93CB1403B45A2A15075BB941E8B6E232AA1268D439C6255570E9A842035AC697D6A826FF89CF9E49391657825C44927A0B017903EAC5006D160903DAA64D142B8B710BD5BEE24DD35D20E941DADD2165DB34985BDBD94A8F1DAF3D4BA9DE138C322EAE9772C0979FFA213EB8651B8E2503F8E2CE93E876542265F3CAA42604D81C7654477AF07F6CAD414B6D3D5EDBB917FFE92377E2BD37DEC089EEE378DFC30F6251DB42D845A83F85ACA4E0DAE154BBEAD267A65AC0E29620A02A4FB40DF6AC1D11BB1D3F7F6B37B6AC5E819E0B3D180A8D60C1B2C5E8EB0F61F3C22654389C797A974C7ED9978A5F44A77C4E271163F22F3619B124038E85EDB24ACE28248F98ADB44AE75769DD2A118A606C804752A91D0C0C16742BF2A063718D58B7E5AAC49472419880DAE4DFEEDA47E6FDCDBA2ABC249ED02A95CD0ADD54EA59730C64C229414F95D751F0F7AA2083E97C93F861433A9383C3E9C8EF3A84E5A4330BB34C0BD7D9B9C6E540374BF14E82C141B37B313538D96E63762EE6BAA214A99250CCA22349376C67AD95623282AFBA8675A1D0167CC9C531C108A3F3FF52C6862F7FEBFBF8D8FDF7606FC88B2FBE7D065D2E376073C39D25412083ACDD8DCAE830FE6643251635D7E3C5D777E03F7FFC115478B5AF536A58181F9A7847650B5D02E79998E2966B685724FFC77E11F6052B8067EC38198EE0EC4818B9F3FDF8B7AFFC03324862CDB6CDD8FEDB0FA3BDB5190BC8AC111F876C8A55C05063729EFD32C38F6BBD1C01BA4A2AAA28853A2BD79893399E484A12049914645D24D349D93E7BBD1EA1862D59B24C808CB200890459070EF87C5E5CBA7449B4C2172C5820DF9391409EEF8E1D3BB075EBD67CE0917F0F0683C2093665A768A99346CAA418F27DEFB8E30E4958F9EC673F2BC932575BEED36F2093B065EEADC282AAB4D9C10307108F2791B1BBB176DD3A11F54FA6E2F0FB7C181E1AC6E5CB17851B9E4A26F32E12D2E756AF5907AFDF07960BE33BBFBD6B17162D5CA4B8D289047C5E1FF6ECDE0D97DB8D152B5688956BDAC8303B582861FDFAF5B2285DB87041DA9FFF663BB18FA40DC892B13B845EC744B3706844F8CC0BDADBC4374DB70DDB92CF104F247060FF7EAC5EBD5A59EF12CCB4E3FC85F39270C4C5C0E9724976E8C28ECE39818839B9A9DEA61496D9498C25A6760E03F8E62F9F4773731B72758BF00FBF7E07076C7E245D7E649359385C0ED833393446FAF08F1F5C8DD1D1611C397F097FF6BE3B5121FA2A5C4D0B928E6ACB4DB856018FD267665B80AD6B4ACD2A9F322D451BF65CBA0C7F4D159EFBDAF77174EF2ED85C19047C417CF44FFE3D9ADA9BB020E88757028639A46959E92AE77447C9967A967BEB7A001D0A85F09DEF7C172B57ADC2E9D3A7E1F678A5CC55435D3D1289980083DBED456363A38011931C98C1B66CD952C95AFBE94F7F2AE04AF71BAFF5BEF7BD4FB8B70F3DF41076EEDC89CECE4E016E728809BCFCFFB163C7845AC6F30281009E7DF6592937F6E69B6FE2EFFFFEEFE53E133123A6D2B3B43299794780A6D017697FCCB2FBFE534FC9BDEA1B1A70F2F4393434360A08F6F65EC67DF7DD8FC18101BCFBEE6ED4D6D4E0724F0F5A9B5BA5B2D0E9EE6E7CECE31F87DBE3C1ABAFBE8AD5AB56E3995FFE12F7DF7F3F8E1C3982B26050DE399D4ACBA2C636D8F3DEBB02F44C5E617A38DB818BDFFBDFFF7E3CFDF4D3D8BC79B3BCF3DAB56BF18B5FFCB772122B000020004944415442E414EC4E077AFA7AA55E228B6034D537E0E8D1A3089497A1B2A61AE565E5B872F9322E5FBC84473FF07EC951D8B777AFB4EF86F51B70A5A747EEE572BBB07ACD1ABCF0C20BF0070270BA9CF88B3FFF0F7302107372D32903B49AE988DB81B74E9EC273EF9DC0030FBD0FEF1CEDC2BFEC3F87414F0532368F583181C8103EB6B61D7FB0AC127B8F1C82AFA109BFB37A21828C3EE7A814C7BB2BE52B138C9ACF054CA732B1E6D3B185D557D502573B15069780D3E108BA7AFBE10DC5F03FBFF4DF44B272CB96BBB1F5C1DF42F3824634960711607F092B4F09DEF01A8AD9AA0388B3F8B21303F453A8AEA9D57C5C07826541AC5DB3063FFAD10F245BCDE954EC074EF664322D40B36AD52A9C3DDB2DE0F2B9CF7D0EDFFEF6B70574962E5D8A9FFDEC6762C5F1BE1D1D1D025004FACB972F0BD0335DB9BDBD5DAC45023501BDADAD0DAFBCF20AFEF99FFF5980DCEA9F2E0EA44DB5A9C6B038324A8F3A180CE09BFFF2AFB8C2F25E6D6D707B7D08965508E0324985C0C9249E6F7CE35FE57DF99CA4B292331E0A8F60FBF6ED58BD768D2C4A7FFD1FFF0A9FF8C42770D75D77C902F3E0830F62DFBE7D9260C205A0B5B555007AC99225387BF6ACB4C1A64D9BA49D04BCF7EC917F5351928BD6CB2FBF8CAE93A750595D85404539D2A99424A57CFDAB5FC3F66DDB303812029C0E4992C9A4D2A29572CFFDF709C0FFE2E73F977BAE5AB952323AB9436199B686C606A9C148706662CEEF7DEA77E7042BE7E4A65306689E905135FBFAD3697CE99937B0A6A3134B1B6AF1EBD317F1DCF18B08D9CAE04BC7F0405B351E59D581D17814870FECC1871FBC171DE565125252B42DE5D630D5A909CED20873D612539D3E37DBF12A5AA860DA46FA33C2C8E1991D6F61DDFA7518ED1BC0D05004D51D2D18EE1FC1B685CDF0B342B6A983934F78E12FC61535FB3EE86BB938087EB1585C32FA98F64D41218FCF2B02474C5F5682403E7165508B62707058C08A5B6A5A89B446E916301578E8CAE056DDF85E6941F2779E23D9737A4BCE6D3DAD67E36F354C0B9ECFADB815A06F748458015A980E5A9680AE835068485C2D3607D5EC28A4941E2322C6FA8454C1631A3ADFC568DA10BCD91E742110044D8208DBC1F8E6F9DCBB77EF96C587A06C449368C9D37D41F1322E7A6C17B605DF9BFF665BF37AFC3D3C3A8A80DF9FDF5150E695F39E520E4E1201EC2AC927501614B7464A44A754D09216BCB89DD8CEB9AC6A7F6653DA6D686D6E99138498939B4E0BA07574368E1CF6F50CE0F51D7BD1B97009EADADA104EDB30301A4759C0856A770EA19E1E1C387C0C77AC5A847B5676C2AF39A934C9146D4B65B6896FD3F8D7F202EA373ABC4BE7ABF6356B9E2A846B92910930E15814F0B870E4CC59D85C41D81D5EC4D3312C6FA84583D72305D89979C6A995A7D5E61D1BB3BFA25ECF82563E16A5D8A6827B225AA977098AA1402D65A3BE6667A5158B26B21AFBF46B9BE415CB5E43070A8DBB82C75A038BE6DFA6D49675A459AD662B7D6CF2A3F1EA441582936263A85D8B8A15AAF6A7B67571A289E1482BFE7781C5A29E4D3D89298166A88926586A7DA7628686F51D8C0EF7557FD33ADBE24766760303B39A66A7FE2661499179CDD3FE747052125644E94EB348549694BA855662A8AF2DF1A0AF3F9674D9766E96D9F8FB2E8FE0D9B70F211D0E6345472B1AAACA301409E1F0F94B4866ED7874DB16AC5A50854A5A63DCA6D1B7A1DD1B05F8503AB62AFF98AC8ED9E3D64E7EA2DCFC476A8F9465521752DA074743F0799CF0BABC48D91C08D1F798032ADD2E78753030A333BF1D020EE358CBB36C564C08D0CCB63300CD67165F8CD2C5E038535AC58632A6E7B9D6432E48DA2AE94C6B5284D58F6CC0D864B61583B63573511B3C5701E654469211BCB766123ADD2CBCA65827A2E1CCEA409A8A6778CA85F7548B8E750EA9F753017911FB976CCADC55B535ADEC112BE759B5A72E68A0CF357F2B5E8484724DA688A472676073399114ED6A05CE5CE809C2C40E03D0F4AFCB02648A10E8B4FD34CB786919024D2C4463FD6D964998CD982241577B178CF595B7C2446B97B0AA8A71B2A113B0239400BACE9EC7C9AED3E8B97259AA2CAF5CBE1C8B3BDA51ED77C9769A5B4F99E496555D69C35A54E33445C00C9499DC2E4E6592DC8CC7D2F2A1C00D2538E90FE4B69F91EF9EBE01343537C90438D77D4602475C0CBD013F3C6E376AAA6BB17BDF5ED435B6C0E7F3E0E4A12358BA78919ABC4E17FA07FAE1F77A313C3C88C6C66655C1847AC45EAF6C6FDF7EFB6D2C5CB808FDFD7DD8B279D335B454A6A7977D3D9A1D9FCF6CCB8D5B428185627B90DE4BAA9D4AEB36F757143BEA6A18CB5A29136B70175A9AA2DE495C841C707E9FA18EBFCE7815EB5A59D4A974A25086EAAAD25926843AF5325185F16F438AB532A95331260B52092771FED10DA2DE4901AF759130BF5B2D6123AE2F82FFDA0E52D633DB4A99AA229E2F9C7153F0609A33C2C2201AB396DF0005A8B5B57596CD82F1DF754E6E2A1D98CDE564001B3D023D30294C62E43AF3ABA46C33F41645066A0E895416703A45CD8A65A4FA07C2F0795CA82CF320160EA3A22CA8565303CE45EF2F2BBF68411BAEA6E2AD5AF9A9C6BA99E630B92D4E2358515D8D00BD72E54A09EA305B3091525B7F6A30545554E04C7737828100EAEAEB100A8D60DDFAF5F8F14F7E82A6E6660135AFD381458B16E1FCF9F302F2F473D2A748BF23A9580CE41030C81AE071AC01C9EFE96678F081FBB5F55AD4E4D2B966EB3EF9DDD144006DE5311B3052C8A2C02B473AA11EAF640D29E0E1A856415291FC92A41B6EB9191151A2F2622DEA19C9BFD96894D3DD2355B10D80A9925AE28BB6589563CD1C3557A6F3518B4C4EF4A08D8B4359ADFA6AAAA694EC3B8DBBC1A1CB5259136B8CF688FA9B7290109C792CC5FD0BEE9182B09411F857BB863983A6719BADB9B9794E1E684E6ECA16C8643239ABC68075CB62B673E6FB9E2B57F0E22BAFA0A2AC0CF1484454B132361BDA162DC5C58B3D58BD6205CE749D473C368A4C2E29B5FFDA5B9A8562D3D0D020560B79991DED1D58B3664DBE030C185B7BC49A245002E889A738DB8B20CD1F822AFFCFD99C92640C06CFED0887C21230221F58C0C9A6180E831455F7780468488BE2F70CFC281781B2A494356AB6C56AA27B3C4CD048C871FC290BFAE5FF525A694C670A7C1648D413BF8E1C3111405B2D46055EDCE129D68940A3B085B4529F521BD1DB7AE546936D3FC56574719F6C5AFB7905A095252D5559E22939864A7E2CF3407093CA1F3AE185D6AB49D898E4AB5DF330EB6E40F1A009D01EBDE0286A2A8FA18F9D3B1917E985192AF131614505FD4C45146355B3128B9CE320F758F5AF2AA2ACDC0AEA7CD63D54FD58289B3567B074CDF6B9ED1255B2D96CCEBAE25AC1B2D8D5101A19C1EEF7F68A255655518E68741476971BE11865096D68A869C0C8D0103C4E2742E121F8021EC4E329C4E3313435354B94971161D2775A5A9AC50250EA5AAA3F8CA80D9F47C8E9B4CC8BB776373A036EE1F3D9565266485B7467CF9FC3A9D367D0D9D121B426A96471F122CACBD97751E1D7D23A1B1E1E862F1090083B3259B4B43609558BEDCFE40346D1693D1B09483621695A0B172E44592098DFE617025233D3C813A57A938530369B2F0EAFC785443203A7CBA70AA6DAB3482513F2ECCCA2235F3A91544C021733013349E55D77B8E538BA32320445974778D507F6EFC5C60D6B1550BABCA259CE76318B20173063B9CECC5BABAB18E0A4B83EF9C0A29DAE65387B7B7B641E55945560F7BBEFA1BDBD03274F9E143A5C77F7696CD8B05ED1E516B44A75133231B8E33971E224962F57BCF1CECE7659782F5C382FB4C15DBB76A3B373A1D008D55C5465B2CCFC9BC977BB916BDD766A76F1783C47A1734E4033D8CD04E7CACA41410A11B7B81CC82C0914898C8A2E6EC0E717EA4F2A93119173AEDE24D247474611F47BC59289B3569BD674B52E046AD576211E8BC1E355DAB512C165643A430A945B683826DBC8D0816EA4736FF573AD0C02023045DA7BFB06A4F61BAB55545656A0A7E74A7ED2912BCC063FDDD585728AB94B2DBB8CF43739BF46EF977D50162C436824247F633FB23F9889E7F3283A9AF5DE06606EB4BDAF07D05C545E7FFD755990489D2358334BB0A1A10EFD0303F0CA73D9E0F705F1DEDE77B17DFB1DE227AFAF6FC0C18387D0D8D884D5AB566160B81F17E90E4AA4104DA74D223C5AEB1A11898EA0A7FF0ADA17758ABBCE96C961381C436B6B1B366CDC209548C4125514F119FF88054DFA9C4EF52660F267F7EE77247184F533CF9C3D8FBFF88BBFC457BEF2153CF1C4A7F1C61B6FA0AAAA52161082337F3EF4A10F491288DF1FC4BE7D0704D0B76FDF86EF7DEFBBB8E79EBB9148B0F6A04DE6F8430FFEB60897A92AE7CA05329F3EB79D16C79E3D7B721CDCFCE18020F791939B9DC5C9C86C2002F6F1E3C7C54D31141A853F18808B05331331D873369407CB1149A670A9B707EBD6AF45CF8573B09115104BC05B5989DE814149063039F7EC748287E1A4F21E4C19E5BFAB2ACBC56A33890104E975EBD60968943E536B016E750787423261159898EDAB11145255D155D61D79A6D448A028BD5332CF84BBAAC1D7E854D08560262DBF376C02657529949AA9497D3D80E66EECB5D75EC3B973E7F0D8638F4932098FA755B076F50A1C3F76146565953429D03F38846D776C44321E971D44782482B5EB37CA986271E0EF7DE3DF50E1F763F3DDF7E17CCF15545456A2A3B61E878F1EC6A1E38751D3DC88B52B96E39D377760D3D6BB10892670F7DD774B1156A5CB9CD562DA53EB9FF18E366D672C680609DD1EB7042B0998BC5F6F5F0F5E7FED35D4D536E0C5975EC1073FF8980072636383EC6C5E7DF5157CE4231FC1AE5D3BB178F1223174984CF3E94F7F065FFFFABFE20B9FFF027EF6F39F221209E3DE7BEF9573588FF1A31FF9A88C118F9795C0E9C251CC91F9F4B9ED2CE89E9E9E9CD93AD152E2F69716B5A998C081C24C21A347108DA5A4F8E3A9AE53E8EC68432A9194EF2F5FE945DA0ED4D4D5A0BFA7077E97138E9C1DE5B5B5088723963A832E21D013148C856E7C6504E8587454267A5D5D9D2C1A9C880477FA4A4B9FF15BA0D87A35A233745370511DF329B6F46ED8401A4F20FE862F2A8F7C3D80E6F8E4D8A021C15A797CCFFEFE5E6CDFBE056FEED8857BEF7D5052B083412FAA2B2B25F3EDB5D77760FD868D387EE228CA026558B16C19B2B9242E5CBC8C8EF68578FED7CF8B1B88EE38BA49687D9605BD58B4B85DB2E6962E5D069B8D3EDF9C365C6459523AE63368415BE96EC68256D2A08A4142CD8DC868044D8DCD387AEC047CBE80BC3F9353589771DBB66DF2EE8CF3D0F0613599E5CB9763EFDE7DD8BEFD6EECD9F3AED4FDF3FBBDD2C674551D3B7602AD2D0BC4CD41D125137B986F73EEB6B3A0E98336568F95EB79ADD59D0BAAE67168A60509E7460C514596878606A4A8A5EA65F5231C55AD7025BF0BE3CE90ECB5E2981149D3D698894E97828445183B8EA56AF51512BCB8008A85E86040ACE853C8859881F93737006DC66C315F379B4BC161770A88CA771C680C7E81FE68FE5DE92BA7526429F14317052D45E5B661728B8C70D9DAF31AD4C3E035150B229B637579ED234EA7E070AA0A2DB3EDE22013CA58D0EA1D9CE22BB73BD4F3A8D891A206F2C37737711C9EA7DA8BCF6AE6A3D2F93065C1184064069F0486B56A9EA12CCEC02099B14BDC76004D1687616E58077BB155966F6185C18A3B4A7FB15441D1B2ED9A231A1A1A42B0BA52A2DE6EA86DB021F45F8515DC424BD45D0D2C157D9FD9ADF28C8D8E797E21B61B771DA4C2319DF737B3B0CD1D409B05DC8C2DA1BC5122955CE62C990B36D81D1ECDDD4F29253F025D3A07267F300027D662868C17BB04116D043C06FEC41221ACD3BE5032B8B94C1A99ACAA6B58603B196B73064D68C348D13E68F2D909D005394FBE9F9647D525BB38344D1660F1FC29C47E0A006EB4A54DB2982AFD652459D5CEA0E4E2284CF899D9134E03408C056DF4704D47AB95B50094790B4D6BC7D25FA906AF02540A24D958E2C60684868711ACAE120EAA64A1E5015DBDA6F1635A7D95565A9DA14F19FAD235178B69BCEFCD7E4A715B58B7C38CEC337E409753E133D93ADC2A576BEA599C1327A158A16B2A037DA2925786074DFF79815AA68059123248BB13BFAD7A35A6AD1B2B40525004F4B406844E9EA0F52829E2F682E03F991D595AAB9205ABB2F08CBBC1CC9BD9603B58697605C693D6B0A6352CC944643C311B92E90863D3D90D4D562D26CA82569F9C58CFF4A19B1883EA774A857297A10AC9CE247D70A6E6DD6DE783CE652553456D7FF43ECD58B385D5D5E4F0EB80886C0185D36F499537D33087D070585801EA30B19F75869245FCDB22C66D3ACF90E9C75B18662AF034530365AEAF63056A4E6482B3D135B68ADE98B69F38E1609A006D1185BF5649F6D90068C5D31E2BB8AF76601C9474EB180343D7E7935470651C081849762BC579A85DAE133EB4268C30180400559A8B23ABDC78521984AE847C3D3DF56604FEC2F8B42E413796A8429AA04954D10EC2425ABAE06C0E991CDD14CEFC0E557B2CD53A3446D7465F41EB71281F7321CDDD003471803E6B1A683A876CAE87FA98FBDF7E99841433303D61014DE95C439FD256837431AB36A8DC581D1F29582534956960338041E16F46F955985F4D24E3BEA0F5ADC697552BA1906966A5E31506DABC1A2733F730F9B4D76BE4BF16FDD9B499D572A65B83006D7CCE63B7B8B36C414F027D2771C8B8ED39998A2A66B765C6936A17055E94795256A34A52C921A3CA3C49511905C0D4B848534AD161432E95868B56357248D1CD415706F358983D287F57413A9B58263AFB957E5FF14DAB4A35922AAD330E8DB53ADDC1422F8BF0A02DA9DE920128D6BC7E473EB79A903AC1A46029F3CF2C6460AC64717971E7CB854D176F30CFACE699D12FB10609D53BCD97CF6DE78316F379863E526BD2064422A46DB9E066258CD2E7DA2D906F79369C1548B53E045D46B277558BA1523319EB76A24BC3B06F6EB5A62E0668BB852A41B049A6B84D7731B7262FB9497EBED39E412C1A81C35B21B97F4E5B0EE94C0236875B454B98FD484684D3298143B18CED76C44746A52289A474D3882080937A483D0F131FA1FEA2839A4C698447A3089655AA406C26A9AC735668A1246F3A2569F3D1684C2870D27BCC40141D109780241756B29332E9B404F4443E34AF1B42CDA1020F5A02EADA5DE8B2DB100D87652790B2B9E115594F96BBA2BB46D1F194CC28EFABABB6EB5D96CBE7021C2E05B9E984B882E87BF7B8A82D429F3C634619793637150D450B4495D562B6217315C2236104CACA9578932EFB457AA694CBD2B2872C48CC1D9DCA368DE977663F29CB3C166556AB4716518753EDCC53499D85CA47D6B2A3BC9FC7AD323F73593B1A9A4A6A76539EE7569C61CFC7A231A97B26DCDA295FED363B41EB54707FA1045895DAB244E5B5DC17653F8D7CA3B896F4CE83343302152DE75BD105743D8026BDEEED777663C58A9538D5D52D1982034303A80878515F5B8563478FA275E15201C8A6867AF45CEE414D5D0356AE58894B674EE2E5575EC392E52BE172BA101A1DC1AAD5ABF0AD7FFD061E7FFC719C397F4E32EF860706859E76AAFBB4D03E63D1A858B49B376D403A95C4B7BEFD5D6CDA7287F8FD2B834A73D94E7AA9CB8763470E61F3C6F5D8F1E65BD8B0618308E6D73736E0E2C54BD8B8699324CA9012C73EA46E32136F1E79E491BC521DC7012BAAA4B33A514554E2B292FD78F8C001ECDDB34784AE4E9DBF2245989B9B1AD0DF77195BB66C121D96B7DFDE8D75EB3788F8BDD7ED4530A04A7AFDF6FB1F45E7A245D8B57327BC6EB54011CCB9A03011C9E3F5A1B9B909478F1D950499C6FA3A49E7A71B25102893E49EA79EFA2E2AABAAC5B2975259C90442A161D4D5D548D92C2E0C274F7563E99265088F8684CEC70F99334CBFBFE79E3BF1D24B2FA0B2A21CE1D138FC7E1F46A321B8DC4E78DC7EF4F78510F0073030D88340C00D87CD858AF26A74779FC5673FFF87730229737253BD2D9C310BDA000789F1FC50F7A1F499A005B469467026198A0381FB0EA98ACC4DAB5433D172117A8742EB82139B0B20AD2E6B80F7566AEFEB0134C7D8F77FF04301E0FA8626F111B36453477B23DE78E555545556E3ECE51E7CFEF39FC38F7FF4235457D74BE511AFD78DA0C786175E7A159F79F20FF1F39FFF1C651541A9D6F1C273CF0B50BFF6E61B2204D5DEBA005DA7BAB071EB66D1E4D8B56B175A16B4A1BAB25C00EFC5975FC5DA751BB06FDF7EF85C0E7CEEF39FC50F9F7E1A2323310C0CF4E2CFFEFDFF82FFF1DFBF22554C08E297AFF448F625DD3265E595924E4F90FEB33FFD7778EFBD7D52D18402464A1F5D5B910CE67954651827EB2BBA5DF8E2DFFD1D36AE5F8791915191F4F50503E83A711C765B56126812C9244E9EECD252AC4E49F53F71F4885461F9DC9FFC094E9C3C2119BF6FBEF196EC3456AF5C8581C1413435354AAA78341197946FB6FF5FFDE5FF8AA79E7A4A1628064FC92767F516BA5F962D5B86969616ECD8F186BCD3FBDFFF28BEF3ED6FC1E70F606868045FF8FC1FE3FFFBF297F0977FF91F447C6BC78E5D686A6CC182B6569C39D385CB972EE283BFF361BCF2EA2BA8A808E091471EC0CF7FF13C76EDDC8F8F7CF8C348A6423879EA30DA5A16C2EF2BC7EEDDEFE2FFFABFFFEB9C60E59CDC74A601DA808311ED61E249E9739D16307139318F559A31E19996B3783C68383BD22AC49A7588921A7D9FA391519556AFAB7EDC8AD633DFFD7A00CDECB7E77EF53C366FDE827DFB0F8A25D7D8548F851DEDD8F3F6DBF0FAFCA8AEAFC75B6FBD85BBEFBC13EFBDB71FCB96AFC2C68DEB70E5F259EC7CEB6DDC73DF03D8F1C69B486612D8B071235E7DF165A9F377B9B74780A8BEA64EACDB3777BD85B6050BF4CED0857BEEBE53DC772FBEF42A52D91C823A03F6F0A183B2F5B7DBB973CCC0E7A5BE471A65E5653877FEBC58D2741D50A69596F9C18307A52622B36A59624B0AD652BC4903348BAB2A2D0E8FACD85C8809D2278F1FC34BBF7E019B366F8637502E5209870E1EC0DA35AB6447313A1AC1F7BEFF432C5ABC18838303282F0B8AF55F5D538DA1E1307EE7773E801D6FBE89E150041EB2409271F8CBAB505F57CB8A547877DF21AC59BB1A5D278F23128BA3BAAA5A2C632E2ED4ED78EEB9E7A4F02B0BBA0E8786C5FAE73B313371786808E5E51548A632F8E0071EC30B2F3E8F586C145555D5C2AEA19EC9C30F3F844307F7898BE3D5D77662DDBA953877BE0BC323615455D6A1EBD4197CE0031FC0FEFDEF6161E702749D3E8986FA5644C329FCEE131F9F13AC9C939B4E07A0AF0E651519E014ECC9649088271028A5674FB83E290F079DA869641964A54F8E143085CAF24371733B5CAC3586F0282B4C3BAFDA9DDC8A207D7590506B8A6B8682B01774208CEE0071FF087D4C9587CAB18A8AE281EAC40D2DAB9B61A56BA7F85E1974133A1EAB50D33FAD772CC2AD56FE24E42866AE2B9A503D3D9B4E28C53EFA53A90297A6FF55C55F541C86FACDDC0F3119C6A114F674E28895BB6D744DF43C143FB4A288E87C000B400BCF44F267C4412BEA83F40B4B554FEA5353579DC1CD2445EEE9D7A56F5E73A599684329D23455F998E0A2FCC5B0BB60A7EE06B2C8D89CC268E1C292B3A9D811255AA98B2D7AD3129854D43B1A070468691EBAE4A4A28D0AC44A4101117612EB028CB28ACF5EFEC00A100EADA3AD5E958B1905ABC40FCDE335FF5A3299993C2322552C64CEF774A1BAA6724EB0724E6E3A5D8096CECB434FDE0C54161F2B1167B322E4122C2B9F10A06EE703C48521342ECEC84C5E839800AD1B53748A6959E7B20E8486E8AFF489B0BE9523AE26D39C0DA159EBC2F1591CAABA8BE2F82AD6906272C85F659B4FAA5D3A9392125E90121F8A6AA734CEE9E127079AE7520C48D14BA56AB616F6E20B19117C8228D3AD850D22CC103B1CC24ACA2AB0CBD92489045926BBA860633623C59EE4B8ACDC5FF58F95816380DAFA7F1E27E1482B40A7291CE651EB8C7CABAA95E40374129CB30980D2BAE663C9DA4E0AA1EE19A11EB2B6249F81C136CD0BE0EF0C3C72312128139C856228EB98A6C7E6E55A4DB92A9D74A60B1D9898884A72A3F56F28BB7C16260A91EDC25A8DEA9954C524F683AAA044D714415B71D7550B98ED2383824A2295EDCFF74FA3A1FE36D3839E2A8BA3D0E9665E2A80B60E3EA6D9D2475812389A18BB18A957255849ED52AE0D87D0BA34C79C4511721944C3A328F304E0F2B826BEE82D72C4447AD0C5A02740C8E168279011A85D52F35200C9460B50201C5966030A7C1198146019C672F1422756A855905F2C55A5392D241BB13655F963A2230B57703185A49CF33994E094953A5AC842BCBAA3242EACCB42898B4303B400B758F766BCE86031AD53EA511348B5C0BEE4F6DA68B9EBFBE6F8BD0256B1E865C1521635192532D6F40E249DCD69612D2E407A5111CBAB109C5656BC7A1E43DB53EFA4D2E7A59559A185D16D1B8B24287F1DD73F8783FE74FAD919304C0BB30539EE3858F99240AE74B6D547A5E0DB6DECC714B2B6249A1B16CC89253227379D510B5AAC0B954ACA41158DC524123E672F76938014278BF06C59A5DA6EC3F0680C57FA876173BBD052578D80C38EE8E808821E0FBC2EB7A6ADDE1EADAA6A12D688BFB73883923B086E83CDF63A2F5320B5EE4C96206963AA4C9BE1F533B3D0E9F220C7B46E52D34CCD151EE4A4F56B0164A100B34CB8768DE8926C52FC8A092EB452ED04E302408B059D75083813A455C95D65A15BF9C8D71A9E06A005E832D4CBC88A0F5AAC67E976DECB80ADA9EFA976AE5C2084362817574B908639A5EF2C9E1A72A11D12407439B8AB50EDE3B0A96C44717B20ADD2E38DC68EA61BE62D6F29CAA0761E62C98B6EBBBABF7227F1FA4A0082FB3F6967592CE80A5196B9DDCE3691D12FCF2469F902CCAAF28D4ADF573C7695BCAC2CEB052D6D7332F8E7E4A6330AD07A2810A409D031D26D7C7EB8945BAFF419A70538EE24AD96969E1D38131EC5BE23DD58BD7211A299348E9F3883D59D6D58565D0637072F01229FAE5BB8603178DD2A8D3D7ED158F5767C678233815A40486B898B8D99A355EB80C3468B2C2D6E089BCD2DBE7E9B3D23B6B57828740D435A9F1CA3D4952140B3AA8CF88CE99F753868900B508BB782C0237EDB0C720E1758F1CDE570219B4928707238914A2BF0918C18FAA98D3898F68517343526B6A0C94D26DD2D2B40A77CEBA4C54B824D26839C9D2E0055C28A2E0AB18C25F74C2D0CEA1C5564961C69FAD0794DFAEF6D5C40C4ED40B70D9F953C6D0E338A403991A6C56DD1FA1050D6D995A6E0ABE87FF0DE92569F91DAA3BC3FC1D56E638C80199F4A2655F9A0EDB0F32064944F5C78D1AABA0F5DF0AADA0B331909C9A142850000200049444154CEFC9DE9ECAAD28BDDEE425D4DF59CC0C99CDC7466019A2BA18AC928804E21E0F7EA62B1B70A64CCEC7B28FB2D83141C88A432F8F1ABBBB069D9323CFFA35FA2B6BE06EB1FDC8E0B4323F8E0F245E2A726A343C95215EAFADD8ABE67D3CAD70368AB7B83C92906A8A548AC9D16A7038E6C42F9332558C81F15B8E392C8B58E9C6202BD8032B1D7CED2600EA93E235B7AAE8976BBB89CE289049C1E5A9792442E1ED804CF73B2F24A162EFABE6D3649D22AAFA846361517FB312BD6A4760F188B96A0A915E6640E16CD7E31DC75156FEA41F3BEB253A0AE88C9194C517304C83A3D70BA18A84CC24546865EB0685073B120A01258F9CCC2D37633BBD726D573025E9FFC9FC7113F95FA9D4B15DA88C7E57D9C7A01E0EFD48916DB5C74C3154FDBC9DD8D58E1D4F748C1C3D5438C08E50F97EC4D2DA8984E33F147050519C8E502C68416B560296D6DB52B327E721DA03401E05C0E0D75F57382957372D399036895F0C68ECF4847E5904C67E0F1B8E0D2F5E16616DA6E9DAB7170C6EC76BC75F8141A6B6BF1FD7FFB16CE1D3D2C0070D7873E084775359EBCF72E3808062447EB74E25B1998C7076845025739961039556A34B37C1ADD98FC3735CB83C132A4B236D43534E0D2D9D3221C75EEC245D4D4D48189ADD1C8285A3B97A2B9B1016FBEFE2A5C2E37528914162F5E8CEEF367515E560EA7CD2EBCE0DEFE3E2C5CB408894854E87177DE7337CE9CEE428E40E476A16760502C585624A92E57D982C78E9D146EF4F0403F6AAA2A70FADC05B4B57708AF58B921540AB9AA34AEDE650C406BBF84D898AC5C9E5182FD648250908CD0D77BF932DE7CED55D4D535A2EBFC15ACDBB801AD2D8D181E1AC0C285EDB878F1220E1D3A8255AB56A3AFAF1FF5B5F542B33B74F810B66EDF8A8ECE4E7CF5AB5FC5EF7DFA09FCF8E91F62F9B26558B97A0DBEFB9DEF883BEDD34F3C891FFCE007B8FFBE7BE171FB70ECD8512988F0DB0F3F24943AA9633914423C114763531322D1B8F0D149E7DBB4612D0E1F3A2C5996E43C8F8479BC0B172F5E407535935E32686D6DC6E9D327D1D9B100070E1E445BDB4284C32AFB78E9D245280BFAF0EC73CF2118AC909D00E9825DDD27D1D2DA88F5AB37CC0956CEC94D6F04A0CD2452D15815614E833E373B86469338DD7511F575756869AE21414C62B7F98F25D278356D6FAAE03B892BE40FB9FEB156C2E06FA443B4746BC40EFCFA9D77B16EE962FCF72F7E19A1DEF3C8A6D2D8FA810FA0BCA9150FAD5803172D24B7D22CA60563CA51CD16508F6929FD0F15772FC82FA9CDB1716119368F625388DB61AA5D59747CC182A6E6B109B429EB953C682679B0165F64744400F6E48953F8E33FFE77F8C92F7E8605ED6DB0A75370B97D786BE7DBF8F4673E891D6FBC86782C0197AF12EBD7ADC6B3BFFC299E78E249BCB36BB70030E5716B6AAA7168DF013CF9FB9FC157FFE9EBD8BC79338E1D3E82254B97A0BAB6163EAF0BBBDE7A539EA7B9B51D274E9DC6A31F783F7A2F5D402CC63263FD180947B165E37A5C3877162DED1DC209BEF3CE3B752AB47253A87ED301F6620B5AFBCCC9893682FD4A3BC32625C6BEFCA57FC0DA552B118B25309A0228471A0A0D0A40DF7DF79D62099F3A754A8CA6707814D595353266CE9F3F8B27FEE0499C3DD32D9995914412995412B1C828DA3B1763EF7BEF62CDEAE5D8B7EF90F404332617762EC68B2FBE889ADA2A01E9B5EBD6E1DD3D7BF0DB0F3F824B972FA173E1423CFBECF3921CB361DD3AF8BD4EF4F6F661F3963BF04FFFF44F527B349188CA0E60C386CD38B0FF203A1776A2A9A91E2FBCF82B545757A1B36329FA7A87A43EE2F2154BB06471BB24FC6CDD42BEB91F6FEF7E07F7FFD63DD8FDDE4EFCF55FFCA71B1D56D31A957372D3E902B4A18789B39F032797452C1DC6CEA32F23928D23166BC6F2855B313438820B0397F1D09675A83369DFA43AC9DBDAF30A618C2B5B455B26DF828A3E247C4B0307726D2381690A06E8F03E7D929A663546605DF3392D67E5C1E5463B667C412815E4A17F2D9ECC20964AA23F16C389A108E27D97F0C64F7E2C09120F7DEA93B83C9AC027EFDA0CAF16CE61E5666EE7CD8FF2DFD924AB50B6B2F499E6A3E0C2FAD28241059A97720F149408557B6BB0D0C1258917692AB64875DA7318CDE5D04B6BD2668797556F023EF8A9BF20E099111FAFF87785D9A0740C95D16F7221F346A3BAE5351AD72C94B4F86AAA6A15EFD602D07C5666E17DF39BDF1460A6FF9255776835FEDEEF3D81975E7D09A94C1CE1FE105A5ADA71FACC197CEC138FE39BFFF60DB436B7C1E1F3E3D3BFF7297CE98BFF2F3EF9894F61F73BEF88CF9560DFD6DE8E81FE7EC99CEBEEEE968412BA06987475CF3DF7602414C28F9F7E1ACB962FC75028242E8D2D5BB648E5929ECB17E5B9982A3D3ACAA48B4AD4D5378ABB80C798BE9ACCF8E6B1EC63822DFB5635974D5C032FBDF4120E1F38288B86C75F2EC1F89D3B77481209B31199FCC2EC3FB60DC703B34D2F5DBA24D76B6D5B807BEFBE479AFE0F3EFF39FCF57FFC2B444646B074D9327CF77BDFC3A38FBC0FEFEC7A07E72F5CC0E7BFF07919A3070EECC7430F3D846F7CE31BE286606AF77DF7DD8763C78EE3FCF90BD23F43C321DC75E75DD8BA7913BEF3D453F0F97DC216A121416DF2AE93A7B0FD8EEDD8F9D65B92F2CED4F7A6A606C9886D6E69C56BAFBE818E8E765914D6AE5D85BFFBBBBF9724248FD72FBB1216FA65BB7EFC631FBBD1293999E6BFEA9839B9E974005A7C7312FD96B085F8B608D2D1D408761CDD016F59392E9D49E3C0BBC7D058D780471EFF1D2987B56AC90204297C8EB400BAE2699262A37C20B275D5422B93B7BDF45221D11BE34B31969C21C6EBA6956B6B27B946060928EB4FFED7221EE1441D339ED6D4B5685426C3D2048908921E8F4F7C87A4CEBE76E2AC90F15D4C55B1D9108A8E62C9A23674FA1DE207559CDD02B0E6A3EAE2562A80F6D820D4D8C58FD7E00F83317C4E092EE5036CAA7D54FFB23B245543ACE650268D43E72F211C51BE4B3A2133F128B6AD5B0997247964642C70AF94E679A2F266BCE5966798C436E56A80B6B238D4B7043D82222B5933EACFB6255F982E587A999D1E0790E0FB386495B239A83741A17B0740360CFD9FB934EC22526F2AFB28B6014185D727B03145DBEC5A441F453B59588897AE0D321608EECA07CEFB6565AB9E88C7E5FF0CCA997E2A2E88311E5258591C4A0F5A01B48C436D594BDC22A58A34F3FA8A134E1126F51CFC3F7704BC1F1717BA2454956E3B92BC9E8B6249DCFB6A3E398386F495EB925AD4C2E67D6D741EEB0732E7A758AB92E98612E0E6351DFA59DC32AEB8489FEEEE465D7D1DCA2BA9D39154E34CF3CC25C8E966020A45985C923929CFA20B543381C8B8B154B0910607F542B88374A3AEB61424BCFE0A93B78832C889F342D88A48E61278EFCC2954D6B7E07FFFD3BF40B9D3875434850F7EF46368DFB00AF50DB568F07BE1455A9F4562A69EC27AF4092F92B4254B106CC2E5EEAA096FEC7B0DD0722DAD722196760191B5FD2D7F90D09B39554569CCDA31EE231810B4F25BA52D8A1246389138D9CD80E464535ABB9A5624EB06694D69C46D6E5C8CC4D113CDC9E46EF4E6D0E0F5C08BA48E5869F9D6719EC854D328B6D218B85125910AFAC0FC9DCFC3C2A0FC51595E4AE7D8EBF20AB839E84A61143E0BC4EDC0B1A1280606FB70FCBD3D38BDF72836DFB10D6BB66D416FDF156C5BBD0C545D71EA523BE2E2C8C731954B22BF439A36405BB4C4F3AC0D054CB4A00D6048065D2E8D74360577CE09BB830C08D2769392A1C977226E93D160A3FA9BDD296D61AD686FC0CEE84D9BBE962216024A4A92543149C8DA6082078D0DD58E02E4B240B1D155969DB9BE59BCC72D4566495431597B7980163606F727A4C9A97BC8C2A2CB781194791FD5972ABB4F1B60790097B1690AC1EACC485E836352005902805C60359F9989405AF3DD94D39220AC56DCE3BB2B9E3615EB28F26F87D3CE40655AB34014C346F4C965EDD27C736DF548BB3AD8274AB255D5265542F3D28652B498224B5C7CD4F2DF505F3B91CD3421644CE78039B9A9EE40EB9499F8D9E568F61A1B9F047335F792D924DE3BD383405D3DFECB9FFF39CA1D5924E2293CFCF1DF45C78A25686EA8439D00740E4E992063132E1425C86CAC277E8C31478CB17A3940550D360DBB169707E78F9640D5CF4D03C1A8C8E541DAE0895A7DC6FD58AD57E3521046801691E78ACFC015BFA34E81F1195B270D7F5756989ACCD9AC1D71669F51F3970334954619AD1F46FC09E8126D570F6426A25910AC0B85D5AD329E8FDA4CEEF1B494C5CA4F53AE328D6C9A8B0890F538F1F2D12E5478ECF8FE57FE273289A404AFFEE6FFFC2FD87FEE321EBC6B0B7C39C88F22AD524CD904BF1443623A2E2C95A8421787E2D95ADF85EF60CDA63496AF80948D20CA841F8704A568E1C22EA6B58CBB442A2D954820C244DC45281095ACC13429612A53CF808B59784DBBF13B55BF90343E45F733206EAC64B560286A9CC94AB482E6B546B8B5EF941B4CEB41CBC0D149297C76F3119A9C1A0FA60DCCBDCD731B0B3B7F0ED3BEB3597874B6619202FD4EA714A74B723C7ADDAAA4962C0605FEB6E2265BCB7DA945DFD43E14B74C8AE04C09D30CECCE42BB1880E6F815F6B34513DE5C77BC36298C6B6564343696581CD74547B5F52DF2030887348D43178730104B61F87C17F6EDD98DDA86063CF0F8E352E57B755B2B1CD9149C3A5B4E883F1CDC6E8744C41570A974CFC907BE14514D9DCC812317B1383A8D7BC3E8C4695FB509A06B2BD9B83AC451622EA7A3EB0542DBD866B15AD057BB2E7232818DEFD04C946270E6AD76EDD983AA8A6AF45DBEA2DEDF4985780546B148026E5740FCD1A95C0A8D2DCDE8686ABC6EFF148358F1BDAD6053DCCEB2E8E483573464547FA46DC0CFF61C420009FCE01FFF116E9B0DD1440AFFDBDFFE0D4EF60DE1AE2DEB5166033C4AC75E7D7463AA8C3EF50755BD72F21F05D0351AA0AD554BD40EC080B4B11E0B57562E385B96AE169D512719DF6A0155855699B8A1161303BCD6B6B23EA5D505226F429A99708F0B00648E3760A3AC686B49A9B1E9DE13B5820155AB0F9A7440E5C648CAE9628D4BA287EA36734EF118300B8EF93BF7BEE47723A553D895FA7F5EA08B74435E93B3255F264CBFB775E132BF5BC794B83274A92503C4D226B225D53521F5626BDAD5EC2ACCF35B1748F337D5D6392C58D03A95213451334FFAFB39B9A9068C495BD0EA40957B25EE00F54F318E32B624225917F69EBA8C8B97BAB17EDD1AF40F0CE3CCE50B7864EB26D4B93CF954551165C9D173CD12F22924A26119101E8F1FC1A052C09B1C48AB945E659D51EDCDD2DED635C446809692A1F2B8F2EC96EF69454B184B6B20F0723C837FE3D2315EE77070519398BE3E8231FD951C58E6C758D8C593C5FA6F3EFD89336711F405D07FA9579E2F118F209B8DA3B1B119E1D118FAFB87457B2369CBA2AD7301DA1B9BC63262261862568B4CF7F75596A8B9843C9B3427B3151863A0980EA4BAC881FE618C0CF6E3C8AE5DD8F5DA0EDCFD5B0FE0FEF73F8A935D5DB86FCB3A7872004359C657AA5C1C6C64F6B26A7B132A9CEC609FA826A1F5D5C74E6E1588E618930413016165CD8A954780D08B85691FAB0FD75CD70AB0D69D8A017403C2D6F633006D2C5A734F034213218275DC582D68732F71970880AA019CCD2901FC6C56BB59F40DAC606D5C2CC6A8C85BB0922EA8DD79DAE5213107A6C4B3AD2CF3C9BC734118C92407A905CEDC832E2095BDC902BC8542B7BC9658CFFCDEFA778B4689757133ED647628CAFD61673078B2C367A2A69ED2F77372D3E900B414B0673690D9B46A0767D69105EB26F3673099C2A1A35D68AAA9C3D2D61A38981490073A5A87869A279B2899D422B294CE6064949522940F8D16A8298469180A56C09141A3AB8A4B8C5B99F73A214195A39707D5B141E690F1F9783F67460A22691116193D7AC151A3322D13BBF0DCC6BF476B99A0CC7F139429F959EC5EA0CFD950E1F89D494996EBA6D3720EFF260B1107337D76CC624B3BE5DF0E970AD2487A70862D1E874D02420EA493B4AA75545F6F9FCD04B182007F2F667498496D1DFC0640A45DE58D95BC6986D7CEA9C40CEE30065269BC73EC341A9AEA11F0783092C8E1D0E123F8E47D9BE1D1344AA9F7A2036ED2AB04429D4D9735014EDDD456ABF45A8BB1D0EC6AAA45545F89F0684B4F07B724FA910F9C713BAE5D2C747F3025CE4ED683F2CDAA8AD5327A6507480BDA543631F7BFDE56BBD8F5506C3D176FFF95556B529755BB98716DB53CAF87123CCED0EC0C58CAB36A5122A5E0E7CABFA3B8A3F22C29757F53A3D02C361218346BA7CE7034C69629006D9E95FF66C0D000BBF93BDD7779664971993CFA99A9E161E177CBB8946C1D950844F798D5C5915F382DBB92E245CF2C5025809E8445A6E3D522BBC21992CD30CBCD2129B25C1D47010C876328F7781074D0776A479AD592E329C423619497D327AB20BB907A200ECC7C80D0508C4482D16CE7F420A7C5CA1FB5C5332A58A66A94B2FE725995312582F7DA50C8B0DA8B5E2818D47233DB4AFF5B980B6AFEE74B34725008185BD28939B00CA5CD3C97B5C9FAFBFB71ECD831545656221289482205FF662C34B202962E5D2A54A8789C406F87CB6D47343A828A60AD00476D5D15060607446C8673309A0C8B1E83CBE1C568784806797979B93C1BFF4F5F379F95D7E68794305AF7AB56AD92124ECA482A640C9909271698F62B9A924AF237022D015E2C50E5E2206C8FA673E8BED087542A2719649DAD35A8743A44924892300810622913DCB3B0F3DA82060E51EA93BEB2145DB5FAC0C71B765703B44216B1F232199C3EDD2D4920172E5C445959397AFBAFC0E771A3B1A111C78E9EC0E2A58B71F9F2252C5AB41867CF9E476D6D1DAA6BABD0D77309E7841EE6C6C2850B85DF5B53538337DE78039B366D927625758D5430D2ECBABABAA49DD956FC8EF4352EB0A49F353151231291E01AC7249365088C0D0D8DC2D526685247591B4357698A4C16A0B52085005B3412163DE7DADA5A5CBE328055AB57A3A1BE1EE1704878DCBDBD578407BD62C50A8C8C84515FD7209AD35DA74F63D98A65685FD086A1C1415CEABD22B90A7D3DBD686B6BC3E933DDA8ADAB45B93F88935DA750D7D880C1BE7E19C34C7E615BF01D59B880B446B605DFEDCC9933C2B21083C5ED81DBE311595CEE541A1B1B85E2D750C7649918828100AA6B6B3034342422FEF5F575721D566161DB197721E708FB85EFF8FCF3CFE381071E10CDEF12404F64F81390C5A59116E5E293278EE3F88953181A8EC34F71935C0A613BA9463E642249DC7FE71DB834D08BFDC78EA0AEAA02158120EEDC7EA7D233166D095AE48E7C3695D45DD3CF60B508CD96D1802607047F274F92623A8A9EC333E99BA465C1EC2BF277B3C8E44248669C387AE212BAAE5C960174C786F5A8F1F9C4B297B0A1F69410A88475114F8A35E26339295AB596A8B8351064567F03761C6C045F0E264E5C4E7C665FF1590D358ABC501E170E47E0740590B56544D4BCA6AA0EF1E828AAAB83123C64465C5CF47D8154320B9FCB07E458205655AC619B18C54033B0B9787012111C9A9B9BE1A2A68109C868CB93C772D120E8F0BD3C5EAFBCB3CBED923E8D45E352F0D7E5A1F04E0E198AC58B0219E062BB122645F33B2E62F54A361288A71292FA4C660163EE0E2EA8196A10BB118E25E0F1B9A5ADA947CCE7B45AF4E359D15703B4B242D9CBE42AFFE29967D1DABA00030343180987D1D8D4808AA01F4383434824D28827E3D87EE7761C3B725492456814AC5EBB12996402CF3DF32C1EFFC847A53A08DB8BA5AEBEF6B5AFE1D1471FC50B2FBC80868606691FB615FFCF7EDCBF7FBFB4D7EAD5AB6501FEF5AF7F255545C8E5EDEDED173A1BFF4EEA646F6FAFE2070F0DE0631FFB98FCDD30794CF070C2A966B1A0E9DBE5F90C387FE3DFFE053555D5D237834361D15DE7BD2E5E3887471E791F464642387CF8B000269F239BCE61F9F215387CF4283EF9BB9F40243C2A25AFFC654179BFCA20AB95ECC6FA4D1B71EEFC39B43434211A8FE1FCC50BF8FDCF3C89679F7D560099BCF0C71E7B0CCF3CF38C3C0B1737822ADF870B1A01FCC0BEFD88C5E3E83ADD85279EFC0CBEFDED6FE3F77FFFF785077DA6FB0C46C3613CFEE10F4916E8C68D1BF1F4D33FC4D6ADDBB063C75B92F5C9FBB04ACBBE7DFBE4F909E42C9EB066CD1A590C6B6B4B2C8EEB8F1B6A42084067858D71F8E8111C3A7A0C9D1D2B511508209B8EA277B80F8D754D48C65270063CF007838845C2703A191A74A2B56581164A576C10D2F58C55AE521CC6FF580373E688783C29994AC9544CB896EC5497F8BB9D22FD087B18CFECF82212C900D62CFF085CB900721E2F761FD8277EF2B6AA6A38A91896C921311A0123DA6E6A2EFBFD79C5AE62F02876B3582D69AB0FD1F8ED8AF9AFE207D53E35D1CCD51921B2348905AF7C3372BED6F1CD08A3426FE3B50569B540AD819631943B7D4DE547525BFC2B577AF0EEBBEFA2ACBC42B2D068E1A4531904CA2B313834023F9CA80A96A1373E8AB28A0042FDFDB8FBAEBB70EA6437FA87C2E88F84515D5686BA323F366F5E8B575E7E51764983C321A4B276B47574E2D2C58B280B78111919C2E38F7F147BF61DC4E933E7D0D1D684D69626AC5CB9523B9B943F758C35AD7D9F4C5419EBE2280034770D2FBDF4327AFBFAB174E972356A6C36AC5CB1104FFFE0C758D0DA8EFE91416C58BF0E8798BDD6B9542CB79ADA4A0C5EB984175F7A051FFFD4A7F1B39FFD440080E3E6EDB7DF1690397EFCB8586EFC3B175B820F772504BB95AB578926371799BD7BF7CA77870E1E446D4D3DBC3E2FAAAAABE1F70771FCF809343537499592A54C28F178F2C1C5EBC557C443A75721291A6B59CCB873A211F2BDEF7E07951515F2CE5E7F998CD59D3B77A2BD6301DEF7F0C3E8BDD223EF42C0ABA9AE166A21771967CF9DC3C73FF5717191F55EB92225B076EE7C0B8F3FF638FAAEF48AE1C20A295C18EFBEE71E59BC3EFFB93FC22F7FF90CEEBEFB1E014B566C79FAE91F8BC5BC62C572F87C6A71DFBBF73D2979F5DDEF7C4F52B37BAEF4E00F3FFB47F8F297BF8C279F7C12470E1D9636ABADAEC5B295CB6541D8B66D1BBEFE4F5F95CA2C9224D4D6818E8E4E343635CB22B9B0B3432C6CDE77D9D2A5686A6C426D7DA968EC75019A5B59D9324BD9FA34068607114BA751555507B7C38EA1C15E193CA95812A3A3315437D68A3F90CA55D48265F060706000AD2DCD82190A8C7420A788015D0C76565F6FE1217915C95F93899E4C25957FD7E6123F6AD616C5C1EE97E1F5D5E0C09E4BD8F9FC1E04EB6AF0993FF9439CEDBD8C8DCB97A3D2EE802FC76C3C17ECF4598A5F5B2F14161F9B01E2F1160AB38535CF650DD258CFB382B916D915F686F802189C13DEA95188D65534722652AFE419CD27EFEFD5890A63AFAD8F2233C4989DDA671F898CCAF6926A83E2C7640B66B2188D2524BA5F1908223A1AC64034869ACA32C48699EDD58EFEC141246825FBBC28F3FA604BA7102CF7A3BBEB94B210535924D3592CE8E810B740756510A964427613B10417621BE2B188E860D4D4D6C8826A5DEC0A2FA67E23401364B888281F7401A0B90875779FC1C2458B71FAF419048204511FCA826E4446A2C2A0F3960770EEDC192C5EB808A74E9E45755D0DAA6B2A90898D62687804D5750DE8EFEF939D0EB7F8DCC6B3DF083EBC2FAD7C022BFF4E2016EA64222E35FE18E81E1C1C1417127723ACF84170E642452A1F5D1EBD7DBDE2FA696F572E0E3346A603D072AE96FD4C25E338DDD585868666D89D2EA99EC2CCC5CAAA72D94D321847C0E33CA4755F535D87506844DC2EE72E9CC592654B05F4FAAFF4A2B9A505172E5E90EF3C2EE5CF1E1E61A157BFCCDB8B17CFA3ADAD5D3206A927E2F3F931303028EFC28ADDDCADB27D98D24DD78ACFA3C61477630D4D8D721FBA8A16B4B44A1626E3094D2DCDD276DC99F45EB9AC38F9628557C8BB30E188EE3A8E53EA7BB0BDD8CE4CA6A96F6C989378DD9CDC540F9849B338D4F1A2522E2BF9D0C0208E771F47D2060CF60F63D1D24E0C0FF54B265C269995F2ECDBB66F45CF952BB874F13252199BF800D3E904B66DDE22D790CCACBC5B43F9498B276D7180C61AD8D279E3968873C12A4FB1D47C2E8BEECB7D0885C3F8977FFC2A9CA339445349DCF9FE0770F743BF0537D2E8ACAD1316820A6C6832984E0428F6935A178D6BAD64D6009815B08B2D6AF1A74A650F3BB25A08487CB49261A902A0E24717D172155C5554C402F7D51A6C190FEC54B04E77B15C8B0A629A9265347A7359848647C45DE2743990411A9178047E4F506891E1A111F8CA2B914CA4E0F7D964E18B86A3E2A6B2331640FF77282C559FC9CA618D3CBAC1B8E68C84861089C6C42A927542760557B304C68096C582BE1640F35D255142A8674CB450DACFB96C124E1B8B57399064D6AA28EBAB7249B448496174695951327D39700CADCB58F26637626515E403893AA187D620DD0A523E4A2A99E8FC3799C99AC72EC92BD4592E4CB1E285BB780C5DCB8256E86E58329AE2270419AAE5E9D2564CF4D2F100E12BEBD80DCB1C8A41A5294C52424D620C6ABEC9122DA2FD7A97C58D27B30265B7AC7C7F26D149BD8A62C398A4151588557B60B6BB50F3E4BA85C0A8B03BF43BE43318A5C6A24E3612EAA2CA1CCCEB776BDD6D19E39A6552B2A0AF853A160BC00CE4643C81FEA101D96271307362D22F49FF6A2695118B837E50AEB03CA7BA46E92AB01C515565D59438B1E33D96092BB2E33559433311C4F92CF4B0840DB8141E45FF95017CFF9BDF41FFC53E61177CE60F3E8DCAA67A34D757A3BEA25CF9A10D614F2984AB3961E1654F069C2768BE71BE363B88C2FDCD64BCBA8134276AEA3719F70CB313A06F9116973FE047341617BF2A8B9C8A9F9FC916B063EBB66DD8B3E75DF1875314885847AD8473172E883FD8EFF52A7D912C652D999DC80C3397F885D988DC0E2B4DE06BBBB08A1FF27A34BB899A40806E8CD9634688E9DB996DCB899E67B2DF9BB965FA867389567CE9A35AA014249CC44898AC85C84015B7B72695D658261345EF27F108F943C60A1C997F91B9618A1A01E14402874E9C86D3E7C57E5D01BAB3B31D8970046B972F819DDB2BAF47C939EAB242F97C0D2D905F4C619BCA33CED763CD82C3400F591FF4C326922954949723343282744A5989A9744A5C187DBD7D2282C3BFB352B5CBE94468242C404E77006BC7114C08D0B4AAA8DB40638A5BD9B2B28040B361334EA64DAE07D086A668B54E2773CD9BE51833C74C42CCCDF2DCB3FD9CADADA5449509DB384F78D7142DB18A34E1DCFA3B95BD186CB192F7AD01B3096F34C903F2B69016F6A6E59910ABDA0E27998059A02F11C7CBEFBD07B83C188D46B06CE142AC6F69848F81974C5622DB3EBB1D1EAA70B99588AA176B59C200002000494441544A8653A9ADB7EAC7BAD8E6930D0A1E9131AA77AAAA05B7A44A254F38B6F9B62958A422242F63C35020951B4BA5B44FFE3391057DAB82335BA838107D2B8FC1C98F08905D33952134954B5FF7D839B9A91E0853F4418F4DB92D9E24C6C7462026F792F424EBE0B2B20D66A2F5F2B020FE0E155423B2523D575E4C8BBDD0279A1627B372C9523320C0804A9E089D433211477434029BC705BF2FA8448DF2E2372A38373B6E8E996889A95DA3386B6BBC00ACE92BF3CEF964078B2603EF6A1829C57DCBF38AB3D8A6023493C9241C8F6133B596987F47E7FDDD1603E8565E8CA6D20325809EA0B5AC169775525B831F66A232BA4D0BDAD0CAAC053EA7D229D73DD6B2BCA8B46F9D6822E5E76D486633387BFE026C991C7C2E8FD45C639092BE564FC02DBCD2A686FA3C5798E7A71309118D51E9E7AEBC0FD0F80767ECD9E7F84257072DD50359D921C5C060F591F2586B9072BCD729F6A9CE24404FE55A73DCD493BEFD7881DE499F7C1B1C58F2414FA293AD206D1D50D609C3BFD3C5410BDA7C8A417C12B7BAFE21DA22968398A9A8015A027E0C2A53690BC07FFD7FFE1B962F5A8CC87018DEB24A9D28E14277CF596CBFE30EDCB9658BF8468DAA1D4332A49D31EA9F2458279302E456E1F85B051C8A990A13A53BB3698B8FB1B685354BF146FDF6D7B3A08BAD7BB530CFD946F4868772F11C318B9FB53D67EC2637F1854A003DCDCEB36EFD0D6833838EFC519385772DFEF0346FA94ED37E5049E990D46F9ACE4A805CD1926C52E0522A1A8B1C80A2D1712A87C223A8282B137D5DA67393C3CA238C8297AAFAACB408C827E57B918A56AC716105879BDE029A92C36B0A948C6974F2443EE8695CB274CA4DDE0225809E66078EE79B253B805C595A9EE3595ED3BCD598D394F84B41CC3C341292E29F81B23249736EA96FC48573E7E1F17944E798890375A25B10462414128A6082B5EB48F8B73B108BC551DB508F603020AC0EA584A6E43F09D4CC9A32EF4AD6835534C7EA02B1BA066E2AD74809A067625896AE314B2D5002E86936EC7800CD6C20021B818C9FD9B02E959743952262E0EFECB9B33874FC181A17B420154FA0B3B50DA78E1E930C41568A70D99DE858D88923478FA2AEAA1ABD7D7D7079BDA8AF6F407FEF0052A93436DFB11565015F9E1266A41CCDB65A54C6D269C94023AD8C59571305766E85EDF73487C6B44F2B59D0D36EBA5BF6C41240CF50D7128C0962D44C200F76B6005A158D655202F5A50BEE0B919E908A16AA3E1EDD164AB14D05B64425359391CC37A6A51240D571927655908B66C50DCD85B6BA68CC82C44588C904C69AB68AF49B77B6BA4066A8796F8BCB9400FAB6E8E629BD6409A0A7D45C571F6C0D20F25BE6E253BD6DD62C4802AA56CE20406B61CD7C0AB9911CA59B4280D65A0DC60644A2AA24BC646BE553CE553ABB4864E44B5816825086FD20A0AE858F247B52CB92F25AC6AD635A68D6DEFF06FB6B3E9F5E02E8F9DC3B73F36C2580BEC1762FA6E1916A57CC85BEC15B149DAEC0548B78A8EF44D45CFFA9F0ABF89FA5CC914EAAC9D91C484B00308CAACA0A5551C5304344B7208FFD63EE399E7FD9FCCD148965050FBA3EA839AC123C8A8A6799E7D3572EE61F144A45E5F3CD67B6D96E82AB9500FA26E8A4DFF02396007A861BDC50EDC6E34FCFF0AD267DB9313441B2394642280F96E54154828E26496E8ACC2D452AC921958C21121D85D3E182D71380D3E156863E038E22FE220E10A4346E6BC551956A4E811DA5954F6D1F75AC9D9AD953CBC49B7483CCD3034B003D4F3B660E1FAB04D033DCF804682A9229C3562BD7CD315FD500B4E1F3D2EAA51605F526ACFCDAE96886280F8A29EB45E1A034E2B1246C70C0E5768A6605019A40CE2A3323992C2EF40E4BE180B6A66A29BCEAA67FDC4E7FBA5200536A6374B694007A868767E97237590B94007A863B8C3E68037C6233E66BCBCDF08DA670B9F1AC7972B6456ED3A974EDC663A54CFE16AA0289127C547E12EADDC61371245953D01780D3EBC5403C8BE7DF7807EB37AE432E67C7A1437BF1D0D64D68F0B9A418822885DA00D670A6C0A8FC4DC07AF24F72331F59B2A06FE6DE9B9D672F01F40CB76B71B2CA0C5F7E5A97B32E12E67713E4334560A76DED8BAE74415C9EE66F867F73A8EA8B84EBBED028467276ECDCBB17F7AC5D85D75F7D1D2E8F1FEB36AFC3C5C110362C5B8C2A560897E2ADCA8266F92829212562CED37AED9BEEA41240DF745D36EB0F5C02E8196E6266E0314DDA6413CEF0E5A775B9F1AC6332304899E3B31AC6C5B4981746685F287DF435EB5AD976554ED59EB3210507F6749F43657D2D9EFEFAD77062EF5E291EBB66FB76DCF1F08368696C407B3028AE0E8A3C29A399D7D3003DADB7BEF94E2A01F4CDD767B3FDC425809EE116264093CD605C07337CF9295F6E3C178B016CFAA14DE6E3F45D1CA68E84922A356C92942DC73A332AA1060EEC3C7556CA81FDC3DFFE0D52434352F1C35F5B830FFFD193527B6D6159995479518145FEDF5AB571CAAF7D539E5002E89BB2DB66F5A14B003DC3CDCBD4685AA2E406CF07FFF3F55E8F6E0E060CE98BBE118036C40B870168913FA5059C819DA5916C0E1CE91B40286B43F4EC09FCE85BDF46CAE6C0273EF3243CE565686B6E424B30080F83A9363A4C9870C37257AA74932A7BA54CEBF9DEA637329C4A007D23AD776B9E5B02E819EE5702343FB44CE7339898E413FACCC93A993E4093C1ACA279768B059D11F74656AC6A7AA2230EE09DE3A7E1CCD8A550261CD40109A1A1A61A0D15E5F0650027D270FB58C8B650A74DD5189C3F8C98191E2E632E5702E8D96CDD9BF3DA25809EE17EA3554A3A9BD1E398E1CBCFE8E508CAF443935E478B7F3A343BB16A55F959458AD385392570486E9D9423714AA1DD880DE8198AA06F98453FB368A872A221E8878F7CE764024C7661F517BBC30D5F59B958CD4CA62157DA2C28B351A166461BF5062E5602E81B68BC5BF4D41240CF70C7524B999A1CF443CFE78F951BCD92F046C77A5A81428168165BE5870439C5FF2EA49203F17406C28ED66E6A661BBA1C0E24924978DC4E7825638595AAED48A6D2181989C11F08C0E37628A0B66426CEE79DC98DF47909A06FA4F56ECD734B003DC3FD4A70A69B837EDDF9FE3140C76021B53424A964AA493512D0E37F8CFCBF726908574EFEAE3CD4274E9C444F6F1F9C1E17B2A92C464722707ABC48A692D8B67533AA2ACB15C06773C8E9B2F3F1585C0AB3129CE93232CC98293FE37CEF08FD7C2580BE493AEA37F89825809EE1C6A606B300B485BE26B7986755EF0D38936E47970C5D3356CADDA49B45A7702BD6055F936CE6029B239D49C2E9B08B46F595DE5E641C7604BC7E5CB9D8076FB00C417F104D8D8DA8A9AF103C27B52E6DCB81C503E8DEE0731AA9535E9F4A8104EC5B11A44B003DE95177DB1C5802E8A974B555DCDD923C61FD73329311B00BFAFC4A5FD97C69C488A672BF593CD6EA2620405326957E68D203AD99877C84EB82613EDB4FB12E5426216491E275699567695D4BB517269DD8904EA5E55E69967EC9D13542DD0D31B945BB2393C9C1E3750B485B1368D8AED4A436D44029726B49A737CF5DCCF8B8BE4BC4D4332F6A6C595055CD47F529127F9A85BE2901F42C34EA4D7EC912404FA5032701D04C714EC4130888A8BDAEAAAD05DA04EC4CE6F23C4863B60217F9DB0C6C5AEB104EA66972192D86A45F8EA04C3FFCC1830705A409C495D54A7E95F770D89CF27D474787042859099D1F1EC7E359328C7FDBB871832E0CA09E82CF6A0284046AFE10A0B9009867B61674B51E7FFD45462F0C5A30CA9AB5486D10531E8121D0D986E912404F66C4DD5EC794007A26FB9BA4854C0A89780C5EBA3838A96DF4C92A43DAAAE85950C89FC90798DAB5AC004D3EF478C506260AC81980A6B4A9CDC1C20039E1565FB97225CF05F7FA7D02D02CBB655205E9AA20C0864221B1B41954E5F7F4DD13A819B474BB0B3A21069CADCF43D707419E7FE37956D7C778155FC66F1D0B40171DA0722255FD1AF399CDACF312404F6DFCDE0E4797007AA25E2EB274C7357CF3967516D96C1AC958141E5AD0B2A5D75A125A4FD3EAF1986D8B6CC257D362FE86036D849EA69AA67E3D0EB5F9AED88A35B439E3A230006C9EB9D85D617D97E2CADCF4A313E8CD0EC05A3791D7BD5EE56E063195753C8E725E7167E5B73F13B5ECF4BE2F01F4F4DAED563EAB04D013F5AE0591D5AF053F47DE9AB2B83ED2C8201A8BC1EFF5499AB35D978FD21B75E566D59C07A5FD3677A29AC5C04AD783958132195E74F1358AFDD7E67BABFBA1B8C98B7DDC56501FAF7BAC3E662BA01BBF37CFA7DB43AAC6E8CFB5FCE88AC32DCB47C1BB91EF4F4BC74A9184F10B1A4C348426FB7D09A027DB52B7CF7125809EA8AFC705E8F1405A995729E4309A88C3E7F6C061B70B2B586D904D42B43A379F1E6D580F133DC72C7C6F054203ACA6649760D124D2ABAD2E072B388F17A81B2F8837DE7DAE17A4B45ADEC6FAB6360DAD651EC360227FA7EBA3B81C97F5F8AB764479B68D4563644CDBCF5EB0B004D0B330C86FF24B96007A8A1D68B2E6789A04A2A4DC9465D2E67222864FBFAB436B2D4BC2861CA73DD1628CCDF27E798AEF650E3756287DC213F99FA7798B593FCD3C377DD4EC0B5AEF7C1FFEDF6AC9E7AD6A6BF0577CCE5971955B774CAAB7E88D2E2CB933FD2225809EE916BDF9AF5702E829F7A1AA966D009A55B47359BA9AB566443687682402B7CFA3009A3430D6E8337503CDFDE6273E0BE7D854ED9E8C8B63CACD37CB2714FBBC6945D3476D44AC4823B4BA3ED83FB25ECADAC98E540FC8725BAA9F0D52AB4C49F6F76C51EE4A003DCB83E326BC7C09A0A7DC69868FA10CE29C8DAAC7850FFF363A1A85973C5E97531C180EEA49181030C6B3A98D3AE5FBCFEE09C63DC0809B0916DECC96747E3D24FF5A2711193A9FDBEAA336002D9DCA4D9143E2BB795F14B368F81DB31C6789CA5102E8D91DDB37E3D54B003D41AF8DF151CA3F74296CAAB4D9548233FF4C904E01188E27D133144620E0811740655940643419AE72C8CCCF68494D05EB36A9CE377B7ECDE90C4A23A06414F9E439AF91026EF50E5C13B72675D0749E74E273C66370F06FA4F491B35E565E26B10229D42506B32AD9C5BE550571351EEB55587F3DF18DA7714409A0A7D168B7F82925809E0E406B6835004D90E64FCFC030BA2EF58A9CA6CDE1442A1E466D552516B734C26BB7C325842E65818B9F53409B5CDF5932C9A63978E9122080B1B6E244D6F3A4B07752074DF361AF715A71F0D27A98718310A8A3B1A8542527487B3D3ED8EC0EA419ECB501896C0E83A151E99DAA8A3278EC904577B696D31240CFEC18B815AE5602E849F4623EB06FBC1BC64F490D376E9DA10A9DBEF8EA9B58BB7C09FEF95FBE89BEFE213CF0E0FD685AD08CC59DED68282B1B135E329762C8693E7D8CC549853B02343FD7F3454F0A7B2775D0CCB5C2F51695620A1F2DE44C3A85442226198E4E8F1F769F1FFD8924DED97F0CAD0B5A64493D77E132B6AD5D8A16AF47F63CB3F12901F46CB4EACD7DCD12404FA2FF8C8F592CA7BCC3593996397913B0A1BB7F08499B1D075F7F01BFFAD92FE074FAE1F6FAF0E93FFD335435D661456550009A60EED417319C80493CC26FF410436523E58E62FEFCDC8AE2447C2F05E6EC45A51712198921E1F4E357474E63695B1DCE1E7A57AAE02E5AB319DD1707F1E8A64570CB79DCF764158BBDD8FD9367804C6D6F5402E8DFE830BF296E5602E889BA490281AA6A88C32032E733C199FE64FA9E6D0E9C190C61289E40CFA177F1A36F7F172E7719BCC1203EF1277F8CDAC63A2CAD2C136706CF7011A0C5AA9CBD80D344AF75ADEFAD892704686A631851A2E95E733E9F9767A5E748AD53443A56217FBBEB22BA8FEEC3AE177F2D0C9C3B1F7C1F16AD5E8FF56D8D68AC2A17C287685B67B54A8715A44B003D9FBBFCA67AB612404FD45D1AA055C5106D328B4999138026ED2A95B149B5909FBDF81A1EBE730B7EFCF42F70EAD4593CF1074F2096CBA2A5A906AD01BF00B4C2760274A1FAC83C73414B8207AD426A6A70DB7F33685B4FD48DD75C90C48C368B300BDC02A7CE5D44042E3CF3F40F71E6C841E9F98E356BF1D8473F8A402A8E651D6D63005A78EE9682027966DE14A30B250B7ABABD78EB9E5702E889FA561CD08AFB2C006DFD64538AE76C73220AC8CFD32FBE8375EB57A3CC039C3F3F840A6F166B172E40402E439EAD11E7516C81F9F6B1EA5C18195293E431DF9E75269EC7107378AD34C3833607A2391B7EFAC67E789221BCFEE39F206B4BE3C18F7E14596F2D1EDDB61A7E870A148A58613E09493FCD0D746909A067A2476FAD6B94007AD2FD5910D511039A90CD124D02DD0EF13F4BDDBD641A272FF48AAA5D536D2DAA7C4E547A9C70093F4B93F2728AB921D87F03137AD28F3E8503AD2E0EC3896662C7F5D2A5A770F97976A8E23C4B48C06E439A01432A12DA8077BB2E49828B239744DA9645C6EE83D7E1C4868E46786C86D7AE3344B5152E2F7703FD5902E879363CE6C1E394007AD29DA0B41914518EB6744E2CE2443402A7D383ACC30D386C18BC7C11D54D8DC2EEE077B97416E5C14021C59841252280F9CC16676BD2EF35F64063110A38391C79E1FDF95E63717AAF9B55456DB5EA2001DAEC6F12D92C2E8422E8EA1B40DA6147675D2DDA825EF8EC7671555DB5FF1943989FDED394007A7AED762B9F550268DDBBC5023D6214C9F65523A82498D0BAB24B028383209DCBE1E8A1FD0804CA70E0E8710C0C0E03E918BC5555188AC551E3F320319A462E63436363191219E0FE071F40D0E316BB9B0129A9BAA2EF657D86626ADB447CE4D918A4C6DDD1DFDF2F6C8E6269D09B9FD9C1588062A3A7533964722995B4428952BB5D76430E9703996C066E9B1D4E5958D542ED70D891CD64A4028D18CE33B0152A01F46C8CE29BFB9A2580B600B4E9CAB12A6F045143C5CA491203B3CD582FCF9ECB22343488442A85482481742687642282ACCB0587D78B0A9F13BD97FA61B3B91008DA90B5BBB0A07D217C76FAA21990A2F48ED282306048CBB558D06732AA72B3310CCDA2C0CC427E98FE6D05A3B9583466F63D09B6196433361C3C7814239161783D1E24936994955762A06F00EBD6ACC6C123FBE1F5FAE1B0BB108B45A57F183CADA9A9C2D2254B44DB6326744B4A003DB3BD7B2B5CAD04D0E3F42281872A68CCA66B6C6A96ED6C321EE35486D3EB13800EF50FA2B6A61A9954020EB70BB99C1D67CE9C457D4D35E07221924CA1B6C28FD1D1B854AF8E448690CED9110C94C14F710E5A5D0E97A4178B2A9E5D552329063D8233C19B9F9900818906ED78A0CBFB0F0F0F4BE20A9F6726ACC5899EE337F37D16E96C4ACA70ED7A6737B28E1C1C4E3772193B62D151786C2EAC59B91A5D67BB91CA6570BAFB0C92F128962D592AAE9FCE85EDA8AAACBABA40F0341FBE04D0D36CB85BF8B412405B2C68034E2CFD646AEA657376F83D2EB43636E0F4F93392FEEBF397C3E370A1A6AA02E7CE9E41341583D3E14664348A7BEFBD1B23A1118C44A2B878FE22CACBAB104BA6104DC450555189442C86546C14B5755588C66358B7661D76EFDE23E04B4B95BC633E074B3EAD5AB5529771D24AA5BFC1A0A2D5DD62CA55B1FEDF1825B85B60629894FB4C96E9DE36449369715BA42351785D5EA11A3A6C0E649D392499CB92CDC0EF758D0D9A1A2687B53DA6E1932E01F42D30A066F8154A005DE4E22030D162649286DD413E95134EE4E07739D1171A009C1E9ABEA04E9DD36EC795DECBA8ACAB123F66369313AB3AC98AD699AC54AF26B8C59369610890C9918AC7E1F6B8E91F91EB5704CBC452A7C4A7CBA500301E67856D2F2A2ACAB5756D53996B37C01098CAB829D6B1E03B50098E0B171790E2925353B9F67C3B568BD7A9B6CDA470E8D009D89C6E74779F40477B3B7A2EF5A2A23C80F2CA4AA4B34082C5187C5E2C5EBC080E27DD5F6AE72372B225809E6FDD7BD33F4F09A08BBA708C5603DD0B742D307143A76767ED0E49F0A50F9AEE896C2E839CC386483406AFC72BA0ABE4451904A4C75A4DDC0C7248C69270D9E89F760BE14E94D278ACD6F2379AFED6FF67A9256DA79B4351BA7E13205DB09E0B8B026B2D46225111BE77389CD75830741EBC296070D582925735993F13475BBA2C7ACBC4A3C84804FDFDC328AF2BC7C8E808827E1F92B151385C6EA45336B83C1E64D259D4D5D5283956FD8E2C5D5602E8F9D3ADB7CA9394007A829E2C408AA49B15F4DBB5EF98C4BB6C2E87583C86803FA04094D79413AD4AD14A00BAAFAF0F35B5B5CA8F6B8E9D57A389CC06C55C3165F814F92C8B4874146E97072E3BAB746BFAB0A4BC2BAD649B2DAD45B259A84083974E7B56893EE48D5391E437B415986ABB16893AA9BE37B256BCD8EC72224B2E8EA976D8AD7F7C09A06FA08F8DA5C9883E5D14DCFE5FEFC3E3E9D3A4ABA0BCBC5C0E9D6F013705A4053109EA9088FD9F03E8A70D87A3A8AEA840369785CD9E838D991DDC55D8B8ABE07159D88487E82E54275170AF417C7641EE06BA73CE4F2D01F49C77C1BC7B801240DF4097185F2C7DC8F41D338836990FFDDB1315339DCC7566E3987C6C6BCC2F6AF7C03250DCFED75697C366CF22934DC341956B9B036956D2D68C13BB3DA74B4631A14771879539AE2DE7796A40CF467B4EE59A25809E4A6BDD1EC796007A9AFD6CF555533BB9AAAAEABA1434636D13D445285E3336E69B05ADCB2D5ABC10668BCF6018039F718C8E2624804981A074D626AA6ECCAA64520FDD3D4A9F44E5E411A045313B67716D94007ADC515702E8694EC65BF8B412404FB3738DF54CA0E5EF8180F23F4FE4E2E0314C46E17953B1BAA7F998533F4D6B5118DF3B839DF46F30304A39215AD197C254B8F34B709330ECCB66E191231CF2BDF2DD98D2BA5ABD4FDC26CAEF5EFA8CDF0225802E8D8CE2162801F434C784B1A0E9AEA0F52C9834098036B7236D8D205D515131CD2798ADD314181B4D0A072D6206426D368CC67B319208E1DC6800478F9F83DBE1823FE0C5C39B57239849C12602C95AA5420AAF2A0057556398B5A7407CDE060967AB492779DD12404FB2A16EA3C34A003DCDCE36597F23232302B246A7E29AC555753283D5D5C1602113546849179F3711D84FF3B1FFFFF6AEAC398EEB3A7FD33D1B96198000487011297011C5454B28D9946C2596652B6549919D384EB9E24A2AE507975FF2903757C50FCEB32B3F2029BFA4EC2CAE9415DB522A2E57D90E1D45916849259292B883A448821B4080008101304B77A7BE7BFB0E9A43806800B3F4A04FAB280033B7FB9EFECE9DAFCF9C7B96079FA6FCCEBA7810CB4E68AFB1F61F97130E4E9C7F0397478F6143F717F0D0A603AA1605D269DCB8318AC38FED43C6D6354A74F08A1FF15235987524882ED92A1B858B294208BA21ABBAAD2F2A04BD06F5D102662CACD91C0C43AAC124109342CD880E15531B38C25C6B0DA22F79AA8EE208C4D825748954D2EBD9B10F7179E202B2B35BF0A31FFC18A55219CF3CF71C9E7EEE796CDDB6111BBBBB90F12A2AB1878DBD8CA5ACC3F5745D4F4DD0E2E610826EC4EA5D7FD714825E834E19BDC10242B482550534D75DB25E466D9D65E31261781EDD1D4C0059CE0A5F83A8A14E5D080366BC327DC624D38A8AE7F6BC044E5CBB854C5F0FFEE39FFE05E78E1D43D24A209BCDE0EBDFFE1B6CDAB90DDBBAB2E88483A44AD04901AE6F29FB8D6884961FAC06B1A0432DD3580D12825EA5BAB9D1471785215643B8612F67089B3F49F4DC640C43F461AFBFFA71B495FD2D4245D0BA0B8C0B1B97278BB83659C4F8A55378ED9F7F849495C0D0DE3D78F14FFE14835B366273AE0B698F232BB012C985D03A61E650EA10820E0553AC060941AF52DDA65F9F21E80759CF668AA0156D5E23D1D382E6F548D2E6688D8B43BB21E8E470FD08668B49277C95858400FCDF893340CA4269BA8099A949EC7EFC494C8FDFC6A30F6DC240BE473936D4366095947D67F62A718ED36942D071D276B87B15820E87D37DA30A05765249AAAA66A604E783EA232F46E086B04D71A6818181FBCA8DAE52BC559EA60BD8B3294145D5AA066CDDB81CAE0D94E161D671706A7C12274F5F82532C61DBB687F0CCEECDE84B02535333C877E7914EA5AA6E666E369A2DC10856E258254E8D394D08BA31B8B6F35585A097D15E2DE91A526597918D1B37D6A5B29B890861C20BCB8CB6D68AD6511B7EC2B70EEA60E127063DB3671F8B3EF9A9E0D38522F2DD19A4548719864BBB989ABAABFCF2A95452557A73136C4BA0CD6926B2E83C1656E7D3B5AF9B51E3BA5D3EA042D0EDA2A9E6C92904BD0AACB9B1C7FA1BA676F35A36F7826E0FFAA26991332A24485C8BB946562176F853FC56D79E5F418FAC5A761C5CBA7409A363A3E8DDD087D9B979CC146690EBEC84C3D2AA95320E1F3EAC8899D12D74DB64B359A4553303D35C9517B6EE0B297CD0378FF042B7FF4821E8F6D761BDEF40083A24A2411261720AC999A171C17654DA4A5CDD8E984901A7EB84D76EA56559BD57538AD3F354079123478EA822AAF3C5B2AA913AB87933CE9D3A8D6DDBB6A96251AFBCF20A9249EDD0A06F9D0F1C62A41F644C05E73B0B31D04D7FF084D475AB860941B70AF9E8CE2B041D4237412221F1303985D9838BB93F5643D00BF5973D657D1A2BBA5ED70F718BD5219A933DD57040974ED52DAED83895244CAB982DBFE8B5989D2F229B4C2952360D0554E2A1DF63918D5519E962AAF79987CEFA6A9BB512741F3C5608BA7E58AE972B094187D4A4214B5A923C4854F5F86A1E24E7A0E5C9ECC4DAE6B121455DD3304759BA09CC4C4F63F4D6A8DA0865A623AD60126DB15452644CD7F486BE0D9818BD8D64D2561D60D86D84E75A960DC7A9A807CDC040BFC2890F1EDE8FA959C26F0C613657D774336D76B210749B29AC09E20A41AF10645ACFDC04237105ADE5B59275B0AB371F022605DC34935D8B9F7B25B7A802ED5C17C3178671E9C245B56939323282679F7D16D7AE5FC3E8D818F2B95E942B15ECDAB513273FFA58954E257953C6DEDE0D989D2D28421E1A1AC2BE7D8FFA1D615C65819BFA23C46FAD98ADE4BEDA61AC10743B68A9B9320A4187C0DB100937BE4832267B30C4A9AB1EC2880E6345378B9CB57363E1A8F5A607DF33A3CE9F1B56FDF9745B2E761E27C1EB9F8B1DC645440C4D03DAA01FBF99F7BA6AE534E84421E80601DBC69715825E4679411704C985D66D98D2A26B5D132605DC3C0C9A656D3E88A06B099C7FDF1E63B8E1BDF1DBCB35B835F5B0F9D37C1B09E265489AAFADC6A7BF56EC5B75BE1074AB908FEEBC42D02175438234AE0786C1359A386A53C01B3D9F81613982AE1D37363AAAE2C16BADE0A5600D3E68983D4997870EC74B575D1E718D8F16820EF9618CD13021E810CA36A4C2E4149348D268C2E49CB4A24962C178EB10E23675C89D3BDA15C32494B0EE09DE5B30B392E1787C8D81BB162900001A4049444154BE6C1E41BF7BA3716E2A58CB4C26041D256D44431621E8902E0E12E5CCCC0C7A7B7B1B6E3D2B57821FAF363535A50A329994F2482C9B8099CD64954C86A1763AE5DDC8BE40ACF77AB24D0661ED06ABA96DC2CD4315CA1733F706EF57083A12AB3B524208418750074985C92941726EB4656708DAD48CEEEBEB8B0E690508BA582AC2F39C6AD8E1BDC41A68141BC03918571E246CFECE68106669126B7DC326E93C5C0250B5DE47B5E9ED92CE167F4B343ACD0384A0437C18633644083A84C26B49B2591B76C61A25617183921B6AB59665ABB3F118D912DC385D0B36C158735EB3B3AB03764AF56841C2D3ED6735267E2D269641F51C15776DBA863B7E7126DDD5C5EF0DC0D2D6E6CFEA2FAC2A42F28F4E871721E8101FC6980D11820EA17013E35B1B1616E2D4350D0986F791B0160BEF6BB425BFDC0DD48BA0CD83C63C94F850E43DB31A5E67A60349CB062B9F7A16EB53EB46B696B2AEB5CDECB239804532D76F576B5A93867DD7CBBD36B85FA62F421D5E84A0975B6DF17B5F087A199D932848D0246753507F2D5662D825169C83BFB34607FDD0C1F2A6E65ACD906729B949D0C4871B7C613709578241B154C1FCCC3C726C6890B6E0582E1C38AA821E6BEB59245FC743C54AC24BD848A9668A34B17557716D25F3BFE8B83296BA7F21E8B02B233EE384A043103443C1B851D78AD4EBA04539393909FAA2A354AED324EF045B76D5BA61C27C9C82BEE885FB634D265AC71EEE4C4EA033DB815436A34A9E6694554CFAF52D68DFCD61AB9EB7B49A3D382A21DDD38D6C49D0EC101374778411AC896384A09B08769B4C2504BD8CA21A69213E68EA60828C2169F595DF4FEEA86D32DBAAF5669277D6DA53B1F67E15492B9F06E0D97464B8281766E114CBE84877C29A9CC24CAE1B1FDD1E8753B1D0DDDD851D9B7BD063695BD94DF00C36A97591ACF657A475AD9D22EA21D22AD0969857083A620A89803842D0CB28C1902209886444626C864BA136D2C158A5B4A2E94E08D6B268863C4BC164B202CD378CD5CAB2E879BA3088F24393582DCF815BACE0CCAF8EA0F0FE47B832B811BBFEFCAB48A73398B85BC4D8CD51BCFCF45ED53C8087A5AC67DDC04B9739D5512542D011601E1121140242D03E4CB504114C4E09B6A2325FC55B55AF99F1C2B5F5405AB951687CF48C5D262675F743935B13AC7CC74DBD0AFB6E61E49D6378EB07FF86A12F7D0EBF99B88AD3A72FE095575FC5F6471E452A9DC6C19DDB91F4808C4FD2FEAEE1424847A0E64894AC68B1A0437156AC06094107D45D1BB2468B99C929CC9433C76A2DC47AAD2ACE4F994CC81D2DE9561FDCC0E4266AB081417D64F254E406095A15FCE77F151709D7C66FDF38824287837FFFD98F91B26C58C92CFEF6EFBE87A367CFE3A5E77F1F6CBF9BF1DB75293F89652C671DACA77DD7B4A7A343D142D0F55935EBE92A42D035041DCC8633A5455927224A046D6A58F0C1611E18ADB4A2F9C0A0056DFCE2F594457B925D381E89D456D11BE504F0AFBFFD0076E90E7EFDDA6B48C38395CEE23BDFFB2EDE3B731E2F3FFF1C3A01A41CBFBBB89F2F73AF6B43C778043BBCB4FA832D04DD6A0D446F7E21E8808BA3563D2CF969A226A2A23A43C84C01A7151D2C32D42A190D411B6BBE6EDF32940F5A7B265C8B492934842D14011CB97C133DD92CDEFFCFD771E3E2653CF3D21F22BFE361F4D8C081ED5BC1472ADD1C2AAB4539A46B7DCF42D0AD5A2F326F780484A06BB0326E0E5AA9FCC7D2A2513B8C1F9CE9E76CBDD52A7F387131E9D92646BBDE998D2E5D1ACAB74DA704D9DAA6271AA3E5124E5F1A41A2C2C24B36BC149D15653CB76F0FD2AA73B8870493597C4786DA1C24D157B70B75B28B6ADF1591432CE88828224262C490A01D95286C2A3C2CE8827E4EDD7D9A9FDB994201D94C56258698C35460AB9B85B88A85A0E6A6FC1E502A1751AE94D1D1D5093B9888E117A4A8D6A558C53C614FA13CDCB4646E08FDD024418561E0026BF1F2BABC515ACE34A399BFCD8C410FA8242B982C7B98982B29C24E5B16367565D1AD1257D831C090B4329F75F44640109277D5C5B11601C30215629C1074089062362486043DEFB99ECE3A5309673A820B0C0FD0A462A970BAB95211D94C17526C0DA238628172AA7EEA45164BA33FEB7E029D929B8D5DA79D0252D9343ABC8CDEEE523B601E5C2678D0DE24AF3570512B1F71C5C5EC0CBB91F7E8441076555173EAFF2B7AE48B46BE15C85345DD4FDF666CF4ECDCBCAAD151745C541C0756D2865B7190B26D589E07DBB254424B523D6CFD4C421F8460BCB5DA206C24382BB84F0E15825E216031181E3F82764A9E972041EBBD7C9D154CEBCAC31C803BA5044AAE834ECB435FCA46CAB706FD720EF72D89A0A5B80AFE59E11273E0B03810237C5D5B65D9158A05D5713BD799F71F24FE25FD74676579369085B48BD7C3E4C4846A22ABFE4C300259BFAEC43024A84CFA9531A28AE2F04FE35CACC97DFEFCB0B2DAF9CF7CAB617C38372A1DD7433A93C60B9F7F1EDD5D9D7ED956F59D434B44B787C52EE47E14C70AE559A1C256345C087A4570C562700C095A9954CA22AE241CD82E29CCC254A582B74F7C023BD78B59670E994A199F3D38847C92E6203FD40BC4122C36DFDC55C2788692AEDC9648AB9F9EE3E2CED42472FD7DCA5E65B43013356CD6AB509974FCAB717E568FB58B2C6074EC16FAD95945398F74D1A2FBFD1CC6031C1E35B3CFA7FDEE50DDC2C7C66EABCD517ED3E1CFF1F171B0E8FFF6EDDBAB354B060737AAA812EA8AE7A5923AC1887F47250BB3160521E8F0EB222E23E347D06ED9D33519ACEAA6D1BCE7E167EF7D8CBD9B3701E3D3B0520914B2294C958117F7EF40B65A70472F8B051FB4F16306974BE3C850CDEDB8EAE162D92CB1E9A09CB031512CE1BDE14F7073741CE9640AFBF6EFC2EEDE1C3624696B9B0CBAC62D69D22EBB7DB3F5959A8D66AFB14C83D6B311610546343339B9594BAB9751222457A6DF1B1D9070E9FBE6181E2A3BDCF3E0382E52295BFD549BA89EEE7F58CF4EECF5465408BADE88B6FFF56247D0AE57F1122A77D8521667C90246A6A770EA93EB18F9E863BCFD8B5F2291B4F1F9AF7D155D5BB6E0C583FBD1D7A1E3A095CFD22F466CD21DEE351339AAC1046DC2CEE0AA99EE3816FEF7E333D890EFC0F8C83564D25964FB7B91B5D27862E73674FAB5291AB354751C1C6DE6F1094694F4FBFE66E35509FA277C095640CE3CE3F8F1E3CAADC1547292F1D0D010AE5DBBA67A199A10C303070EE0F2E5CBEAFD99C29C7275D0E5C15661C5E2BCB2E653A9243EF399CFDCE3DED0AE93150AD41820D55585A01B086E9B5E3A7604ED798EB6A05D4DADF33670FCF20564D33DF8C90F7F885B978651725C3CF2F4A7F0C24B2FE1E1AE0E3CB471A06A102E94AF34DFE16BBDD08D25680ACD4240CA8AF62C1CBD740D76BE0BFFF3D39FE3D4BBBF83E759F883975FC29E834F62E7F64DD8D29DC5421C4ABD57A99FE1974860FA6E011D1DDDB06C0B3458B57BE3DE5863E59959A108CC5234444A2B59F9991D47FD23B9F21F236D6855F3A828CB39892B5746B075EB163F0E5A47E7B086496D8D1321E8152A4486371581F811B44317874D96536CE1D8C0E8DC1C8E9E1DC19DEB17F1D61BAFAB68802F7CEDCF90E8DE882F1DDA87EE944E90B827BCCE2440282B2C48D2F78E0BB31915BC6EEDEF55AF80BFA9692C56156DE2026F0E5F44DF96417CFF3BDF45D6E1A69987C16D5BF1EA37BE892DDB366247AE53D5A45074A9FCB87A93CCFC1DB61BF762ABD2E4913072A2529855E9D8E9EE2E78094BF9C22D86C7298B9F51257456536A53CAA8A9EBBC2D26130BBA2DD4D454216347D0954A850E5C05B2CD0D242B81622281374F5D40AAA313B3B76FA22399423ADF07B752C1338FEE408A9B4B9E0B5B75F530A163A6978776B71A2226411A023485831EF455BAD6A20BA66ED7BEA7B600FD5E4E092F05D74DE0DDEB37E0E57378EFF537F0FE7F1F612D21FCF15F7C039BB7EFC2EEED8318ECEC408AF6B61FE35DBBBA6AE75BA945A9D0703D788EA3DC0E9DB96E1D2143EB9658F077D74182CF4446A024583BA4C1DF329AFA11AADF6442D0F5C372BD5C2976045D743D8F2E02C619247DE2752C1B775D17C33727706D6C1C5EB18C3DDBB762E7602FBA98C5E617EA0916D8B9A76A9BB2A6FD98DB6032842A36CF4A6CFAABF8830EBDB1C5FE7ABA225CF058207A96DE2C29D746C24DC3F312B8E539F8AFA3EFE185279FC4F4AD51D8691BE57C0FEE8EDDC2A71FD98DB40B24594FD9B7F88316B491CDCCB5AA080707A824B42F7F62721A03BD39F50C49D38BE4D2B5A0BF61A8C817858358D04BAD0321E8F542ABF5BB8FD811B4532E79A53289308D644A87A9D16FCA2E1DC58AA3FADAD95602F3C522D2990C922467CF53197B3A1A2001DB4EAAAFF30CBD23499284186D40FF68B95442369B51244BBFE872D5E64C8D69E372A8256665A092DC2CCBFF99D08CE827CC955300BDB4BF7CFB0394ED349C7209DB37E4F0E9038FA033E122AD73F096B5A06B5D1EA1961823265C4DCEA373B3B83D5F462E6D63534727BA123A7E84563FBD49B4AA19CE28F4BC34B242D0A1565DAC06C58EA0DF79EB4DAFEC59982FBBD8D0DD85345B28792E1EEADB80B3C39750283BE8EAC860B23087439F7A1297872FAA780FC6DAB22EF4DCDC3C2C2B895CAE1BB3B373EAB57C3E8777DF7D1F5BB76E4661661ACF3FFFB9257DBD8BB9188C551BB46883196F869C9565ED5BEB8C70D639282E2A4880B10A455D551359A63E7313112E6C4FC7FFF261622C5A3FDD5089A25FD316BBB6F4C3AF7FBA37E65DE0D2AD314C4C4F31425B65EF95E74A38F4E81EE4D84351E703F9BB830B73859F253E2385A0E3A3EBB0771A3B823E76FC032FDD95C3F0C54FB03197836301C96C12071EDA815FFDFA0886F63D8EE93B13C8E63AB067EF2338FDE10994E68B2ACC8B110503031B71777A468578CDCFCD2397EFC19E3DBB70ECF80995A4D1D991C5534F1DBACF0FBD948B23E802A10FF7CC9933B87AF52ABEF8C52FE2ECD9B38A34E7E78BE8EFEF53997367CE9CC281271EC77CC9414F771ED9245D301EAE5C1D455F6F2F7A7ABAF1D63BEFE0D52FBF823367CEA2B7B717232323989E99C1407FBF8A6450E9D18904F2F9BCFA66307C7E18F99E3C7AF23D3870605FD8B5A3FCDD57666671E5CA75607E16AFFDF4A718DABD0B2FFFD1CB3871F23CBEF2C267D1415F3F5DE7DC3134E53D57F010082DCC3A182804BD0E9458E75B881D41BB9E3AE0F9BE61137FA1929395C354D7DE60FA343710932A7A630175638D9A6408DDE95B338EAB7A946A3FB2B1481F14D6A532DB54676A3D7EA630AB48F9DCB97378F699CFAA9F2CE5D9D7D78F2B97AFE0C9DF7B0263A3373172ED1A868676E2EEDD02FAFA362093C9E2C30F3F52963C93360A85691C3A7408BF7BF71DCCCE16B17DC70EDD5ED571914C25512C95D099CDA23B9753216AE7CF9D4757771776EFDA8D271E3FA8657F805B44B94318430EE0DC5411E3D7AFE3C7FFF07DCC95CA989DAFE0AFBEF5D7E87BF800B6E69318CAA702F54E74FCB91C8B2320042D2BA31681D811F4F9F3E715DDD267FCF0C30FAB9FB48C754AB0A732D5F81A7DC76AD38C111D696EC84195F6BC79F326CAE5922236BA0776ECD881EBD7AFA9F7151907089AE7F3DCAD5BB7AAEBD586B4A90705133DFCD03766C1954A25B559D891ED52F3738E4A85B66A02994C0A6EB9A21F1EA43A5BC56720954EE1D2A54FB065EB566432695520890366E70AB06D1D23CCAA70D94C465DB352D131C4B69D50F75729B350947E0A7564B2DACD714F18E1FD26AF8A21077072BC88C2CDEBF8C93FFE3DE6E6CB28961DBCFAF5BFC4C3879EC54036815D799DFDC7F99547463609976421216821E8D813F49B6FBEE99168E92E2041D34265F17B5A9EFC9D044942E9EFEFC7F0F030BA733DEA3DFEA3BBE0C2850BAA4634098EE43B3838A8B2DD98B5A6D28ED34945DE263D99AF1D3C78F0BEBAD224653E08CE5F3887E9BBD3CA821D18D88472A98C8A538153F1303D338DFDFBF6A154AA2837453269034E45B9288676EEC2E8E82892A9140A73F3B83B7D57F9C39939373D39A52C6B1AE6A964466F5E96CB608718DE1BFFBE78F1220E1F3E8C1B376E546B3A531E62532997D0D1915561737BF7EE55F7597B180BFAF2DD026E5D1BC5AD8BC3F8F9EBBFC0F6A11DF8D6B7BF89B73F3C872F7FFE307A1823CE8D54B5A1BAE25A49B1FAC40A41C74ADDA16E36761634FD1BB5E165C10D39A246174530E42D18A2466227599BD03933AE36CE98EF93144D14C762D63309F1F4E9D3EAA1C07FECDE423224F16ACBB78CDDBBF78085F9F91061E4085D138C2EE9E9EDC1E4E45DCCCDCFAB9E89F45B9378395FFFC0065CBA78117D1BFA50762A4A5EDE130997D634E7215993D0F910E2C3850F15BEDFB7A11F85991935376B5790A0E9ABAEF5A19B2495390F78E7CC0574F6E5D1D5D1A922368E1DFB085F79E619F464B851E920E9A54CE5D185E6DAA19667BC060941C74BDF61EE367604EDD267507304134A167B2FB891574BEE663CAFB1D47BC16B9A718B95BC34E76BB237D97E2ECAE58A224FFA9855E2875F1744A7CC040BE4EB8A6FCA276E0AD2FB19901C4792D70D704D63023D4FD54FAE2F56756F185C82B1D3E65E0C8844932DA83EBA7C1D33F3F39C1C7B87B661A38AE0609B2A172955299F5BA89EEA8EB2F284EF304BB9FDC70841B7BF0EEB7D07B125E820F9D426922C966E1DB48017CBBE3324574BD8C176548B5D3738BE4A7E815AC5C1EBEA303B5D3E53156B0A9440D5A52F34F1EAF86B86D731494687D95589DC1F137C9804936E4C213A52EA83926C4CE49CC79CEE40C53A971983AA0EB47E58249978A38BBBFA0DAB1A5BFEB4DE1F90665E4F08BA9968B7C75CB1236815C2D1D687B19B79134B45442C3F466D50FA641D7CF8D0825616B3FF73B187067DF5EF1CFD1D0E1FFE347EF59B5FA3B77740C5896F1BECE356264E9E3E879D3B3721DDD1053BD38DB9BBE378F1C51755676E5BD5BE5B386AE3BD837F2F977DD9D66A5C447821E8F5A6D1B5DF8F10F4DA316CF21582CF97A5028A971F1374A704DD2DAE9780C586ABBECB267873E69B067DE2C78E1DC7634F3C8EABD72FC36635B97205C5E919F40F6C819DEAC0F5AB17D0D9D589642A8B5271164F3DFD292498A5A92EB8E062D186FFBDC932B5AF3519E0964D2704DD32E8233BB110746455D33CC1744CB7A33B8DF83E6ED7FCCD6E8DE5B2DA44341BA224F772A5825426ADE2B8E9D4D0FD1D2DB82CE5CA96526557D500A14B867E6E8E2ABB096493DA2362AE1574F1D45ACFADEB5CD33CEC83330941B706F728CF2A041D65ED345036921F0F5AC58CE8387AF4A80A05B493696CD9B219B76EDE5011218C5A21413FF5D453AA50FED8D898CAAA64EFBF62B9023B69236927E194CB38F0D8019C3C79168FEDDF87131F1C47672A0D381ECA968B446727C6A7EEA2336561433EAFA256D8818507A35618D1425998E938373787FDFBF7A3A7271F74B337108D685C5A083A1A7A88921442D051D24608596A1DE8ABCD9A0EBA15E853663C3463A027EE4CA1B727AFE2A949A2268283EFD1B5A1B21FFD3E7F1B376DC2C8D5117477E7904EA754ECF4F51BB7B065EB364C4DDC56EDB79814532E17D199CB01B68DF1DB63C8E772EADAE63C923E235518BBCD209BD9D902B66F7F081D1D9D42D021D6840C59BF080841B7996E17DBE15C2D49076FDD10B6EEE9674A832E9429E5D860E53D1D8EC75AFC3AFBC475746951169E4AB01722895C0F4152054DEB71AC6A67B60955A968577944D4A1B331F5DF26A9A51EF7D62E2A160BBA5D34D53C3985A09B87F5FA9CA95AA96EA16ADD222F2DB46E8C13E3AE50E342D02B042C06C385A063A064B9C5F6404008BA3DF4D44C2985A09B89B6CC25083C00012168591EB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4AEFBD0E6C5926411AF570484A0D7AB66577F5F6241AF1E3B395310A82B0242D07585735D5C4C087A5DA8516E623D202004BD1EB458DF7B1082AE2F9E72354160D5080841AF1ABA757BA210F4BA55ADDC58BB212004DD6E1A6BBCBC42D08DC758661004422120041D0AA6580D12828E95BAE566A38C80107494B5D31AD984A05B83BBCC2A08DC878010B42C8A5A0484A0654D0802114140083A228A88901842D011528688126F0484A0E3ADFFC5EE5E085AD6842010110484A023A288088921041D21658828F14640083ADEFA170B5A6A71C82720C20808414758392D124D2CE816012FD30A02B5080841CB9A90280EA966279F82882220041D51C5B4502CB1A05B08BE4C2D080411108296F52016B458D0F22988280242D011554C0BC5120BBA85E0CBD4828058D0B2061E848010B4AC0F4120220888051D114544480C21E80829434489370242D0F1D6FF62772F042D6B421088080242D011514484C410828E90324494782320041D6FFD8B052D9984F20988300242D011564E8B44130BBA45C0CBB482402D0242D0B2266A1110829635210844040121E888282242620841474819224ABC1110828EB7FEC5072D3E68F90444180121E8082BA745A28905DD22E0655A41407CD0B206964340087A3984E47D41A049088805DD24A0DB681A21E836529688BABE1110825EDFFA5DCDDD0941AF063539471068000242D00D00B5CD2F2904DDE60A14F1D70F0242D0EB4797F5BA1321E87A2129D71104D6888010F41A015C87A70B41AF43A5CA2DB5270242D0EDA9B7464A2D04DD4874E5DA82C00A1010825E015831192A041D1345CB6D461F0121E8E8EBA8D9120A41371B71994F105802012168591AB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4941B954F40841110828EB0725A249A58D02D025EA615046A111082963521511C9EE7C9321004A28880107414B5D25A99C4826E2DFE32BB20504540085A168358D06241CBA720A20808414754312D144B2CE816822F530B02410484A0653D88052D16B47C0A22800097612291A84AC2BF4F9E3C89BEBE3E249349F57AF0FD08882C22B40001B1A05B00BA4C29081001632B18220E5AD0B508895D11CF35333838B8F0146F22042D99D4FF5048144713152D532D8E80EBBAB02C4BBD69ACE95A1747D08A16828EE74A8A1D41BBAE2B041DCFB51EB9BBA6E54CE235047DEAD4A9AA8BA3D6051239E145A0A620202E8EA6C02C930802F72250EBDEE0DFB4A0FBFBFB914AA5EE717F88F51CDFD5133B0BBA52A988051DDFF51EA93B3756327FD2DD71E5CA1574777757370983C20A49474A754D13A6AFAFAF25EEE0FF0766F1DC443B7D42440000000049454E44AE426082 WHERE `app_id` = '7';
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D077814451BC7FF77B94BEF8D143A842EBD188A056CA8F40E52444405C52E62C5F2D995265644451114456C6001A4F7DE413A2421BDE7FADDF7BC7399CBE648729BDC5DB82433CF1325D9D9D9D9FFCCFEF6DD77DE99514024A1805040282014F04805141E592B5129A18050402820148000B4E8044201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540185C562B17868DD44B584024201A1409D56C00668C1E93ADD0FC4CD0B058402D7580185E26A8786C26C36330B3A3D3D1D7BF7EE8556ABBDC6D51497170A0805840275470102735C5C1CBA75EBC66E5A0A6A0668B3D98C356BD6E0EDB7DF46DBB66DEB8E32E24E85024201A1C03556C06030E0C2850B8CC12A95EA6A40EB743AFCF8E38FD8BC7933FEF7BFFF5DE3EA8ACB0B0584024281BAA3406E6E2E060F1E8CAD5BB7222020004AA5D2066985C964B2141515E1871F7EC0CE9D3B05A0EB4EBF10772A14100A78800204E881030762C3860D080D0D2D65453340171414E0FBEFBFC79E3D7BF0FAEBAF7B4095451584024201A140DD5080003D68D020AC5DBB1611111150ABD5A52DE8FCFC7C01E8BAD117C45D0A0584021EA68014D09191911503FAB5D75EF3B0EA8BEA080584024281DAAB00F7419305ED10D0AFBEFA6AED5542DC995040282014F03005F2F2F2D820A14340EFDEBD1B02D01ED67AA23A4201A140AD5680003D64C81001E85ADDCAE2E6840242811AA900B938860E1D2A0FD0AFBCF24A8DBC495169A18050402850131520400F1B364C00BA26369EA8B350402850BB15900DE85DBB764158D0B5BB3388BB130A08053C4B0102F4F0E1C31D5BD004E8975F7ED9B36A2F6A2314100A08056AB10234483862C408C780A6A9DEB367CFAEC552885B130A080584029EA50059D023478E940768B916F4C90B19389394E559777A8D6A131CE083B64DA31116E4E7B006B4BAEBD1B369B89496EB306F5DC81011E28F4E2D63E1ADF2AAF0760D46338E9E4B45727A7E5D9045D63DC6460431ED1CA582223D8E9D4F43464E91A3ACE2B80B15080FF6C375CDEA21C0CFBBC252C982960DE8975E7A4956159FFFE41F9C49CA9695B7B6670AF6F7C1FD83BBA25BEB7887B7AAD519F1C2676B71392DCF61DEBA902122C40FAF4DBD05D4992B4AD9F91ABCB67803923304A0B94E31118198FBD89D0EBBC9B173E958F8D34E64E60A403B14CB8519C8607B6A5C2F348B0F7708E851A34639B6A077ECD801B9801EF3D20A84852831F016C756A30BEFD9E38A3A7DDE88AD7B7578704837DCD8A9B1C3FA156AF598F2C62F68D64885DE5D7D1CE6AFCD19761DD4E3F86903E63F7127A242032ABCD5F49C42CCF860B5D0AD58A53F376A909A61C6B2574738EC227B8E27E1FD65DBD0AB8B0F9A375639CC2F3238AFC081637A1C3C6EC08BF7DE88364DA21D027AF4E8D1AE07745CB4171EBF2FD8F9BBA9C125EC3EA4C30F7F14C907B4468F296FFE82AED77963D4DD1543A906CB22ABEABFFC53842D7B7498FFF89D880A7300E8EC42CC98B35AE856ACECC74BF371F6A25116A0771F4FC207CBB661E45DFEE8D6BE6E1B05B23AA60B32FDBD59837FB6685D0FE8175F7C5156F5C6BEFC2304A0010EE80706779567416BF4B8FFAD5F0568007040CF7BACBF2C403F3A778DD0CD0ED0DFBD32DCE1F34A16F407CBB70B403B54CA751938A05F9844167494430B7ACC98318E2DE8EDDBB7E385175E9055CB7B5E5929000D09A00775419F8E8D1C6A57A43560EADBBF551A34B42D596A4A167C7DBD111651FAABA5A2631555283FAF083326BD872F57963DEEF0DFF18B58BCF037BCF9E1F40AEF6BFE9BCBD1A75F2774EADED2E1FD4B337040CF7DF40E4486FA57782E0D703D36EFCF4AEB4685EA7406688AB4080D0B2A758DB42BD9888E094351A11626931941C1D63AF4EF3103F562C3F1D5AAB2239AE8F89A9DF32B75AFAECECC2DE86F5F1EEAB0E8BD279231E7FB1D02D00E95725D060EE8E727DE80D68D232B2C98967B1E3B76AC3C403FFFFCF3B26A39FED59F05A025809E4A80EED0D0A17604E807DEF9BDD2A02198DE79FDA3E8DDB7E355C0ACE898BB014D909BFFD6720C1BDBB7CA809E33E37659807E7CFE5F95D68DEE7FFFAE9358B36A1B9E7BE3DE52728CB8E559AC58FB1656FFBC155792333179FA401BA02B02B02701FA9B978638EC737B4FA660AE00B4439D5C998103FAB9897DD0BA9163408F1B37CE31A0B76DDB26DB821680B636277771DC3FB0336E906141D320E183EFFC5169D0108447DD3E0B770DE98DDB06F44042EB9297C16F3F6EC6D67F0FB25D18B8B5BB73F31164665843F982430218D8291DDAFB1F2E5F4C63FF26AB975BD0E74F27E3D8E173B63E7AE7905EB0B7A0A565D2714A3F2C598BB57FECC4F36F4E46A3A68E43BEA40F01B7A03F98719BAC41C227E6FF5D69DD2A0BE82DEB0F302D67BE369155F5F285341CDAF71FFB77EF9B3B62E7962338B4EF349E7C691CFB1B69F4DF894BA574B37FD0A5BAD1B1FA0DA3D1BE4B82533CE016B42C409F48C6DC1F760A0BDA29C52B77B20DD0137AA37563C72E8E7BEEB9471EA0E55AD0135E5B252C683B40CBB5A01F7CB76A8026984E9E3E8001815B7BD46DC8A29BFFD5533677C43FBFEFC4C7EFFF883B87F6868F8F1ADF7FFD0F1E7C6218EA378CC27BAF2E45971EAD10DF301A17CF5DC1D18367F1C25B9331E7F56588AA178AD6D735613DF14A5206FA0FEE692B73D3DA7DB8782E15DE3E6A767CE4845B6C8096FE5E996E6C03F423B7C9B2A09F58E07E40FFFDDB0EDC747B17787BAB199CC9F20E090B64B775DBDD3D30A6FFF336F7C6B143E730EF8D65886B1065D32D3B330F0F3C5EE276A0B620D714E9A6D3EAB1F2BB7F31EB7F93D0BD57DBCA4875555E0EE8252F0E76580E59D0F304A01DEAE4CA0C1CD0B308D00E2C688A831E3F7EBC3C403FF7DC73B2EA39F1F55F04A025809E32A0936C17C743EF553E1A81FB8BDFFD74067EFD61133A7469812ED7B7C23B2F2F61D6715474A80DA66F3CF725E21B4661D4C45BA15279E1A7EFFEC581DDA7980B22F9523A264DBB9BF9630946CBBEFC9B41FFF79FB6E08917C6A25E5C046BFF3E6DEEC7E29F5EB49559969FF9D8A1B3D8BCEE00EE1ED69B01BFB28903FAFD876F9505E8273FFCC7ED16B4F41ECA728D48DD1BE41AD9B5E5281E7A72984D377BF707B505BDE8487B473EFFCAE8C701FDF50B831C9E46809EBF6297B0A01D2AE5BA0C1CD0CF8EEF250BD013264C700C68DAF65BAE052D006D6D4CEEE2900BE842AD01D39C00340DE82D5EF82B62E222406E06EE4795BA23A450A03AF2630489C0203F761E250E0C02F4DB2F2D4154BD305B0F3D7DE2522940A7A76663E13B2B70E1DC15DBA0E2E675FB997F77C6ACD155EAD91CD0EF3D7C2BA21C0C12A6E714E1A96A06340D1E92054D2FAFFB1E1EC85E84F680FE74CE4A844786D8EE9FBE3CA4FE6B01E82A758D1A7F92DB002DD7829EF4BF5F85052D05F4DD1DD15BE620E1B4F72B1F2E26B5BE08D0DF7DF117D46A2F141668B1E9E867A5FCC55501F4CE2D474B7D9AD31342B0914671F0688791B73ECB20E432404FBF459605FDD4C2B5D56A41930606BD115AAD1E1FBDBB02C3C7F7C3C3E3DFB101982C6872138D9BD2DF06148502080C2A8948A1B6D8F0F75E787929E11FE8876F7E7D05FE01BE4E03885BD05F3D6F1DD8AC28ED230BFAC7DDC2827624940B8FDB007D4F4FB492E1E2983871A23C0B7AD6AC59B2AA79EF1BBF09404B007D1F01BA7D0387DA15E98C98EE24A0E922F4E09375F7C33F6F22363EB214A0C9D25DF9DD7ACCF9E2090685FB47BECE3EB3DB76688A796F2CC733AF4E60FF7E78C2BB6C00913ED1673FF519C64FBD1337DDD6C5760F0579453640E7E514A2B050C38ECD98F81EE67FFD14E6BFF9BDC310BC8A04E116F4BB04E8908A67A466E46AF07415014D7EF6990F2D6083AB238A7DE79306BF82662DEBE3A36F675E15C5C1EB4CE17959C503AD4B3F5F83E1F7F4C343E3DEB2017AC35F7BF1F64B5F63C28377D974532A14C8CB2DC48A6FD6B1A8116A8BF65D9AA3792B6BDF50AB55888C0E65FFB67F913AEC3C920C1CD05F3E37C0E169FB4E5DC1020F07340F79B4BF9994A40CD6BFAB2365A4E5203C32184AA5D2E9CB7140CF244037B4BA0DCB4B1466270BD05BB66C815C404F7EF377B7039A0669E8D3BA4D87A66CB08B125992F4F9CD53CBB68D9845420FD3C5B329A5A21B9C56594601DCC571DFDD1DD0EB3A398036E0E10F2A1F2E46D6EB82B7BEB745177CFBF91A165130FBBDA988880AB10D68DDFFA875D0887CC63CBA80A2067854023F8FF2BCFDD123B63209363F7DB7BED41DCF7C75227B0950993F2D5DCF2C414A0BBE7E1A6B57EFC2BAD5BB5D02E877A6F59305E8673E5A57250B9AEA4C9114DF2E5A53EAFEE83EF8318A78E1AE1F9E895C43F3DFFA9EFD7ACF94FEE8D1A71D9E796801EE9972872D0A83AC68D288273F7F5FCC787614D3EA9EFBFBE3C2D9142C5DF42708349422224370EFF4012CE285DAA247EFB655EAB31CD08B67DDEDB097EE2740FFB4C7E516344135A938228857A2B2B1F0FC3CEEAAB3BF191A0BD97CEC7387F7E88A0CF70E7D950DB6F3787867CAB4017A5C225ACA00F4A449931C5BD004E8679F7D5656BDEE7BEB0FB7039A20439608B712A962E4F37CFFB5A568531C6D40801E36AE2F7B00C822E10F9DAC9B7041260EE8C97711A0EB3B2CB14867C02373AA168DE0B0F06ACC705BD78731F5B121CCAAAC6AE216F4DB0FF59505E8991FAFAF32A0AB5AC7B2CEAB4C1C7459EE266E5D3B53270EE82F9EBDCB613104E80F57EE7539A0798865E36671B63AF4BCB13D8B82A96CAAAD807E66ECF5B2007DEFBDF7D62C40D36729019A4299468CEF671B88224093EF930F4CD15B8F06CECA02F4AAEF37B24F54F209F2B0B0CA761C47F94B00DD5E9E05AD35E091B9351FD0F4703AAB6909A06F466488839984B94598F9F1BF350ED0D457A571D2D49F125A356031E8CEA4CA009A5C1C0BDD0468BA07693F900E60D331FAD2223F3D256968287DD11C3D74D6F6770234B9CDE86BA447EF76CC0547892CE8D53BE661C5376BD9EFD263F405A2D71BD8DFA59A96F5DC1337C87DB17FF729C604AA0B31837FFDF4E9DB116F3CFF95CB2DE8A7C75EEFD0C541617693274F760CE8CD9B37CBB6A0A7BCBDDAAD163401E0ECA9CBE8757307BCF3F237F86DCB07AC21E402FA9BCF56B306211FAB8FAFB7D371A7E53D4C1CD0F7DE49809661416B0D9831AF6AE162CE3CD09E782E07F45B0F12A01DFBA09FFDC43300BD6DE32190A52837D1E4A0DC9C02963D20D00F9D7BB4927B6AB9F938A017CD74BCDCE8FEFF52AB0DD0524389A25FB41A1D9B364F69FBA6C378E695096C22D0D9FF92D0B899756213BDAC6EE93C1D770CBC9EB991C828EBD3AF23DAB46FCA004DF1E76495EFDD71823DFF335F9BC0DC6B143EFADA9C075859BFAED8CCC652522E67D89EFBA2221D2E9EBDC25C74F4E2D8B1E908068DBA8131A16B621B3C39752E1B68A7AFC0437B4F83267CD1CC5257BA389E1ED34396052D1BD03367CE94D579EE7F678DDB01CDDFCED2CF1F29A0C9274B6FCB75FB3FBACA829EF5F04216DF2B9D7127EBC62A9989037A52FFEB6403FAD1F9558B46A864D53C3E3B07F49B0FDC240BD0B33EDDE01116B42708CB01FDF933251124E5D58B00FDD1CFFBDCE2E2E0CF28BFB614D0347EE4E7EF638B6AE1CF31195FF6E70DBEF1297CB8E419D46F14CDBE9CC9974DE0264053E44BE3E671A081EAB96F2CC3CDB7776183D78F3D3F061DBA24B0B5547EF8FA1F982D16DC31A827222283995126AD0B019A5E8E8347DDC88ED158D6E3F77D80FFCD7B88C5B0A72667E2F12973F0E9F2E75C0AE8A74677770868B2A0A74C99E2D882DEB46913E4027AEABB7FBA0DD06471905834238B3E9FA8610BF28BD8E83901FAC9FBE7C2C7570D8D468F795F3EC91AC9DEC5A129D2E189297370FE4CB25B17B69102BA673BC70BF6D35A1C8F2DA8FA609727C0C15575E0807E63EA8DB200FDDC671B05A08BC5E780FEECE93B1C360701FAE355FBAB1DD054B1579F5984ED1B0FB13A92AB912C54724B7C3AE767AC5EB9051F7EF30C9AB5A86F8BE7A77CF680960E12F2630468E9809E743D95E9F7BCCDAC6ADABDA8459B866C5C8A002D758310A09F7B6461A9312B770C123E398A00ED78C1FEFBEFBF5F1EA09F79E619870D4E191E78EF2FB7015A0A615E99827C0D1BCDB5777194F5E6B6BF81F2062064DDA8834C25806E87C4B68E01ADD1193D0AD0B48A9B5E6760964E75A71240DF8008073BAA64E669F0DC679BAA0DD0641048E3995DA90DC55693B5C72393AA523607F4A74FDDEEF0F403A7D3AA0DD004C64F3E5889773E7EA41468A992653D877C0C497ACC1ED07FEE9ACFAC5FD26DDE9BCB59E40B8FCFA7095B46A309BFADD884ECAC7CFC779C9641B07E39DB5BD0F6809E396D013EF8FC31F8FAF93057CC03A3DF642F0C57BA389E1CD50D2D1A540C680AB3930DE8A79FB6861E394A0FBEFFB75B004DE172BF7CBF914D9290CE50A34F9D4F96CD6230910E12960768EA28B9D956BF1F9537FBFDA98E6EA94AC739A027DE41802E19CD2EAF3002F4E31F961F8D409F6B278F5EB8EA749AE8E0EC023B65D549CE92A2144E458996E67465E280FEDFFD7D6401FAF9CF373B05687A60AF2465DA6E81D6C7E08351F6F745911A3FFCF3161B50A290380A97A39996AE986462BF7A5E5534E580FEE4C9DB1C9E7E9000FDCB01B758D01466278D9D973E6B149AE9A5F242A32631AC8E14D14216B4343C8FE7AF08D0348393BEA429AC94C2179FFBDFBD6C708F7E28D69F0661972E5AC3BEB8932EA6A349421C0B67A4D0492ABF2C0B9A9EB3E9E3DF61FE6A0AA124A690CFFCA7F5EFB814D04F8C244057FCDC10A0A74E9DEAD882DEB87123E402FAA10FFE710BA073B2F3F1D1BB3FA25BCF36B8F5EE1EB6CE478D1B121A88BB87F7C6A963174B1DA34C74DEEF3F6E61B1A7947EFC761DCB47C97E9949873DBA121938A027DCDE5636A09F5858FE6017F9C2BEF8F05756035A458DD6B8A0CE467E33BE825A25AAE730AB1C4097E5337458B08C0C1CD0AF4FE92D0BD02F2CDAE214A0E933F7E09E53A8176B9D3840FD69FA33656F19458026838056AE1B30BC0F830B4513B9624CC39580FEF8895B1D2A4D80FEE4D7832E07F4AEAD47B1F68F5DA5AE6FFFAC499F43AEB7F43C9A424F3E609AD0C3DB8216986AD834062DDB3462BA4F7B7A386302A55BEEEA6E1BF07FFFD5A56C012A4AD7756ECEDA89D2A205BF202DC5BAA175C326318C0904E0E8D87056264F3C469D7EA7F564766D3BC662DCC9A27636F138E8C747749505E8071E78401EA09F7AEA2959759B3667AD5B002DEBE21E94C906E8DBDAE07A9916F4931FC91BECB28FA1CD4CCFC52F3F6CB4DD3DCD0EA45956146E44FFA6639DBAB564032CF610A0CE48D623F9FF78D817851AD9039A9F4717A1E3741E9FAC41D6E688F1B7300B837C783CF489F2F2BAD0BF098494DAB66FCA46E5CB4B1CD0AFDDD74B16A05FFC62ABD3802E2FC48D5C67FB779F6455A5A9DB836F78128B57BEC4264591AB833468DBBE09C2A3426CE162A4DDE6F5076CB7C7A77C93654779E918856F11D4794818ADDB617FAC2ADD995BD01F3D6E5D55B0A274F04C3A3E7503A01D5DB72E1FE7807E6C4417B4A8EFD8827EF0C10705A0DDD16138A0C7DFD64696054D83844F7D2C6FB04B0A68F291CD7EEA73A45FC9C6B07BFAB25B2178D034E321373D8D81236E004DDAA185E709C434B59816463A7EF83CB3BCC982F874EECFB8636022FBAC238BE4E63BBA62E0883E367F1E8519D1E02A9D4729F97206060CEB8D4FE6AC64BFD3570D7DCED267FE0B8F7D8C944B1957D585CAEDD8AD05CB4F1318DAB4B72E5F5A56B2017A722FD0EEDE15A5CC5C0D5E5CEC1E40D3A0F49CFF2D6383CD34A87478DF69F629FDC682E9EC339A2C673ADEBD671B6685D18C437A71D1025364155248187DF5B4EFDC1C4FBC388EADDB4DED41D65BFBCE09AC2C5AB294DC547C6D6EFB78E1CAF6CD4A01FA741A3EFDED90CB2DE8CAD6B92EE5B7017A78175916B42C406FD8B001722DE8E973D7090B5AB216C7F8DB5AE3FA368E7DD03493F0E98FE50D76D9AF84F6C0E837F0DE678F21AEBE756D824726BECBDC371307CDC6A2152F3020D0834FEB418C9C782B03299FF54680FEF7AFBD78ECB931080E0D002DD04FEB4A48D79126F74A504880CDCFCA0770CA0B8BFA68E9B357D565E4ADB3644FCDE5807E75724F5916F44B8BB7396D41FFB96A1B028A1733E25B7DD157C3B18367F1E093C398B57CE6D465B628120734696CEFE2208B9BD6D97E7AF67836D59E26634C19F13AF361523BCD59F4B86D09526A272A4B3AF8E42A402F7CCCF14C4EB2A03F1380AED6F70307F4A3C33BCBB2A01F7AE821C7163401FAC9279F9475230FCF5B2F002D01F43DB712A01DEF2842807EE61379835DF680BEBBE763A506A9C8DA5DF6E7FF3079E8ABB65042FB075F0A68FBA541ED17FAA786A7B5260E17EF2012131FC966699605E81BDA4E454060C9AA6CBC2E6CD6E6ADCF22F1C6F678E99D2915F6250EE857EE4D9405E897BFDCEE34A0695D12AA1B250ECCB27CC2A48D2340DB6FA3C50716EDF779A401A9F1035F8682C646D6BDCDAEED2A407FF8A8F56BAAA24480FEFCF7C3C2827624940B8FDB003DAC131264B838A64D9BE618D0FFFEFB2F9E78E20959D59CB1608300B404D0E36E69851EADADA3D515258DDE88999FCA1BECB2073459753470651F12275D1BA22240D392A28FCE1A0DB5B70A85051A0CEF37B394056DEFF3AEC8821ED66F26BEFDEDD572C3F3E42C45CA013D7BD2F5080FAA7809CEAC7C2D667FB5C3694097E583E6CB864E796410546A158BB9A7A8024780FE75C5263CFBFA24162E47101E7AF3332C4AA1BC8D78ED978CE56B7A3BEA33651DE72E8EF98FDCE4F0F4C36733F0F91F4704A01D2AE5BA0C1CD033867644F378EBEA85E5A58282024C9F3E5D1EA01F7FFC7159B57CF4C38D02D0A500DD12DD5BC903F4B39FC9F3A54A814900A04F685AAAF29199236D6D447EDE817D9E90654193CFF4DE690398AFF4E907E723BE41149B8DC5634A69F49BA6DFDAC2A29EFFCA664167A466B3C819BA1E01FE9E012F213C22F8AABAD0C4204AA78E5F446E4E21C64E2E3F4E9703FAE5893D6401FA95AF773A0D6836D5BA78F7715AFA9366A8D13E84EFCEFE0663EFBB831DFBE0B5EFD804277B40D38067C3C6F5D8A0DF8923E7F1FCA31F23B14F3B0C1A75235E7EF233B69428C5D1DA039A5665A45DC5695DE91FBF5987573E78C06516F4BC876F74F8BC12A017AD3E2A00ED5029D765E0807E64480759807EF8E1871D037AFDFAF5900BE8C7166E128096007A6C3F02743D872D4C71D0B316C9F3A5528812ADDBD034C13A018606ED687ABB343DF3CA782C78FB079B3B8116A7090B0F66DB6151A2995CE46AE0162DED9F476B1A50A20D66A9CC75AB77B1B5A0297D3E6F159B8545897CDD8F3C3B8AAD9D4031A294E87A6111C1A0BDF7688D14FBBAF0BFD1E0202FB33C5138A05F9AD05D16A05F5DB2CB2940F32552797DC22282D8DA1094A4C7482F02368567EDDB7982ADD5406D21D58DCEA1DFE9EF3C7197CEA2F9AB986E3C714DE9CB87F290AFFF8F9FB7DAB62D73D869CAC8C02DE8B9D36F7078FAE17399F84200DAA14EAECCC001FDF0600274C98E3B655D832CE8471E79441EA01F7BEC3159F57CFCA3CD02D012408FE9DB4236A09FFBC2395FAAAC06B2CB24C7E55095729D398703FAC5F1DD6401FAB56F763B056867EAEACA735D19073D679A35F6B7A244805EBCE698B0A01D09E5C2E31CD0D307B59705E81933663806F4BA75EB2017D04F7CBC45005A02E8D13727C806F4F38B9DF3A556A51F7932A05FB8A7AB2C40BFFEED1E01E8E2C6E716F4070FF576D81D08D05FFE795C00DAA152AECBC0013D6DD075681E57B1054D330989BB6BD7AE45646424D46A3514B4771A0085C964B25086EFBFFF1E04E8471F7D54562D9FFC64AB00B41DA0BBB574BCB335B9385EF8D2395FAAAC06B2CB44332D0BF2346CB5304F49DC827E7E5C175980FEDFD2BDB502D034E188260C39B3951307F4FB0F5A3700AE281D2140FF754200DA91502E3CCE01FDD0C076B2004DAE658780A60C7201FDD4A7DBE0A50482839CDFBFCB85BA547B513ABD05451A0B46DDD41C7201FDE257BBE0AD0602FCEBB676451A33747AE0B9B19D6501FA8DEFF609DD8A7B787E81194613F0DE033D1DF67902F4577F9F84BF9F023EDE56CB4C24F72AA0D15AA0D559F0D080B66826C382A6E83959802667B59CF4F9EAE3B8946E5D8CA8AE275FB51706F76A82368D1C2F26A4379AB168F5715CC92EAAEBB2B1FB0FF055B34E1CEC6FDD73B2BC54A03130C8A4E55837AE150908F6F7C653233A3894E2426A017EDA721639053A87794506D729E0EFA3C23DFD5AA07E5440C57DBBA080CD3F7108E87FFEF907E4AC1649282014100A0805AA47017231D30C6E5980966B41574FD5C55584024201A140ED5680C2EC64039A02A645120A080584024281EA5180004DCB3C3BB4A0FFFEFB6F0840574FA388AB0805840242015280004D3B59C90234CD09AF6DC962014C6633BB2D15859E882414100A08053C44010234ED05EB10D07FFDF5175BB4A3B6A5BC223DD6ECBE8CD8707FF46A13CDD6E51549282014A85E05B47A13FE3D988C2317722ABC70937A81B8B9631C22829CDFD9A47AEFB06A5723403FFBECB3E5039A32FCF8E38FA03549F57AEB1632B52529BD5468D5EF3E04D76B06A3AE0817F7AD46FA4C14CCF10000200049444154993DB058AC16B5484201A140F528E0A5F645E36E0311D5AC6B8517CC493E89F3BB7F85362FBD7A2AE60157E9D2A50B7EFBED374444445C3D93B0A8A80857AE5CC1E5CB97919B9B0BA3D1E8015576AE0A168B0539857AACDE978E941C03D4DEFE0CCADE0A3D125B84A06D832078ABBD9CBB48359D7DF6EC59346DDAB49AAE563B2F939797C7FA757878C53B2C7BFADD67656541A552213838D8D3AB7A55FDB40613FE3D928993A96604453580B76F60A93C26830E7919971017A0C7CDED221011E45DE3EEB1B215A629DD7E7E7EA857AF1E1A346880D0D050D6BEB6A9DE66B3D9A2D3E9909393036A7C82B5C964AAEC753C2A3FC139293D0FBFEFB880139772E01B148EC0F03818F51A146426C3D7CB885B3BC723B16D7CB5429A560B94BEFC9A356B06FA71946EB9E516F6F9E3EA643018B067CF1E242626BABA688F2BEF8F3FFE404A4A0ABA76EDCA340F0A0AF2B83ACAA9D0A2458B101B1B8BBBEEBA4B4E768FCA43CB1CFCBCE50CF69DCBAF10D04D239418D2BB19EA85F97B54FDDD55191F1F1F84848430EB392020004AA5B234A009C8E4DA2050D3434B80ABA989EA7EE67206BE5F7B08074E5D81CA2F148111F150AAD4CC82D615E4A030FB0AFCD5660CEFDB1677F66A536D03872D5AB4C0F8F1E36DD2D29BF3EEBBEF46AB56D6A541CB4B74DEA953A7D8E173E7CE21232303DDBA7573BA89C8AA1C3264085B83A536A7A4A424B6D60C7D467EF9E5972CA4A96DDBB615DE323D0B6BD6ACC1E0C1833D4A9AF7DE7B8F595AA3468DC292254B30618275B9D48A12F519D2A0776FC70B2B392ACB99E3851A3D16FDBA1B9B0FA75408E8B6F50370DFC06EA81F5DF12243CED4C553CE254B9980ECEDED0D5F5F5F663DD3EF3C29C882A65F086C66B3B9C6C3F97C722616ADDA8EDD472E42E11BC22C6782334F0CD285B9CC920EF00126DDDD03836E6A0F7535B83BA2A2A2909E5EE2577BEDB5D7D0A85123870F99F43C727710A0BB77EFEE741FA3AF26B2CEC98AAECD69E3C68D0C665F7CF105860F1F8E175F7C111D3A543C459AB4A1BCEEF87271466B699F910BE85F7EF9059B366DC2FBEFBFEFCCA59D3E37BF488705CB3760ED9E0B1502BA6393503C32FA46348AADD9EEA8CA08C6AD660236776FD0F90A4BB1B95C93AD662EC4C5942C2CFC6113761E3E0F957F38FCC3EAC14B75B51F8B20ADD714203FED2282FDBD30F2B6CE18DBBF1BD42AF7FAA4C3C2C2909D9D6D6BB7575E79058D1B37C6C48913D9DF6EBEF966DBB1499326D9FE2E3D6FCB962D3873E68CED98F43CB290E801A644AB6351E84E4C4C0C4E9F3E8DAFBFFEDA768C5F842044D7DCBF7F7F997D495A1F8A8F1F366C98AD9ECB962DC3983163D8EFD263F6F7C10BE6F9695B359E162E5CC840C92DBBF2AE575E999F7FFE399A376F5E4A37FBBAD0D8CAAC59B3D82879CB962DD917C3CB2FBF8C8E1D3BB27197B7DF7E1B77DC7107DE7AEB2D562D5E669F3E7D70E4C811964FDA1603060C6071AB94E83CD298D2FDF7DF8F3973E6808E539D08EE543EFDFCF9E79F6C0088121D979EC7B528AFEDEDDB972C2CDE67487FD295A79F7EFA091F7EF8A1ED77D29ADA9EEE99DA9AEA4575A47BB2D7D45EB7323B84937F2C28D261EED2F5F87BF7B90A01DDA969181E1BD7B74E019AA49582994B6D03B493DA5FF3D3D3B3F3F1C6177F61EFB18B5007109C63A0F42A5957D5BE82F442A2A88E9C943308095063CC1D5D31EAF62EF056ABDC762F3400400F0A4FB367CF660F1B01A07DFBF6F8F5D75F6DC7BEFAEA2BB46BD78E3DE8D2F356AD5A8503070E80CEA54470FBF6DB6FD9BF09DE645DD3DAB237DD7413A80C2A9FE7A773A589EA42F9E8B87DA2F36813619EE8C1A7BA5C7FFDF5AC23F5E8D103CB972F6787A5C7ECCF7BF5D557D93993274F66A3D3524380D793DC08655DEFB6DB6E03FD945726E946EE1FFB7AF2F3A86EE7CF9F67FAF23C742DD28E2045C7C8BD44C709E094A64C9982952B57B26353A74E65F748FAD3CF9D77DE8977DE79078181D6C12D02AF56AB657A5379348643962A7DAED2A42FFA3B819F804CAE2C4ABFFFFE7BA9F3E86F15B5BD7DFB1248E7CE9DCBEA4CBA503D29D1F5EC279A51DB926B8CFAC18E1D3BF0D24B2FB117367D4A57D4BEEE7A00F20BB5950274E3B8087755A5C6945B2B00AD3718F1D8BB2BB0FFC4E552C2FB06472224BAD1558DA1C9CF4241C625984D25D12AC101BE983CB82786F5EB08959B2C697AC8294A8627B2E438682B82774580963EA4654196E05B1E842B02B47D59041B821B954580B6076D45C7E81C3A5ED679FC5859D793739EA332EDF5B107B414DE540702AD14E652F8F363D41E94087C04480E7CCA5BD631CA2B6D43E979F6C7E877E98BDBBEFE151DB3D7906B432F66AA1B819DA78ADAD05DF41280AEBCB2351ED006A3096F2EFE0BFB4F5CB2DDBD4E6F445EA19659D21501DACF5B89A08092DDA4C382FC316DD40DE8DCAA4129477DE5652DFB0C7B084B73791AA0093C04489EC83A240BDF11A02BB2842B826959D7231FAB23EB9ACA243FBE347DF6D967CCF2A6E46A40930ED2411C7A71710BDA194073B0F3FBA0C140FA62910B688ABEFAE8A38F4AB9382E5CB8C05EA4E501DA5E37FA5AA0AF1D772501E8CA2B5BE3015DD62D6F3F74167397FE8BB4426585801E7B47674C1FE57857E4CACB7A6D004D616464A1F3A810FA44A741C0EDDBB733DFA37DAAC88296C2947CDE04215AB3D611A009066421F274DF7DF731BF2BA5B2CAA4E3F6D635BF1E3F26B74CFBFBA3D03A1A202360F3E44A0B5A7ABD8AAC6BCA57190B5A5AAE14D0D4BE34B6402E137B17873D84C9DD71FBEDB75708E8EA1E771280AE3C4904A03D04D0349045C1EA3C113CC9E749D11A15B938C8C7CB272D9015D5B97367F600F35491D54ED7A070330A3B9326F21793BF92E04089C2F17EFEF967067947802690F3F3789904688A3D961EE365929B87A029F7584565DA1F2BEBDEE5029A62536910977CB66455D2CFBBEFBE0B2F2FAF5216343FE60CA0EDDB9EEE83BE00DAB46903FBF6A5AF98071F7CF02A401F3E7C182B56ACB04DC4A1496714B54110961E23ABBC7EFDFAA5F4E6BAF16395C788BC3304A0E5E924CD25005D8D80FEF8E38FD974FAF292D447C81F7CCA2B3D8FAC4B0AD5937E8AF2F30882DC5A9503688AF5A5B2ED13019AA0CFCBEDD4A913CB42E5D3C34D7F976E2E4C616CFC5859804E4B4B63EBDDD22C3EFB32A93C3E59A7BC63E59549EBC6C4C7C797F2AD523D49031AE82398D25642D244D114A41D852ED24B822C4D02134F4B972E65BF13A00972B404827D5B906E3CF163D2F3E8D8B163C758F9BC9DA46D687F8CF24BDB5E0A68E931D289EA4D6D43F05EBC78311B7CE589A271A82D28D1DFE9386F277E4C0A61FB6B0A40571EA0EE3E4300BA1A01EDEEC6B42F9F5C1C83060DAAD65967F67E66AA1359AD04037BCB5AAE1EE595C907E7CA2AC7DEA2957B2D91CF7D0A080BBAF2DA0A40D762405714E151F9AE22EF0CFBC13E3AEBF5D75FC7E8D1A3D92CA9AAA4F2CA1C3972240B692B2B25272733F7847440AF2AD716E7B84E0101E8CA6B29005D8B015DF9EE20CE100AB84F0101E8CA6B2B002D005DF95E23CE100A3850805690A09983455A1DF8D23E851A1DBEF8653BB61CBA5CE14CC236F583D89C84FAD1D678734A34812C34C8AFCEADE52E002D002D60231470B9021A9D01BF6D3C84EFD6EC416A665EA9F2553EFE15025A5F5832998B4EF4F351E3F6C4D6B87F586F848704B8BCAE9E5CA000B400B427F74F51B71AAC8046ABC7AF1B0F63C96F3B909557C4965EF0F60B8297B70F5B0258A52E992446B769361940B37C690906A34EC39607A62DEA06DE781DEE1BD2ABCEC1993411801680AEC1081055F77405B43A03D66C3D8A4F566C46A1DE8280B05806E7B2160662F762B140AF2D4061560A60D4606CFFAE187D47578404FA79FAADBAA57E02D002D0A53AD60B2FBCC05671E3891645A28914220905AAAA804E6FC0BFBB4FB1D9BD053A335B02D82730EC6A485B2C30E88A509099C4E03CE68E2EB8E7AE1E08F4AF1B7B1396A5AF00B40074A97E413305690BF8B8B838F6F77DFBF6213333F3AAD986557D58AFC579B4DE35CDC0A3597972122D35BA79F3665BD64F3EF984E93170E04039A78B3C6528406BE66CD8730AEF2F59C72C6982B477406809A46975498316F9E9976C701E795B973AE9D690CA27002D007D15A0F932A574A0AC85766A1A81681123BA27E91A2115DD83FD14715A5294EF7A51D3EEDD93EA4BAB4E12A4DFFB7A1D8A0C1604473580DA2F9841DA6CD423E7CA39580C1A8CBAAD33C6DDD59D456D94EB0AF1A41B73635D04A005A02B05689AFE2CDD3A89A607D3BA1D34FD98AF64C757C12BEF184D7FA6058CC8A2A5A9D43CD17AD634F59BA648DB1FA3C92A044A822C5F5C9FCE23F8F2EBD2BAD4F46F5E26ADBD4CB0A57D086991FDC8C848765D5AE7E2E2C58BB8E1861B6CD7A6C587E8CB81EA4CEB3C376CD8904DD3A615DEA44B7CD209E402E2EB3BD3EFB496344DADA64933A4034D33A775A5F9312A9BD66016092048FFB1F90816AFDA8EEC023D82A21BB2C1C29C2B67A18601FD7BB5C1D4E17DEAACCFD9BE8FD46A405FC9352120AC6401227EF3FAA23C14E5A6635CFF2ED5BA9A5D4D784009AEB4180FCDC2A374E2C409B6D12D2D144FC97E76225FCF81AF97215D6E54EE31AE0B2F5B7A9E54B3B22C613E0D9C8ED16C45BE79009DC72DE1B2CE23C012C079E2D3C6695A7A454BBF4ACBE5E71280F992A3345B927EA7CD5D29D1BFE947BA746B4DE807EEACA334042F334F0B28550CCE753594AE22AD6B35A0690BAC8AD23D77751780B6138840429626ED1AC2D73E96EEC44210E59B0CD0A9B4D810ADB8C701CD77F8A063F680B63FB66BD72EDBBACD949FCAA53C54261D236B9A438EFE4FA0A5414C6E9DD2DFEEBDF75EB6625B5910AE08D074AED4E541F748207516D0F67017802EFB09E42178DFADD98DACDCC23A1D4A57E7007D29351B3B0E9D436E81A64240B74F8847F776D6253545B22A20DD2A8BF6D3A30132FAD4E74B98F22DBAA47AD131CAE3C8BAB60734B912A4ABF211DCF8EA6B748CB669E289E04D10E63BBB48AFCF8FD9FB992B0234B949C865C293B46C672C680168F94F9246A7C71F9B8FE2F2956C4C1C783DC282FDE59F5C4772D64A0BBA8EB49D5B6E530A68BA80FD20A1A32DB66815396E713BB2A0A97CE9B2A5E5DD90D48D51DE605F652D682948D7AF5F8F69D3A631DFB6B0A0DDD2ADCA2D94763FA2088FBA1C4A57E72CE8EAED62B5EB6AF680A61D5A3EFDF453B6EEF2B871E3D83AC763C78E2D75D3B4E03F1D237873570165A0C1383A466B18DB839DD6B4A605F0C99DC11385B2AD5EBD1AB4B6321DE389A04CE0A7813EFA37F7EFF2E3B4EF624580969E479B0ED00EDAB488FDF8F1E3591134E8497E76FA122040F36334B848D7B21F24DCB66D1B033A4FE472A1DD5FFCFCFCAEF25F0B1747ED7A3EAAFB6E84055DDD8A7BF8F50866FEFEFEA596E9E40BD4D322F694A43B93D3EF04263AC621CC8FD3DFE818258ACCE03BBF7009341A0DA48BDF53281BE5A1BFD1319EA4FBF5E9F57AD0CE31D244C709B0748CEACE13BD5C424242D8AFFCBC808000B6BBB8F43E28FA82AE4D0BFC4B8FD1801FF9E2EDC3ECC8E72DDDFC97AEC9973D955E93AE4175A563555D6AD5C3BB8BA89E9B15B001BABAF72773F37D89E2AF81024D9A34C1B973E7AEC195C5258502355F81B262BE15665A171080B1A00085972EC16234D4FC3B1577704D141833660C962D5B764DAE2D2E2A14A8B90A28A00E09464043EBEEF4525033409BCD6664EEDD834BDF2D857F5454CDBD4F5173A18050402850C314B098CDD0E9F468F7F26CE60ABB0AD0E49FBBB26533F4070F2261E4A81A767BA2BA4201A18050A0E62A60282AC2DEB91FA0EDDBEFDAC67F38A4152693C9420319C99B364271E23812460840D7DCA61635170A08056A9A0204E8DD73DE478BD7DF6083DA522B9A019A46EE2F6FF817EAFF4E2161F8C89A767FA2BE4201A18050A0C62A60D01461D7DC0FD06CF66B080F0F679144A52CE8FCFC7C0668EFFFFE43C2F01135F64645C585024201A1404D53802CE85DF3E6A0C9CBAFB065162A00F429240C1D5ED3EE4FD457282014100AD458050C1A0D76CD9F2B03D0A708D0C36AEC8D8A8A0B05840242819AA60003F4827972007D12094304A06B5A038BFA0A05840235570106E80FE7CB00F4C91302D035B79D45CD850242811AA8001B245CF8A14C400F1E52036F515459282014100AD44C059805FDD14219803E71020902D035B39545AD850242811AA90003F4C7B2007D1C0983E459D05F6C3E89E5BBCED648416A4BA5BB3589C2CCFEED11E2E75DE55BCA2CD062E1FAE3D8FCDF952A97214E745E01959712A3BB37C5C49E09552EEC485236E6AF3D8A7319F9552E439CE8BC0271A101987A634BF46A7EF5767B6595CE00FDC947322CE8E3C791307090AC1A26BEF507140AC0C75B212BBFC8E45A050C060B4C6660E5437D111B625DD2B32AE9545A1E262EDE0C2F2F40AD126D59150D5D718E566741427430964CEE53E5E296EF3987796B8FC15B0D2895A22DAB2CA41327D2AAA03A3D705FEF044CE9DD42564906AD16BB3EFD580EA08F2161804C40BFBD1A71D15E78FCBE60599510995CABC0F7BF1762CF613D563E78B3F380FE720B7A77F5C1A05BC59643AE6D25F9A53DFD663612A283B0E45E2701BDEE381E1C1B88668DAC6B5E8B54BD0A24A51A3177713EEEEB458096F73564D06AB0EBB34F6500FAD85124DC3D50D61D25BEFBA700B42CA5DC93C906E8A9373A09E87C4CFC7AAB00B47B9A4976A936404FEC25FB1CFB8CCBF79EC7BCF52704A0ABACA0F327DA00DDB339A6F46A2EAB4066412FFA4C06A08F12A007C82A34F1BDBF04A06529E59E4C3640DF7F83F3805EB24D00DA3DCD24BB5406E8A8202C99D853F6395703FA02E6FD2B005D65015D706209A09B614A4FB980D660D7178BE400FA0812EE9209E8F7FF168076418356B5081BA0A7F4711ED0DF6C1780AE6A43B8E83C1BA0272456B9C4E57B2F60DE8693C282AEB282CE9F6803742201BA99AC02998B63F11772017DB7AC4213DFFF47005A9652EEC95402E8DE2E00F40E0168F73493EC52AD800EC412A7017D4A005AB6EAAECF5802E8A6F2014D511C5F2E9601E823879170974C407FB05600DAF5ED2BBB441BA0EFEBE53CA0BFDD29002D5B79F764B4017AFCF555BEC0F27D17316F830074950574C189A5009DD85456892CCCEEAB2F6500FAF02124DC7997AC4213E7AE178096A5947B32D9003D3911B1C14E84D9A5E763E2D2DD02D0EE6926D9A5DA003DAEBBEC73EC332EDF7F09F336FE272CE82A2BE8FC8936405FDF0453AE6F22AB4006E8255FCB04F41DFD65159A387F8300B42CA5DC93C906E849D72336D8B7CA173995518089DFED1180AEB282AE3991013A32104BC676AD7281CB0F5CC6BC4DA705A0ABACA0F327DA00DDA331A6F4682CAB4016C5F1CD1219803E7410097201BD60A300B42CF9DD93C906E8893D9C07F4B2BD02D0EE6926D9A55A011D8025639C04F4E63302D0B255777D461BA0BB37AA1CA0BFFD4626A06FBF4356AD133FDC24002D4B29F764B2017A4277E701BD7C5F8D0674618106BBB71EC34DB777718FD8D550AA0DD0A3AB7E0FCB0F26615E0D0674DA956C9C3F938CEEBDDA5683E2EEB9442940776F24EB22CC825EFAAD0C401F3C8004B9805EB8B9D280FEEAA3DF90975B68AB74C76E2D70C32D9D65DD84A765D269F5F8FDA72D1836AE2F766E3E82A09000B4696FF539498FB9ABDE2580EE86D820275D1CDFEF7739A0CF9CBA8C3F7EDA72D5ED07870460D23479A19C72B54B49CAC01BCF7D89055F3F5DEE29C70E9D437E6E217AF46967CB43FDD1D575915B67FB7C36408FAAFAF3C000BDE5ACCB2DE84D6BF7E1C0EE53B62ADBB7213D0737F4EB84E0D080AB6EBFA2633CF3FC379763C6ACD1D8BFEB24D6ACDA86E7DEB857B68CF66D48D7EBD1BB2DA2EA85C92EC395196D80EED610532A03E8EF96CA01F47E24DC7ABBACFA267EBCB5D2801E71CBB3A5C43F7AF02CEA378CAE91968FD168C2B9FF9290D0BA21162FFC15317111B87388751698F4982C31AB90C906E87BBA2236C8A70A25584F39955188892B0EB81CD039D9F938F75F32BBC6E7F35761E8D89B111119026F1F35DA769037BA2DF7A6E4007AF5CF5B7125391393A797CC94A5FEE7EABAC8AD7399808E08C092911DAB5A04961F4AC6BCADE75C0E6802684C7C24125A3560752BC82FC289231770FFA383D9EF67FF4B427CC368F8F85C3DBD7CD6C30B3163D628C4C647967B5F04E64EDD5B5609D0C494156BDFB2954D75A167D13FA0EA464B951B00800DD05D1B604AB786B28A6216F4F26532007D80007D9BAC42133FD95625404BC5A44FD3AF3EFA1DDD7AB5B17DD690E03C4D9A7637EE1ADA9BFDCAFF4E0FD4ECF7A7B2BFBDF3F212F6694B292A260C1F7D3B131BFEDA8BC2420DE8E1A363743DFA749A7ECFDBB8E9B62E98FE8C7553DCA71F98C7CA9934F815F6BBFDB1F36752D8DFCBBBDE57AB5EC6BB2F7FC3CE7BFBA5AFE1E5E5053F7F1FD0DF29D1315ECF85EFACC086BFF7B2BF0704FAE2AB55B3593DD352B3917E259B1DA3F30202E54763D8003DAEB39316742126FE78D0E580967622E9434A6DF1D1BB2B589B53DB3FFDCA78D6F6E5B5EFC8F1B7E0E907E7DBDA97972B6DFBF95F3F55CA82961EA3F6A7BE30F3A10530994C080CF2C7BB9FCC40E3E6719876CFDBACCF50FA61C95AAC58B2D6566D7E1EB513F52D3AC6CF93F580543213B3A023FCB164849380DE76DE2D80EED3AF138328253240D6ADD98D944BE9EC0B84F49EF4D00044C784D99E357EFBD959F9080EF167CF07D774F7D6A3ECF01F2BB7324DA97DE918B7A0E3EA47B26394F8F34B7D46FADC53BF98FDD467A0E794AC65FEFC525DE818B52F7FEE795D785F9B347836167E3B933DFBD2E7BE924D5666F65280EE6A7DA1394A0CD0DF2F9701E8FDFBE403FAD3ED4E039A2A4E6F676A78EA007DDADCCFDE7E1CE2FCD8FC37BF67D6CFE6639FB346DCBC6EBFB5F1BE5987C53FBDC8AC583A975C26FD07F7C49BCF7F8537164CBBAA4CB2A20AF2351839E116DC3BF4559C3E71C956E68C49EFE1DEE903F0DFF14BD8B2FE0056EF98C72C8591B7CE6265C6C447300B82EA49293FAF08CF3DB2907D56DB5BD0F6C7BE5CF85BA97A366FD50023C6F763F59CF5BF49CCF2EEDF6306D6EC9CEFA82D6DC76D801EDBC97940FF74A8DA004DD62E694AF74F9FB594A456106F5F3A4660A7B6A076975AC9D23E43E757748C975D96052D3D26ED33D41694DE58301DBC5F90E54D7D66FE574F2128D8F58B4AD9003DBC83EC3E609F71F9A114CCDBEE7E40D375E919A4B6E2EDC4AD647B8BD6DE8266E74C7A0F8F3C3B8A3D8794E8D9E5CFB6F4187F467FF8E7CD522F602A73F2F401ECB92FEB7AFC1867027F46F97348D7A044CF5B59FDA2CA0D20B5A0BBD4C794CA00FA87EF6502BA9F55344729F1F39D6E013435064F6461F5EEDB010468A9E56D0F76E9434A30E51096363EFDDB1ED0D2878D3714019A37309DC3DFEA04D590B040B4EFDC1CF562C35158A0950D68A9FB83E04D1D840025FDE4AE32A0C774446CA0132E8ECC224C5C79B85A015D96BF98204B89ACDD6307CFDA1E7CDE16520893DF31B641146B0BFA74B677716467E641ABD5B3F2664C7C8FF51D4780B6777F507B10A0A53ED16A01F4D0EB1C3D7AE51E5F7EE40AE66DBFE0760BBA22403F30FA0D66E90604F8319F74598026B8F397B33DA0ED7DD004D9AA02BA3C78D3F3C78D21B701BA733CA674A92FAB2D0D3A1D76ADF84106A0F7ED45825C402FDAE51640F7EE5BFA136FFCD4FE78F989CFAE39A069E0E29BCF5683069B6EBDBB3BBAF56CEB19801EDDC17940FF7CE49A027AD7D6A3F879D906D69973730AD0AA6DA30A014DF9785BDC39A427E8E5C9A14F8393BFADD88CD4942C561E7D25D5184087FB63C9D092414C594FB7241303F48E8BD714D0F4727CE7E56FD0B8592CEE1ED61B1FBEB3A2940F5AFA85C4AB2EB5A06B15A03BC7CB6A4206E81F57C80474DF7EB20A4DFC62B7D3803E75FC2236ADDD8F9B6FEF82662DEAB34F9D675F9F68F33BF38AD09B70C4845BD82711F995922FA5B1F38A0AB578F08961080D0FC2A205BFE0E09E53CC1D21D782EE7B47578C9F7A272BF3E3F77F4483C6F5988BA341A3684C7974300C7A233E9BFB333445BA52839B645DFDF0CF5BB2017DE97C2A1E9D359AD593C0B2FECF3DAEB3A047B6776E90902CE85547AF29A02B72719465414B3BA8BD8565EFFE90EBE2209FEA132F8C65835DAB966FC0A7735656BF054D801E52F510B3E54752316FA7FB014D63472BBFFB178D9AC6B028ACB20602C9A7CFBF40A583848E004DCFE153B3C7A345EB86F8FBB71D786DE617A52CE803BB4F62CEEBCBF0C25B931DBA38EE4C7C14CFCC9EC08210E8CBEC9D9796B0F3AAC582EE1487297201ADD561D7CA1F65007AEF1E24DC2C13D05FEEA912A0FBF42BB190FD03FD70C32D9D586350A246FD62C12FB86B68C99AB8770DEB8D1347CEE3AD17BE6650A32880EB8B43A5A8A19AB5AC8FD0B040FCF9EB76D6184545DA4A019ADEF8345897969285479F1B839CAC7CBCF7CAB7E875730706E8837B4FE18917C7C162B660E79623AC9EE4E2B87368EF52803EB2FF0CB31A1E787C28F47AA3ED18758C796F2C43FD46F5583D7FF9611366BE3A810DB4B8C4C531E23AE72CE8AC224CFCE5D83505F41F2BB7E0CCC9CB4C5B6A8BE87A61155AD0D2B02F8A2EA03EC52D687A80776E39CA421DAD9FE2076C16F42FDF6F6483BE6326DFCE069638BCCF9F4EC682777E804AE585F8065158B57C23B3FA1A358DAD5E1747B81F960C7202D04753316FD725B758D0BC5D48531AF0A3F11E7A462849014D2F484AFCD926BF2F85E5D1E0380FA5ABC8C54180EEDEBB1D8A0A34F8FBF79D98F0C05D8C07F485959591CBCAFAF7AFBD3640DFDEED1176BCF5754D70EBDD3D585DF84B9D8CB6D52BB7B081407A0E9B348F6306DD98FECFBBDFC5D1310E533AC5C932769905FDF34F32017D535F5985267EB5B7D280A64F59FEE0D045E21A4431CB599AF80020FF5BEBF64D1019156A1B180C090D44FB2ED69D0A8E1D3A8BCCF45CF66F1F5F6F160D909A9CC9E0479690F501DD6F1BD8931EE3FE447AA02945C786A3651B6B60F9BE9D27405602257EBD0B675370F19C75DFBEC41BAC7E427277505D2A3A46F94E1EBBC05E00AC73ABBCD0F3C6F6AC9EE427250850DAB6F110FBBBDC641B241CDECE7940FF7ADCAD80A6766A9A100F5F3F1F68353A9C3A76D1D686FC7EA5EDCEFB059DD7B0490C8BBC909E476E8CE44BE9EC541AB4B52FB3BC7E415F6C9468509ACAA4FEC8274548DB90974BA182E42A91F60BF27BABD42AB9CD243B1F1B2424400F6C23FB1CFB8CCB8F11A02FBB1CD052BDA5CF1ABFBEB47D793B4ADB903FA3D456A429FD2E7DEEF933CAF5A617A5B47DE93A74ECF0BED3AC1F911B8CF70B7E3DFEFCDAF799DDDBAC515E94384BA4CF9AFD735865F18B4F319C0DBB0000200049444154B44571748CC5948E7201ADC5AE553FCB00F49EDD48B8E96659754CFC7A7FA5012DABE06ACAE4CE019FEAB8051BA087B5456C60D5378D3D95A5C1C4DF4EB815D0D5A1474DBF0603741801BA55956F65F9B134CCDB9DE4724057B94275F0441BA03BC4604A47ABF1E528310BFA97557200BD0B0937CA04F4920302D08E9477E3711BA087B6711ED0BF9F148076635BC929DA06E801D658E3AAA4E5C7D2316F8F007455B473D539A500DD214656B1069D16BB7EFD5506A077EF44429F1B65159AB8F4708D06B4AC9BF4E04C36400F6E85D880AA6F107A2A5B8B89ABFF1380BEC66D6D05B42F96DC296FA3D1B2AABBFC4406E6ED4D1116F4356C4B1BA0AF8BC694F6F564D5C4A0D761D7EFBFCB00F42E02F40DB20A4DFCEE8800B42CA5DC93C906E8412D101BE0848B8300BDE6B400B47B9A4976A90CD0A1046879FBD8950DE84CCCDB27002D5B7437642C05E8EBACE3608E127371ACFE4306A077EE40426F79DBBE272E3F2600ED4879371EB7017A4082F316F45F6705A0DDD856728AB602DA074BEE90B78F5D99803E998979FB5385052D477037E5B101BA5D14A6B48B92751506E83FD7C800F48EED48E8655DFBC2514AFCE18400B42391DC78DC06E8BB9B21D6DF0917478E0E13FF3E2700EDC6B69253B40DD0B7C9DB85A34C409FCAC2BC036902D0720477531E1BA0DB46624ADBF21788925EDEA0D763D75F7FCA0474CF9218E48AEE2171C54901683735B29C626D80BEB3A97316748E1613FFB920002D477437E661800EF1C192DBE4EDC25136A0B331EFA000B41B9BC961D13640B789900F68B2A0FFF95B06A0B76F43825C40FF784A00DA6173B92F830DD0FD9B3809681D26AE1580765F4BC92BD906E85BE52DF25E26A0FF2340A70B0B5A9EE46EC9550AD06D22645D83B938D6FE2303D0DBB62221B1A7AC4213579E168096A5947B32D9007D7B23E701BDFE92B0A0DDD34CB24BB502DA1B4BFAC95B43B84C409FCEC1BC431902D0B255777D461BA05B87634AEB70591760805EBF4E26A07BC8DBF63D71D559016859F2BB27930DD0B73544AC7FD567B69DCAD563E2BF9705A0DDD34CB24BB501FA66792BA09509E833B998773853005AB6EAAECF680374AB304C69256F5717E683FE77BD0C406FDD8284EE3D64D53AF1D7F388085362447FD7AF8D2BAB02753CD3BF3BB43879D68895B7D4771ED01B93715D4B357A75A9FAB2A575BC399CBEFD4FBE2B4042B03796DC246F7A7099803E9B877947B230F0163F663C8954FD0A64649BF1E39A22DCD73214535A86CAAA0003F4C60D3200BD65B36C40F7FFEB1272F46659151099DCA3808F5281E57DE310E357750BFA4C9E1E0F6CBD8242A3C53D9514A5CA56A05D980F3EEF2D6FF6595985AEBA908F3947B2201E4BD992BB25A39702B8BF6528262684C82A9F017AD3461980DEBC0909DDBACB2A746D721132742659794526F728E0E7A5C0AD7101F05729AA7C817C83199B5335C83388976D954574C189D482B17E2ADC10237FDB33FBCB5E2C34625F86165AB378D9BAA049AA5C845A01D0CBB66588BC09640CD05B36CB01F4462474E956E58A891385024201A18050A0720A30406FDB2A03D09B08D05D2B57BAC82D14100A08058402555680017AFB361980DEB801099DBB54F942E244A140752960B158401FF2791919C84A4F8351AF8752A140786C2C82C2C2A152A90085025577FE54D79D88EBD4750518A077EE281FD0050505B8BC750B52BF5C0CB3D100D6F345120A5C73058A3BA2055058CCB098CD5058E81705A05440A150C26CB1300813AE554A6BE402FD9B76C0A1FC2090B3FC4AEB79F4634B02DFD7BC894505A05028E0DBA4099A3CF50C222222A056ABD9DF28294C2693A5A8A808A9A9A9B87CF93272737361341A856C42816BA7004158AF8745A301B45A78E5E6409D9509EFCC4CA87373A0309B411634C1997A2AC19828AD54ABA1B258A0A4F38B13C1D91814047D44240C1191308584C2E2E707859F2FE05BF501B96B278EB8726D528040ECE7E7877AF5EAA17EFDFA080D0D655F7F36409BCD668B4EA76360CECECE06C1DA6412D119B5A913D4847BB1984D306667C3989303537616909509A4A743919101456161097009C83E3E30F8FA41EBED0DEFCC0C98743A1428BDA08B8F4390AF1F7C755AA8345AA8B41A28B5DA52B74F70B6444402111140743D788585C12B2404AA901028BD451C784DE82BB5AD8E3E3E3E08090941585818020202A0542A4B03DA6C3643AFD783404DD6335927220905DCA500EF5FC68202685392A14949863E351586D45418333260CCCC80456FDDF49525A512E6E060988343D88F29240486C040688C4644FCBB0E3ABD1E3941C1D0F4EA8DC0C828F8984D50E7E7C3AB201FCAEC1C78E5E7C12B2F0F8AFC3C40FA75A8544215150D556424D4D1D1F08989856F5C1C7C6362A00EB6C6B0724BC65D5A8872850204646F6F6F10A8A5EE0DD6FFC882A67FB04F46F2D915FF5BC826147087024529C9283C7F1E0567CF409392027D7A3AF4599930E65A37FFB525B274C3C3618E8884392A1A0808802228088AA06078F9FA322BC370603F14EBFE8141A984AE556BF8F7BD0521A1A10CAA068381191D0672931414C0929F0FE4E742999909655626149999405151C9F5140AA80283A08E88807778387CEBD54360B3E60868D4187EB1B1F0F29617D3EA0ECD4499B55B01EAAFF4437DDADE2850588ACD196135D7EE4E70ADEECE505888FCD3FF21F7E851E41C390C436E0E4C4545301615C1623094AE5678382C71F130C5C533382B7DFDA0F4F385CA3F805918F4E3EBEBCBFE6F361991B6E833E84F9D623E65EF21C350AF5367F6A9C8014D5F845AAD967D19D20F8D961B8A8A60D66860D669A1C8CA84322505CAA42480DC2AC5060A7B48BCBCE0E51F0095BF1FBCC32310D8AC1942AF6B8F90D6ADA10E0CBA56728AEBD66205CAFA5AB301BA16DFB7B8B56A5280BFE43569A9C8DAB717D9FBF7A1E0CC19180B0B61319960B11F7CF6F1016262616EDC18A6F8FA4040A075A08F60ECE3C33EF9E887A04CFFE790A68E9C7BFA342E7DB21006F253C7C42062DA2388898B431059D90A05FB1AA4B114B2A4B9354DB02E056C72E9E9F5301A0CCCCFADBC7C09CACB17A138778E457F481301DBFAA34250CB1608EBD819611D3B22A041C3127F61A908916A125D5CA6562B20005DAB9BD73D37C7414CD0351B8D6C902EEFD449E41C3C809CC3875074F162E90B2B14B0D0E71BFD040642D1A4294CF51BC01C5D0F0A5F5F366A4DBE377B20739F1C81D98B2C5A0264B1FBE2C2CA1F91FEC7EFCC1A56F5ED87F80183101919097F7F7FF6A9C8E2A48B7F08D6F443E32B1CD6E4FE90029B8FC110D429AF3239095E17CE4371F9122C3939CCBAA6E8117B70FB444723B463478477EC8CD0B6EDD80B4649A3F05E5EB6903EE1C7764F3FAC0BA50A40D7855676F21E39902946DEA4D1C2585800437E01728F1F43CE9143C83F791246F2F14A93B7372CE4B7F5F165111396F87858E2EBC3121AC6804C3F7C60845BC8DC4A2658D3710232C1563AAA4D7529C8CEC2E90FE723FFC001C0CB0B010F3C8406ED3BB010252A530A44DBCBC40ED8046229B0B91B845BD8DCF236190C0CD0CAD4142BACC962D7E9A0A0414C72D1482C6DA58F0F825AB44448BB760869D90A3E915150F9FB434523F36AEBB66402D64E76C63A76BA00741D6B70B9B7CBAD4F02AF36231DFACC4C14255D46C1850B283C77169AA424E6B6B02502504020CC0101B0909B8106F6222381A8682809522A95CD4DC12DE5B280CCAD643E7022851AD589A09ABA67172E7DB304FA9414A07113D47BE021C4C4C4203030D0666597779FE5019BCAE5C026384BFDD7645DB30147830126AD06484B8322231DA081C6BC5C280A0AA0A01794C48543163459D734C818D8B429FCE3EBC327228241DB9BFCE464610B60CBED8E75369F00749D6DFAD237CEC165D2EBA04B4B83E6CA15145DBA88A2E414689293A0B9920203455A4806D228B2822C624B6808FBBF223C1CA0FF878543EDEDCDDC16DC4AE6BE64FA5D6A2173204BADE4F2C04575D469B5B8F0E30AA4FEF13B2C14EF3C78281ADCDC97CDC0A2807F3E122EA759A503E33C8A89FF5F0A6CEEFEE056361B70341860D4E960C9CB85252B0B168ADBCECD8532271B0AD2C9EE8B42151808DF9858F8C7C7C32F3E1EFE71F12C3AC42F2E1E5EE48B17B096D364752E8F00749D6BF2921B6680B25860282C40C1B97328387B1645172F409B9E067D5616741919304BE391C9EA8B8880393C0216FA090B83323818CAE01078050430284B812CB59009CA04633E4B4A0E90A54DC32DFABC94149CFBF20BE4EDDDC3FCD9C1D36720BE6953E6DEB08F21AD6CD396056CEEBF960E3812A0B90F9BC39BFE4FD129E6DC1C6B485F4EB635A42F3303C8CA2A6D5DD38B2B2C0C3EE164514722A0491304346CC4AC6D5FFAEA10B0AE6CD3D5DAFC02D0B5B669AFBE31E9E73D4D0EC9397A1479278E337785213F1FC6FC3C16FE56CA4AA678E47AF560AE17C306F594814150F8FBC3CBDF1F6A0A6F2B0E7DE36E0B1E69C1FDCCDC8F2C8DF3E435AB8C3F96EA4E904CDBBF0FE7177D06435A1AD0A60D6226DC6B736FD843DF99A6B587B574C091EAC181CDDD1F521F36738768B5301516C24CE184458550A6A6C22B3D0DB89202486646521DD9CB2D3010AAA060665507B76A8DE0962D11D0A00194EAD23E7567EE499C5BF3141080AE796D56A91ADB66ED151522F7C40964EFDF8FEC03FB98854C11182CF4CD7EE66854141BD033366A0C0BF99069504FAD869A42DD24A16F3C26D9DE6D611F785F1520DBDF249BEDAAD1E0D29A3F90BC74295B12C967F418D4EFD587B937E8055119F7466544B49F23207DD1F170BEF2FCD734E8C880ADD382061CD917495626BC2E5D82F2D24520230390FAF269D20245AB50644B501042DA5D87B04E9D11D6A103BC838285755D9986AB057905A06B41239602088594198D309B4CD0A6A723FBE00164EFDB8BFCFF4EB14FF0526E031EFAE6E303456C1CCC8D1AC3D4B021E01FC0DC11F63E64F2F1961769C1A12C1DDC73A5B464B1E6255DC6D9AFBF42C1BEBD40541442C64D408376ED58ECB3B3EE8DAAD6D51ED6F6C0E62E101E1D6203360D389A4C50141640917419CACB97818B17009DAE24A44F522902764093A608EFD205611D3BC13F2E8E59D74AB50A8AE255FC846BA4AAADE8B9E709407B6EDB5458331B94E9D35FA301CDD8A309218517CE23F7D851F64353A94BB92BBC54B0F878036A6F202418888D87393E9EC18E66ED1194A533F6ECDD16DC8F2C0D7DB3ADBAE5C6491A2C7AC36040FA91C338BB601E4C14F6D6AD3BEA0D1884D8C68D59EC33D5DD13922D24B138F6BAAC093357CD70A401478A27D7EBA1484F63E17C484981222F97019B85F4D94DF2A10891E096AD10DCA60D0BE9A3D996E476A2B03E451953863D411B5187CA2B20A67A575EB36B7E06455AE8737260C8C9812E3313F967CF300BB9E8C2056BA445894F814D83869F3F2C01FE405838101BCBDC168A9050781547599435B027755BD803B932BE63578845D0D31616E2D29AD5B8B26C29E0E303BFC14311DBB317A2A2A3AF8A7D76C5355D558674C20CF7A34BDD217CB091FBB0B94F9BAC6B364126ED0A14A9A9B0646640595404057D05D10A7D92681AA5B737029B37476093A6086A9E00DFA8683608A9A6A52BA9FD45AA110A9439D59B2F9674A5508BAD4959D018C552A31ED59AC5338EFDB50508CFCD42784116FC32D3A04DA655E052A0A54127C9C3AAF55221D3DB0FE9F4E31B087368280B81A3F037F8F9C14BA5663F349D9AA22E54DED615B4C8C76C3D669D1CE2A5F482822D8A4F0B87172F1E5E5DEBDB5B006F830E26A5174C5E2A982D66B65646E35FBE05CE9E4672783492FADC0ABFE6AD1010140C259B61E851AD765565AC6E7E9ADDC856232B5ECFDA0CB389A6A45B63B0E92B81A69E1BF4D675438C06EB34749A2064214B3A3B0BCAEC6CB63E76A8B610D1BA2244E98BE06B92ACDF4EF1D7E1E12C7C8F061C8D91F590191C8EECE070E4FB07C1AC28FED2F070BD3CBB355D5B3B6A8A06417EE8533F823D6F5250B3D5ECE86DBD33390BBF5FC842C7D870D75E5D94566905582C2EC5DAA6A6407FFE2C74E7CFC13B3B0321857908D2E4C35FA729B5959339300886C828E8C322A0090D439E8F1FF2BCFD51E0EBCFAC6495DA9B0DF0B1D8646F1F2B8CD5DEF02A9E92AC2C863114927568D9035CFD4F31DDBB3EE932749BD681D656F4EF3F90458EE84E1D47836F3E829A1649EAD403598937C32F3A063EF449AFB0AE0256B39275CB2EF61FDB2C4702B6894D003291CB83AD23A287516F5D3384AC6B82362DC5EAA7D3205857C47EFCF36843832CA833D3A1CCCFB3EE3A539C742A6FE4F907B11F6D781454F10DE0DDB829BC1B3606CD7C64ADECE96FB79AD5B095AEADDE64C6FEA434BCD5BB150B43950E76B31D55A8E1379E4FC5A1423346B76B52E90B88139C53C03649A4B000DA93C7A0FBEF14F417CEB2B591CD05F930D9AD636C51AB610C8B80AE5E0CF451F5D82E2134B00716FE56128F6C8DB8F02D8E4F2640ABA1F252318B53E9A58492C0267963973CA7D50F66AB82144A6746C1F62DC85EFA250B4F0B9BF6187CAEEB84CCEFBF81FEAF3F60F20F80B9FF4084F4EC83B0F00878FBFAD602C0145BD67CA9DFE2DD6208D6F4C35C224603B3AAF5E4DED2E9A1B7ADD0A7835943A17C45405121BC7273E19D7E05DEE9A950A7A5D29649259D931E7EF2550705B1979E4FB304F8346F019FE62DA18E8A622F646B1FB856EDEFDC735453CF2E3218F1FEE68378B76773361BB6D482FD04E8C2C2426C387705C70D2A01E86A6865DBC83FADB6967C19DA13475174601F0C17CEB14F598B5E675D8A536209997D7CA06BD018BAD838E8A26360F60F601690978F2F543EBEF0A14922B4146771289CD587EC0D959AD6B4A091FE92352D6C037BFC5E3DC482620B1A190CC8DDBE05053F7CCBC2D17C060C855FFF01C879F16920330386FA0DA11C320A11AD5A233028987D0DD42A0BB0B8CDB90D2C8DBFA63D16AD6B8810ACADD6359B3443A17CF47FB6A4AA0E26AD967D81C1A0876FF225F8255F86F79564280B0A4AF76E5AD889D62E2137575C3C7CAEEB08BF36EDE09BD04A58D6D5C0017E0902F47B1BF7E38D6E8DD8AE2AA5B6BC2240D3A6B1EBCF26E3A4C9072385055DD234C533ED6C0ECECA828C03963E614D14736C6271B0BA9347A1D9BF17DA83FB61CECAB05D8F3D94C52BBF59542A18C323A18B6F004DC3C6D0474431CB97ADFC563C63CF9BC05CBC14A7756A3501D93A638FBD858BA15CFCB4556397ABDAA5084034953BE7E07E687F5AC696FEB45CD7115EBD6E84F993796C453C43C72EF01E3402016929306EDD04FF9E3720B0F78D564857B67DAA56CD6B731607377787144789306017478130EB9AD6BF2E5E039B7E67BE6C8A773719A1CECC60B0F649BA0475F1D88575853E73699BD9CF0FBEED3AC0AF4B37F8B668C3B605A3303F5A6AB5CACF02FB40A299AB66902BADA6F4C9EA686C0D59D01BF7E3F5CEF5CBDE34363F3F1FFF12A0CDBE18D156B838986390A640275D8621F9125471F150C735280E5F72F4F967B57DC84F489F9E3493CC989106DDF163CC8FAA3F79AC54C81441875C1666B537CC3EBE30C4C4401B5B1FBA9838906FD91A8F6C1DD0F3F6F6818F6FB1DBC2A704C8CC6F45502E8654C94083A3BA5647F7937F0D8BC50AE8ACD3A7A0FB693954278FC1141E01D07A15470EC144BEE8DE37C18FEE75F3BF6C1D0C655434EABDFF91D59F5E237DD1F2F5299DB3B89F4997542D7687988CB49B0C59D9D68D0AB8754DFF27EBDB4481009A42F8A624C1273909EA8C3478513CB6410F2585FA49D75BA1094AF51BC2A74D3BF8B4B90EEA7A3150F8F9B3D98F647997BC142BEA6BD6BA1AD252A13F730AEA060DA18E8967D017EE148000FDC1C67D78AD737DB664EE55BB7A73409F30F962445DB7A0A9C39B4DD09E3C8EDCC51FC3989C04DFEE890899FC109B8A6B75D1493A23B76CC8A2217F714E16CC140277E922F4E7CF407FEE344CA9A940F1483B1B13527BC3E4EF0F939F3F4CC121304446431F6DF527B305EB556A2B907D3894ADAE0BA9852CB5924B8DFCD6602B922C68B2F8B25253A0FD6939BC766F8785E29B556A28755A1849AB464DE17BE6141445855637CF4DFD103E78147C8BD781AED55674792C97B8454843BEE093D57F6D80D140EB6097F65B5BDD21D615FAC898506567C23BED0AD4A92950D11E8E5A0DBC0A0BA1D0EB4A59D74A5A08AB49337893DFBA7E43A8C223A0A490CDB0705BFCB57D1B509DC87D95BDF8136837FC0375424B040D1D0DDFD66DD9649B3AD96692B62440CF910BE8E17519D034384333F00EEF47FEF225305EBCC0769056F5E98BE0C123E01B1A566A8495DC15C6B42B30A5A7C2987A0546B2B82F5F80293909661AD82B4E168582597FC6A06018E9FFA1E130444432178685F6D82B5EE18D222C4A7CC8C551172CFC4DC57E4AAD8D4C837B1EE643AEAA2D582294850123373B0B85BFAD8472D33A2825DB6259945EEC6B83606D080E81B66357F8F6BD0DE131B108A0DD588A17F477BA1E35BD003B7748C9824F46161D422E11F261EBF556DFB56D3BB06277084582786565B2A810554E1603B63A2F976DC22B8D1051F8FA41151307557C7DA81B3686574C2CBC22A3D946BC5E926DC1D8347D9D0E39BFAC8071F5AF5090BBA5452B040E1A09DFB6D7313F785D4E04E8B972007DDCE48BE175D6C5618573D1AE6D285CB502A6CB1761F6F282F6BACEF0EE773B429B25C0DF3F0096DC6C182F5D80E1FC59182F5F84293303A6AC0C9873B26DAE0B66257B7B431F1E69FD098B609116E6A0600664859F1F0B7763B3F6D8564E3ED6752E282E9962948B07F628D2823EDB4B5C173622D7D2FE6C5DEFB9202F0FB91BD741F9D76FF0A2D9749244DA6AEBC5A2B04317285BB743786C3C42C3C3E1439FDD5EE4DBAC596E1DF7376419112236FF7549FCB57D848841AF6510A7F5AF09D84A722715E4C12733033ED95950676740491BF24A1259D7F4E3151109755C7DA81A35818AC2F922A3A1D5E99075EE2CF46BD7C0F7C06E284D2678356A82C0E163E1DFA96B1D734F956E7502F4BC4D325C1C04E8617511D0DC723EB817052BBE8589A6DA9ACDC86DD711BA6E8908F5F5454056069417CEC194960A4B411ECCF9F9B0684AAF6D419FE0BAA87AD090BB22321A165F3F16FEA6A0D0265B7445692B9906F5D80F597F3CD28206F88A5D15B5CE4AAE8848346DDD6C4651413EB2F7EF8162D5F750A5A596FA12D1D48B456EF7DEEC333B242A0AA1E111F0A3CD5DC9075D3CC5D9FDD0ABA157B08F10217708A8AB9BADB1D7B65D6668B20CB9447874089F3CA38399DC1E9A22280B0BA0CEC9826FDA15F8A45D812A37A794750D6F1F288BC3F994E11150346A8A82D070E499CD50EFDD89C09347A1341AA18CAB8FA029D3E1DBA2B5DB16BBF2F4D62240CF9703E863265F0CAD6B80263853F4C0D1832858F635CC17CF5B07088382A08D89876F7616545A0D144603406B224806502C5E2AE8A3A2A1896B80C2D878188343016F6F2829F4CDB738FEB838D282BB2EAC16329FB157126D61756DD742B745659E8EE2B6D06A34C83CFB1F14CBBE82FAC2395602B9890AE2EA233BF146F8356C8CD0C828048784C22FA018CEB53D8AA3323ACACD2B05368DBD14C761B3BD268BF770249788BED87F6D28768710B8597488566B0B0B5515E4C32FE512FCAF24C33B2589C1D796A86D680B342F154CDEDE30F8F94395970B75A135EC4F41BBA64F7F12BE2DDBD4494813A03F940BE821750CD066B309FAD3A790FFF90258922E3BECDAA6804006E482468DA189AD0FB38F759121DBBA16148BCCA22D7C6D6E0B1ADCB3F9908BFDA4D5B1C890C39BF1C00CD65D5334C8A6493A5F7F0AD5B1C3CC6991DBA00932FBDE8EA0E87A088F8C42504828DBED9B74AF5571D01ED226D23544C8F5C736D3B5C560170F38DAE2AFAD96365BF0C968648B3BF9A52621E0E279F85F3A072FDA12CCC17D31483FFC147CEAA0254D805E2807D0478DBE182C13D045855A68B43A0FE94E55AB067542BFF42468BFFA1896CB763B5153589005285478411B1C0A4D7C431451F85B58048B2AA019792A6F8AB690FA90A5037BC5F1C8CC8F4C33B468D69E6BA7D5AAD52A0405FAFDBFBDF3008FA2DAE2F83F7D534880449A020A22F60E4840408AA4808A58F0292A3E8C140141A58874E9080822D828FA0011450445514A22A0204BB161C702811084501292EC6E92F79DBBDC65B26C92BBB39BD9C97BE77E5F3ED89DB97377FE77E63767CE3DE75E9F5EEDC952CACBA3398BEDFA44F4732DEA13B2CE4E934F7FDD2A847F63C591FA8D70AA5922626A26208E6EE4D8589121E94CC0A9E8D6F7F30F0460890847748CF92621A2688DDCBC7C918DE9CFA28535BD5DCA19FACE0D389E7587882CC773F388D01C2334D748C4F1A388CA3A8CC8CCBF6039FE0FA2838A11EEA1DB82292AE4FE47E1A8DF182567EF177F9E8751C70A090E465434196ACE85822B2A04E8F95B147CD0DF7B01E8F90B5663F7DE5F2B6ADBBCDB4B4A105662478FFC9FD0B8F8142CCE99114A95ACA2106CB35BB0BF3802A783C2702A380245C10485B0B3E9D261622E5EE79F73404F264C0867C5390772A5E8D0A07E2D0C7AF21EC4C645EB3EFEB17F4EE2B537D762FF1F87751FC3AF15455C6F311CB6025C6ACB46883D1FDF144522343C122111D10809A389F94344B243A0D292AFBBB6319EEC77B75F4FDB1F07FBF6DBDFB1EC9D0D3876FC5C04913F8E5BFA189423E09C42C439F993336780FA4C84F8151789BFE2624A8EB10BAB3BB8D88ED8E242C4C2817A4185681B968F8B424A4FCA46C7B321083F86D4C0A7E117232784E658A1368C7F00FBAA595C6C34BA776B83962DAF563A14017A812AA0EFBC522D5125ADEF74444706E186ABAA66880C5D5821B602D4CF3B826A79271173261FE1793658F21D08B39DCBAC729400C7118AC325E13858AD06F29BD4454854C4D9013D9A45CD99C156FA35BBF22FAA5FFEB023FB583126BF9086F8F838A50BC1D34E070E6663C2C425A8573B048DEA53E240E08B00344D689F9F87429B4DACE8425993A194DA7E16CE81FA955FED29142EAC97660E0CD44F28B3DD0D9BAC7877E5665CD3340C71D58C9A40EA9C61730ED6CE5C0211DE576043C48F99B830EF24EAA21009410E846A6E0F7B6810F2A3C2608B0E437E4C148E45554776543C0A23AAE6245879F925D8F3830D5D5313D1B54B2BA56B8400FDEA56450BFA0E45403FD1773AEAD50AC1E07F3B97E1A94AC519C85F8282FC429C3A91879339A75178E20C824F1620F474212CB93644E6D91193E780E58C1D4167AFC1E2F82814F5B809A1B5AA39012DE07CEECC8DF485AEF8280FD6EF6C98E42BA00F64E385494BD0FAE608DCD9292AE0DDE87C9DA68845070A0B9C596F1476181E118AD050E703D1489DDD051935F3048282C331DB8480DEB8D18A77DFDB8C86E9E67E00001894494441543EFF8A41E3866AAFD7FEECF052EB38163B23721C874F2274F92E716F099B3B0828B484222F260C6762C2504070AE168E92B84884D78C415C8D18C4C5452322325C844D06B2AFF5689379C481D90B4FA38B97807E4D05D0DF392CE8AA08E8BEFF0380B6DB1CC8CF2F407E5E210AF269E219FAA3D84F3B82CFD81156E84044810331A76C88CE73A0A44E2C42DA5C0A4B02A56007F6E291807EC147401F3C908D892602B4B889CF3E4045F85709101C1C24FE020D67FA6D12D0334D08E84D1BAD581940406B812616277014A3202717451B7F4648E649E4C685233736028591A1B05B425014158E104B1822C2C3106E0983253202515116444653D62C256605F661EC0BA0535313D145D1822EB03BF0BA0AA0BFF502D0FDAA38A0497CB2A2C50ACD8E22D8ED34E94C110A690E8342BBB0DE68E0ACC85E04388A10161484A8B868C4D58A4374B5489735A7A713FD5147027A828F803E70201B934D0868A911DDE8668A7891807ED1A4807ECF4480A6FB8906A04F669D405E4E2EECF4B619162CDE88222268D2AF3084478489C1B4F070E71B122D18E15C34422E1251F9EE427FDC8FF218D2822640A72A029A5C1C6F2A01DA6E4117450BBA7FBFAAEBE2D07608419ACCB44F567F89C399FFE0A1B414016CBAB808D0B6429AC7C019D369B1842326360A9648CAF80BEC1A7812D0E327F8E683260B7AF264F3B838CABA59A86F263DB70873973CEBCFFBC9EB634940CF78D17C3EE84D9BAC78DF4480A6689282021B724F9E41C1D9882FB110B18073A8B09245886AA8762A5C67975435D7863BA05308D0A9EA3EE885DB147CD0DFD82D485504F4804A06F4BB6F6DC0E2F96B111DED0C679AB3E419D4BD30017BBEFE19C3FBBF5C2A72416EA3FDD67DB00D2F4F7BF7BC7A15DD89542F2BF3181EEDD75500BB5864173AE7DFA50B8D404E6E0DBAB008CEDA550F2A3A76656C97801E37210D357D1824CC3C908D293A004DC0ECD9750C6AD4AC264E6FE088FBD1B2EDB5429B76D73C810B6AD7709D76EF4177A1437233B14D3C045347A16682736053BBAD3C9DCC06E869260474BAC9002DDD1CE44A74D00AE6414102C602CAAEF0D3B3095A5578922FED752B2DE8E4D444A428029A5C1C8B54019D72855A14C7C0FE956B4113A0A9DCF77047F1EFAD573E8E2DFB5E1780DEB2710F068EE8E1D265C023D3D16748775C755D2301E8DCD3F9E7D52BEFE63F7DEA8CB0A063AA4522A59BF3A9F7CDAE5FE0B0533C69096AC4C7A2C125755C3E50BA9608DADFEDFEADD4619B5ED550C43F1A5124A0C712A06BEA8FE2C83C988DA93A013D67F20A4C7EB9BF385DEA83E726F5120FD17B3B0EC7CA0D535C32BCFED26A5C7E7543DCDAE1060168AD253CE2C97902EE54AFBC427D4E7D2FFB7DFFAF993899E3CC44A3D764EA7BF7F2EDAE5F4BC504D7B930BEC2762AEA3B69414F9D613E0B3A7DB315AB4C6241938E72C057C651D377EEF3CA54554BB9ACEBC405E8944424AB02DAE1C0621540EFB55BA00AE8412602348925A1A007D074E313A00930543E5BBB1D5347BF853BEF6B233E47464508EB9020202FA8158B3FC391C3C7C5F61FBED92F1217464C7CB494E558D1CDEECB7609E831E37DB4A00F66635A25035ADB3F7A01AD85FEDE9D3F63D60BCBD1B8E945A85E23465864D437ED3ADFE49294FAF0E77D7F8BD8DCEC2339F8F3F7C31830F43EB4B8552D36B5ACBE91809E6246406FB2E283F70317C5519666DAE88EFF3520BB9FB30474923780B63BB0E44B0517C71EBB05C98A16F4600301BDF895B578F3E535655AD065017AD9C2F5983FE33D51AFBCE20EE85E778F47FBA49BD1332D455413EE8F43C7F058FF3B5C87496E31109FEC98233E2F9CB70675EAC5BBAC6F5FC0AB5A57027A941F003DC347407FB16137664F5C8E79FF19E6D1822E0BD0546FDEF4F7307BE1900A2D5B2DA0E74C7E0794C94A6F4DD56B563BCF2AA7F6A80FE72C7E06D562A384E5AD7D00AB6AEC693F023482C331D98480CED864C56A1302DA17BDAB5A5D09E8CE29894852B5A0ED0EBCAD0AE82445400F3100D01FBFBF15F5EA5F809D5FEEC398E9BDC52BB22717873BA0572CFE5CD4A37D474EEE25EA51D9B5FD2711FBDCEAB6EB4AF5BB27405F50ABBA184DA6927DF8385AB5BFCE94807EDE0F807E5127A0FB3E3005575C7B09C8DD90D22D11F73FD249844AB9BB38DC01FDF8BD1371CD8D978A7AF4207CA44FAAA847EE0E59BA746F5DAA9FDC01FDFDDEFD88BFC0E9DA292CA089E71DA506102B1BD0934C08E82F18D001E7B916D09DBD00F47F5400BDDB6E41D2E56A3EE8A79FAC7C1FF43F4772D0A94B0B217A932B1A887F5500FDE76F87CEABF7D3F77F62E4A0F90222D2AF2D7BD313A09F1AF900A2A29CCBD253A1412D0904FADCF6EA3434BAEC22B1EDD60ED7E39E073B20B6BAFE946B6FAF2C69418F1CE7BB8B63E614EFA338C8553179E4620C18769FF8E91736A8E5F2BF5704E8514F2DC0B0F10F8B7A752F4A404C356782CCAF3F3AE743F9FCA31D48A85DA3543FB903BA76BD78DCD8BCA94BB6C8280B2E6A58CBF599004D83BC34A776C34BEAA0EFD3DD41757C2DD2829E38DD7C3EE82F365BF1215BD0BE76B14FF525A06F4F4944E714B5280E1A245CFA95828B8300DD5911D0CF18006852CA134CDD0709E50022EDEFEE83D6AA5DD6364F80FEEDA703E7B946C8C27BAC7F57F1B0D0BA38DC7BB4BC6D3EF5BEA6B204F4737E00F42C9D80D60E126ACFCB1DD0DA814095680CF701623AB63BA057BEBD110BDF1FE57A70BBF7BDD68276D7BCBC6D15F58F04F40B2605F41A0674455D58A9DBB580BEDD0B402F5301F42EBB05B73755B3A0870EA85C0BFAE3555B8590A977B72E25280DC88D7DFAB552DF692306D2D7EF425E5EFE79F5CA83371DF3930FB6E18921DD85CF92CAA3778D455EAE333D5500E2E18EF8F3F743B8AF67475C7C693DF17A3EACEF5CD7F6071F4F466AB756220C8FEA2E5E3DB6522F0409E811E3D250C387288E4399D998AD03D0D95939220C72E838A725EC0E68EDE767C7F544F3565789AFA8DE2BD35762EC8B69E7D573388AF055C6B7F8FDE783CE70474D79A2C7244C9ADBDFF516336DCC5BD8B96D9F6B0F314878FB4DAEBEFF27FB0486F49E85FC33CE19175BB4BECAD5BFCF3EF192685FCF8C7412D0E3A799CF82DE9A6E4520009D73EC94087D3DFECF29D44C882DD54F957A1398F0E012D09D9213D14911D0850E07962B01DA664127450B7A582503DADFDA5328DDD2373E11376CAFFE5D51BD86337E57164F0381E5FD06772B9942C7EEEDD9A19445E7EF73D01E4F027AF8D834D4F0210EFAD0C16CBC34D57B1747659CDB86755F63E91B9F62E0F0FB85CBA4569D73B1D42A96B7F637B95BC9DEF66F59E727013DCE8C80DE6CC5DA55C646711CFC2B1BEF2C5A8F5EFDEF100FCF63474F8AFB8CC22169DBD123392E296F68DE14741FCAF048DA264353698A857DDFEC2F25BBDC46061485B9D25BADBC2EC865291FBE141E2B5DA0DAF04BD91ED5A37249937AE7DDF7FEBE8E25A03B7A0368BB03EF6C57707158BD00F4F02A06E8BFF61F16373F95EE0FB547D32B1BFA04E8A9A39688812E59FEFE230BDD7AB4F38B9F53E5A291801EE623A00F9B08D0F49093A5636A7397D54DDF790BE837E67E88DA756B9E5DA710C2BA6BD8A88E6BC05845634FFB48408F3529A03F3218D0145143209403F152331A079A33658548F4AA5D375E44D14C98D5474C86F4F66BEB70C5359708781384BB3FD81EAB5764B800BDEFBB3F109F108BE726F612F75397C4C178B84FAA00345D1714563969E4225C7BE3A5221B91004D6F4F140EFBD9DA1D3879C2191F4FE3481FBDBF55D42BEBBED77B1D94554F0BE88E8A1634F9A0DF55057447450B7A44150374451D411714CD1BE029E1C1535D4A035FFD4E866B53F3C42B85EBC3A822013DD40F809E63120BBA3CEDF272F3854B431BEB5C91D6ABDF4987CDE64CD3BFB871DD52C0AFA86E59DB25A0C79810D0DB365B611640D338C2DE9DBFA0FFB3F708AB973EAF7C6B83C835A090594A4EBAEC8A06221C72D1AAD1E78D3168A19FD27210868E7DD8D5F734A651BF612D91854AF378C831244A446A72797DD7C3C2DB87BADE6B425B4F02BA437222BC01F44A1540EFB459D051D107FDDCC0CAF541FB43ACFFE56348403F4B80F6C1074D16F4DC69E670715485FE92801E3DD57C3EE86DE9567C6C120BBAAC815E02B476905F05D09E069DE9812DC710C862BEA8412D3CD83B091F2C4F170964A3A7F51613FE7FBA663B766CF91E1D529AA1634AF34ABFC4B480EE90AC1EC5F1DE0E05170701BA8322A04732A02BBDB3CB6B4002FA9931BEF9A009D02F33A095FB52027A944901BDAE8A02FAB6EBFAE0E2C6CE37D04EA9CD71C77D6D5CE1979E004DAE8E0617D776F51BAD2A44EE904307FF41DEE93398396119E62F1B2E129A32FFCEC6964D7B71FDCD97E1C616972BF7B59E1D25A0DB2727C21B40BFAF02E8AFBD00F4F30C683DFDE7B73A12D04FFB01D0F318D0CAFD2201FDBC0901FD65BA1546039A9284268E58245C1904C823878EE1C509CB7073CB2BF0EAAC559830BB0F12DB5E2BC25229DEBD2C0BBA7B876158FCC118D10F1116E714A4B27802F4AEED3F62D5E6692E88BB77A0FB203E65FB6ADD1FCA1DEEE58E5A40B7F7C2825EA502E81D8516DCA668418F1914581707AD8442E174B2D0C08176D4DF4B5D3DEEEE29E142EE6844ACB38A053D78741AAAFB10C59175301BF3A7FBD7C541A174B22F643FD1EC76349B1D85D2D1E010CD52E89ED823B7D179934544AFB0142E4759829E2653D26EA32880FC3305E78DD297D7877AAE1109E81153CCE7E2D89E6EC5271F181BC52135ECF7D0541CCDCAC105756AE095FF0C135FD3140D1FAFDAE69299C261292263E7B61F5C619414F238FDD541E27B6DF82CF997DB77BE5984ADD2B1E531E5C1A81ECDAF220B0D1252DBE4E7166DAF1E23C264FB3F34557CA63059F79C0A3DFD5F511D09E8764989B84D11D0857607567FADE0E22040B75304F4D800039A468FAD5FFD284685A9D0D35926915424A2EAF6AA00E8A7FC00E8057E06F49D6D9EC6AC3787A051930B21FB893E5318160DDCDCD769840849D4CE48487D42BE49E9BB6CD1FA6A74B9A73506FF7B961885F7349F0AF92FE5B6B2E6DBA82C400F3729A03F0D10A055EFA9B2F6F36425FBFB7EF6F537AAD4D702BA9D1780FE5005D0DB0B2D68AB08E8F12600B476A4F744CE69BCB5E063116E73ED4D4DC4BC1BF44AB375F35EB18C0E8DFE535CE6B7BBCFAD44DE29B585784253ECE68EADDFBBF46F7DDBF5C2BAD35E349486FCEBD9701DAA3773C252D196AFB3A3A974BAA77DA48B63A01F00FD9A9F01FDFC53F3C572474F3CD54D845A757BA09D6B647DF9A2F57865FA7B689678A5887796912F14A7FCC7AF87D07FE8BDE27429DDBB41A33A98F2FC12D18FF49AAC8DE0A0FEA5C996562DDBEC9A44CBD3844833C6BE2DDAF6573F91055D121C8E612604F48E742BD6575140533F5DA9993296AE857B1E6A6F58D8AADEFBD0BD9E0474DBA444B4F502D06B5500FD9517809E60324093505A2B8A42712896B2E60571C2BAA6F932283599C2E32894EEC3151948BE2B110FF64EC6DC292B047C699F8DEB76E286669761C0881E6262797A2D2338D320832C54C75668C77303E6056C850F09E8017E00F4EB7E063459C9CFA4BD040A7BA242206ED8A8AEF83FB986E875935E69C94A769FEFDBFD82F734CA4FFBC8B4FBC7BA4F2817D0FE0EB592801E6A52407F5645014D092C2BDF76BA27A8D0020FF29AF1173C8D388E04741B2F01FD910AA0BF2CB4A08DA2053DB10A00FAFA669789C99124BC656A32C565EEDEF11386F59B8BB7D68C1329DB23A73C269257F67DEBF485BDF9FE683C76F77801684F596874419901D0FD7D04F49183D978C3CF80A61903972CF858A4C3CBAC407973C8B792B21664280BD0EBD76EC7DFFBB3F0F8A0BB44F201B59174674B24B7181410403F6342407F9D6EC5E75514D046C0D3883624A06F4D4A441B2F2CE875AA80BE5511D093AA00A0B53E2C4F3E4AB2E616AE1A7DDE5A77324D58029A06BADE5BBA115B36EEC5B817D344DAA95900DDCF0F807ED3CF80A6C13B5A458532F7126A55C7ED5D6F11F706E99A4B96D28629C2D7BC7CE17A8C9AFA6F11FAA49DF04A7B23490B5A6B096BB3D7B42BED787271549605FDB44901BD81016D0487CB6C430BE85BBD00F4272A80DE566841EBCBD4264B9AF25460A3383CA598BABB38FC0568EA0D8A1220B7C6D03E7330FDD581B46CA1292CE8BEA3D310E743A2CA91CC6C2CF233A0098AE44EA231026DA815C19456D4888EB1880C3FD273D2DC7EC247AC02E80792468A745E5A717DDCCCB452F5CA1A24AC2C400F9E6CBE288E9D19566C64409B02D0AD9312D13A492D5185A238D6EF5488E2D85A68412B45404F3301A02FBFFA62B11415150ADD5A307315A6CD1F203E6BA706A5CFB43EDD90C7678BC9E1EFEAD10E4FF69C26328E96AC1E839E778C1193C30F19F520260C7D037BADBF8818CB5EDD9C2E0E5AF4925627A6623640F7199D86581F009D9D998DC57E0434BD59C8370FD28B1EA4B29F526E71BA236491DB28E98016E17DF88E316255162A8BE77F849B6EB95C58E2940A2CDD54031F9D8101C3EFF7B856E59A955F883E9485E668A09570FCB91AB8F4410F3221A0AD19566C62409B02D0AD9212D14A11D036BB039FA9007A4BA105898A809E116040D3725634D22F4BC20571229E52161AF8BBF3FEB6C21D21CBD64D7BC53C00B2CC7B7BA898649E66C6A2350865916E0C19A3A9AD27B77DB7E737AC5BB50DC3263C12900B420E12A6F901D06FF911D0E492D0F6857B3F49D8926872DBF40503852B845C23CFF6712E23F640AFDB856B64CC9057316EE613E23BD94F721B7D275D20EE7D48DBA87F694C81067EFDD54F12D0034C08E85D19566C664007E47E948D4A174762522212BD00F4065540DFD244CDC5317370605D1C01ED85B3D108724DC240FC1609E8DEA37CB3A08F6666E3ED19FE4D5409841E65B5591971D02541E1E86F4240EFCEB0227D75601255CCD4E781FC2D12D02D3B27A2A52AA01D0E6C5201F4170516DCA26841CF6240BB168D0DC4052101FDD828DF7CD0E4E258CA8056EE4261410785A39F49019DC18056EECBCAD85102FA162F004D3EE874AB820F3AA3C082168A807E69F074445A827055937339F39571C2663DE6E71FEF0025AC04AAFC71D0816339C5E8E5070B7AD98C25A8151F8C06F54203753A95D66EFA67BB444291BFCA9E1F6C08098F405F13027A4F86155FACDE8CA68D42512D3AD85FA7CCC7F1428133F925D8F79B1D2D3A27E216550BDAEE40860AA0D30B2C68AEE8E2583A6D218E671DF3E2A7F3AEFE562022D2827F3DFB0862AAC7EA3E744EF631AC5EB012B9274EEB3EC6FF5BC5EA0935D0F3B9DEA63BED9FAC3F20E3838DB0E53B97F9E2121805424243D132B9356EB8AD99D20FB0391CD8A20AE8668A80B615DA50525CACF40378A7CA522008E1967011BAA6B7501FDA6D769450DC2017250582828285EE662B458E2238ECB44001F76560FB2608A161212050AB148AE2D8BA4BC1C5B1B9C0829B1401ADD230EFC30AB002AC002B50BE02345BE3972A80DE4480BE542D8A834567055801568015F05D0172716CAF08D0E9FB0F634D4E092EA95BCBF716F908AC002BC00AB0024A0A388A8A91F9D79F187FE345888F8F47585898CB6D1954545454929B9B8B1F0E1CC6C63FB270A6A000C5EC5B561296776205580156C0570508C80D6AC6A16BD3FAA859B3E6F980CECFCFC7D1A3479195958553A74E89A5D279D0C857D9B93E2BC00AB002E52B4003FC91919148484840DDBA75111B1B8BD0D0D073167471717189DD6E475E5E9E8073015BD07C4DB102AC002B6098026441C7C4C408385B2C1601671999154480266BD9E170883F726FB0F56C58DF7043AC002BF07FAC80043159CDF4476BAB6AC366F507D0FE1F8BCAA7CE0AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0AFC1776FEC638DDA41D8D0000000049454E44AE426082 where `app_id` = '5';
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EED9D079855C5F987BFA54957AA882E282088051535D244EC0876A3222A2AC1462C11A3F2370A0AA8281883062504BB066C815829828A801A4540015B0451A42ABDB848F93FBF91B3DE7B97652B7BCFCCBEF33CFBECEEBDE7CC7CF37E737E3367CECC77328C040108400002B12490114BAB300A02108000040C81A61140000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C6641000210C8D8B871E33630400002108040FC08646CDBB6ADD408F4EAD5ABAD4C9932F1F3021641000210D801815225D04B962CB12A55AAD010200001087841A05409F40F3FFC60D5AB57F7C23118090108400081A60D40000210882901043AA68EC12C084000024902FDD4B41FECE5E94B774AA5FF59FBDBA199D5BC24C71487976EC36808945A024902FDE0846FEDB559CB770AA3EF194DAC7DD31A5E0243A0BD741B4643A0D412608AA3D4BA9E8A43000271279024D0CFBCBFC89EFF68719E531C8737F073250423E8B83747EC83000412092409F490B716D82B3397ED94D05D6736B176FB33C5413382000420B0AB0930C5B1AB09933F0420008142124812E827A7FE602F7EBC64A759DD7966133B6ADFDD0B595C7A4F638A23BDFC291D021028188124817E78E2773666C6CE97D9F53BAB89B56DC21447C1307334042000818213608AA3E0CC3803021080408910C816E8A5ABB7D9C4CFCD14DA2EA420D1671E9E615576FB9525531C25D2A628040210282602D9023DFA13B38F977F61AD1BD6B41E2FCDB46F7B9F6815CBF91F9AF38BC56607EC854017537B211B0840A004092409F46D6FBF6DB37B75B0F7E6AF70E2DCAAC16F73CD0FCD5A6D0BD6FE6255CB97B116B52AD8B94DAA5AB709CBECE993EADAFC35BF58BDCAE5EC9C3796D898CEF56CF20F1BEDB87D2AD947CBB2AC56C5B2A688D3B52A95B1B92B3659FBFA954AB07A66087489E2A6300840A018092409F4F1076EB6BAFDC759A5F2656DD59D1D938A397FEC12CBAC5A2E49A02F1CBBD44676DC3349A05BD4AE60F7B5A965D316FF6C99D5CAD9F8051B6CE2C28DF6E3CF5BAC41B57236E2F8BAC5687EDE5921D07933E2080840209E049204FAEC96664F4DFFDE2E3D223387B50BD76DB6BA95CBDAC08F57DA21B52A58AF293FD9ECAE0DAC4AF90C27D07B552967E7BFB9C4469C50D75ABFB0D06675CDB455595B6DC2771BECED1F7EB6EE0756B36BDF596EB32F6A50A22410E812C54D611080403112C821D0C598772CB242A063E1068C8000040A41205BA0376C321BF34978AF273CEFA80C2B5FF65732ACE228440BE1140840206D0458079D36F4140C01084060E70410685A48A924F0B7BFFDCD264F9E6C071E78A0DD7CF3CDB6FBEEC51FBE60CB962D76DE79E7D9BFFFFDEF9D32D6CB8C7BF6EC99744C6EE75C73CD3576EFBDF7DA1E7BECB1C33C478F1E6D679F7DB6FBEEA1871EB2F6EDDBDB61871D56641F47BC0E3AE820EBDDBB77915FBE7CE9A597DA3FFFF94FAB50A142A16D7BE38D371C87366DDA14288F49932659870E1DAC4C99F82F2346A00BE45A0E0E81409F3E7DAC65CB9676D65967D9BA75EB6CFAF4E976ECB1C7167BD50A22D02FBFFCB2FDF18F7FCCD38665CB96599D3A752C2363C7DBC9CE39E79CEC0E61EDDAB556B162452B5FBE7C9EF9EEEC80FBEFBFDF0E3FFC703BE9A4934C79CE9831C3097F51D2A2458BAC7EFDFA45C9C20A2BD037DD74930D1C38B0C85C8A647C3E4F46A0F3098AC3C22170C71D77B851D7A9A79E9A542909EAC5175FEC8443CF2B9E7BEE392B5BB6AC1BDDEA77B972E56CF3E6CDF6F0C30FDBFAF5EBEDAEBBEE7202DFAA552BEBD6AD9BFDE52F7F7102B66DDB36AB51A386F5EDDBD78DA03552DBBA75AB13CB7FFDEB5F39406A04BD2381D6B923478E74E75F79E5953662C40827E283070F769FA9CC7DF6D9C724DACF3CF38C4978E6CF9F6FFBEDB79FDD77DF7DF6EAABAF5AD3A64D4DA3DECB2EBBCCD925FBAA54A9E28E57521DDF7BEF3D67DB01071C601D3B76B47DF7DD37C946E5D5BA75EB1CA22C5E5DBA74B1CCCC4CFBEEBBEFEC85175E70769D7BEEB956A95225AB5BB7AEF5E8D1C3A64D9BE67E2BA903515D2FB9E4127BEAA9A71CD7E1C387DBCC9933DD685A9DC9A04183ECDB6FBFB5FEFDFB5BF5EAD5DDDDCD9D77DE99835BA2402B5FD5F5ABAFBE72C7457720BD7AF572EC656BDBB66DEDC71F7FB42953A6381FAB8356C7F3873FFCC1715CBD7AB5FDE94F7FB2430E39C4EEB9E71EEBDCB9B3F3B1923AA9264D9AB8BF2FBAE8225737B50171555B12C70F3EF8C0B50F7D76F4D147DBFFFEF73FBBFBEEBB5D5B58BC78B1F3654113025D50621C1F0481010306D8279F7CE244FA8A2BAE7075BAFAEAAB9DF84A2474B10E1B36CC6EBDF5D6A4FA5E78E185EE62DCB871A31364DDFA2B49602444895315A9236809EA934F3E99E3D65A02AD119DC44249827AE491473AE1FDEB5FFF6AFA5E2226018B047ADCB8714E647EF7BBDF25D9973882D6744724D0BFFFFDEFEDC5175F74236FD557222FE1934D4F3FFDB4CBE3EF7FFFBB9D76DA6939045ADF492C35724EE475DD75D7D99021435C7D366DDA6462DAAF5F3F27D012612589A3044DE2A4CE4CE22BD1534728811647899FCE4B4C3A479CA34EA45DBB76D6B061C3A46352055A9D9F3A9A7FFCE31F6E0AA359B366AE43489D2EDAD9085A763DFBECB34EA035FD251157DD24DC8F3CF288ABA33A4EE51D2509F5D0A143ED965B6EC916707580127E7D5EB972E5425F330874A1D171620804341FA90B5BA3535DCCA973BB8F3FFEB89BA3D6A8F3DA6BAF35895224D0121A898B92845DA3494D3F442955A06FB8E1062750A9F3AEB98DA0958FA663F6DA6B2FD3DCB35224D01AA15E70C1056E54DCBD7B7737F255CA4DA0BB76ED9A3D7A57672091AE55AB961B753FF0C003EEDC51A346B9BB81D41174A29F5F7FFD75577F3153F9E2122509B538260AB4BE133795A10E43234B8DF023811E3F7EBCEB104F3CF1C4A4E6A40E45A367A568547AFCF1C7EF54A0D529A8037AE79D77DCB99AC67AEDB5D74C3EDC73CF3D9DC0EAFB4481163FD5435C0F3DF450676B24D09A27DF7BEFBD5D99E2A539F3D4BAE93BDD81A8038DA6927497F2C4134FB8CEE2FCF3CF7777130F3EF8A01B7517342509F48A152B0A7A7EEC8FAF59B366B68D2CB38BBDBB4AC4405D94D11CAEFED645A751D68E2E3E19A4D153345296D0E902D6C82F51A0256E8D1B37B6A38E3AAAD8047AE5CA95EE81E082050B5C99128044818E0A927D9AB691E01654A0AFBAEA2A37E25492A81C77DC7139043A91978E8B38258EBE131D97CA517717CB972F777724D1C83A12E82FBFFCD23EFCF043BBFCF2CB937CAF291189FDCE52EA087A47021D9DAFBB113DDC9458270AB446BAA79C724AB678268EA07724D0EA841F7BECB1A48E4953195F7FFD758E29B344DB773492CF4F6367049D1F4A1C1314014D4348A0759BFAE9A79F5A8B162DECFAEBAF3789C5983163DCADAAA62B340570F0C107BB51902EE4F7DF7FDF4D03E86FDDBA270AB4FED7ADAF4445F3AABAF5BFEDB6DB925671147404AD919D845923F11B6FBCD11E7DF4D16C81D6A84DA3448D4835BAD3E850237309811E786A24F8CA2BAF644F71E43682D67CA9EE10347DA0FAA803481D41EB7B7548E2356BD62C97A718CD9933C79521E19B3A75AABBFB10AF548196C06B6AA8418306D9771C91408B95F86A84A9C194F8AA3CB1D31CB0E67755374D3FE9D8C49497406BCA481DAB58687A46D342EAC8F46C60B7DD76B34E9D3AB9ECD4396B8E5BD31AB367CF767712FA7B4702BD66CD1AD3BCB63A1BCD93FFF4D34FCE07AA836C974F7497A472C4453C357216FFA8732AC8C58440178416C7064340A2118D0C135744E4F6B90458B7F089A3C9E8B34428FA4C295AC29578CC8E8E8FCE8DCE8BFE8F1E2CA6E69398C78E6C8D3E8B6C557EAA5FEA798975D677FAFFF9E79FCF758AA320BC72E3A232A272538F49E526BB732B3362A4EF73AB5FF4799447A24FF4775467D993CA2CFA2C9551E2B2BCC4F3537D987A5C6AD905B9887208B4EA9CCB0A9E82E41BCB6399E288A55B302A8D04BEFFFE7BB70A4349A358CD67EF8A35E169ACA2D74527BFD57BCA3CFB79F3561BF4EE37B6E8F693AC42D9F82FE42E087D04BA20B438B63410D0148FE6A0B50C4C73CA5AB5408A0F812481DEEFBEB76CDEAD27DADC656B6DF9BA4DD6A151AD6C4B35EFA6B58BBA1DF8F9E79FDD7C979EAEEAC185FED71A51CD95699E48437CFDAF792B3DDD3EF3CC33DDFCD5860D1BDC13CDE8964BE72B1F2D458916E9EB182D4BC9CACA72652B1FDD4E285F7DA627A32A4FF9143421D00525C6F11080403A092409F4B275599679EF5B6EE4BCB65FF222FEFFFEF7BF6ECDA5567AE81648B743BA356AD4A8917B70102D44D7F21BED12FAF39FFFEC045A02ABA7B4126309ADD66E6A82FEDD77DF75EB0CA3759C9AFF6ADEBCB95B485EAF5E3DB714470F1E162E5CE8167A6B725E1D8496BAA84CED642AE80E29043A9D4D8DB22100818212C831073D78F2377663BB4656B64CF256D28F3EFAC8B4665473547ADAAADD387AEABDFFFEFBDBAA55ABDCAD919E324BBCAB55AB66679C7186136889A8D6251E73CC316ED1BD9ED06A6792D639EA69B046D37A1A3B77EE5CF7A45A4F40F53B9A84D712966FBEF9C68DC0C78E1DEB9E866A81BBF2296842A00B4A8CE321008174126015473AE95336042000819D1040A0691E10800004624A00818EA963300B021080409240EB619E7611E9815ED5AA55DDAA0B45A8D2CE2B45ABD2C339C50DD04A0AFDE8819EE20468894EB49632CE4813E7A065BB7E14C12BAE49DB47B5C32BBF3173B5253835A04C71D74DCF066457F4FC20357FADB4D143E01DA52FBEF8C27D9C177305A7513E7A9641824069269043A015C54B1787045A1788566868CBA9B6BE2ACA96B636EA619DF6FD2B5A93A27D69F585B66E6AC5469C53A2402B8297D67D6A758A02A2E83BD5574B04B536F484134EB037DF7CD33DEC548018EDC157D272430544D777A79F7EBAE3A3285D8A68250E7A98AACF274C98E0E232A8E3D203506D1356795A8AA82DA75A7AA80032DA22AA73B42A45DCF5E0554161B49450F10B74BEECD183586DADD5F2426DCFD59662F1D7AA16D9A6F2E4336D6955D017C517506C051DA380318A52A687B68A68A6E3B5ED542124D5E1469D5594AF1E048B83DA42547785AE94CDEAC4552F7D2F16DAD6AB108FB25D11D8548602E8285E81F251EC03D910EDCA52E7AFB6A4B815F3E6CD73211915874151DEB41D58E2AE87C962A8F08DF2C3C71F7FEC98C8663DA056601D715084340D22947F648B56FE6820A1BCB5C5560F97359810BFDC82DCC7B9CD625BE926B04381D6084617A72E420984566A684FBB02AB68B99B0446610725D4DAAFAE2577DABB1EF7942AD08A9DA00B5D9F6B59A04687AAAF56986894A7D082123D8D18A3D0870A5EA33B0A45175327A52581BA8B9050EB78E5276E123EDD7D28908D045AE22D6E1268C54A50BE1220899AA25F291E80BED77A6F2D558CB69B6A1DB946C5B251DFC907EA10140B41211915E376E9D2A556BB766D17E74002267193684ABC155652F629C9A75A65235BF5B7444CC2AAF8B75AF2A8E03CB7DF7EBBF3E9C9279FECCE579C07896A62E72B51543D141FE188238E308582D49D978454E2AD7C159F409D85CA57A84A89A692F252A728A6EA84541FD9AFF8063A473131D41189AB96574AB83540500728C1958D8A4FA1A872126889BA56F928EA9B96668AAD6C136FD55BAB8DD4F12AB2596A2C87B8B757EC8340A99D837EFBEDB75DE42E2509A20276FFF2CB2FEE7F858CD4F240ADD5960068599F8443499D9136D548B0156C45AF4D9238456BC1B5D450EBB5D5C9693427B1D4765A8D5C25D61A792B088C924675FA91B84AACD5112A088EEE46D459A82C95AB7325E8DAC0A3602E2A5F1D66B4645122A7202D0AE7A8BC14B94B235B8DD015B92B8A0D106D02529017E529115647A20E401D93469A2A53C165F4B7C4508163947F9487EEA0C44382AA0D462A471D8C6C175309B6045165EB188D86B56C32124789A7363B296F754AB249DFAB23126BD92F5E1AEDAACE9A5A93C8EA0E409D8B3A27F9450CC54A62AF3A8ABBEE7634D2572C604DA768E9A78ED19D8882EE48F44910F08940A915E8743849C2A48D373ECCD7EF4A3E1A592BD29846DAD1C87A579647DE10F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B812481D6DB8D434B9A138D125BBD43F32EF58140D804184187ED5F6A070108784C0081F6D879980E0108844D2087406FD9BA2D4724BB501030C5118A27A907044A07812481EE39E633BBEC884CEB39FA539B78651BDBBDE26F3B03B53C4C6B59A34D0F05C1A3B5BE5A179CDB6BC7B55141AF454F4DDAD4A06DE4DA2451987253F343A00BE2358E850004D24D2049A05B0E996C1F5E7B8C8D9EB3D89AD6AE6A87D5AF9E6D9F3621684BB43674BCF5D65B6E1DAB767069E75C93264DDCAE3AED0C536C676D858E5E63AF0CB4A9429B34B449415B87B5414431A2B57B4DDB8CB541449B0824A0DAC1A7EDCEDAFAACA4E3B56B51C768A79A369068D384DE1E2C9BF45D7E13029D5F521C070108C481409240676DDE6AD5FBBE69D52A94B31FFB9E92649FC4308AB52031D63666C544D0AE31EDECD2E60BC53DE8D7AF9F7B8DBD624F68C79BB6DF2A69E7DAFCF9F3DD2E37ED4CD3CE33E5A11D631264C5F950BC05ED3E53D20EB448A0B56B4C82AF2DC5DA55A6D1B4768C699BF2C08103F3FD6615043A0E4D0E1B200081FC12C831073DEEABE5764AD33A39CED7565C05B2D1765C05C351901B05F151DC0AFDFEECB3CFDCD65AC54E50AC0A1DAF2DC31AED8E1933C68DB425E8C3860D7379286684A63624D08AE9A1EDD2DA82AC91B93A03C583508A5EB5A511B7B6F00E1F3EDC89BB5E95A500398A0791DF8440E79714C74100027120E0C52A0E6D9196786B34AED80C0D1A3428143B04BA50D8380902104813012F04BAB8D820D0C545927C20008192208040970465CA80000420500802087421A0710A0420008192209024D05A8D115A5200F72831C5119A77A90F04C226C0083A6CFF523B0840C0630208B4C7CEC3740840206C023904FAF365EBDC16EFFAD52B065773A638827369A12BA477362686A22D74469C586402DA613C69D2246BD5AA5591F30A2D8324813EFFB9E976EFA9CD6DC0C4AFECDE8ECDAD5EB5DD5C7DB50E596F6B563C0DBD2F4E2F19CD2D45AF338A2328043A8E5E29799BF47670BDC19C142F027AB72529994092401FF3E8549B70456B7BE4FDF9767AF37AB67FED2AD9476B37A0E26668B38876F4DD7DF7DDEEA5A3EAF524E07ABF5CE3C68DDD4E42357E8D50264E9CE8DE7EADB73A77EBD6CDBD9C349D09814E27FDF894ADB795472105E263159620D039DB4092402BD468D53E6F58A39A556C4EAF0E49474B7815284923E9050B16B8DF3D7AF4703137B4055CAB2514752E12E8112346B8A0491A711F76D8616E6BB8822AA53321D0E9A41F9FB211E8F4FA42033D4D6B282546B144A0F310687DFDE5F275D6AC4ED51C476A7A4391E4A2ADD653A74E75C18BF47AFBAD5BB7BAC8744AD3A64D73236AFD2F2197384BC4EBD4A9136B815610A7281CAA22E7A90E152A54C8C1418D28B7F94B71C8C8C870771AAA2F299E0410E8F4FA4561841F78E00177579D18461881CE8740EF0AD729EA9C46D9E94E3B1B417FF2C9272E509342A67EF4D1473674E8501B356A9475E9D2C545E8D38FEE10F4604902AC8EEACA2BAF74C7D4AE5DDBFAF4E9636BD6ACB19B6FBED956AF5EED824029ACEA8409135C1C6DDD3D2C5AB4C83A75EAE442A516477CEB74F3F4B57C043AFD9E9348EB7A4A4C08749A043AFDCDE1570B7626D01A358F1B37CECDAF2BEEB446FE125AFDADBB028535BDE79E7B5C4C6C8DB6155255E2AC39F6D1A347DBE0C1839D40EB2EE3F2CB2FB7962D5BDADCB973DD485A3FB366CD722155DBB66DEBEE3C24DAA4F41040A0D3C33DAF52116804DAAA57FFED25048938D6AD5B6755AB5635FDD6685F3DBC42A4469FAF5FBFDE854ED58FA63F3495A1E334E2D6D446E5CA95DDE74AFA4CC72969AE4DC7EA1889B7460D3A0E81CEEB72DD75DF23D0BB8E6D517246A011E85C05BA280D8B73FD228040C7D35F08741E02FDF9E79FC7D37345B0AA79F3E6D967B38AA30820033A15818EA733116846D08CA0E3796D96A8557A5D5AD7AE5D4BB44C0ACB9B00028D4023D0795F27A5E288993367DAA1871E5A2AEA1AF74AEA398D5651E93576A464023962716CDDB6CDCA646404C989298E20DD4AA520102C812481DEB465AB55EBF3A6952B9361EBFB774AAAF4800103AC7EFDFAD6BD7BF7A4CFB5A350EB86F5C66FAD6448779AB772832D5F97654767D6B08E8F7F6063BBFF168005814EB777281F021028088124815E9BB5D9F61F34C9BAB5CCB4FB3BFDF6704D19EA4DDB999999F6D34F3F3941AE56AD9A7BBBB7DEE67DDE79E7B92D9B5AEF3B64C8103BEDB4D35C5C8E74A5E3864FB30FBF5F651B523A19043A5D1EA15C0840A030049204FADC673EB6D7BE58EAF259D0FBC4EC687691406B67DC871F7E68471F7DB4CD9933C7962C59628D1A35729B37B4A9A366CD9A367EFC78B79EF898638E298C3DBBF41C047A97E225730840A098092409F4D2B559D6E6D129B677F54AF6CE556DAC4CC254B476DA69A345F43BDA8CA10D17FAD1E60B4DF62B66876258A46EE32C66BB0B951D025D286C9C040108A489006F544913788A85000420901701043A2F427C0F010840204D0410E83481A75808400002791140A0F322C4F710800004D2442049A0B5842EB454AB56ADEC2AF1903034EF521F08844D801174D8FEA576108080C70410688F9D87E9108040D80410E8B0FD4BED2000018F092409F4DC656BADDDA3536DFDA62D967577E7A46AE98D20F3E6CDCB7EF16BF4A691E820C5924E8CBD9C2E265FFDB8DE662E5A6D671D54CF0E1BF2AECDED751C73D0E972468CCBCDEDC5BF313679A7A6E9FA9C346992DBE54B0A87409240EFF697D76DD59D1DEDFFC67E6EB316AFB1B7AF6C935DD3912347BAD7405D70C1056E3BB7760F2E5CB8D06DF1AE57AF9E6B18DA45F8EDB7DFDAF1C71FEF5E1795AE74F5E84F6DE4CC1F6CF55DA72699C043C27479245EE5BEFCF2CB76D96597C5CBA862B266D5AA55BC4EAD9858C6219B24819EB374AD1DF9F07BA690A3A923E80F3EF8C045B3D3BBF6147B63ECD8B1AE2128AEEED9679FEDEA2281D68B5157AC58E1E272C42D21D071F3487AEC09F98D2A08747ADAD4AE2A9539E85D45967C634B200481D69258DDD12A068EEE60A38440C7B6D915CA30047A3BB665CB9659DDBA757340D4DC5EF486EEC42F57AE5CE90247EDE89CC48B456F11E72DDE856A9BBBECA44481966F468D1A65CD9A35B3962D5BBA32A74D9B666DDAFC36BD976A885ECD3479F2646BDDBAF50EEF14259CB9050BD3F4E082050BAC478F1EEE6DEF854D0A4C3678F060EBD2A58B356CD810812E2CC8989F87406F77905EB973F8E187DB4D37DD6477DC71875D77DD75F6ECB3CF9A2EE68B2FBED8CD59F6EEDDDB1E7CF0417BFAE9A79DE8CE9A35CB5E7AE92517BD4FF3F11D3B76B42953A658BB76EDEC9C73CEB15EBD7A59DFBE7DDD05F9C4134FD825975C62F7DD779F2B51F9DE7AEBAD2EEFB66DDBC6BC9984655EEA085A7E79ECB1C7AC7FFFFEB6DF7EFBB90EB943870E56A3460D173AF79B6FBE7142AC51AB845CBE97303EFFFCF3EE554DEFBCF38EA983EFD3A78F55AC58D1962E5DEA62A32F5FBEDCBD624D0FD4D5564E3EF9640772F6ECD9A629C3134E38C11DDBA2450B77AC3A7DC55DBFF1C61BF3055C22AD69C6C4C4083A5FE8BC390881DEEE2A8D86C78D1BE72ECADAB56BBBF9F69E3D7BDAD0A143DDC525D11D346890B56FDFDE5AB5FAF52D2DFA5C6F94C9CACA7217982E565D987AD79D1E940E1C38D0162D5AE4E6E875BE8ED7C5AFEFDF7BEF3DF7D203AD7C89C39B68BC69B1C56068EA085A235EBD68425305F2D58B2FBEE844531DB646B9EBD7AF77A176F500BC69D3A6B661C306F7105C3E9460EB6F75C037DC70838D1831C2BA75EB961D9637BA03D36F897724D0071F7CB0EBA40F39E410F7807DC68C19EED98EF292A8173621D0852517CFF310E8ED7E89960DEA628C045331AFA38B4A17A5DE2023418E56A8E8C2D6C3D2CE9D3BDB6BAFBD66A79F7E7A763C6C65AB63A3F3D5014471B3A3DB5F95A9D1B77E482547202E73D01A317FF9E597D91D7E711040A08B83627CF240A0E3E30B2C2921027111E85D515D047A57504D5F9E0874FAD853729A0820D069024FB10526804017181927F84EE0D5575FB5AE5DBBFA5E8D1DDACF083A2CB72609F49AACCDF6F58FEB6DF3D66D7674E61E61D5D4CCD8A8129C4B0B5D216DB0D283C050921E424E9F3E9DADDEA138747B3D92047ACCDC2576EC7EB5ACDE80F1493B09B5AC68F1E2C5A6DE590F35F424FBEBAFBF764FB9B506533B07F5E4398E2F8A4DF417021D58EBA53A10089C40BE045A0C860F1FEE56253468D0C01A376EEC461FC3860DB3ABAFBE3A5BA0759C845B4BCEB4A44CAB21B49E54C22D01D78A06C54190A05F7FFDF5258E16812E71E4140801081481409240BFFAF952B7CCDFC7480000071A4944415408FFBCE7A6E788C53171E24427CE5A642F81D6FACD175E78C1054F8A46D0D10E2A6DF0D0C27EDD76299D71C6192E129ED608FFE73FFF71427FD5555715C1ECC29D8A40178E1B67410002E92190E321E1A62DBF8A6A85B2658A649176D669E386C4392E09818E8B27B0030210C80F015671E48712C740000210480301043A0DD02912021080407E0820D0F9A1C43110800004D24000814E03748A84000420901F0208747E28710C04200081341040A0D3009D2221000108E48700029D1F4A1C03010840200D0410E83440A74808400002F92180406FA7B4CFBD136DE32F5BF2C3AC588E295726C396DE7E52B1E44526108040980410E8ED7EADD56F7C897BF8F5CB8EB2560D6A9478B914080108F8410081CEA740972F9B61B7B46F6CF74F9E67BF6CDF0E5F5417BFD2ED486BBB6FCDA266C3F9108040A00410E87C0A7493DA556C5DD6665BB236CB9DD1B375436BD3A0862D58B5D1AAED56CE9AD4AA62F5AAEE66173D3FC3BA1F9969FBD6A8EC824EED2C21D0815E55540B02C5440081CEA74047BC1BD6A8640B566EB4DE1D1ADB8C456BAC53B3BA56AB72799BB36CAD8D9AB9D8F6D9A3A2CD5AB4C6F4F283BC12029D1721BE8740E9268040E753A035C571418BFA3672D622EBD2A2BE7DBA648DD5AE52C1366CDA6295CA97B5951B7FB1792B3658950A656DF9BA4DD6B1591D7BFD8B658CA04BF7F545ED2150240208743E05BA489473399911F4AEA04A9E10088700029D4681FEA0675BDBBF7695705A13358100048A950002BD1DE7D8AF96DBA52FCC742FCC2D8934E0E466764DAB86255114654000029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C05302199EDA8DD9108000048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089EC0FF036DA3CE30CB0602C40000000049454E44AE426082 WHERE `app_id` = '6';
 UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EECBD07985C57952DBC6EA8D039A8BBA556CE39675996836C30C1806D8CC3100C0C434E33FC93FE6F12330FFE37BC37A4218C8D033080C1D8B2B171002CE728DBB2AC9C73ABA33AA7AA9BFE6FED734FD555BB2575CB92BB35AA82B6BAAB6EDD7BEEB9E7ACB3CFDA6BEF6D60885EB13BB6073E4C78A601D83E0CCF80E9039E11C0924F4C38A605C08411F80810C0E04F60008105183E8C20800F1B811CE7C30ABAE103088C5878570E10F8308C52048103580E3F95FFCB8FC1D358300C1B3E7A6106162C1FF00D0F401C7E1043607A809196F3C5DD243C38F0631E0CDF542D32B21D18F7D2181D0FD0DCE3A0335688C0F0D91898B0E049CB72AF5C0FE47AE0BCEC814F4E8BCCF4B7EF0E86E4A2BC3DEB8E1D816F98080C8B180CD333041C5D9320EC0B180B780BC01134F93E60868818185E088E1602D84040E07541ACF67D82B70D83C7C04760E409221B410AA6C177D4790358847F04BE8FC0F678115881058FE00F0B084C48A39046E073E1C8938522301CB05582F37D007AC594B17863CF0174984918310B81C7EB5AF009D6B957AE07723D707EF6C00507D077ED0994B54B20B4607A81401E41CF277ED29C860F33A02D6DC0353CB19E2DDF80011FAEE9211073D704021BB012804760766897C33613083C176EE0C2B763E0B74CCF4310A441FBDA342C3866026EE0C13003048101C3A4B51E082E7391E0F9D4EF2E2C0B705C1B26AD737E66A8B6F605E825134661EBBE43E88C17CA31B2BCF8862C30B957AE07723D709EF6C08506D0B8636F209C062D509F904900239DC0F76833F3C785E959423D109079A8007400B8B68BC052562F7C521C363F15F0B682344A3C179E6DA1DB00D201298B18EC208698E7A0DC74916701C71C07BDB6095AF2088A60F2DA6E1B4ACC143C33819E20015FAC765740BF302F0F1DDD2E3C338EA02F400740C24B63F954654177DAF9F0030F961583EF04C2CAE45EB91EC8F5C079DA03171A401B77EE0DC44A3600D315A2412C66E16D058A099C81B2A005A05DB1A04DDF16ABD5176ED8156A83C7D0A8B52C1BBEE7213FDD897F7CD72CECAC69C1833B8EA1CD8EC3430249C7C3F25185583C65040A8A93D8B87B1F5ED8D78AF678114CBF105ED08B3CEF383E75D12404AE8D751B0EA0D1CC9376CC1D5F85E5E392B8FF89ED684B94C3336815472CE810A0974D1983CD7B0EA03B5E048F0B0E2DF31CC5719ECECA5CB3733D10F6C08506D0E65D7B03D9F6FB2E92A91412AE0BC37709D1300D039E69A33399079871F537795F3AF482187C43CC6E18A055EDC3F0153D625806E0A430A3D0C66D37CEC6EE3A17DF796403F69AC5E8461CC54E37FECF876662FD935B51D3DA814F5FB702FFF2DB6D386C16C30C12308C1E94FA4DF8F92DABD1D191C6771FD880D7508E1E04B87CD6447C6806F0EFBF7C0DC70A47C1A3639100CDE7C7E644007ACB9E83CA82A62F53AD26390E3A37D3733D703EF7C08506D0C69DFB02C3F061B91DB87EE1447C607A12493FA43C60A0C907BEF8EB6D48E5952A879E410B9A0EC198B01F34B44DF2C5A44108944100C3F451D8D3822F5D371F9D0D298CF4DAB1E18D8378AAA7046DF142E4F5B6E03F6E988D679FDF85E30EF0CE55D3F09FBFDF8966BB04DDBE8DB8D786F72D9D808B475968D95F83DADE387EBEAF13A9781CABA78CC34D734DFCEB2FDF406D4925FC8056FF89009D24C531798CA2386205F0CC502A22FC46CE49783ECFCF5CDB2FF01EB820011A2E926E07D6541978D7F42A24D38E58A49669615F0B70EBF63AB4E79522F0E96A235D403504019AD486098B5237D3814FE7A049D43630D36CC7D7AF998D6FDEF53CD6CCAAC6D4C9A3F1CF8FED423A9EC09462139F5A568D31234660774D1DEEDB741C134795A0B327C0B3C73A5062B4E11BD72FC06F1FDA85D18934DEB17629BE74CFAB688F2570F1ACA9F8B39906BEFEAB4DA82926C511CFF21B94EB690E3A07D017F84CCEDDFEFFC81EB8D0009A4E42133E4A8C1EACAE32B176E22824BB7B94751C98A8F312F8DE6B7BD156504ED20326A570E49A058809D0593DB472345222E7E183D3F270CBF2B1787C73272A8A63583831894FDFF512F2E301FEF2BD73F1E853DB5196CCC33B574DC2FF7E602B6EBC74165E7861135E748BB1A03A1F7FF38E69F8E3B66E94DA1E2E9E5E847FFAFD4E6C6F6AC392393370F3AC18FEBF5FBD82C3A5A3E0D2B1498947487110A069412FCB01F4FFC8F999BBA90BBC072E348026C54180B67BDBB1B02885198900452E19683A0A2DB4D97978E4B88FD6781160DB80A7647614AE09BF21AF501A2194878702A7079FBB680CBCC656EC74E2703D0FEF5E361ABBF7772375EC20AEBC7401BEF6D327E0C48A307F7415FEDFF74EC08EDA1EDCF6E8661C0EE2F8C8CA3128F55CBCDE6AA327D58B8B168C4071CCC0F7EF790533172CC64DB34DFCEB2F5E464DE928F8A0059D03E80B7CDAE66EFF42E9810B0EA07FB22730292EF6525834A104B3CA02C425C084BA3603DD00EEDBD482B49D0CB5C62AFC4F685D58E24C14AC0EE2C243C7D18D2956376E79E732DCF3E04B38E459481BC09C71D5F8E2CA52DCF7C0ABF8C88756E1972F1EC09EC3CD9834B202372C9F80E3AD1D787CCB51EC69E9C547AE5E82471F79053BD27948DB0646C55D7CF3BA79F8D6BDAFA37CEA1C5C37DBC437EE7E1D35855514F385DEC1302231624153C5D191E3A02F94A99BBBCF0BA1072E34808EDDBE27F04C133E290BAF17063D7D0C27F13D188CF6A36ECE64F0099D7F2A1E4549EA18319854E1D8B4A4FDB83807E35E2B568DB23179CC48FC7E43233A8D387A6D2096EEC0D7AF5F80C79FD88DCE542FAEBF72018A933D38DA968747D6BF84CAA23CBCFBB269F8D5639BB17CD542FCEEF1FDA8B31370AD00899E66FCD5958BB0E9600D9A8D625C3E2B0FB73DB015C7F347844A122E126AE1202D93F05CAC985CAD22094F00E8210BD8BC10A64EEE1E733D70CA1EC838F3DF4A3F5D68006DDFB93BA096382030D3720E3B2FC848E818C742EE42E91FC8430B102A37621873187E28A1D92E980B8324B66B508A6781E7A2742FCFEB45400588C148C4B45CCF372D04760CA6EF21F01C04B6054334D631A419BC627A30036AAA1DC633226D9960C60ECAEBA8A90E2CB6818B890B33F0256F47CC0BB0724A15B6ECDE8F365AFE565CC2C8E9C00CE30E33923CCD5D2B9D5E56AAF7B6FC2E1709E999B7326873DFCDF5C030E881306A22D3121D49A1A61583D0B29B5D9D868754EAA0E6DAC7A70F899535241765C7C4EED81DB80468432549A29E99FF95FC1BFC8D099328A313ADB10693FEC2A5255387EA6C5AD71AEF088AF2A7B26E331992784265ACCB7F1470F2453D3503C2B968D007A93E31E53D15B0A871548E91187057A21DD9F62088C3F2022C9F320ADBF6EC41A74D999D5296A85BCB2C412138EAA112695BB808A9B69EC3F7A3F1E9C36082E59A90EB81B7DC0382137A471BCE1D0689454E1C450FF5FEC0E760F0C90B0CA0AD9FEC09486FD026D6C9914817303B9DB29409D04C76C46394F0596F5574E72A1863C225E6D208D986307824F30004A54F0468D229D44DCB47C46B02A92070F8C0981F247CD14A968304D4A87D563942C43A97DFD946BE6CD85E80A533C663C7AE3DE8B26C3812B26E48DE0F394D36895EEEF7AC5113357072BF67C65D6843E4C64C76777D8A3123D3F364E6667497AA0DB830E422625C9F72EC059F9A3A24C6EC905C947D14BF9DE9466D655932C844108C16B30268041E83BD43EB59BFA71D837AB50C019ADF531F85917D2A039E4A51AAED5EF594C4FA0DFF27A02B80CE4522C858C9729CB678FB18ED593E2B4C7F4ADAC38C096D62071EE22EF9730F6ECC80CB044EC2ABD3F9990D6A1916BF2B376B9FDE191E0C4C9433CCFD9E7B46031A0394E09E04CD749EB2BED6B48E021EC87C743E357348B072482ECA21F79947360741600B0093C755004DDB9499E708148C1CE47B613AD113D6515ACBA1C9ACE90BD2256F829B28ED116E77C23BEEBBA82A4E4A511C4C0DAAC19DD18BEAA532D86552D88905CDBF0DB826179010A07D0B0101DAF4E1584C830AD8F2B5E1144918AE6619888EEC0373BFE67AE07CEC012D79157A347B030AB4B5A1161AD9326D355E0CEC666F7DEFDC21C1CA21B928BBE468437DC034A1CCC96C48427CE50A0C100F1D810467460F12FC420B3AD397CA7A95ED89847B872C44F421F101841CB402DE88234EACE390E2D0DF059D824C37CABC195E98EE34900C784C454AA7A1247292AD912116B6D26573E556ADE1596D9FE70D44A2CD2C7A261354BB014C72EBC326E5A81EC1391B3AB76738FFC7809A7959287B33EFAC8C394E3FF9119FD2E09CE463AB2A87042B87E4A2C4C48686BAC0800DCFF560C74DF801415A25161238A5152BD55068851204C9F512E8C284FC3C4A142012DA0293923D2AEF0498D5DF1E734CD3E127CB6810FAE9A29FFBB06D0B8EE3C0B419ADC816510512A8A4FD868118131D312FB4654ACA53A63B65EA3CD30AD4F98D9858C75C4E4CCB86492589D0DEB4FC5D499D1A786A30B04D02DE62D8AB36EABF4FB68E6BAA458A1084F7D6F75C9A92899E5BBFA7AFA5CF23394B42FA46F52F171BB6435BF87A4868764E1DEF33EFAADC83B0392133C5CFB80352560AFB599D5FAF8619062B7C966AD154F711EE58C2C55203A5FA2CF4ADF242B218EABF436B48BEA317591FA66987FDA8DA1C6D83FE9D0BA5EF7B52CC41164DF514C2E3553F64CFA9EE2B7A8CFE5DB74DF56BC4F71B5E57F529FB246B04E8FB55FD1CED9FF31F1C55BF0C8884D004E439385E194C7CB6966872A99CA28748D178BA9795474815E890CA1EE177D41C50E3E664AFAAAAAA21C1CA21B9A802E84631482DCB82EB39A1EA4B292ED828710F1274D9971CD85234CA874DA0745D58026EA1A0261C1FC2251B047B72BE66F87D5FAEC187177DE907C2F76DDB0EF33EAB24FDCC96E79B74EE5196C7B25510758964D163651583B23A5AC774519AF0180169B3AC156BBB28BED90F3D906AA2EA89A9BA3B7A6D9EA3BF575F00EF0FDC4F046D0D646AA04601592D568A42E2FBBA5FE5186EF7C2C542FA2DDC1D084FAFC13C8223AC2C230BA506B030519538D043054E94DCE6F1A6C574B0A1FF20036491F7C3052BFA7DDDA610FAD5E409C1BDEF738CDE6FE6B3C8C8566D668E9750EE18AE3DD1C54A0177E439F5E1C0F4E4CD4CE4485BE4ECE1DF99059563532F466187B0CFA2D739291AE43E18540F48C2487892C387F357CF778E2731EBC4C7CFB91C3EA78867508F01CE8F53194C55179A055D57DB18D8E2C9736158317802684AB32103DB8E21CD20955072C7D54E56455AB3BE0268095C09C1978068D931B1F494354D8DB29A70323168E7FA1E62B1385CC79187C889AB141DB4D643558658C7363CC9FD41300E0364EC185CCE3926E1A7A8841699CB14A8016C2B297486944A0C5C59A12DEAB025FB5EE8AC147F647691E0ED3A4E5ADA9351E0458625277A2AE5A0BBBB53FED51699B678792FDA2A947543163B02B19BB11015C829CB512896701B28D63017C2D06AD0D6875A2CF46EC310508F8296E7F988C763B240F2A5813F0BFA6AC1E4B5FA82A6BE86B23C9555DE7711918537B298CA330AD5363CA70649DD2E35548213BE93DD3D850BA858CB6AB1E9BBC3E0F9F9D2A0291658E4FA5100EFBB28E8FBD08B9EFE9B6D8BC5380E15E0F3EFA88576B2730E0A9172079FD003B296DA406B4B3352DDDD2AC56F38E7619B70B9401BD9621F314B8D4FDF77C5382B2D2DC5B871E332464C7FDD7BC159D08D4DC703234823F0D212364DF506C19225AB3888E92CF4600B18FA6E0ABEAF26683C1693BA827C59EC685ABC0104E8BA7B52B0E3545410344DA452291414E4A3BBA757A80C9E3F9D72E4779ECB66B51306AA10944DD21A161C97F23E17F9090544298545D28E98D0C906528E02A2980124F84110834340E7B8487AF0520EE0D0824FC0E5CA1E33614921DAC82B00BA7B7A909797CC58B6D18F1558D8282E2E423CC66394E5AA64276A9B2C4669C60912EE1CD4D9B29CBB06655AFCB26884AED43E4E92701D525BC590EEE00E820B1FFF55DF535C3BFF16608B7CA61743B5D81134E937085B1D5E53CE935926420A20D3DA2CF5230C5164F1E079B860D242CA5AF9EA3EB58E5D6FB2A34CA48C2379B66A57A65E590A47EE295411292A253C5F8606D2540C0F0B7541E177C2BD5064039DDD4AABBE0C9F56781FB268CB82F0E696E6F0F6ADF70077D8FBF7EC456F57376C93735DE56B7768B0C46292972766C54451253B2A06A2596A47D3D4D484B973E62863EA2434C7C8CA5143C2360CC945F9381A1A8E072652ACDD8D96B66EBCFCCA265C71E51580DF83279F7C0A8B96AEC2BA071FC33BAEBC0C7F7CF4618C193D56B8E2B56B2FC7EF1F7C08EF79CF5528292941437D1DC68E9F80DFFEF65E2C5AB404E3274C806D5978E8A1DFC98ABA68D142CC9E3D179E949FB270C7ED77E283D75F879FDCFA137CF92B5F41617E3EEEBAEB4E5C73CDFBB06DEF11ECDE77185E570B16CD9B8E9EDE5E6CDA711485C545282B8CE38A4B57E057F7DC8F92CAB1E29C9C376B0AE6CE98863BEEFA3592B1189A5A1AB0F8921588053E1A0FD7E1D9173661E9CA155879D11294971487A0A90096A0D1D5D585BC3C16B415EEE14419A7800B50565E86782CAE060E9F56264C2A941646385C050A04500231690E8E38E59C543B095AF43AA827B4ECC39D48067043D0D3F487DAC22819627F0C9D962D4639BC13E899108F32D63AF7116C5BE4BAEABE14588A851969C389ECE6891249C5D084C79F009C272E1EAAFD2136862B9B8E57D256B87A04E174088FD17A790DEC72ADCC795431062E52C46EE5300EF97A2F14D9469F69664555EDE8F3B4DF3A425DE0672095B167D76EA47A7A90306D668808A94A139E01D8B1189C545A7C4C2AE59A32CCB8DBA9AFABC7FC05F305C44F068855552387042B87E4A21C4BF504E8202D72BACECE1EDC7AFB4FF1852F7C113DDDEDF8E5CF7F8A4FFCC567F1D9AFFE3DBEF4854F61FBA64DB8E5968FA1B7B717C5C5C5B8EDBF6EC5ACD933644BF29DEF7C170F3EF4206EBCF146DC76DBED48C61372CC876EB80E9FFFFCE7F0D24B1BF0F77FFFF7686B6F432291C4473FFA51FCAF7FFB377CE31BFF4BD21DFDEC673FC7273FF971FCDDDFFD2DEE7FF419BCEFDA0FA0C00AE0F7B6E181DFFD0ED5539660CD252BF1A95B3E8A1FFEC7D7B1EEE1F5F8D047FF0231C34251D2C30FBFF71D54544DC2B5D7BC176DEDC7F1D2E6ADB86AED25B05C1F1FB8EEE3B8F7FE5F4BAE10521EC2AF1B4CCCA7ACA9CEAE4EE4E7E56B7C3EC1132DD66710A0ACAC14764CC9F5387A3A3A3A919F9F8FCECE4E141515A2A7A71789784214267B76EFC6C44993D0DB93427979195A5A5A51565A2ADF7B62FD13B8F4B24BD1D3D38DFCFC027475F7A0AEEE18E2311B63C68C81EBD2C36A21DD9B4651713EDADA5A515A568AEEEE5E241209A19476EFDC81AA5155300C0BAFBFFE0656AC5C81BC645C38F6C3478EE0A9279FC6B8F1E370E9259728478CF84A2D74B4B763FFFEFD98BF6001DA5A5B656165FB3B3A3A6417316DDA34384EAFEC82FEF8C73F62ECB809983163067ABB7B108B5978FA99A731A27C04E6CC9D2FF7C26D69575727F2924901BAC71F7F1C6BAFB842EE2D954A63DBB66D72AFB4947A7B7A905F5080CE8E0E24F3F26457C5EFF5A65378E38D37B062D972A41D07896402DD9D5D28282C14ABF8D9679FC6D2C54B104F26A4C27BDA75B071E346CC9C395316D5981D83E7BAF258928904DA3B3B505458848E8E769494940AE7F4FC0B2F60F9CA1572EFCDCDCD58B972A5A2D5F8284FE27BB8C071F6F4B79F49FDA0EC15EDC1E1FE74F7EE3D6241C7E8A0374D89F1756C1A4E2DD87FF010C64F988251E52588B929E52B0AE7584B730BE6CD9B2B7320B348F76949E5C88A21C1CA21B9A800747D6D4085867472E0E0073FFE216EBCE923D8BA631F5AEA0FE103EFBD0A1FFDCB7FC4973FF3E7D8F0F493B8E683D7CB13193F763C366F7C03DB77EDC04BAFBC8C19D36760F1B225F8F6F7BE83471E78101DCD2DE84DA7F1C52F7F113DA914FEF33F7F805FFCE297F8CBBFFA2BE1993FF1F18FE39FFFE91F71FFBA7B5151568291D5A3F0FB071FC4BFFEF3D7F18B750FA12B0D5C71D1522C5D380D77DC711BCAC7CDC38A95CBF0E5CFFD396EFFCFEFE2CE9FFF0657BEEF7A246D0B13C68FC0873F7C23EEBDE731781E69985E58B142785E370A0BF2F1AEAB6EC4430FAD43DAE9128F7F945E601F747777CB64EF6F5088E45A00BA4C0089AFFBEFBF5F76115CA82A2A2AB075EB56F93E0166EEFCD9387AF4286AEBEAB16AC56AECD9B317A346560B20BDFFFDEFC1ED3FB91D9ED3231CF29871E371ACA10D89A4896993C760E32BAF61ECF8A978F0A13FE1C337FF19366FD980850B66A2A6AE160112686BEFC5A73EF111BCF0DC134249D5D4352330E258B56A15B80BDAB97337BA531EF61EAC4141320E27D581B815C7F4E9D3316FFE7CB1989F7DF6591C3B760CF3E7CFC7E6CD9B6551A81E3D5ADA77F1EA55D8B7730736BCF232521E29A17CF89E09279D42220EE425E2282C2CC5A1A37502DEFB0EEDC3DCD933F1EA8697F1FEABDF87DFAD5B878B2FBE1875F5F5282C2D41322F894B2FBD14F7DD732F46565662D7CE9D9831672E9E7EE619AC5DBB5680998B426343038E373763F1E2C502BEF3E7CD934569D1C205F8E177FF032525C5385A5B8BD56B2E456373336AEBEBB174C972ECDBBB17B66162D3C6D7B07CC9521CAB3D8645CB5760D78E9D183F6E1C1A1B1B71D38D37E06777FD0CD5532660DFDE7D98396D3ADEF5AEAB32522F4196219B7DA7C7C1E17384DEF1291F4A8FEF637F5D235CD29D4680A963AA4584CB8DE19E3D7BD0DDD589189DFE1C99664CEA91BEBA710BAA274CC52B7B0E62ED82C9981C4FC3A0892D34A925CF8BE3523BD2FBBBF70B8E836E68AA0B028F8E3A03899887471F7B04A61DC7FAA737E06B9FFB042ACB0AF0675FFD477CF50B9FC11FEF5F874BAF5C8B82C212CC9D33171D4D0DF8E92FEE466D731BFEEA4B9FC2F77EF45F9830753ABEF2E7B74836BC4F7EF22FF0C5AF7E055BB76FC7FE03075131A20A9FFBFCE7C57170CB473F8A7FFAA77FC02FFEFBE7F8BBBFFE1ABEF7DD6F63E78E1DF8CEFFFD36F2478CC23616927DF24F282BB691EAEDC6FEFA1E4C9D360533268DC1CCA953F01FDFF901565D76050AE2092C5F3E0FB7DCF211FCE4D6BB5158948069B9686AE84249693E0A8BF270D53B3E88871F7E10DD3D6D198765742B7D2A8026A213D4694193CF25886FD9B205CF3FFF3C5CD7C1F8F1E3D1D6D686499326A1BDA3031B37BE8A2BDF71255E78F165AC5AB95AAC095A7274722E5EBC100F3DF8200A0A929836653265D9D8B4750F8A8B92183FB6022F3CFB1C4ACAAAD1D4D48DCF7CF616DC79C7ED58BD7A311CD7C581C30D48E69560CD45CBB073DB6BF0BD340223819E548059B3660B2575E4E8511856125B77EEC7BC3933B1E5F557B060DE7CB11A972F5F2E2CCBA64D9BB07DFB762C5DBA542C674EA677BEEB2A34343460D2C40928CE4B62DDBA7B317AFC38CC9EB314CF3DFF02E6CC9E8DEECE66343735A0B878041A9ADA5058568EBAC65A4C9F32095B36BD8E0FDF7433EEFFEDBD282D2F434D6D2D0A8A0A3172743566CF9E838663B5D8B97DBBB463DEC2453870F020AEBDF65AB1B8B90BE1E240FE916D7CE699673067CE1CB1EE274F9A80DFDEFDDF58BA7409B6EDDC85254B97E3A5575E41D98811282FAFC0CEED3BD0DED28A919515983861826CAD17AF5C29F754565C22BE8BE5CB96E1B1471EC588F1A365B7505D5185CBD65EAE92D41273CCFE29A3E1038C43DD124D6EA9B40F622B0726BA8200871B9BD1D1DB8BAAD222549716232EEC9F8FDDBBF6A28B16347D4CCC926327D0E0D9786DDF514C5AB612EB37EFC59A91492C8977C92E89AC1A8D1F8EC11C40F779DE750D750135C4B661C1F37AE0B8295C7BDD0D98BB6019BEFFEFFF86EECE16DCFCF9BFC657BEF859EC7CFD357CECE31F4347AF87BC781E62E9767CEE2FFF166BAFBE0ED7BC7305AEBFF123F8C6B77F80A533C6C2320CBCFF9A1BF00FFFF40F22ADF9E297BE8CABDFFB7EFCEDDFFE1D6C3B869B6EBA01FFFAF57FC1CF7EF653FC9F6FFD6F3CFBCCD3F8ECA73F8B471F791877FDE237F8C0F51F42FD9183D8B96DA33810A7CE5B81CB2FBB0C66D08BD6C646FCEC97BFC1473FF917B002A0B0C0C22BAFBE846FFFDF5BF1EDEF7C0BAFBCFA1C5E7E6933FEFDDFBF8182C23CACB9E82A3CBEFE8FE8E9ED384167A92DE6530134396A5ACB23468C9041C4EFB4B7B76754016234F85455C4433EBB03050585B26BA01E9C8A0E7E87D6444141015A8E1F17E967221E87E3F848516520F4743A942DE6C17503949695A0BBAB1D011CD9C2DB89022A9750565282544F1B9DE268EDE886652785FAA00A87DBF69E942399FE0AF2E2707A7B51985F20967E6161A100344159288F50D9C07B2B2A2E462A9D42716101D8E88E8E3698311BB178A1502BC9441C81EC4C3CECD8B10B400233E7CE426FAA572894643C26D7E1B9A9DA217F44C78F158F212F3F1F5D6DED2A9B2059C7507E49A72B81D971A8F2005C4A24439F00DB979FAFEEABA5A116C9FC7CA49D344C2B8694E3209E501489A4E7F294239AFDCBEFA743D59015EAF34B8A8BD1DAD20A2B3F2974515141210A8B0A613068893C57CE821EE00AA072DF5022C5F99CF2811E8FC5A54915062849C4608B23D81380EEE97104A0391E0233861E3B1FAFD534E2D59A26380523B0ACC8C09523131248465A84738B3BBB050B16BC4979146DE0056741D7D613A04D91A97102E6E527B0EEFEFB306BEE52CC9C3201DD1DCDF8C30B1BB16CC912DCFFEB5F22EDA690760C7CE0EA0F60DEF4B178E4F1E73077E92A54151B78E4F1A770D12557A224E6224699146CDC7EC74F505C528A1B6EB8110F3FF298586ED5D5D578F0C107B1E6E2D5D8BCF90D5C7ED92572ED071F7800EF79F7D5A86D388E7B1F78002585F9F8E8876FC0B66D5B51505225562A8182C073F73DF7A2A5BD0BBEE360D5454B71C9256B70E8E011DC73CF3D9830613C6EBCF166A452E44E13B8EFDEDFE1BAEBAE851F38F2F007437168995A79797946FAA565679A9F8E4AD5A2722EE56C53C34B17D4CD48DB94870AA49C2D2B749688DC904013AA2CC489C7F692665165C624AD95687B55C51B5A1FA28E08AF132AF7F8B14A6F1591C569899D76146AEDB796BE8904D067508F9247392EB96BA5BC30696E8A32841F33D5ABF227125C0528459A670BE72B4DA1F6551C770C1072C5A32F1AEC50A3CD7ED2F2BAA8CC4FEF6CB2F240B5B5566D578E521D64A39CAFA11A260C7C60665C19CF5A19C2558D3C68E8A02525E205D42B850ECBD07F3B4094BAE00E535239E6C7099F43266A97F923C38C0B546FD127211302D8B977073ABB3BC549089F11CA31B81C87DCB6C492E87192E8AC3F84716509799FCF954E425AD00B172E1443E5642A8E0B0EA0EB1A1A5C7546510000200049444154A4DFC4692225ADD288C52DA9F547599D0483089FEB2261873EEF80BA525FC0D2B69348CBB3EB8561D15165C1777A2437B365DAB062319166893EDA8A094FCBB923123B9F9394166A4A30810E1F5A95D43F8B1C8F2B752FAD44EAA855208D254807B1A294D6DA80EBA6A57D0408FED02BCC874CD0A723CD32132A7A2D5045080603D03A228E1A4DF2C61A70952A4CA90594B39152210D88BABA7956879CD53A0BCE654047A9F542DD7998AD208C055196B568AB55549CE4E8962016AD0A51EA09514744C08B8E4A3EA98C0C2F1230A31126AAF638F177AE06047F95BD906D5116BE8A209511C0A2C1E17555702875EA0602EAE523CE2339948109A2A157578E120A99C54A4BE0C2FE8C6A944505A3B5E33A4252161D755DE93B06E09CF860144067648E2A5042B740DEE7B5D8759467E65E27EF8150ADA4D2FE86CF5F829CD402CDE72F8F87633F949CEEDEB70BDD3D1DC897DC38E4A1998C8D81676925DB74F360D1F0400ABE38EC95ECF4F8F1E3426F9D0C9CD9C80B0EA0EB1949C8AD89610A27CA008F9809A47C0B3689D3809183DCDA73DE7AEA69486875D692E17B12812C1255EA1BA99650323665C7A98929A1C02125A0408120CE7FB536991A583BB4729585A5020DC42453E945C374A3E1DAAD2216C30010ED00D461D0EA7B0449E50552C11E94F56435C87CFF541487BA1E904C72CB1D17303E31B0236B256B052E4FCFB673E1B1B8CDD3C09389E653E7142062ED30C1441549990D4AE1E7EA5ADADA544D611E12DA7FEC578217393C02A40AD737F9CC189E2F61E00A7CB426BABFA0141DD999B1AAA58A0E0D682EAC5EC602E67352A0479DB71CA00296B8B0CB24A5A5AC646DD2BB2138F3583B8C94944C85741B4964AA52D0E8A098EC62E7A988520960F061323294D6B658E059099E3E5E162F2B1B85496380C02BD18AE1B392C5A4CF4E820609ADE9E1943A6B38AE1399BC641C67A2B808FF47B34E3867A571E738945C3886856DDBB6A0A9E1182C5124D9F0641CFAF02C5F9C8A89A04076B3A6EDC1F019DDAAE626E71839688E8993A9382E40806E0A322946A94E24584BC5923047744475AB763B5A00ACB688922E29CCC92CE93168432B447E93737C20F9E925AB9ED64786E0AEE04C4F2565D9C93161218113077678F137552AD19652348A30AB283ED980D0007DAA55FDC4EB4713FCABC45399D00909C0602765894FE9FBF07D65656A678C8AE79429206C88B26CD52BCC3E284443981E3693DC8AA0CE6AEB74D0BCF99E070602CA532F3668864608339169FD71F894327FF639715FAD76562831704854012B2AFA5427D751BB87F062A155A78A49A89F4CCFF6C94B2E5FD3F2EA131A97B3A04F352694DE9CE0AB94FB993E660A87481F33B199C7374C0BB66123C1BCEC0890A67F811A24563B224D85184C2F2E94896F3952D554EF8424A0299485E6288EF0A9D4372880565B4FCAC76981B03395E52B53555754914003992EF209815881B2215557F83B7F344087F455F6F90F40CEA4CEAD4B6A6990E2C4631B95E2528D99F0481941CAB3AC2AAB88AD1C8924E177F83E37DAFAFD81C1943A6A008D3EE9E922E01C1EA3EF417F45AAC084FD295793FB5220A668067DFD907B1650E2D6918B940668F6532C6C2D45FE9C12FC2EE5930307C4E883CA66F0D6DF0FBDF9D2F97A915625CFFAEBA1930374DF4FC25E8E24CC917BCFE425C9463D66AE132E649A37D100ADFA2FFBD4C48088148ED0967D966EC905AA0C6C26A84E95DDAFF6AB069CF3228211F0E6ECF4D51FB2BB33F9AF0E5221F58C5EF8266D700BB6A7AC6AF2CF965076E1F923D183390B3A7C323535B5B2F1D4B38C734FA66264604BADBF30CB98CA4DA5C85196C852095058922AFB7B66029C4166CF30E15DD81C02810ECB25C8B265FC3B4C8023EDE4EF0AB06038DAB43AF15FBE2F56ABCA171D7DF5A53BFA0ED8930D94810DECFE8FCA5AB66A4792DD59848B5308327DDF57E35F5255090073D1CAE6EF561A6DA9809301685221FD03E229DBAF2D7C098BD7246498794EC05903B4DE2DBC95DE50DF8D522D1AA0152828158CFCE8454E28A3EC7D457766274BFA7EB6C6E75BBFD3F3EB0C99F918199302D22138EB11A07C1280E19960D24865A8D1D863621C3EC31E0434A0E84CF40C511AB9060DC2887F6200003D7AF4E8B762319D71E70FC945D9DA9A2347250B27FB9F966FC6EA08B7B6B2C9A48240B25165EB0AAA49A1F32F2BEB3BBAD154CEAB3024F744488CEE5123166A68A185F6B3B26D08CA7C84FCC9FEAE2C4465C567365D3A07B58034918C5554486EE9BF35D00FEE190D9CDAD0E78D2E0061C7462FD9F74987A39D695589D46AC086DCB1F69E07CAD1A6905CEF6E140BAD00984BAC025045A2A8BE622D9CE806FEA4832C82E16A4286A966254DAB0668A673E533E5F21CAEC6991266FD6C34A2EBC20046B706E1687227062E300028AA9AC93A5BFB3FA98C5F5D9F3462415B67C98018DCE839BF8FE6580895CF6280C9EE555200AB872B249A446432777BC83CC9000AEB8DC20D77E2266CDF81E9AB5D2C0D08CFF4C2CA496AE7A75FA73398A64D9B3680D174F6FB7D482E2A968BE7078C91A7851CA3B34E78896CF56BC5F5867F0B8884535EB6DAAAD9EABF2AAB9D721265362D91CDBBB287B204A2FEE69B102BDC9EF3B167DB13263E5519B20480543BB34F560F8AD0EA0BF8E0D91EC5D166817E700F6F50B91A64E046288148E18213AE2AB71C1248217068199340636812AA09A2CE275B46BDAF08FB5E81B95A086937ABA710D22302A30AF0F56B20009D59A1335FD2B520B3A58C94D5AEB9F4F0C0BE273F39C7D1EF03E86F2164A878C5880A71B4669A73AA7CC13A4D8AC6880C05C7020EAAC90492CC9A73063BBCC18D9EF3FB688E3FC9AF2ED588D4B8F48D00AE04F784554AC5925600ADE80F851196E8A55D3874720BB6F8B0FC380C563AB21CD1F7730E683FCB407BEA82731206046849AA8D10A0C3CA24B47E09B59932DA5A66A3805539079557F7C422647C3F14E4840E860C1EBD890FD5567066F3DAC7426475952C0FADE451BC3E1F2EDBA9E127C2C788834C5321B2048520CD0584D2BD810E85F0B8C1300499EDBF5EB04EE2808A027458BD8B002D478779B865132083BECFFB62488B7E43BB10430B5A6D361543AF16C9BEFCF9C0003A5C84F5E6441638FEA1CFCCBFB2EF651D767DFAB5BF7E3B4DDF9FA0CC300C09A1AF0C015A9F4EAB7F4261885AA735B91C2E6072EFA195A74C02E52F1140103A4E5982041BE9A5CC42AA7C18629064EE5FE7B9CA9A1DEA43E5BC8DBE04FCD9538A810B8D15A5C936C2F26DDA07C10557B547AD1C6AB9D6171DE4183D47876B0B9AC06CFB6ABCD17A26D7CC71C92E568E4202B4026FD360EA5F0B96AFA4750468D7225FED2A800E2C78A6A3C408E1181F4CF32F3C80160D58C69E1B4C5F9DD36343FB326B699E3815B4FBB29F3664BF99FD30AB3C39A78D969367D52683B9D69B5A1DBE31E0F70773B1411DDB5F7F2AB07B6B0ED4D33782003DA25C25A9123DB6D4C92467AF803460DA5ACF459239C23D1601B2C53AA6049450E791EE126061CA4B214825902661262562368805303C2EFAAAFEA66FF60854D2FAF37C4B0517191E1C8325D768456A9A4F296484680B33E2F1775FA2197DE43954D204024E2C1DC71212A6DF1B169BE077E388F3BAA0F2C191B6F17C043505D867E2D83D7D7F9EC9117AA12298EAA79EB1C9FA28B5942840CD35BD0B14FB2E637FA95DA0F21B9DD9E8B9F0007AF024EB993CE7DC77723D30E81E10802E2B432CAE2AED5053CB4DB7728492C2F2E47F3673968B3F995BEB009E945FE3DFCCA346B0A0984B297824A882013596C0A330A2DC25CADBA6C06CB837B14427C39C32122024E9593DB11E2DC60804363C46808685217CCB861B3A3413928D8DCA06A50B367C0658057019394A791A532B505D498ED6244FCB95801257D202C30BA007FDD0CEF11772007D8E3B3877FA5C0F0CB4071440974BFA5372F12C7F462B98F440E0C69010DC2485159360169BD49AE72288113C59F32EA5822024F4DB02989FD86718B12311841262CC0458BE0F8F5579EC84142596326FB0608679525C568263C08CE1C363CA5AD742CCB7E45883741B2D738B414C74E64AD48CDC2203A5A4F005CFCFA01809EE8949D42E1712F1ABB00832819DF41BEF2B0CA91E681F5D68C7E500FA427BE2B9FB1DB63D408066D6BA984D8066D425A90D715B01669EE4FA26D0F5C243CC60A161153599320C38868F98E18A554A0A83E5D93CA601302DC445FEA52C5C265BA2A5CCC843CF2419A1E809FAA1854FB57C3848C064A10982AD41E0B6D422C1A34D0781E521CD7C14B4E5030B0E65A901291213A6D7058311B1661C1E2D75522EC217F08E68462B073679DBCCF67FD83E91A16F580EA087FE19E45A90EB01E90101E8B211B0E3AA928D68894C575401293F0F9B0F1DC3D809A351650135F58DC82FAB40257D538C5E630E10AF5734B70C83776D03BB1B8FA3644405CA8D5E98BE0DDFCA037C077104E84CB958BFEB200A8A8B60F6A6B070E64C141ACC57DC0327518098CB2A201E6AD3060AEC380A186D6B2B30A7F829E57A68696A911C312D6E0A13478F45CC49B3C4808442D35A4FD0CA6638BE70DBE4D229355332560DD002DC8375645F40E32507D017D0C3CEDDEAF0EE016541974BC22DBE62BE299C6DDA32D0E9E5E3AE675E835F58882FAD5D88F52F6D42C58C299859508896DA3AA13C465755206EC5D0D6D28ADAE606EC69EDC0C4793331362F86969A26C46345A8AC2840DCE9417D5B177EB56D1F2E5FBD18BDF55D786DC3067CE283EF83954A61D7A1439830B20289FC7CDCF1E48B985655894B664E468BD78BFA86364C193316AE67A0B7B31BF52DCD38D0711CAB972E44C3DE8328CC8F614C4539EC745AC57A32302914F7280B5CE988A92C516A921C409F6A54E6007A78CFD95CEB2EA01E20409795D382563C7122D48CF75A369A61E3F9BD0DD8535B878B668D46434727AAA64C40FDD114DC861A54240C1CA86FC4ACA52BB069E3765C3A732C1E7E69032E7AFF5AECDCD786B2740F7A8ED561FCCC09583E792C5AEB1BB06ED7015CBB76352A61E0B6479EC682C54BB1F1D9E7B16AC10CEC3978108B2E5D8A4737ECC692EA4ACC2E2BC5DDEBD7A372EA421CAD3D8E6B2E9F823D9B0F624469110EB776209DB450525E81EEDAA358503D12D3CA99D03E0597E6B6A5B2228A7055386856BAB66148442C017AF8A83886DB70CB01F4707B22B9F65CB03D20003DA20C71164A60C63EF2C6868DB41947BB6FE3C51D073165E174FCE14F4F21595C8485CB66E3E13F6CC6A7DF7D1146270CDCFAA7E7E0E45763E9DC6A2CCA4F62FD1B5B50346B227EB1EE65DCBC7609E2ED9D385C7310D7AFB9081D0D4D58B76D073E78D525280C4CFCF8F10D88578E859D7630BFCAC4A123473165F17CBCB1AB0E2BC68EC484823C3C79E81052455578EAE9D7F085EB97E0F0B643A828CAC7E1960E948EAE46636B37F26C0FCBC68D41351CC4DC4E04311329910CC6956430B4A24D3F9653710C60A4E7007A009D943B24D7036F470F288AA35492B9D3B94606809234D788A1BB278E5776ECC6EC15B3D0D0D689BB1FF8136EBEF92ABCF8E201AC9D351693AA4AF1DD077E87F1B317A3C4CAC315D32A70DFFA673075F5123CF4E81BB8EEAA5528365C341F398A259326E2787D231EDCB113D75C7D05F6EFDC276599E62C5F8CC3358DF8C09289A8AB6F42C9C89178F9D55D583E612C9CF6663C5B578F194B57E0DE754FE02BD7AFC081AD7B505E988763ADBD983079060A8A0CEC3DD48232B70BAB275723E675C3B17CA49983422C66EAA8C39067F2D0B4A07332BB530EAD1C40BF1D332F778D5C0F0CA00708D015AC05198F878A6552002CEEE0C2718AB1F7680D468EAB4641C2C6ABDB77A37AF26494C62D3CF3E246B4A5BAB07AE51254968FC0734FBF2015D6118B61E9B2C5303D032FBDF2AA1480B864E13C8C2E2E40472A8D9F3EF52C627905185354842B972D15A7E46BDBB7A2A641D5585CB97C198E377563E38BCF63ED6597E2D1D7B7C08B17A3BBA3131FBC7C1E9A0E1F415E2286960E075E5E01F61EAE912217572E9A87729F4EC694241272A804A1CA431C9F94E0A9906715AB97A337721C74A407825CA0CA00A02277C850F480D24157C08A33FA8E0127B4309D30DF754C74D192DB8FCE433B8EB4CF90EE00012B9A1B012CA707B604A5C4E1B01C172D56AA28021BBECD1C113E620E93F850E86C209D2850DFF303E4F7F60AEFEDB322107F3C5F2479CC771CB70CB8E93482780C8E94D83260A628C663CAAA001EA576B625CE4CB627964E23CEEA4160C27A06A730288541350C9566F2AB306D6F2E37C8698759CE823E6D17E50EC8F5C0DBD3035BB76E43597905E2319644A2A44D0135E5692A631F256BACB8C2506DFE8FD6A7AD6A0E3236DB7354A635D3822B55839881CD86EBC5C439C702A7F4D049FC0BABF2F02B4C1064FA92A58D117F5211C473E53A22F4E341AC7EC3D42E6E0AFC85D91224B045624F54D93387FC3283651825E805520351441C4AFD0CCB6068B7CAA92CD546CC407EA8E6C8BD4EDE033980CE8D8E5C0F0C931E501CF408C4241787AAFFA89214A9E2057C4FA5220DDF973C10444E09F98011A424308521D8C44786A1488E083FAE127A09404BB85F08D290325FB0C2F25E52D98BE5B774642097002E0EA654ABB62C55EACD60997616DBE575188CC2F34A522B43405782533CD688D4499A780E43F280B0982E53AC7251A0E48E7548242AD2B64F59FA69983CA2B7BD1939807EDBBB3C77C15C0FF4DF035A074D2761B490AC805F08D8BA66A3543697A443524613362303FD9444F149AD4D29344E25088192259798B343E71557D767CD4D55E95CCAA8ABC83EFE97F51833694E7DA13B6C9BB407230D6320A60B28FB2C861C87C3A2C98C966178B700B44A764BEB5D650FA1354F27A12AF7C4058596B94A36145ADA7DEA66E6C688EA811C40E74642AE0786490F9C0AA03560D2824E330844786226295296AAAAD012A6C8B5543E69DFF5108FC7F1C4FA273065CA148C1B3F4EA2FC68814BBE0E46F78596B9048DA85475F07D172FBFFC0A66CD9A8392922295E6D530E18456B3695AAAF8AF1FA0A9B109955595C24BBB8EC48BAB94A6643A4875300708091AD793A2CC3CB76DC64470175D84A295D687C9E31816CDC801F4B0780CB946E47A200CF52E67B2A4FE2DE8D6D656747676A2A8A808A5A5A5686A6A8293EE4549692962F1189A1A5B85022170575757CBBF6DEDED282C480885C06AEE1D1D1D30CD382A465489C57DFC783D6CCB4245E558016BDB36E07A297475A6505A3602B53547C5F27579CE716391EE4DA1B9E9387CD394CC7B3FFAFEF771C39FDD8CF2F2327476B4C349A75152528EBC8202D4D6D6C9398B8A0A2542B2ABAB0BC75B5A609B36CACB4A60DB266AEB1A6411E1E77C298B3EF7D23D9003E8DC58C8F5C030E9815359D03D3D3D78ECB1C7306FDE3C01DA442281BABA3A8C193D0A478E1EC182C58BF0DDEFFC101FF9F047F0D20BCFE3CA2BDF21E0DCDED581DE5427468EA8C0D62D5BB160D142D4D51EC7FC790BF1E28B4F63CCD82A343634A2B878242E5ABD1AAEDB032B16E00F8FADC7CA956B70EB0F7F884BD7ACC6A1C307317DCE7C34D5D761545525BA7D605CF528DCF3AB5FE0FDD77D10B66DE1E8C10352B2ABB1A9050B97ACC4F7BEFF3D5C7FFD3578FEB9A7F0B15B3E86679F7B0963C64E42477B3B2ACB8BB06DF3464C9E3A13F58D8D18376E1C66CC98213B819C359D1D9039801E269333D78C5C0F9C0AA05DD7C58B2FBE88CD9B37E3E28B2F467D7DBD58A4C9988DE6F666AC7DE73BF0D8234FE2339FFA349A8F37E29E7BEEC1D469D3B164F912BCFADA4B081C47B2E45D71C55AA41D0379C902FCE557BF8835972C472A954247872F00B965EB462C5EB600AD2D1D58B17C357E76E79DF8EC5FFC390E1D3E842D3BF762C9C20578ECE107912CABC4B5EFBF1AFF7DE7EDF8F4E7BF2096FDA30FFD4E9231054602575CF501FCF6BEFBF0D5AF7E06B7FFE407B8ECB2CBB073D741AC5EF30E14E4E7A3B9FE307E7AD77F61F6DC85686E6943414101AEBDF65AA16F72AF1C40E7C640AE07865D0F9C0AA01DC7114A63E4C891B8EDB6DBC492A6D5396EEC68B4B4B5C08CDB78E0FEC7F0A98F7F0231CBC20F7EF8038CACAEC67BDEF75E3CFDCC7A549597E1B55736E2E69B6FC2DEBD87515D3D16F7DF7F0F6EBAE93A710A767604183D7A34EC18B5CB293CF6E8E358B5720D7E7E1701FA933870E020B6ECDA8B8B562C474949215EDBB203F989185E7DF179DCF8E18FE08D37DE40655909AA4655E2C9F5CF61CD6557E1B7EBD60940DF71FB0FB176ED5ABCB17917162F5D0D27954663DD416CDFBA111FBAF1C348A55DA16348DB685E5DF3D37D9DA5A7B3AE6981EBA2BB7DBF3BEC1EF8001A94B3A007D049B943723DF076F4C0A9009AC0B565CB1671AC15171763C28409929E948EB7445E0263C74FC09EDD07B060FE02AAE6B07FFF7EA41C173366CEC0DE7D3B50555181B696361CABAD45CCCEC3ECD9F3D0D3D386030777239D4A63CA94B9A8A8AC90E4FECC087DE4F0318C1E3D11DB36BF8145F3E7A0BDBD0D75CD6D48D8163ADA5AD1131858306736EA8E1E46634B2B2AAB2AD0D2D8A07288C4F23071CA4CECD9B3074B96CCC7E6CD1BC549D9D2DA8963B58D22A79B3D630ADC5427F61D3822CA137E5E525222F446B4D279F4EFFE2A606B550B9F8F9225AA57F4F7B7E3D99DAB6BE400FA5CF56CEEBCB91E18640F9C4E6647071AC14B6B8669298AC68E0A0A8FE5AE62E2642390493E694AEF442297554C284063E27E06095205E2ABE4FD9EAD3420810B532ACED251497DB4AF825A6C1B69DF43CCB4E0A41D98F1047812566181AD026B24B528AF6BD82A809BD23BB64F17F60D98D82E8680118A3CD6776032D31D152711CB37CA4347EF876DD780CDD3EBCFA2601C2DC4FB3F01A873003DC849943B3CD703E7AA074E07D0046672B4FC57C9EA426B31D42E53FFC008424AE2A4D0298F11C064515825C3531AE7B09A49A06A090A208ACC4EE9E32885E33122A7A37E5A6A0E32F2C554E5AB2CD64464815A9E5B05BEA8C2ED61E56FD16CF37B0C3B67860F5E538135B5D7AA7D59B08D82B006DEBE20ADA90FFD39FFE5317A21E2DF3C46EBC3FB5AE2E7EA999DEBF3E600FA5CF770EEFCB91E18600F9C0AA0F52968351384C8490BB0B1ECAB1B88748D793B98E7C263F0475891450246CC245CDF95A84082A5C54840021C43BA4D43E991791C0BC1327787D42F540B00C19AEF13540316919524FBA658E5AE43B025887BCA2AA625CEFC1C6C97EB23C6A016C9C7A18E13C33CD461335085750F696A1358A3C02B581F06E6E8DD4054071EE5A9D91F1AA8294FD4FDC2F734F00FB0FB87E56139801E968FE56C364A9585CFD415CAD074D12C62E789F6542A5DAB0D73A6B27DE477DE110390F9220449804518BEA162EEFAEB87B3D9D76FED5CA7036802D34B2FBD24804425876CF9A91BF659391B787DE3CB98B76801D2AE8FFCBC7CB84E2FD2BD691CD87308B3E6CD830707B615C7B1DA1A74767562FA94A9028EFC71D2296C7E6333962E5D269C30ADF454AA17797909A41D0FBB76EFC2F8B163909757887822893FFDF1115C71C53BA4B415230993F124528E033B2F0627E52066C410B3633870703F468F1B0DD771908C25E132C9522209DFF2B179EB66CC9C3E4BEE835AE8DEDE5EB4B4B4C8DF1515E4C3036907258694EF516D42108E822F8F2710E7E7E763EFDEBD98366D9A7C475BD6E77B6EB41C40BFB53935CCBFCD782DC671313C4C594DCA54092B2C67DEE067E41B2368F736DF597F1E7765D9E994678C5C53DB70666593FC10612A0A02310DB82ED743636FAF843D57E62591E4B65C724778924A53B6F1BAFE92AE902D303E3C5EA702E8B6B6363CFFFCF3A281A693ADB2B25274D017AFB954246EF3E6CEC67FFFFCE798366DAA2C4994E111BCA74F9F81D7376EC2751FBC1E8D4D4DD8BE6D8B009DB63A7564229D8EC78E1D93CF088E04C5B2B2323436360A2852D23773E64C1C3A74480265D89EABAFBE1AAFBEFA6A065493C9243ABA3A85A3EEECE8C0AA55AB44DDC1F612388FD5D488239094C9254C5FFAE8A302C6EDEDED983469925C9FE7183162842856D8B683070F62C18205387CF8B01CD3D6D621C99CDADA5A71E38D3762CF9EDD3874E86028CF3370D965970BD8339F885029E7793AD31C400F8FB9798E5AA1427FC3D4376126317529499E231B5E41EC8C457A8E1A32A8D39E00D6D278D91BABB9161AC1746089734900DBC0E1A6E3A869EE86A40A62D1D4EE4E2C9B3B0B098B5F51FCABDC6540A80EE956FDDB30295A7A2A803E7EFC3876EEDC29C045CDF0A851A304DC36BDB105EF7ED7554824E278E28927306244392CD3106B3495763061C2445153AC5CB90A058545F8E31F1E159024D81D3D7A54AC4D5A9FEC73022581995188353535983871A25C73EEDCB902D4858585D8B76F9F5C97DF2300D382E5F9C98D73D1E075290524B86EDAB40953A74E95EB2C5CB810070E1C10F0E467047B2E386C8B80B6E7C982C3F372813872E488003B178C6BAEB9060F3EF8A09C23954AA3B6B6569EE7CA952B71F8F0211C3B5623CA163A44B903E0391438F3C19EDFF9A673003D28E838BF0E56C09C1DA2D92D7F08D2DA98E69F19C01E1A8BF2A49A557D13D26466630B2D696EED990C1EC0F1DE5E6C3E5C83B163C7E0E97BD661F498F198BD680E366FDB8977AD59853C8349E309D06A29E229B989C8DCE97900D0EC1F02167F08403A24BAA797A1D5C57257B472F92F79651E4790221D41AB3BBFA050002B9DEAC97C9F604AB024E0F25F8230C18F80CCEB1134F5E7DA01177D4E045B02A8E6816518313748A8242168F318CD236B6A82C769BE587F47F3CA5195862CCD4190A137146D41FA422DB8CA52F6E487DFE7D088C5E2619E1272D05497287EFB7C7DE500FA7C7D720368B7C6360D4802D6069D452AD398501AA181CAC29DBEE1B3DE7258E96200173847874479434E465FD256EA5C6B9280131E5C58B0E004168EB477A1A6A60E0FFEE66ED41CDA2715A73FFAE9CFA36CF27854E52730A9AC445A4A4056654AC36C6F4348E9F4D775A7E3A065890A4153EEC734E1FA5446D031A79C65920429FC8CA9444973089DC1674E399CA79D7FBE005CD4A9A6F95DADA088EA9109C27D1D7051A544147CF93BCFC54522FA8ACAE1A4EDB2882840D70B80FE5D7F4F5F5724857AB88699EFB4EC50B7837F6BCA462F1AE77B6E8F1C409F2390191EA7151220EB2094DCC204682654271F4B1DADE26903E6E7359849D81E3280EE2FC526A9182E1B02AA4120CA0397E1C4411AAE1320B00AB0ABCD41BAB515BFF9AFEFA3BBBB0D2927C0F2CBAEC41537BC0F6E4B1BE68F1AA913B5A96C6D1AA087C743CAB4E27400AD9D661AD8646D5509E854AAD0508D41299C8021E99F30B78576AE46C9ACFE762D513DB2B660A3D17B51ED71EE0DDB5D0000200049444154D4AAD660A9178E6850495F479D0E2ED1117FBA03F4FB5150D5CE3EDDAEE8A2A1AFCFEF472D6FBD109C2EEA70983DFE7E9B9303E8F3E1299D711B0945610E5E99C6946211B469D9F0FD98E2646586ABF78D8CFEE18C2FFA96BFC849C9ED312DB6DE544A1C806C63D2B011B32D183103A6C52D6C028E61E3707B278ED5D461DB2BAFE2F13F3C8AFCA2127CEDEFFF1A87DADA70F1ECD918499998CC6225EFE0A657AC4CBD83380F280E0D40517582BC474A833B8C30D08389F575FA516A9E65932079A3952F82001DD50B47F5D4EC229D0D4F07854441BA6F22237D6CDF6092BE0A0ABD1068C0D4FF46A574FD59CA995D824BA99FDA2168F0E577A36D8D82BC5E104E4A9BBDE511FAF69D2007D06F5F5F9FD32B45077B661087502C600420ED078899AA54A7CB01AEDD2852022974152A736CC0AF7EADDE308A8D27D10070226DA122DBA4B2869679398EFCAD23E5B8FDD63FD29850432BBF8B764E59D57412F6063E5EDD7B18F9A5C528B0F3E0F829347675C0EAE9C1AA99D39114CB324479FE26E433551D0AB20673BF03EE983338F07416B406CBA8BEF76420D4375063B88255B45DFDB5B12FB847170C6D39F7B5D0CFA0EB87ED5772003D6C1FCDE01A161DA47D013A05A0A69DD22A17D5A5052860C86D08CA625B3171BB447AA964EB3A34F7542D88F289FADA0457EDC8EADB9EBE5B5ECD3DEAC00BCD31462D2485C551991DDF50DA3AA997A702DF582C0FCDAE896D876B903412F090465E7E1CB3465649515356C5A6E59891D9F156E5DB2CC544567A78BC0692B05FB7B4AF951A7D3FDA87FDFD3E3CEE7660AD88521C510B5CD32151A7E4C0CE787E1D9503E8F3EB799DB2B57DAD68425947CAC193AFEF4241F5582462166AF6EFC4A58BE660647E3E4C3F04385AAE16950ECCE610B21D7DAEA427870661521012E0E05047A11C565417D0EA5532A76C29233D89A2DBE628A0F4059B28F8F3386EE355CD3D559E89E59B849AE12E40AEE3C2830D2E4474DAD39FC4DD414C8C661EAF9C5516397702BBD0EE1AE28746B5D2DF833C1D4047B5CB7D77249AB7ED4B03682BF37C19E6512B3A4A85F4A5534EC6639F2FF739D076E6007AA03D751E1CA707B7F6A8F7027862672D8AE3015A8E1C444F470FE65EB41C1B77EEC77B562E40B1E9C122A279615922E16569712AB580B68635F5A08196004C2F3DFF8D7AD7A35D14F5EA8B4D1E26F0893A70A2C7472DEC13AD41DAB98A8AB0323A6806AA78E8A07AE35803108BC34BA7D178AC0EA3C64F10AD6C7B7B27F28AF3918C9BE86A3B8EE5CB960924F39BAA167620F77ABE501C7A11D32A8E6C7FAA808C6CA15772B5BAE02CA924CDDB865AF2611498A3C7851E139AF252F239D5EE68D4A0EA03B5AFA2844E49F3B47854CE16D9FD0DCFFB1D2C8CE4007AB03D368C8FEF0BD06D8E87DFBFBA155D8DC7F0D4FDF7C1F603CC5DB10297BCF76AC99D30B5BA1CF9BE038B9A5715E2A13297994A17AB7FB475D6977E885A677D01F664807B3A8BEEC4EF29158A025553723928679FCABA565F730C5DDD291C6A6842AAAB03E585F908622652BD3E3CDF44A2A4141D4D8D284AC6B06ACD4561584AA883D63B8541F0EDE7FAD10F84837EB33281098354CD40F5990230F5CA02960455EA2AE0E7FA460671FEA8C5AC7767AC16137548469523A4E908CE5C84383E993B84B94214D82B7DF489F73E7C764883E896CCA139803E935E3BCD77B2F2DA48E85B386754F45E3696ED6C5E3E4A71F0BC8D1D9DD878A4166FBCFA1AB63EFB0C6CC347D5E86A7CFE2FBF8AADFB0EE3E28573502040A5D23E42B29C655FFDF1DA0369EF401C52FD01FA9B796D5A518A8C20406BE851444700782ED229071E130581A930F92E83596C18561C0E7967CF438CFF26949243941BC30894A3FD793A80960A2AC9642621BD72A8320F8789969656E1AB189E4DF012D0169E5E297914E3A4A4780266C2DDAB4C25D9F1A85BA3922D650E19C8433F0BC7B06DA4CC6841EB17C19951944CE6CF484746193A4E1A9D9D5D72AF8EA3005BEF284E8C1C0C73019C85B60DD52972007D967B3E541E87369FAFF247844A012A0E0820B2D10EF9D033018BFEBCD6191DAC5851AEE85F53A6855F3CF11C2A9379F8D36F1F428FD38D2BDEFF2E548C1D8DD9E327A1BA305F38676616532A87508825E750DBE4FE2CE1B3DC65A73C9D8A04A3A3D094643807F61F94CA1F4C9E934C24D0DDD58DAEEE5E24F312E8EC68C3CCD9B370E4C85114E417E0785B9B64552BC84F0A7875F774232F9184E3BA282E2E92C843665E1B2E2F05D0157D8AC62A2B9860BC61C3CBA8AE1E255B7B866413B866CF9A8BCEF63678BE8BDAC6268C1A558192C2221860063B033B76EEC0A20533D0DCD282FC82128CA9AE04635528A89494A2FC4DD28B6AC7AB1AAF56C0237C78F27E644DD3BB186DAB660C8FF0316903F60C3A5559D004682EA98A16A395BC6DDB360947EFECEC861D8BCBEF4D4D8D282B2B41616191245FAAA9A945555595848D937A63BE0E91827358EB95FD246DCA046CC971CAE371AE56F181B447ADA0AA059523AB86C49C18928BCA7DF7876E6730984EF695D03E11CB45863651595C562A4F0F013AEBF01ABCC4EBA45402A793EF23EDD079E78A2ED64F24B1B7A51D758DCDC81760726025E3B09C5EAC62D62F4AEB18B841B3321C107DB5AA511EF02C76D3804FA5B7BA6C07CB2E710DE1046C6E6EC6983163D0DADA0E6A7F351F5E545C80AEAE6EF4F4F6CA82A31D96EC375A66FC5E322F0F6565A5A8ACA8082DCB0137E79C1EF866800E672A20392E76EFDE8DCECE0E4C9D3A4540BAA1A10163C78E87934AE1E8E123309371545694A2A9A101458595088C18EA1AEAB074D10CECDBCFBEB3B070C11CF8812171987C11A04D82B10C551B9E61CB2E4301B42B7FBF1D00AD9D7EF47B6880D677DFDDD5850D1B3660D6AC39A8ADAB17F46291DA8E8E368C1A552DD5C3C78D9B2006C5B871E305E42D4BEDB334F89E0AA4A3004DA7B27A9D23881ACC0E2E00AA72007D36E75C6885CA2AAC86BF3C6F9D0C5D246DEA13A54818DC38E86BD546D71A0219B780B42CB5A2827286CE204073770F761DAB45CA4963F2983118575488227296E24C0ADBC0506AC169ED6052CD1B6A0B5AB7412F14D265929B38EA08535B7AE971096D5609E3D577B3E58FD4EFD9E7AD542567F3F9BFB573BD19A0B3E62833D6F119B7B6B6A2B8B850F26B7477F7A2A0B01805C924DADB5AC16255AC52523D72240E1DAC454151191C378D823C80393BF2F28A503DAA2203D04A1FEFC120184B84A52D202D794A585965C8005A511C519F0A1329959797E3C081432828C81780E63326D53172E42834361E17EB9999F094E5CD31C29D6AF69908A3D3CF6B20C7BCB5277BE6DFCE511C67DE77FD7C5303B4629A694367784F728199ED6008DC8300E82850EADF396125DA8ED6224CD9B66B6FBF067F12043E2D22BE41AF3713D998617E3756C490B06F1F8EA72A75506827A58EA4AD0A04FB2A324EE4F9CE2D4510BD767F9C7856D5103234C2B7AA68399D1758817A76769E29B77E56874A3F273B1D07AD658A3AB190E4AD9000A34095AD621A565637115F590CA6CD7C1864E27B85CEF0034BC0984E5779F24201E8407A3ED5908E9335DB8329795022696ACF61079C6841C74F906946952BB1181D884C8CC4E2B01C9BCA24E5FD657968064851E171A264F464007D0E6FEB2D9F3A07D06FB90BFB9E20BB45D2D5D8D4B00F3DEADA9A1EE44E2AE3DC09B39A9183E48B7C2B338A7141709D3452E9344A4BCB24593A7F9F3E7D0AB66FDD81CA111538B4EF000ACA8A112FCA47CA75E598D6C626941617A1BDA70BC9823C2460A1A7AB1B0B172E00BDE9DAEA540017F590EBFB3EB7001D9D747D6BD0658136DA36D5AEBE6A87BE8ECB289573D687C0199E70203AE8BE0B8D410769C0884C17763C26748FD41134E2E287901250CCF927FE045DED4048B6B095CA94D0651054CE3F95A25505889FDBE7ABC71477454ADAE9A90C78DA828E3C4BB5C652AD425B83CE41BD28EBF7958A458059FC9C598A43CC8D01EC96B2FDA292720DF52B07D067FB09F4D95269A193A835A3CF7B008325DA340D46740C7100D39BCFD7860DAFA0BEBE0179F9F902A87CB92E5345AA4C618B16CEC7ABAFBC06CF0FD0D1D585A2B212049681C07331BA6A24766DDF8144320FC99262D88938CC942396D345175D84A2A2828CDC290BD07D07EDB99DC0510E5A26591FE765B48FA232C0682083FE5EDF47DD3720E66C0F85C19EEF741674DF124EB2BB892A31987B83F44E8635269805AA36A186E02CA795016821B6B433F64D12BD73FB7C75EAAA2840C7E2340C948350C67D267B1D2D63B52B0DE8DC14B9A5A6BA4869E84995CDD921DB477DA7039873D105492D5C43FBCA01F459EC7F256D0A6782EF86BC0233C829317D36BD27493E355AA2965D74EB1D05223A4EC83912ACC8C3F5F7521687B21C18E5C7014FF995E7A56058069C709CB32A735C6449AAE0663A9D423296276D9482A2A79C8F7AB989B6E05C4FE0413EA0C11A3D0398B4836CC1191F7E2A802695C59D5234C56686979714A3DCE62BC052811C063CE68EB66C780272AAB28E1A8B2A67B4244D0ACD4DF53DE59350E755832953E43503DCCA69F1E6053B6A8A0CA60B941495E395A9535DD7473CA60255B4C2868B07DBC9C50786E88E008379A06945ABF1A7683955C59CD4075FD1C5BDBF85BD3F5D3FA5A6A4476C2B4C819A99D03CA32A761B3DAF4A57A52C77452F4A7281B04DF40978617E6A46B3EAE4552A2BB93A5EF5B1EE53D9CF48908E2AB63B79D2842119A14372D11010073B854F39DADEE444F3A9DF08073739416E33657B458DB1760CAA4C103295FAB44673C87C480465BD15A7C5CCC178B2FCB6E17C82EF05D8B56BB77CB7A4B818C7EBEA112B48A0786405DA8F37A3209184159830ED38D28E23C7CD99390BF1BCB82C1AE1BA71927B7EFB298E814FF5B06D03D9C7464F3A6423F1CD77763A0B9ADF88523799B1422B526A137262AB1458945A1A521A8C5676A86FE7A21C52557CCE921B5A00459F57298C644C33317E48CD69D0572D5640A801FDAD07869C08D01E019A1674184948702650133499AB9C8E4C716852BB2FE0AC0C0DE1D87DAA3BC8BBA7A5A5043F05A86A6CA8F328EB3A6A1845FD1C328FC2EF4AE08B04BFE88C80EA5CAA8FD50C36994A200C14123A4E7D3BFC4C596BD1BE328C98CA2CC842BA6AC9CCD03119795F48E5F0318CACAA1892113A24173D9B00DD97D3CC58BF46801E184885AB683E022464FB9875C044B596921E923C61386868D5688F3D6BBFF1A513A96B2751BF16B4F64F1A90A00596462A2D2E41E7F1767831136563AAD0DDDE0EDBF5D1DEDA81B2912351535787DE9E5E2C993F1F166B4399CAE83FFDC3198E0567CFD4821BF81270AE8F3C1540EB2D7F5FCB50D11C814828130C79770218D401FBACCD487A83CAA13CB1D298A3440A7F49156E876A6749BD2AD9C199EC5E1E3C2B77B32F2DB8E25C0ECB8599EA98749A1236EA8CB58725BA682B481FDCEBCD00CDAA28E2F4F41C09C4E11C49C4188C44808EAB44FFCC5F2ED55428CBA3EA43A977141B42EE9D65B94C29A04B0026FD97EAE9956355F51525C1E43D7177C239C69DA77E9FFFFA727D75AFEAFD985085199E9E8B1C35E482E0AA008129518DAA0801C15D392B1510B35A3A6B188873D6601E19FEED885124D67CB8D3763CA657652A60A0AA72C4E9A7E3E03A7C40470FC945CF04A0DF6421F7B93D5935431ECC370CD07577B03B85970EB7A3B228814595F91813B761691357EEDC9749405D2AE59AD104441C2404660E98BE8BC0A97A364A8F642C020E56D7811BB324E0807614B5CF6C02ABA77822ADF211E3273A93DD903D99018D9BFFD1079D4A66C771C17A809491C56296EC7C4879C8B384813163C7A2EEE831E4E717A3B9AD15C93C0B85F909B4B7B563D4E829282A2AC4EE5DDBB9838793EAC5C47163D0D0D08458220FB1781E6A8ED5A2E6C861CC9B3353E498070ED7E08A775C85E3F5C770F0C07E548D1C85BBEFBE1BFFFCCFFF82AEEE9E30078BE6BB95A578664E455D3EC180173050C5433C460B5A011FCFD9D3D5893F3CF628C84D1F6FEDC1656B2F47797931DA3BDA2470E7D08183D8B2651B56AE58898EF6768930ECECEAC073CF3F874B2FBF02D563C6E29BDFFC26BEF6D5AFE2F6DB6FC79CD9B3B068C142DC76DBADB063163EF6B18FE1473FFE31D6AC5983E2E2526CDBBA45EA1C7EF9CB5F96E2BB0C8C61EDC59A9A6398BF70219A9BDBD1DCD626CED835AB5749D1DA8E8E4EA5CB6F6B473299270652221E135F106B3CF27C9595ACB5588B8A2A150DE9A61D8C1F3F0EC9441C5BB66C5121EB868931E3C6E2D8B15A54565461DAD4C943322387E4A2670AD0279368F505EFB461E058DAC17FFCF10D3CB5AF054536F0C955D370D3A289A02D2C369EA1EC0015B867A0A7B72753FAE784FCC77DA0A87FB95BF620D9BA85DCA00AEFE5021EF28E2C2FA4F669928F4306BE845047DB144AFF86ECC9FC8FC6DE01DDDCA902551860B37EFD7AD4D7D7C99698C55819BCF1898FDF82E75F7C490AC23ADDBD282DABC0FA279FC6473E76039E7FF649E1730B4AAA71E9256B70EB8F7F806BAEFB005E7B75034A0AF2D1D4D8847113A760D3E6EDB8F683D7E1B777FF0A17AD5886FD870F61F4B889983E73369CEE0E3CFCF0EF71CD35D7E2FEFBEFC7DFFCEDDF8915AD39E8ACD2E16C02745C516D818F82641C3FFED18F505E5686445E1EEA8F77A0A0A808A954373A3BDBA5606E5B6B1B366E7C1D25C52512594A3D347D2BFBF6EDC7873FFE09B89E872D5B3623D5CDB9E648D18799D367E00F7F780C13268E97809F8E8E0EBCFBDDEFC288119578FEF9E7049459517CCAE4C9D8BD6B17962C5B26E05B545282CD9B77A027D58BA54B1663FC9851D8B8712366CF9E23FD3376EC3858764C8AEE5EBCFA22A93ACE4595DAEDDDBB77A2ABDBC1ECB9B3B17BD74E94141563FAB4A9983D7B16BEF5AD6F61D9B2E5122979ACAE1613274E92E8C8BFFAEA978764460EC945CF04A0A3338B80C6E49AFC69ED48A1B9A911ED6D6D121C52513512C9927C1C6EEFC6371FDF83CEAA69483ADD981B1CC7D72E9F893256970E030BCDC043AABB17DD3D29E433DC3A163BA1D8A6C2D2373B114F39CB4327858C6B061FC8162BAB43128555C897D192A6C51C928C92BE93C9EBB58C69406832EC0FD25BEFC10C354DDD64B7E959FBEEDCDFF0A942BDA9DEF9F18F7F84E5CB9789EE9D0B32ADBA9B6FBA11F7FCF63E4C9A3205FB76EDC2D8B19370A4E618AEFBE0FBF09B5FFF02B61543E5C809B8E6DA6B70EB7FFD0037DC780336BEB641B2F931E8A36AD418F4A41CA41D17BD5D9D282D299490F8F193A661D1D265686DACC313EB1F477149A954E5FEDAD7FE1F3956BDCE9E05AD551CDCDED35051015EA4266C3CB57E3D36BCBC01F3E6CF47A2A01485C52578F9E5E7B178F1622C5EB44040F9CE3BEFC4D429D3D0D2DC2221DF2C804BA08EE5E5E392CB2E43DCB6F1377FFDD7F8E217BF80E6E34D98336B367EFD9BBB0594376FDE2C69046849F3F5FAEBAFE3F2CB2FC7BA75EB24A43E66DBB878CD1A6CDEB255E8C386C66604A689D5AB5662EEEC195877DF7D225B1D37662C9A9A8E4BE839BF3767CE6C3CF9F49358B16C39B66DDB8AE953A7A1A1B919E3C68EC38B2FBD2014C7DAB59763F6AC9962D92F5CB808C9BC7CECDEBB07ED6D1D9838650AAE7BFFFB063380CFDA201D928B9E09408BCB4F1C0794EE0738DCE5E0A5BDF57865F336C40DA0282F89EE740A3D5E80E9336660F18C51F8F5AB47F1E8CE46142285AFAC998C0FCD9F089B593D597DD8F5D1DBDE8A7CE610C84FBEED916CCAC71F91340FD993386B63E9C413092E937755D59CC9AF4AD27F710304707D2A1B42F916F7FBA1FCC534F9A4B9F41A30590A8CCFDB60CE0A75866C8980C172AC03BFCF5371D09CF0DC6ECF983143DD572843237FAACB4129599A2CEFE22863B49DE2585DF8811F2A13C2283B2A15424E95C680CA10A7FA4C49149936807D452E57658BE3FB2A28EAECBD44CA26A42C836EB40E5AC9459533D0178024AD435D379DE05AA5A27377906F6600CB9B5F8A9F4F3B29518124E209E19BF56E5417B6E5DFBC47D248FA3E5522AA6CF5747E2FF3779835D0237D9876B077FF3E4C9E3E0D49EAB7BD303C8D1C366F8B857AA948A163D5A39356519ABC365FBC26FFD6DCB87A166A8CB13FCACBCA8764860EC945CF08A0C532F5903280A31D2EFEF4FC6B706063C2F4C9889595210D0B493380D7D6869AFD0751D7D286792B16CA56A62A2F86E9A5169CE6E3A82E2F97C913B71388C76DED0F18B202AD676F8A0DB333A9EAB2522546B9664D989C29C22A499289D077AE222C61AA3C14866F432A18841E792D8992D349FDD530E8E11CC6869F4EC5C1894B4754B43E5F345FB2D2492B8056BA6615FAAE25952A784349E4A2B2B393E9C1A33E90811C7F262341951D536DCE70D0043AEDD709E57F2247EBA37A52F7D157AB9C851611A3F07BE1353430F75571E876F777DCC976B219354DA8A07119D92855899463960B82A8B99493491909E1B127A846C26022BEA75FD16B8E1C397248B072482E7A26002D468519A02D08F0ABA737C1F40C2C9A3503F5410A0FBFB113875A7A501533F09E39D331A9A404BB1BDAD05C77001F5ABB1CB1AE56FCE0473F428FEB61C2E891F8C2673E27455915FBEB0A9084354CCE646CE7BED35F0F4432BC72C7C3A4FCC45D79F61C75921D4A852010B74D838139045F7ACD5525EC4C3E92FF9FBDF700B2F3BACE04BF9763E71CD00139E740309BA42952924965C9164507057B67EC2A8FD763EF6CD554D9B3B35B5B3B6B595ECD682C590E4A54A4324951CC0104488044CE6834321A9D5FBF7E396D7DE7DEFBDEDF0F0D7440B7BA01BC57D564A3DF1F6FF8EEB9E77CE73BE379496671E44EC4E230D6DD78C55ACD770A9C758CC1024C8AEEA568781381AD01AAE2C49889CE9BCE8014FD170DC60AA0958BC3FCCD802A9F5D59963A7468A5BFC9F9666F38B6838A1799423B8DCD4130F43BF3FD54DF55DA4A688BE49A6B7D853CF2ABC7B6BE93955CA07149B13DF4E2698EADABAB9BC51177ED1E9B939B4E07A039C663D91CCE0E0CE36B3F7D098F7DF04338373482BF7DF56D0CB82B8463EAB1DB51171BC517EE5983BBEA7D787BCF2E2C58D881E8B1BD3875F408B6DE7D1F7EF0BDA7F09FFFEAAFD1D9BE50E43DB3E441DAB9D22A5A4EE933432D60751ACB9C5574302641D8EC2E647276A9121E4D2511CF01D51EB7B8AA9472B2AAC9A8FCF13C8F2E10E5AB679F299FEBDCB838B815167A99CD96A78599EADCE3818B1568F4F2A41351C602B4B5D5AF150C9F2E684DA547955B25233F790693E6081700CCAE32278D58D6984C3F8B05AA85C80C255E2A9F93CA9A4F26313C6EFD849AFC2C9C719DDE4D80B44A0B5C93562B0BBEDE5DD105438076F05E426894EF58968DEE3203DC562EBBD5AAB75ACEA6CD3B3A3AE6041CE6E4A6D302E82C10B2013F78E13578DCE5A85DB206FFE3855D783D1544D415105D67769E379DC092CC10BEF4D85A5079AB279CC0067F06C7F6BD8335EBD7E1D7BFFE15BEF0879F454B638B68CE929297CE51645E09C9973E33D402669E6A473B7DD16AD2D991CCD990B0D971E0E809B8BC7ED89D1EC412692C6AAA46BDDF2581536E4D39E7ECDA1FCDE25802D0A25048FFE2EC15999DC8C5C1096C2C4CC3CD556E0BD6613425A0CC68528257856DBBF97DAC8BC30AEEA6078AB7F5C55B7FE36299A11E93CB1403B45A2A15075BB941E8B6E232AA1268D439C6255570E9A842035AC697D6A826FF89CF9E49391657825C44927A0B017903EAC5006D160903DAA64D142B8B710BD5BEE24DD35D20E941DADD2165DB34985BDBD94A8F1DAF3D4BA9DE138C322EAE9772C0979FFA213EB8651B8E2503F8E2CE93E876542265F3CAA42604D81C7654477AF07F6CAD414B6D3D5EDBB917FFE92377E2BD37DEC089EEE378DFC30F6251DB42D845A83F85ACA4E0DAE154BBEAD267A65AC0E29620A02A4FB40DF6AC1D11BB1D3F7F6B37B6AC5E819E0B3D180A8D60C1B2C5E8EB0F61F3C22654389C797A974C7ED9978A5F44A77C4E271163F22F3619B124038E85EDB24ACE28248F98ADB44AE75769DD2A118A606C804752A91D0C0C16742BF2A063718D58B7E5AAC49472419880DAE4DFEEDA47E6FDCDBA2ABC249ED02A95CD0ADD54EA59730C64C229414F95D751F0F7AA2083E97C93F861433A9383C3E9C8EF3A84E5A4330BB34C0BD7D9B9C6E540374BF14E82C141B37B313538D96E63762EE6BAA214A99250CCA22349376C67AD95623282AFBA8675A1D0167CC9C531C108A3F3FF52C6862F7FEBFBF8D8FDF7606FC88B2FBE7D065D2E376073C39D25412083ACDD8DCAE830FE6643251635D7E3C5D777E03F7FFC115478B5AF536A58181F9A7847650B5D02E79998E2966B685724FFC77E11F6052B8067EC38198EE0EC4818B9F3FDF8B7AFFC03324862CDB6CDD8FEDB0FA3BDB5190BC8AC111F876C8A55C05063729EFD32C38F6BBD1C01BA4A2AAA28853A2BD79893399E484A12049914645D24D349D93E7BBD1EA1862D59B24C808CB200890459070EF87C5E5CBA7449B4C2172C5820DF9391409EEF8E1D3BB075EBD67CE0917F0F0683C2093665A768A99346CAA418F27DEFB8E30E4958F9EC673F2BC932575BEED36F2093B065EEADC282AAB4D9C10307108F2791B1BBB176DD3A11F54FA6E2F0FB7C181E1AC6E5CB17851B9E4A26F32E12D2E756AF5907AFDF07960BE33BBFBD6B17162D5CA4B8D289047C5E1FF6ECDE0D97DB8D152B5688956BDAC8303B582861FDFAF5B2285DB87041DA9FFF663BB18FA40DC892B13B845EC744B3706844F8CC0BDADBC4374DB70DDB92CF104F247060FF7EAC5EBD5A59EF12CCB4E3FC85F39270C4C5C0E9724976E8C28ECE39818839B9A9DEA61496D9498C25A6760E03F8E62F9F4773731B72758BF00FBF7E07076C7E245D7E649359385C0ED833393446FAF08F1F5C8DD1D1611C397F097FF6BE3B5121FA2A5C4D0B928E6ACB4DB856018FD267665B80AD6B4ACD2A9F322D451BF65CBA0C7F4D159EFBDAF77174EF2ED85C19047C417CF44FFE3D9ADA9BB020E88757028639A46959E92AE77447C9967A967BEB7A001D0A85F09DEF7C172B57ADC2E9D3A7E1F678A5CC55435D3D1289980083DBED456363A38011931C98C1B66CD952C95AFBE94F7F2AE04AF71BAFF5BEF7BD4FB8B70F3DF41076EEDC89CECE4E016E728809BCFCFFB163C7845AC6F30281009E7DF6592937F6E69B6FE2EFFFFEEFE53E133123A6D2B3B43299794780A6D017697FCCB2FBFE534FC9BDEA1B1A70F2F4393434360A08F6F65EC67DF7DD8FC18101BCFBEE6ED4D6D4E0724F0F5A9B5BA5B2D0E9EE6E7CECE31F87DBE3C1ABAFBE8AD5AB56E3995FFE12F7DF7F3F8E1C3982B26050DE399D4ACBA2C636D8F3DEBB02F44C5E617A38DB818BDFFBDFFF7E3CFDF4D3D8BC79B3BCF3DAB56BF18B5FFCB772122B000020004944415442E414EC4E077AFA7AA55E228B6034D537E0E8D1A3089497A1B2A61AE565E5B872F9322E5FBC84473FF07EC951D8B777AFB4EF86F51B70A5A747EEE572BBB07ACD1ABCF0C20BF0070270BA9CF88B3FFF0F7302107372D32903B49AE988DB81B74E9EC273EF9DC0030FBD0FEF1CEDC2BFEC3F87414F0532368F583181C8103EB6B61D7FB0AC127B8F1C82AFA109BFB37A21828C3EE7A814C7BB2BE52B138C9ACF054CA732B1E6D3B185D557D502573B15069780D3E108BA7AFBE10DC5F03FBFF4DF44B272CB96BBB1F5C1DF42F3824634960711607F092B4F09DEF01A8AD9AA0388B3F8B21303F453A8AEA9D57C5C07826541AC5DB3063FFAD10F245BCDE954EC074EF664322D40B36AD52A9C3DDB2DE0F2B9CF7D0EDFFEF6B70574962E5D8A9FFDEC6762C5F1BE1D1D1D025004FACB972F0BD0335DB9BDBD5DAC45023501BDADAD0DAFBCF20AFEF99FFF5980DCEA9F2E0EA44DB5A9C6B038324A8F3A180CE09BFFF2AFB8C2F25E6D6D707B7D08965508E0324985C0C9249E6F7CE35FE57DF99CA4B292331E0A8F60FBF6ED58BD768D2C4A7FFD1FFF0A9FF8C42770D75D77C902F3E0830F62DFBE7D9260C205A0B5B555007AC99225387BF6ACB4C1A64D9BA49D04BCF7EC917F5351928BD6CB2FBF8CAE93A750595D85404539D2A99424A57CFDAB5FC3F66DDB303812029C0E4992C9A4D2A29572CFFDF709C0FFE2E73F977BAE5AB952323AB9436199B686C606A9C148706662CEEF7DEA77E7042BE7E4A65306689E905135FBFAD3697CE99937B0A6A3134B1B6AF1EBD317F1DCF18B08D9CAE04BC7F0405B351E59D581D17814870FECC1871FBC171DE565125252B42DE5D630D5A909CED20873D612539D3E37DBF12A5AA860DA46FA33C2C8E1991D6F61DDFA7518ED1BC0D05004D51D2D18EE1FC1B685CDF0B342B6A983934F78E12FC61535FB3EE86BB938087EB1585C32FA98F64D41218FCF2B02474C5F5682403E7165508B62707058C08A5B6A5A89B446E916301578E8CAE056DDF85E6941F2779E23D9737A4BCE6D3DAD67E36F354C0B9ECFADB815A06F748458015A980E5A9680AE835068485C2D3607D5EC28A4941E2322C6FA8454C1631A3ADFC568DA10BCD91E742110044D8208DBC1F8E6F9DCBB77EF96C587A06C449368C9D37D41F1322E7A6C17B605DF9BFF665BF37AFC3D3C3A8A80DF9FDF5150E695F39E520E4E1201EC2AC927501614B7464A44A754D09216BCB89DD8CEB9AC6A7F6653DA6D686D6E99138498939B4E0BA07574368E1CF6F50CE0F51D7BD1B97009EADADA104EDB30301A4759C0856A770EA19E1E1C387C0C77AC5A847B5676C2AF39A934C9146D4B65B6896FD3F8D7F202EA373ABC4BE7ABF6356B9E2A846B92910930E15814F0B870E4CC59D85C41D81D5EC4D3312C6FA84583D72305D89979C6A995A7D5E61D1BB3BFA25ECF82563E16A5D8A6827B225AA977098AA1402D65A3BE6667A5158B26B21AFBF46B9BE415CB5E43070A8DBB82C75A038BE6DFA6D49675A459AD662B7D6CF2A3F1EA441582936263A85D8B8A15AAF6A7B67571A289E1482BFE7781C5A29E4D3D89298166A88926586A7DA7628686F51D8C0EF7557FD33ADBE24766760303B39A66A7FE2661499179CDD3FE747052125644E94EB348549694BA855662A8AF2DF1A0AF3F9674D9766E96D9F8FB2E8FE0D9B70F211D0E6345472B1AAACA301409E1F0F94B4866ED7874DB16AC5A50854A5A63DCA6D1B7A1DD1B05F8503AB62AFF98AC8ED9E3D64E7EA2DCFC476A8F9465521752DA074743F0799CF0BABC48D91C08D1F798032ADD2E78753030A333BF1D020EE358CBB36C564C08D0CCB63300CD67165F8CD2C5E038535AC58632A6E7B9D6432E48DA2AE94C6B5284D58F6CC0D864B61583B63573511B3C5701E654469211BCB766123ADD2CBCA65827A2E1CCEA409A8A6778CA85F7548B8E750EA9F753017911FB976CCADC55B535ADEC112BE759B5A72E68A0CF357F2B5E8484724DA688A472676073399114ED6A05CE5CE809C2C40E03D0F4AFCB02648A10E8B4FD34CB786919024D2C4463FD6D964998CD982241577B178CF595B7C2446B97B0AA8A71B2A113B0239400BACE9EC7C9AED3E8B97259AA2CAF5CBE1C8B3BDA51ED77C9769A5B4F99E496555D69C35A54E33445C00C9499DC2E4E6592DC8CC7D2F2A1C00D2538E90FE4B69F91EF9EBE01343537C90438D77D4602475C0CBD013F3C6E376AAA6BB17BDF5ED435B6C0E7F3E0E4A12358BA78919ABC4E17FA07FAE1F77A313C3C88C6C66655C1847AC45EAF6C6FDF7EFB6D2C5CB808FDFD7DD8B279D335B454A6A7977D3D9A1D9FCF6CCB8D5B428185627B90DE4BAA9D4AEB36F757143BEA6A18CB5A29136B70175A9AA2DE495C841C707E9FA18EBFCE7815EB5A59D4A974A25086EAAAD25926843AF5325185F16F438AB532A95331260B52092771FED10DA2DE4901AF759130BF5B2D6123AE2F82FFDA0E52D633DB4A99AA229E2F9C7153F0609A33C2C2201AB396DF0005A8B5B57596CD82F1DF754E6E2A1D98CDE564001B3D023D30294C62E43AF3ABA46C33F41645066A0E895416703A45CD8A65A4FA07C2F0795CA82CF320160EA3A22CA8565303CE45EF2F2BBF68411BAEA6E2AD5AF9A9C6BA99E630B92D4E2358515D8D00BD72E54A09EA305B3091525B7F6A30545554E04C7737828100EAEAEB100A8D60DDFAF5F8F14F7E82A6E6660135AFD381458B16E1FCF9F302F2F473D2A748BF23A9580CE41030C81AE071AC01C9EFE96678F081FBB5F55AD4E4D2B966EB3EF9DDD144006DE5311B3052C8A2C02B473AA11EAF640D29E0E1A856415291FC92A41B6EB9191151A2F2622DEA19C9BFD96894D3DD2355B10D80A9925AE28BB6589563CD1C3557A6F3518B4C4EF4A08D8B4359ADFA6AAAA694EC3B8DBBC1A1CB5259136B8CF688FA9B7290109C792CC5FD0BEE9182B09411F857BB863983A6719BADB9B9794E1E684E6ECA16C8643239ABC68075CB62B673E6FB9E2B57F0E22BAFA0A2AC0CF1484454B132361BDA162DC5C58B3D58BD6205CE749D473C368A4C2E29B5FFDA5B9A8562D3D0D020560B79991DED1D58B3664DBE030C185B7BC49A245002E889A738DB8B20CD1F822AFFCFD99C92640C06CFED0887C21230221F58C0C9A6180E831455F7780468488BE2F70CFC281781B2A494356AB6C56AA27B3C4CD048C871FC290BFAE5FF525A694C670A7C1648D413BF8E1C3111405B2D46055EDCE129D68940A3B085B4529F521BD1DB7AE546936D3FC56574719F6C5AFB7905A095252D5559E22939864A7E2CF3407093CA1F3AE185D6AB49D898E4AB5DF330EB6E40F1A009D01EBDE0286A2A8FA18F9D3B1917E985192AF131614505FD4C45146355B3128B9CE320F758F5AF2AA2ACDC0AEA7CD63D54FD58289B3567B074CDF6B9ED1255B2D96CCEBAE25AC1B2D8D5101A19C1EEF7F68A255655518E68741476971BE11865096D68A869C0C8D0103C4E2742E121F8021EC4E329C4E3313435354B94971161D2775A5A9AC50250EA5AAA3F8CA80D9F47C8E9B4CC8BB776373A036EE1F3D9565266485B7467CF9FC3A9D367D0D9D121B426A96471F122CACBD97751E1D7D23A1B1E1E862F1090083B3259B4B43609558BEDCFE40346D1693D1B09483621695A0B172E44592098DFE617025233D3C813A57A938530369B2F0EAFC785443203A7CBA70AA6DAB3482513F2ECCCA2235F3A91544C021733013349E55D77B8E538BA32320445974778D507F6EFC5C60D6B1550BABCA259CE76318B20173063B9CECC5BABAB18E0A4B83EF9C0A29DAE65387B7B7B641E55945560F7BBEFA1BDBD03274F9E143A5C77F7696CD8B05ED1E516B44A75133231B8E33971E224962F57BCF1CECE7659782F5C382FB4C15DBB76A3B373A1D008D55C5465B2CCFC9BC977BB916BDD766A76F1783C47A1734E4033D8CD04E7CACA41410A11B7B81CC82C0914898C8A2E6EC0E717EA4F2A93119173AEDE24D247474611F47BC59289B3569BD674B52E046AD576211E8BC1E355DAB512C165643A430A945B683826DBC8D0816EA4736FF573AD0C02023045DA7BFB06A4F61BAB55545656A0A7E74A7ED2912BCC063FDDD585728AB94B2DBB8CF43739BF46EF977D50162C436824247F633FB23F9889E7F3283A9AF5DE06606EB4BDAF07D05C545E7FFD755990489D2358334BB0A1A10EFD0303F0CA73D9E0F705F1DEDE77B17DFB1DE227AFAF6FC0C18387D0D8D884D5AB566160B81F17E90E4AA4104DA74D223C5AEB1A11898EA0A7FF0ADA17758ABBCE96C961381C436B6B1B366CDC209548C4125514F119FF88054DFA9C4EF52660F267F7EE77247184F533CF9C3D8FBFF88BBFC457BEF2153CF1C4A7F1C61B6FA0AAAA52161082337F3EF4A10F491288DF1FC4BE7D0704D0B76FDF86EF7DEFBBB8E79EBB9148B0F6A04DE6F8430FFEB60897A92AE7CA05329F3EB79D16C79E3D7B721CDCFCE18020F791939B9DC5C9C86C2002F6F1E3C7C54D31141A853F18808B05331331D873369407CB1149A670A9B707EBD6AF45CF8573B09115104BC05B5989DE814149063039F7EC748287E1A4F21E4C19E5BFAB2ACBC56A33890104E975EBD60968943E536B016E750787423261159898EDAB11145255D155D61D79A6D448A028BD5332CF84BBAAC1D7E854D08560262DBF376C02657529949AA9497D3D80E66EECB5D75EC3B973E7F0D8638F4932098FA755B076F50A1C3F76146565953429D03F38846D776C44321E971D44782482B5EB37CA986271E0EF7DE3DF50E1F763F3DDF7E17CCF15545456A2A3B61E878F1EC6A1E38751D3DC88B52B96E39D377760D3D6BB10892670F7DD774B1156A5CB9CD562DA53EB9FF18E366D672C680609DD1EB7042B0998BC5F6F5F0F5E7FED35D4D536E0C5975EC1073FF8980072636383EC6C5E7DF5157CE4231FC1AE5D3BB178F1223174984CF3E94F7F065FFFFABFE20B9FFF027EF6F39F221209E3DE7BEF9573588FF1A31FF9A88C118F9795C0E9C251CC91F9F4B9ED2CE89E9E9E9CD93AD152E2F69716B5A998C081C24C21A347108DA5A4F8E3A9AE53E8EC68432A9194EF2F5FE945DA0ED4D4D5A0BFA7077E97138E9C1DE5B5B5088723963A832E21D013148C856E7C6504E8587454267A5D5D9D2C1A9C880477FA4A4B9FF15BA0D87A35A233745370511DF329B6F46ED8401A4F20FE862F2A8F7C3D80E6F8E4D8A021C15A797CCFFEFE5E6CDFBE056FEED8857BEF7D5052B083412FAA2B2B25F3EDB5D77760FD868D387EE228CA026558B16C19B2B9242E5CBC8C8EF68578FED7CF8B1B88EE38BA49687D9605BD58B4B85DB2E6962E5D069B8D3EDF9C365C6459523AE63368415BE96EC68256D2A08A4142CD8DC868044D8DCD387AEC047CBE80BC3F9353589771DBB66DF2EE8CF3D0F0613599E5CB9763EFDE7DD8BEFD6EECD9F3AED4FDF3FBBDD2C674551D3B7602AD2D0BC4CD41D125137B986F73EEB6B3A0E98336568F95EB79ADD59D0BAAE67168A60509E7460C514596878606A4A8A5EA65F5231C55AD7025BF0BE3CE90ECB5E2981149D3D698894E97828445183B8EA56AF51512BCB8008A85E86040ACE853C8859881F93737006DC66C315F379B4BC161770A88CA771C680C7E81FE68FE5DE92BA7526429F14317052D45E5B661728B8C70D9DAF31AD4C3E035150B229B637579ED234EA7E070AA0A2DB3EDE22013CA58D0EA1D9CE22BB73BD4F3A8D891A206F2C37737711C9EA7DA8BCF6AE6A3D2F93065C1184064069F0486B56A9EA12CCEC02099B14BDC76004D1687616E58077BB155966F6185C18A3B4A7FB15441D1B2ED9A231A1A1A42B0BA52A2DE6EA86DB021F45F8515DC424BD45D0D2C157D9FD9ADF28C8D8E797E21B61B771DA4C2319DF737B3B0CD1D409B05DC8C2DA1BC5122955CE62C990B36D81D1ECDDD4F29253F025D3A07267F300027D662868C17BB04116D043C06FEC41221ACD3BE5032B8B94C1A99ACAA6B58603B196B73064D68C348D13E68F2D909D005394FBE9F9647D525BB38344D1660F1FC29C47E0A006EB4A54DB2982AFD652459D5CEA0E4E2284CF899D9134E03408C056DF4704D47AB95B50094790B4D6BC7D25FA906AF02540A24D958E2C60684868711ACAE120EAA64A1E5015DBDA6F1635A7D95565A9DA14F19FAD235178B69BCEFCD7E4A715B58B7C38CEC337E409753E133D93ADC2A576BEA599C1327A158A16B2A037DA2925786074DFF79815AA68059123248BB13BFAD7A35A6AD1B2B40525004F4B406844E9EA0F52829E2F682E03F991D595AAB9205ABB2F08CBBC1CC9BD9603B58697605C693D6B0A6352CC944643C311B92E90863D3D90D4D562D26CA82569F9C58CFF4A19B1883EA774A857297A10AC9CE247D70A6E6DD6DE783CE652553456D7FF43ECD58B385D5D5E4F0EB80886C0185D36F499537D33087D070585801EA30B19F75869245FCDB22C66D3ACF90E9C75B18662AF034530365AEAF63056A4E6482B3D135B68ADE98B69F38E1609A006D1185BF5649F6D90068C5D31E2BB8AF76601C9474EB180343D7E7935470651C081849762BC579A85DAE133EB4268C30180400559A8B23ABDC78521984AE847C3D3DF56604FEC2F8B42E413796A8429AA04954D10EC2425ABAE06C0E991CDD14CEFC0E557B2CD53A3446D7465F41EB71281F7321CDDD003471803E6B1A683A876CAE87FA98FBDF7E99841433303D61014DE95C439FD256837431AB36A8DC581D1F29582534956960338041E16F46F955985F4D24E3BEA0F5ADC697552BA1906966A5E31506DABC1A2733F730F9B4D76BE4BF16FDD9B499D572A65B83006D7CCE63B7B8B36C414F027D2771C8B8ED39998A2A66B765C6936A17055E94795256A34A52C921A3CA3C49511905C0D4B848534AD161432E95868B56357248D1CD415706F358983D287F57413A9B58263AFB957E5FF14DAB4A35922AAD330E8DB53ADDC1422F8BF0A02DA9DE920128D6BC7E473EB79A903AC1A46029F3CF2C6460AC64717971E7CB854D176F30CFACE699D12FB10609D53BCD97CF6DE78316F379863E526BD2064422A46DB9E066258CD2E7DA2D906F79369C1548B53E045D46B277558BA1523319EB76A24BC3B06F6EB5A62E0668BB852A41B049A6B84D7731B7262FB9497EBED39E412C1A81C35B21B97F4E5B0EE94C0236875B454B98FD484684D3298143B18CED76C44746A52289A474D3882080937A483D0F131FA1FEA2839A4C698447A3089655AA406C26A9AC735668A1246F3A2569F3D1684C2870D27BCC40141D109780241756B29332E9B404F4443E34AF1B42CDA1020F5A02EADA5DE8B2DB100D87652790B2B9E115594F96BBA2BB46D1F194CC28EFABABB6EB5D96CBE7021C2E05B9E984B882E87BF7B8A82D429F3C634619793637150D450B4495D562B6217315C2236104CACA9578932EFB457AA694CBD2B2872C48CC1D9DCA368DE977663F29CB3C166556AB4716518753EDCC53499D85CA47D6B2A3BC9FC7AD323F73593B1A9A4A6A76539EE7569C61CFC7A231A97B26DCDA295FED363B41EB54707FA1045895DAB244E5B5DC17653F8D7CA3B896F4CE83343302152DE75BD105743D8026BDEEED777663C58A9538D5D52D1982034303A80878515F5B8563478FA275E15201C8A6867AF45CEE414D5D0356AE58894B674EE2E5575EC392E52BE172BA101A1DC1AAD5ABF0AD7FFD061E7FFC719C397F4E32EF860706859E76AAFBB4D03E63D1A858B49B376D403A95C4B7BEFD5D6CDA7287F8FD2B834A73D94E7AA9CB8763470E61F3C6F5D8F1E65BD8B0618308E6D73736E0E2C54BD8B8699324CA9012C73EA46E32136F1E79E491BC521DC7012BAAA4B33A514554E2B292FD78F8C001ECDDB34784AE4E9DBF2245989B9B1AD0DF77195BB66C121D96B7DFDE8D75EB3788F8BDD7ED4530A04A7AFDF6FB1F45E7A245D8B57327BC6EB54011CCB9A03011C9E3F5A1B9B909478F1D950499C6FA3A49E7A71B25102893E49EA79EFA2E2AABAAC5B2975259C90442A161D4D5D548D92C2E0C274F7563E99265088F8684CEC70F99334CBFBFE79E3BF1D24B2FA0B2A21CE1D138FC7E1F46A321B8DC4E78DC7EF4F78510F0073030D88340C00D87CD858AF26A74779FC5673FFF87730229737253BD2D9C310BDA000789F1FC50F7A1F499A005B469467026198A0381FB0EA98ACC4DAB5433D172117A8742EB82139B0B20AD2E6B80F7566AEFEB0134C7D8F77FF04301E0FA8626F111B36453477B23DE78E555545556E3ECE51E7CFEF39FC38F7FF4235457D74BE511AFD78DA0C786175E7A159F79F20FF1F39FFF1C651541A9D6F1C273CF0B50BFF6E61B2204D5DEBA005DA7BAB071EB66D1E4D8B56B175A16B4A1BAB25C00EFC5975FC5DA751BB06FDF7EF85C0E7CEEF39FC50F9F7E1A2323310C0CF4E2CFFEFDFF82FFF1DFBF22554C08E297AFF448F625DD3265E595924E4F90FEB33FFD7778EFBD7D52D18402464A1F5D5B910CE67954651827EB2BBA5DF8E2DFFD1D36AE5F8791915191F4F50503E83A711C765B56126812C9244E9EECD252AC4E49F53F71F4885461F9DC9FFC094E9C3C2119BF6FBEF196EC3456AF5C8581C1413435354AAA78341197946FB6FF5FFDE5FF8AA79E7A4A1628064FC92767F516BA5F962D5B86969616ECD8F186BCD3FBDFFF28BEF3ED6FC1E70F606868045FF8FC1FE3FFFBF297F0977FF91F447C6BC78E5D686A6CC182B6569C39D385CB972EE283BFF361BCF2EA2BA8A808E091471EC0CF7FF13C76EDDC8F8F7CF8C348A6423879EA30DA5A16C2EF2BC7EEDDEFE2FFFABFFFEB9C60E59CDC74A601DA808311ED61E249E9739D16307139318F559A31E19996B3783C68383BD22AC49A7588921A7D9FA391519556AFAB7EDC8AD633DFFD7A00CDECB7E77EF53C366FDE827DFB0F8A25D7D8548F851DEDD8F3F6DBF0FAFCA8AEAFC75B6FBD85BBEFBC13EFBDB71FCB96AFC2C68DEB70E5F259EC7CEB6DDC73DF03D8F1C69B486612D8B071235E7DF165A9F377B9B74780A8BEA64EACDB3777BD85B6050BF4CED0857BEEBE53DC772FBEF42A52D91C823A03F6F0A183B2F5B7DBB973CCC0E7A5BE471A65E5653877FEBC58D2741D50A69596F9C18307A52622B36A59624B0AD652BC4903348BAB2A2D0E8FACD85C8809D2278F1FC34BBF7E019B366F8637502E5209870E1EC0DA35AB6447313A1AC1F7BEFF432C5ABC18838303282F0B8AF55F5D538DA1E1307EE7773E801D6FBE89E150041EB2409271F8CBAB505F57CB8A547877DF21AC59BB1A5D278F23128BA3BAAA5A2C632E2ED4ED78EEB9E7A4F02B0BBA0E8786C5FAE73B313371786808E5E51548A632F8E0071EC30B2F3E8F586C145555D5C2AEA19EC9C30F3F844307F7898BE3D5D77662DDBA953877BE0BC323615455D6A1EBD4197CE0031FC0FEFDEF6161E702749D3E8986FA5644C329FCEE131F9F13AC9C939B4E07A0AF0E651519E014ECC9649088271028A5674FB83E290F079DA869641964A54F8E143085CAF24371733B5CAC3586F0282B4C3BAFDA9DDC8A207D7590506B8A6B8682B01774208CEE0071FF087D4C9587CAB18A8AE281EAC40D2DAB9B61A56BA7F85E1974133A1EAB50D33FAD772CC2AD56FE24E42866AE2B9A503D3D9B4E28C53EFA53A90297A6FF55C55F541C86FACDDC0F3119C6A114F674E28895BB6D744DF43C143FB4A288E87C000B400BCF44F267C4412BEA83F40B4B554FEA5353579DC1CD2445EEE9D7A56F5E73A599684329D23455F998E0A2FCC5B0BB60A7EE06B2C8D89CC268E1C292B3A9D811255AA98B2D7AD3129854D43B1A070468691EBAE4A4A28D0AC44A4101117612EB028CB28ACF5EFEC00A100EADA3AD5E958B1905ABC40FCDE335FF5A3299993C2322552C64CEF774A1BAA6724EB0724E6E3A5D8096CECB434FDE0C54161F2B1167B322E4122C2B9F10A06EE703C48521342ECEC84C5E839800AD1B53748A6959E7B20E8486E8AFF489B0BE9523AE26D39C0DA159EBC2F1591CAABA8BE2F82AD6906272C85F659B4FAA5D3A9392125E90121F8A6AA734CEE9E127079AE7520C48D14BA56AB616F6E20B19117C8228D3AD850D22CC103B1CC24ACA2AB0CBD92489045926BBA860633623C59EE4B8ACDC5FF58F95816380DAFA7F1E27E1482B40A7291CE651EB8C7CABAA95E40374129CB30980D2BAE663C9DA4E0AA1EE19A11EB2B6249F81C136CD0BE0EF0C3C72312128139C856228EB98A6C7E6E55A4DB92A9D74A60B1D9898884A72A3F56F28BB7C16260A91EDC25A8DEA9954C524F683AAA044D714415B71D7550B98ED2383824A2295EDCFF74FA3A1FE36D3839E2A8BA3D0E9665E2A80B60E3EA6D9D2475812389A18BB18A957255849ED52AE0D87D0BA34C79C4511721944C3A328F304E0F2B826BEE82D72C4447AD0C5A02740C8E168279011A85D52F35200C9460B50201C5966030A7C1198146019C672F1422756A855905F2C55A5392D241BB13655F963A2230B57703185A49CF33994E094953A5AC842BCBAA3242EACCB42898B4303B400B758F766BCE86031AD53EA511348B5C0BEE4F6DA68B9EBFBE6F8BD0256B1E865C1521635192532D6F40E249DCD69612D2E407A5111CBAB109C5656BC7A1E43DB53EFA4D2E7A59559A185D16D1B8B24287F1DD73F8783FE74FAD919304C0BB30539EE3858F99240AE74B6D547A5E0DB6DECC714B2B6249A1B16CC89253227379D510B5AAC0B954ACA41158DC524123E672F76938014278BF06C59A5DA6EC3F0680C57FA876173BBD052578D80C38EE8E808821E0FBC2EB7A6ADDE1EADAA6A12D688BFB73883923B086E83CDF63A2F5320B5EE4C96206963AA4C9BE1F533B3D0E9F220C7B46E52D34CCD151EE4A4F56B0164A100B34CB8768DE8926C52FC8A092EB452ED04E302408B059D75083813A455C95D65A15BF9C8D71A9E06A005E832D4CBC88A0F5AAC67E976DECB80ADA9EFA976AE5C2084362817574B908639A5EF2C9E1A72A11D12407439B8AB50EDE3B0A96C44717B20ADD2E38DC68EA61BE62D6F29CAA0761E62C98B6EBBBABF7227F1FA4A0082FB3F6967592CE80A5196B9DDCE3691D12FCF2469F902CCAAF28D4ADF573C7695BCAC2CEB052D6D7332F8E7E4A6330AD07A2810A409D031D26D7C7EB8945BAFF419A70538EE24AD96969E1D38131EC5BE23DD58BD7211A299348E9F3883D59D6D58565D0637072F01229FAE5BB8603178DD2A8D3D7ED158F5767C678233815A40486B898B8D99A355EB80C3468B2C2D6E089BCD2DBE7E9B3D23B6B57828740D435A9F1CA3D4952140B3AA8CF88CE99F753868900B508BB782C0237EDB0C720E1758F1CDE570219B4928707238914A2BF0918C18FAA98D3898F68517343526B6A0C94D26DD2D2B40A77CEBA4C54B824D26839C9D2E0055C28A2E0AB18C25F74C2D0CEA1C5564961C69FAD0794DFAEF6D5C40C4ED40B70D9F953C6D0E338A403991A6C56DD1FA1050D6D995A6E0ABE87FF0DE92569F91DAA3BC3FC1D56E638C80199F4A2655F9A0EDB0F32064944F5C78D1AABA0F5DF0AADA0B331909C9A142850000200049444154CEFC9DE9ECAAD28BDDEE425D4DF59CC0C99CDC7466019A2BA18AC928804E21E0F7EA62B1B70A64CCEC7B28FB2D83141C88A432F8F1ABBBB069D9323CFFA35FA2B6BE06EB1FDC8E0B4323F8E0F245E2A726A343C95215EAFADD8ABE67D3CAD70368AB7B83C92906A8A548AC9D16A7038E6C42F9332558C81F15B8E392C8B58E9C6202BD8032B1D7CED2600EA93E235B7AAE8976BBB89CE289049C1E5A9792442E1ED804CF73B2F24A162EFABE6D3649D22AAFA846361517FB312BD6A4760F188B96A0A915E6640E16CD7E31DC75156FEA41F3BEB253A0AE88C9194C517304C83A3D70BA18A84CC24546865EB0685073B120A01258F9CCC2D37633BBD726D573025E9FFC9FC7113F95FA9D4B15DA88C7E57D9C7A01E0EFD48916DB5C74C3154FDBC9DD8D58E1D4F748C1C3D5438C08E50F97EC4D2DA8984E33F147050519C8E502C68416B560296D6DB52B327E721DA03401E05C0E0D75F57382957372D399036895F0C68ECF4847E5904C67E0F1B8E0D2F5E16616DA6E9DAB7170C6EC76BC75F8141A6B6BF1FD7FFB16CE1D3D2C0070D7873E084775359EBCF72E3808062447EB74E25B1998C7076845025739961039556A34B37C1ADD98FC3735CB83C132A4B236D43534E0D2D9D3221C75EEC245D4D4D48189ADD1C8285A3B97A2B9B1016FBEFE2A5C2E37528914162F5E8CEEF367515E560EA7CD2EBCE0DEFE3E2C5CB408894854E87177DE7337CE9CEE428E40E476A16760502C585624A92E57D982C78E9D146EF4F0403F6AAA2A70FADC05B4B57708AF58B921540AB9AA34AEDE650C406BBF84D898AC5C9E5182FD648250908CD0D77BF932DE7CED55D4D535A2EBFC15ACDBB801AD2D8D181E1AC0C285EDB878F1220E1D3A8255AB56A3AFAF1FF5B5F542B33B74F810B66EDF8A8ECE4E7CF5AB5FC5EF7DFA09FCF8E91F62F9B26558B97A0DBEFB9DEF883BEDD34F3C891FFCE007B8FFBE7BE171FB70ECD8512988F0DB0F3F24943AA9633914423C114763531322D1B8F0D149E7DBB4612D0E1F3A2C5996E43C8F8479BC0B172F5E407535935E32686D6DC6E9D327D1D9B100070E1E445BDB4284C32AFB78E9D245280BFAF0EC73CF2118AC909D00E9825DDD27D1D2DA88F5AB37CC0956CEC94D6F04A0CD2452D15815614E833E373B86469338DD7511F575756869AE21414C62B7F98F25D278356D6FAAE03B892BE40FB9FEB156C2E06FA443B4746BC40EFCFA9D77B16EE962FCF72F7E19A1DEF3C8A6D2D8FA810FA0BCA9150FAD5803172D24B7D22CA60563CA51CD16508F6929FD0F15772FC82FA9CDB1716119368F625388DB61AA5D59747CC182A6E6B109B429EB953C682679B0165F64744400F6E48953F8E33FFE77F8C92F7E8605ED6DB0A75370B97D786BE7DBF8F4673E891D6FBC86782C0197AF12EBD7ADC6B3BFFC299E78E249BCB36BB70030E5716B6AAA7168DF013CF9FB9FC157FFE9EBD8BC79338E1D3E82254B97A0BAB6163EAF0BBBDE7A539EA7B9B51D274E9DC6A31F783F7A2F5D402CC63263FD180947B165E37A5C3877162DED1DC209BEF3CE3B752AB47253A87ED301F6620B5AFBCCC9893682FD4A3BC32625C6BEFCA57FC0DA552B118B25309A0228471A0A0D0A40DF7DF79D62099F3A754A8CA6707814D595353266CE9F3F8B27FEE0499C3DD32D9995914412995412B1C828DA3B1763EF7BEF62CDEAE5D8B7EF90F404332617762EC68B2FBE889ADA2A01E9B5EBD6E1DD3D7BF0DB0F3F824B972FA173E1423CFBECF3921CB361DD3AF8BD4EF4F6F661F3963BF04FFFF44F527B349188CA0E60C386CD38B0FF203A1776A2A9A91E2FBCF82B545757A1B36329FA7A87A43EE2F2154BB06471BB24FC6CDD42BEB91F6FEF7E07F7FFD63DD8FDDE4EFCF55FFCA71B1D56D31A957372D3E902B4A18789B39F032797452C1DC6CEA32F23928D23166BC6F2855B313438820B0397F1D09675A83369DFA43AC9DBDAF30A618C2B5B455B26DF828A3E247C4B0307726D2381690A06E8F03E7D929A663546605DF3392D67E5C1E5463B667C412815E4A17F2D9ECC20964AA23F16C389A108E27D97F0C64F7E2C09120F7DEA93B83C9AC027EFDA0CAF16CE61E5666EE7CD8FF2DFD924AB50B6B2F499E6A3E0C2FAD28241059A97720F149408557B6BB0D0C1258917692AB64875DA7318CDE5D04B6BD2668797556F023EF8A9BF20E099111FAFF87785D9A0740C95D16F7221F346A3BAE5351AD72C94B4F86AAA6A15EFD602D07C5666E17DF39BDF1460A6FF9255776835FEDEEF3D81975E7D09A94C1CE1FE105A5ADA71FACC197CEC138FE39BFFF60DB436B7C1E1F3E3D3BFF7297CE98BFF2F3EF9894F61F73BEF88CF9560DFD6DE8E81FE7EC99CEBEEEE968412BA06987475CF3DF7602414C28F9F7E1ACB962FC75028242E8D2D5BB648E5929ECB17E5B9982A3D3ACAA48B4AD4D5378ABB80C798BE9ACCF8E6B1EC63822DFB5635974D5C032FBDF4120E1F38288B86C75F2EC1F89D3B77481209B31199FCC2EC3FB60DC703B34D2F5DBA24D76B6D5B807BEFBE479AFE0F3EFF39FCF57FFC2B444646B074D9327CF77BDFC3A38FBC0FEFEC7A07E72F5CC0E7BFF07919A3070EECC7430F3D846F7CE31BE286606AF77DF7DD8763C78EE3FCF90BD23F43C321DC75E75DD8BA7913BEF3D453F0F97DC216A121416DF2AE93A7B0FD8EEDD8F9D65B92F2CED4F7A6A606C9886D6E69C56BAFBE818E8E765914D6AE5D85BFFBBBBF9724248FD72FBB1216FA65BB7EFC631FBBD1293999E6BFEA9839B9E974005A7C7312FD96B085F8B608D2D1D408761CDD016F59392E9D49E3C0BBC7D058D780471EFF1D2987B56AC90204297C8EB400BAE2699262A37C20B275D5422B93B7BDF45221D11BE34B31969C21C6EBA6956B6B27B946060928EB4FFED7221EE1441D339ED6D4B5685426C3D2048908921E8F4F7C87A4CEBE76E2AC90F15D4C55B1D9108A8E62C9A23674FA1DE207559CDD02B0E6A3EAE2562A80F6D820D4D8C58FD7E00F83317C4E092EE5036CAA7D54FFB23B245543ACE650268D43E72F211C51BE4B3A2133F128B6AD5B0997247964642C70AF94E679A2F266BCE5966798C436E56A80B6B238D4B7043D82222B5933EACFB6255F982E587A999D1E0790E0FB386495B239A83741A17B0740360CFD9FB934EC22526F2AFB28B6014185D727B03145DBEC5A441F453B59588897AE0D321608EECA07CEFB6565AB9E88C7E5FF0CCA997E2A2E88311E5258591C4A0F5A01B48C436D594BDC22A58A34F3FA8A134E1126F51CFC3F7704BC1F1717BA2454956E3B92BC9E8B6249DCFB6A3E398386F495EB925AD4C2E67D6D741EEB0732E7A758AB92E98612E0E6351DFA59DC32AEB8489FEEEE465D7D1DCA2BA9D39154E34CF3CC25C8E966020A45985C923929CFA20B543381C8B8B154B0910607F542B88374A3AEB61424BCFE0A93B78832C889F342D88A48E61278EFCC2954D6B7E07FFFD3BF40B9D3875434850F7EF46368DFB00AF50DB568F07BE1455A9F4562A69EC27AF4092F92B4254B106CC2E5EEAA096FEC7B0DD0722DAD722196760191B5FD2D7F90D09B39554569CCDA31EE231810B4F25BA52D8A1246389138D9CD80E464535ABB9A5624EB06694D69C46D6E5C8CC4D113CDC9E46EF4E6D0E0F5C08BA48E5869F9D6719EC854D328B6D218B85125910AFAC0FC9DCFC3C2A0FC51595E4AE7D8EBF20AB839E84A61143E0BC4EDC0B1A1280606FB70FCBD3D38BDF72836DFB10D6BB66D416FDF156C5BBD0C545D71EA523BE2E2C8C731954B22BF439A36405BB4C4F3AC0D054CB4A00D6048065D2E8D74360577CE09BB830C08D2769392A1C977226E93D160A3FA9BDD296D61AD686FC0CEE84D9BBE962216024A4A92543149C8DA6082078D0DD58E02E4B240B1D155969DB9BE59BCC72D4566495431597B7980163606F727A4C9A97BC8C2A2CB781194791FD5972ABB4F1B60790097B1690AC1EACC485E836352005902805C60359F9989405AF3DD94D39220AC56DCE3BB2B9E3615EB28F26F87D3CE40655AB34014C346F4C965EDD27C736DF548BB3AD8274AB255D5265542F3D28652B498224B5C7CD4F2DF505F3B91CD3421644CE78039B9A9EE40EB9499F8D9E568F61A1B9F047335F792D924DE3BD383405D3DFECB9FFF39CA1D5924E2293CFCF1DF45C78A25686EA8439D00740E4E992063132E1425C86CAC277E8C31478CB17A3940550D360DBB169707E78F9640D5CF4D03C1A8C8E541DAE0895A7DC6FD58AD57E3521046801691E78ACFC015BFA34E81F1195B270D7F5756989ACCD9AC1D71669F51F3970334954619AD1F46FC09E8126D570F6426A25910AC0B85D5AD329E8FDA4CEEF1B494C5CA4F53AE328D6C9A8B0890F538F1F2D12E5478ECF8FE57FE273289A404AFFEE6FFFC2FD87FEE321EBC6B0B7C39C88F22AD524CD904BF1443623A2E2C95A8421787E2D95ADF85EF60CDA63496AF80948D20CA841F8704A568E1C22EA6B58CBB442A2D954820C244DC45281095ACC13429612A53CF808B59784DBBF13B55BF90343E45F733206EAC64B560286A9CC94AB482E6B546B8B5EF941B4CEB41CBC0D149297C76F3119A9C1A0FA60DCCBDCD731B0B3B7F0ED3BEB3597874B6619202FD4EA714A74B723C7ADDAAA4962C0605FEB6E2265BCB7DA945DFD43E14B74C8AE04C09D30CECCE42BB1880E6F815F6B34513DE5C77BC36298C6B6564343696581CD74547B5F52DF2030887348D43178730104B61F87C17F6EDD98DDA86063CF0F8E352E57B755B2B1CD9149C3A5B4E883F1CDC6E8744C41570A974CFC907BE14514D9DCC812317B1383A8D7BC3E8C4695FB509A06B2BD9B83AC451622EA7A3EB0542DBD866B15AD057BB2E7232818DEFD04C946270E6AD76EDD983AA8A6AF45DBEA2DEDF4985780546B148026E5740FCD1A95C0A8D2DCDE8686ABC6EFF148358F1BDAD6053DCCEB2E8E483573464547FA46DC0CFF61C420009FCE01FFF116E9B0DD1440AFFDBDFFE0D4EF60DE1AE2DEB5166033C4AC75E7D7463AA8C3EF50755BD72F21F05D0351AA0AD554BD40EC080B4B11E0B57562E385B96AE169D512719DF6A0155855699B8A1161303BCD6B6B23EA5D505226F429A99708F0B00648E3760A3AC686B49A9B1E9DE13B5820155AB0F9A7440E5C648CAE9628D4BA287EA36734EF118300B8EF93BF7BEE47723A553D895FA7F5EA08B74435E93B3255F264CBFB775E132BF5BC794B83274A92503C4D226B225D53521F5626BDAD5EC2ACCF35B1748F337D5D6392C58D03A95213451334FFAFB39B9A9068C495BD0EA40957B25EE00F54F318E32B624225917F69EBA8C8B97BAB17EDD1AF40F0CE3CCE50B7864EB26D4B93CF954551165C9D173CD12F22924A26119101E8F1FC1A052C09B1C48AB945E659D51EDCDD2DED635C446809692A1F2B8F2EC96EF69454B184B6B20F0723C837FE3D2315EE77070519398BE3E8231FD951C58E6C758D8C593C5FA6F3EFD89336711F405D07FA9579E2F118F209B8DA3B1B119E1D118FAFB87457B2369CBA2AD7301DA1B9BC63262261862568B4CF7F75596A8B9843C9B3427B3151863A0980EA4BAC881FE618C0CF6E3C8AE5DD8F5DA0EDCFD5B0FE0FEF73F8A935D5DB86FCB3A7872004359C657AA5C1C6C64F6B26A7B132A9CEC609FA826A1F5D5C74E6E1588E618930413016165CD8A954780D08B85691FAB0FD75CD70AB0D69D8A017403C2D6F633006D2C5A734F034213218275DC582D68732F71970880AA019CCD2901FC6C56BB59F40DAC606D5C2CC6A8C85BB0922EA8DD79DAE5213107A6C4B3AD2CF3C9BC734118C92407A905CEDC832E2095BDC902BC8542B7BC9658CFFCDEFA778B4689757133ED647628CAFD61673078B2C367A2A69ED2F77372D3E900B414B0673690D9B46A0767D69105EB26F3673099C2A1A35D68AAA9C3D2D61A38981490073A5A87869A279B2899D422B294CE6064949522940F8D16A8298469180A56C09141A3AB8A4B8C5B99F73A214195A39707D5B141E690F1F9783F67460A22691116193D7AC151A3322D13BBF0DCC6BF476B99A0CC7F139429F959EC5EA0CFD950E1F89D494996EBA6D3720EFF260B1107337D76CC624B3BE5DF0E970AD2487A70862D1E874D02420EA493B4AA75545F6F9FCD04B182007F2F667498496D1DFC0640A45DE58D95BC6986D7CEA9C40CEE30065269BC73EC341A9AEA11F0783092C8E1D0E123F8E47D9BE1D1344AA9F7A2036ED2AB04429D4D9735014EDDD456ABF45A8BB1D0EC6AAA45545F89F0684B4F07B724FA910F9C713BAE5D2C747F3025CE4ED683F2CDAA8AD5327A6507480BDA543631F7BFDE56BBD8F5506C3D176FFF95556B529755BB98716DB53CAF87123CCED0EC0C58CAB36A5122A5E0E7CABFA3B8A3F22C29757F53A3D02C361218346BA7CE7034C69629006D9E95FF66C0D000BBF93BDD7779664971993CFA99A9E161E177CBB8946C1D950844F798D5C5915F382DBB92E245CF2C5025809E8445A6E3D522BBC21992CD30CBCD2129B25C1D47010C876328F7781074D0776A479AD592E329C423619497D327AB20BB907A200ECC7C80D0508C4482D16CE7F420A7C5CA1FB5C5332A58A66A94B2FE725995312582F7DA50C8B0DA8B5E2818D47233DB4AFF5B980B6AFEE74B34725008185BD28939B00CA5CD3C97B5C9FAFBFB71ECD831545656221289482205FF662C34B202962E5D2A54A8789C406F87CB6D47343A828A60AD00476D5D15060607446C8673309A0C8B1E83CBE1C568784806797979B93C1BFF4F5F379F95D7E68794305AF7AB56AD92124ECA482A640C9909271698F62B9A924AF237022D015E2C50E5E2206C8FA673E8BED087542A2719649DAD35A8743A44924892300810622913DCB3B0F3DA82060E51EA93BEB2145DB5FAC0C71B765703B44216B1F232199C3EDD2D4920172E5C445959397AFBAFC0E771A3B1A111C78E9EC0E2A58B71F9F2252C5AB41867CF9E476D6D1DAA6BABD0D77309E7841EE6C6C2850B85DF5B53538337DE78039B366D927625758D5430D2ECBABABAA49DD956FC8EF4352EB0A49F353151231291E01AC7249365088C0D0D8DC2D526685247591B4357698A4C16A0B52085005B3412163DE7DADA5A5CBE328055AB57A3A1BE1EE1704878DCBDBD578407BD62C50A8C8C84515FD7209AD35DA74F63D98A65685FD086A1C1415CEABD22B90A7D3DBD686B6BC3E933DDA8ADAB45B93F88935DA750D7D880C1BE7E19C34C7E615BF01D59B880B446B605DFEDCC9933C2B21083C5ED81DBE311595CEE541A1B1B85E2D750C7649918828100AA6B6B3034342422FEF5F575721D566161DB197721E708FB85EFF8FCF3CFE381071E10CDEF12404F64F81390C5A59116E5E293278EE3F88953181A8EC34F71935C0A613BA9463E642249DC7FE71DB834D08BFDC78EA0AEAA02158120EEDC7EA7D233166D095AE48E7C3695D45DD3CF60B508CD96D1802607047F274F92623A8A9EC333E99BA465C1EC2BF277B3C8E44248669C387AE212BAAE5C960174C786F5A8F1F9C4B297B0A1F69410A88475114F8A35E26339295AB596A8B8351064567F03761C6C045F0E264E5C4E7C665FF1590D358ABC501E170E47E0740590B56544D4BCA6AA0EF1E828AAAB83123C64465C5CF47D8154320B9FCB07E458205655AC619B18C54033B0B9787012111C9A9B9BE1A2A68109C868CB93C772D120E8F0BD3C5EAFBCB3CBED923E8D45E352F0D7E5A1F04E0E198AC58B0219E062BB122645F33B2E62F54A361288A71292FA4C660163EE0E2EA8196A10BB118E25E0F1B9A5ADA947CCE7B45AF4E359D15703B4B242D9CBE42AFFE29967D1DABA00030343180987D1D8D4808AA01F4383434824D28827E3D87EE7761C3B725492456814AC5EBB12996402CF3DF32C1EFFC847A53A08DB8BA5AEBEF6B5AFE1D1471FC50B2FBC80868606691FB615FFCF7EDCBF7FBFB4D7EAD5AB6501FEF5AF7F255545C8E5EDEDED173A1BFF4EEA646F6FAFE2070F0DE0631FFB98FCDD30794CF070C2A966B1A0E9DBE5F90C387FE3DFFE053555D5D237834361D15DE7BD2E5E3887471E791F464642387CF8B000269F239BCE61F9F215387CF4283EF9BB9F40243C2A25AFFC654179BFCA20AB95ECC6FA4D1B71EEFC39B43434211A8FE1FCC50BF8FDCF3C89679F7D560099BCF0C71E7B0CCF3CF38C3C0B1737822ADF870B1A01FCC0BEFD88C5E3E83ADD85279EFC0CBEFDED6FE3F77FFFF785077DA6FB0C46C3613CFEE10F4916E8C68D1BF1F4D33FC4D6ADDBB063C75B92F5C9FBB04ACBBE7DFBE4F909E42C9EB066CD1A590C6B6B4B2C8EEB8F1B6A42084067858D71F8E8111C3A7A0C9D1D2B511508209B8EA277B80F8D754D48C65270063CF007838845C2703A191A74A2B56581164A576C10D2F58C55AE521CC6FF580373E688783C29994AC9544CB896EC5497F8BB9D22FD087B18CFECF82212C900D62CFF085CB900721E2F761FD8277EF2B6AA6A38A91896C921311A0123DA6E6A2EFBFD79C5AE62F02876B3582D69AB0FD1F8ED8AF9AFE207D53E35D1CCD51921B2348905AF7C3372BED6F1CD08A3426FE3B50569B540AD819631943B7D4DE547525BFC2B577AF0EEBBEFA2ACBC42B2D068E1A4531904CA2B313834023F9CA80A96A1373E8AB28A0042FDFDB8FBAEBB70EA6437FA87C2E88F84515D5686BA323F366F5E8B575E7E51764983C321A4B276B47574E2D2C58B280B78111919C2E38F7F147BF61DC4E933E7D0D1D684D69626AC5CB9523B9B943F758C35AD7D9F4C5419EBE2280034770D2FBDF4327AFBFAB174E972356A6C36AC5CB1104FFFE0C758D0DA8EFE91416C58BF0E8798BDD6B9542CB79ADA4A0C5EB984175F7A051FFFD4A7F1B39FFD440080E3E6EDB7DF1690397EFCB8586EFC3B175B820F772504BB95AB578926371799BD7BF7CA77870E1E446D4D3DBC3E2FAAAAABE1F70771FCF809343537499592A54C28F178F2C1C5EBC557C443A75721291A6B59CCB873A211F2BDEF7E07951515F2CE5E7F998CD59D3B77A2BD6301DEF7F0C3E8BDD223EF42C0ABA9AE166A21771967CF9DC3C73FF5717191F55EB92225B076EE7C0B8F3FF638FAAEF48AE1C20A295C18EFBEE71E59BC3EFFB93FC22F7FF90CEEBEFB1E014B566C79FAE91F8BC5BC62C572F87C6A71DFBBF73D2979F5DDEF7C4F52B37BAEF4E00F3FFB47F8F297BF8C279F7C12470E1D9636ABADAEC5B295CB6541D8B66D1BBEFE4F5F95CA2C9224D4D6818E8E4E343635CB22B9B0B3432C6CDE77D9D2A5686A6C426D7DA968EC75019A5B59D9324BD9FA34068607114BA751555507B7C38EA1C15E193CA95812A3A3315437D68A3F90CA55D48265F060706000AD2DCD82190A8C7420A788015D0C76565F6FE1217915C95F93899E4C25957FD7E6123F6AD616C5C1EE97E1F5D5E0C09E4BD8F9FC1E04EB6AF0993FF9439CEDBD8C8DCB97A3D2EE802FC76C3C17ECF4598A5F5B2F14161F9B01E2F1160AB38535CF650DD258CFB382B916D915F686F802189C13DEA95188D65534722652AFE419CD27EFEFD5890A63AFAD8F2233C4989DDA671F898CCAF6926A83E2C7640B66B2188D2524BA5F1908223A1AC64034869ACA32C48699EDD58EFEC141246825FBBC28F3FA604BA7102CF7A3BBEB94B210535924D3592CE8E810B740756510A964427613B10417621BE2B188E860D4D4D6C8826A5DEC0A2FA67E23401364B888281F7401A0B90875779FC1C2458B71FAF419048204511FCA826E4446A2C2A0F3960770EEDC192C5EB808A74E9E45755D0DAA6B2A90898D62687804D5750DE8EFEF939D0EB7F8DCC6B3DF083EBC2FAD7C022BFF4E2016EA64222E35FE18E81E1C1C1417127723ACF84170E642452A1F5D1EBD7DBDE2FA696F572E0E3346A603D072AE96FD4C25E338DDD585868666D89D2EA99EC2CCC5CAAA72D94D321847C0E33CA4755F535D87506844DC2EE72E9CC592654B05F4FAAFF4A2B9A505172E5E90EF3C2EE5CF1E1E61A157BFCCDB8B17CFA3ADAD5D3206A927E2F3F931303028EFC28ADDDCADB27D98D24DD78ACFA3C61477630D4D8D721FBA8A16B4B44A1626E3094D2DCDD276DC99F45EB9AC38F9628557C8BB30E188EE3A8E53EA7BB0BDD8CE4CA6A96F6C989378DD9CDC540F9849B338D4F1A2522E2BF9D0C0208E771F47D2060CF60F63D1D24E0C0FF54B265C269995F2ECDBB66F45CF952BB874F13252199BF800D3E904B66DDE22D790CCACBC5B43F9498B276D7180C61AD8D279E3968873C12A4FB1D47C2E8BEECB7D0885C3F8977FFC2A9CA339445349DCF9FE0770F743BF0537D2E8ACAD1316820A6C6832984E0428F6935A178D6BAD64D6009815B08B2D6AF1A74A650F3BB25A08487CB49261A902A0E24717D172155C5554C402F7D51A6C190FEC54B04E77B15C8B0A629A9265347A7359848647C45DE2743990411A9178047E4F506891E1A111F8CA2B914CA4E0F7D964E18B86A3E2A6B2331640FF77282C559FC9CA618D3CBAC1B8E68C84861089C6C42A927542760557B304C68096C582BE1640F35D255142A8674CB450DACFB96C124E1B8B57399064D6AA28EBAB7249B448496174695951327D39700CADCB58F26637626515E403893AA187D620DD0A523E4A2A99E8FC3799C99AC72EC92BD4592E4CB1E285BB780C5DCB8256E86E58329AE2270419AAE5E9D2564CF4D2F100E12BEBD80DCB1C8A41A5294C52424D620C6ABEC9122DA2FD7A97C58D27B30265B7AC7C7F26D149BD8A62C398A4151588557B60B6BB50F3E4BA85C0A8B03BF43BE43318A5C6A24E3612EAA2CA1CCCEB776BDD6D19E39A6552B2A0AF853A160BC00CE4643C81FEA101D96271307362D22F49FF6A2695118B837E50AEB03CA7BA46E92AB01C515565D59438B1E33D96092BB2E33559433311C4F92CF4B0840DB8141E45FF95017CFF9BDF41FFC53E61177CE60F3E8DCAA67A34D757A3BEA25CF9A10D614F2984AB3961E1654F069C2768BE71BE363B88C2FDCD64BCBA8134276AEA3719F70CB313A06F9116973FE047341617BF2A8B9C8A9F9FC916B063EBB66DD8B3E75DF1875314885847AD8473172E883FD8EFF52A7D912C652D999DC80C3397F885D988DC0E2B4DE06BBBB08A1FF27A34BB899A40806E8CD9634688E9DB996DCB899E67B2DF9BB965FA867389567CE9A35AA014249CC44898AC85C84015B7B72695D658261345EF27F108F943C60A1C997F91B9618A1A01E14402874E9C86D3E7C57E5D01BAB3B31D8970046B972F819DDB2BAF47C939EAB242F97C0D2D905F4C619BCA33CED763CD82C3400F591FF4C326922954949723343282744A5989A9744A5C187DBD7D2282C3BFB352B5CBE94468242C404E77006BC7114C08D0B4AAA8DB40638A5BD9B2B28040B361334EA64DAE07D086A668B54E2773CD9BE51833C74C42CCCDF2DCB3FD9CADADA5449509DB384F78D7142DB18A34E1DCFA3B95BD186CB192F7AD01B3096F34C903F2B69016F6A6E59910ABDA0E27998059A02F11C7CBEFBD07B83C188D46B06CE142AC6F69848F81974C5622DB3EBB1D1EAA70B99588AA176B59C200002000494441544A8653A9ADB7EAC7BAD8E6930D0A1E9131AA77AAAA05B7A44A254F38B6F9B62958A422242F63C35020951B4BA5B44FFE3391057DAB82335BA838107D2B8FC1C98F08905D33952134954B5FF7D839B9A91E0853F4418F4DB92D9E24C6C7462026F792F424EBE0B2B20D66A2F5F2B020FE0E155423B2523D575E4C8BBDD0279A1627B372C9523320C0804A9E089D433211477434029BC705BF2FA8448DF2E2372A38373B6E8E996889A95DA3386B6BBC00ACE92BF3CEF964078B2603EF6A1829C57DCBF38AB3D8A6023493C9241C8F6133B596987F47E7FDDD1603E8565E8CA6D20325809EA0B5AC169775525B831F66A232BA4D0BDAD0CAAC053EA7D229D73DD6B2BCA8B46F9D6822E5E76D486633387BFE026C991C7C2E8FD45C639092BE564FC02DBCD2A686FA3C5798E7A71309118D51E9E7AEBC0FD0F80767ECD9E7F84257072DD50359D921C5C060F591F2586B9072BCD729F6A9CE24404FE55A73DCD493BEFD7881DE499F7C1B1C58F2414FA293AD206D1D50D609C3BFD3C5410BDA7C8A417C12B7BAFE21DA22968398A9A8015A027E0C2A53690BC07FFD7FFE1B962F5A8CC87018DEB24A9D28E14277CF596CBFE30EDCB9658BF8468DAA1D4332A49D31EA9F2458279302E456E1F85B051C8A990A13A53BB3698B8FB1B685354BF146FDF6D7B3A08BAD7BB530CFD946F4868772F11C318B9FB53D67EC2637F1854A003DCDCEB36EFD0D6833838EFC519385772DFEF0346FA94ED37E5049E990D46F9ACE4A805CD1926C52E0522A1A8B1C80A2D1712A87C223A8282B137D5DA67393C3CA238C8297AAFAACB408C827E57B918A56AC716105879BDE029A92C36B0A948C6974F2443EE8695CB274CA4DDE0225809E66078EE79B253B805C595A9EE3595ED3BCD598D394F84B41CC3C341292E29F81B23249736EA96FC48573E7E1F17944E798890375A25B10462414128A6082B5EB48F8B73B108BC551DB508F603020AC0EA584A6E43F09D4CC9A32EF4AD6835534C7EA02B1BA066E2AD74809A067625896AE314B2D5002E86936EC7800CD6C20021B818C9FD9B02E959743952262E0EFECB9B33874FC181A17B420154FA0B3B50DA78E1E930C41568A70D99DE858D88923478FA2AEAA1ABD7D7D7079BDA8AF6F407FEF0052A93436DFB11565015F9E1266A41CCDB65A54C6D269C94023AD8C59571305766E85EDF73487C6B44F2B59D0D36EBA5BF6C41240CF50D7128C0962D44C200F76B6005A158D655202F5A50BEE0B919E908A16AA3E1EDD164AB14D05B64425359391CC37A6A51240D571927655908B66C50DCD85B6BA68CC82C44588C904C69AB68AF49B77B6BA4066A8796F8BCB9400FAB6E8E629BD6409A0A7D45C571F6C0D20F25BE6E253BD6DD62C4802AA56CE20406B61CD7C0AB9911CA59B4280D65A0DC60644A2AA24BC646BE553CE553ABB4864E44B5816825086FD20A0AE858F247B52CB92F25AC6AD635A68D6DEFF06FB6B3E9F5E02E8F9DC3B73F36C2580BEC1762FA6E1916A57CC85BEC15B149DAEC0548B78A8EF44D45CFFA9F0ABF89FA5CC914EAAC9D91C484B00308CAACA0A5551C5304344B7208FFD63EE399E7FD9FCCD148965050FBA3EA839AC123C8A8A6799E7D3572EE61F144A45E5F3CD67B6D96E82AB9500FA26E8A4DFF02396007A861BDC50EDC6E34FCFF0AD267DB9313441B2394642280F96E54154828E26496E8ACC2D452AC921958C21121D85D3E182D71380D3E156863E038E22FE220E10A4346E6BC551956A4E811DA5954F6D1F75AC9D9AD953CBC49B7483CCD3034B003D4F3B660E1FAB04D033DCF804682A9229C3562BD7CD315FD500B4E1F3D2EAA51605F526ACFCDAE96886280F8A29EB45E1A034E2B1246C70C0E5768A6605019A40CE2A3323992C2EF40E4BE180B6A66A29BCEAA67FDC4E7FBA5200536A6374B694007A868767E97237590B94007A863B8C3E68037C6233E66BCBCDF08DA670B9F1AC7972B6456ED3A974EDC663A54CFE16AA0289127C547E12EADDC61371245953D01780D3EBC5403C8BE7DF7807EB37AE432E67C7A1437BF1D0D64D68F0B9A418822885DA00D670A6C0A8FC4DC07AF24F72331F59B2A06FE6DE9B9D672F01F40CB76B71B2CA0C5F7E5A97B32E12E67713E4334560A76DED8BAE74415C9EE66F867F73A8EA8B84EBBED028467276ECDCBB17F7AC5D85D75F7D1D2E8F1FEB36AFC3C5C110362C5B8C2A560897E2ADCA8266F92829212562CED37AED9BEEA41240DF745D36EB0F5C02E8196E6266E0314DDA6413CEF0E5A775B9F1AC6332304899E3B31AC6C5B4981746685F287DF435EB5AD976554ED59EB3210507F6749F43657D2D9EFEFAD77062EF5E291EBB66FB76DCF1F08368696C407B3028AE0E8A3C29A399D7D3003DADB7BEF94E2A01F4CDD767B3FDC425809EE116264093CD605C07337CF9295F6E3C178B016CFAA14DE6E3F45D1CA68E84922A356C92942DC73A332AA1060EEC3C7556CA81FDC3DFFE0D52434352F1C35F5B830FFFD193527B6D6159995479518145FEDF5AB571CAAF7D539E5002E89BB2DB66F5A14B003DC3CDCBD4685AA2E406CF07FFF3F55E8F6E0E060CE98BBE118036C40B870168913FA5059C819DA5916C0E1CE91B40286B43F4EC09FCE85BDF46CAE6C0273EF3243CE565686B6E424B30080F83A9363A4C9870C37257AA74932A7BA54CEBF9DEA637329C4A007D23AD776B9E5B02E819EE5702343FB44CE7339898E413FACCC93A993E4093C1ACA279768B059D11F74656AC6A7AA2230EE09DE3A7E1CCD8A550261CD40109A1A1A61A0D15E5F0650027D270FB58C8B650A74DD5189C3F8C98191E2E632E5702E8D96CDD9BF3DA25809EE17EA3554A3A9BD1E398E1CBCFE8E508CAF443935E478B7F3A343BB16A55F959458AD385392570486E9D9423714AA1DD880DE8198AA06F98453FB368A872A221E8878F7CE764024C7661F517BBC30D5F59B958CD4CA62157DA2C28B351A166461BF5062E5602E81B68BC5BF4D41240CF70C7524B999A1CF443CFE78F951BCD92F046C77A5A81428168165BE5870439C5FF2EA49203F17406C28ED66E6A661BBA1C0E24924978DC4E7825638595AAED48A6D2181989C11F08C0E37628A0B66426CEE79DC98DF47909A06FA4F56ECD734B003DC3FD4A70A69B837EDDF9FE3140C76021B53424A964AA493512D0E37F8CFCBF726908574EFEAE3CD4274E9C444F6F1F9C1E17B2A92C464722707ABC48A692D8B67533AA2ACB15C06773C8E9B2F3F1585C0AB3129CE93232CC98293FE37CEF08FD7C2580BE493AEA37F89825809EE1C6A606B300B485BE26B7986755EF0D38936E47970C5D3356CADDA49B45A7702BD6055F936CE6029B239D49C2E9B08B46F595DE5E641C7604BC7E5CB9D8076FB00C417F104D8D8DA8A9AF103C27B52E6DCB81C503E8DEE0731AA9535E9F4A8104EC5B11A44B003DE95177DB1C5802E8A974B555DCDD923C61FD73329311B00BFAFC4A5FD97C69C488A672BF593CD6EA2620405326957E68D203AD99877C84EB82613EDB4FB12E5426216491E275699567695D4BB517269DD8904EA5E55E69967EC9D13542DD0D31B945BB2393C9C1E3750B485B1368D8AED4A436D44029726B49A737CF5DCCF8B8BE4BC4D4332F6A6C595055CD47F529127F9A85BE2901F42C34EA4D7EC912404FA5032701D04C714EC4130888A8BDAEAAAD05DA04EC4CE6F23C4863B60217F9DB0C6C5AEB104EA66972192D86A45F8EA04C3FFCC1830705A409C495D54A7E95F770D89CF27D474787042859099D1F1EC7E359328C7FDBB871832E0CA09E82CF6A0284046AFE10A0B9009867B61674B51E7FFD45462F0C5A30CA9AB5486D10531E8121D0D986E912404F66C4DD5EC794007A26FB9BA4854C0A89780C5EBA3838A96DF4C92A43DAAAE85950C89FC90798DAB5AC004D3EF478C506260AC81980A6B4A9CDC1C20039E1565FB97225CF05F7FA7D02D02CBB655205E9AA20C0864221B1B41954E5F7F4DD13A819B474BB0B3A21069CADCF43D707419E7FE37956D7C778155FC66F1D0B40171DA0722255FD1AF399CDACF312404F6DFCDE0E4797007AA25E2EB274C7357CF3967516D96C1AC958141E5AD0B2A5D75A125A4FD3EAF1986D8B6CC257D362FE86036D849EA69AA67E3D0EB5F9AED88A35B439E3A230006C9EB9D85D617D97E2CADCF4A313E8CD0EC05A3791D7BD5EE56E063195753C8E725E7167E5B73F13B5ECF4BE2F01F4F4DAED563EAB04D013F5AE0591D5AF053F47DE9AB2B83ED2C8201A8BC1EFF5499AB35D978FD21B75E566D59C07A5FD3677A29AC5C04AD783958132195E74F1358AFDD7E67BABFBA1B8C98B7DDC56501FAF7BAC3E662BA01BBF37CFA7DB43AAC6E8CFB5FCE88AC32DCB47C1BB91EF4F4BC74A9184F10B1A4C348426FB7D09A027DB52B7CF7125809EA8AFC705E8F1405A995729E4309A88C3E7F6C061B70B2B586D904D42B43A379F1E6D580F133DC72C7C6F054203ACA6649760D124D2ABAD2E072B388F17A81B2F8837DE7DAE17A4B45ADEC6FAB6360DAD651EC360227FA7EBA3B81C97F5F8AB764479B68D4563644CDBCF5EB0B004D0B330C86FF24B96007A8A1D68B2E6789A04A2A4DC9465D2E67222864FBFAB436B2D4BC2861CA73DD1628CCDF27E798AEF650E3756287DC213F99FA7798B593FCD3C377DD4EC0B5AEF7C1FFEDF6AC9E7AD6A6BF0577CCE5971955B774CAAB7E88D2E2CB933FD2225809EE916BDF9AF5702E829F7A1AA966D009A55B47359BA9AB566443687682402B7CFA3009A3430D6E8337503CDFDE6273E0BE7D854ED9E8C8B63CACD37CB2714FBBC6945D3476D44AC4823B4BA3ED83FB25ECADAC98E540FC8725BAA9F0D52AB4C49F6F76C51EE4A003DCB83E326BC7C09A0A7DC69868FA10CE29C8DAAC7850FFF363A1A85973C5E97531C180EEA49181030C6B3A98D3AE5FBCFEE09C63DC0809B0916DECC96747E3D24FF5A2711193A9FDBEAA336002D9DCA4D9143E2BB795F14B368F81DB31C6789CA5102E8D91DDB37E3D54B003D41AF8DF151CA3F74296CAAB4D9548233FF4C904E01188E27D133144620E0811740655940643419AE72C8CCCF68494D05EB36A9CE377B7ECDE90C4A23A06414F9E439AF91026EF50E5C13B72675D0749E74E273C66370F06FA4F491B35E565E26B10229D42506B32AD9C5BE550571351EEB55587F3DF18DA7714409A0A7D168B7F82925809E0E406B6835004D90E64FCFC030BA2EF58A9CA6CDE1442A1E466D552516B734C26BB7C325842E65818B9F53409B5CDF5932C9A63978E9122080B1B6E244D6F3A4B07752074DF361AF715A71F0D27A98718310A8A3B1A8542527487B3D3ED8EC0EA419ECB501896C0E83A151E99DAA8A3278EC904577B696D31240CFEC18B815AE5602E849F4623EB06FBC1BC64F490D376E9DA10A9DBEF8EA9B58BB7C09FEF95FBE89BEFE213CF0E0FD685AD08CC59DED68282B1B135E329762C8693E7D8CC549853B02343FD7F3454F0A7B2775D0CCB5C2F51695620A1F2DE44C3A85442226198E4E8F1F769F1FFD8924DED97F0CAD0B5A64493D77E132B6AD5D8A16AF47F63CB3F12901F46CB4EACD7DCD12404FA2FF8C8F592CA7BCC3593996397913B0A1BB7F08499B1D075F7F01BFFAD92FE074FAE1F6FAF0E93FFD335435D661456550009A60EED417319C80493CC26FF410436523E58E62FEFCDC8AE2447C2F05E6EC45A51712198921E1F4E357474E63695B1DCE1E7A57AAE02E5AB319DD1707F1E8A64570CB79DCF764158BBDD8FD9367804C6D6F5402E8DFE830BF296E5602E889BA490281AA6A88C32032E733C199FE64FA9E6D0E9C190C61289E40CFA177F1A36F7F172E7719BCC1203EF1277F8CDAC63A2CAD2C136706CF7011A0C5AA9CBD80D344AF75ADEFAD892704686A631851A2E95E733E9F9767A5E748AD53443A56217FBBEB22BA8FEEC3AE177F2D0C9C3B1F7C1F16AD5E8FF56D8D68AC2A17C287685B67B54A8715A44B003D9FBBFCA67AB612404FD45D1AA055C5106D328B4999138026ED2A95B149B5909FBDF81A1EBE730B7EFCF42F70EAD4593CF1074F2096CBA2A5A906AD01BF00B4C2760274A1FAC83C73414B8207AD426A6A70DB7F33685B4FD48DD75C90C48C368B300BDC02A7CE5D44042E3CF3F40F71E6C841E9F98E356BF1D8473F8A402A8E651D6D63005A78EE9682027966DE14A30B250B7ABABD78EB9E5702E889FA561CD08AFB2C006DFD64538AE76C73220AC8CFD32FBE8375EB57A3CC039C3F3F840A6F166B172E40402E439EAD11E7516C81F9F6B1EA5C18195293E431DF9E75269EC7107378AD34C3833607A2391B7EFAC67E789221BCFEE39F206B4BE3C18F7E14596F2D1EDDB61A7E870A148A58613E09493FCD0D746909A067A2476FAD6B94007AD2FD5910D511039A90CD124D02DD0EF13F4BDDBD641A272FF48AAA5D536D2DAA7C4E547A9C70093F4B93F2728AB921D87F03137AD28F3E8503AD2E0EC3896662C7F5D2A5A770F97976A8E23C4B48C06E439A01432A12DA8077BB2E49828B239744DA9645C6EE83D7E1C4868E46786C86D7AE3344B5152E2F7703FD5902E879363CE6C1E394007AD29DA0B41914518EB6744E2CE2443402A7D383ACC30D386C18BC7C11D54D8DC2EEE077B97416E5C14021C59841252280F9CC16676BD2EF35F64063110A38391C79E1FDF95E63717AAF9B55456DB5EA2001DAEC6F12D92C2E8422E8EA1B40DA6147675D2DDA825EF8EC7671555DB5FF1943989FDED394007A7AED762B9F550268DDBBC5023D6214C9F65523A82498D0BAB24B028383209DCBE1E8A1FD0804CA70E0E8710C0C0E03E918BC5555188AC551E3F320319A462E63436363191219E0FE071F40D0E316BB9B0129A9BAA2EF657D86626ADB447CE4D918A4C6DDD1DFDF2F6C8E6269D09B9FD9C1588062A3A7533964722995B4428952BB5D76430E9703996C066E9B1D4E5958D542ED70D891CD64A4028D18CE33B0152A01F46C8CE29BFB9A2580B600B4E9CAB12A6F045143C5CA491203B3CD582FCF9ECB22343488442A85482481742687642282ACCB0587D78B0A9F13BD97FA61B3B91008DA90B5BBB0A07D217C76FAA21990A2F48ED282306048CBB558D06732AA72B3310CCDA2C0CC427E98FE6D05A3B9583466F63D09B6196433361C3C7814239161783D1E24936994955762A06F00EBD6ACC6C123FBE1F5FAE1B0BB108B45A57F183CADA9A9C2D2254B44DB6326744B4A003DB3BD7B2B5CAD04D0E3F42281872A68CCA66B6C6A96ED6C321EE35486D3EB13800EF50FA2B6A61A9954020EB70BB99C1D67CE9C457D4D35E07221924CA1B6C28FD1D1B854AF8E448690CED9110C94C14F710E5A5D0E97A4178B2A9E5D552329063D8233C19B9F9900818906ED78A0CBFB0F0F0F4BE20A9F6726ACC5899EE337F37D16E96C4ACA70ED7A6737B28E1C1C4E3772193B62D151786C2EAC59B91A5D67BB91CA6570BAFB0C92F128962D592AAE9FCE85EDA8AAACBABA40F0341FBE04D0D36CB85BF8B412405B2C68034E2CFD646AEA657376F83D2EB43636E0F4F93392FEEBF397C3E370A1A6AA02E7CE9E41341583D3E14664348A7BEFBD1B23A1118C44A2B878FE22CACBAB104BA6104DC450555189442C86546C14B5755588C66358B7661D76EFDE23E04B4B95BC633E074B3EAD5AB5529771D24AA5BFC1A0A2D5DD62CA55B1FEDF1825B85B60629894FB4C96E9DE36449369715BA42351785D5EA11A3A6C0E649D392499CB92CDC0EF758D0D9A1A2687B53DA6E1932E01F42D30A066F8154A005DE4E22030D162649286DD413E95134EE4E07739D1171A009C1E9ABEA04E9DD36EC795DECBA8ACAB123F66369313AB3AC98AD699AC54AF26B8C59369610890C9918AC7E1F6B8E91F91EB5704CBC452A7C4A7CBA500301E67856D2F2A2ACAB5756D53996B37C01098CAB829D6B1E03B50098E0B171790E2925353B9F67C3B568BD7A9B6CDA470E8D009D89C6E74779F40477B3B7A2EF5A2A23C80F2CA4AA4B34082C5187C5E2C5EBC080E27DD5F6AE72372B225809E6FDD7BD33F4F09A08BBA708C5603DD0B742D307143A76767ED0E49F0A50F9AEE896C2E839CC386483406AFC72BA0ABE4451904A4C75A4DDC0C7248C69270D9E89F760BE14E94D278ACD6F2379AFED6FF67A9256DA79B4351BA7E13205DB09E0B8B026B2D46225111BE77389CD75830741EBC296070D582925735993F13475BBA2C7ACBC4A3C84804FDFDC328AF2BC7C8E808827E1F92B151385C6EA45336B83C1E64D259D4D5D5283956FD8E2C5D5602E8F9D3ADB7CA9394007A829E2C408AA49B15F4DBB5EF98C4BB6C2E87583C86803FA04094D79413AD4AD14A00BAAFAF0F35B5B5CA8F6B8E9D57A389CC06C55C3165F814F92C8B4874146E97072E3BAB746BFAB0A4BC2BAD649B2DAD45B259A84083974E7B56893EE48D5391E437B415986ABB16893AA9BE37B256BCD8EC72224B2E8EA976D8AD7F7C09A06FA08F8DA5C9883E5D14DCFE5FEFC3E3E9D3A4ABA0BCBC5C0E9D6F013705A4053109EA9088FD9F03E8A70D87A3A8AEA840369785CD9E838D991DDC55D8B8ABE07159D88487E82E54275170AF417C7641EE06BA73CE4F2D01F49C77C1BC7B801240DF4097185F2C7DC8F41D338836990FFDDB1315339DCC7566E3987C6C6BCC2F6AF7C03250DCFED75697C366CF22934DC341956B9B036956D2D68C13BB3DA74B4631A14771879539AE2DE7796A40CF467B4EE59A25809E4A6BDD1EC796007A9AFD6CF555533BB9AAAAEABA1434636D13D445285E3336E69B05ADCB2D5ABC10668BCF6018039F718C8E2624804981A074D626AA6ECCAA64520FDD3D4A9F44E5E411A045313B67716D94007ADC515702E8694EC65BF8B412404FB3738DF54CA0E5EF8180F23F4FE4E2E0314C46E17953B1BAA7F998533F4D6B5118DF3B839DF46F30304A39215AD197C254B8F34B709330ECCB66E191231CF2BDF2DD98D2BA5ABD4FDC26CAEF5EFA8CDF0225802E8D8CE2162801F434C784B1A0E9AEA0F52C9834098036B7236D8D205D515131CD2798ADD314181B4D0A072D6206426D368CC67B319208E1DC6800478F9F83DBE1823FE0C5C39B57239849C12602C95AA5420AAF2A0057556398B5A7407CDE060967AB492779DD12404FB2A16EA3C34A003DCDCE36597F23232302B246A7E29AC555753283D5D5C1602113546849179F3711D84FF3B1FFFFF6AEAC398EEB3A7FD33D1B96198000487011297011C5454B28D9946C2596652B6549919D384EB9E24A2AE507975FF2903757C50FCEB32B3F2029BFA4EC2CAE9415DB522A2E57D90E1D45916849259292B883A448821B4080008101304B77A7BE7BFB0E9A43806800B3F4A04FAB280033B7FB9EFECE9DAFCF9C7B96079FA6FCCEBA7810CB4E68AFB1F61F97130E4E9C7F0397478F6143F717F0D0A603AA1605D269DCB8318AC38FED43C6D6354A74F08A1FF15235987524882ED92A1B858B294208BA21ABBAAD2F2A04BD06F5D102662CACD91C0C43AAC124109342CD880E15531B38C25C6B0DA22F79AA8EE208C4D825748954D2EBD9B10F7179E202B2B35BF0A31FFC18A55219CF3CF71C9E7EEE796CDDB6111BBBBB90F12A2AB1878DBD8CA5ACC3F5745D4F4DD0E2E610826EC4EA5D7FD714825E834E19BDC10242B482550534D75DB25E466D9D65E31261781EDD1D4C0059CE0A5F83A8A14E5D080366BC327DC624D38A8AE7F6BC044E5CBB854C5F0FFEE39FFE05E78E1D43D24A209BCDE0EBDFFE1B6CDAB90DDBBAB2E88483A44AD04901AE6F29FB8D6884961FAC06B1A0432DD3580D12825EA5BAB9D1471785215643B8612F67089B3F49F4DC640C43F461AFBFFA71B495FD2D4245D0BA0B8C0B1B97278BB83659C4F8A55378ED9F7F849495C0D0DE3D78F14FFE14835B366273AE0B698F232BB012C985D03A61E650EA10820E0553AC060941AF52DDA65F9F21E80759CF668AA0156D5E23D1D382E6F548D2E6688D8B43BB21E8E470FD08668B49277C95858400FCDF893340CA4269BA8099A949EC7EFC494C8FDFC6A30F6DC240BE473936D4366095947D67F62A718ED36942D071D276B87B15820E87D37DA30A05765249AAAA66A604E783EA232F46E086B04D71A6818181FBCA8DAE52BC559EA60BD8B3294145D5AA066CDDB81CAE0D94E161D671706A7C12274F5F82532C61DBB687F0CCEECDE84B02535333C877E7914EA5AA6E666E369A2DC10856E258254E8D394D08BA31B8B6F35585A097D15E2DE91A526597918D1B37D6A5B29B890861C20BCB8CB6D68AD6511B7EC2B70EEA60E127063DB3671F8B3EF9A9E0D38522F2DD19A4548719864BBB989ABAABFCF2A95452557A73136C4BA0CD6926B2E83C1656E7D3B5AF9B51E3BA5D3EA042D0EDA2A9E6C92904BD0AACB9B1C7FA1BA676F35A36F7826E0FFAA26991332A24485C8BB946562176F853FC56D79E5F418FAC5A761C5CBA7409A363A3E8DDD087D9B979CC146690EBEC84C3D2AA95320E1F3EAC8899D12D74DB64B359A4553303D35C9517B6EE0B297CD0378FF042B7FF4821E8F6D761BDEF40083A24A2411261720AC999A171C17654DA4A5CDD8E984901A7EB84D76EA56559BD57538AD3F354079123478EA822AAF3C5B2AA913AB87933CE9D3A8D6DDBB6A96251AFBCF20A9249EDD0A06F9D0F1C62A41F644C05E73B0B31D04D7FF084D475AB860941B70AF9E8CE2B041D4237412221F1303985D9838BB93F5643D00BF5973D657D1A2BBA5ED70F718BD5219A933DD57040974ED52DAED83895244CAB982DBFE8B5989D2F229B4C2952360D0554E2A1DF63918D5519E962AAF79987CEFA6A9BB512741F3C5608BA7E58AE972B094187D4A4214B5A923C4854F5F86A1E24E7A0E5C9ECC4DAE6B121455DD3304759BA09CC4C4F63F4D6A8DA0865A623AD60126DB15452644CD7F486BE0D9818BD8D64D2561D60D86D84E75A960DC7A9A807CDC040BFC2890F1EDE8FA959C26F0C613657D774336D76B210749B29AC09E20A41AF10645ACFDC04237105ADE5B59275B0AB371F022605DC34935D8B9F7B25B7A802ED5C17C3178671E9C245B56939323282679F7D16D7AE5FC3E8D818F2B95E942B15ECDAB513273FFA58954E257953C6DEDE0D989D2D28421E1A1AC2BE7D8FFA1D615C65819BFA23C46FAD98ADE4BEDA61AC10743B68A9B9320A4187C0DB100937BE4832267B30C4A9AB1EC2880E6345378B9CB57363E1A8F5A607DF33A3CE9F1B56FDF9745B2E761E27C1EB9F8B1DC645440C4D03DAA01FBF99F7BA6AE534E84421E80601DBC69715825E4679411704C985D66D98D2A26B5D132605DC3C0C9A656D3E88A06B099C7FDF1E63B8E1BDF1DBCB35B835F5B0F9D37C1B09E265489AAFADC6A7BF56EC5B75BE1074AB908FEEBC42D02175438234AE0786C1359A386A53C01B3D9F81613982AE1D37363AAAE2C16BADE0A5600D3E68983D4997870EC74B575D1E718D8F16820EF9618CD13021E810CA36A4C2E4149348D268C2E49CB4A24962C178EB10E23675C89D3BDA15C32494B0EE09DE5B30B392E1787C8D81BB162900001A4049444154BE6C1E41BF7BA3716E2A58CB4C26041D256D44431621E8902E0E12E5CCCC0C7A7B7B1B6E3D2B57821FAF363535A50A329994F2482C9B8099CD64954C86A1763AE5DDC8BE40ACF77AB24D0661ED06ABA96DC2CD4315CA1733F706EF57083A12AB3B524208418750074985C92941726EB4656708DAD48CEEEBEB8B0E690508BA582AC2F39C6AD8E1BDC41A68141BC03918571E246CFECE68106669126B7DC326E93C5C0250B5DE47B5E9ED92CE167F4B343ACD0384A0437C18633644083A84C26B49B2591B76C61A25617183921B6AB59665ABB3F118D912DC385D0B36C158735EB3B3AB03764AF56841C2D3ED6735267E2D269641F51C15776DBA863B7E7126DDD5C5EF0DC0D2D6E6CFEA2FAC2A42F28F4E871721E8101FC6980D11820EA17013E35B1B1616E2D4350D0986F791B0160BEF6BB425BFDC0DD48BA0CD83C63C94F850E43DB31A5E67A60349CB062B9F7A16EB53EB46B696B2AEB5CDECB239804532D76F576B5A93867DD7CBBD36B85FA62F421D5E84A0975B6DF17B5F087A199D932848D0246753507F2D5662D825169C83BFB34607FDD0C1F2A6E65ACD906729B949D0C4871B7C613709578241B154C1FCCC3C726C6890B6E0582E1C38AA821E6BEB59245FC743C54AC24BD848A9668A34B17557716D25F3BFE8B83296BA7F21E8B02B233EE384A043103443C1B851D78AD4EBA04539393909FAA2A354AED324EF045B76D5BA61C27C9C82BEE885FB634D265AC71EEE4C4EA033DB815436A34A9E6694554CFAF52D68DFCD61AB9EB7B49A3D382A21DDD38D6C49D0EC101374778411AC896384A09B08769B4C2504BD8CA21A69213E68EA60828C2169F595DF4FEEA86D32DBAAF5669277D6DA53B1F67E15492B9F06E0D97464B8281766E114CBE84877C29A9CC24CAE1B1FDD1E8753B1D0DDDD851D9B7BD063695BD94DF00C36A97591ACF657A475AD9D22EA21D22AD0969857083A620A89803842D0CB28C1902209886444626C864BA136D2C158A5B4A2E94E08D6B268863C4BC164B202CD378CD5CAB2E879BA3088F24393582DCF815BACE0CCAF8EA0F0FE47B832B811BBFEFCAB48A73398B85BC4D8CD51BCFCF45ED53C8087A5AC67DDC04B9739D5512542D011601E1121140242D03E4CB504114C4E09B6A2325FC55B55AF99F1C2B5F5405AB951687CF48C5D262675F743935B13AC7CC74DBD0AFB6E61E49D6378EB07FF86A12F7D0EBF99B88AD3A72FE095575FC5F6471E452A9DC6C19DDB91F4808C4FD2FEAEE1424847A0E64894AC68B1A0437156AC06094107D45D1BB2468B99C929CC9433C76A2DC47AAD2ACE4F994CC81D2DE9561FDCC0E4266AB081417D64F254E406095A15FCE77F151709D7C66FDF38824287837FFFD98F91B26C58C92CFEF6EFBE87A367CFE3A5E77F1F6CBF9BF1DB75293F89652C671DACA77DD7B4A7A343D142D0F55935EBE92A42D035041DCC8633A5455927224A046D6A58F0C1611E18ADB4A2F9C0A0056DFCE2F594457B925D381E89D456D11BE504F0AFBFFD0076E90E7EFDDA6B48C38395CEE23BDFFB2EDE3B731E2F3FFF1C3A01A41CBFBBB89F2F73AF6B43C778043BBCB4FA832D04DD6A0D446F7E21E8808BA3563D2CF969A226A2A23A43C84C01A7151D2C32D42A190D411B6BBE6EDF32940F5A7B265C8B492934842D14011CB97C133DD92CDEFFCFD771E3E2653CF3D21F22BFE361F4D8C081ED5BC1472ADD1C2AAB4539A46B7DCF42D0AD5A2F326F780484A06BB0326E0E5AA9FCC7D2A2513B8C1F9CE9E76CBDD52A7F387131E9D92646BBDE998D2E5D1ACAB74DA704D9DAA6271AA3E5124E5F1A41A2C2C24B36BC149D15653CB76F0FD2AA73B8870493597C4786DA1C24D157B70B75B28B6ADF1591432CE88828224262C490A01D95286C2A3C2CE8827E4EDD7D9A9FDB994201D94C56258698C35460AB9B85B88A85A0E6A6FC1E502A1751AE94D1D1D5093B9888E117A4A8D6A558C53C614FA13CDCB4646E08FDD024418561E0026BF1F2BABC515ACE34A399BFCD8C410FA8242B982C7B98982B29C24E5B16367565D1AD1257D831C090B4329F75F44640109277D5C5B11601C30215629C1074089062362486043DEFB99ECE3A5309673A820B0C0FD0A462A970BAB95211D94C17526C0DA238628172AA7EEA45164BA33FEB7E029D929B8D5DA79D0252D9343ABC8CDEEE523B601E5C2678D0DE24AF3570512B1F71C5C5EC0CBB91F7E8441076555173EAFF2B7AE48B46BE15C85345DD4FDF666CF4ECDCBCAAD151745C541C0756D2865B7190B26D589E07DBB254424B523D6CFD4C421F8460BCB5DA206C24382BB84F0E15825E216031181E3F82764A9E972041EBBD7C9D154CEBCAC31C803BA5044AAE834ECB435FCA46CAB706FD720EF72D89A0A5B80AFE59E11273E0B03810237C5D5B65D9158A05D5713BD799F71F24FE25FD74676579369085B48BD7C3E4C4846A22ABFE4C300259BFAEC43024A84CFA9531A28AE2F04FE35CACC97DFEFCB0B2DAF9CF7CAB617C38372A1DD7433A93C60B9F7F1EDD5D9D7ED956F59D434B44B787C52EE47E14C70AE559A1C256345C087A4570C562700C095A9954CA22AE241CD82E29CCC254A582B74F7C023BD78B59670E994A199F3D38847C92E6203FD40BC4122C36DFDC55C2788692AEDC9648AB9F9EE3E2CED42472FD7DCA5E65B43013356CD6AB509974FCAB717E568FB58B2C6074EC16FAD95945398F74D1A2FBFD1CC6031C1E35B3CFA7FDEE50DDC2C7C66EABCD517ED3E1CFF1F171B0E8FFF6EDDBAB354B060737AAA812EA8AE7A5923AC1887F47250BB3160521E8F0EB222E23E347D06ED9D33519ACEAA6D1BCE7E167EF7D8CBD9B3701E3D3B0520914B2294C958117F7EF40B65A70472F8B051FB4F16306974BE3C850CDEDB8EAE162D92CB1E9A09CB031512CE1BDE14F7073741CE9640AFBF6EFC2EEDE1C3624696B9B0CBAC62D69D22EBB7DB3F5959A8D66AFB14C83D6B311610546343339B9594BAB9751222457A6DF1B1D9070E9FBE6181E2A3BDCF3E0382E52295BFD549BA89EEE7F58CF4EECF5465408BADE88B6FFF56247D0AE57F1122A77D8521667C90246A6A770EA93EB18F9E863BCFD8B5F2291B4F1F9AF7D155D5BB6E0C583FBD1D7A1E3A095CFD22F466CD21DEE351339AAC1046DC2CEE0AA99EE3816FEF7E333D890EFC0F8C83564D25964FB7B91B5D27862E73674FAB5291AB354751C1C6DE6F1094694F4FBFE66E35509FA277C095640CE3CE3F8F1E3CAADC1547292F1D0D010AE5DBBA67A199A10C303070EE0F2E5CBEAFD99C29C7275D0E5C15661C5E2BCB2E653A9243EF399CFDCE3DED0AE93150AD41820D55585A01B086E9B5E3A7604ED798EB6A05D4DADF33670FCF20564D33DF8C90F7F885B978651725C3CF2F4A7F0C24B2FE1E1AE0E3CB471A06A102E94AF34DFE16BBDD08D25680ACD4240CA8AF62C1CBD740D76BE0BFFF3D39FE3D4BBBF83E759F883975FC29E834F62E7F64DD8D29DC5421C4ABD57A99FE1974860FA6E011D1DDDB06C0B3458B57BE3DE5863E59959A108CC5234444A2B59F9991D47FD23B9F21F236D6855F3A828CB39892B5746B075EB163F0E5A47E7B086496D8D1321E8152A4486371581F811B44317874D96536CE1D8C0E8DC1C8E9E1DC19DEB17F1D61BAFAB68802F7CEDCF90E8DE882F1DDA87EE944E90B827BCCE2440282B2C48D2F78E0BB31915BC6EEDEF55AF80BFA9692C56156DE2026F0E5F44DF96417CFF3BDF45D6E1A69987C16D5BF1EA37BE892DDB366247AE53D5A45074A9FCB87A93CCFC1DB61BF762ABD2E4913072A2529855E9D8E9EE2E78094BF9C22D86C7298B9F51257456536A53CAA8A9EBBC2D26130BBA2DD4D454216347D0954A850E5C05B2CD0D242B81622281374F5D40AAA313B3B76FA22399423ADF07B752C1338FEE408A9B4B9E0B5B75F530A163A6978776B71A2226411A023485831EF455BAD6A20BA66ED7BEA7B600FD5E4E092F05D74DE0DDEB37E0E57378EFF537F0FE7F1F612D21FCF15F7C039BB7EFC2EEED8318ECEC408AF6B61FE35DBBBA6AE75BA945A9D0703D788EA3DC0E9DB96E1D2143EB9658F077D74182CF4446A024583BA4C1DF329AFA11AADF6442D0F5C372BD5C2976045D743D8F2E02C619247DE2752C1B775D17C33727706D6C1C5EB18C3DDBB762E7602FBA98C5E617EA0916D8B9A76A9BB2A6FD98DB6032842A36CF4A6CFAABF8830EBDB1C5FE7ABA225CF058207A96DE2C29D746C24DC3F312B8E539F8AFA3EFE185279FC4F4AD51D8691BE57C0FEE8EDDC2A71FD98DB40B24594FD9B7F88316B491CDCCB5AA080707A824B42F7F62721A03BD39F50C49D38BE4D2B5A0BF61A8C817858358D04BAD0321E8F542ABF5BB8FD811B4532E79A53289308D644A87A9D16FCA2E1DC58AA3FADAD95602F3C522D2990C922467CF53197B3A1A2001DB4EAAAFF30CBD23499284186D40FF68B95442369B51244BBFE872D5E64C8D69E372A8256665A092DC2CCBFF99D08CE827CC955300BDB4BF7CFB0394ED349C7209DB37E4F0E9038FA033E122AD73F096B5A06B5D1EA1961823265C4DCEA373B3B83D5F462E6D63534727BA123A7E84563FBD49B4AA19CE28F4BC34B242D0A1565DAC06C58EA0DF79EB4DAFEC59982FBBD8D0DD85345B28792E1EEADB80B3C39750283BE8EAC860B23087439F7A1297872FAA780FC6DAB22EF4DCDC3C2C2B895CAE1BB3B373EAB57C3E8777DF7D1F5BB76E4661661ACF3FFFB9257DBD8BB9188C551BB46883196F869C9565ED5BEB8C70D639282E2A4880B10A455D551359A63E7313112E6C4FC7FFF261622C5A3FDD5089A25FD316BBB6F4C3AF7FBA37E65DE0D2AD314C4C4F31425B65EF95E74A38F4E81EE4D84351E703F9BB830B73859F253E2385A0E3A3EBB0771A3B823E76FC032FDD95C3F0C54FB03197836301C96C12071EDA815FFDFA0886F63D8EE93B13C8E63AB067EF2338FDE10994E68B2ACC8B110503031B71777A468578CDCFCD2397EFC19E3DBB70ECF80995A4D1D991C5534F1DBACF0FBD948B23E802A10FF7CC9933B87AF52ABEF8C52FE2ECD9B38A34E7E78BE8EFEF53997367CE9CC281271EC77CC9414F771ED9245D301EAE5C1D455F6F2F7A7ABAF1D63BEFE0D52FBF823367CEA2B7B717232323989E99C1407FBF8A6450E9D18904F2F9BCFA66307C7E18F99E3C7AF23D3870605FD8B5A3FCDD57666671E5CA75607E16AFFDF4A718DABD0B2FFFD1CB3871F23CBEF2C267D1415F3F5DE7DC3134E53D57F010082DCC3A182804BD0E9458E75B881D41BB9E3AE0F9BE61137FA1929395C354D7DE60FA343710932A7A630175638D9A6408DDE95B338EAB7A946A3FB2B1481F14D6A532DB54676A3D7EA630AB48F9DCB97378F699CFAA9F2CE5D9D7D78F2B97AFE0C9DF7B0263A3373172ED1A868676E2EEDD02FAFA362093C9E2C30F3F52963C93360A85691C3A7408BF7BF71DCCCE16B17DC70EDD5ED571914C25512C95D099CDA23B9753216AE7CF9D4757771776EFDA8D271E3FA8657F805B44B94318430EE0DC5411E3D7AFE3C7FFF07DCC95CA989DAFE0AFBEF5D7E87BF800B6E69318CAA702F54E74FCB91C8B2320042D2BA31681D811F4F9F3E715DDD267FCF0C30FAB9FB48C754AB0A732D5F81A7DC76AD38C111D696EC84195F6BC79F326CAE5922236BA0776ECD881EBD7AFA9F7151907089AE7F3DCAD5BB7AAEBD586B4A90705133DFCD03766C1954A25B559D891ED52F3738E4A85B66A02994C0A6EB9A21F1EA43A5BC56720954EE1D2A54FB065EB566432695520890366E70AB06D1D23CCAA70D94C465DB352D131C4B69D50F75729B350947E0A7564B2DACD714F18E1FD26AF8A21077072BC88C2CDEBF8C93FFE3DE6E6CB28961DBCFAF5BFC4C3879EC54036815D799DFDC7F99547463609976421216821E8D813F49B6FBEE99168E92E2041D34265F17B5A9EFC9D044942E9EFEFC7F0F030BA733DEA3DFEA3BBE0C2850BAA4634098EE43B3838A8B2DD98B5A6D28ED34945DE263D99AF1D3C78F0BEBAD224653E08CE5F3887E9BBD3CA821D18D88472A98C8A538153F1303D338DFDFBF6A154AA2837453269034E45B9288676EEC2E8E82892A9140A73F3B83B7D57F9C39939373D39A52C6B1AE6A964466F5E96CB608718DE1BFFBE78F1220E1F3E8C1B376E546B3A531E62532997D0D1915561737BF7EE55F7597B180BFAF2DD026E5D1BC5AD8BC3F8F9EBBFC0F6A11DF8D6B7BF89B73F3C872F7FFE307A1823CE8D54B5A1BAE25A49B1FAC40A41C74ADDA16E36761634FD1BB5E165C10D39A246174530E42D18A2466227599BD03933AE36CE98EF93144D14C762D63309F1F4E9D3EAA1C07FECDE423224F16ACBB78CDDBBF78085F9F91061E4085D138C2EE9E9EDC1E4E45DCCCDCFAB9E89F45B9378395FFFC0065CBA78117D1BFA50762A4A5EDE130997D634E7215993D0F910E2C3850F15BEDFB7A11F85991935376B5790A0E9ABAEF5A19B2495390F78E7CC0574F6E5D1D5D1A922368E1DFB085F79E619F464B851E920E9A54CE5D185E6DAA19667BC060941C74BDF61EE367604EDD267507304134A167B2FB891574BEE663CAFB1D47BC16B9A718B95BC34E76BB237D97E2ECAE58A224FFA9855E2875F1744A7CC040BE4EB8A6FCA276E0AD2FB19901C4792D70D704D63023D4FD54FAE2F56756F185C82B1D3E65E0C8844932DA83EBA7C1D33F3F39C1C7B87B661A38AE0609B2A172955299F5BA89EEA8EB2F284EF304BB9FDC70841B7BF0EEB7D07B125E820F9D426922C966E1DB48017CBBE3324574BD8C176548B5D3738BE4A7E815AC5C1EBEA303B5D3E53156B0A9440D5A52F34F1EAF86B86D731494687D95589DC1F137C9804936E4C213A52EA83926C4CE49CC79CEE40C53A971983AA0EB47E58249978A38BBBFA0DAB1A5BFEB4DE1F90665E4F08BA9968B7C75CB1236815C2D1D687B19B79134B45442C3F466D50FA641D7CF8D0825616B3FF73B187067DF5EF1CFD1D0E1FFE347EF59B5FA3B77740C5896F1BECE356264E9E3E879D3B3721DDD1053BD38DB9BBE378F1C51755676E5BD5BE5B386AE3BD837F2F977DD9D66A5C447821E8F5A6D1B5DF8F10F4DA316CF21582CF97A5028A971F1374A704DD2DAE9780C586ABBECB267873E69B067DE2C78E1DC7634F3C8EABD72FC36635B97205C5E919F40F6C819DEAC0F5AB17D0D9D589642A8B5271164F3DFD292498A5A92EB8E062D186FFBDC932B5AF3519E0964D2704DD32E8233BB110746455D33CC1744CB7A33B8DF83E6ED7FCCD6E8DE5B2DA44341BA224F772A5825426ADE2B8E9D4D0FD1D2DB82CE5CA96526557D500A14B867E6E8E2ABB096493DA2362AE1574F1D45ACFADEB5CD33CEC83330941B706F728CF2A041D65ED345036921F0F5AC58CE8387AF4A80A05B493696CD9B219B76EDE5011218C5A21413FF5D453AA50FED8D898CAAA64EFBF62B9023B69236927E194CB38F0D8019C3C79168FEDDF87131F1C47672A0D381ECA968B446727C6A7EEA2336561433EAFA256D8818507A35618D1425998E938373787FDFBF7A3A7271F74B337108D685C5A083A1A7A88921442D051D24608596A1DE8ABCD9A0EBA15E853663C3463A027EE4CA1B727AFE2A949A2268283EFD1B5A1B21FFD3E7F1B376DC2C8D5117477E7904EA754ECF4F51BB7B065EB364C4DDC56EDB79814532E17D199CB01B68DF1DB63C8E772EADAE63C923E235518BBCD209BD9D902B66F7F081D1D9D42D021D6840C59BF080841B7996E17DBE15C2D49076FDD10B6EEE9674A832E9429E5D860E53D1D8EC75AFC3AFBC475746951169E4AB01722895C0F4152054DEB71AC6A67B60955A968577944D4A1B331F5DF26A9A51EF7D62E2A160BBA5D34D53C3985A09B87F5FA9CA95AA96EA16ADD222F2DB46E8C13E3AE50E342D02B042C06C385A063A064B9C5F6404008BA3DF4D44C2985A09B89B6CC25083C00012168591EB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4AEFBD0E6C5926411AF570484A0D7AB66577F5F6241AF1E3B395310A82B0242D07585735D5C4C087A5DA8516E623D202004BD1EB458DF7B1082AE2F9E72354160D5080841AF1ABA757BA210F4BA55ADDC58BB212004DD6E1A6BBCBC42D08DC758661004422120041D0AA6580D12828E95BAE566A38C80107494B5D31AD984A05B83BBCC2A08DC878010B42C8A5A0484A0654D0802114140083A228A88901842D011528688126F0484A0E3ADFFC5EE5E085AD6842010110484A023A288088921041D21658828F14640083ADEFA170B5A6A71C82720C20808414758392D124D2CE816012FD30A02B5080841CB9A90280EA966279F82882220041D51C5B4502CB1A05B08BE4C2D080411108296F52016B458D0F22988280242D011554C0BC5120BBA85E0CBD4828058D0B2061E848010B4AC0F4120220888051D114544480C21E80829434489370242D0F1D6FF62772F042D6B421088080242D011514484C410828E90324494782320041D6FFD8B052D9984F20988300242D011564E8B44130BBA45C0CBB482402D0242D0B2266A1110829635210844040121E888282242620841474819224ABC1110828EB7FEC5072D3E68F90444180121E8082BA745A28905DD22E0655A41407CD0B206964340087A3984E47D41A049088805DD24A0DB681A21E836529688BABE1110825EDFFA5DCDDD0941AF063539471068000242D00D00B5CD2F2904DDE60A14F1D70F0242D0EB4797F5BA1321E87A2129D71104D6888010F41A015C87A70B41AF43A5CA2DB5270242D0EDA9B7464A2D04DD4874E5DA82C00A1010825E015831192A041D1345CB6D461F0121E8E8EBA8D9120A41371B71994F105802012168591AB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4941B954F40841110828EB0725A249A58D02D025EA615046A111082963521511C9EE7C9321004A28880107414B5D25A99C4826E2DFE32BB20504540085A168358D06241CBA720A20808414754312D144B2CE816822F530B02410484A0653D88052D16B47C0A22800097612291A84AC2BF4F9E3C89BEBE3E249349F57AF0FD08882C22B40001B1A05B00BA4C29081001632B18220E5AD0B508895D11CF35333838B8F0146F22042D99D4FF5048144713152D532D8E80EBBAB02C4BBD69ACE95A1747D08A16828EE74A8A1D41BBAE2B041DCFB51EB9BBA6E54CE235047DEAD4A9AA8BA3D6051239E145A0A620202E8EA6C02C930802F72250EBDEE0DFB4A0FBFBFB914AA5EE717F88F51CDFD5133B0BBA52A988051DDFF51EA93B3756327FD2DD71E5CA1574777757370983C20A49474A754D13A6AFAFAF25EEE0FF0766F1DC443B7D42440000000049454E44AE426082 WHERE `app_id` = '7';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000000D4000000BA0806000000D62063320000200049444154785EECBD09B86557552EFAAF7EB7A76FAA49484B8510087C88A04F405194EBA75E9B400286670BA2A2288D82CDA70F7D8A4A7C220AEA67C305858708DE4B083DF810BC72318020810409E92A55956A4FB3FBD5BEEF1F63CEB5D739D59D537572A1A8BDA152A7CE5EED9CF39F638C7F74CE3DBDB4B8F3F3FF811FFFBEFF829513C7D06CB5E1FB3E5CCF85E33880E3821F47FE7B864FC1EF0A80E714E6EF930EE7410E8F2AAF9703D03B9CE6630E2ECF39CDBF375C542E55BD8B5EFBE4DF8CEF79DAEF367C212F89020E9CA240C177359FCDE32343C063CD17F67B7B39BD921D87420F2C2FB2F1DF85DEF1A43738DD33DB6B57E7AD9C92CDE377C6B1DA7487936EB8F12DCEB6444E9E818D173CCBB2292F7FFA79AC8EAE194CF3881B8677D38356AF371EEB332C49CE7D9E23CF7324698A41B78B99F979BCF1D6F7C379CB7B3E54DCFC3DDF8985F979F87E504EEA498F76C6C1E402E0EA1883A58A2F79B41C285CC0D9CA1C54D7D369578D056D15A4E313E5B79B5168174FA1CFC935BA1108A7B859E5794F1A6CB99D9EA3D7B1DB838E0701377E86CD13B4711A373C49B9E82D90CCF056DE67D337FA3E06C4FA30274176FCEB9376C7F1B1278FC0997E53592595157BFA055F7DAA535F979BB16CE4A7FD9CFC5E1B3635AE3347AF51E4BABF572779E3BA38F926F6EAD5CD683C9AD5B9DEB8BFA5498263C78FEBB6B7B8B4044F245175719A0739D5BCE705721770B93065519E8C12EE36B29A0A2EB6CAE23FC3C08F5FB67253F9F16439566CDA72456228A637EDF666D0CA8B5706D12EFA0DB2CB82720C8EF1E2D573C7CB48BF51A0E914E86DCC1114D6763E3701B33A6AAEA24F267EC3F166FCCADFCB75CD4B1A0969015BCEDC6691B8492E8FAFBF518BB08F2C97DF349D1B1661F95D058425902B1B891DE60DC276B3ACB5FFAEAE3BBD6EC175E39891CD0BC01DCBE8129695B554EE21552C9A35325E4DE39F721470ED82299FD1FEB05140D899D5CBD9F9AE6A5AFA9C945ACE54AB55345A2DB3A3E6708C18D12562102950AF28665590999D39876B1E9067D985369612279DC2A3721D345D5CE39DC96285DF54D580EA6EAF80E2F51DE406D4560D5395CC689FE3AB57944D1DB8F299E4550BE48E53AA9F7965A72CF12C182B64B239979C1059BFE6214F92BEF2023972D7198F8D2C14034B0B227BBEAEA4B1E82C17848E27D715C78BEF2CA7CA2662AF67E4A339DD2CCB8AB092132083C58FEC9F55505915224791BB70F872B9991757D7825D1376F3B06251B732572583D962EC8621671970D81D43E75A4153AE31C73CBF018FD91EE5AEB2F0AD3A61B402D9C8364B64B34116E06AE4F5AD4A643488CAB956652A6472ED809432A0326E7A13BB7D8CB5117DF431A60D5696772DD31890C1752A03E71482613D2137AFC75DC26C5755C0D98991AF8CC8557967752AB3C70BF0EDCF050ADECF8A685918768556179CDE9B67C9E35981630448090B8E2E179A6E3BE580D839D36BF355CDC66016A7DE4996AB192057E16D77FA522018358227E4BC391165B53C1D713B3632017208CF715118DD838FE81A1B53BEAE80C2829B6AA25C56E6515F722C747524E4C6E6FD0BCE0D016B9E99EF99E766ACB8C39700B68BA2B299C89818A94BF594FF20E064F2B889F26FDAD279B938794C2E1B962C0C039F0A302ADB2987896BAAAA3DE8F231D2986BCECCA7DE5667D3BCA10EAEA842150DA5041C377F6E2C7A6FAB74CBEB98B9D561B79B813149E4BB8D8243EEAA3B54E54A7A217942234FE4D6D62E3660CE650C5CC50F6FB1B4BC2CCFC489711D57777B591C66F79249D1ABE80E6454D2D25E2AC0DDDC4A0BB129CCA4C800510C0A70284908512B8D8C583733CAC7E20BC882E3A4C925CDD6E0EAC4E9566157AE284A669B303B988C99EEB09C04873BACD924F4A9F577166DE3E56A67D10CACAC33A3725892C548022E275964A57A3C5E14027DB3802D90EDCEE6968BDB4CB0A8C26630A9425BE928A854E9CD1D448129FBBF9D735D742221F59D38AAE5062EE3A67326E3CE0B98F7D1D560D562057C5E18007359984D54A7620C1601B6AC19AB762921534A649138F284061EFA1D37123E8302D0AA51E3852D6322F3C17750D9A66ADE78531C6B3155E0AB742D3721036E59315595ACA2C7EADEA163A82A76B9A31979A06B4D8580193F0B77B3F1C90E68E6436F99EB3870C4EDD25C5EDEA57BB1058E990C824B0F1A4B149937EE88164C66EB1C6B0E63C1A833A72B46079E2A8B8A7AAB2F5527888B40F6598256D7C058FEDA856044BA9500BAC8CCC0162E0A379745A6D363D8492BE68D8A615508B98F4834A794C0BA1F991D91DF1989C231B0EA4C55CCDBEFAD2A268F6C8063D5205543CDCE6671CBF1330B5D1680CCB6B56155AA7063C9ADEA52EEE3F2F4A5CD6A87D2EA1EBAC875B1C87398CD49259A8262BC0AAD0E61A598D98D453C5875DCA895E57554BD14E96DE652CD3ABBB48D5093B569AD4BFDCEC8D9B146CB71311A8A5C810BD42E4AAB1594FBA555E10D90658D5A8DC1805C34B75C80AD5B8C5D07565BB4768E8E8DCA435D29623EF01955D0985D4E351ACE8F0802FD6785B5DDC8565BCDC9D9B5BCAC9091DD49675E416476126337E8A4F00616DD3A210A26AB37A80E248BD4EAF7664B14C165C0A9AAED4683D40AB6522018C54D777DBDBED5CFEDE053B591E7B452C8EEBE46453588DEA0E7DAE9E522A626A16FCA677695FBD0FF18609B0564EC00233BC49C143B83EF2FE48C59640226AACEAA2A8DC7C71AFAFA80B2205D02DA4C90A82646571715D8A845F21C2ABB793DD9F98C9D2292DFEE4DB2619B09368B52664200C67733924926D7ECAAA50D930B7865B194F36EEC0FD175784B638B983953C4DADF71F8AD9AA99A05DF518928AABBFACEDCCD752757A95902CEBC84FCBA94F04611E45C884260E6592E6ED438B9A7B9973C175553BB4ECCDA9231196FEC6ACFE9A64EC96CC75CEC70BB29D84DDF6C0AD4ACF4381D4B8EA9BCBF51AB4BCD4A6CF91CCEF2D2922A09B2637397D79B964B586753553EB3B0ED80954C8CB137748171F00C7569178CD9A245BA99C5C687530DCEA87266E154E80C2395B95B9AC56BC7B9E203B2FAEFF88915783265B250C6D69E591D6A8314542FC73BD2D8C8AF4851AB459B034B49CC7192C566776A731F4192AA8432C566A797A56240628D58BBB1735794C915DD4EA9762B61D426B46018AB4CD61857B5D24802A3AA1B75C39877469E55E653006925BD2C302B5F746790454755D9A8F7327AE317DF4088283E75A7579553B5108E8BB503558B305B7F7933B3D08D5E6CD5456B7AD879B29A8D7D6681A4D100644AAC58B05A8811944A5818895B6A0D5661E2B3885161806F54C90A4123A0339810759A73A33B94D115F446E59AB18615CF5B16093516D076B04BEAB7A20EEA02B56A8D0A71D17F2B14A75571C64C94D9552D1B6740A90BC74A4263A3559EC3DA0486461BEFDAA52D628DEBCAAE55B25E9654D8E8D390612807BF62CBC9EFEDA66217D3980E57D5B4EAC8353ABEEA7C627FD256E0DFE562305243258A9584461DB34A921D4F0338B5BFCC6455774C737CA913995D5AD51E63DB6C58F77631997B8BC418AB66BA53577C86E5A6A9A030F6F9D84A740C68ECE2B2EF634995AA3D65CC04A3E0A80650B5B12B1ACBF83EF63D2AB47405F4E5B89412C7A8B6E5B88C4D0BCB25A956C7CDD8A8A166416D589F566CD8313412BFAACECAC855D69C153432A3E61975F88C30595A5EB2E6F178C84B95D8EE01D5E9B0ABC1C804CB22D92D7793536E6C5559E3DD8899CA8EA033375E48251961D5D9722D1891677525738E799F928EAE325B954DCC2CEC0A1BB7296AC31EAB3BD898391AB33F278F87591F5533A2BC8CFDA57DB35205355AFA788F35DB6DF93E7602369D5919336B43549F79FC8255F0D8BB561ECB4ADEF1545A4363E341E5F795E7A9CE6FB94E2AD2A27C37BBDA2B268951574B3BB4727EB97F6CE0D9C607A89933B6E76D948A594D1BD76E098C8DAE13BDAF214C2A4EFD524894CBB0B2D99807ABDE67C32059E96FEC579150278DE2E65F54C673CCE49CF5ACD31E501DC773BFCA4E9FB971119FD3D577E2C576E21A677BF8EDDCE3A463B773F2E91E6427AEB18D973CEBEDCE7CC0992337363EC74980DA7CE90D9B4851A05EAF8F6DA953EF6715CEE76C2FAD3B694516E809671D80CD72672BF7F9DF70CC969F7B5B2F799210DAF13739DB736FF87EB3BCDDCE7C6DE1C9AD12B28543CF78C8B63782530F02C134180C54B5B68CF5496271FC24EA87AAAC60AB559C6ABF6630E0FCFCBC04059EFAB3C15AD8E290587AB572B82152CE7E812D1F78F64BEDC411DB7A9C6D1D2C4FB7FD33B6F85267BBF086EF4F31C7673B7F8B8F615FB2E26FDECE999B444545E5DCD2E89DFA255CD7C5F163C725587CC33668F43AEB07B710729697972C5B59D2B8EAC9DE486BF3627996636E7EEE0C12EADCDF7F72E66404BE16478012EAC4F113703C1B1D626065E9DA0D0F6D58BE4D41D26574A4F58B0B45C8583723A14AFAFC6B710426CF3419811D1C0101D4891326826723356159CA5200528B585A322C9F848118B5C246F64A0C93096D290A644581C5B939F5354C3E9311B8084680803A7EE2383CC72B43A2CAC015719758379D465E1A40A9822E6E14F133D9205813FCA28159E267A10D35915017C14A9ABCA20A1EC7C5F1E347E1BA9EC693DA103D6372599965C39204501A1E621CB512CA485C8DA3AEC5C812275981F9B909A0266BEDE219013AEC8F1F3DA181C665348A89EDABB80F4D800B9CC5C5A5C2C6E7D9E0CA32245EA83E1BBEE320CB332C2E2E9E81E5BB78067AF2A617C708B8AE83A364F94CEA5219425632E38C6ED1004C09F05E5A5AB4D183265F681C96AFA1563630D0D850F30BC84DDCD9C531A493B7BC984780B4F9B163AAF295AE241BE95E09FD2A333DA8F29D75C08CB3ADC8722C2C2E4C24D459076C72C0D7CB0828A08E817F1BC25C4D229BD9605FD4A0486CA8ADBE3C69F3858509A0B63A5E93E32EFC11D80C284555054D26C6D0464C56006512CD84DAA80C4435FB7802A80B7F854CDE605B236001E5305FAE3CD3B0DE265BB72ABA9CC5059212E64893E4558DF6AED61BCA8A1C8B1309B5AD09991C7C618FC0661BAA2A6FAA95B76C828CB3B8B45868E5204D1F974F19D664CB84E9AFF33CC5C2C2D2B66DA824491004C1853DB293A7BF28476083CA2799E0CA9D9FAA5C9D687F8B4B0B5AA6C326E7D94C4782AAEABCA2E3F71C543E82E9CA2BAFC4273FF9494C4F4F4BB4BA35F02ECA199ABCF40535025CAB478F1D05DDBAE256DA206C58F4C7D5C24C9A030C67619180D2FFD90A3A9A056A72A3A560827A8CD33CC7D23655BE071F7C10BD5E0FFCFB75AF7B1DFEE66FFE4606B4D56A210CC3B35409BDA0C67EF2B05F872320803A4ADA9CF5318CAFC956A3328519B56E852924B3B0B0A8E91B95CA36656688294925158B88C0BCC0D2D2F61CBB1650D5B17EDFFBDE873FF9933FC1473FFA51CCCCCCA0D168C0F3BCAFC3E998BCD2853E0202A82347357DC3A6CADB3A8B5A59A2CCDF63ED0C91507AE4B8F64359624B93E5E5FFAC8C9366199696B667439D0A507690A90EBEF6B5AFC51BDEF006ACACAC606A6A0AB55A6D22B52EF455F875F4FC04D4912347C4B15B5606A9D643B1C54F6C00C4E22223258C2BEAA44225634E83C7E7F9CE02AA3AEE9FF9CC67F0C77FFCC7F8C77FFC479158CD667342647C1D2DCC0BF5552CA03C4930B4F550F4C7AA03579DBD059CC585C571E9D333E69E17C8B27C4725D4E906F94D6F7A9380EBCB5FFEF284C8B85057E2D7C9738F01753A93C4960430B56FC58632CC453509F15429F0D90EAB7C671B73AA8B0416890CA6944C888CB38DD8E4FB9D1E812AA054228D2BA09C5C7FA5A00D455262DCD9C8DA4CA626D786E763B4F9D2E2CED950DB79F9F7BEF7BDC2127EEC631F9B1019DB19B8C9B1E73502252921A17CA61AB08984508AC148285396CC595C5830B5082B4E5D5B00D0A46F48652216B42FB06D966F7D7D1DBFFAABBF8A9FF8899F10BBE87C3FC3E15018C23FFDD33F05AFDD6EB72744C6F90EEAE4FCD38E000175F8C85128093DAEA32E854DCB824F0A2A71DD2ECC2F14B663810DA36572A16B3B2254EA4667F4436D5342F131B8F0D7D6D6F084273C013FF5533F851FF9911FD99129BCFDF6DB0558EF78C73B441D9C10193B32AC938B5446A064F91C4F8BD8DBBE54A60984F4EB326485948A5E585828589ED6F62B522DD1D6E81EF7F7E1F7A4DFB7EB87AACE4E1CC7E8F7FBE8743AF8AEEFFA2E3CFFF9CFC7F77EEFF7EEC804BEF18D6F14C935213276643827173123A012EA08BC321FCA94D02BDD4FA6F103FB1AD0B93BBF302FB17C6575F7B2B6357FC7BAE55698012425969797B71DCBB77976482F8E4623011741F6AC673D4BC0F5CDDFFCCDE73D91F7DF7FBF008B009B1019E73D9C17FD05045087092855F1040DB6D6B9947C36F9B9D248A020A0E8D8B57033450C4B8A4FED2A5B7E99B17C3B01A8EA2C115CB48BBADDAEF89DA80EBEE0052FC0BE7DFBCE7B326FBBED3601D79D77DE39B1B3CE7B342FCE0B28A00EC3F518CD67EA1C579B9E5B6794A94B2F36D486FCA7338CDB4E49A8D3DD828065D95BAA84AC5D41605172B1D2D2F97C1EF7B8C709607DDF3F9FCB4CCEBD0847C002AA1A1A570DCDDB8C9D4D801AD7193F55A5E7871B50D5F94AD354C04542E3DA6BAF153283003B97CF631EF318B9D60450E7327A17F7391B25D438A2C8768B298BC49A61521BAA02339B50685A1397A3493196EF900DB5DD2962CC1FED2D82EB694F7B9A00EB861B6ED8F2652680DAF2504D0EDC3402C2F21D3E0CF2E6AE89D72BB5BC0DA692A9694996CF064F48C73CE9FCA757355FA829566819B19DB6A1B633835409092A062BF2F3810F7C40D8C2B37D26803ADB084DBE3FDD0810500F1D3E0CDFD3AA47FCA3E55A6C87FA8A2EC74AB2F373F385E39AAEEBA69525F976D7F4A294EE0206598CE55BDE75FE2CDF76A66F332378E38D378A847AD2939EB4E5CB4C00B5E5A19A1C780A09454091365735AF0A20DB71D20820D2E673F3F322C1CA1622A63BBAE648992EF2A6172A6B4AEC5ADE75DEB4F95666ADEAB37AE6339F29E4C4F77CCFF76CE5D4938E9900EA9C866D7212A51125D44364F9C691E6D2E4DB46974B9364D1E734C970CE48289333A5CDA96D6B4A9360A8DDE10B1459F1B0AA7C96886054C5E31FFF7821227EF4477FF4BC27F6FAEBAF97ACE1092971DE4379D15D406CA8870E4B2FE56A6D73DB8BB8B48B6C07FAF9F939D3A2BCDA70B5DA7C6A1C8A4E1B6AD7AE9D955055AA9CF6D90B5FF842011263F4CEF7C39024FAA1EEBDF75EA96531F94C4660BB23A012EA2193513E6EAFB8B1EFA6F93D35BD79A3F219A125F7DBD80567FC08CCD8DDBD0380AA3A735957E2C77EECC7C42EBAEAAAABB6FBBE271D7FD75D774954FA5BDEF216445124F17DBCC7E43319817319818D80B228297B6ED824F812330AA83232C2D49628E9BD71854C1EC40E86E72AA10822DA4554BD187644728176D1377DD3379DCB7B9E74CEEB5FFF7AC99DA2579BA9F49448DB6936BC230F31B9C8D7DD081050871E3A04DFF52B92C6C8A79313A2484ACC692D976A9D162BA6B440A6F08434C3E8D8DDB56BF7B64909DA44A4BB9FF18C678824FABEEFFBBE1D19F88F7CE4232090DEFFFEF74B662F53E72776D28E0CEDE422660454421D82EBF95A90E5A44EC79A0B5F96B4544019E05892DD1CC0C29765166F016479BA6D40114CB7DC720B9EF7BCE7EDC824B1A41325D15FFEE55F822406D336A8DA4DA4D18E0CEFE4229B4660ACF2B18C18893C962C27AC5C0D92E03F58D652288B02CEDCECAC78722D772E91E752C945E2D1E5F2744931158475F9B66B439DA9EAD17666EF6D6F7B9B5448BAE38E3B4A69342998B99D119C1C7B2E236001A575F98820070E336D4D866E353656F2A166E7660B418CF89F36B48A929399A6CB22976A4365D8BD7B7B2ADFF900EA739FFB9CA8746F7DEB5B459DA3349A94743E97653139E75C47406DA887A42E1F658CB604D50AB2A76A8DEBCCCDCE11492A892AB5912A752F8D3E4895AFC0EEDDDBA3CDB70B28DA6954E958AB8F7D79489F4F0886735D0E93F3CE77042C29E1B13BB5D846E33EBB6266548909CAA3B9B9398BA68D7CB91CB891C6E0627FB824D4073FF841A1BBFFE99FFE6942309CEF2A989CBF632320803A7448FD50A74AC1B04CBA21F2C68032476F3867D305E887DAB3832A1FA517553A120CFC4CCA84EDD83A985C688746A00AA853B0E4E3A443E3897266E794E5E327CF19BBB4F949CC650AA5CD77EFD9B32DDAFC542A1F0B593282E14B5FFAD2A490E50E4DFCE4320FCF081050070F1D8427B4B9FD54E324941257528F2ADFEC5C2111E504942125B4E19A2502359D838618FB43EDDEBD3D401D387040B2653FFDE94F8B4A3729B5FCF04CFCE4AA0FCF08A8843A084F240DFDB50E0AD3754368F2D22F655C4CB3A4CD0D4DAE94B9419C624ABE22D9C71FB334C79E3DDB63F928D5D80080C09AD4D07B78267D72D5876F0454421D82EF38C88532B7F52E1514E29732E6125972676666C6C0C85549845CB808FDD9564457DE82E91B7BB629A1E4BC2C9BB4AB79F8E67C72E5877104045007A9F2B1D2256512F1A17950B9C919944822892A2AE0CCCECC14D299CDFAA04C74842A85D681A53A22FD507BB669433D8CEFBAE54B3376907FBE5A1FC6164E3E17E608584049108169AAA6ED9E683A99E211520C568590232A9F8D4A1F47A76FC84CB4EC0625CD85062802E9A94F7DAAFCF96A808A607AE52B5F2901BB93CF8537021B2554191751E1C40D1B615ECD999961E8D146979388AE0D4E2B855496A5D8B367EFB658BEAFF6103228F755AF7A95E4587DB53E4C21B9E4924BBE5AB79FDCF73C4680803A70F0007C69B866E28D4EBADE985017092524A021CF55748D0F50FFAEB1A1B21C7BF66E8FE53B8F77D9915309A85FFBB55FC3CFFDDCCFEDC8F5CEE52213409DCBA87D6D9C2312EAC001B8BED2E6A525645AD6881955898170A6A767D81AB40C8AB0A5976D1A3CC16439F63CCDB067EF8527A12680FADA589C17E25388843A7010BEEF49071A52E64EE16A2A8769996B5AAD29B0A6676695AB28533794171400566841AA80AC7AB4F70223252612EA425CC65F3BCF5C02CAD3740D238FA0E1E2CAECF1183675276A84362F930889205B0CDD50E6E637289C5C3276F74E24D4B6677BA2F26D7BC8BE664E50401D904889A2C86D02869A534C7B6293003AA78C1AE7CC4C4F6B6D734B9797E987E39C0F8B4AB27C1722A07EEFF77E6F47AA279DEB2C4F0075AE23F7D53FCF028A7F0B80ACA667D2376C1491CDD870A68D6377DCD3FA34255A2463F7C20314A7846A1FFF7CB53E1386EFAB35F2E77FDFB184DAD4B4BAAC19C17B54583EAA7C72DB0D3EA8CA83544EBC1025D4F90FE9E40A17F3085401A5B019B77EDA80296A7D24F76666A64D5D3E1BC36728741B7564CB52504265192EB9E4C262F92EE6C53079F7F31F0101D4830FC2632BA452E88CB37645161935502228A667A6B58BAE204CBB5C0B0A73F218EA93925C7987C1B113409DFF144DAE70218D8002EA003CDF2B8BB268A85EAEA14736E6C8026B7A6AA69088D93229CABE2EABB9B06EB3117404569EE292BD975E50911217D2E44D9EF56B6F0408A8FD071E44C0BA2A9558BE32784FDAE9520019EA6E6A8A2C9FAA79A5316573E74D6B1B294AC1BA7C792E21342C9F3CF94C46E0621801028A49B26C093AD6ED3412D606C8B29BBBD63AA7CA373D25E249FE2123B4B1F08435BC6CB4F9045017C3329ABCA31D010B28CFD304C331A167ED284B55A85072A6E987DAF4D1F8BD6A91731B1C4B1B6A22A126CBEDE2190101D47E92129B68F38D6CB925CAE14C4D4F97DD6B360E93CD9B1F2390911213405D3C8B69F2A6DA1F6AFF830FC217096534384B406CAA0A2684DE14553E419BB603B53C9F6D0B6AC36BA9FAD176BAE4D289849A2CB48B67042CA0D8C150B3741D093F520A7D5C53427806DA526D91500CEDD3A358B399074A1D0A5BE74584548E3CA7CA7799FC3DF94C46E062180101D4FEFDF07C966266F89125F04844D89AE686AF2051313535A5B5586CEB6ADB898D5F96317FEAD1626DF3CB2EBD44D8BEC967320217C3089480623B1B438F4B628649DDB0B0D2822D2E9CA9765BA1240D032A8986B6E9AE9CA8259028991E71E96512D337F94C46E06218011667B9FFFEFB959430F45D19102B6E25D350C3B4CF1509750AC2E29465671929F188CB1E21214893CF64042E861120A01E78E0810D55BB6C5B1B2B686C6ABC08A6A9F694359FAA244619415BB2E7399016192E7BC4045017C3429ABCA38E800594CB9A124242D84C5C6B37598498CCC1D286A2C2577631B4C528F4209B8D98A5291E71D965130935596D17CD0808A0EEBFCFD494303D0C3762C86A824A51B445424932AF90E69A0EAF69F052FD889072F542EC1878F9045017CD629ABCA89150F73F202C9F8D2832A483E1C0551089978AD479BBDD92429792239F1B049A2686EC6028B1E6242C18402B36D4E51309B5C32B8D1B976DDEA559A12705AFECF01DCFED72F6D9D87C9CF5EA9324D9522BD6B22C1D2065B999C1CC9DFF6BF95DED08B1C1DFFDF7DD2FCFABA10EB64594712FC98144892B4CB9D36AB7355242C83C738A9D50D1FC6C436BED603801D4B92DC6D39DC5C5C6C96287467E86C3A114C5A436F0B5002C3AF3C33094C5BFB2B222CF75DD75D7E10FFEE00F70CD35D768A074A5325645FF91949F3C2FA49138892C5EE31DEF780758928080E4EFD91F5916AB59733C86D7E4DF5F8DBEC9BC27DF91CFC50DA3D7EB61FFFE07E0BABE3E53912337DD086DEA86D5E4241ABDDDA284B2D3AD51E565E73571EE8EBB6FB0D0E5E5974F24D44E42CAEEDE333333B2B038999400FC990B6EA723FBAB8BB47A6D2B2DECF3D0FFC267B18BFDF8F1E3D26CEFC52F7E319EFDAC6763B5B386C1688424CF1150C3C90B78ECD022A9400620523A2B07034BE9BB745D078B8B4B3872E488F4057BF7BBDF2D40E266C2C5CB7BF24F55624B0964B98CFA3EC7B51D540A5800EED49C5401CD6762B561D2E65246AC943B0630122B6BA3255452A984D29F37763034A2ACFA4BB1A12680DAA9B9D31136128A9D490683814803DAB0A297BBAED9D977F296952E47726F8DA2AEBA42AABB346B7110E03FF8833F8857BCE215D24185AD5A9BF506B224D1C5EF3AC898802A5D331D30158FE02AD82402018ACC41E1336FC8451C0FD06C3644EDFBC4273E8157BFFAD5B8EBAEBB303737578283F7B740AAAA8B16586558DC4E0E8B89CFE306C2B1900A47AE271A8302CA37771B03A50C2257AFAE02BCDD6E6FF4436D0696F937FFCAD314974D00B5A3D3A880F251AF3791930C32F694767BD08FECCE3BB18AC6F35EEEEEBC3FAFCF05A300A6AA494017387AF4A8A877BFF99BBF896FF8866FC0DADA5AD9492519250899C59AA7929C9AC145E67A628B8B2D51003EEBD5887546FE0000200049444154F1D1798091525A2092616C3916161644F57BDBDBDE863FFBB33FC3EAEAAA48412BA1B4E61DEFA1CF68ED2E01FF4E8CC7E69934E3234DDA8B5C24749AC69B00654FAA00C3EC51C292B75B04944996A700630F9C317F6EA2006980E5C89202975F31A1CD7712510228D747A3D9161BD561B92A23B9AC9AB353B6C4E6BD92EC2D17691227A292D16E20348E1E3D22ED595FF8C217E2E69B6F166942A9C4E790E393047E1848281A055C91A5F0E0C34F3DF86E80300A10E7297A598AD84DE1FA05DCA40092142EA58F1F0840F8EE34FA67676771EFBDF7E2965B6EC17BDFFB5E9182B423799F24C91004919C279BBAB1C5AAB4CD69EA749DD334598D81EF1AC70992B48FFBEF7F40361C35F3B843E81C59C58EBF23AD277B85B07C6516A1B5A04C7B0EDBB283417DB92B8EDD2B26B4F9394DD4E94EB212AAD16896C6B835CAC7A5DD76E6969C6602822164BE1FC80E3C1C0E40FB2D4D33914083411F4F7FFAB7E1977EE99770F5D5578B04A11D514A07A4C41C022742175DA01E6026F1E1AFA4F096E77024EDE0E3777D092710E1E9575E8E7D7E03EB4907B1DB43800632378047C3DE100F0414AF4F005342BEFFFDEFC76B5FFB5A01D8AE5DBB50ABD531180C45ED0C021203C69D53212DF45AE73F4656CDE69C104054C1B32CC1FD0F58964FC3F9847430F693565ED1D63664C59D56B329391B5201536A9C33445DB441AD9259261B1632E8575C71C584363FFFB92BAF50059465C2AA8CD70EDEAA541FB970ADA4A12420E1D0E97424D7EDC52FFE79DC78E3B3D1EFF74B6A5CED3AA5F63D96E4662C67E0234C0A78690ED78B306884F8D4FA117CEC812FE18B711FEB61886FE807F8F6E54BF0C44B2FC57C9263351F61E8E6F073577C9B7C0E4A2152E9042EEF333F3F2FCFF38637BC017FF5577F85999959349B2DB31128314100D9B1B264CA4E4871553115B00AA821B22C56DA5C120C6DBCAB6E758A0FD32BCA545C5640557C1F9A1B6F4E35B524E4DF126D9EE28ACB2780DAC9457E3A40EDC402399354E4A2241170E79D778A7478D6B39E859FFFF99FC7C2C23C56574F88BAC3DF5332546D39A1307C52CB393C87EA5D1307463D7CF4D003F8E49103E8851E7C2744DB6FE248BC0AC78DF1244CE1DBF75E8DC7ED5D86D3EBE1706F0DB5A826EA1E0145559352CA326C5431F9DD673FFB59BCE635B7E0A31FFD18F6ED7BA4808852D5D2F0F6B9766AAC4E07A8FBEEBB4F25B4E5EE343A5671622A2E1BA8C169B65AA2DF9D5A646E6434187A3491503B0927CBF2F9A0CAC7052385E78D3AB4D53B9DCA5F55DDB9377F6FA5D38913278474F88DDFF80D3CE6B18F9505435F53BD51431AC75A0E9FBBB610242E5CCF455CE408696F799E48A17F3FFA103E70F7177028F2E00653981A3A68041156F3186114224E47406F04AF15E1C9A18F9B97AF803B55C730CB301CC508FD40DEDB0F3CD18CD46E544951AFD7E17B01DEFCE6BF153590609A9F5F109595448590D615FF95A85EA7708A6F1570670294D850658D4A05CC86845DF3A5D322A04AF3AA52F968437F6B3D822F3401D45697F9D68EB34C56BDDE281D99DB019435A2AD4A66D539EAFFD63949954AA960AAEDA951AF023CFFF93F899FFCC99F94E38E1E3E8236EDB8644473190378C80A0FAE13C0C96334C318712F46CD6FC19B8D70F7EA51BCF7DEFDF8F75E1FB5B00EDF70C51225600B3F8A5AC458505DE889E320F21CDC74D975781AEA088218FBDD554441034E3F409417A815195216E6F77C24EE08499660F7AE3DB8FBEEBB8562FFF8C73F26E33437B780D1281642876024BD6D9951BB9958EADDAA87679B110B28CB28523A93E5A384B2B47995D8A9FAA0ECEF0550B6DBBB584C8535B34C1295413C8DAE89843ADB946CFFFB31A09AA596B05540F15CAB265987A7750A134454A3AAFE1CAA5704DA939FFC64FCFAAFFF9AA851B49568B3B4A7A7D0EDF71184E39D98E401B3545324F2620BFE2C563A237C60E52BF8E8EA01ACE73E1A611B7E7A7A1ADB3E239F934C623E1CA1480678FC6597E0197BAEC0158C94180CD0C913148D50D8C034F34002DE0769EB048EEB95214BEF7AD7BB445A91795B5A5A1689C6F72253483B90AAA2DD38AA4EE0AD48A92AA008208E5F1550B9896DD58E9FA766419C46AB59B8DAC3B09449AA03AA934EC4A82126D26C424A6C1F32673EE37C0065551C2E162E2AEED054936C2F616BF0532A91F6667FE497BEF4A5B8E1861B84DD3B72E4B050E262E41739BC40A9F0280851244324F1104EE061C96BC1CB237C68B4820F1DF80AEEEEAF23A9B7303F02D8D72F73B42EDDE64F7581F23B2EF0200871BC18A09776716D1AE1197BAEC6636666D0AEE7E0FA2AD85B3CA821E1E2CD4768841192349377A224A5EF8A5DD95FFFFA37E0EFFFFEED0220122BD6D6B380DA1C05B295793B1DA0EEBDEF3E040C8F121DCFD0E3F2A3954BBAF1F02380521B4ABF6497364B4D0A8BC1FA12269E2FCD525C79C59513966F2BB3B3C5632CA06843558DFF33EDA876D7B7C78B8A21BE53F511F15C52CC741833CC87BBEDF77FFFF7E3975FF1CB4234F4BA3D1309A040A4EF2B743DD140281B92FE482495DFAA2329323C38E8E2FF7BE8417CECE07D4866DA08FD69B44F0051E8A0EB0FE0E31425B6CCC3559F557C4F648FC300711AC3190D91141EAE9B69E199972CE2FAF6A5687652ACC47D24AD3AE0A718F57B127BC1E726A8089C999969341A2D7CFCE3FF823FFAA33FC2A73EF5292C2D2EC20F0251FD6CECA1B5A7ACC4B7CFB2D9EEAA8EA3B561AB12EAFEFBEE15D552A8712717465C8B1919CC983A1322841A8D86115ECA53A8B145A64F0B4AE8CEA3A7D218BC6202A82D42656B8759962F8A6AA57A7626956FE3A2D048822C539A97F39D2629A25A0D491C4B7191FFE3294FC1CFBDE845F8CEEF783A3AAB1D74BA3D38D28D2F35C6BF07BF70D077C8B6D5E0F663A1C683B089434181CFEF7F00FFFAD0FDF822522C3567D1E89210C891852E620935A224392DAB75D220C89A940D80AAA40BD43CF17FEDCE023C6579198F5DDC856BE7E6B1DA3B8C6192A2E135308833F89E83A0C6087517C37E2CB17553D3D3C892147FF796BFC3EFBFE60F508F22B49B6D0CC91C86A16CFC127D62C80B4B8957E305376F5C166C3C86365A9E27B8F75EDA501A9FB881A6B79A9DED154591D46C36AD95B4013CA2231AE795851555872BAF9C48A8AD41656B476D07505625B16C20279DF436A5117D841159B53841B7DB11F5EF177FF117F1DCE73E5776EC13EB6B4851A0E6F95A6B2467948283241EC0F155151B7487C2CCF98D1ABEB8DAC147EEFB4F7CA1DB41529B42CD8D508B33785E86C4D56E96C2008AF3726B5E55351DCC02872B51DB419C034180F53047DA5BC3522BC47FDD7B35BEB3B18461D1476668E9A13CB40337056A913AA563466C381E76EDDA8BFF7CE05EFCD2CB5F8E2F7DF14E91647409D8F8444B5658E2C6AACA9B8155050CCFA1B46368159DCC04946C1F65122E69730D26D7DF99A008026A2CF2CE3C3613406D0D24DB396A3B80B20B41A31D3474270CE9CB89E567AA4324199EFAD4A7E015AF78A5443AF418DC4A86CDD36976E204A11B4ADC5D910E10652952A7402B68A170EBD8EF25B8FD8183F897FD07B0520F506BB9888631BCD4C3C8CF9038199C82CC9F3A79951419172B39DBBBF33973F01AD29156D4C5DC033A7981C8CD510C133406191EBB7B0F9EB9F70AEC0D7D74B00E2F8DE1BA215CB78538D5F796205EB1F372C0F7B1343B8337BDE9CDF89BBFF92B91CE54A3E9141E0CE8E3D22891AA5DC9F54C9BABAA129E4AE5BBF7DE7BE0F9C1062B717318977D6F9150E52058F681898522CE4BA8093A27803ADB72D9FEF76703945541EC952D6B27E090C59C49784CBF3F10839DE91574D2727765F401B21C7E1461E06670E20C4DF12501A95B43580CE0A743E44B33C856733C786C0DB71EBA0BF78D0618B466C45E084603F84E0D8E5B1310B945A68D264C16378348B7C2A0C9F34B9724DA51804740E50E1237452492CA43BFE1A1EB0CE1C519D224C192EFE329CB8FC0B72F5F8A4BB20C27D656D069D724AA5D523D68E3C7B924F7D5C208C56084BDBB77E1BE071FC05FFCC55FE09DEF7CA7345A6FB7A725AADE4A24329D246F345E8F405542C16A00F66F4B9BDF73CFBDA205D877305D024C0084BE9842C781D36C305262CCE4D9A601C2FA996040AD27CB866B09AEBCF2AA0929B17DDC9CF68CCD80AADA4F7662ED645B105195B1B9535C309DCE3A6EB8E187F0F297BF4C7A2093882098C87E31D8B93F1C82D9135CC06DA786B448903B23245108379C42B793E2830F7E059F583F84AE1BA31ED651141ED2C2419D0918698151C1C0DD0CB9E3C215D78AF1376D51DDDBB037CB8B98A20B0C34CD1464431F883D475457FE6E341C201CA5784C6B06DFB27B2F9EB867378AEE10703AC84719FA8E87B8E1C01B9070A3CFCC479AC4989A6E616A6A1A1FFEF08725E0F68B5FFCA2843051AD4D930CB57A2492DCC6275627C76E605552C2AA7C3415E957AB24469953E96BD3B2114EB35997180A8D491A871D511CCB4E64727E5DA790C8DFABAE9AD8503B8827930FC5CC55252536335255305940514DE12ECB4571D55557E1577EE557F0F4A77F2B8E1F3F866EB7276A8C951A8C99E344FA9E2746F6281BCA829A2E9A180575BCED2B5FC01F7FEEE3585F98C6D376EFC3625CA01B7735D1D40FA5F4B05A0A5C21A6FCC8764174BA0113B3A81052C4C90A649E033770908E62B8998B46D0445E0BF0C9635FC1A19543B8F9D26BF1738F7B1A16933E9CE10899EF23F532385E803849911640548B301AF491982004121E6F7CE31B45153C78F0101EFDE847E3A1871E12D690E0B1898D9B41B51150F7C073033DC41DD75856E3C9A8D26693711A8D7A211CBA93C3B53DA25CE397A2DD29F52534BD23276D3E91503B89A7B302AA4AF11224FC43072681F7333FF333F8E99FFE69F9796D6D55D41A1EAFA9061A15C1E3EB2117D91079E82268D51022C2C113095E79FB87706BF72022B785C5A286304971D59E655C3E370367D4C1A037841B3565A1BAE26B3A9DE5706E432212D886F0504A4938BC4A806663162B8301EEDA7F0077A38F4ECDC1D2B1753CB63685177EDB53F18DBB2FC1147C14C78E232D52B8F502B913208E5304BEFAE3185A453F1B098A2F7FF96E890BBCEDB6DB448A2BA1C308F6B10D65DFC28EA175ECDE7BCF7D70F95C8684507242DD4B363357B589024EBDDE900E863692D616EF53C16472A34C942D550DEE88934297E7B6804E75D6E954BE6A43649BF0361C8EC421CB488757BDEAB7445BA0C3D64E741C8FD0A837D0ED754D8D0A07499EAAFF910EDBE906BA9D1EFEECEECFE2F7EFBA0353C1221A49883CAA8B73D6CF4628D22196DA353C7EEF029A6E88B55E868206396B43C8C6AA11DF9A9050ADEE7D9A313176B935D44D5EAB5E83E0F73C61263D46AF333A21A7A40AF0D0F1E3F8E2B14318782E663085A0A8E1B0BF8ECE7481FAFDFBF1BCCBAEC5739FFC747C835F83578CB016AF22CF1DD46A4D64692C2C24C302E99B2268EB0D2D0C73EBADB74AA4059BA8312E9069F9362ED052E27CB6AA84BAE79E7BCA4DEA743192B69AACF8A1CA11DA9C0B2F11B5E321E08E3701D4CE81C92E2A82677A7A5608064BED52DA24C948982AAA258C0EE0D85322DD78E38DA2F29178A062EE6434B8234028ED04451CC1731264CE10E1C847AD1D619807F8E091C3B8E58B77E08E2327B0D8A62D954AD75751B7986B4B9F969323C98698F17D5C3DBF803D8D2930DAD3C932F40BA0E73908F927C981AC90B8BF71178A4D63232404FB37B3C83EE06640EA0009835F1DB2842E7C0604C729BC20443ED3C083EB1DDC73EC080EF78688221F412E6FA83E33B8922ED26BD7717C7D158F1B1578C193BE05DF7DD9322E7333AC27213A7181D0AFA3E78F107A19A2511FB9EB20287C0CD202BBF6ECC6F1A387F1FBBFFFFB78D7BB6E9507A6AD691940DA59DCC028F52D6D6E01A5F3756626DCA9D3B16B24B99A55A5E0D31F6CCC9253884177D5D51309B5939022801818CBA806EE7E5445E8532201D46A3571F8F06101CF8FFFF88F4B202B7396A8F2D17EA25A1333F2DA256BE788DDD072324429971EFD3B0EBC700EAB073BF8E37B3F83D71EBD1B4E1262B9368D224FC4C14ADB884E562E8182110F349D98F437E8C04B46D83D33872B1616315F0B900D47023E3A7487818390C7162E24C6ED947615251AB3BD55FFE1FFA58405370E63A00F9D44B29587A9832F1F3C8CC36B2730E409614DFC634E46164E23316C809C3B2C10053E8E867DAC272BF89EC62EBCE2FAEFC453F7EC42D2DD8FFB82049704D3C8D7531C9D0A9127299AAEC7C00BA4E9085E1460667A061FFDE847F1BAD7BD0EB7DF7EBB30A41A4C4C87B753A6888C46039412AA5A76455FC7B8E0CAF6F08C94A84BC8DF38A557FF65C32A44B29B576168CA4442ED249C54EDA1CA41F5C3324FD4EBA9BE1D3B7614D75E7B2D7EFBB77F1BD75F7FBDA97190966092B0A11C08235F4B5B251401298A06D5A00C7EA3857FB8E36EFCEE3D9FC63DDD0E2E49E6E0441EF2C841960C2575823E2CC7D6AFC835128141ACF44D099B1C27A8B9C0DE85362E9B99C78C1322CD637409C8BC40E8F8927671FAF41F8D7D63E40DFF380C901DC508FC08792D441CFA38B4B68E071E5A456FA8C1BCB5460B69CE8CF9017C7F5C568C6B92C989791860BD48409AA091E4584FFB288A003F7AC5E578FEE3AFC1E39A8B583FF020BAED1ADAC3508AC30C1DA6E313CB099A8D86B0A08F78C423244AE3AFFFFAAF259991E33937372F9127ACAD412915C743DCF3957BE007BE49B6A59B40372075529B9F6DB261ADA63694E886B25999DA7CA5B83200132337C3D51309B5A388520338903F0412550FDA45EC98F7B297BD1437DE7493FC9E60B301B0B461EDB1C26EA54378A187D9D4476D14A1B3348BCF76F6E30FFFF5C3B875AD83D9621AF5681A2B5101AFDF418B99B6918714996C953EB3B5A57D9196CA1A8A2871A45A2AD5B5A448304ABBB8A43E8BCBE767B1ECF9982E7CF4F30C23EA71C60763151A6D8D64ED2C168084A892851F4B1C9C5FF868D45A383CEAE3FEC387F1D04A0F497D0A919FCB221D243922C783EBE5C872122B3656B040C228F4C2956C612788D01FA5A8D75C745DA033ECE0FA4684E73FFE89F8B1BD8F40D4EFE04831825F8BD06370AD5393C80E26CA8A53D83876979696F0F9CFDF815B5EF31A7CE0831FC4E2E2B27198A7489221BE72CF57E0B1888D51F9F485557B73F85ED2370ABAB19094187781D78432F9D652E81C0DC98377906609AEBEEAEA0929B18390127688558FA286A84E470E1FC653BFF5A9F8ADDFFD6D5CB2BC0BD96884FE60A4EC179DA904209D9834BA47311A4E88F53917ADE31DE44B7B315C4BF1FFDEF5EFF87FEEFC2C0E3B1E16FC161A51842186020ACF67B4812F213C2E37506A6095C821C2AC0821C48033A2CA95A070422067E19501BC7C884BA7E670C5F43466A6EA480743014C4C89E61462F3A45C2B2ED541476C9E242030130459803C0AD02F121C5CEF63FF8955744729822894A80B8918674D7E297BAC3A12E3296C50B7140BCF1DB1B77AA3219825D16A46186631D298F70FD1F374D378F6EE4BF1926F790A964217D9600D491221F42344CE087D8A3FCF8597C772FDA1242ECE8BBDF3EE5BDF8BDFF9BF7F17ABAB6B989D9D0155BEAF7CE52B1A2B593AA08C9A4B56CF342654AE218753ABD73427CC20CEF2EAD47D95B9309EF08262309FD8503B08264B4AD046E8F5FA26BDE225B8E1593F84D5CE3A9C3C4332A2133790EDAF6051C9C0937A7834F6F31A0338735C96373098A9E12307EFC5AFDFF1097CEED03A1AF37B85C16BE4293AC90AC2D087C7C8877E8AD009117B40E28BA505576A7D19E53E4F91F2B75E80C0F50510EA8B62F43AD5D318A364849976139734A7B034DD46C410A85121922D0FA440895C8E11419453438F614504A787235982FDC78FE3E85A17591089BAE99952668C96E762CC2470573FBC33DD39A614147206AD3A9A6A521018F100C41F9DBA22C972076B418EDEE804AE19FA78D113BE1DCFD97739E6B31E0E1719FAA32EE69AD3E832A2DE6F0119D5CF42E202A9024FCDCCA23F18889ACD2AB7CC2BBBF79E7BD52561A2535422AB0F4D7DB7FC5B4B333BF55A5D8BB8D8B0A30A09310EFA53D6823614E3C326B4F9CEA1CA26C8FDD00FFD207EF9977F190B0B8BE2786C346AE88FFAF06B7524A31CA14355C945820411255527467D6A0641CDC77DEB3DBCEACB5FC4C73E750F8ECE31D4C643DCCDD1A464E1020DB83366F0F24CA4079534C6D051D513465D7C4CE3B6967C3B06A58AEB85FFA03F524A0316707C0FC33C45EE66084719969B0D5C3E338B2B9AF318C523ACD2EEA905702899B214D3614398BDD56284BB3B6B38D4ED03830C198BB49051CB3330CC909B8A309C127350F605D42CBD32509B214BBA16C5C6CB785E51E663E9572E42AF86B8D787DBACE3F0B087A7EC6AE1A5573F1ADFB77C2DF25E07C79355D46A1192CC0713FDD362887A54130C0C87319A5353989E9EC2FBDFFF01FCC44FFCB8AAE0A6D065190A56D693304D0A6DA672BD5E3309CB1B17C9A95C78D4392780DA3930F14AB48D6EBAE9260991611D6DFEDB293231E049F7AE73078D220419D38318B59621CA3CB49AF338EA7878FB9DFF865BF67F1EEB875378D3754C3B1E3A4981264224C301DCC813F52DA36AC96AA8E23765862D17B0AAF2D55871F99D34662689E0881A2AC71835262B8080602060221FBD51078D1CB8726911FBE61650CB81118351B9A3471E7A858395411F470F1DC67AEC60D0A84B4A3DA1CC77A154497951C39891A091D8BA71846919545A1201B4F3E954CD33B1F1C84EAA80E5B90E52537F9C36FF54AD8D63AB07D0AE87B879DF63F1C22B1E85AB66E771F4C4FD486BA18457859E8F51AF8F7A10220C23747B3D78AE8B5DBBF6482630E78536D4E963EAC7C9F0CEA90065C1A47F5B26433DEF8FBC5AABCF4C3E3B3302A4C059038F4525A5A3459EC2774390E64AC3026994A39502F9EA3ABC761B49EEA1DE9CC27F1C3B8EDFF9F4BFE19F4E1C4114D4500B69B8D3AE4AC4E7C2B2575C04243234FBDAA87455EAF794AF6009854D39B8A6CEBDF496A50B4A8802474272D20058ED1CC19E7A1DFB2ED983E55A0BADD8C78174802F1D3F8C636B1DE485A7CF98A570C35A192DBFDDA234F274560494617563F48944B351F0598E01622C390DDC9F0C310C627C933F879F7AF475F881EB2E45315A47BA4A82A281B4C1FA803D4469269116A30CD8BB67AF4459743B5D713C6B945145D468F1A3CAF80A29C1980DFDA5E8842628563DE163868FE3C814E58984DA1920D9AB10443FFBB33F2BEA1E2B0EB9BE27C1A7A3DE104EDB07D218D3EB29EA5113A39905AC65C05F7DFE7FE196BBFE052B8D3A16BC45346232574C514899A380C2F5D11F0DE004BEA4A807CC5DDAA9F83BE30FF284C97091C50952FA8B1A3E9C78042F4DB1777A018D2CC0E1EE3ABAF493B1FB066D2871D0D03ED23023CB56EEE488AA1B8275C959FBCF4523F1B0BFEE622E0DB1D4CFF1B9FA7134E32E7E78CF3EBCE009DF8C6F9C99C7E8C80AFAEE0869C3833BA41EE9C00943CCCDCE9680226DAECFAD7E35214A045F269ECF4AFBC89012C6EFA60E3A76509097D71C0ED3250A799CE2EA7D131B6A2717002514EB3C302E8F1A40A7DB157DDECD1C0CDD5880B2EC4DE14811E25DFB0FE2EF3FF63F717F081C9E0FD1CA81564CF713550EEEB4F4B4FAC83C5FFC2764C3683E3969BA6380D224760D49E39FC00B9064B9D8228DA001C4190E3E701079EA6269790ECDA9085990A313779117196A415DD43466D26A3C9C8D8BDB5A92E299C6DE5E4FD7B991B4641EA9066623E4A983F92C84DB9EC51DC70F61D7D10E5EF2C427E1C5DFF1541C397237FC5DF3708E0D2515A49F8EB07B79591CBE52FC45BA6F9013349B935C5FA3EE4B0E8232A81691A351CF7A59C8455E92F24CBDE816856C5AFDC8474E54BE9D06D42FFCC22FE0452F7A914C1C7756BFA04DE022F553A1BB67EA0BF8A7070EE3396FF96F18D5E9539AC7E5F5368A568615B783C223C9104AEC5A421F0ED332B2021E5533A6F33117EA0C16C0191769D59831A9EB6257B954FB948D6B784D847980F543EBE89F584746E76F54479E7631DD8C509FADC36D3B027C465A9048289550362810C09781DB273FCE99A4ABADC3573946640297BE695A106609E20888A30061E2217E60847CD4C2F1F8201E39EDE243CF7F3E1AF161F4EB21DA2B21529FDD4280E5A57991509C17DFF34DCA892D6EA951E7928622766721D5709D28AA09994E6AB212F668FC56A65F94E1DAE93D9E006A27E104992C028A555B299D58DF6EE4E66826394EB06EF8C841237271EBE10E6E7CD3AD886AAC5294C0AFE5989D69A211052868C3304427607A3B0D75CBCAB1BCB6D52FB62F01B8FB4A5B1AA69E7B115DC0488A1879C8E0D318CD3C440D750C7A239C5859C770C0D8C01A3C2F1456910B9B6B865D38A6A79BA8CDFB48E8DC4D33095ED5463AA4C599B54B06539326D5DD4CFF5C019FE6FAE9BA8F50BDB3B1A65CD56409736833027216542B1914ECFA6893D1EB0EB1D64DD065DA7F1121CE0A5C33E7E0D3CFBE19C79A6B98EBB8E8D6009F499B8E83E5C55D46E5EB688F5DE31B3385632BC1C106547C9B5AADA6B962622F19C88D83D24DFF4335C6C89A4C00F53002AAD311BE2A16401558A9FB68C70E9AA18B773FB4869BDE7C2B82DA0C3C97793C03385E8E563DC4EC7C1B458DD248FD53A324D585CA9D3673243BF61C05942C4A86D215452AAA1DAB22F98E2FC52DF3A183DEDA0027565690258EC4E431DE538BEEEB9AC9F83FB296C908CD4684A9D936DA33D3888B01567B2BF002551B8BCC8353B0C95C80CC2BC0661D1E231A4E1B27684C18A6DFF347D9389869CE70A111023740DDAB692DF624457F2DC1DA7A1F715CC067DB1DA7815196E0BA25179F7CF67370BCBE8299AE8F7E441053AA8F0125124A543E5BB2C80CA72129E4F726B05C0155FD54F9F24DDC799CA6B866A2F2ED28A2AC8462EA3A2514B933461D34D31C2B351FED11D0085DDCF6D03A6EFCDB5BE1856D448C832B62242963DFA8B0E798996DA0351D21F75D0CD2589CA34EC0DD9F0ED592E6DBDEB38B04A011CE9A1589D432AFFB4DF85988F563039C38BEC6807309A665992D3AFEF947C26C1989E0B9703C474A86911D7459103377D19C69A0315B87572F903A2C1D93A318E5146A52D492EA96684B927A72FA6797D417531C854B95AE01FAD402C745336802A31CBDD52EBABD21BA436E3235F86E0487753150C320E997805A69AE61BAE361C0F02C01948BA585A5B1CA67FD501B58D2939D4B4E8D2A9FE521C71E5E13D0580D9B65B0628A7D13406D6F519EE5E853036A2CA1A662078DD0C37B0EAFE3C637BF0B7E34656A27B23793234553923845C4CA0A418199F96934A6EA52F8A437EA8AA4A0856CE778E3121887448F459856F151654C0B3C03720000200049444154B67EE4058B99B05C5803C920C7606D20214E8402EB9DDB1639921FE8D2D6A00DAE5D00790D4698275E0E2F256B090CF33EEAAD1033F36DF8350D5E2560338980D7C299DC03A413A2B2F4FA34EA882AEB37A8CB8CCFEBC0173E9F00F3A41E7ADCCDB07E621D716F8494E923612811221C983863944403C36C807DB3193E75D3F3B0D258C374D7C320A464A4E3F96440295167483BABCF9967B205269CB01649093E8D3CD287B206A26E0E34EEB42C739226D8F7C87D133FD40E426A23A03AF07257C2829A4982957A84A96181460D78F743EBB8E96F6F455867EA76061244B6161F721F1999B39C5C5B8299761D53ED3A6A5335AC67EBC8C4A8F2240E4E15310D58859B18E59FCBD61624D71412B27022E5FC420887FAB089D5B53E4EACF7900C6284F59AA4ED8F688F48E80F43D5B856120991628522AA9B5C3B04965961722CC3A746C391A893D3AD69B4E62224B53E02AA7BA956452298F85E2467A45E839309F942A48965EFA5F03375EA8EC01AE7195ACE34DC9187D5F575AC9E1820CFE98F8B24C856630395592CC07E570DA9FBF7E8C5009FBAF18771343A81B9BE8F4E48954F01B56C25D4FABA867F1932450A4668AC9ED9874C933C2A855118092951CA221968A5CC8D71A593C05D23CEB0EF9A09A076104F2529A12A5F474880D8A5CA0751F9A6E21CF5D0C16D8754E50BEB6DB1A12C452C4E76E9B7C4969EECED95211E8ED024BB365547BB5543E130602941EAC49A4D20B1794C7E5079A54578CCCF6E26A5B9D850ADEEB3726C817890A1776420DD32689C33D29D80B65D3308184638287054DD7324AD436BE96DF8486683AD6357405A8B862EDA73116666A6A4D3476FB88684298FD22551438F1855C1B111BBCC49913999E45A79458480C17C5981A4E362D81BA2D7674D0C46F0D74505D5B2CC04A5761A64B11955F96205D44D37E358ED38667B01BA61069FE91B1540AD77D6D5CE138A5C0374A5F8B404C76AD486565C062561C8305DADE669AB0698803F11FC15D77492E6B8C6F4E9D9C94575315FEB2495AFC811BB0E9AB18F954681A9381340BDFB501737FEED6DD28FC975E9731A774797043C2912C285C20F834C33A4C31833D30D34DB35D4DA2106791F4931D4BEB5DCEEEDAE2DB415AFC77CA84C53C6BD26B22EBB1A76D0EBB24794271284159334EE8F3431179272C3E30443DB624683ABCD6E6C24A3E9C621EA2081C760564DAB778A54524AA6A6DAA8CF44C8DC14BD64244E6AAE4D864D514051B51BE6B41173D4BC86D4C7C84629FA9D213A6BB42B53448CC667B9337119494AB186D69BF8754D02A96310C778F4928F4F3FE779381A194005197CA6E15700C59C296E22654F28AD972BA926D242D78E070115459128CD638E6F6323A9713A8752A0FBF64D24D44E6E000414A513A9F30E435C9021765D34E3C0008A65BD5CBCFB500F37BEE93684B5165C8F8DA56D96AC768CA725CF9D976B864281067AC30D301C7411344334DB4DD4DB7538618124635E120F4D242F9DC4038B57720DB0086690FBE8ADF7B176620DD9886590A9EEF8C2206AE6AD662094C1D39217341E95719AB84DAA1BF35EF61CD17AD8078BFE9D34475000FD4CF3BA1A533534671BD2A626A53D93327C8A7CB8AA962C164436B0968588FB39D6D67BE8AFF5E1FA218230149B924555F8AC1C078942A74453554B9CE0AE4B4025B86E9180BA194708A87E808E9F21104039585E581652625D543E5E434BEB59B4D89A2B1A2461C643553ED5ACF563F56C5B837A3C52F4E44F00B59370523F144B26972C1F552C01948795466A543E0FEF3ED8C58D6FFE47048D69D9CD4F8E3050556E1CB7670B37B2565D82843D9EA6EA68B69AA8B310BF9B629851354A6411724776933A524AA5D5550CBA6C8616C1635CA1AC09D609573AFE54147C1985BD415A9D7AACAAC7D24795C4F45945524C32CB069200C834F5B9B910F5868794F5F78A04944B85CF629D5388D6231C3D760CFDE1004EE24B24434E0052D219E2624CAC58ED8B4B9D722E01F250F2A01EB32BC4BF3DFBB938565BC1F4BA8361C31DB37CF38B25A04ED51FAA1AD6677F560975D26723B8ECD79C987DD75C3321257610539B01C5DCA4C423A0A8F265984A52D4031FEF3ED0C18D7FF72E04B5365C8950D88AA3968E4E176110212D628CE2583281A7DA2D3466232064B9FE0239ED8F3845D60356567B12FDCD022AF5B0A9E5C828D1C44F79324D7C3E4361A5ACEBB0B4B42BFD6CA5108BEF61900E119068684468B61A68B49BC2028EB214BD6E82C10AD53B967B2924395348B3CC8658693CDF465554858696CC63FA3E1313333C6639C4EDCF7E0E8ED55730B5EE625823CBA72ADF521550265262F3FB6E2EDA22801AAB0FE362135666198E42E68FFAE9351395EF7CD6D049E79E195029A61392122E6E3DD8C5B3DFFC2E44B5295D105B0094AA26A4A4B5D50D4D693AE759B4845ADCE2D2AC2C56A65B1C3BB4A219B38C08109F8B49DDA07A27FD006CF99E9D05151B60B3404D4EC68E511E74D032852370E0339E911DE8231F7B969704689DA327D0E9F631741C51C3248CC9F3A491B6CB5267ACFB6E1A6CDBC1DE68DF6D04D4F5BB427CF2D93F8C63B51398EEB8E84B171D75EC2ECDAB1F8A2A5F197A6413DA4B7DCE8C87F9CB09A3A0906C43138B6487CB26940951A16D716407B866C2F2FD6F00942712EA4423C54C92A11E79B8F50055BEFF81A83E8D02CC271A4BA853EB13AAC5D3D149435E766C3169189303A9D910D26EA2EF87B6511E20F11DF492AED0F18CB2908E83DCD533824AFBECEA7D2D0D7EF6A1B0C57E4E294FB97F4B163025A99602A20A48BF153B17323371CA6F2300D9BBAE14A069D51BC8EA2E56BC18A334314997B934860B49784A37459655A35D37266EAC3573B2CA17E1F61B7F18C76B27D0362A9F444A380E163748282571B442540555640E4DB908918851188AFB8DF5006C354C4DF23211BB26014D3CD1A2F25D2BE4C4E4B3332370920D6522251845BE5A079A31301546B8F5C1153CE7ADEF02A2FA86E052895D338F42DF9186E1104812EE2C910601593DF64A4A33D9E56B610D41EC223EDE4711B333600D7EA381AC51200E32F4066C23938BAAC848081AE20CBCA1C3551BF08D8BCD9D6914241E4F8ED51875D202EA0B32D7A494715C24296B02FA08DD0C71DC47EA6468D59A68A10D0C72A4A304FDF51EBCCC413BACC39BF63098CAA40F14BD0689A7AA1E43A224E282528B9B88C994F00D63A26A20C1469631C0304E71DD5280DB6FFA611C8B56303F54524259BEB184627D09FACEA4DA919039A609A17145491336E37C768230105A4F01A5E566B5C884C99317346A9A2F93DFAEDD778DE4454D3E3B3302279312907257634015988A42DCBA7F1537BDF55D70682F08056CC8A34ABEB5462698740829E842F28F3D68638459282D6B4227C2A83B44D21B49E029D53F2103B8CBD61DD4A6D840C0453F4DB01EF7259489C9750C18158ADC24EF9DAC4E9DCA123F1950260CC3F0605A2783FE26D6C32B9214EDA081C86FA83F6E3DC1A81F4BC1C9665447CD0F3158EFC1F101772644441F9B976350F4D02F86C8A581754D6A4D08F1C1C876D2EDF453196ADB2529E1922535805A0E70FB8DEA879AEB87E85668736B43ADAEAD49555B194F6A8C961537318B25C9C2B90883A0900889B2DA910E8C86A6DB6652FC9A3525123CEADA6B256F67F2D99911D87140196A9712495AB93262DB0BD0F65B70060E46AB23A403F525895DC09D3CC9A57119034B1387B52A9AF0A7EA1821412F1B4A8301EEC2BE51A1AA2CD6195B979E42424993363B7452778BEB3E9380D576D844943750747374D7FAC8E2185EE84B0116E94125A91FCCFAA50B6704444034E523687A18B9313A4CD330522F60E1D09C640BD3F1956E17C942FFDB360145D693D9CF4A9B5B6349F9860D0E270A9E200C4D8B002BBFF46D75D08CA66EE29568D03EEA518F9A006A67B02457D90C284DDF00DA31B0522F54E58B2223A1FE874A281AB486BE2E553E495F3312C4A854A492032F44504448BA43744F0C10A62E6A7E4D6868D94759A52825554C3E823E29A09FC640E8A135DF82173918E523F4F358FBCBAAD3A5922555252936B6B891126992A4AA655734E055D5520DD61157B2843AB112AC330A91AEC7187546888A084EC8FA104AD5935C618402B7720FF4410143A78391C71A852E1A33118A46845E9660341A6AE96776E7602F5FE92745A5F51480B22A5FED04E6076145E51BB37C945081103525C360B230C6C110FC4E9E532225B6F8A1649A006A8B83B5C5C3AA80623ABC0D2815E58D91E22E30ED3978CF832B78EEDBDE836118A2C65262A6B0090148562B71B4925120E594C9961568E611FC61886197B5FDFA928220B5BB59E8D201060C5A75330951F3720F5EC645E749346B9E7799EA8B7623423117E2583D45DED33633999BA02624BA8617597849A4B844E28DB7635A111E555116536184108164C294580885365DDB09E1AD65E8ACB19976208B5FCAAE30725D1A5D2B99C2EE216400194EC4280D91B0B4F7136DC7E44DA5081B390A2F40AFC8E48FE3451217E890C871189AC5F378591FA324C3BE650F5FB8E97938E01FC5CC2044225D6B781CB0B8A82C1F2325AC1FEA6CD33A01D4D946E861FE7E8384928C5DDA3E8C44D0AA44DC55A723FAA156F1BCB7BE1B71382546334B2DB3CE1E435F860C6465D2A1CB809A00114278998B7C3D1330D126D6405A0D99F14D681B8370191327363C9730032D187121F557280BE8E781D820F57688ACE120CE5894BF8B946E2C2F82CBA824B1DB68879BEA43A64974D51D437532F552893564B2530375B4DD863481EB11483D76E0A823A5046323016156D42694A05BE28B928EEF4E9ADDB444254D2ECFCDFA810E4B9879081911D2F4D17763F4286DF976A407E438DA841CD810FD618C6B77F9F8C2739E87838D154C2721464E6A1AC039521E7B02A88719003B7D790B28861E490B4F59C2E2FD93C5CF8550F7805B0FAEE2A637FD7738F559B028B057A4F09D5C2AB452D30BE149392C4AA9B49322E966F024044FDBBB6E8C64B0B7D0A058319FC5682F3549D36E94A1412E5C861FD1CF3317C16B8740E862055D69E0C6443E8242CD212609F27A9490A605A7A87A4C332498D864DA91DA13CDBC867C2541776D2012493A5EF029A41478A512BFEE2A650408259334CC96C60A5A4E9900A30A494948B597A0F09B3E82962F2AEDB048E40FC7C64304C74F910C49B201D7EE09F099EF7F160EB65631350C3074D9795E651AEB9C4F00B5D32BFE61BEDE66407131324E8D3D93A84235C308619EE0B6633D3CFB2FFF014EABA5AA8B31E8C986B5DC10F52C423A84946D4E0629FCC4831369066B851454B89A5033910262D610BAAC0368E8601321AE347186D00B85054C923E8A86877633423374B0E2A5E8D1AAC9C89AA9C52DA548942C569F4D46254FCB4DD75C0F51EEC34D7C49FC8BBB31A2A02E4988626F999840F17DB99A0A2F25C12C4926A18AB926151A128DE790E266E14BD2EAE2BE760A8C18311F79684FB10B628E4E30449AA442B33B918B22659C60817D7B6AF88FEF7F0E0E4F75303F88D0CD7A083CDD2058747402A88719003B7DF953014A776B0D93618D8805BF897F38F0106E7EFB6D70BC16E0A59205DBE44E8F10FEC885DFC9D01FA6E8B1835F106AB7084A8B8C45336D147A8926433C195BC746B69EE42156E9C5DA7BCC6FA284C16880A10BCC450D84ED002BCD91B071235693F5553DA31A96B1A22BA31CD81CC0F751774334FA018A6E21F1778C1D679933F1C050E0F8243C52238D4CBE56851E538E6CEC2A5091AA4CB4326FCC2C26F83C4D361407558A80CD07DA0E9A33813086C7DD0CFDFE71B8ACCD517878EC7C880FDDF82CA4E931CCD597D01BF5E581286109A609A0767AC53FCCD7B3E91B2F79C94B84F1932E0EB95676A57AC370A0DD8BCB78E7E7BE8417BCF5BF23AF2F8A0A852010D5295E1F22EBB28A0FD52C360260F4C3B826BD4833A102B612FBB7F96555D7B2691054B158968C4980A4A4E9E3CAEB2E5AD34DA4418E13F19A04B686515D7C4A4E92A119B6C4D62AFA09D235764874852667C30269F026F1779A4B252D35A5D9D956AB9E2990F4C39F59875DC3AD287DE5BF39338487C256D6DA35A0568313A6E86729D6FA2770FD9C8BDB7FFA67B1961D879F441244CCF79C00EA615EF80FD7E52DA0347D43490902CA65421B0354591F22C9F0F124C0F7FEE17F0366E6B050AFA19104888F74908E728C588ACBE382F4A4B0254385243542DA139E47D5239322A20DCF487C1428924CEC3516AF2467C7227479E8A168FB5228A6EF26186424480234D93E6694235F8BE1F675D72F8C7A97524D7429BD683F696854B535E7D6C67B13A06C7E124129CE5DEDD411B16D569261E831D0B8803F1DA01FD4D139F610FEEB375D8A7FF8AE6760CD1B48BB9B24D74ABBFCB023C7D924D4E6C8C69359BEB202D2E61D4DAB1E4D68F3AD4DF5568FB2852E99BEC1204CF167D0E0F63DA429BB563059101814116E7FA88B57BDF383B8E39E63A84711DCA081A297C20B6BE8FBB4385284C200BAB25069BC5362D88AC05B7D267B9C3A2DC93672E71FC175B43C57BD003A640B8B1C330930F41D8C58F1BF1EA139457593AD69805177200B394A3D840360E433B53CD7AEEF8C1564E62D8B74D2F631B182A76D2F7ADA87AF90380490483E880DC5E7CE6A1EA6E31A8AC445528B512F5CAC748F61B9E1E2579FF75D78C2A397F024771A27D235B80851B8A974E260E02D8B5CB2B6B904C79A222DA70DB82F8363C3A0D094E8CD190163EC59F795FAA1269112DB5D98673ADE2618BEF295AF94AEE5CC0CE53873C7D62ABE9AD4C6101AFA4F12BF89DF7AFB3FE34FFEF92EA4B53978CD0097ACF670AC95A011336A3B1329C51E485EB329C9786C0AB6B5748F939FD4B633623116AA62AE306CAEB08BF409D1FE61BABAEF1598868B88BFCB1841EE6010FA389127C80A1735D65B2F987745758F01F38C7BD26673394B7F4926B02F3617A9FCEDA9A86685CA3A66CDBF0C53F5966447B046B95774904F35B13A6CC239760CCFBC6E377EE7FF7C06AE5F2E3062AF6209BF3501C42CDCD968481BD60D3694E7DB3A2C1515D3081D0315E149C220B45DA33634A816DC8B7F42236BF933C5F4B59348899DC4535953E2E52F7F79D93645AB08692D040195990CCD522FB030B3884FDD7514BFF2F71FC1873FFD15E0CA79EC4D7C8C0AB6D06C603566BDBEBA76C1A094D12279DBFED86069DEDF65192551D98098AA9514FFC944BD64BED62CA311564E60B4FF10D2CE3AD06CA0BDF712607601EB1EB0CAB63AA9F6E4656483941B1B25EAC0A5F6E869DD70A6606C4FA21AB54F3A9624F0EA0CA7F2305C198A9FABEEF938DCF431DC7F0CD7CF39F8999BBF15CF7FCA63E0AFDE87F534C2D063347B6CD44D668278D201857DA14A40ADAE09C9A3A69A8D341F37742F6BB570DB0A8240702D0536A4A0BB9E27FEE932E557AB4DB030C7A3AE9D841E6D7B659EE1044AA897BDEC6592B5CB9F494248BAB50407182048B113F6667231F47C04A32EE6030F2B6E0BEFBCFD21FCC23BDF87FE09C09B9F971A7E593A44443B62D413EA9D355ACF859290D20834D0D97B370B04CCB1A3855AF2780476679E891AF09204BD430F6278E8101AC81136027446230CF200ADF925B4969710B71B588B5911A9C088C16E9E8B801112AC72E42460CD18296AC9E008D3A462EBE36CE9494A620FFDD481DF6C8B27777062151876F033CF7C1AFEAF1F780C961A47D0ED0638EE2F62CACDE0255D242C7D2DE1AC9A7121E92BAE2BDDE1C5865A59831F6A540607525D0FA6AAB21028A6E91A0145092521F9528A99F55AF46F024BBAB431AF44764A76279F04C76E7D92B77624558BEFFEEEEFC69FFFF99F8BAAC7DD51B26453D64DD0E80631B0A96FD1AEF232F4923E5AB5169CAC867AE4607828C18FBEEF7FE183FF7A27123742ADD58093F6D18A5CC4096733300BC66A7EC6592A8F585652D1632A8F2D35F25CAA9001EA59037DF491BAA914929C725DB48619F29575AC1D3B8CE1A08746C8E6D9DA302D20855EB8E8242CFAE263716609E1DE5DE80701D69221BA8EA37186A92FBEA5C41D0A5F47768EA9236A828C1B09948D056C585359885F6BA0484D8D3C60151724A4ECE321D295FDB8F67157E0F5DFFD6D78DA358B38E0E568F686E883C1BE4018D4246AC36E3736FA822A5FBD5EC7FEFDFBF1A4273D09478E1E41E0876529669BB829744FB555107F0ED80FD18C64D92F548B248903511CD5A6EC531A27B8F6D18F9E04C76E0D2B5B3A8A0B85A07AE2139F08DA514F7EF2934552B1AF13FF445124AAB6A85D9E27D9A46CD539720AF48B111A5E84C0CB1136A7F0B7FFF30EFCE507BE80CF7CE900A6765D82B5511F4DBF40C198372E6C86F97147E58ECCD2C25CFCE208920023E39CD5B633B695114904D96CE9D6F113A19F5B898BA9CE10C9894318AC1C45983988F210891F4AD93136B2E6F51B858780394B1861444ABC3587687A06C5C20C561B01BADD44C049658ACD0D0AA3EA92554C28A532AD022B795EC2565282A9A460036C6EF2092B34A5EC3795206D904209B07AE8202E9F6DE0A7FFCB75F8A9673E1E332C5D3D28D019C560F0C854AD211A99644DD0359126A5ED3A3D3D2DE9226F7FFBDBF1EA57BF5A7EFF9F5FFA92365C93D42EDB9ED4F4B4114FB6955C245B7C096C323B9856C5D4F6A0636FB4D61E23F598E2D113406D09285B3D8880E2A4B14B5EBBDDC60D37DC20EA1F7578EE980457C8222AECFC1E6A578D643090A4402EB0AEF488854453B4679670A493E10F6FFD04FEECC377A0E34D6176BA867CD445EAF8A0C5D260F1D4AC8B78C03CA150E2EF1864AA0558A8E2E52221723608802F691DB114E077B0081F8D610749670D2B478E221BAE238C982BE58BBF4792424C25D998D47FC282956CFDC9B4F414FD848D067C4CCFCEA335B70BBD4613ABD2910352F588EB8C81B7391943D3565DB26E1D4D71D70CE4042E8311B3004EC69E236D24E97124D319BAC77C34E202DFF9C45DF8F51F7C2A9E78F92CD6568E48AB9DA8602747093B97B83F5BE486D76DB5DB180E07989D9DC33FFFF33FE3965B5E83CF7DEE3FD06AB5641AEFBAF34E2937AD26D4380ECA360F280592A46FB0C66E696B593E4F7FA1B92E96C2D0CAB113406D152A5B3B4E0115A2D96C49C335AAD5975DF608BCE215AFC0777CC77708D88E1E3D2A004BE2041977499785577C2104423742BF3742587391E47DCC4540DA58C6FBEF5CC19FBEED7DF8D0E71F42303D85C5998600A09F25C8FC1A9A0464A6055A52A67CE789F49D1D0D07A236515A305D824988045CABE62238BC8AECC043E8774F20F53384615DCA74D9D4055BD7D12A8E928F25414D0CC865143855BB447C528DDA34DC5DBB50EC9E45ECD5D0E991DE4FA47458416692D289956473F57FD9BC2BC70BF599E9AC0D586F9D0C680DC78EF9D8379FE2A53FF48DB8E9DB1F8BB07F04ABFD5534DBBBE090321F0EC506A4439912900E65197B3F94CD89DAC06FFEE66FE23DEF798F24D0CECFCD89E6C0F48F3B09285F01659B02E8BB56DB0768148A026AB3776AD35AB05FF3A613406D0D285B3D4A62D85C1F515813237865F5B8A8DAC78F9FC00FFCC00F483336768DFCFFDBBBF618B9AAF3FE9B997BEFDC3B8F7D785FB6B18383E210C02E860895FE81690085586DA380A0C14011C510290F1A90AA483136A63634362F2798004E31D40AC2089C4484B61675086D4442092125046442E59A871FBBEBF57A76E73D73E74EF5FBCE3977EE2E361EC79B508919C95AEFCE9DC73DE77CE7FB9DEFFB7DBF6F646444E01F0BE7B8E058BD41A8E22463C249ABF9717439361AB509149B16E6647C04DE5CACDFF92E1EFBD1BFE07F470FC31B3A1981E509D268362AA0F8013D0F7BF84E4EE6914AA545938FA5E595441D69C7418AA0A55440736C1895C3E34095671F39B200019B53D39B28D6BBEA99CBF0BA3A89C9518164D786F27681C5B211EADE25A4C175CDB290EC7291ECEB4773D63CE41A75549858650F612A2191EF5EABCAE6C1200155B748CAF2FD1812C92CE05A189F1C43A6F80EAEBD601956FEF552F4DBEFA1DE7451AA5490B4183AE7B762D778E6E6687C7121F5D24053290F8EE362C7BF3D8B35B7DD8691E161C93B11113017C5B969342AD8B5EB4D257419A9880AA37DD3265A7BA88814F3075817CB944F3FBD93876AD758DAB98E93C61D928C69655C54F2518A3EB9DC2169A24CA3BAEEBAEB2402C8DA1C3E38C1FC47122D99150C60483083DC3B028B7A15A95805C96C16AF8E00DFFAD737F0E473AFC1E9EF86ED57E0A5320862BEEA2BCB739AAF0C9B8B9511ACACD344B656437CEC102AB9832897738853EDB5C9C4A90D9FDF932104C2434D6D1267158973E8C6E81A11A94008EBB5448F3356D510AF8284E7C2E99E8F5A7F1FAA290FD5661C956A80244BD783B26860940FD781641C48DAB0260BF0BB5D4CBC3782733E7906BE71F5F9F8CB4F95112B1451F33D043C17C56DA1E1B3CC8515CB52114FD1CC8642043D3D59ECDEBD47CE493B76EC1043220AA0A129067B429F638F625051E38A06726C3943B56C4F32D5C625693517454EA6E2A88FD34FEB0425DA319476AF31908F46C55D9846434321A6CF66D32895CA92F03DF3CC33B16EDD3A9C7DF6D91209E43F1A91E953CB4520BC38CB454388ACCA5B38CD3ABA9240DCEBC253BFD8856F3DFE02FE275703126564337D68C42C54FCAA947E34EB4D3816E1640CA97219F5F7F6C23F94438CA172EA35580E1A0C0430E7A36F50209D68861F3B302F50886733D1A550455964D79325DEA8C76165D2704F1A426DA01F638C6A561A4805714CC658EE5EC72CB86814028C5835CC6AD858F7D973F137CB4E41B62B8E4394166B3848F0FEFD8618AB63C761D3DC6B55398FD2F3781E0312C0962D5BB069D32639A39E7CF2C9F2930F6E2E26754107E2FBDAA02C52C1A676A33173AC209E62DBC7AC08E493141993760C244ACC5C3762230D9F16EEFB38ADE3A1DAB595B6AEA341D13B71A285EBC68DAB5E473A9D42A9540C3D0F83167CEEAAABAE9226D7030303E2AD8C019A902FAB79034227BA2A8BB53F0E927E15B1FA04DCFEF93854AEE1CEED2FE0BE5F8FC31F3D88A1FE6E94C81362A331B21D0873F68DA0B27F042E43CA2C43E7992AA070BFD2A9B0589128E15F2A21999CCCB16F573CB00E0CF0EA20F0A56B08BD41C2579D0D93B0617777A3B16008A56412E47E374A55F4D8BDD85F2E21703C7C7E41376E5FBE181F5B3088746E12659E91E21E925602956A01B64B564620A5F0413306279591B54B2FF4F39FFF02EBD6DD8ED75F7F1D838383A1682B8D8DE36EE6803FF9BB9CA1DE5467285DF5D292118B189294C0307E62592CA2D6C7C8687B458906EAE4951E2B65501D0F75ECA5D3FE152A91680BB4A3C7E1247272B91848DF917D4F17D311DE150A799C74D23CAC5AB50A175F7CB1847879780ED9156C6E26D88A392C5BB874E4C93C0261BF000013AA4944415431CAC6F2082799443699C62BBBF663F58F5FC48ED7F621397B2EE6DA556446F7617278946811763D40E0DAA2259188276111EAD5ABD25D90FC194742C5AA8F1335F5DA6A322F89E2685123E12D398BBC571FC9781255B6E969FA48916430300BCEBC8FE39D58976C1EA7BA05ACB9E45C7CE1FC45B02B75346C17FB0AA3C85A2E52F4B4014BDE2DD8CD3A027A6C5614DB49A45D475EBF69D37D78ECB1C7C573D3B8A26243619E2B24042BB4D068D4555082A154E9EBA4D30AC666E47A2D9546CF9B48584DD5E24435E3950A4E09B56B413F4D905714AD4ED8BC7D5369EF4AE3A1441B4F4445147EE743B4134C5364FD763C5F118A8C8C0CE3924B2EC5EDB7AF9570EFD8D8283CCF9C0118817350C8E7E17ADE946ADD26DB6E36EBC8A6D218775D7CFF3FDEC2A67F7E12EFED1AC79C4C067E750CF5862570B350E299A40E3795062893CC85231A0FAA90D074396FCB98427C14491DF33DC8E7735C54AA75C4EA55245349544A05A4AD2EC45C07C3B55164FB8670F95F7D165FFDE29FE39414458B7CE40A07D5192E66CB62A7CC34352A9467614D982DE3C1C7B3CF3E8B0D1BEEC49E3D6F63CE9CB902A7795E3209F49091A2C3E2E6776E6ECAA0DE6CB504550AB0EA9014B6D4527C4B89765A5642153FCA20298C289E499F28A3014026183B51BEF60CA5DDAB8E665006C2BDBF29000DAD81743A8DBD7BF7A2A7A7075FFFFADFE1FAEB57209F9FD02D3963A856AB9247E1CFE90FD64DB1D71365ED7B7BB2D8F3BBFDD8F0E873D8FCC31790EAEE455F770AC56201AE65C34B7B389C1B87E72A48A404FD35C7B0DD9BFC80EB9A01EBA16CA9EF6288DC65933437815CA582DC8103387FC9C95873F315F8CCB90BD02CD4902B5A68B26F54A302D7A5B6845AD8DCEC5590A626E456321DDE79E71D3977EEDCB953D2128C629A5211698E2D245EC59B34617915185294AF9641ED52895DC9C71A29B1703FD1CAB1E2AA95414563EA61AB8E56FE2AD41AE061AF635033B08A226F713483E2DFCD441B38A276C5A62C985C2E171ACCE1C3E358B26409D6AE5D8333CF5C8262B124AFA531196F673E926BA541E677C246AC348A188A48F77D02BEEDE0E9E75FC6868D4FE1D7AFBE8E051FFF24FC660CF94219B37A7B50AA1425B9C93305031433F110F2B550E913A8F981C8A3F5245DBCB56717FAE6CEC1DF5F7705AEBEF43398D71DC3C4F89BF09B1EE256AF84BE4579427A40A90827173F8D8841051AC7238F3C827BEEB947C68BDEC8753D490D9009C1800EC787D7D3008FEDA176491572E899F4CD1BDEABEE71A3B8AFEA0C1586F58E4EF3D76CF38E41CDC4526ABD47D4A0B8C37261D0083EC8A00CB3823FD5219A8C8A49298B58B16205BEF295AF09EB82E786E8EECB4F655F5C8BDC4D86AEBD0CF27E1109DF412A7918D974370E4E76E1E1AD4F61F3D6ED982C07E81F5A806A59B506E56BA740D030F16F18812DEE9D814472A7E1CA935F5A877B81B3A461C4E0DA716160E4C6F7E32F969D87D537DF844F9D9C46DDDF8FC93C43F5196432ECA638AACA407C46456DB8AE83F1F14352BB4498FBF2CB2F8B577AF1C51771CA29A7682F43186D4B7A82B54DF4EEA644A65D0FD5B68C98094AB4B34CF8253A06D5CE48B57F8D3128C211E3818C473A524B16F39C5908860A432846633C70E0004E3D75A164FD2FB8E002D98D19B4903C15D5629B148F0CD0489267172056A9C3733328935F140BE0A5E3487829FCE7ABEFE28EEF6CC34F7EF632064E9A27CD05E80D9AD29797A5F6BA549FC45BC945718356755724BB2AD3D14C6C56258612107CD6978432A3E171CB456035303E7C080B66A7B0F2A62B71F9C5E7C16D1624A95B2C0748B341402C40A55687E528A9B17A9DF42B5BA05E6F6F9F94BE6CDCB811DBB76F9771983B77AE304F18EC61F2967FABD5AAE2AD4C30623A9C36704FCD49423C7C1894300586C798DA30CAD7CE12E818543BA3747CD7440D6ABA3799FEFB91DE595481F479803F1DC7C6A14363723EB8E8A28BB061C386B0258B54DE3602816E9249E2FFC928674F593F80E33A28D754A942A6A70F13350B3F78F2DF71E7FDDBB0B76421D3D50BDBF1E1971A483931C41BACB76235115565C934B755C5AC08EA9374CBE2C6A6F404968603FC2C36D62633A3E2C34BBA28141B8857C670CDB273B1F21B37A27F16509A98845F9E44C2756133AFC47C90A827314246E81587E32855D8EEEE1E3CF5D493B8EBAEBB255F4783A1A732B4399EB178E633B266D3CF4B5129E928B43639C18E411DDF7AFED0AF8E1A94817906D37F9041F139739D49EE727170576548989ECAECC0AB57AFC6F2E5CB05FE31B725A5E1012B80D93A46C1C65ABD0C3BA108B735963E90CFD63F287AE6EF8C16B07AE356FC60C7CF90887BE81F9C877A390FC70EE0D7E342CDA0D7909072A03886094BEBE6B1A33A397ABAF134AB68DDD4002A9500E307F7E04F162FC4FA55D7E3C2B3985C2DA358CD239DB451AFD590EDEAC5D8D838BC94271E83D4233EC878E8EFEBC7EEDD6F63EDDA7FC04F7FFA3C66CDEA15C3E186C2FB16E8CCBA2D6ABC470A2CA34189E993DF31A80FDD1C4EFC0B4CF750D128533B1E4A413E558C2849E11A2371247C2605EE71210E0F0FE3BCA54BB1F29BDFC492B3164B2E8B7C3687410642C0066B9102B8B6877285CDD89AB092094C164B88D92E322EF5D57BB1FD27AFE18E6F6FC3AEDF1DC0C0FC01E41B6524621921D93214EF0AD3BC815A9D9ECB819D484A293EFB24C659914B1E9F03E447F370FD1856DFFC45ACB8F27CC4BD0A460F1591B6D348260234A4A52ECF7AACC76241A26A584DB253571719E0317CEF7B0FE3DB1BEF938D21935670598C85C11CCA0048A77A5FA49E0955CDE6C2713ADAB846215FC7439DF8DAFE50DEC11814A35066F73406D2AE414577609E95785660C294410BAAD19274BB6FDF5E61635C76D9E558B5EA16785E12FBF7EF97A817D3244C10DB8E2DB420A59BCE9DDD470315246D17F9F11C86667F0C13BE833577FE13B6FDE8BF900F12C8F6F752231931D655356BC29D632F25C74E2097AFC34A649048D45171EA28157CD40F1671D185A7E1DE357F8B85B367A17C7812093B40CD6AA0CA8EF77617EA351260552D18D9EF648DF0C160C22F7FF92BD0E3BEF5D65BF2DDCD46429029DDED752BD0E9895A33B9512F74A4093746C5B9E0983092A8D8E6ED45363B67A80FC58C5A1F3A5306154D529A04B1395F996007BD15237FB367CFC62DB7ACC4B2659F9324E7D8D84111C667A450450E09B9B8E33711B76AE2F5B2E921E4F2C3F0524D7465E6E2B95FBD8B75776DC12BBF7D159ED7876C6A3E9AF1328AFE419681A3526E22E5F48AD7ABE60F225F1EC149030358F9B51B70F9A59F46509B40AD9C4733484A8302862AEC98A5FA033078A2FB3131ACCEB2127ADBFBEFBF1FDFFDEE03E8E9518C70425D1326E73DF28C7FA4BC5DBB531C45077C0D43EAA447750CAADD11FC7F70DD4C18146FC384DACD798A6708C340E7F3DCB9798DDA759B92B8A541DD76DB1ACC9E3D4742CFFC3BE5C7B8A8EDB827F0A95A9D403ADD8D529930AA8A386B95E022D39745C96FE0FBDB9FC55D1B9FC4482E81AEA141C02E8BDA90C54A624A8C156B28E586B1E2868BF1D52F7F1E0B7B065099AC20F02B88C51DF82CEB677FAA664C180FB55A1971491EABE475D2B1F0CC33CF487065F7EEDD181C1C1248CBE7E99D7866E426600233C66345830DED4EB33128335653A8471D0FD5EE307EB8D79D88414D87355C4C26FB6F169C818DE64CD04A66C6303939214676CB2DAB71CD3557CB40B098514A4862B644EA58B2C1A6D0B5660D5E3C059FE1F5440571CB4750B5D03BD08FBDC387B172FD7D787AE7ABB0522721E6A6D18CD55039B80F672D1CC49DAB6EC29F9DF309148B1368F05CE77AA857AB086249C458A744F9E4262B8AEBA8342A48BB69A4D31EF6BCFD2EFEF18EDBF1CC8F9F9648250D8C8187B04C2472763C1AC43BDED93567521A298DB5556038C3904F5075270F75BCF373CCEB4FC4A00C943330C71CCCA72F2EB348A21090A2A58984625433D979C61967E09E7BEEC5E9A79F2A410B7A329EB98AA5A254CE9260CB08A0913723E4A231964B25385E1AD9B4872776BE86BBBEB305BBDE7C17438343B8E68ACFE1A62F7F01191B38B86F2F0606FA91CB17A4AF2E830695725905461A0C1E9085D1405F6F9FC0BF071E78100F3DF820F2F902E6CC9D239FCBEF64A09EB9D7E963F0FB78A6E824991C14FF16B2CD7FBF335494B5D72A858F56B974F250C7B48FE3BEE0440DEA783FD0189B8188DC89B9584965E28EFCA52FDD20DC40E673B880E9E98CC19A64A7596C84948469EC27952F953077702EDE1D29E1F16D3FC49F7EFA1C5C78DEA918CF1F9630FCACEE6E1C3E34896492C117B5581954A03193C4CAC008830FAFBCF2DF58BB76AD9457F03BD02B29E8A52846D1C0CD899C978E366EC7655046A32FF266ADA0C4119E144A92A81E29BA48C7A08E77F91EFBFA0FC3A008FFCC99838B9530D09CC3DE7E7B0F162D3A4322694B972E9585CCE23B2E66322EB8C88D77E07BD4D822A659C1ACDE34F2B922BC64065EA64B58E9138786117302342D1DA44866C40BF1A06F2A6269D024F88E8C8CE2A1873663EBD6ADAA5B87A7724F86246CCE4934C42891F5443DD2F4193AB641BDDFD944FF12B31294116BB506992AD91BBD54699B77A847C73692E3B9E2C806A592A212023673733C6FFA01D71AD8673C9539C4D3B0F8A0CE422E378E42A188CB2EBB4CCAEF59D14A0FC6454E8F6216B7A2F058F0D2349871A5519EF4E0D77C58415CBAB557EB25A4BC341A4D6A59D4D1A89791E9EA12952726A0693C4F3CF1041E7E780B7EF39BDF62CE9CD902EBF8FD4C148F9F436FC96B0DE4E3F306CACED0D0846F6308C553201F09C111DD5169831AEA971BC7438126619BAB872A7D67AB7B5DB16B1A23EBA2AB8E879AE9A953EC7106013299AC8657FC0CD512946A44528334457E7266BF83615C1862AE626FAB7A2C0628D881E2C61B6FC4B5D75E2B8B5A95DA2BF8C5FFB39933375AD562900B8B11375B04514A9502DC24CB3E14644B26C901A4E25043E01E85246FBDF5563CFFFCF352A43734345B6A99A49D8F7E44A15E34D012AED9E32AC66A6FECA21EB05A2D493D14ABAA45E7486A0555A986349433EA608CF54BC56E22DE24A493E03F5562B5061FDB3C8A40949E4F467B5802DDF150ED4D4ABB572983A2024F5A75B9601366A1CA283DF93FC623EAB5B8106828CCEFA81DDA176FB278F162DC7BEFBD58B870A1404043308D063C548F270BF51A4535C94C575EC4B6791E2B4F29AF78F4D14771F7DD77CBF364C6B36A99FA19C63B99FB8E265A4DC4D2246FFF5063633C14EFB15EAF4A1E8ADD50A4F2DFF0E5796F5A9759598A82126181A1126D5656A7944395DA9ABC8CBFC679866A60D1A2451DE5D8199C49B5C3C591CD2A4A8D08AD4838583A47877ADB33F891477CAB70A7353AF7524C4B9D09EEC20DA12A917CCAC670D4B4106E1DBB5B54ABE199467CAB88A128E9676E0EF438BCD6B01A5E7AE925AC5FBF5ECA2C4C289C1E8C1EF968858B518FF1871E07730FFCC93161D8FC8D37DE10D55EE5A1D85552C456948DA8AE0921FA8B251209A585A9145A448F5A156F692FAEE9F814E720ED7F70604035F45220710A1C319052BD563FA73F502ED76D735819FCBE122CF31AE940A7AA87758B07FD3A835995A14FD1459345192949D650D5287BAAE73424E1BBEBCA4B11F3D46A3D51E51AD38356F74BD081197DB7D17B93F7921B8B481EAAEF493901A520A5EFA57550D5C290FA3E8200A94C0ADD5D5D12E5AAD71BB271D1C8A4D58BA6D2FC3116520B4651E84555B3D2C0C9C6A3D8251736611A9597D8208E9A16ED3E4873DABC7933B66DDB26C18DF9F3E74BF4CE041978BFAC59521E2FEA9AB52C8376D7D1D07FD48BB5FB3D8E7D9D3ABFB26309C3FA070EEC158DC418FF264646F5592D4FCD79D69D82E47BD319598984B4F95156A68AD54472827850C437A49D71680C2289CB174AF8CF2C43418B262838456F40493B2B4F270B4D4B3C4B5302E966A02C4114639428B40C2721A6885329FD0B3DC41133D6066B5A1A4F99882965CA4A015FE087699DA00BE5B879880496169E0FAB958D41E8EA1EBD1768E3335DD3F53D4D81007A93D1DA1C72AF5A275E75B29076EC61819DD9D9A8CCF3873C271D7B1175AE38DA08700EA955C1490B5B95EA3994A3921899B22C85E4546353DD59C03408500B596080AC61E3315A06217FD57DA3A65671B6821BC62B857A666230DA03E94E7DB2D0229FAF3F4D9448A58FAB5E6BEABB2B63332EC32CE9D03B85CD97F5EB8C07112CDF52706A7D9E0ABE28B8D3F27C2D7D0DADFCA48D31F478467F2374FBBAF58F8609A173D65EDC18730B4AEBE96B4A9B2F65E8E1C61371EEDAF04DEAC2C863AB0C87BE27DD8645A9236964A1E7468DADF696A10FD57310DEAFDE4CCD39DA1CBCF5E6168A3486D2DC4A9DA4358B916A5DF95C1D190EF7CA087A08BB6928B4D2D2808CC81AEBF736F2CEF249E675F2B2C8CEAD5BCA180D94B075935E22613BA61029882A8C39EDE8038DD653D1ABAB25AEAC505474AB0BD779441DCC84C8C3EF48C8172EEA0874315ED7740D3109DE16D66EA1B62962B3D1FCF051CCFE4897B402F466973733A290A50101AD44730466E94BDFFF71FA5511B817B147ED65153C350A3611F711BE9D7A4E1BBE0178DA98A2D0751A1A9CF6FAF721641551550037DC2C14AC30703BF27FBD5AA6A70B5BBFB70CCC8050592A219E9FB234A64C994A37B6C2C0D1319EBAA3456721AA366C56B0DE94D416A11748EBC8FEBE0F8D6C906A14CC917FFA7868A39A324AD1D99E7AEFAD816F9D1A5A65F891EF13BD5003F1308364F63C3D6D475ACAD16F69E641CE501D87DF1981CE08CCCC08740C6A66C6B1F32E9D115000BFE3A13A2BA133023337021D839AB9B1ECBC53670454946FA609869D71ED8CC047750424A8315D5DF4A33A189DFBEE8CC0898E801894F4EB89482D9DE89B765EDF19818FE208901411BB72F9F2E6E3DBB6C9FD773CD547711974EE792646804C783EFE0F0A507581F460CF450000000049454E44AE426082 WHERE `app_id` = '8';
+
+-- for R1 Enhanced Notification ticket source from JIRA
+INSERT INTO `ep_basic_auth_account` VALUES (1,'JIRA','jira','6APqvG4AU2rfLgCvMdySwQ==','Y');
+
 commit;
 commit;
index 99832c8..c3a208c 100644 (file)
@@ -1,6 +1,6 @@
 This directory has configuration files for building docker images,
 and management files for starting and stopping docker containers.
 
 This directory has configuration files for building docker images,
 and management files for starting and stopping docker containers.
 
-The Apps_Users_OnBoarding_Script.sql file has data for ONAP demo deployments:
+[PORTAL-106] The Apps_Users_OnBoarding_Script.sql file has data for ONAP demo deployments:
 it adds users and applications so the Portal app has meaningful content on
 startup.  These were moved from script EcompPortalDMLMySql_1707_OS.sql.
 it adds users and applications so the Portal app has meaningful content on
 startup.  These were moved from script EcompPortalDMLMySql_1707_OS.sql.
index 1084295..5306c2a 100644 (file)
@@ -1,6 +1,6 @@
 #mysql
 #mysql
-db.driver = com.mysql.jdbc.Driver
-db.connectionURL = jdbc:mysql://portal-db:3306/portal
+db.driver = org.mariadb.jdbc.Driver
+db.connectionURL = jdbc:mariadb:failover://portal-db:3306/portal
 db.userName =root
 db.password =Aa123456
 db.hib.dialect = org.hibernate.dialect.MySQLDialect
 db.userName =root
 db.password =Aa123456
 db.hib.dialect = org.hibernate.dialect.MySQLDialect
@@ -95,3 +95,6 @@ external_access_enable = false
 
 #delete auditlog from number of days ago
 auditlog_del_day_from = 365
 
 #delete auditlog from number of days ago
 auditlog_del_day_from = 365
+
+#External system notification URL
+external_system_notification_url= https://jira.onap.org/browse/
diff --git a/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCatalogItemTest.java b/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCatalogItemTest.java
new file mode 100644 (file)
index 0000000..6fb8914
--- /dev/null
@@ -0,0 +1,35 @@
+package com.openecomp.portalapp.portal.ecomp.test.model;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppCatalogItem;
+
+public class AppCatalogItemTest {
+
+       public AppCatalogItem mockAppCatalogItem(){
+               AppCatalogItem appCatalogItem = new AppCatalogItem();
+               
+               appCatalogItem.setAlternateUrl("test");
+               appCatalogItem.setMlAppName("test");
+               
+               return appCatalogItem;
+       }
+       
+       @Test
+       public void appCatalogItemTest(){
+               AppCatalogItem appCatalogItem = mockAppCatalogItem();
+               
+               AppCatalogItem appCatalogItem1 = new AppCatalogItem();
+               appCatalogItem1.setAlternateUrl("test");
+               appCatalogItem1.setMlAppName("test");
+               
+               assertEquals(appCatalogItem.getAlternateUrl(), appCatalogItem1.getAlternateUrl());
+               assertEquals(appCatalogItem.getMlAppName(), appCatalogItem1.getMlAppName());
+
+               assertEquals(appCatalogItem.toString(), "AppCatalogItem [id=null, name=null, access=null, select=null, pending=null]");
+               assertEquals(appCatalogItem.hashCode(), appCatalogItem1.hashCode());
+               assertTrue(appCatalogItem.equals(appCatalogItem1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCategoryFunctionsItemTest.java b/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppCategoryFunctionsItemTest.java
new file mode 100644 (file)
index 0000000..74e74b3
--- /dev/null
@@ -0,0 +1,42 @@
+package com.openecomp.portalapp.portal.ecomp.test.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppCategoryFunctionsItem;
+
+public class AppCategoryFunctionsItemTest {
+
+       public AppCategoryFunctionsItem mockAppCategoryFunctionsItem(){
+               AppCategoryFunctionsItem appCategoryFunctionsItem = new AppCategoryFunctionsItem();
+               
+               appCategoryFunctionsItem.setRowId("test");
+               appCategoryFunctionsItem.setAppId("test");
+               appCategoryFunctionsItem.setApplication("test");
+               appCategoryFunctionsItem.setFunctions("test");
+               
+               return appCategoryFunctionsItem;
+       }
+       
+       @Test
+       public void appCategoryFunctionsItemTest(){
+               AppCategoryFunctionsItem appCategoryFunctionsItem = mockAppCategoryFunctionsItem();
+               
+               AppCategoryFunctionsItem appCategoryFunctionsItem1 = new AppCategoryFunctionsItem();
+               
+               appCategoryFunctionsItem1.setRowId("test");
+               appCategoryFunctionsItem1.setAppId("test");
+               appCategoryFunctionsItem1.setApplication("test");
+               appCategoryFunctionsItem1.setFunctions("test");
+               
+               assertEquals(appCategoryFunctionsItem.getRowId(), appCategoryFunctionsItem1.getRowId());
+               assertEquals(appCategoryFunctionsItem.getAppId(), appCategoryFunctionsItem1.getAppId());
+               assertEquals(appCategoryFunctionsItem.getApplication(), appCategoryFunctionsItem1.getApplication());
+               assertEquals(appCategoryFunctionsItem.getFunctions(), appCategoryFunctionsItem1.getFunctions());
+               assertEquals(appCategoryFunctionsItem.toString(), "AppCategoryFunctionsItem [rowId=test, appId=test, application=test, category=null, functions=test]");
+               assertEquals(appCategoryFunctionsItem.hashCode(), appCategoryFunctionsItem1.hashCode());
+               assertTrue(appCategoryFunctionsItem.equals(appCategoryFunctionsItem1));
+
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppContactUsItemTest.java b/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/AppContactUsItemTest.java
new file mode 100644 (file)
index 0000000..4153928
--- /dev/null
@@ -0,0 +1,49 @@
+package com.openecomp.portalapp.portal.ecomp.test.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppContactUsItem;
+
+public class AppContactUsItemTest {
+       
+       public AppContactUsItem mockAppContactUsItem(){
+               AppContactUsItem appContactUsItem = new AppContactUsItem();
+                               
+               appContactUsItem.setAppId((long)1);
+               appContactUsItem.setAppName("test");
+               appContactUsItem.setDescription("test");
+               appContactUsItem.setContactName("test");
+               appContactUsItem.setContactEmail("test");
+               appContactUsItem.setUrl("test");
+               appContactUsItem.setActiveYN("test");
+               
+               return appContactUsItem;
+       }
+
+       @Test
+       public void appContactUsItemTest(){
+               AppContactUsItem appContactUsItem = mockAppContactUsItem();
+               
+               AppContactUsItem appContactUsItem1 = new AppContactUsItem();
+               appContactUsItem1.setAppId((long)1);
+               appContactUsItem1.setAppName("test");
+               appContactUsItem1.setDescription("test");
+               appContactUsItem1.setContactName("test");
+               appContactUsItem1.setContactEmail("test");
+               appContactUsItem1.setUrl("test");
+               appContactUsItem1.setActiveYN("test");
+               
+               assertEquals(appContactUsItem.getAppId(), appContactUsItem1.getAppId());
+               assertEquals(appContactUsItem.getAppName(), appContactUsItem1.getAppName());
+               assertEquals(appContactUsItem.getDescription(), appContactUsItem1.getDescription());
+               assertEquals(appContactUsItem.getContactName(), appContactUsItem1.getContactName());
+               assertEquals(appContactUsItem.getContactEmail(), appContactUsItem1.getContactEmail());
+               assertEquals(appContactUsItem.getUrl(), appContactUsItem1.getUrl());
+               assertEquals(appContactUsItem.getActiveYN(), appContactUsItem1.getActiveYN());
+               assertEquals(appContactUsItem.toString(), "AppContactUsItem [appId=1, appName=test, description=test, contactName=test, contactEmail=test, url=test, activeYN=test]");
+               assertEquals(appContactUsItem.hashCode(), appContactUsItem1.hashCode());
+               assertTrue(appContactUsItem.equals(appContactUsItem1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/SearchResultItemTest.java b/ecomp-portal-BE-common-test/src/main/java/com/openecomp/portalapp/portal/ecomp/test/model/SearchResultItemTest.java
new file mode 100644 (file)
index 0000000..97e3be6
--- /dev/null
@@ -0,0 +1,41 @@
+package com.openecomp.portalapp.portal.ecomp.test.model;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.SearchResultItem;
+
+public class SearchResultItemTest {
+
+       public SearchResultItem mockSearchResultItem(){
+               SearchResultItem searchResultItem = new SearchResultItem();
+                               
+               searchResultItem.setRowId("test");
+               searchResultItem.setCategory("test");
+               searchResultItem.setName("test");
+               searchResultItem.setTarget("test");
+               searchResultItem.setUuid("test");
+               
+               return searchResultItem;
+       }
+       
+       @Test
+       public void searchResultItemTest(){
+               SearchResultItem searchResultItem = mockSearchResultItem();
+               
+               SearchResultItem searchResultItem1 = new SearchResultItem();
+               searchResultItem1.setRowId("test");
+               searchResultItem1.setCategory("test");
+               searchResultItem1.setName("test");
+               searchResultItem1.setTarget("test");
+               searchResultItem1.setUuid("test");
+               
+               assertEquals(searchResultItem.getRowId(), searchResultItem.getRowId());
+               assertEquals(searchResultItem.getCategory(), searchResultItem.getCategory());
+               assertEquals(searchResultItem.getName(), searchResultItem.getName());
+               assertEquals(searchResultItem.getTarget(), searchResultItem.getTarget());
+               assertEquals(searchResultItem.getUuid(), searchResultItem.getUuid());
+               assertEquals(searchResultItem.toString(), searchResultItem.toString());
+
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImplTest.java
new file mode 100644 (file)
index 0000000..23e4c28
--- /dev/null
@@ -0,0 +1,28 @@
+package org.openecomp.portalapp.lm;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+
+public class FusionLicenseManagerImplTest {
+
+               
+       @Test
+       public void FusionLicenseManagerImplTest(){
+               FusionLicenseManagerImpl fusionLicenseManagerImpl = new FusionLicenseManagerImpl();
+               
+               String nvlReturn = null;
+               
+               int installLicenseInt = fusionLicenseManagerImpl.installLicense();      
+               nvlReturn = fusionLicenseManagerImpl.nvl("test");               
+               Date expiredDateReturn = fusionLicenseManagerImpl.getExpiredDate();
+               
+               assertEquals(installLicenseInt, 0);             
+               assertEquals(nvlReturn, null); 
+               assertEquals(expiredDateReturn, null);  
+       
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImplTest.java
new file mode 100644 (file)
index 0000000..1d9f4a6
--- /dev/null
@@ -0,0 +1,30 @@
+package org.openecomp.portalapp.lm;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileNotFoundException;
+
+import org.junit.Test;
+
+public class LicenseableClassImplTest {
+
+       @Test
+       public void licenseableClassImplTest() throws FileNotFoundException{
+               LicenseableClassImpl licenseableClassImpl = new LicenseableClassImpl();
+               
+               String appNameReturn = licenseableClassImpl.getApplicationName();
+               java.io.InputStream inputStream = licenseableClassImpl.getPublicKeystoreAsInputStream();
+               String aliasReturn = licenseableClassImpl.getAlias();
+               String pswdReturn = licenseableClassImpl.getKeyPasswd();
+               String pkPswd = licenseableClassImpl.getPublicKeystorePassword();
+               String cpPswd = licenseableClassImpl.getCipherParamPassword();
+               
+               assertEquals(appNameReturn, "");
+               assertEquals(inputStream, null);
+               assertEquals(aliasReturn, "");
+               assertEquals(pswdReturn, "");
+               assertEquals(pkPswd, "");
+               assertEquals(cpPswd, "");
+               
+       }
+}
index 52993d6..1db5552 100644 (file)
@@ -67,8 +67,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Missing required field: email, loginId, or loginPwd");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Missing required field: email, loginId, or loginPwd");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
@@ -82,8 +81,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("java.lang.NullPointerException");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("java.lang.NullPointerException");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
@@ -100,8 +98,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
@@ -120,8 +117,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
@@ -142,8 +138,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
@@ -175,8 +170,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FieldsValidator [httpStatusCode=500, errorCode=null, fields=null]");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FieldsValidator [httpStatusCode=500, errorCode=null, fields=null]");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
                EPUser user = mockUser.mockEPUser();
                user.setEmail("guestT@test.portal.onap.org");
                user.setLoginPwd("pwd");
@@ -210,8 +204,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Unexpected field: id");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Unexpected field: id");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
 
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = (long) 1;
 
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = (long) 1;
@@ -227,8 +220,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                expectedportalRestResponse.setMessage(
                                "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
                expectedportalRestResponse.setResponse(null);
                expectedportalRestResponse.setMessage(
                                "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
 
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = null;
 
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = null;
@@ -244,8 +236,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Unexpected value for field: id");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Unexpected value for field: id");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                Long appId = null;
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = null;
                Long appId = null;
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = null;
@@ -261,8 +252,7 @@ public class AppsControllerExternalRequestTest extends MockitoTestSuite {
                expectedportalRestResponse.setMessage(
                                "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
                expectedportalRestResponse.setResponse(null);
                expectedportalRestResponse.setMessage(
                                "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                Long appId = (long) 1;
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = (long) 1;
                Long appId = (long) 1;
                OnboardingApp expectedOnboardingApp = new OnboardingApp();
                expectedOnboardingApp.id = (long) 1;
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/AuditLogControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/AuditLogControllerTest.java
new file mode 100644 (file)
index 0000000..33079b0
--- /dev/null
@@ -0,0 +1,102 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.controller.AuditLogController;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(EPUserUtils.class)
+public class AuditLogControllerTest {
+
+       
+       @Mock
+       AuditService auditService;
+       
+       @InjectMocks
+     AuditLogController auditLogController = new AuditLogController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       @Test
+       public void auditLogTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+       
+       @Test
+       public void auditLogTabTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "tab", "test");
+       }
+       
+       @Test
+       public void auditLogfunctionalTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "functional", "test");
+       }
+       
+       @Test
+       public void auditLogleftMenuTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "leftMenu", "test");
+       }
+       
+       @Test(expected = NumberFormatException.class)
+       public void auditLogExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+       
+       @Test
+       public void auditLogerrorTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenThrow(nullPointerException);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+}
index b621d9a..e4d34ce 100644 (file)
@@ -66,7 +66,6 @@ public class BEPropertyReaderControllerTest extends MockitoTestSuite {
                PowerMockito.mockStatic(SystemProperties.class);
                Mockito.when(new BEProperty(key, SystemProperties.getProperty(key))).thenThrow(nullPointerException);
                actualPortalRestResponse = bEPropertyReaderController.readProperty(mockedRequest, key);
                PowerMockito.mockStatic(SystemProperties.class);
                Mockito.when(new BEProperty(key, SystemProperties.getProperty(key))).thenThrow(nullPointerException);
                actualPortalRestResponse = bEPropertyReaderController.readProperty(mockedRequest, key);
-               System.out.println(actualPortalRestResponse);
                assertTrue(actualPortalRestResponse.equals(ecpectedPortalRestResponse));
 
        }
                assertTrue(actualPortalRestResponse.equals(ecpectedPortalRestResponse));
 
        }
index 7050527..8f9549c 100644 (file)
@@ -86,8 +86,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               expectedResponse.setStatus(PortalRestStatusEnum.OK);
                long accountd = 1;
 
                Mockito.when(basicAuthAccountService.saveBasicAuthAccount(basicAuthCredentials)).thenReturn(accountd);
                long accountd = 1;
 
                Mockito.when(basicAuthAccountService.saveBasicAuthAccount(basicAuthCredentials)).thenReturn(accountd);
@@ -106,8 +105,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
 
                PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
                                mockedResponse, basicAuthCredentials);
 
                PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
                                mockedResponse, basicAuthCredentials);
@@ -123,8 +121,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("FAILURE");
                expectedResponse.setResponse("newBasicAuthAccount cannot be null or empty");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("FAILURE");
                expectedResponse.setResponse("newBasicAuthAccount cannot be null or empty");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
                                mockedResponse, basicAuthCredentials);
                assertEquals(actualResponse, expectedResponse);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
                                mockedResponse, basicAuthCredentials);
                assertEquals(actualResponse, expectedResponse);
@@ -139,8 +136,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
 
                expectedPortalResponse.setMessage("Success");
                expectedPortalResponse.setResponse(null);
 
                expectedPortalResponse.setMessage("Success");
                expectedPortalResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedPortalResponse.setStatus(portalRestStatusEnum.OK);
+               expectedPortalResponse.setStatus(PortalRestStatusEnum.OK);
 
                EPUser user = mockUser.mockEPUser();
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
 
                EPUser user = mockUser.mockEPUser();
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
@@ -161,8 +157,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
 
                expectedPortalResponse.setMessage("UnAuthorized! Admin Only Operation");
                expectedPortalResponse.setResponse(new ArrayList<>());
 
                expectedPortalResponse.setMessage("UnAuthorized! Admin Only Operation");
                expectedPortalResponse.setResponse(new ArrayList<>());
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedPortalResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedPortalResponse.setStatus(PortalRestStatusEnum.ERROR);
 
                EPUser user = mockUser.mockEPUser();
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
 
                EPUser user = mockUser.mockEPUser();
                Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
@@ -183,8 +178,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               expectedResponse.setStatus(PortalRestStatusEnum.OK);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
@@ -201,8 +195,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
@@ -219,8 +212,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("FAILURE");
                expectedResponse.setResponse("BasicAuthCredentials cannot be null or empty");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("FAILURE");
                expectedResponse.setResponse("BasicAuthCredentials cannot be null or empty");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
                long accountd = 1;
                PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
                                mockedResponse, accountd, basicAuthCredentials);
@@ -235,8 +227,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("SUCCESS");
                expectedResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               expectedResponse.setStatus(PortalRestStatusEnum.OK);
                long accountd = 1;
                Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
                long accountd = 1;
                Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
@@ -252,8 +243,7 @@ public class BasicAuthAccountControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("Authorization Required");
                expectedResponse.setResponse("Admin Only Operation! ");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                long accountd = 1;
                Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
                long accountd = 1;
                Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
                PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/DashboardControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/DashboardControllerTest.java
new file mode 100644 (file)
index 0000000..eed560d
--- /dev/null
@@ -0,0 +1,427 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.controller.DashboardController;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.CommonWidget;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.domain.support.CollaborateList;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EPUserUtils.class, CollaborateList.class, SystemProperties.class, EPCommonSystemProperties.class})
+public class DashboardControllerTest {
+       
+       @Mock
+       DashboardSearchService searchService = new DashboardSearchServiceImpl();
+       
+       @InjectMocks
+       DashboardController dashboardController = new DashboardController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       public CommonWidgetMeta mockCommonWidgetMeta() {
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("testhref");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("testDate");
+           commonWidget.setSortOrder(1);                   
+               widgetList.add(commonWidget);           
+               commonWidgetMeta.setItems(widgetList);
+               
+               return commonWidgetMeta;
+       }
+       
+       public CommonWidget mockCommonWidget() {
+               
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("testhref");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("testDate");
+           commonWidget.setSortOrder(1);
+           
+           return commonWidget;
+       }
+       
+       
+       @Test
+       public void getWidgetDataTest() throws IOException {
+               
+               String resourceType = null;
+               PortalRestResponse<CommonWidgetMeta> expectedData = new PortalRestResponse<CommonWidgetMeta>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Unexpected resource type null");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<CommonWidgetMeta> actualResponse =   dashboardController.getWidgetData(mockedRequest, resourceType);
+               assertEquals(expectedData,actualResponse);              
+       }       
+       
+       @Test
+       public void getWidgetDataWithValidResourceTest() throws IOException {
+               String resourceType = "EVENTS";
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory(null);
+                               
+               Mockito.when(searchService.getWidgetData(resourceType)).thenReturn(commonWidgetMeta);
+               PortalRestResponse<CommonWidgetMeta> expectedData = new PortalRestResponse<CommonWidgetMeta>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(commonWidgetMeta);
+               
+               PortalRestResponse<CommonWidgetMeta> actualResponse = dashboardController.getWidgetData(mockedRequest, resourceType);
+               System.out.println(actualResponse);
+               assertEquals(expectedData,actualResponse);
+       }
+               
+       @Test
+       public void saveWidgetDataBulkNullTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory(null);
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("ERROR");
+               expectedData.setResponse("Category cannot be null or empty");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetUnexpectedDataBulkTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory("Unexpected Data");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Unexpected resource type Unexpected Data");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+               
+       @Test
+       public void saveWidgetInvalidDataBulkTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory("EVENTS");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Invalid category: test");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataBulkTest() throws IOException {
+               
+               List<CommonWidget> widgetList = new ArrayList<>();              
+               CommonWidget commonWidget = new CommonWidget("EVENTS", "http://test.com", "testTitle", "testcontent", "2017-07-01", 1);
+               widgetList.add(commonWidget);
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta("EVENTS", widgetList);
+               
+                                   
+                               
+       /*      commonWidgetMeta.setItems(widgetList);
+               
+               commonWidgetMeta.setCategory("EVENTS");*/
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("success");
+               
+               Mockito.when(searchService.saveWidgetDataBulk(commonWidgetMeta)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataNullTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget(); 
+               commonWidget.setId((long)1);
+               commonWidget.setContent("test");
+               commonWidget.setCategory(null);
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("ERROR");
+               expectedData.setResponse("Category cannot be null or empty");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+       
+       @Test
+       public void saveWidgetDataErrorTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget();         
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Invalid category: test");
+               expectedData.setResponse(null); 
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataTest() throws IOException {
+                               
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("EVENTS");
+               commonWidget.setHref("http://test.com");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("2017-07-01");
+           commonWidget.setSortOrder(1);                   
+               widgetList.add(commonWidget);           
+               commonWidgetMeta.setItems(widgetList);
+               
+               commonWidgetMeta.setCategory("EVENTS");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("success"); 
+               
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+       
+       @Test
+       public void deleteWidgetDataTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget();
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(null); 
+               
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.deleteWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+               
+       @Test
+       public void getActiveUsersTest(){
+               List<String> activeUsers = new ArrayList<>();
+               List<String> expectedUsersList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenReturn(activeUsers);
+               expectedUsersList=      dashboardController.getActiveUsers(mockedRequest);
+               assertEquals(expectedUsersList, activeUsers);
+       }
+       
+       
+       @Test
+       public void getActiveUsersExceptionTest(){
+               List<String> activeUsers = new ArrayList<>();
+               List<String> expectedUsersList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenThrow(nullPointerException);
+               expectedUsersList = dashboardController.getActiveUsers(mockedRequest);
+               assertEquals(expectedUsersList, activeUsers);
+       }
+               
+       @Test
+       public void getOnlineUserUpdateRateTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("{onlineUserUpdateRate=1400000, onlineUserUpdateDuration=1400000}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_RATE)).thenReturn("1400"); 
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_DURATION)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getOnlineUserUpdateRate(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getOnlineUserUpdateRateExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_RATE)).thenThrow(nullPointerException); 
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_DURATION)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getOnlineUserUpdateRate(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForRightMenuTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("{windowWidth=1400}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_RIGHT_MENU)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForRightMenu(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForRightMenuExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_RIGHT_MENU)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForRightMenu(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForLeftMenuTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");             
+               expectedData.setResponse("{windowWidth=1400}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_LEFT_MENU)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForLeftMenu(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForLeftMenuExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_LEFT_MENU)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForLeftMenu(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+               
+       @Test
+       public void getActiveUsersNullTest(){
+               PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("User object is null? - check logs");
+               expectedData.setResponse(new ArrayList<>()); 
+
+               PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void activeUsersTest(){
+               EPUser user = mockUser.mockEPUser();
+               PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(new ArrayList<>()); 
+               PowerMockito.mockStatic(EPUserUtils.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+//     @Test
+//     public void activeUsersExceptionTest(){
+//             EPUser user = mockUser.mockEPUser();
+//             user.setLoginId("test");
+//             String loginId = "abc";
+//             PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+//             expectedData.setStatus(PortalRestStatusEnum.ERROR);
+//             expectedData.setMessage("java.lang.NullPointerException");
+//             expectedData.setResponse(null);  
+//             
+////           PowerMockito.mockStatic(EPUserUtils.class);
+//             Mockito.when(searchService.getRelatedUsers(user.getLoginId(user.getLoginId()))).thenReturn(nullPointerException);
+//             PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+//             System.out.println(actualResponse);
+//             //assertEquals(expectedData,actualResponse);
+//     }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/EPFusionBaseControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/EPFusionBaseControllerTest.java
new file mode 100644 (file)
index 0000000..683738b
--- /dev/null
@@ -0,0 +1,64 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.EPFusionBaseController;
+import org.openecomp.portalapp.portal.controller.DashboardController;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EPUserUtils.class, SystemProperties.class})
+public class EPFusionBaseControllerTest {
+
+       @Mock
+       DashboardSearchService searchService = new DashboardSearchServiceImpl();
+       
+       @InjectMocks
+       EPFusionBaseController epFusionBaseController; /*= mock(EPFusionBaseController.class);*/
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Test
+       public void messagesTest(){
+               Map<String, Object> expectedData = new HashMap<String, Object>();
+               Map<String, Object> actualData = null;
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.APPLICATION_MENU_ATTRIBUTE_NAME)).then(null);
+               actualData = epFusionBaseController.messages(mockedRequest);
+               System.out.println();
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/ExternalAccessRolesControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/ExternalAccessRolesControllerTest.java
new file mode 100644 (file)
index 0000000..d2e1b13
--- /dev/null
@@ -0,0 +1,509 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.controller.ExternalAccessRolesController;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesService;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.AuditLog;
+import org.openecomp.portalsdk.core.domain.Role;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
+public class ExternalAccessRolesControllerTest {
+
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService = new ExternalAccessRolesServiceImpl();
+
+       @InjectMocks
+       ExternalAccessRolesController externalAccessRolesController = new ExternalAccessRolesController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       @Mock
+       AuditLog auditLog = new AuditLog();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Failed");
+
+       MockEPUser mockUser = new MockEPUser();
+       String loginId = "guestT";
+       String uebKey = "testUebKey";
+
+       @Test
+       public void getUserTest() throws Exception {
+                List<EPUser> userList = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getUser(loginId)).thenReturn(userList);
+               assertNull(externalAccessRolesController.getUser(mockedRequest, mockedResponse, loginId));
+       }
+
+       @Test
+       public void getUserExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getUser(loginId))
+                               .thenThrow(nullPointerException);
+               assertNull(externalAccessRolesController.getUser(mockedRequest, mockedResponse, loginId));
+       }
+       
+       public EPApp mockApp()
+       {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+       
+       @Test
+       public void getRolesForAppTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               Mockito.when(externalAccessRolesService.getRolesForApp(mockedRequest.getHeader(uebKey))).thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRolesForApp(mockedRequest, mockedResponse), answer);
+       }
+
+       @Test
+       public void getRolesForAppExceptionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               Mockito.when(externalAccessRolesService.getRolesForApp(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRolesForApp(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getRoleFunctionsListTest() throws Exception {
+               List<CentralRoleFunction> answer = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getRoleFuncList(mockedRequest.getHeader(uebKey))).thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRoleFunctionsList(mockedRequest, mockedResponse), answer);
+       }
+
+       @Test
+       public void getRoleFunctionsListExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getRoleFuncList(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleFunctionsList(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getRoleInfoTest() throws Exception {
+               CentralRole answer = new CentralRole();
+               long roleId = 1;
+               Mockito.when(externalAccessRolesService.getRoleInfo(roleId, mockedRequest.getHeader(uebKey)))
+                               .thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRoleInfo(mockedRequest, mockedResponse, roleId), answer);
+       }
+
+       @Test
+       public void getRoleInfoExceptionTest() throws Exception {
+               long roleId = 1;
+               Mockito.when(externalAccessRolesService.getRoleInfo(roleId, mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleInfo(mockedRequest, mockedResponse, roleId));
+       }
+
+       @Test
+       public void getRoleFunctionTest() throws Exception {
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               String code = "test_menu";
+               Mockito.when(externalAccessRolesService.getRoleFunction(code, mockedRequest.getHeader(uebKey)))
+                               .thenReturn(centralRoleFunction);
+               assertEquals(externalAccessRolesController.getRoleFunction(mockedRequest, mockedResponse, code),
+                               centralRoleFunction);
+       }
+
+       @Test
+       public void getRoleFunctionExceptionTest() throws Exception {
+               String code = "test_menu";
+               Mockito.when(externalAccessRolesService.getRoleFunction(code, mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleFunction(mockedRequest, mockedResponse, code));
+       }
+
+       @Test
+       public void saveRoleFunctionIfIsIsNotDeletedTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenReturn(false);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionExceptionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenThrow(nullPointerException);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               System.out.println(portalRestResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenReturn(true);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               System.out.println(portalRestResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+//     @Test
+//     public void deleteRoleFunctionTest() throws Exception {
+//             PortalRestResponse<String> portalRestResponse = null;
+//             PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+//             expectedportalRestResponse.setMessage("Successfully Deleted");
+//             expectedportalRestResponse.setResponse("Success");
+//             PortalRestStatusEnum portalRestStatusEnum = null;
+//             EPUser user = mockUser.mockEPUser();
+//             EPApp app = mockApp();
+//             expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+//             String code ="testNew";
+//             Mockito.when(externalAccessRolesService.getUser(mockedRequest.getHeader("LOGIN_ID"))).thenReturn((List<EPUser>) user);
+//             Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader("UEBKEY")).get(0)).thenReturn(app);
+//             Mockito.when(externalAccessRolesService.deleteCentralRoleFunction(code, app)).thenReturn(true);
+//             portalRestResponse = externalAccessRolesController.deleteRoleFunction(mockedRequest, mockedResponse, code);
+//             assertEquals(portalRestResponse, expectedportalRestResponse);
+//     }
+
+       @Test
+       public void getActiveRolesTest() throws Exception {
+               List<CentralRole> cenRole = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getActiveRoles(mockedRequest.getHeader(uebKey))).thenReturn(cenRole);
+               List<CentralRole> expectedCenRole = externalAccessRolesController.getActiveRoles(mockedRequest, mockedResponse);
+               assertEquals(expectedCenRole, cenRole);
+       }
+
+       @Test
+       public void getActiveRolesExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getActiveRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getActiveRoles(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void deleteDependcyRoleRecordExceptionTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to deleteDependencyRoleRecord");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               long roleId = 123;
+               portalRestResponse = externalAccessRolesController.deleteDependencyRoleRecord(mockedRequest, mockedResponse, roleId);
+               assertEquals(expectedportalRestResponse, portalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadFunctionsTest() throws Exception {
+               Integer result = 0;
+               Mockito.when(externalAccessRolesService.bulkUploadFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               portalRestResponse = externalAccessRolesController.bulkUploadFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadFunctionsExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadFunctions");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRolesTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadRoles(mockedRequest.getHeader(uebKey))).thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRolesTestException() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadRoles");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRoleFunctionsTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadRolesFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoleFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRoleFunctionsException() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadRolesFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadRoleFunctions");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoleFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadUserRolesTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadUserRoles(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadUserRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadUserRolesExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadUserRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadUserRoles");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadUserRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadPartnerFunctionsTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerFunctions(mockedRequest, mockedResponse, null);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+
+       @Test
+       public void bulkUploadPartnerRolesTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoles(mockedRequest, mockedResponse,
+                               upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+        @Test
+        public void bulkUploadPartnerRolesExceptionTest() throws Exception
+        {
+                ExternalAccessRolesService externalAccessRolesService = null;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoles(mockedRequest, mockedResponse,
+                               upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+        }
+
+       @Test
+       public void getMenuFunctionsTest() throws Exception {
+               List<String> functionsList = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getMenuFunctionsList(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(functionsList);
+               List<String> expectedFunctionsList = externalAccessRolesController.getMenuFunctions(mockedRequest,
+                               mockedResponse);
+               assertEquals(functionsList, expectedFunctionsList);
+       }
+
+       @Test
+       public void getMenuFunctionsExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getMenuFunctionsList(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getMenuFunctions(mockedRequest, mockedResponse));
+       }
+
+//     @Test
+//     public void getUsersOfApplicationTest() throws Exception {
+//             List<String> users = new ArrayList<>();
+//             Mockito.when(externalAccessRolesService.getAllUsers(mockedRequest.getHeader(uebKey))).thenReturn(users);
+//             List<String> expectedusers = externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse);
+//             assertEquals(users, expectedusers);
+//     }
+
+//     @Test
+//     public void getUsersOfApplicationExceptionTest() throws Exception {
+//             Mockito.when(externalAccessRolesService.getAllUsers(mockedRequest.getHeader(uebKey)))
+//                             .thenThrow(httpClientErrorException);
+//             assertNull(externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse));
+//     }
+       
+       @Test
+       public void saveRoleExceptionTest() throws Exception {
+               Role role = new Role();
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to saveRole");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.saveRole(mockedRequest, mockedResponse,role);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void deleteRoleExceptionTest() throws Exception {
+               String role = "TestNew";
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to deleteRole for 'TestNew'");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.deleteRole(mockedRequest, mockedResponse,role);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       
+       @Test
+       public void bulkUploadPartnerRoleFunctionsTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoleFunctions(mockedRequest, mockedResponse,upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+}
index 6e1b5d1..03e2107 100644 (file)
@@ -40,21 +40,32 @@ import org.mockito.MockitoAnnotations;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.openecomp.portalapp.portal.controller.FunctionalMenuController;
 import org.openecomp.portalapp.portal.domain.EPUser;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.openecomp.portalapp.portal.controller.FunctionalMenuController;
 import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
 import org.openecomp.portalapp.portal.service.AdminRolesService;
 import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
 import org.openecomp.portalapp.portal.service.FunctionalMenuService;
 import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
 import org.openecomp.portalapp.portal.service.AdminRolesService;
 import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
 import org.openecomp.portalapp.portal.service.FunctionalMenuService;
 import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.service.SearchService;
 import org.openecomp.portalapp.portal.test.core.MockEPUser;
 import org.openecomp.portalapp.portal.test.framework.MockitoTestSuite;
 import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;
 import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRolesList;
 import org.openecomp.portalapp.portal.test.core.MockEPUser;
 import org.openecomp.portalapp.portal.test.framework.MockitoTestSuite;
 import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;
 import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRolesList;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
 import org.openecomp.portalapp.portal.transport.FieldsValidator;
 import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
 import org.openecomp.portalapp.portal.transport.FieldsValidator;
 import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItemWithRoles;
 import org.openecomp.portalapp.util.EPUserUtils;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.openecomp.portalapp.util.EPUserUtils;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 
 
-@RunWith(MockitoJUnitRunner.class)
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
 public class FunctionalMenuControllerTest extends MockitoTestSuite {
 
        String userid = "ab1234";
 public class FunctionalMenuControllerTest extends MockitoTestSuite {
 
        String userid = "ab1234";
@@ -67,6 +78,9 @@ public class FunctionalMenuControllerTest extends MockitoTestSuite {
 
        @Mock
        private DataAccessService dataAccessService;
 
        @Mock
        private DataAccessService dataAccessService;
+       
+       @Mock
+       SearchService searchService;
 
        @Mock
        AdminRolesService adminRolesService = new AdminRolesServiceImpl();
 
        @Mock
        AdminRolesService adminRolesService = new AdminRolesServiceImpl();
@@ -184,5 +198,309 @@ public class FunctionalMenuControllerTest extends MockitoTestSuite {
                acutualFieldValidator = functionalMenuController.regenerateAncestorTable(mockedRequest, mockedResponse);
                assertTrue(acutualFieldValidator.equals(expectedFieldValidator));
        }
                acutualFieldValidator = functionalMenuController.regenerateAncestorTable(mockedRequest, mockedResponse);
                assertTrue(acutualFieldValidator.equals(expectedFieldValidator));
        }
+       
+       @Test
+       public void getFunctionalMenuStaticInfoExceptionTest(){
+               String fnMenuStaticactualResponse = null;
+               String fnMenuStaticexpectedResponse = null;
+               String orgUserIdStr = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(searchService.searchUserByUserId(orgUserIdStr)).thenReturn(user);  
+               fnMenuStaticactualResponse = functionalMenuController.getFunctionalMenuStaticInfo(mockedRequest, mockedResponse);
+               
+               assertEquals(fnMenuStaticactualResponse, fnMenuStaticexpectedResponse);
+               
+       }
+       
+       @Test
+       public void getFunctionalMenuStaticInfoTest(){
+               String fnMenuStaticactualResponse = null;
+               String fnMenuStaticexpectedResponse = "{\"firstName\":\"test\",\"lastName\":\"test\",\"last_login\":\"09/08/2017 03:48:13-0400\",\"userId\":\"guestT\",\"email\":\"test\"}";
+               String orgUserIdStr = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("test");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(searchService.searchUserByUserId(orgUserIdStr)).thenReturn(user);  
+               fnMenuStaticactualResponse = functionalMenuController.getFunctionalMenuStaticInfo(mockedRequest, mockedResponse);
+               assertEquals(fnMenuStaticactualResponse.length(), fnMenuStaticexpectedResponse.length());               
+       }
+       
+       @Test
+       public void getMenuItemsForAuthUserNullTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = null;
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForAuthUserIsSuperAdminTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = new ArrayList<FunctionalMenuItem>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
 
 
+       @Test
+       public void getMenuItemsForAuthUserTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = new ArrayList<FunctionalMenuItem>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsBadPermissionTest(){
+               Integer menuId = 1234;
+               FunctionalMenuItem actualmenuItem = null;
+               FunctionalMenuItem expectedmenuItem = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               
+               actualmenuItem = functionalMenuController.getFunctionalMenuItemDetails(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualmenuItem, expectedmenuItem);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsTest(){
+               Integer menuId = 1234;
+               FunctionalMenuItem actualmenuItem = null;
+               FunctionalMenuItem expectedmenuItem = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItemDetails(menuId)).thenReturn(actualmenuItem);    
+               
+               actualmenuItem = functionalMenuController.getFunctionalMenuItemDetails(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualmenuItem, expectedmenuItem);
+       }
+       
+       @Test
+       public void getMenuItemsForEditingTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItems(true)).thenReturn(actualMenuItems);   
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForEditing(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForEditingBadPermissionsTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItems(true)).thenReturn(actualMenuItems);   
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForEditing(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForNotificationsTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = new ArrayList<FunctionalMenuItem>();
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForNotificationTree(false)).thenReturn(actualMenuItems);       
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForNotifications(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForAppTest(){
+               Integer appId = 1234;
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForApp(appId)).thenReturn(actualMenuItems);
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForApp(mockedRequest, appId);
+               assertEquals(actualMenuItems, expectedMenuItems);               
+       }
+       
+       @Test
+       public void getMenuItemsForUserTest(){
+               String orgUserId ="test";
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForUser(orgUserId)).thenReturn(actualMenuItems);                
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForUser(mockedRequest, orgUserId);
+               assertEquals(actualMenuItems, expectedMenuItems);               
+       }
+       
+       @Test
+       public void createFunctionalMenuItemTest(){
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(functionalMenuService.createFunctionalMenuItem(menuItemJson)).thenReturn(expectedFieldsValidator);
+               actualFieldsValidator = functionalMenuController.createFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void createFunctionalMenuItemBadPermisssionsTest(){
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.createFunctionalMenuItem(menuItemJson)).thenReturn(expectedFieldsValidator);
+               actualFieldsValidator = functionalMenuController.createFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getFavoritesForUserTest(){
+               List<FavoritesFunctionalMenuItemJson> actualFavoritesFunctionalMenuItemsJson = null;
+               List<FavoritesFunctionalMenuItemJson> expectedFunctionalMenuItemsJson = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.getFavoriteItems(user.getId())).thenReturn(expectedFunctionalMenuItemsJson);
+               actualFavoritesFunctionalMenuItemsJson = functionalMenuController.getFavoritesForUser(mockedRequest, mockedResponse);
+               assertEquals(actualFavoritesFunctionalMenuItemsJson, expectedFunctionalMenuItemsJson);
+       }
+       
+       @Test
+       public void deleteFavoriteItemTest(){
+               Long userId = (long)1;
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.removeFavoriteItem(user.getId(), menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFavoriteItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void addFavoriteItemTest(){
+               FavoritesFunctionalMenuItem menuItemJson = new FavoritesFunctionalMenuItem();
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.setFavoriteItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.addFavoriteItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getMenuItemsTest(){
+               List<FunctionalMenuItem> actualFunctionalMenuItems = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedFunctionalMenuItems = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> menuItems = new ArrayList<FunctionalMenuItem>();
+               Mockito.when(functionalMenuService.getFunctionalMenuItems()).thenReturn(menuItems);
+               actualFunctionalMenuItems = functionalMenuController.getMenuItems(mockedRequest, mockedResponse);
+               assertEquals(actualFunctionalMenuItems, expectedFunctionalMenuItems);
+       }
+       
+       @Test
+       public void deleteFunctionalMenuItemTest(){
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(functionalMenuService.deleteFunctionalMenuItem(menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFunctionalMenuItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void deleteFunctionalMenuItemBadPermissionsTest(){
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.deleteFunctionalMenuItem(menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFunctionalMenuItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void editFunctionalMenuItemTest(){
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true); 
+               Mockito.when(functionalMenuService.editFunctionalMenuItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.editFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void editFunctionalMenuItemBadPermissionsTest(){
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false); 
+               Mockito.when(functionalMenuService.editFunctionalMenuItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.editFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getECOMPTitleTest(){
+               PortalRestResponse<String> actualportalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               expectedportalRestResponse.setMessage("success");
+               expectedportalRestResponse.setResponse("Portal");
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)).thenReturn("Portal");
+               actualportalRestResponse = functionalMenuController.getECOMPTitle(mockedRequest, mockedResponse);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+       
 }
 }
index 567446e..765de29 100644 (file)
@@ -80,8 +80,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                MicroserviceData microserviceData = null;
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
                                mockedResponse, microserviceData);
                MicroserviceData microserviceData = null;
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
                                mockedResponse, microserviceData);
@@ -93,8 +92,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
                                mockedResponse, microserviceData);
                assertEquals(actualportalRestResponse, expectedportalRestResponse);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
                                mockedResponse, microserviceData);
                assertEquals(actualportalRestResponse, expectedportalRestResponse);
@@ -105,8 +103,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                Mockito.when(microserviceService.saveMicroservice(microserviceData)).thenReturn((long) 1);
                Mockito.when(microserviceData.getParameterList()).thenThrow(nullPointerException);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
                Mockito.when(microserviceService.saveMicroservice(microserviceData)).thenReturn((long) 1);
                Mockito.when(microserviceData.getParameterList()).thenThrow(nullPointerException);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
@@ -126,8 +123,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                MicroserviceData microserviceData = null;
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
                                mockedResponse, 1, microserviceData);
                MicroserviceData microserviceData = null;
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
                                mockedResponse, 1, microserviceData);
@@ -139,8 +135,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
                                mockedResponse, 1, microserviceData);
                assertEquals(actualportalRestResponse, expectedportalRestResponse);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
                                mockedResponse, 1, microserviceData);
                assertEquals(actualportalRestResponse, expectedportalRestResponse);
@@ -151,8 +146,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(null);
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(null);
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                Mockito.when(microserviceController.updateMicroservice(mockedRequest, mockedResponse, 1, microserviceData))
                                .thenThrow(nullPointerException);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
                Mockito.when(microserviceController.updateMicroservice(mockedRequest, mockedResponse, 1, microserviceData))
                                .thenThrow(nullPointerException);
                PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
@@ -166,8 +160,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(
                                "I/O error on GET request for \""  + EcompPortalUtils.widgetMsProtocol() + "://null/widget/microservices/widgetCatalog/service/1\":null; nested exception is java.net.UnknownHostException: null");
                expectedportalRestResponse.setMessage("FAILURE");
                expectedportalRestResponse.setResponse(
                                "I/O error on GET request for \""  + EcompPortalUtils.widgetMsProtocol() + "://null/widget/microservices/widgetCatalog/service/1\":null; nested exception is java.net.UnknownHostException: null");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                PowerMockito.mockStatic(WidgetServiceHeaders.class);
                PortalRestResponse<String> actuaPportalRestResponse = microserviceController.deleteMicroservice(mockedRequest,
                                mockedResponse, 1);
                PowerMockito.mockStatic(WidgetServiceHeaders.class);
                PortalRestResponse<String> actuaPportalRestResponse = microserviceController.deleteMicroservice(mockedRequest,
                                mockedResponse, 1);
@@ -181,8 +174,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SOME WIDGETS ASSOICATE WITH THIS SERVICE");
                expectedportalRestResponse.setResponse("'null' ,'null' ");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SOME WIDGETS ASSOICATE WITH THIS SERVICE");
                expectedportalRestResponse.setResponse("'null' ,'null' ");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.WARN);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.WARN);
                List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
                WidgetCatalog widgetCatalog = new WidgetCatalog();
                widgetCatalog.setId(1);
                List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
                WidgetCatalog widgetCatalog = new WidgetCatalog();
                widgetCatalog.setId(1);
@@ -212,8 +204,7 @@ public class MicroserviceControllerTest extends MockitoTestSuite{
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("SUCCESS");
                expectedportalRestResponse.setResponse("");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
                PowerMockito.mockStatic(WidgetServiceHeaders.class);
                String whatService = "widgets-service";
                List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
                PowerMockito.mockStatic(WidgetServiceHeaders.class);
                String whatService = "widgets-service";
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/RoleManageControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/RoleManageControllerTest.java
new file mode 100644 (file)
index 0000000..faa9b1f
--- /dev/null
@@ -0,0 +1,189 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.core.RoleController;
+import org.openecomp.portalapp.controller.core.RoleFunctionListController;
+import org.openecomp.portalapp.controller.core.RoleListController;
+import org.openecomp.portalapp.portal.controller.RoleManageController;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesService;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.springframework.web.servlet.ModelAndView;
+
+public class RoleManageControllerTest {
+
+       
+       
+       @Mock
+        RoleController roleController;
+
+       @Mock
+    RoleListController roleListController;
+
+       @Mock
+    RoleFunctionListController roleFunctionListController;
+
+
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService;
+       
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService1 = null;
+       
+       @InjectMocks
+       RoleManageController roleManageController = new RoleManageController(); 
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Test
+       public void toggleRoleTest()
+       {
+               PortalRestResponse<String> portalRestResponse = new PortalRestResponse<String>();
+               portalRestResponse.setMessage("success");
+               portalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               portalRestResponse.setStatus(portalRestStatusEnum.OK);
+               
+               PortalRestResponse<String> expectedpPortalRestResponse=roleManageController.toggleRole(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse,expectedpPortalRestResponse);
+               
+       }
+       
+//     @Test
+//     public void toggleRoleExceptionTest()
+//     {
+//             PortalRestResponse<String> portalRestResponse = new PortalRestResponse<String>();
+//             portalRestResponse.setMessage("success");
+//             portalRestResponse.setResponse(null);
+//             PortalRestStatusEnum portalRestStatusEnum = null;
+//             portalRestResponse.setStatus(portalRestStatusEnum.OK);
+//             Mockito.doNothing().when(roleListController).toggleRole(mockedRequest, mockedResponse))).th
+//             getRoleListController().toggleRole(request, response)
+//             
+//             PortalRestResponse<String> expectedpPortalRestResponse=roleManageController.toggleRole(mockedRequest, mockedResponse);
+//             assertEquals(portalRestResponse,expectedpPortalRestResponse);
+//             
+//     }
+       @Test
+       public void removeRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleListController.removeRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void saveRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.saveRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.saveRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void removeRoleRoleFunctionTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.removeRoleFunction(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeRoleRoleFunction(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void addRoleRoRoleFunctionTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.addRoleFunction(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.addRoleRoRoleFunction(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void removeChildRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.removeChildRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeChildRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       
+       @Test
+       public void getRoleTest() throws Exception
+       {
+               Mockito.doNothing().when(roleController).getRole(mockedRequest, mockedResponse);
+               roleManageController.getRole(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void getRolesTest() throws Exception
+       {
+               Mockito.doNothing().when(roleListController).getRoles(mockedRequest, mockedResponse);
+               roleManageController.getRoles(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void getRoleFunctionListTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).getRoleFunctionList(mockedRequest, mockedResponse);
+               roleManageController.getRoleFunctionList(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).saveRoleFunction(mockedRequest, mockedResponse, "test");
+               roleManageController.saveRoleFunction(mockedRequest, mockedResponse, "test");
+       }
+       
+       @Test
+       public void removeRoleFunctionTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).removeRoleFunction(mockedRequest, mockedResponse, "test");
+               roleManageController.removeRoleFunction(mockedRequest, mockedResponse, "test");
+       }
+       
+       @Test
+       public void syncRolesTest() throws Exception
+       {
+               EPApp app = new EPApp();
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               roleManageController.syncRoles(app);
+       }
+       
+       
+       @Test
+       public void addeChildRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.addChildRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.addChildRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+}
index 6286245..79ae027 100644 (file)
@@ -47,8 +47,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no roles");
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no roles");
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -66,8 +65,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Saved Successfully");
                expectedportalRestResponse.setResponse("Success");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Saved Successfully");
                expectedportalRestResponse.setResponse("Success");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -91,8 +89,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Received Bad String");
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Received Bad String");
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -116,8 +113,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -137,8 +133,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no login ID");
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no login ID");
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId(null);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId(null);
@@ -155,8 +150,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Updated Successfully");
                expectedportalRestResponse.setResponse("Success");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Updated Successfully");
                expectedportalRestResponse.setResponse("Success");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -180,8 +174,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Received Bad String");
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Received Bad String");
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -206,8 +199,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("save user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("save user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -228,8 +220,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no application name");
                expectedportalRestResponse.setResponse("delete user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no application name");
                expectedportalRestResponse.setResponse("delete user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName(null);
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName(null);
                extSysUser.setLoginId("1");
@@ -247,8 +238,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no request ID");
                expectedportalRestResponse.setResponse("delete user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Request has no request ID");
                expectedportalRestResponse.setResponse("delete user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test");
                extSysUser.setLoginId("1");
@@ -265,8 +255,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Deleted Successfully");
                expectedportalRestResponse.setResponse("Success");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("Deleted Successfully");
                expectedportalRestResponse.setResponse("Success");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -291,8 +280,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("failed");
                expectedportalRestResponse.setResponse("delete user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage("failed");
                expectedportalRestResponse.setResponse("delete user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
@@ -317,8 +305,7 @@ public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("delete user profile failed");
                PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
                expectedportalRestResponse.setMessage(null);
                expectedportalRestResponse.setResponse("delete user profile failed");
-               PortalRestStatusEnum portalRestStatusEnum = null;
-               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
                ExternalSystemUser extSysUser = new ExternalSystemUser();
                extSysUser.setApplicationName("Test_App");
                extSysUser.setLoginId("1");
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SchedulerControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SchedulerControllerTest.java
new file mode 100644 (file)
index 0000000..c528081
--- /dev/null
@@ -0,0 +1,75 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import java.sql.DriverManager;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.simple.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.controller.SchedulerController;
+import org.openecomp.portalapp.portal.scheduler.SchedulerProperties;
+import org.openecomp.portalapp.portal.scheduler.SchedulerRestInterface;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({UserUtils.class,SystemProperties.class})
+
+public class SchedulerControllerTest {
+
+       @Mock
+       SchedulerRestInterface schedulerRestInterface;
+       
+       
+
+       @InjectMocks
+       SchedulerController schedulerController = new SchedulerController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockEPUser mockUser = new MockEPUser();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void  getTimeSlotsTest() throws Exception{
+               schedulerController.getTimeSlots(mockedRequest, "12");
+               
+       }
+       
+       @Test
+       public void postCreateNewVNFChangeTest() throws Exception{
+               //String testJsonData="{\"domain\":\"ChangeManagement\",\"scheduleName\":\"VnfUpgrade/DWF\",\"userId\":\"su7376\",\"domainData\":[{\"WorkflowName\":\"HEAT Stack Software Update for vNFs\",\"CallbackUrl\":\"http://127.0.0.1:8989/scheduler/v1/loopbacktest/vid\",\"CallbackData\":\"testing\"}],\"schedulingInfo\":{\"normalDurationInSeconds\":60,\"additionalDurationInSeconds\":60,\"concurrencyLimit\":60,\"policyId\":\"SNIRO_CM_1707.Config_MS_Demo_TimeLimitAndVerticalTopology_zone_localTime.1.xml\",\"vnfDetails\":[{\"groupId\":\"group1\",\"node\":[\"satmo415vbc\",\"satmo455vbc\"]}]}}";
+               JSONObject jsonObject =Mockito.mock(JSONObject.class);
+               
+               schedulerController.postCreateNewVNFChange(mockedRequest, jsonObject);
+       }
+       
+       @Test
+       public void postSubmitVnfChangeTimeslotsTest() throws Exception{
+               JSONObject jsonObject =Mockito.mock(JSONObject.class);
+               Mockito.when(jsonObject.get("scheduleId")).thenReturn("12");
+        PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.when(SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SUBMIT_NEW_VNF_CHANGE)).thenReturn("/v1/ChangeManagement/schedules/{scheduleId}/approvals");
+               schedulerController.postSubmitVnfChangeTimeslots(mockedRequest, jsonObject);
+       }
+       
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SessionCommunicationControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/SessionCommunicationControllerTest.java
new file mode 100644 (file)
index 0000000..cc7bf04
--- /dev/null
@@ -0,0 +1,59 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.drools.core.command.assertion.AssertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.sessionmgt.SessionCommunicationController;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.service.sessionmgt.ManageService;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+
+public class SessionCommunicationControllerTest {
+       
+
+       @Mock
+       ManageService manageService;
+
+       @InjectMocks
+       SessionCommunicationController SessionCommunicationController = new SessionCommunicationController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       
+       @Test
+       public void getSessionSlotCheckIntervalTest() throws Exception
+       {
+               Mockito.when(manageService.fetchSessionSlotCheckInterval()).thenReturn(1);
+               int result = SessionCommunicationController.getSessionSlotCheckInterval(mockedRequest, mockedResponse);
+               assertEquals(result, 1);
+               
+       }
+
+       @Test
+       public void extendSessionTimeOutsTest() throws Exception
+       {
+               Mockito.doNothing().when(manageService).extendSessionTimeOuts("test");
+               Boolean result = SessionCommunicationController.extendSessionTimeOuts(mockedRequest, mockedResponse, "test");
+               assertEquals(result, true);
+               
+       }
+}
index 492a39d..19f309b 100644 (file)
@@ -60,8 +60,7 @@ public class UserControllerTest extends MockitoTestSuite {
                PortalRestResponse<ProfileDetail> expectedResponse = new PortalRestResponse<ProfileDetail>();
                expectedResponse.setMessage(null);
                expectedResponse.setResponse(null);
                PortalRestResponse<ProfileDetail> expectedResponse = new PortalRestResponse<ProfileDetail>();
                expectedResponse.setMessage(null);
                expectedResponse.setResponse(null);
-               PortalRestStatusEnum enu = null;
-               expectedResponse.setStatus(enu.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
                assertEquals(response, expectedResponse);
        }
                PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
                assertEquals(response, expectedResponse);
        }
@@ -74,8 +73,7 @@ public class UserControllerTest extends MockitoTestSuite {
                expectedResponse.setMessage("success");
                ProfileDetail profileDetail = new ProfileDetail();
                expectedResponse.setResponse(profileDetail);
                expectedResponse.setMessage("success");
                ProfileDetail profileDetail = new ProfileDetail();
                expectedResponse.setResponse(profileDetail);
-               PortalRestStatusEnum enu = null;
-               expectedResponse.setStatus(enu.OK);
+               expectedResponse.setStatus(PortalRestStatusEnum.OK);
                PowerMockito.mockStatic(CipherUtil.class);
                Mockito.when(CipherUtil.decrypt(epUser.getLoginPwd())).thenReturn("Password");
                PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
                PowerMockito.mockStatic(CipherUtil.class);
                Mockito.when(CipherUtil.decrypt(epUser.getLoginPwd())).thenReturn("Password");
                PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
@@ -88,8 +86,7 @@ public class UserControllerTest extends MockitoTestSuite {
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("java.lang.NullPointerException");
                expectedResponse.setResponse(null);
                PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
                expectedResponse.setMessage("java.lang.NullPointerException");
                expectedResponse.setResponse(null);
-               PortalRestStatusEnum enu = null;
-               expectedResponse.setStatus(enu.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                ProfileDetail profileDetail = null;
                PortalRestResponse<String> actualResponse = userController.modifyLoggedinUser(mockedRequest, profileDetail);
                assertEquals(actualResponse, expectedResponse);
                ProfileDetail profileDetail = null;
                PortalRestResponse<String> actualResponse = userController.modifyLoggedinUser(mockedRequest, profileDetail);
                assertEquals(actualResponse, expectedResponse);
@@ -104,8 +101,7 @@ public class UserControllerTest extends MockitoTestSuite {
                expectedResponse.setMessage(
                                "java.lang.ClassCastException: com.sun.crypto.provider.AESCipher$General cannot be cast to javax.crypto.CipherSpi");
                expectedResponse.setResponse(null);
                expectedResponse.setMessage(
                                "java.lang.ClassCastException: com.sun.crypto.provider.AESCipher$General cannot be cast to javax.crypto.CipherSpi");
                expectedResponse.setResponse(null);
-               PortalRestStatusEnum enu = null;
-               expectedResponse.setStatus(enu.ERROR);
+               expectedResponse.setStatus(PortalRestStatusEnum.ERROR);
                ProfileDetail profileDetail = new ProfileDetail();
                profileDetail.setFirstName("Test_FirstName");
                profileDetail.setLastName("Test_LastName");
                ProfileDetail profileDetail = new ProfileDetail();
                profileDetail.setFirstName("Test_FirstName");
                profileDetail.setLastName("Test_LastName");
index 1459caa..4014f44 100644 (file)
@@ -30,29 +30,50 @@ import javax.servlet.http.HttpSession;
 
 import org.junit.Before;
 import org.junit.Test;
 
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.openecomp.portalapp.portal.controller.UserRolesController;
 import org.openecomp.portalapp.portal.domain.EPUser;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.openecomp.portalapp.portal.controller.UserRolesController;
 import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.EcompAuditLog;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.SearchService;
 import org.openecomp.portalapp.portal.service.UserRolesService;
 import org.openecomp.portalapp.portal.test.core.MockEPUser;
 import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
 import org.openecomp.portalapp.portal.service.UserRolesService;
 import org.openecomp.portalapp.portal.test.core.MockEPUser;
 import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
+import org.openecomp.portalapp.portal.transport.AppsListWithAdminRole;
 import org.openecomp.portalapp.portal.transport.FieldsValidator;
 import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
 import org.openecomp.portalapp.portal.transport.RoleInAppForUser;
 import org.openecomp.portalapp.portal.transport.FieldsValidator;
 import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
 import org.openecomp.portalapp.portal.transport.RoleInAppForUser;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
 import org.openecomp.portalapp.test.framework.MockitoTestSuite;
 import org.openecomp.portalapp.util.EPUserUtils;
 import org.openecomp.portalapp.test.framework.MockitoTestSuite;
 import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
 
 
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EcompPortalUtils.class, EPCommonSystemProperties.class, EcompAuditLog.class, SystemProperties.class})
 public class UserRolesControllerTest extends MockitoTestSuite {
 
        String userid = "ab1234";
 
        @Mock
        UserRolesService userRolesService;
 public class UserRolesControllerTest extends MockitoTestSuite {
 
        String userid = "ab1234";
 
        @Mock
        UserRolesService userRolesService;
+       
+       @Mock
+       SearchService searchService;
+       
+       @Mock
+       AuditService auditService;
+       
+       @Mock
+       AdminRolesService adminRolesService;
 
        @Mock
        FieldsValidator fieldsValidator;
 
        @Mock
        FieldsValidator fieldsValidator;
@@ -127,4 +148,161 @@ public class UserRolesControllerTest extends MockitoTestSuite {
                assertEquals(expectedFieldValidator.getFields(), actualFieldsValidator.getFields());
 
        }
                assertEquals(expectedFieldValidator.getFields(), actualFieldsValidator.getFields());
 
        }
+       
+       @Test
+       public void getPhoneBookSearchResultBadPermissionsTest() {
+               String searchString = "test";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getPhoneBookSearchResultValidationTest() {
+               String searchString = " t";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getPhoneBookSearchResultTest() {
+               String searchString = "test";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getAppsWithAdminRoleStateForUserTest(){
+               
+               String orgUserId = "hb123f";
+               AppsListWithAdminRole actualResult = new AppsListWithAdminRole();
+               AppsListWithAdminRole expectedResult = new AppsListWithAdminRole();
+               EPUser user = mockUser.mockEPUser();
+       //      PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.getAppsWithAdminRoleStateForUser(orgUserId)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getAppsWithAdminRoleStateForUser(mockedRequest, orgUserId, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       }
+       
+       /*@Test
+       public void getAppsWithAdminRoleStateForUserBadRequestTest(){
+               
+               String orgUserId = "hb123f";
+               AppsListWithAdminRole actualResult = null;
+               AppsListWithAdminRole expectedResult = null;
+               EPUser user = mockUser.mockEPUser();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.when(EcompPortalUtils.legitimateUserId(orgUserId)).thenReturn(false);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.getAppsWithAdminRoleStateForUser(orgUserId)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getAppsWithAdminRoleStateForUser(mockedRequest, orgUserId, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       }*/
+       
+       @Test
+       public void putAppsWithAdminRoleStateForUserBadStatusCodeTest(){
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fieldNames = new ArrayList<FieldName>();
+               expectedFieldsValidator.setErrorCode(null);
+               expectedFieldsValidator.setFields(fieldNames);
+               expectedFieldsValidator.setHttpStatusCode((long)200);
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+               assertEquals(expectedFieldsValidator, actualFieldsValidator);
+       }
+       
+       
+       /*@Test
+       public void putAppsWithAdminRoleStateForUserTest() {
+               
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(EcompAuditLog.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EcompAuditLog.CD_ACTIVITY_UPDATE_ACCOUNT_ADMIN)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(SystemProperties.MDC_TIMER)).thenReturn("1400");
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+
+               System.out.println(actualFieldsValidator);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }*/
+       
+       /*@Test
+       public void putAppsWithAdminRoleStateForUserTest(){
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fieldNames = new ArrayList<FieldName>();
+               expectedFieldsValidator.setErrorCode(null);
+               expectedFieldsValidator.setFields(fieldNames);
+               expectedFieldsValidator.setHttpStatusCode((long)200);
+               
+               EPUser user = mockUser.mockEPUser();
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(EcompAuditLog.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.setAppsWithAdminRoleStateForUser(newAppsListWithAdminRoles));
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+       //      Mockito.call(auditService.logActivity(auditLog, null));
+//             Mockito.when(SystemProperties.getProperty(EcompAuditLog.CD_ACTIVITY_UPDATE_ACCOUNT_ADMIN)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(SystemProperties.MDC_TIMER)).thenReturn("1400");
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+               assertEquals(expectedFieldsValidator, actualFieldsValidator);
+       }*/
 }
 }
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/WidgetsCatalogController.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/WidgetsCatalogController.java
new file mode 100644 (file)
index 0000000..f325591
--- /dev/null
@@ -0,0 +1,111 @@
+package org.openecomp.portalapp.portal.test.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.controller.DashboardController;
+import org.openecomp.portalapp.portal.domain.WidgetCatalog;
+import org.openecomp.portalapp.portal.domain.WidgetServiceHeaders;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ConsulHealthService;
+import org.openecomp.portalapp.portal.service.ConsulHealthServiceImpl;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.service.MicroserviceService;
+import org.openecomp.portalapp.portal.service.MicroserviceServiceImpl;
+import org.openecomp.portalapp.portal.service.WidgetParameterService;
+import org.openecomp.portalapp.portal.service.WidgetParameterServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.portal.utils.CustomLoggingFilter;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.client.RestClientException;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EPUserUtils.class})
+public class WidgetsCatalogController {
+
+       @Mock
+       ConsulHealthService consulHealthService = new ConsulHealthServiceImpl();
+       
+       @Mock
+       MicroserviceService microserviceService = new MicroserviceServiceImpl();
+       
+       @Mock
+       WidgetParameterService widgetParameterService = new WidgetParameterServiceImpl();
+       
+       @InjectMocks
+       WidgetsCatalogController widgetsCatalogController = new WidgetsCatalogController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       /*public List<WidgetCatalog> getUserWidgetCatalog(HttpServletRequest request, HttpServletResponse response,
+                       @PathVariable("loginName") String loginName) throws RestClientException, Exception {
+               List<WidgetCatalog> widgets = new ArrayList<>();
+               try {
+                       CustomLoggingFilter d;
+                       ResponseEntity<ArrayList> ans = template.exchange(
+                                       EcompPortalUtils.widgetMsProtocol() + "://" + consulHealthService.getServiceLocation(whatService,
+                                                       SystemProperties.getProperty("microservices.widget.local.port"))
+                                                       + "/widget/microservices/widgetCatalog/" + loginName,
+                                       HttpMethod.GET, new HttpEntity(WidgetServiceHeaders.getInstance()), ArrayList.class);
+                       widgets = ans.getBody();
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "getUserWidgetCatalog failed", e);
+                       // returning null because null help check on the UI if there was a
+                       // communication problem with Microservice.
+                       return null;
+               }
+               return widgets;
+       }
+       
+       @Test
+       public void getWidgetDataTest(){
+               
+               String resourceType = null;
+               List<WidgetCatalog> expectedData = new ArrayList<WidgetCatalog>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Unexpected resource type null");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<CommonWidgetMeta> actualResponse =   dashboardController.getWidgetData(mockedRequest, resourceType);
+               assertEquals(expectedData,actualResponse);      
+               
+               
+       }*/
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserAppTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserAppTest.java
new file mode 100644 (file)
index 0000000..ed13c2d
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AdminUserApp;
+
+public class AdminUserAppTest {
+
+       public AdminUserApp mockAdminUserApp(){
+               
+               AdminUserApp adminUserApp = new AdminUserApp();
+       
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               
+               return adminUserApp;
+       }
+       
+       @Test
+       public void adminUserAppTest(){
+               AdminUserApp adminUserApp = mockAdminUserApp();
+               
+               assertEquals(adminUserApp.getUser_Id(), new Long(1));
+               assertEquals(adminUserApp.getFirstName(), "test");
+               assertEquals(adminUserApp.getLastName(), "test");
+               assertEquals(adminUserApp.getOrgUserId(), "test");
+               assertEquals(adminUserApp.getAppName(), "test");
+               assertEquals(adminUserApp.getAppId(), new Long(1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserApplicationsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AdminUserApplicationsTest.java
new file mode 100644 (file)
index 0000000..6faf44a
--- /dev/null
@@ -0,0 +1,57 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AdminUserApp;
+import org.openecomp.portalapp.portal.domain.AdminUserApplications;
+
+public class AdminUserApplicationsTest {
+
+       public AdminUserApplications mockAdminUserApplications(){
+               
+               AdminUserApp adminUserApp = new AdminUserApp();
+               
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               
+               AdminUserApplications adminUserApplications = new AdminUserApplications(adminUserApp);
+               
+               adminUserApplications.setUser_Id((long)1);
+               adminUserApplications.setFirstName("test");
+               adminUserApplications.setLastName("test");
+               adminUserApplications.setOrgUserId("test");     
+               return adminUserApplications;
+       }
+       
+       @Test
+       public void adminUserAppTest(){
+               AdminUserApplications adminUserApplications = mockAdminUserApplications();
+           AdminUserApp adminUserApp = new AdminUserApp();
+               
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               AdminUserApplications adminUserApplications1 = new AdminUserApplications(adminUserApp);
+               
+               assertEquals(adminUserApplications.getUser_Id(), new Long(1));
+               assertEquals(adminUserApplications.getFirstName(), "test");
+               assertEquals(adminUserApplications.getLastName(), "test");
+               assertEquals(adminUserApplications.getOrgUserId(), "test");
+               
+               
+               assertEquals(adminUserApplications1.getApps().get(0).getAppId(),adminUserApp.getAppId());
+               assertEquals(adminUserApplications1.getApps().get(0).getAppName(),adminUserApp.getAppName());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AppContactUsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/AppContactUsTest.java
new file mode 100644 (file)
index 0000000..f436861
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AppContactUs;
+
+public class AppContactUsTest {
+
+       public AppContactUs  mockAppContactUs(){
+               AppContactUs appContactUs = new AppContactUs();
+               appContactUs.setDescription("test");
+               appContactUs.setContactEmail("test");
+               appContactUs.setContactName("test");
+               appContactUs.setUrl("test");
+               appContactUs.setActiveYN("test");
+                               
+               return appContactUs;
+       }
+       
+       @Test
+       public void mockAppContactUsTest(){
+               AppContactUs appContactUs = mockAppContactUs();
+               
+               assertEquals(appContactUs.getDescription(), "test");
+               assertEquals(appContactUs.getContactEmail(), "test");
+               assertEquals(appContactUs.getContactName(), "test");
+               assertEquals(appContactUs.getUrl(), "test");
+               assertEquals(appContactUs.getActiveYN(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/CentralRoleFunctionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/CentralRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..83bdc59
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+
+public class CentralRoleFunctionTest {
+
+       public CentralRoleFunction mockCentralRoleFunction(){
+               
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+                  
+                  centralRoleFunction.setCode("test");
+                  centralRoleFunction.setName("test");
+                  centralRoleFunction.setAppId((long)1);
+                  centralRoleFunction.setEditUrl("test");
+                  
+               return centralRoleFunction;
+       }
+       
+       @Test
+       public void centralRoleFunctionTest(){
+               CentralRoleFunction centralRoleFunction = mockCentralRoleFunction();
+               
+               assertEquals(centralRoleFunction.getAppId(), new Long(1));
+               assertEquals(centralRoleFunction.getCode(), "test");
+               assertEquals(centralRoleFunction.getName(), "test");
+               assertEquals(centralRoleFunction.getEditUrl(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppRoleFunctionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..a3f2463
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+
+public class EPAppRoleFunctionTest {
+
+       public EPAppRoleFunction mockEPAppRoleFunction(){
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               return epAppRoleFunction;
+       }
+       
+       @Test
+       public void epAppRoleFunctionTest(){
+               EPAppRoleFunction epAppRoleFunction = mockEPAppRoleFunction();
+               
+               assertEquals(epAppRoleFunction.getRoleId(), new Long(1));
+               assertEquals(epAppRoleFunction.getAppId(), new Long(1));
+               assertEquals(epAppRoleFunction.getCode(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPAppTest.java
new file mode 100644 (file)
index 0000000..9a60e7d
--- /dev/null
@@ -0,0 +1,61 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPApp;
+
+public class EPAppTest {
+
+       public EPApp mockEPApp(){
+               EPApp epApp = new EPApp();
+                               
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+               epApp.setOpen(false);
+               epApp.setEnabled(false);
+               epApp.setUebTopicName("test");
+               epApp.setUebSecret("test");
+               epApp.setAppType(1);
+               epApp.setCentralAuth(false);
+               epApp.setNameSpace("test");
+               
+               return epApp;
+       }
+       
+       @Test
+       public void epAppTest(){
+               EPApp epApp = mockEPApp();
+               
+               assertEquals(epApp.getName(), "test");
+               assertEquals(epApp.getImageUrl(), "test");
+               assertEquals(epApp.getDescription(), "test");
+               assertEquals(epApp.getNotes(), "test");
+               assertEquals(epApp.getUrl(), "test");
+               assertEquals(epApp.getAlternateUrl(), "test");
+               assertEquals(epApp.getAppRestEndpoint(), "test");
+               assertEquals(epApp.getMlAppName(), "test");
+               assertEquals(epApp.getMlAppAdminId(), "test");
+               assertEquals(epApp.getMotsId(), new Long(1));
+               assertEquals(epApp.getUsername(), "test");
+               assertEquals(epApp.getAppPassword(), "test");
+               assertEquals(epApp.getOpen(), false);
+               assertEquals(epApp.getEnabled(), false);
+               assertEquals(epApp.getUebTopicName(), "test");
+               assertEquals(epApp.getUebSecret(), "test");
+               assertEquals(epApp.getAppType(), Integer.valueOf(1));
+               assertEquals(epApp.getCentralAuth(), false);
+               assertEquals(epApp.getNameSpace(), "test");
+
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointAccountTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointAccountTest.java
new file mode 100644 (file)
index 0000000..0720624
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPEndpointAccount;
+
+public class EPEndpointAccountTest {
+
+       public EPEndpointAccount mockEPEndpointAccount(){
+               EPEndpointAccount epEndpointAccount = new EPEndpointAccount();
+               
+               epEndpointAccount.setEp_id((long)1);
+               epEndpointAccount.setAccount_id((long)1);
+               epEndpointAccount.setId((long)1);
+               
+               return epEndpointAccount;
+       }
+       
+       @Test
+       public void epEndpointAccount(){
+               EPEndpointAccount epEndpointAccount = mockEPEndpointAccount();
+               assertEquals(epEndpointAccount.getEp_id(), new Long(1));
+               assertEquals(epEndpointAccount.getAccount_id(), new Long(1));
+               assertEquals(epEndpointAccount.getId(), new Long(1));
+               
+               assertEquals(epEndpointAccount.toString(), "EPEndpointAccount [id=1, ep_id=1, account_id=1]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPEndpointTest.java
new file mode 100644 (file)
index 0000000..8fbee98
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPEndpoint;
+
+public class EPEndpointTest {
+
+       public EPEndpoint mockEPEndpoint(){
+               EPEndpoint epEndpoint = new EPEndpoint();
+               
+               epEndpoint.setId((long)1);
+               epEndpoint.setName("test");
+               
+               return epEndpoint;
+       }
+       
+       @Test
+       public void epEndpointTest(){
+               EPEndpoint epEndpoint = mockEPEndpoint();
+               
+               assertEquals(epEndpoint.getId(), new Long(1));
+               assertEquals(epEndpoint.getName(), "test");
+               assertEquals("EPEndpoint [id=1, name=test]", epEndpoint.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPRoleTest.java
new file mode 100644 (file)
index 0000000..05453bf
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPRole;
+
+public class EPRoleTest {
+
+       public EPRole mockEPRole(){
+               EPRole epRole = new EPRole();
+               
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+                  
+               return epRole;
+       }
+       
+       @Test
+       public void epRoleTest(){
+               EPRole epRole = mockEPRole();
+               
+               assertEquals(epRole.getName(), "test");
+               assertEquals(epRole.getActive(), false);
+               assertEquals(epRole.getPriority().toString(),"1");
+               assertEquals(epRole.getAppId(), new Long(1));
+               assertEquals(epRole.getAppRoleId(), new Long(1));
+               
+               assertEquals(epRole.toString(), "[Id = null, name = test]");
+
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppCatalogRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppCatalogRolesTest.java
new file mode 100644 (file)
index 0000000..a21eec7
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppCatalogRoles;
+
+public class EPUserAppCatalogRolesTest {
+
+       public EPUserAppCatalogRoles mockEPUserAppCatalogRoles(){
+               EPUserAppCatalogRoles epUserAppCatalogRoles = new EPUserAppCatalogRoles();
+                               
+               epUserAppCatalogRoles.setRequestedRoleId((long)1);
+               epUserAppCatalogRoles.setRolename("test");
+               epUserAppCatalogRoles.setRequestStatus("status");
+               epUserAppCatalogRoles.setAppId((long)1);
+               
+               return epUserAppCatalogRoles;
+       }
+       
+       @Test
+       public void epUserAppCatalogRolesTest(){
+               EPUserAppCatalogRoles epUserAppCatalogRoles = mockEPUserAppCatalogRoles();
+               
+               assertEquals(epUserAppCatalogRoles.getRequestedRoleId(), new Long(1));
+               assertEquals(epUserAppCatalogRoles.getRolename(), "test");
+               assertEquals(epUserAppCatalogRoles.getRequestStatus(), "status");
+               assertEquals(epUserAppCatalogRoles.getAppId(), new Long(1));
+               
+               assertEquals("EPUserAppCatalogRoles [requestedRoleId=1, rolename=test, requestStatus=status, appId=1]", epUserAppCatalogRoles.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesRequestDetailTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesRequestDetailTest.java
new file mode 100644 (file)
index 0000000..c9147bb
--- /dev/null
@@ -0,0 +1,54 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppRolesRequest;
+import org.openecomp.portalapp.portal.domain.EPUserAppRolesRequestDetail;
+
+public class EPUserAppRolesRequestDetailTest {
+
+       public EPUserAppRolesRequestDetail mockEPUserAppRolesRequestDetail(){
+               
+               EPUserAppRolesRequest epUserAppRolesRequest = new EPUserAppRolesRequest();
+               epUserAppRolesRequest.setUserId((long)1);
+               epUserAppRolesRequest.setAppId((long)1);
+               epUserAppRolesRequest.setCreated(new Date());
+               epUserAppRolesRequest.setUpdatedDate(new Date());
+               epUserAppRolesRequest.setRequestStatus("test");
+                       
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail = new EPUserAppRolesRequestDetail();
+               epUserAppRolesRequestDetail.setReqRoleId((long)1);
+               epUserAppRolesRequestDetail.setReqType("test");
+               epUserAppRolesRequestDetail.setEpRequestIdData(epUserAppRolesRequest);
+               
+               return epUserAppRolesRequestDetail;
+       }
+       
+       @Test
+       public void epUserAppRolesRequestDetailTest(){
+               
+               EPUserAppRolesRequest epUserAppRolesRequest = new EPUserAppRolesRequest();
+               epUserAppRolesRequest.setUserId((long)1);
+               epUserAppRolesRequest.setAppId((long)1);
+               epUserAppRolesRequest.setCreated(new Date());
+               epUserAppRolesRequest.setUpdatedDate(new Date());
+               epUserAppRolesRequest.setRequestStatus("test");
+               
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail = mockEPUserAppRolesRequestDetail();
+               
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail1 = new EPUserAppRolesRequestDetail();
+               epUserAppRolesRequestDetail1.setReqRoleId((long)1);
+               epUserAppRolesRequestDetail1.setReqType("test");
+               epUserAppRolesRequestDetail1.setEpRequestIdData(epUserAppRolesRequest);
+               
+               assertEquals(epUserAppRolesRequestDetail.getReqRoleId(), new Long(1));
+               assertEquals(epUserAppRolesRequestDetail.getReqType(), "test");
+               assertEquals(epUserAppRolesRequestDetail.getEpRequestIdData(), epUserAppRolesRequest);
+               assertEquals(epUserAppRolesRequestDetail.hashCode(), epUserAppRolesRequestDetail1.hashCode());
+               
+       }               
+               
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppRolesTest.java
new file mode 100644 (file)
index 0000000..540c63e
--- /dev/null
@@ -0,0 +1,28 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppRoles;
+
+public class EPUserAppRolesTest {
+
+       public EPUserAppRoles mockEPUserAppRoles(){
+               EPUserAppRoles epUserAppRoles = new EPUserAppRoles();
+               
+               epUserAppRoles.setRoleId((long)1);
+               epUserAppRoles.setAppId((long)1); 
+               
+               return epUserAppRoles;
+       }
+       
+       @Test
+       public void epUserAppRolesTest(){
+               EPUserAppRoles epUserAppRoles = mockEPUserAppRoles();
+               
+               assertEquals(epUserAppRoles.getRoleId(), new Long(1));
+               assertEquals(epUserAppRoles.getAppId(), new Long(1));
+               assertEquals("EpUserAppRoles [roleId=1, appId=1]", epUserAppRoles.toString());
+       }
+}
+
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppTest.java
new file mode 100644 (file)
index 0000000..0c450eb
--- /dev/null
@@ -0,0 +1,85 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUserApp;
+
+public class EPUserAppTest {
+
+       public EPUserApp mockEPUserApp(){
+               
+               EPApp epApp = new EPApp();
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+                       
+               
+               //Role
+               EPRole epRole = new EPRole();
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+               
+               EPUserApp user = new EPUserApp();
+               user.setUserId((long)1);
+               user.setApp(epApp);
+               user.setRole(epRole);
+               user.setPriority((short)32767);
+               
+               
+               return user;
+       }
+       
+       @Test
+       public void userTest(){
+               EPUserApp user = mockEPUserApp();
+               
+               EPApp epApp = new EPApp();
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+               user.setApp(epApp);
+               
+               //Role
+               EPRole epRole = new EPRole();
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+               
+               
+        assertEquals(user.getUserId(),Long.valueOf(1));
+               assertEquals(user.getApp(), epApp); 
+               assertEquals(user.getPriority().getClass(), Short.class);
+       
+               assertEquals(user.toString(), "[u: 1; a: null, r: null; appRoleId: 1]");
+               
+               assertEquals(user.hashCode(), user.hashCode());
+               
+               
+               }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsManualSortPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsManualSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..afad6f6
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppsManualSortPreference;
+
+public class EPUserAppsManualSortPreferenceTest {
+
+       public EPUserAppsManualSortPreference mockEPUserAppsManualSortPreference(){
+               
+               EPUserAppsManualSortPreference epUserAppsManualSortPreference = new EPUserAppsManualSortPreference();
+               epUserAppsManualSortPreference.setUserId(1);
+               epUserAppsManualSortPreference.setAppId((long)1);
+               epUserAppsManualSortPreference.setAppManualSortOrder(1);
+               
+               return epUserAppsManualSortPreference;
+       }
+       
+       @Test
+       public void epUserAppsManualSortPreferenceTest(){
+       
+               EPUserAppsManualSortPreference epUserAppsManualSortPreference = mockEPUserAppsManualSortPreference();
+               
+               assertEquals(epUserAppsManualSortPreference.getUserId(), 1);
+               assertEquals(epUserAppsManualSortPreference.getAppId(), new Long(1));
+               assertEquals(epUserAppsManualSortPreference.getAppManualSortOrder(), 1);
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsSortPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserAppsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..545c16d
--- /dev/null
@@ -0,0 +1,43 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppsSortPreference;
+
+public class EPUserAppsSortPreferenceTest {
+
+       public EPUserAppsSortPreference mockEPUserAppsSortPreferenceTest(){
+
+               EPUserAppsSortPreference epUserAppsSortPreference = new EPUserAppsSortPreference();
+               epUserAppsSortPreference.setUserId(1);
+               epUserAppsSortPreference.setSortPref("test");
+               epUserAppsSortPreference.setId((long)1);
+               epUserAppsSortPreference.setCreated(new Date());
+               epUserAppsSortPreference.setModified(new Date());
+               epUserAppsSortPreference.setModifiedId((long)1);
+               epUserAppsSortPreference.setRowNum((long)1);
+               epUserAppsSortPreference.setAuditTrail(null);
+               
+               return epUserAppsSortPreference;
+       }
+       
+       @Test
+       public void epUserAppsSortPreferenceTest() {
+               EPUserAppsSortPreference epUserAppsSortPreference = mockEPUserAppsSortPreferenceTest();
+               
+               assertEquals(epUserAppsSortPreference.getUserId(), 1);
+               assertEquals(epUserAppsSortPreference.getSortPref(), "test");
+               assertEquals(epUserAppsSortPreference.getId(), new Long(1));
+               assertEquals(epUserAppsSortPreference.getCreated(), new Date());
+               assertEquals(epUserAppsSortPreference.getModified(), new Date());
+               assertEquals(epUserAppsSortPreference.getModifiedId(), new Long(1));
+               assertEquals(epUserAppsSortPreference.getRowNum(), new Long(1));
+               assertEquals(epUserAppsSortPreference.getAuditTrail(), null);
+               
+               
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserNotificationTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserNotificationTest.java
new file mode 100644 (file)
index 0000000..64313e5
--- /dev/null
@@ -0,0 +1,34 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserNotification;
+
+public class EPUserNotificationTest {
+
+       public EPUserNotification mockEPUserNotification(){
+               
+               EPUserNotification epUserNotification = new EPUserNotification();
+                               
+               epUserNotification.setUserId((long)1);
+               epUserNotification.setNotificationId((long)1);
+               epUserNotification.setViewed("test");
+               epUserNotification.setUpdateTime(new Date());           
+               
+               return epUserNotification;
+       }
+       
+       @Test
+       public void epUserNotificationTest(){
+               EPUserNotification epUserNotification = mockEPUserNotification();
+               
+               assertEquals(epUserNotification.getUserId(), new Long(1));
+               assertEquals(epUserNotification.getNotificationId(), new Long(1));
+               assertEquals(epUserNotification.getViewed(), "test");
+       //      assertEquals(epUserNotification.getUpdateTime(), new Date());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPUserTest.java
new file mode 100644 (file)
index 0000000..54e6193
--- /dev/null
@@ -0,0 +1,114 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUser;
+
+public class EPUserTest {
+
+       public EPUser mockEPUser(){
+               
+               EPUser epUser = new EPUser();
+               
+               epUser.setId((long)1);
+               epUser.setManagerId((long) 1234);
+               epUser.setFirstName("test");
+               epUser.setLastName("test");
+               epUser.setMiddleInitial("test");
+               epUser.setPhone("test");
+               epUser.setFax("test");
+               epUser.setCellular("test");
+               epUser.setEmail("test");
+               epUser.setAddressId((long) 123); 
+               epUser.setAlertMethodCd("test");
+               epUser.setHrid("test");
+               epUser.setOrgUserId("test");
+               epUser.setOrgCode("test");
+               epUser.setAddress1("test");
+               epUser.setAddress2("test");
+               epUser.setCity("test");
+               epUser.setState("test");
+               epUser.setZipCode("test");
+               epUser.setCountry("test");
+               epUser.setOrgManagerUserId("test");
+               epUser.setLocationClli("test");
+               epUser.setBusinessCountryCode("test");
+               epUser.setBusinessCountryName("test");
+               epUser.setBusinessUnit("test");
+               epUser.setBusinessUnitName("test");
+               epUser.setDepartment("test");
+               epUser.setDepartmentName("test");
+               epUser.setCompanyCode("test");
+               epUser.setCompany("test");
+               epUser.setZipCodeSuffix("test");
+               epUser.setJobTitle("test");
+               epUser.setCommandChain("test");
+               epUser.setSiloStatus("test");
+               epUser.setCostCenter("test");
+               epUser.setFinancialLocCode("test");
+               epUser.setLoginId("test");
+               epUser.setLoginPwd("test");
+               epUser.setLastLoginDate(new Date());
+               epUser.setActive(false);
+               epUser.setInternal(false);
+               epUser.setSelectedProfileId((long) 12345);
+               epUser.setTimeZoneId((long) 12345);
+               epUser.setOnline(false);
+               epUser.setChatId("test");
+               return epUser;
+                                   
+       }
+       
+       @Test
+       public void userTest(){
+               EPUser user = mockEPUser();
+               
+               assertEquals(user.getId(), new Long(1));
+               assertEquals(user.getManagerId(), new Long(1234));
+               assertEquals(user.getFirstName(), "test");
+               assertEquals(user.getLastName(), "test");
+               assertEquals(user.getMiddleInitial(), "test");
+               assertEquals(user.getPhone(), "test");
+               assertEquals(user.getFax(), "test");
+               assertEquals(user.getCellular(), "test");               
+               assertEquals(user.getEmail(), "test");
+               assertEquals(user.getAddressId(), new Long(123) );
+               assertEquals(user.getAlertMethodCd(), "test");
+               assertEquals(user.getHrid(), "test");
+               assertEquals(user.getOrgUserId(), "test");
+               assertEquals(user.getOrgCode(), "test");
+               assertEquals(user.getAddress1(), "test");
+               assertEquals(user.getAddress2(), "test");
+               assertEquals(user.getState(), "test");
+               assertEquals(user.getZipCode(), "test");
+               assertEquals(user.getCountry(), "test");
+               assertEquals(user.getOrgManagerUserId(), "test");
+               assertEquals(user.getLocationClli(), "test");
+               assertEquals(user.getBusinessCountryCode(), "test");
+               assertEquals(user.getBusinessCountryName(), "test");
+               assertEquals(user.getBusinessUnit(), "test");
+               assertEquals(user.getBusinessUnitName(), "test");
+               assertEquals(user.getDepartment(), "test");
+               assertEquals(user.getDepartmentName(), "test");
+               assertEquals(user.getCompanyCode(), "test");
+               assertEquals(user.getCompany(), "test");
+               assertEquals(user.getZipCodeSuffix(), "test");
+               assertEquals(user.getJobTitle(), "test");
+               assertEquals(user.getCommandChain(), "test");
+               assertEquals(user.getSiloStatus(), "test");
+               assertEquals(user.getFinancialLocCode(), "test");
+               assertEquals(user.getLoginId(), "test");
+               assertEquals(user.getLoginPwd(), "test");
+               assertEquals(user.getActive(), false);
+               assertEquals(user.getInternal(), false);
+               assertEquals(user.getSelectedProfileId(), new Long (12345));
+               assertEquals(user.getTimeZoneId(), new Long (12345));
+               assertEquals(user.getChatId(), "test");
+               
+               //assertEquals(user.toString(), "EPUser [orgId=null, managerId=1234, firstName=test, middleInitial=test, lastName=test, phone=test, fax=test, cellular=test, email=test, addressId=123, alertMethodCd=test, hrid=test, orgUserId=test, orgCode=test, address1=test, address2=test, city=test, state=test, zipCode=test, country=test, orgManagerUserId=test, locationClli=test, businessCountryCode=test, businessCountryName=test, businessUnit=test, businessUnitName=test, department=test, departmentName=test, companyCode=test, company=test, zipCodeSuffix=test, jobTitle=test, commandChain=test, siloStatus=test, costCenter=test, financialLocCode=test, loginId=test, loginPwd=test, lastLoginDate=Tue Sep 05 11:04:49 EDT 2017, active=false, internal=false, selectedProfileId=12345, timeZoneId=12345, online=false, chatId=test, isGuest=false, userApps=[], pseudoRoles=[]]");
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPWidgetsManualSortPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EPWidgetsManualSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..69aa3db
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPWidgetsManualSortPreference;
+
+public class EPWidgetsManualSortPreferenceTest {
+
+       public EPWidgetsManualSortPreference mockEPWidgetsManualSortPreference(){
+               EPWidgetsManualSortPreference epWidgetsManualSortPreference = new EPWidgetsManualSortPreference();
+                               
+               epWidgetsManualSortPreference.setUserId(1);
+               epWidgetsManualSortPreference.setWidgetId((long)1);
+               epWidgetsManualSortPreference.setWidgetRow(1);
+               epWidgetsManualSortPreference.setWidgetCol(1);
+               epWidgetsManualSortPreference.setWidgetWidth(1);
+               epWidgetsManualSortPreference.setWidgetHeight(1);
+                               
+               return epWidgetsManualSortPreference;
+       }
+       
+       @Test
+       public void epWidgetsManualSortPreferenceTest(){
+               EPWidgetsManualSortPreference epWidgetsManualSortPreference = mockEPWidgetsManualSortPreference();
+               
+               assertEquals(epWidgetsManualSortPreference.getWidgetId(), new Long(1));
+               assertEquals(epWidgetsManualSortPreference.getUserId(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetRow(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetCol(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetHeight(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetWidth(), 1);
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleIdTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleIdTest.java
new file mode 100644 (file)
index 0000000..ca2bdfb
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EcompAppRoleId;
+
+public class EcompAppRoleIdTest {
+       
+       public EcompAppRoleId mockEcompAppRoleId(){
+               
+               EcompAppRoleId ecompAppRoleId = new EcompAppRoleId();
+               
+               ecompAppRoleId.setAppId((long)1);
+               ecompAppRoleId.setAppName("test");
+               ecompAppRoleId.setRoleId(1);
+               ecompAppRoleId.setRoleName("test");
+                               
+               return ecompAppRoleId;
+       }
+       
+       @Test
+       public void ecompAppRoleIdTest(){
+               
+       EcompAppRoleId ecompAppRoleId = mockEcompAppRoleId();
+       
+       assertEquals(ecompAppRoleId.getAppId(), new Long(1));
+       assertEquals(ecompAppRoleId.getAppName(), "test");
+       assertEquals(ecompAppRoleId.getRoleId().toString(), "1");
+       assertEquals(ecompAppRoleId.getRoleName(), "test");
+       }
+
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/EcompAppRoleTest.java
new file mode 100644 (file)
index 0000000..4ba244b
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EcompAppRole;
+
+public class EcompAppRoleTest {
+
+       public EcompAppRole mockEcompAppRole(){
+               EcompAppRole ecompAppRole = new EcompAppRole();
+               
+               ecompAppRole.setAppId((long)1);
+               ecompAppRole.setAppName("test");
+               ecompAppRole.setRoleId(1);
+               ecompAppRole.setRoleName("test");
+               
+               return ecompAppRole;
+       }
+       
+       @Test
+       public void ecompAppRoleTest(){
+               EcompAppRole ecompAppRole = mockEcompAppRole();
+               
+               assertEquals(ecompAppRole.getAppId(), new Long(1));
+               assertEquals(ecompAppRole.getAppName(), "test");
+               assertEquals(ecompAppRole.getRoleId().toString(), "1");
+               assertEquals(ecompAppRole.getRoleName(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalRoleDetailsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalRoleDetailsTest.java
new file mode 100644 (file)
index 0000000..e007102
--- /dev/null
@@ -0,0 +1,59 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+import org.openecomp.portalapp.portal.domain.ExternalRoleDetails;
+
+public class ExternalRoleDetailsTest {
+
+       public ExternalRoleDetails mockExternalRoleDetails(){
+               
+               List<EPAppRoleFunction> epAppRoleFunctionList = new ArrayList<EPAppRoleFunction>();
+               
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               epAppRoleFunctionList.add(epAppRoleFunction);
+               
+               ExternalRoleDetails externalRoleDetails = new ExternalRoleDetails();
+               
+               externalRoleDetails.setName("test");
+               externalRoleDetails.setActive(false);
+               externalRoleDetails.setPriority(1);
+               externalRoleDetails.setAppId((long)1);
+               externalRoleDetails.setAppRoleId((long)1);
+               externalRoleDetails.setPerms(epAppRoleFunctionList);
+               
+               return externalRoleDetails;
+       }
+       
+       @Test
+       public void externalRoleDetailsTest(){
+               
+               List<EPAppRoleFunction> epAppRoleFunctionList = new ArrayList<EPAppRoleFunction>();
+               
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               epAppRoleFunctionList.add(epAppRoleFunction);
+               
+               ExternalRoleDetails externalRoleDetails = mockExternalRoleDetails();
+               
+               assertEquals(externalRoleDetails.getAppId(), new Long(1));
+               assertEquals(externalRoleDetails.getAppRoleId(), new Long(1));
+               assertEquals(externalRoleDetails.getPriority().toString(), "1");
+               assertEquals(externalRoleDetails.getName(), "test");
+               assertEquals(externalRoleDetails.getPriority().toString(),  "1");
+               assertEquals(externalRoleDetails.getPerms().size(), epAppRoleFunctionList.size());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemAccessTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemAccessTest.java
new file mode 100644 (file)
index 0000000..ea88457
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.ExternalSystemAccess;
+
+public class ExternalSystemAccessTest {
+       
+       public ExternalSystemAccess mockExternalSystemAccess(){
+               ExternalSystemAccess externalSystemAccess = new ExternalSystemAccess("test", false);
+       
+               externalSystemAccess.setKey("test");
+               externalSystemAccess.setAccessValue(false);
+               
+               return externalSystemAccess;
+       }
+
+       @Test
+       public void externalSystemAccessTest(){
+               ExternalSystemAccess externalSystemAccess = mockExternalSystemAccess();
+               
+               assertEquals(externalSystemAccess.getKey(), "test");
+               assertEquals(externalSystemAccess.getAccessValue(), false);
+       }
+}
+
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemRoleApprovalTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ExternalSystemRoleApprovalTest.java
new file mode 100644 (file)
index 0000000..2c47ed5
--- /dev/null
@@ -0,0 +1,23 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.externalsystemapproval.model.ExternalSystemRoleApproval;
+
+public class ExternalSystemRoleApprovalTest {
+
+       public ExternalSystemRoleApproval mockExternalSystemRoleApproval(){
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApproval.setRoleName("test");
+               
+               return externalSystemRoleApproval;              
+       }
+       
+       @Test
+       public void externalSystemRoleApprovalTest(){
+               ExternalSystemRoleApproval externalSystemRoleApproval = mockExternalSystemRoleApproval();
+               
+               assertEquals(externalSystemRoleApproval.getRoleName(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/FunctionalMenuItemWithAppIDTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/FunctionalMenuItemWithAppIDTest.java
new file mode 100644 (file)
index 0000000..abec873
--- /dev/null
@@ -0,0 +1,28 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.FunctionalMenuItemWithAppID;
+
+public class FunctionalMenuItemWithAppIDTest {
+
+       public FunctionalMenuItemWithAppID mockFunctionalMenuItemWithAppID(){
+               FunctionalMenuItemWithAppID functionalMenuItemWithAppID = new FunctionalMenuItemWithAppID();
+       
+               functionalMenuItemWithAppID.setRestrictedApp(false);
+               functionalMenuItemWithAppID.setUrl("test");
+               
+               
+               return functionalMenuItemWithAppID;
+       }
+       
+       @Test
+       public void functionalMenuItemWithAppIDTest(){
+               FunctionalMenuItemWithAppID functionalMenuItemWithAppID = mockFunctionalMenuItemWithAppID();
+
+               assertEquals(functionalMenuItemWithAppID.toString(), "FunctionalMenuItem [menuId=null, column=null, text=null, parentMenuId=null, url=test, active_yn=null, appid=null, roles=null, restrictedApp=false]");
+       
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/GetAccessResultIdTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/GetAccessResultIdTest.java
new file mode 100644 (file)
index 0000000..90a65eb
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.GetAccessResultId;
+
+public class GetAccessResultIdTest {
+       
+       public GetAccessResultId mockGetAccessResultId(){
+               
+               GetAccessResultId getAccessResultIdObj = new GetAccessResultId();
+               getAccessResultIdObj.setEcompFunction("test");
+               getAccessResultIdObj.setAppName("test");
+               getAccessResultIdObj.setRoleName("test");
+               
+               return getAccessResultIdObj;
+       }
+
+       @Test
+       public void getAccessResultIdObjTest(){
+               GetAccessResultId getAccessResultIdObj = mockGetAccessResultId();
+               
+               assertEquals(getAccessResultIdObj.getEcompFunction(), "test");
+               assertEquals(getAccessResultIdObj.getAppName(), "test");
+               assertEquals(getAccessResultIdObj.getRoleName(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceDataTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceDataTest.java
new file mode 100644 (file)
index 0000000..d7e4ca2
--- /dev/null
@@ -0,0 +1,57 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.MicroserviceData;
+import org.openecomp.portalapp.portal.domain.MicroserviceParameter;
+
+public class MicroserviceDataTest {
+
+       public MicroserviceData mockMicroserviceData(){
+               
+               MicroserviceData microserviceData= new MicroserviceData();
+               
+               List<MicroserviceParameter> parameterList = new ArrayList<MicroserviceParameter>();
+               
+               MicroserviceParameter microserviceParameter = new MicroserviceParameter();
+               microserviceParameter.setId((long)1);
+               microserviceParameter.setServiceId((long)1);
+               microserviceParameter.setPara_key("test");
+               microserviceParameter.setPara_value("test");
+               parameterList.add(microserviceParameter);
+               
+               microserviceData.setId((long)1);
+               microserviceData.setName("test");
+               microserviceData.setActive("test");
+               microserviceData.setDesc("test");
+               microserviceData.setAppId((long)1);
+               microserviceData.setUrl("test");
+               microserviceData.setSecurityType("test");
+               microserviceData.setUsername("test");
+               microserviceData.setPassword("test");
+               
+               
+               return microserviceData;
+       }
+       
+       @Test
+       public void microserviceDataTest(){
+               MicroserviceData microserviceData= mockMicroserviceData();
+               
+               assertEquals(microserviceData.getId(), new Long(1));
+               assertEquals(microserviceData.getName(), "test");
+               assertEquals(microserviceData.getActive(), "test");
+               assertEquals(microserviceData.getDesc(), "test");
+       //      assertEquals(microserviceData.getAppId(), new long(1));
+               assertEquals(microserviceData.getUrl(), "test");
+               assertEquals(microserviceData.getSecurityType(), "test");
+               assertEquals(microserviceData.getUsername(), "test");
+               assertEquals(microserviceData.getPassword(), "test");
+               
+               assertEquals(microserviceData.toString(), "MicroserviceData [id=1, name=test, desc=test, appId=1, "
+                               + "url=test, securityType=test, username=test, password=test, parameterList=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceParameterTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/MicroserviceParameterTest.java
new file mode 100644 (file)
index 0000000..e15f226
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.MicroserviceParameter;
+
+public class MicroserviceParameterTest {
+       
+       public MicroserviceParameter mockMicroserviceParameter(){
+               MicroserviceParameter microserviceParameter = new MicroserviceParameter();
+                               
+               microserviceParameter.setId((long)1);
+               microserviceParameter.setServiceId((long)1);
+               microserviceParameter.setPara_key("test");
+               microserviceParameter.setPara_value("test");
+               
+               return microserviceParameter;
+       }
+
+       @Test
+       public void microserviceParameterTest(){
+               MicroserviceParameter microserviceParameter = mockMicroserviceParameter();
+               assertEquals(microserviceParameter.getId(), new Long(1));
+               assertEquals(microserviceParameter.getServiceId(),(long)1);
+               assertEquals(microserviceParameter.getPara_key(), "test");
+               assertEquals(microserviceParameter.getPara_value(), "test");
+               
+               assertEquals(microserviceParameter.toString(), "MicroserviceParameter [id=1, serviceId=1, para_key=test, para_value=test]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserAppSelectionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserAppSelectionTest.java
new file mode 100644 (file)
index 0000000..7f4bdc1
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.PersUserAppSelection;
+
+public class PersUserAppSelectionTest {
+
+       public PersUserAppSelection mockPersUserAppSelection(){
+               
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setUserId((long)1);
+               persUserAppSelection.setAppId((long)1);
+               persUserAppSelection.setStatusCode("test");
+               
+               return persUserAppSelection;
+       }
+       
+       @Test
+       public void persUserAppSelectionTest(){
+               
+               PersUserAppSelection persUserAppSelection1 = new PersUserAppSelection((long)1, (long)1, (long)1,"test");
+               
+               PersUserAppSelection persUserAppSelection = mockPersUserAppSelection();
+               
+               assertEquals(persUserAppSelection.getUserId(), new Long(1));
+               assertEquals(persUserAppSelection.getAppId(), new Long(1));
+               assertEquals(persUserAppSelection.getStatusCode(), "test");
+               assertEquals(persUserAppSelection1.hashCode(), new PersUserAppSelection((long)1, (long)1, (long)1,"test").hashCode());
+               assertEquals(persUserAppSelection1, new PersUserAppSelection((long)1, (long)1, (long)1,"test"));
+               assertTrue(persUserAppSelection1.equals(new PersUserAppSelection((long)1, (long)1, (long)1,"test")));
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserWidgetSelectionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/PersUserWidgetSelectionTest.java
new file mode 100644 (file)
index 0000000..55e1bd6
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.PersUserWidgetSelection;
+
+public class PersUserWidgetSelectionTest {
+
+       public PersUserWidgetSelection mockPersUserWidgetSelection(){
+               
+               PersUserWidgetSelection persUserWidgetSelection = new PersUserWidgetSelection();
+               
+               persUserWidgetSelection.setUserId((long)1);
+               persUserWidgetSelection.setWidgetId((long)1);
+               persUserWidgetSelection.setStatusCode("test");
+               
+               return persUserWidgetSelection;
+       }
+       
+       @Test
+       public void persUserWidgetSelectionTest(){
+               PersUserWidgetSelection persUserWidgetSelection = mockPersUserWidgetSelection();
+               
+               PersUserWidgetSelection persUserWidgetSelection1 = new PersUserWidgetSelection((long)1, (long)1, (long)1, "test");
+               
+               assertEquals(persUserWidgetSelection.getUserId(), new Long(1));
+               assertEquals(persUserWidgetSelection.getWidgetId(), new Long(1));
+               assertEquals(persUserWidgetSelection.getStatusCode(), "test");
+               assertEquals(persUserWidgetSelection1,  new PersUserWidgetSelection((long)1, (long)1, (long)1, "test"));
+               assertTrue(persUserWidgetSelection1.equals(new PersUserWidgetSelection((long)1, (long)1, (long)1,"test")));
+               assertEquals(persUserWidgetSelection.hashCode(), persUserWidgetSelection1.hashCode());
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ResultTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/ResultTest.java
new file mode 100644 (file)
index 0000000..6763cc0
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.model.Result;
+
+public class ResultTest {
+       
+       public Result mockResult(){
+               
+               Result result= new Result("test");
+               
+               result.setResult("test");
+               return result;
+       }
+
+       @Test
+       public void resultTest(){
+               
+               Result result = mockResult();           
+               result.setResult("test");
+               
+               assertEquals(result.getResult(), "test");
+               
+       }
+       
+                               
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/SharedContextTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/SharedContextTest.java
new file mode 100644 (file)
index 0000000..239080d
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.SharedContext;
+
+public class SharedContextTest {
+
+       public SharedContext mockSharedContext(){
+               
+               SharedContext sharedContext = new SharedContext();
+               sharedContext.setId((long)1);
+               sharedContext.setCreate_time(new Date());
+               sharedContext.setContext_id("test");
+               sharedContext.setCkey("test");
+               sharedContext.setCvalue("test");
+               
+               return sharedContext;
+       }
+       
+       @Test
+       public void sharedContextTest(){
+               SharedContext sharedContext = mockSharedContext();
+               
+               assertEquals(sharedContext.getId(), new Long(1));
+       //      assertEquals(sharedContext.getCreate_time(), new Date());
+               assertEquals(sharedContext.getContext_id(), "test");
+               assertEquals(sharedContext.getCkey(), "test");
+               assertEquals(sharedContext.getCvalue(), "test");
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/UserIdRoleIdTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/UserIdRoleIdTest.java
new file mode 100644 (file)
index 0000000..169d879
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.UserIdRoleId;
+
+public class UserIdRoleIdTest {
+
+       public UserIdRoleId mockUserIdRoleId(){
+               UserIdRoleId userIdRoleId = new UserIdRoleId();
+               userIdRoleId.setUser_Id("test");
+               userIdRoleId.setRoleId("test");
+               userIdRoleId.setOrgUserId("test");
+               userIdRoleId.setAppId("test");
+               
+               return userIdRoleId;
+       }
+       
+       @Test
+       public void userIdRoleIdTest(){
+               UserIdRoleId userIdRoleId = mockUserIdRoleId();
+               
+               assertEquals(userIdRoleId.getUser_Id(), "test");
+               assertEquals(userIdRoleId.getRoleId(), "test");
+               assertEquals(userIdRoleId.getOrgUserId(), "test");
+               assertEquals(userIdRoleId.getAppId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogParameterTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogParameterTest.java
new file mode 100644 (file)
index 0000000..fe525d7
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.WidgetCatalogParameter;
+
+public class WidgetCatalogParameterTest {
+
+       public WidgetCatalogParameter mockWidgetCatalogParameter(){
+               WidgetCatalogParameter widgetCatalogParameter = new WidgetCatalogParameter();
+               
+               widgetCatalogParameter.setId((long)1);
+               widgetCatalogParameter.setWidgetId((long)1);
+               widgetCatalogParameter.setUserId((long)1);
+               widgetCatalogParameter.setParamId((long)1);
+               widgetCatalogParameter.setUser_value("test");
+               
+               return widgetCatalogParameter;
+       }
+       
+       @Test
+       public void widgetCatalogParameterTest(){
+               WidgetCatalogParameter widgetCatalogParameter = mockWidgetCatalogParameter();
+               
+               assertEquals(widgetCatalogParameter.getId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getWidgetId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getUserId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getParamId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getUser_value(), "test");
+               assertEquals(widgetCatalogParameter.toString(), "WidgetCatalogParameter [id=1, widgetId=1, userId=1, paramId=1, user_value=test]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetCatalogTest.java
new file mode 100644 (file)
index 0000000..3b7aa76
--- /dev/null
@@ -0,0 +1,84 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.App;
+import org.openecomp.portalapp.portal.domain.RoleApp;
+import org.openecomp.portalapp.portal.domain.WidgetCatalog;
+
+public class WidgetCatalogTest {
+
+       public WidgetCatalog mockWidgetCatalog() {
+
+               WidgetCatalog widgetCatalog = new WidgetCatalog();
+
+               Set<RoleApp> roleAppSet = new HashSet<RoleApp>();
+               // App
+               App app = new App();
+               app.setAppId((long) 1);
+               app.setAppName("test");
+
+               // RoleApp
+               RoleApp roleApp = new RoleApp();
+               roleApp.setRoleId((long) 1);
+               roleApp.setRoleName("test");
+               roleApp.setApp(app);
+               roleApp.setWidgets(null);
+
+               roleAppSet.add(roleApp);
+
+               widgetCatalog.setId((long) 1);
+               widgetCatalog.setName("test");
+               widgetCatalog.setDesc("test");
+               widgetCatalog.setFileLocation("test");
+               widgetCatalog.setAllowAllUser("test");
+               widgetCatalog.setServiceId((long) 1);
+               widgetCatalog.setSortOrder("test");
+               widgetCatalog.setStatusCode("test");
+
+               widgetCatalog.setWidgetRoles(roleAppSet);
+
+               return widgetCatalog;
+
+       }
+       
+       @Test
+       public void widgetCatalogTest() {
+
+               // App
+               App app = new App();
+               app.setAppId((long) 1);
+               app.setAppName("test");
+
+               Set<RoleApp> roleAppSet = new HashSet<RoleApp>();
+               // RoleApp
+               RoleApp roleApp = new RoleApp();
+               roleApp.setRoleId((long) 1);
+               roleApp.setRoleName("test");
+               roleApp.setApp(app);
+               roleApp.setWidgets(null);
+
+               roleAppSet.add(roleApp);
+
+               WidgetCatalog widgetCatalog = mockWidgetCatalog();
+
+       
+               assertEquals(widgetCatalog.getId(), (long)1);
+               assertEquals(widgetCatalog.getName(), "test");
+               assertEquals(widgetCatalog.getDesc(), "test");
+               assertEquals(widgetCatalog.getFileLocation(), "test");
+               assertEquals(widgetCatalog.getAllowAllUser(), "test");
+               assertEquals(widgetCatalog.getServiceId(), new Long (1));
+               assertEquals(widgetCatalog.getSortOrder(), "test");
+               assertEquals(widgetCatalog.getStatusCode(), "test");
+               assertEquals(widgetCatalog.getWidgetRoles().size(),1);
+               
+               assertEquals("WidgetCatalog [id=1, name=test, desc=test, fileLocation=test, allowAllUser=test]", widgetCatalog.toString());
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetParameterResultTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetParameterResultTest.java
new file mode 100644 (file)
index 0000000..75b3d60
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.WidgetParameterResult;
+
+public class WidgetParameterResultTest {
+
+       public WidgetParameterResult mockWidgetParameterResult(){
+                               
+               WidgetParameterResult widgetParameterResult = new WidgetParameterResult();
+               widgetParameterResult.setParam_id((long)1);
+               widgetParameterResult.setParam_key("test");
+               widgetParameterResult.setUser_value("test");
+               widgetParameterResult.setDefault_value("test");
+               
+               return widgetParameterResult;
+       }
+       
+       @Test
+       public void widgetParameterResultTest(){
+               
+               WidgetParameterResult widgetParameterResult = mockWidgetParameterResult();
+               
+               assertEquals(widgetParameterResult.getParam_key(), "test");
+               assertEquals(widgetParameterResult.getParam_id(), new Long(1));
+               assertEquals(widgetParameterResult.getUser_value(), "test");
+               assertEquals(widgetParameterResult.getDefault_value(), "test");
+               
+               assertEquals("WidgetParameterResult [param_id=1, param_key=test, user_value=test, default_value=test]", widgetParameterResult.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/domain/WidgetTest.java
new file mode 100644 (file)
index 0000000..a759798
--- /dev/null
@@ -0,0 +1,34 @@
+package org.openecomp.portalapp.portal.test.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.Widget;
+
+public class WidgetTest {
+
+       public Widget mockWidget(){
+               
+               Widget widget = new Widget();
+               widget.setName("test");
+               widget.setWidth(100);
+               widget.setHeight(100);
+               widget.setUrl("test");
+               widget.setAppId((long)1);
+                               
+               return widget;
+       }
+        
+       @Test
+       public void widgetTest(){
+               Widget widget = mockWidget();
+               
+               assertEquals(widget.getName(), "test");
+               assertTrue(widget.getWidth() == 100);
+               assertTrue(widget.getHeight() == 100);
+               assertEquals(widget.getUrl(), "test");
+               assertEquals(widget.getAppId(), new Long(1)); 
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/AppContactUsServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/AppContactUsServiceImplTest.java
new file mode 100644 (file)
index 0000000..bb74cc6
--- /dev/null
@@ -0,0 +1,147 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.AppContactUs;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.ecomp.model.AppCategoryFunctionsItem;
+import org.openecomp.portalapp.portal.ecomp.model.AppContactUsItem;
+import org.openecomp.portalapp.portal.service.AppContactUsService;
+import org.openecomp.portalapp.portal.service.AppContactUsServiceImpl;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+
+public class AppContactUsServiceImplTest {
+
+       
+     @Mock
+        DataAccessService dataAccessService = new DataAccessServiceImpl();
+    
+     @Mock
+     AppContactUsService AppContactUsService = new AppContactUsServiceImpl();
+     
+     @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+     @InjectMocks
+     AppContactUsServiceImpl appContactUsServiceImpl = new AppContactUsServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+       @Test
+       public void getAppContactUsTest() throws Exception
+       {
+               
+               List<AppContactUsItem> contactUsItemList  = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppName("testNew");
+               contactUsItemList.add(appContactUsItem);
+               AppContactUsItem appContactUsItem1= new AppContactUsItem();
+               appContactUsItem1.setAppName("test");
+               contactUsItemList.add(appContactUsItem1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAppContactUsItems", null, null)).thenReturn(contactUsItemList);
+               List<AppContactUsItem> expectedcontactUsItemList = appContactUsServiceImpl.getAppContactUs();
+               assertEquals(expectedcontactUsItemList, contactUsItemList);             
+       }
+       
+       @Test
+       public void getAppsAndContactsTest() throws Exception
+       {
+               List<AppContactUsItem> contactUsItemList  = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppName("testNew");
+               contactUsItemList.add(appContactUsItem);
+               AppContactUsItem appContactUsItem1= new AppContactUsItem();
+               appContactUsItem1.setAppName("test");
+               contactUsItemList.add(appContactUsItem1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAppsAndContacts", null, null)).thenReturn(contactUsItemList);
+               List<AppContactUsItem> expectedcontactUsItemList = appContactUsServiceImpl.getAppsAndContacts();
+               assertEquals(expectedcontactUsItemList, contactUsItemList);             
+       }
+       
+       @Test
+       public void getAppCategoryFunctionsTest() throws Exception
+       {
+               List<AppCategoryFunctionsItem> list  = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getAppCategoryFunctions", null, null)).thenReturn(list);
+               List<AppCategoryFunctionsItem> expectedlist = appContactUsServiceImpl.getAppCategoryFunctions();
+               assertEquals(list, expectedlist); 
+       }
+       
+       @Test(expected = java.lang.Exception.class)
+       public void saveAppContactUsTest() throws Exception
+       {
+               HashMap<String, Object> map = new HashMap<String, Object>();
+               List<AppContactUsItem> contactUsModelList = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppId((long) 1);
+               contactUsModelList.add(appContactUsItem);
+               AppContactUs appContact = new AppContactUs();
+               Mockito.when(dataAccessService.getDomainObject(AppContactUs.class, 1, map)).thenReturn(appContact);
+               EPApp app = getApp();
+               Mockito.when(dataAccessService.getDomainObject(EPApp.class, 1, new HashMap<String, Object>())).thenReturn(app);
+               AppContactUs contactUs  = new AppContactUs();
+               contactUs.setApp(app);
+               contactUs.setDescription(appContactUsItem.getDescription());
+               contactUs.setContactName(appContactUsItem.getContactName());
+               contactUs.setContactEmail(appContactUsItem.getContactEmail());
+               contactUs.setActiveYN(appContactUsItem.getActiveYN());
+               contactUs.setUrl(appContactUsItem.getUrl());
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(contactUs,map);
+               appContactUsServiceImpl.saveAppContactUs(contactUsModelList);
+       }
+       
+       @Test(expected = java.lang.NullPointerException.class)
+       public void deleteContactUsTest() throws Exception
+       {
+               HashMap<String, Object> map = new HashMap<String, Object>();
+               AppContactUs contactUs = new AppContactUs();
+               Mockito.when((AppContactUs) dataAccessService.getDomainObject(AppContactUs.class, 1, map)).thenReturn(contactUs);
+               appContactUsServiceImpl.deleteContactUs((long) 1);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/DashboardSearchServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/DashboardSearchServiceImplTest.java
new file mode 100644 (file)
index 0000000..ab380ba
--- /dev/null
@@ -0,0 +1,114 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.ecomp.model.SearchResultItem;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.CommonWidget;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class DashboardSearchServiceImplTest {
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @InjectMocks
+       DashboardSearchServiceImpl dashboardSearchServiceImpl = new DashboardSearchServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+    
+       @Test
+       public void searchResultsTest()
+       {
+               Map<String, String> params = new HashMap<>();
+               params.put("userId", "guestT");
+               params.put("searchQuery", "test");
+               
+               List<SearchResultItem> list = new ArrayList<>();
+               SearchResultItem searchResultItem= new SearchResultItem();
+               searchResultItem.setCategory("test");
+               list.add(searchResultItem);
+               Mockito.when(dataAccessService.executeNamedQuery("searchPortal", params, null)).thenReturn(list);
+               Map<String, List<SearchResultItem>> result  =   dashboardSearchServiceImpl.searchResults("guestT", "test");
+               assertTrue(result.keySet().contains("test"));
+       }
+       
+       @Test
+       public void getRelatedUsersTest()
+       {
+               List<String> activeUsers = new ArrayList<>();
+               Map<String, String> params = new HashMap<>();
+               params.put("userId", "guestT");
+               Mockito.when(dataAccessService.executeNamedQuery("relatedUsers", params, null)).thenReturn(activeUsers);
+               List<String> expectedActiveUsers  =     dashboardSearchServiceImpl.getRelatedUsers("guestT");
+               assertEquals(expectedActiveUsers,activeUsers);
+       }
+       @Test
+       public void getWidgetDataTest()
+       {
+               CommonWidgetMeta CommonWidgetMeta = null;
+               Map<String, String> params = new HashMap<>();
+               params.put("cat", "test");
+               @SuppressWarnings("unchecked")
+               List<CommonWidget> widgetItems = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();
+               widgetItems.add(commonWidget);
+               Mockito.when(dataAccessService.executeNamedQuery("getCommonWidgetItem", params, null)).thenReturn(widgetItems);
+               CommonWidgetMeta expectedCommonWidgetMeta =dashboardSearchServiceImpl.getWidgetData("test");
+               assertEquals(expectedCommonWidgetMeta.getCategory(), "test");
+       }
+       
+       @Test
+       public void saveWidgetDataBulkTest()
+       {
+               CommonWidgetMeta CommonWidgetMeta = new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();
+               widgetList.add(commonWidget);
+               CommonWidgetMeta.setItems(widgetList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(commonWidget, null);
+        assertEquals(dashboardSearchServiceImpl.saveWidgetDataBulk(CommonWidgetMeta), "success");
+       }
+       
+       @Test
+       public void saveWidgetDataTest()
+       {
+               CommonWidget commonWidget = new CommonWidget();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(commonWidget, null);
+                assertEquals(dashboardSearchServiceImpl.saveWidgetData(commonWidget), "success");
+       }
+       
+       @Test
+       public void deleteWidgetDataTest()
+       {
+               CommonWidget commonWidget = new CommonWidget();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(commonWidget, null);
+                assertEquals(dashboardSearchServiceImpl.deleteWidgetData(commonWidget), "success");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceCentralizedImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceCentralizedImplTest.java
new file mode 100644 (file)
index 0000000..7db06a5
--- /dev/null
@@ -0,0 +1,89 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.hibernate.SessionFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionServiceCentralizedImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
+public class EPRoleFunctionServiceCentralizedImplTest {
+
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @Mock
+       SessionFactory sessionFactory;
+
+       @InjectMocks
+       EPRoleFunctionServiceCentralizedImpl ePRoleFunctionServiceCentralizedImpl = new EPRoleFunctionServiceCentralizedImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       
+       @Test
+       public void getRoleFunctions()
+       {
+               List<CentralRoleFunction> getRoleFuncList = new ArrayList<>();
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               getRoleFuncList.add(centralRoleFunction);
+               List<RoleFunction> getRoleFuncListOfPortal = new ArrayList<>();
+               RoleFunction roleFunction = new RoleFunction();
+               getRoleFuncListOfPortal.add(roleFunction);
+               final Map<String, Long> params = new HashMap<>();
+               params.put("appId", (long) 1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAllRoleFunctions", params, null)).thenReturn(getRoleFuncList);
+               List<RoleFunction> expectedGetRoleFuncListOfPortal = ePRoleFunctionServiceCentralizedImpl.getRoleFunctions();
+               assertEquals(expectedGetRoleFuncListOfPortal.size(),getRoleFuncListOfPortal.size());
+       }
+       
+       @Test
+       public void getRoleFunctionsNewTest()
+       {
+               HttpSession session = mockedRequest.getSession();
+               EPUser user = mockUser.mockEPUser();
+               user.setId((long) 1);
+               String userId = user.getId().toString();
+               final Map<String, String> params = new HashMap<>();
+               params.put("userId", userId);           
+               @SuppressWarnings("unused")
+               List getRoleFuncListOfPortal = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getRoleFunctionsOfUser", params, null)).thenReturn(getRoleFuncListOfPortal);
+               Set<String> getRoleFuncListOfPortalSet = ePRoleFunctionServiceCentralizedImpl.getRoleFunctions(mockedRequest, user);
+               assertTrue(getRoleFuncListOfPortalSet.size() == 0);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleFunctionServiceImplTest.java
new file mode 100644 (file)
index 0000000..c8cd8d2
--- /dev/null
@@ -0,0 +1,98 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ SystemProperties.class, EPUserUtils.class })
+public class EPRoleFunctionServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+
+       @InjectMocks
+       EPRoleFunctionServiceImpl ePRoleFunctionServiceImpl = new EPRoleFunctionServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+
+       @Test
+       public void getRoleFunctionsTest() {
+               List<RoleFunction> functions = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(RoleFunction.class, null)).thenReturn(functions);
+               List<RoleFunction> expectedFunctions = ePRoleFunctionServiceImpl.getRoleFunctions();
+               assertEquals(expectedFunctions, functions);
+       }
+
+       @Test
+       public void getRoleFunctionsRequestTest() {
+               EPUser user = mockUser.mockEPUser();
+               HashSet roleFunctions = new HashSet<>();
+               PowerMockito.mockStatic(SystemProperties.class);
+               HttpSession session = mockedRequest.getSession();
+               Mockito.when(session.getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME)))
+                               .thenReturn(roleFunctions);
+               HashSet expectedRoleFunctions = (HashSet) ePRoleFunctionServiceImpl.getRoleFunctions(mockedRequest, user);
+               assertEquals(expectedRoleFunctions, roleFunctions);
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getRoleFunctionsRequestIfNullTest() {
+               EPUser user = mockUser.mockEPUser();
+               HashSet roleFunctions = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPUserUtils.class);
+               HttpSession session = mockedRequest.getSession();
+               Mockito.when(session.getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME)))
+                               .thenReturn(roleFunctions);
+               HashMap roles = new HashMap<>();
+               EPRole role = new EPRole();
+               SortedSet<RoleFunction> roleFunctionSet = new TreeSet<RoleFunction>();
+               RoleFunction rolefun = new RoleFunction();
+               roleFunctionSet.add(rolefun);
+               role.setRoleFunctions(roleFunctionSet);
+               roles.put((long) 1, role);
+               Mockito.when(EPUserUtils.getRoles(mockedRequest)).thenReturn(roles);
+               HashSet expectedRoleFunctions = (HashSet) ePRoleFunctionServiceImpl.getRoleFunctions(mockedRequest, user);
+               assertTrue(expectedRoleFunctions.size() == 1);
+
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/EPRoleServiceImplTest.java
new file mode 100644 (file)
index 0000000..1006035
--- /dev/null
@@ -0,0 +1,208 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.service.EPRoleServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class EPRoleServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @InjectMocks
+       EPRoleServiceImpl ePRoleServiceImpl = new EPRoleServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getRoleFunctionsTest() {
+               List<RoleFunction> roleFunctionList = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(RoleFunction.class, null)).thenReturn(roleFunctionList);
+               List<RoleFunction> expectedRoleFunctionList = ePRoleServiceImpl.getRoleFunctions();
+               assertEquals(roleFunctionList, expectedRoleFunctionList);
+       }
+
+       @Test
+       public void getAvailableChildRolesIfRoleIdIsNullTest() {
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               role.addChildRole(role1);
+               roleList.add(role);
+               Mockito.when(dataAccessService.getList(EPRole.class, null)).thenReturn(roleList);
+               List<EPRole> expectedRoleList = ePRoleServiceImpl.getAvailableChildRoles(null);
+               assertEquals(roleList, expectedRoleList);
+       }
+
+       // @Test
+       // public void getAvailableChildRolesIfRoleIdNotNullTest()
+       // {
+       // List<EPRole> roleList = new ArrayList<>();
+       // EPRole role = new EPRole();
+       // EPRole role1= new EPRole();
+       // role.addChildRole(role1);
+       // roleList.add(role);
+       // Mockito.when(dataAccessService.getDomainObject(EPRole.class, 1,
+       // null)).thenReturn(role);
+       // Mockito.when(dataAccessService.getList(EPRole.class,
+       // null)).thenReturn(roleList);
+       //
+       // List<EPRole> expectedRoleList =
+       // ePRoleServiceImpl.getAvailableChildRoles((long) 1);
+       // System.out.println(expectedRoleList);
+       // assertEquals(roleList,expectedRoleList);
+       // }
+       //
+       @Test
+       public void getRoleFunctionTest() {
+               RoleFunction roleFunction = new RoleFunction();
+               Mockito.when(dataAccessService.getDomainObject(RoleFunction.class, "test", null)).thenReturn(roleFunction);
+               RoleFunction expectedRoleFunction = ePRoleServiceImpl.getRoleFunction("test");
+               assertEquals(expectedRoleFunction, roleFunction);
+       }
+
+       @Test
+       public void saveRoleFunctionTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(role, null);
+               ePRoleServiceImpl.saveRole(role);
+       }
+
+       @Test
+       public void deleteRoleFunctionTest() {
+               RoleFunction roleFunction = new RoleFunction();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(roleFunction, null);
+               ePRoleServiceImpl.deleteRoleFunction(roleFunction);
+       }
+
+       @Test
+       public void getRoleTest() {
+               EPRole role = null;
+               Mockito.when(dataAccessService.getDomainObject(EPRole.class, 1, null)).thenReturn(role);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1);
+               assertEquals(expectedRole, role);
+       }
+
+       @Test
+       public void getRoleIfappIdNullTest() {
+               assertNull(ePRoleServiceImpl.getRole(null, null));
+
+       }
+
+       @Test
+       public void getRoleIfappIdNotNullTest() {
+               List<EPRole> roles = new ArrayList<>();
+               EPRole role = new EPRole();
+               roles.add(role);
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1, (long) 1);
+               assertEquals(expectedRole, role);
+
+       }
+
+       @Test
+       public void getRoleIfListSizeIsMoreThan1Test() {
+               List<EPRole> roles = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               roles.add(role);
+               roles.add(role1);
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1, (long) 1);
+               assertEquals(expectedRole, role);
+
+       }
+
+       @Test
+       public void getRoleIfListSizeIsEmptyTest() {
+               List<EPRole> roles = new ArrayList<>();
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               assertNull(ePRoleServiceImpl.getRole((long) 1, (long) 1));
+
+       }
+
+       @Test
+       public void saveRoleTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(role, null);
+               ePRoleServiceImpl.saveRole(role);
+       }
+
+       @Test
+       public void deleteRoleTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(role, null);
+               ePRoleServiceImpl.deleteRole(role);
+       }
+
+       @Test
+       public void getAvailableRolesTest() {
+               List<EPRole> roleList = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(EPRole.class, null)).thenReturn(roleList);
+               List<EPRole> expectedRoleList = ePRoleServiceImpl.getAvailableRoles();
+               assertEquals(expectedRoleList, roleList);
+       }
+
+       @Test
+       public void getAppRolesTest() {
+               final Map<String, String> portalParams = null;
+               List<EPRole> roleList = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getPortalAppRoles", portalParams, null)).thenReturn(roleList);
+               assertNull(ePRoleServiceImpl.getAppRole("test", (long) 1));
+
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getAppRolesIfNotPortalTest() {
+               final Map<String, String> params = null;
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               roleList.add(role);
+               roleList.add(role1);
+               Mockito.when((List<EPRole>) dataAccessService.executeNamedQuery("getAppRoles", params, null))
+                               .thenReturn(roleList);
+               List<EPRole> expectedRoleList = (List<EPRole>) ePRoleServiceImpl.getAppRole("test", (long) 10);
+               System.out.println(expectedRoleList);
+
+       }
+
+       @Test
+       public void saveRoleFunction() {
+               RoleFunction domainRoleFunction = new RoleFunction();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(domainRoleFunction, null);
+               ePRoleServiceImpl.saveRoleFunction(domainRoleFunction);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ExternalAccessRolesServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ExternalAccessRolesServiceImplTest.java
new file mode 100644 (file)
index 0000000..d8cd642
--- /dev/null
@@ -0,0 +1,346 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.Role;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ EcompPortalUtils.class, SystemProperties.class, EPCommonSystemProperties.class })
+public class ExternalAccessRolesServiceImplTest {
+       @Mock
+       DataAccessService dataAccessService1 = new DataAccessServiceImpl();
+
+       @Mock
+       RestTemplate template = new RestTemplate();
+
+       @InjectMocks
+       ExternalAccessRolesServiceImpl externalAccessRolesServiceImpl = new ExternalAccessRolesServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       public EPApp mockApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 10);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test
+       public void getAppRolesIfAppIsPortalTest() throws Exception {
+               List<EPRole> applicationRoles = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+               List<EPRole> expectedApplicationRoles = externalAccessRolesServiceImpl.getAppRoles((long) 1);
+               assertEquals(expectedApplicationRoles, applicationRoles);
+       }
+
+       @Test
+       public void getAppRolesTest() throws Exception {
+               List<EPRole> applicationRoles = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+               List<EPRole> expectedApplicationRoles = externalAccessRolesServiceImpl.getAppRoles((long) 10);
+               assertEquals(expectedApplicationRoles, applicationRoles);
+       }
+
+       // @SuppressWarnings("null")
+       // @Test(expected = java.lang.Exception.class)
+       // public void getAppRolesExceptionTest() throws Exception{
+       // List<EPRole> applicationRoles = new ArrayList<>();
+       // DataAccessService dataAccessService = null ;
+       // Mockito.when(dataAccessService.getList(EPRole.class, "where app_id = 10",
+       // null, null)).thenThrow(nullPointerException);
+       // List<EPRole> expectedApplicationRoles =
+       // externalAccessRolesServiceImpl.getAppRoles((long) 10);
+       // assertEquals(expectedApplicationRoles,applicationRoles);
+       // }
+
+       @Test(expected = java.lang.Exception.class)
+       public void getAppExceptionTest() throws Exception {
+               List<EPApp> app = new ArrayList<>();
+               String uebKey = "test-ueb-key";
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(app);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+               assertEquals(app, expectedapp);
+       }
+
+       @Test(expected = java.lang.Exception.class)
+       public void getAppTest() throws Exception {
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = mockApp();
+               appList.add(app);
+               String uebKey = "test-ueb-key";
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+       }
+
+       @Test
+       public void getAppErrorTest() throws Exception {
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = mockApp();
+               app.setId((long) 1);
+               appList.add(app);
+               String uebKey = "test-ueb-key";
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+               assertEquals(appList, expectedapp);
+       }
+
+       @Test
+       public void addRoleTest() throws Exception {
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               String uebKey = "test-ueb-key";
+               Role role = new Role();
+               role.setId((long) 25);
+               EPApp app = mockApp();
+               app.setEnabled(true);
+               app.setId((long) 10);
+               app.setNameSpace("test_namesapce");
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<EPApp> appList = new ArrayList<>();
+               appList.add(app);
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole ePRole = new EPRole();
+               role.setName("Test Role");
+               roleList.add(ePRole);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               Mockito.when(dataAccessService1.getList(EPRole.class, " where app_role_id = " + role.getId(), null, null))
+                               .thenReturn(roleList);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL))
+                               .thenReturn("Testurl");
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.CREATED);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.POST),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+
+               assertTrue(externalAccessRolesServiceImpl.addRole(role, uebKey));
+       }
+
+       @Test
+       public void addRoleMethodNotAllowedTest() throws Exception {
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               String uebKey = "test-ueb-key";
+               Role role = new Role();
+               role.setId((long) 25);
+               EPApp app = mockApp();
+               app.setEnabled(true);
+               app.setId((long) 10);
+               app.setNameSpace("test_namesapce");
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<EPApp> appList = new ArrayList<>();
+               appList.add(app);
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole ePRole = new EPRole();
+               role.setName("Test Role");
+               roleList.add(ePRole);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               Mockito.when(dataAccessService1.getList(EPRole.class, " where app_role_id = " + role.getId(), null, null))
+                               .thenReturn(roleList);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL))
+                               .thenReturn("Testurl");
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.METHOD_NOT_ALLOWED);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.POST),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+
+               assertFalse(externalAccessRolesServiceImpl.addRole(role, uebKey));
+       }
+
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test
+       public void deleteCentralRoleFunctionTest() throws Exception {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCd", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params, null))
+                               .thenReturn(centralRoleFunctionList);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.OK);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.DELETE),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+
+               Mockito.doNothing().when(dataAccessService1).deleteDomainObjects(EPAppRoleFunction.class,
+                               "app_id = " + app.getId() + " and function_cd = '" + "menu_fun_code" + "'", null);
+
+               assertTrue(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+
+       @Test
+       public void deleteCentralRoleFunctionFailTest() throws Exception {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCd", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.NOT_FOUND);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params, null))
+                               .thenReturn(centralRoleFunctionList);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.NOT_FOUND);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.DELETE),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenThrow(httpClientErrorException);
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+
+               Mockito.doNothing().when(dataAccessService1).deleteDomainObjects(EPAppRoleFunction.class,
+                               "app_id = " + app.getId() + " and function_cd = '" + "menu_fun_code" + "'", null);
+
+               assertTrue(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+
+       @Test
+       public void deleteCentralRoleFunctionExceptionTest() {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCd", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params, null))
+                               .thenThrow(nullPointerException);
+               assertFalse(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+
+       @Test
+       public void getUserTest() {
+               List<EPUser> userList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               userList.add(user);
+               Mockito.when(dataAccessService1.getList(EPUser.class, " where org_user_id = '" + "guestT" + "'", null, null))
+                               .thenReturn(userList);
+               List<EPUser> expectedUserList = externalAccessRolesServiceImpl.getUser("guestT");
+               assertEquals(expectedUserList, userList);
+       }
+
+       public void saveCentralRoleFunctionTest() throws Exception {
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               centralRoleFunction.setCode("menu_test");
+               EPApp app = mockApp();
+               app.setId((long) 1);
+               final Map<String, String> params = new HashMap<>();
+               params.put("functionCd", "menu_test");
+               params.put("appId", String.valueOf(1));
+               ExternalAccessPerms extPerms = new ExternalAccessPerms();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               HttpHeaders headers = new HttpHeaders();
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<CentralRoleFunction> appRoleFunc  = new ArrayList<>();
+               appRoleFunc.add(centralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params,
+                               null)).thenReturn(appRoleFunc);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.OK);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.GET),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/FunctionalMenuMockServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/FunctionalMenuMockServiceImplTest.java
new file mode 100644 (file)
index 0000000..51802c1
--- /dev/null
@@ -0,0 +1,205 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.FunctionalMenuItemWithAppID;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.test.framework.ApplicationCommonContextTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SystemProperties.class, EPCommonSystemProperties.class})
+public class FunctionalMenuMockServiceImplTest extends ApplicationCommonContextTestSuite {
+
+       @Mock
+       FunctionalMenuService functionalMenuService;
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+    @InjectMocks
+       FunctionalMenuServiceImpl functionalMenuServiceImpl= new FunctionalMenuServiceImpl();
+       
+       @Test
+       public void assignHelpURLsTest(){
+               List<FunctionalMenuItem> menuItems = new ArrayList<FunctionalMenuItem>();
+               FunctionalMenuItem functionalMenuItem1 = new FunctionalMenuItem();
+               functionalMenuItem1.text = "Contact Us";
+               FunctionalMenuItem functionalMenuItem2 = new FunctionalMenuItem();
+               functionalMenuItem2.text = "Get Access";
+               FunctionalMenuItem functionalMenuItem3 = new FunctionalMenuItem();
+               functionalMenuItem3.text = "User Guide";                
+               menuItems.add(functionalMenuItem1);
+               menuItems.add(functionalMenuItem2);
+               menuItems.add(functionalMenuItem3);
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.USER_GUIDE_URL)).thenReturn("http://todo_enter_user_guide_link");
+//             Mockito.doNothing().when(functionalMenuServiceImpl).assignHelpURLs(menuItems);
+               functionalMenuServiceImpl.assignHelpURLs(menuItems);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, "
+                               + "fn_menu_functional_roles r WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  "
+                               + "UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  "
+                               + "WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItems(true);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsNegativeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, "
+                               + "fn_menu_functional_roles r WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  "
+                               + "UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  "
+                               + "WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItems(false);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForNotificationTreeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, fn_menu_functional_roles r "
+                               + "WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id,"
+                               + " m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForNotificationTree(true);
+                assertEquals(actualResult, expectedResult);
+               
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForNotificationNegativeTreeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, fn_menu_functional_roles r "
+                               + "WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id,"
+                               + " m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForNotificationTree(false);
+                assertEquals(actualResult, expectedResult);            
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForAppTest(){
+               String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a, fn_menu_functional_roles mr  "
+                               + "WHERE  mr.app_id='1'  AND mr.menu_id = m.menu_id  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y' AND a.menu_id = m.menu_id  "
+                               + "AND a.ancestor_menu_id = m1.menu_id";
+               Integer appId = 1;
+               List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForApp(appId);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForUserTest(){
+               String orgUserId = "test";
+               String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a,  fn_menu_functional_roles mr, fn_user u , fn_user_role ur  "
+                               + "WHERE  u.org_user_id='test'  AND u.user_id = ur.user_id  AND ur.app_id = mr.app_id  AND (ur.role_id = mr.role_id      OR ur.role_id = '999')  "
+                               + "AND m.menu_id = mr.menu_id  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y'  AND a.menu_id = m.menu_id  "
+                               + "AND a.ancestor_menu_id = m1.menu_id  UNION  select m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m1.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional_roles mr, fn_menu_functional m1,  fn_menu_functional_ancestors a  where a.menu_id = m.menu_id  AND a.ancestor_menu_id = m1.menu_id  AND m.menu_id != m1.menu_id  AND m.menu_id = mr.menu_id  AND mr.role_id = '900'  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn  FROM fn_menu_functional m  WHERE m.text in ('Favorites','Get Access','Contact Us','Support','User Guide','Help')";
+               List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+               actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForUser(orgUserId);
+               assertEquals(actualResult, expectedResult);             
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsTest(){
+               Integer menuid = 1;
+               String sql = "SELECT * FROM fn_menu_functional_roles WHERE menu_id = '1'";
+               FunctionalMenuItem actualResult = null;
+               FunctionalMenuItem expectedResult = null;
+               List<FunctionalMenuRole> roleItems = new ArrayList<FunctionalMenuRole>();
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(roleItems);
+                
+               actualResult = functionalMenuServiceImpl.getFunctionalMenuItemDetails(menuid);
+               assertEquals(actualResult, expectedResult);             
+       }
+               
+       @Test
+       public void getFavoriteItemsTest(){
+               Long userId = (long)1;
+               String sql = "SELECT DISTINCT f.user_id,f.menu_id,m.text,m.url  "
+                               + "FROM fn_menu_favorites f, fn_menu_functional m, fn_menu_functional_roles mr  "
+                               + "WHERE f.user_id='1' AND f.menu_id = m.menu_id  AND f.menu_id = mr.menu_id  AND mr.role_id != '900' ";
+               List<FavoritesFunctionalMenuItemJson> actualResult = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               List<FavoritesFunctionalMenuItemJson> expectedResult = new ArrayList<FavoritesFunctionalMenuItemJson>();
+                
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FavoritesFunctionalMenuItemJson.class, null)).thenReturn(expectedResult);
+                
+               actualResult = functionalMenuServiceImpl.getFavoriteItems(userId);
+               assertEquals(actualResult, expectedResult);             
+       }       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/GetAccessServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/GetAccessServiceImplTest.java
new file mode 100644 (file)
index 0000000..e689fab
--- /dev/null
@@ -0,0 +1,50 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.GetAccessResult;
+import org.openecomp.portalapp.portal.service.GetAccessServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+
+public class GetAccessServiceImplTest {
+
+       
+    @Mock
+       DataAccessService dataAccessService = new DataAccessServiceImpl();
+    @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+    
+    @InjectMocks
+    GetAccessServiceImpl getAccessServiceImpl = new GetAccessServiceImpl();
+
+    MockEPUser mockUser = new MockEPUser();
+    
+    @Test
+       public void getAppAccessListTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Map<String, Long> params = new HashMap<>();
+               params.put("userId", user.getId());
+               List<GetAccessResult> appAccessList = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getAppAccessFunctionRole", params, null)).thenReturn(appAccessList);
+               
+               List<GetAccessResult> expectedAppAccessList =   getAccessServiceImpl.getAppAccessList(user);
+               assertEquals(expectedAppAccessList, appAccessList); 
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/LicenseableClassImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/LicenseableClassImplTest.java
new file mode 100644 (file)
index 0000000..5c4cb5b
--- /dev/null
@@ -0,0 +1,61 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.lm.LicenseableClassImpl;
+
+public class LicenseableClassImplTest {
+       
+       @InjectMocks
+       LicenseableClassImpl licenseableClassImpl= new LicenseableClassImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       @Test
+       public void getApplicationNameTest()
+       {               
+               assertEquals(licenseableClassImpl.getApplicationName(), "");
+       }
+       @Test
+       public void getPublicKeystoreAsInputStreamTest() throws IOException
+       {               
+               assertNull(licenseableClassImpl.getPublicKeystoreAsInputStream());
+       }
+       @Test
+       public void getAliasTest()
+       {               
+               assertEquals(licenseableClassImpl.getAlias(), "");
+       }
+       @Test
+       public void getKeyPasswdTest()
+       {               
+               assertEquals(licenseableClassImpl.getKeyPasswd(), "");
+       }
+       @Test
+       public void getPublicKeystorePasswordTest()
+       {               
+               assertEquals(licenseableClassImpl.getPublicKeystorePassword(), "");
+       }
+       @Test
+       public void getCipherParamPasswordTest()
+       {               
+               assertEquals(licenseableClassImpl.getPublicKeystorePassword(), "");
+       }
+       @Test
+       public void getClassToLicenseTest()
+       {               
+               assertEquals(licenseableClassImpl.getClassToLicense(), LicenseableClassImpl.class);
+       }
+       
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ManifestServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/ManifestServiceImplTest.java
new file mode 100644 (file)
index 0000000..f2b6036
--- /dev/null
@@ -0,0 +1,55 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.Attributes;
+
+import javax.servlet.ServletContext;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.service.ManifestServiceImpl;
+
+public class ManifestServiceImplTest {
+
+       @Mock
+       ServletContext context;
+
+       @Mock
+       ServletContext context1 = null;
+
+       @InjectMocks
+       ManifestServiceImpl manifestServiceImpl = new ManifestServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void getWebappManifestTest() throws IOException {
+               final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF";
+               InputStream inputStream = new ByteArrayInputStream("test data".getBytes());
+               Mockito.when(context.getResourceAsStream(MANIFEST_RESOURCE_PATH)).thenReturn(inputStream);
+               Attributes attributes = manifestServiceImpl.getWebappManifest();
+               assertTrue(attributes.size() == 0);
+       }
+
+       @Test(expected = java.lang.NullPointerException.class)
+       public void getWebappManifestExceptionTest() throws IOException {
+               final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF";
+               InputStream inputStream = new ByteArrayInputStream("test data".getBytes());
+               Mockito.when(context1.getResourceAsStream(MANIFEST_RESOURCE_PATH)).thenThrow(nullPointerException);
+               Attributes attributes = manifestServiceImpl.getWebappManifest();
+               assertTrue(attributes.size() == 0);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/PersUserAppServiceImplTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/service/PersUserAppServiceImplTest.java
new file mode 100644 (file)
index 0000000..bdd6cbd
--- /dev/null
@@ -0,0 +1,181 @@
+package org.openecomp.portalapp.portal.test.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.EPUserApp;
+import org.openecomp.portalapp.portal.domain.PersUserAppSelection;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.PersUserAppServiceImpl;
+import org.openecomp.portalapp.portal.service.UserRolesService;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class PersUserAppServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+       @Mock
+       AdminRolesService adminRolesService;
+       @Mock
+       UserRolesService userRolesService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @InjectMocks
+       PersUserAppServiceImpl persUserAppServiceImpl = new PersUserAppServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test(expected = IllegalArgumentException.class)
+       public void setPersUserAppValueIfUserNull() {
+               persUserAppServiceImpl.setPersUserAppValue(null, null, false, false);
+       }
+
+       @Test
+       public void setPersUserAppValueTest() {
+               EPApp app = getApp();
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, false, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfSelectTest() {
+               EPApp app = getApp();
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfOpenTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfAppNotOpenTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, false);
+       }
+
+       @Test
+       public void setPersUserAppValueIfNotPortalAdminTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, false);
+       }
+
+       @Test
+       public void setPersUserAppValueNewTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, false, false);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java
new file mode 100644 (file)
index 0000000..7fd3c03
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.Analytics;
+
+public class AnalyticsTest {
+
+       public Analytics mockAnalytics(){
+               Analytics analytics = new Analytics();
+                               
+               analytics.setAction("test");
+               analytics.setPage("test");
+               analytics.setFunction("test");
+               analytics.setUserid("test");
+               analytics.setType("test");
+               
+               return analytics;
+       }
+       
+       @Test
+       public void analyticsTest(){
+               Analytics analytics = mockAnalytics();
+               
+               assertEquals(analytics.getAction(), "test");
+               assertEquals(analytics.getPage(), "test");
+               assertEquals(analytics.getFunction(), "test");
+               assertEquals(analytics.getUserid(), "test");
+               assertEquals(analytics.getType(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java
new file mode 100644 (file)
index 0000000..c583c9c
--- /dev/null
@@ -0,0 +1,25 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class AppCatalogPersonalizationTest {
+       
+       public AppCatalogPersonalization mockAppCatalogPersonalization(){
+               AppCatalogPersonalization appCatalogPersonalization = new AppCatalogPersonalization();
+               
+               return appCatalogPersonalization;
+       }
+       
+       @Test
+       public void appCatalogPersonalizationTest(){
+               AppCatalogPersonalization appCatalogPersonalization = mockAppCatalogPersonalization();
+               
+               AppCatalogPersonalization appCatalogPersonalization1 = new AppCatalogPersonalization();
+               
+               assertEquals(appCatalogPersonalization.hashCode(), appCatalogPersonalization1.hashCode());
+               assertTrue(appCatalogPersonalization.equals(appCatalogPersonalization1));
+       }
+
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java
new file mode 100644 (file)
index 0000000..a1dffd2
--- /dev/null
@@ -0,0 +1,38 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.AppNameIdIsAdmin;
+
+public class AppNameIdIsAdminTest {
+
+       public AppNameIdIsAdmin mockAppNameIdIsAdmin(){
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appNameIdIsAdmin.setId((long)1);
+               appNameIdIsAdmin.setAppName("test");
+               appNameIdIsAdmin.setRestrictedApp(false);
+               appNameIdIsAdmin.setIsAdmin(false);
+               return appNameIdIsAdmin;
+       }
+       
+       @Test
+       public void appNameIdIsAdminTest(){
+               AppNameIdIsAdmin appNameIdIsAdmin = mockAppNameIdIsAdmin(); 
+               
+               AppNameIdIsAdmin appNameIdIsAdmin1 = new AppNameIdIsAdmin();
+               appNameIdIsAdmin1.setId((long)1);
+               appNameIdIsAdmin1.setAppName("test");
+               appNameIdIsAdmin1.setRestrictedApp(false);
+               appNameIdIsAdmin1.setIsAdmin(false);
+               
+               assertEquals(appNameIdIsAdmin.getId(), new Long(1));
+               assertEquals(appNameIdIsAdmin.getAppName(), "test");
+               assertEquals(appNameIdIsAdmin.getRestrictedApp(), false);
+               assertEquals(appNameIdIsAdmin.getIsAdmin(), false);
+               
+               assertEquals(appNameIdIsAdmin.toString(), "AppNameIdIsAdmin [id=1, appName=test, isAdmin=false, restrictedApp=false]");
+               assertEquals(appNameIdIsAdmin.hashCode(), appNameIdIsAdmin1.hashCode());
+               assertTrue(appNameIdIsAdmin.equals(appNameIdIsAdmin1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java
new file mode 100644 (file)
index 0000000..2a7c343
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.transport;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
+
+public class AppWithRolesForUserTest {
+
+       public AppWithRolesForUser mockAppWithRolesForUser(){
+               AppWithRolesForUser appWithRolesForUser = new AppWithRolesForUser();
+               
+       //      List<RoleInAppForUser> appRoles = new ArrayList<RoleInAppForUser>();            
+               
+               appWithRolesForUser.setOrgUserId("test");
+               appWithRolesForUser.setAppId((long)1);
+               appWithRolesForUser.setAppName("test");
+               appWithRolesForUser.setAppRoles(null);
+               
+               return appWithRolesForUser;
+       }
+       
+       @Test
+       public void roleInAppForUserTest(){
+               AppWithRolesForUser appWithRolesForUser = mockAppWithRolesForUser();
+               
+               assertEquals(appWithRolesForUser.getOrgUserId(), "test");
+               assertEquals(appWithRolesForUser.getAppId(), new Long(1));
+               assertEquals(appWithRolesForUser.getAppName(), "test");
+               assertEquals(appWithRolesForUser.getAppRoles(), null);
+               assertEquals(appWithRolesForUser.toString(), "AppWithRolesForUser [orgUserId=test, appId=1, appName=test, appRoles=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java
new file mode 100644 (file)
index 0000000..2c601d3
--- /dev/null
@@ -0,0 +1,46 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.AppNameIdIsAdmin;
+import org.openecomp.portalapp.portal.transport.AppsListWithAdminRole;
+
+public class AppsListWithAdminRoleTest {
+       
+       public AppsListWithAdminRole mockAppsListWithAdminRole(){
+               AppsListWithAdminRole appsListWithAdminRole = new AppsListWithAdminRole();
+               
+               ArrayList<AppNameIdIsAdmin> appsRoles = new ArrayList<AppNameIdIsAdmin>();
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appsRoles.add(appNameIdIsAdmin);
+               
+               appsListWithAdminRole.setOrgUserId("test");
+               appsListWithAdminRole.setAppsRoles(appsRoles);
+               
+               return appsListWithAdminRole;
+       }
+
+       @Test
+       public void appsListWithAdminRoleTest(){
+               AppsListWithAdminRole appsListWithAdminRole = mockAppsListWithAdminRole();
+               
+               AppsListWithAdminRole appsListWithAdminRole1 = new AppsListWithAdminRole();
+               
+               ArrayList<AppNameIdIsAdmin> appsRoles = new ArrayList<AppNameIdIsAdmin>();
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appsRoles.add(appNameIdIsAdmin);
+               
+               appsListWithAdminRole1.setOrgUserId("test");
+               appsListWithAdminRole1.setAppsRoles(appsRoles);
+                               
+               assertEquals(appsListWithAdminRole.getOrgUserId(), "test");
+               assertEquals(appsListWithAdminRole.getAppsRoles(), appsRoles);
+               
+               assertTrue(appsListWithAdminRole.equals(appsListWithAdminRole1));
+               assertEquals(appsListWithAdminRole.hashCode(), appsListWithAdminRole1.hashCode());
+               assertEquals(appsListWithAdminRole.toString(), "AppsListWithAdminRole [orgUserId=test, appsRoles=[AppNameIdIsAdmin [id=null, appName=null, isAdmin=null, restrictedApp=null]]]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..854afcc
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.BulkUploadRoleFunction;
+
+public class BulkUploadRoleFunctionTest {
+
+       public BulkUploadRoleFunction mockBulkUploadRoleFunction(){
+               
+               BulkUploadRoleFunction bulkUploadRoleFunction = new BulkUploadRoleFunction();
+                                               
+               bulkUploadRoleFunction.setFunctionName("test");
+               bulkUploadRoleFunction.setFunctionCd("test");
+               
+               return bulkUploadRoleFunction;
+       }
+       
+       @Test
+       public void bulkUploadRoleFunctionTest(){
+               BulkUploadRoleFunction bulkUploadRoleFunction = mockBulkUploadRoleFunction();
+               
+               BulkUploadRoleFunction bulkUploadRoleFunction1 = new BulkUploadRoleFunction();
+               
+               bulkUploadRoleFunction1.setFunctionName("test");
+               bulkUploadRoleFunction1.setFunctionCd("test");
+               
+               assertEquals(bulkUploadRoleFunction.getFunctionCd(), "test");
+               assertEquals(bulkUploadRoleFunction.getFunctionName(), "test");
+               assertEquals(bulkUploadRoleFunction.hashCode(), bulkUploadRoleFunction1.hashCode());
+               assertTrue(bulkUploadRoleFunction.equals(bulkUploadRoleFunction1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java
new file mode 100644 (file)
index 0000000..b2bbba6
--- /dev/null
@@ -0,0 +1,37 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.BulkUploadUserRoles;
+
+public class BulkUploadUserRolesTest {
+
+       public BulkUploadUserRoles mockBulkUploadUserRoles(){
+               BulkUploadUserRoles bulkUploadUserRoles = new BulkUploadUserRoles();
+                               
+               bulkUploadUserRoles.setRoleName("test");
+               bulkUploadUserRoles.setOrgUserId("test");
+               bulkUploadUserRoles.setAppNameSpace("test");
+               
+               return bulkUploadUserRoles;
+       }
+       
+       @Test
+       public void bulkUploadUserRolesTest(){
+               BulkUploadUserRoles bulkUploadUserRoles = mockBulkUploadUserRoles();
+               
+               BulkUploadUserRoles bulkUploadUserRoles1 = new BulkUploadUserRoles();
+               
+               bulkUploadUserRoles1.setRoleName("test");
+               bulkUploadUserRoles1.setOrgUserId("test");
+               bulkUploadUserRoles1.setAppNameSpace("test");
+               
+               assertEquals(bulkUploadUserRoles.getRoleName(), "test");
+               assertEquals(bulkUploadUserRoles.getOrgUserId(), "test");
+               assertEquals(bulkUploadUserRoles.getAppNameSpace(), "test");
+               
+               assertEquals(bulkUploadUserRoles.hashCode(), bulkUploadUserRoles1.hashCode());
+               assertTrue(bulkUploadUserRoles.equals(bulkUploadUserRoles1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java
new file mode 100644 (file)
index 0000000..0ed06b1
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class BusinessCardApplicationRoleTest {
+
+       public BusinessCardApplicationRole mockBusinessCardApplicationRole(){
+               BusinessCardApplicationRole businessCardApplicationRole = new BusinessCardApplicationRole();
+               
+               return businessCardApplicationRole;
+       }
+       
+       @Test
+       public void businessCardApplicationRoleTest(){
+               BusinessCardApplicationRole businessCardApplicationRole = mockBusinessCardApplicationRole();
+               
+               BusinessCardApplicationRole businessCardApplicationRole1 = new BusinessCardApplicationRole();
+               
+               assertEquals(businessCardApplicationRole.hashCode(), businessCardApplicationRole1.hashCode());
+               assertTrue(businessCardApplicationRole.equals(businessCardApplicationRole1));
+               assertEquals(businessCardApplicationRole.toString(), "BusinessCardUserApplicationRoles [appName=null, roleName=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java
new file mode 100644 (file)
index 0000000..9f5e678
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class BusinessCardApplicationRolesListTest {
+
+       public BusinessCardApplicationRolesList mockBusinessCardApplicationRolesList(){
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = new BusinessCardApplicationRolesList();
+               
+               return businessCardApplicationRolesList;
+       }
+       
+       @Test
+       public void businessCardApplicationRolesListTest(){
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = mockBusinessCardApplicationRolesList();
+               
+               BusinessCardApplicationRolesList businessCardApplicationRolesList1 = new BusinessCardApplicationRolesList();
+               
+               assertEquals(businessCardApplicationRolesList.hashCode(), businessCardApplicationRolesList1.hashCode());
+               assertTrue(businessCardApplicationRolesList.equals(businessCardApplicationRolesList1));
+               assertEquals(businessCardApplicationRolesList.toString(), "BusinessCardUserAppRoles [appName=null, roleNames=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java
new file mode 100644 (file)
index 0000000..97c9c59
--- /dev/null
@@ -0,0 +1,102 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralApp;
+
+public class CentralAppTest {
+
+       public CentralApp mockCentralApp(){
+               CentralApp centralApp = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+       
+
+       /*      public CentralApp(Long id, Date created, Date modified, Long createdId, Long modifiedId, Long rowNum, String name,
+                               String imageUrl, String description, String notes, String url, String alternateUrl, String restEndpoint,
+                               String mlAppName, String mlAppAdminId, String motsId, String appPassword, String open, String enabled,
+                               byte[] thumbnail, String username, String uebKey, String uebSecret, String uebTopicName)*/
+               
+               centralApp.setId((long)1);
+               centralApp.setCreatedId((long)1);
+               centralApp.setModifiedId((long)1);
+               centralApp.setRowNum((long)1);
+               centralApp.setName("test");
+               centralApp.setImageUrl("test");
+               centralApp.setDescription("test");
+               centralApp.setNotes("test");
+               centralApp.setUrl("test");
+               centralApp.setAlternateUrl("test");
+               centralApp.setRestEndpoint("test");
+               centralApp.setMlAppName("test");
+               centralApp.setMlAppAdminId("test");
+               centralApp.setMotsId("test");
+               centralApp.setAppPassword("test");
+               centralApp.setOpen("test");
+               centralApp.setEnabled("test");
+               centralApp.setUsername("test");
+               centralApp.setUebKey("test");
+               centralApp.setUebSecret("test");
+               centralApp.setUebTopicName("test");
+               
+               return centralApp;
+       }
+       
+       @Test
+       public void centralAppTest(){
+               CentralApp centralApp = mockCentralApp();
+               
+               CentralApp centralApp1 =  new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               /*centralApp1.setId((long)1);
+               centralApp1.setCreatedId((long)1);
+               centralApp1.setModifiedId((long)1);
+               centralApp1.setRowNum((long)1);
+               centralApp1.setName("test");
+               centralApp1.setImageUrl("test");
+               centralApp1.setDescription("test");
+               centralApp1.setNotes("test");
+               centralApp1.setUrl("test");
+               centralApp1.setAlternateUrl("test");
+               centralApp1.setRestEndpoint("test");
+               centralApp1.setMlAppName("test");
+               centralApp1.setMlAppAdminId("test");
+               centralApp1.setMotsId("test");
+               centralApp1.setAppPassword("test");
+               centralApp1.setOpen("test");
+               centralApp1.setEnabled("test");
+               centralApp1.setUsername("test");
+               centralApp1.setUebKey("test");
+               centralApp1.setUebSecret("test");
+               centralApp1.setUebTopicName("test");*/
+               
+               assertEquals(centralApp.getId(), new Long(1));
+               assertEquals(centralApp.getCreatedId(), new Long(1));
+               assertEquals(centralApp.getModifiedId(), new Long(1));
+               assertEquals(centralApp.getRowNum(), new Long(1));
+               assertEquals(centralApp.getName(), "test");
+               assertEquals(centralApp.getImageUrl(), "test");
+               assertEquals(centralApp.getDescription(), "test");
+               assertEquals(centralApp.getNotes(), "test");
+               assertEquals(centralApp.getUrl(), "test");
+               assertEquals(centralApp.getAlternateUrl(), "test");
+               assertEquals(centralApp.getRestEndpoint(), "test");
+               assertEquals(centralApp.getMlAppName(), "test");
+               assertEquals(centralApp.getMlAppAdminId(), "test");
+               assertEquals(centralApp.getMotsId(), "test");
+               assertEquals(centralApp.getAppPassword(), "test");
+               assertEquals(centralApp.getOpen(), "test");
+               assertEquals(centralApp.getEnabled(), "test");
+               assertEquals(centralApp.getUsername(), "test");
+               assertEquals(centralApp.getUebKey(), "test");
+               assertEquals(centralApp.getUebSecret(), "test");
+               assertEquals(centralApp.getUebTopicName(), "test");
+               
+               assertTrue(centralApp.equals(centralApp1));
+               assertEquals(centralApp.hashCode(), centralApp1.hashCode());
+               /*      assertTrue(centralApp.equals(new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test")));*/
+       }
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java
new file mode 100644 (file)
index 0000000..6ba0a44
--- /dev/null
@@ -0,0 +1,63 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.Date;
+import java.util.SortedSet;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+
+public class CentralRoleTest {
+
+       public CentralRole mockCentralRole(){
+               CentralRole centralRole = new CentralRole((long)1, null, null, (long)1, (long)1, (long)1,
+                               "test", false, 1, null, null, null);
+           
+           centralRole.setId((long)1);
+           centralRole.setCreatedId((long)1);
+           centralRole.setModifiedId((long)1);
+           centralRole.setRowNum((long)1);
+           centralRole.setName("test");
+           centralRole.setActive(false);
+           centralRole.setPriority(1);
+           
+           centralRole.setCreated(null);
+           centralRole.setModified(null);
+           centralRole.setRoleFunctions(null);
+           centralRole.setChildRoles(null);
+           centralRole.setParentRoles(null);
+           
+               return centralRole;
+       }
+       
+       @Test
+       public void centralRoleTest(){
+               CentralRole centralRole = mockCentralRole();
+               
+               CentralRole centralRole1 = new CentralRole((long)1, null, null, (long)1, (long)1, (long)1,
+                               "test", false, 1, null, null, null);
+               
+               CentralRole centralRole2 = new CentralRole((long)1, "test");
+               
+               assertEquals(centralRole.getId(), new Long(1));
+               assertEquals(centralRole.getCreatedId(), new Long(1));
+               assertEquals(centralRole.getModifiedId(), new Long(1));
+               assertEquals(centralRole.getRowNum(), new Long(1));
+               assertEquals(centralRole.getName(), "test");
+               assertEquals(centralRole.isActive(), false);
+               assertEquals(centralRole.getCreated(), null);
+               assertEquals(centralRole.getModified(), null);
+               assertEquals(centralRole.getRoleFunctions(), null);
+               assertEquals(centralRole.getChildRoles(), null);
+               assertEquals(centralRole.getParentRoles(), null);               
+               assertEquals(centralRole.getPriority().toString(), "1");
+               assertEquals(centralRole.hashCode(), centralRole1.hashCode());
+               assertTrue(centralRole.equals(centralRole1));
+               assertEquals(centralRole, centralRole1);
+               assertEquals(centralRole2, new CentralRole((long)1, "test"));
+       }
+       
+       
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java
new file mode 100644 (file)
index 0000000..f358264
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralApp;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalapp.portal.transport.CentralUserApp;
+
+public class CentralUserAppTest {
+
+       public CentralUserApp mockCentralUserApp(){
+               CentralUserApp centralUserApp = new CentralUserApp();
+                               
+               CentralApp app = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               CentralRole role = new CentralRole();
+                
+               centralUserApp.setUserId((long)1);
+               centralUserApp.setApp(app);
+               centralUserApp.setRole(role);
+               centralUserApp.setPriority((short) 123);
+               
+               return centralUserApp;
+       }
+       
+       @Test
+       public void centralUserAppTest(){
+               CentralUserApp centralUserApp = mockCentralUserApp();
+               
+               CentralApp app1 = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               CentralRole role1 = new CentralRole();
+               
+               assertEquals(centralUserApp.getUserId(), new Long(1));
+               assertEquals(centralUserApp.getPriority(), new Short((short) 123));
+               assertEquals(centralUserApp.getApp(), app1);
+               assertEquals(centralUserApp.getRole(), role1);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java
new file mode 100644 (file)
index 0000000..9df86bc
--- /dev/null
@@ -0,0 +1,52 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalapp.portal.transport.CentralUser;
+import org.openecomp.portalapp.portal.transport.CentralUserApp;
+
+public class CentralUserTest {
+
+       public CentralUser mockCentralUser(){
+               Set<CentralUserApp> userApps = new HashSet<CentralUserApp>();
+               Set<CentralRole> pseudoRoles = new HashSet<CentralRole>();
+               CentralUser centralUser = new CentralUser((long)1, null, null, (long)1, (long)1, (long)1, (long)1,
+                               (long)1, "test", "test", "test", "test", "test",
+                               "test", "test", (long)1, "test", "test", "test",
+                               "test", "test", "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", null,
+                               false, false, (long)1, (long)1, false, "test", userApps, pseudoRoles);
+               
+               return centralUser;
+       }
+       
+       @Test
+       public void centralRoleTest(){
+               CentralUser centralUser = mockCentralUser();
+               
+               Set<CentralUserApp> userApps = new HashSet<CentralUserApp>();
+               Set<CentralRole> pseudoRoles = new HashSet<CentralRole>();
+               CentralUser centralUser1 = new CentralUser((long)1, null, null, (long)1, (long)1, (long)1, (long)1,
+                               (long)1, "test", "test", "test", "test", "test",
+                               "test", "test", (long)1, "test", "test", "test",
+                               "test", "test", "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", null,
+                               false, false, (long)1, (long)1, false, "test", userApps, pseudoRoles);
+               
+               
+               assertEquals(centralUser, centralUser1);
+               assertEquals(centralUser.hashCode(), centralUser1.hashCode());
+               assertTrue(centralUser.equals(centralUser1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java
new file mode 100644 (file)
index 0000000..6e8b401
--- /dev/null
@@ -0,0 +1,47 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPAppsManualPreference;
+
+public class EPAppsManualPreferenceTest {
+
+       public EPAppsManualPreference mockEPAppsManualPreference(){
+               EPAppsManualPreference epAppsManualPreference = new EPAppsManualPreference();
+                               
+               epAppsManualPreference.setAppid((long)1);
+               epAppsManualPreference.setCol(1);
+               epAppsManualPreference.setHeaderText("test");
+               epAppsManualPreference.setImageLink("test");
+               epAppsManualPreference.setOrder(1);
+               epAppsManualPreference.setRestrictedApp(false);
+               epAppsManualPreference.setRow(1);
+               epAppsManualPreference.setSizeX(1);
+               epAppsManualPreference.setSizeY(1);
+               epAppsManualPreference.setSubHeaderText("test");
+               epAppsManualPreference.setUrl("test");
+               epAppsManualPreference.setAddRemoveApps(false);
+               
+               return epAppsManualPreference;
+       }
+       
+       @Test
+       public void epAppsManualPreferenceTest(){
+               
+               EPAppsManualPreference epAppsManualPreference = mockEPAppsManualPreference();
+               
+               assertEquals(epAppsManualPreference.getAppid(), new Long(1));
+               assertEquals(epAppsManualPreference.getCol(), 1);
+               assertEquals(epAppsManualPreference.getHeaderText(), "test");
+               assertEquals(epAppsManualPreference.getImageLink(), "test");
+               assertEquals(epAppsManualPreference.getOrder(), 1);
+               assertEquals(epAppsManualPreference.isRestrictedApp(), false);
+               assertEquals(epAppsManualPreference.getRow(), 1);
+               assertEquals(epAppsManualPreference.getSizeX(), 1);
+               assertEquals(epAppsManualPreference.getSizeY(), 1);
+               assertEquals(epAppsManualPreference.getSubHeaderText(), "test");
+               assertEquals(epAppsManualPreference.getUrl(), "test");
+               assertEquals(epAppsManualPreference.isAddRemoveApps(), false);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..6c67424
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPAppsSortPreference;
+
+public class EPAppsSortPreferenceTest {
+
+       public EPAppsSortPreference mockEPAppsSortPreference(){
+               EPAppsSortPreference epAppsSortPreference = new EPAppsSortPreference();
+               
+               epAppsSortPreference.setIndex(1);
+               epAppsSortPreference.setValue("test");
+               epAppsSortPreference.setTitle("test");
+               
+               return epAppsSortPreference;
+       }
+       
+       @Test
+       public void epAppsSortPreferenceTest(){
+               EPAppsSortPreference epAppsSortPreference = mockEPAppsSortPreference();
+               
+               assertEquals(epAppsSortPreference.getIndex(), 1);
+               assertEquals(epAppsSortPreference.getValue(), "test");
+               assertEquals(epAppsSortPreference.getTitle(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java
new file mode 100644 (file)
index 0000000..78bb847
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPDeleteAppsManualSortPref;
+
+public class EPDeleteAppsManualSortPrefTest {
+
+       public EPDeleteAppsManualSortPref mockEPDeleteAppsManualSortPref(){
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = new EPDeleteAppsManualSortPref();
+               
+               epDeleteAppsManualSortPref.setAppId((long)1);
+               epDeleteAppsManualSortPref.setSelect(false);
+               epDeleteAppsManualSortPref.setPending(false);
+
+               return epDeleteAppsManualSortPref;
+       }
+       
+       @Test
+       public void epDeleteAppsManualSortPrefTest(){
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = mockEPDeleteAppsManualSortPref();
+               
+               assertEquals(epDeleteAppsManualSortPref.getAppId(), new Long(1));
+               assertEquals(epDeleteAppsManualSortPref.isSelect(), false);
+               assertEquals(epDeleteAppsManualSortPref.isPending(), false);
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java
new file mode 100644 (file)
index 0000000..9c82ad3
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPUserAppCurrentRoles;
+
+public class EPUserAppCurrentRolesTest {
+
+       public EPUserAppCurrentRoles mockEPUserAppCurrentRoles(){
+               EPUserAppCurrentRoles epUserAppCurrentRoles = new EPUserAppCurrentRoles();
+                       
+               epUserAppCurrentRoles.setRoleName("test");
+               epUserAppCurrentRoles.setUserId((long)1);
+               epUserAppCurrentRoles.setPriority("test");
+               epUserAppCurrentRoles.setRoleId((long)1);
+               
+               return epUserAppCurrentRoles;
+       }
+       
+       @Test
+       public void epUserAppCurrentRolesTest(){
+               EPUserAppCurrentRoles epUserAppCurrentRoles = mockEPUserAppCurrentRoles();
+               
+               EPUserAppCurrentRoles epUserAppCurrentRoles1 = new EPUserAppCurrentRoles();
+               
+               epUserAppCurrentRoles1.setRoleName("test");
+               epUserAppCurrentRoles1.setUserId((long)1);
+               epUserAppCurrentRoles1.setPriority("test");
+               epUserAppCurrentRoles1.setRoleId((long)1);
+               
+               assertEquals(epUserAppCurrentRoles.getRoleName(), "test");
+               assertEquals(epUserAppCurrentRoles.getUserId(), new Long(1));
+               assertEquals(epUserAppCurrentRoles.getRoleId(), new Long(1));
+               assertEquals(epUserAppCurrentRoles.getPriority(), "test");
+               assertEquals(epUserAppCurrentRoles.hashCode(), epUserAppCurrentRoles1.hashCode());
+               assertTrue(epUserAppCurrentRoles.equals(epUserAppCurrentRoles1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..d466d91
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPWidgetsSortPreference;
+
+public class EPWidgetsSortPreferenceTest {
+       
+       public EPWidgetsSortPreference mockEPWidgetsSortPreference(){
+               EPWidgetsSortPreference epWidgetsSortPreference = new EPWidgetsSortPreference();
+                               
+               epWidgetsSortPreference.setSizeX(1);
+               epWidgetsSortPreference.setSizeY(1);
+               epWidgetsSortPreference.setHeaderText("test");
+               epWidgetsSortPreference.setUrl("test");
+               epWidgetsSortPreference.setWidgetid((long)1);
+               epWidgetsSortPreference.setWidgetIdentifier("test");
+               epWidgetsSortPreference.setRow(1);
+               epWidgetsSortPreference.setCol(1);
+               
+               return epWidgetsSortPreference;
+       }
+       
+       @Test
+       public void epWidgetsSortPreferenceTest(){
+               EPWidgetsSortPreference epWidgetsSortPreference = mockEPWidgetsSortPreference();
+               
+               assertEquals(epWidgetsSortPreference.getSizeX(), 1);
+               assertEquals(epWidgetsSortPreference.getSizeY(), 1);
+               assertEquals(epWidgetsSortPreference.getHeaderText(), "test");
+               assertEquals(epWidgetsSortPreference.getUrl(), "test");
+               assertEquals(epWidgetsSortPreference.getWidgetid(), new Long(1));
+               assertEquals(epWidgetsSortPreference.getWidgetIdentifier(), "test");
+               assertEquals(epWidgetsSortPreference.getRow(), 1);
+               assertEquals(epWidgetsSortPreference.getRow(), 1);
+               
+       }
+       
+
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java
new file mode 100644 (file)
index 0000000..928c373
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EcompUserAppRoles;
+
+public class EcompUserAppRolesTest {
+
+       public EcompUserAppRoles mockEcompUserAppRoles(){
+               EcompUserAppRoles ecompUserAppRoles = new EcompUserAppRoles();
+                       
+               ecompUserAppRoles.setAppId("test");
+               ecompUserAppRoles.setUserId((long)1);
+               ecompUserAppRoles.setPriority("test");
+               ecompUserAppRoles.setRoleId((long)1);
+               ecompUserAppRoles.setRoleName("test");
+               
+               return ecompUserAppRoles;
+       }
+       
+       @Test
+       public void ecompUserAppRolesTest(){
+               
+               EcompUserAppRoles ecompUserAppRoles = mockEcompUserAppRoles();
+               
+               assertEquals(ecompUserAppRoles.getAppId(), "test");
+               assertEquals(ecompUserAppRoles.getPriority(), "test");
+               assertEquals(ecompUserAppRoles.getRoleName(), "test");
+               assertEquals(ecompUserAppRoles.getUserId(), new Long(1));
+               assertEquals(ecompUserAppRoles.getRoleId(), new Long(1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java
new file mode 100644 (file)
index 0000000..11fe2cf
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItemExtVO;
+
+public class EpNotificationItemExtVOTest {
+
+       public EpNotificationItemExtVO mockEpNotificationItemExtVO(){
+               EpNotificationItemExtVO epNotificationItemExtVO = new EpNotificationItemExtVO();
+               
+               //epNotificationItemExtVO.setActiveYn("abc");
+               epNotificationItemExtVO.setMsgHeader("test");
+               epNotificationItemExtVO.setMsgDescription("test");
+               epNotificationItemExtVO.setPriority(1);
+               epNotificationItemExtVO.setCreatorId(1);
+               epNotificationItemExtVO.setLoginId("test");
+               
+               return epNotificationItemExtVO;
+       }
+       
+       @Test
+       public void epNotificationItemExtVOTest(){
+               EpNotificationItemExtVO epNotificationItemExtVO = mockEpNotificationItemExtVO();
+               
+               assertEquals(epNotificationItemExtVO.getMsgHeader(), "test");
+               assertEquals(epNotificationItemExtVO.getMsgDescription(), "test");
+               assertEquals(epNotificationItemExtVO.getPriority().toString(), "1");
+               assertEquals(epNotificationItemExtVO.getCreatorId().toString(), "1");
+               assertEquals(epNotificationItemExtVO.getLoginId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java
new file mode 100644 (file)
index 0000000..6e1e48c
--- /dev/null
@@ -0,0 +1,64 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItem;
+
+public class EpNotificationItemTest {
+       
+       public EpNotificationItem mockEpNotificationItem(){
+               EpNotificationItem epNotificationItem = new EpNotificationItem();
+               
+               epNotificationItem.setNotificationId((long)1);
+               epNotificationItem.setIsForOnlineUsers("test");
+               epNotificationItem.setIsForAllRoles("test");
+               epNotificationItem.setActiveYn("test");
+               epNotificationItem.setMsgHeader("test");
+               epNotificationItem.setMsgDescription("test");
+               epNotificationItem.setMsgSource("test");
+               
+               epNotificationItem.setPriority((long)1);
+               epNotificationItem.setCreatedId((long)1);
+               epNotificationItem.setNotificationHyperlink("test");
+               
+               return epNotificationItem;
+       }
+       
+       @Test
+       public void epNotificationItemTest(){
+               EpNotificationItem epNotificationItem = mockEpNotificationItem();
+               
+               EpNotificationItem epNotificationItem1 = new EpNotificationItem();
+               epNotificationItem1.setNotificationId((long)1);
+               epNotificationItem1.setIsForOnlineUsers("test");
+               epNotificationItem1.setIsForAllRoles("test");
+               epNotificationItem1.setActiveYn("test");
+               epNotificationItem1.setMsgHeader("test");
+               epNotificationItem1.setMsgDescription("test");
+               epNotificationItem1.setMsgSource("test");
+               
+               epNotificationItem1.setPriority((long)1);
+               epNotificationItem1.setCreatedId((long)1);
+               epNotificationItem1.setNotificationHyperlink("test");
+               
+               assertEquals(epNotificationItem.getNotificationId(), new Long(1));
+               assertEquals(epNotificationItem.getIsForOnlineUsers(), "test");
+               assertEquals(epNotificationItem.getIsForAllRoles(), "test");
+               assertEquals(epNotificationItem.getActiveYn(), "test");
+               assertEquals(epNotificationItem.getMsgHeader(), "test");
+               assertEquals(epNotificationItem.getMsgDescription(), "test");
+               assertEquals(epNotificationItem.getMsgSource(), "test");
+               assertEquals(epNotificationItem.getPriority(), new Long(1));
+               assertEquals(epNotificationItem.getCreatedId(), new Long(1));
+               assertEquals(epNotificationItem.getNotificationHyperlink(), "test");
+               
+               assertEquals(epNotificationItem.toString(), "EpNotificationItem [notificationId=1, isForOnlineUsers=test, isForAllRoles=test, activeYn=test, msgHeader=test, msgDescription=test, msgSource=test, startTime=null, endTime=null, priority=1, creatorId=null, createdDate=null, roles=null, roleIds=null]");
+               assertEquals(epNotificationItem.hashCode(), epNotificationItem1.hashCode());
+               assertTrue(epNotificationItem.equals(epNotificationItem1));
+                               
+       }
+
+}
+
+
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java
new file mode 100644 (file)
index 0000000..35a1183
--- /dev/null
@@ -0,0 +1,46 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItemVO;
+
+public class EpNotificationItemVOTest {
+
+       public EpNotificationItemVO mockEpNotificationItemVO(){
+               EpNotificationItemVO epNotificationItemVO = new EpNotificationItemVO();
+                               
+               epNotificationItemVO.setNotificationId(1);
+               epNotificationItemVO.setIsForOnlineUsers('a');
+               epNotificationItemVO.setIsForAllRoles('a');
+               epNotificationItemVO.setActiveYn('a');
+               epNotificationItemVO.setMsgHeader("test");
+               epNotificationItemVO.setMsgDescription("test");
+               epNotificationItemVO.setMsgSource("test");
+               epNotificationItemVO.setPriority(1);
+               epNotificationItemVO.setCreatorId(1);
+               epNotificationItemVO.setLoginId("test");
+               epNotificationItemVO.setNotificationHyperlink("test");
+               
+                return epNotificationItemVO;
+       }
+       
+       @Test
+       public void epNotificationItemVOTest(){
+               EpNotificationItemVO epNotificationItemVO = mockEpNotificationItemVO();
+               
+               assertEquals(epNotificationItemVO.getNotificationId().toString(), "1");
+               /*assertEquals(epNotificationItemVO.getIsForOnlineUsers(), 'a');
+               assertEquals(epNotificationItemVO.getIsForAllRoles(), 'a');
+               assertEquals(epNotificationItemVO.getActiveYn(), 'a');*/
+               assertEquals(epNotificationItemVO.getMsgHeader(), "test");
+               assertEquals(epNotificationItemVO.getMsgDescription(), "test");
+               assertEquals(epNotificationItemVO.getMsgSource(), "test");
+               assertEquals(epNotificationItemVO.getPriority().toString(), "1");
+               assertEquals(epNotificationItemVO.getCreatorId().toString(), "1");
+               assertEquals(epNotificationItemVO.getLoginId(), "test");
+               assertEquals(epNotificationItemVO.getNotificationHyperlink(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java
new file mode 100644 (file)
index 0000000..beb67ba
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpRoleNotificationItem;
+
+public class EpRoleNotificationItemTest {
+       
+       public EpRoleNotificationItem mockEpRoleNotificationItem(){
+               EpRoleNotificationItem epRoleNotificationItem = new EpRoleNotificationItem();
+               
+               epRoleNotificationItem.setId((long)1);
+               epRoleNotificationItem.setNotificationId((long)1);
+               epRoleNotificationItem.setRoleId(1);
+               epRoleNotificationItem.setRecvUserId(1);
+               
+               return epRoleNotificationItem;
+       }
+       
+       @Test
+       public void epRoleNotificationItemTest(){
+               EpRoleNotificationItem epRoleNotificationItem = mockEpRoleNotificationItem();
+               
+               assertEquals(epRoleNotificationItem.getId(), new Long(1));
+               assertEquals(epRoleNotificationItem.getNotificationId(), new Long(1));
+               assertEquals(epRoleNotificationItem.getRoleId().toString(), "1");
+               assertEquals(epRoleNotificationItem.getRecvUserId().toString(), "1");
+       }
+
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java
new file mode 100644 (file)
index 0000000..f490973
--- /dev/null
@@ -0,0 +1,39 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPermsDetail;
+
+public class ExternalAccessPermsDetailTest {
+
+       public ExternalAccessPermsDetail mockExternalAccessPermsDetail(){
+               ExternalAccessPermsDetail externalAccessPermsDetail = new ExternalAccessPermsDetail();
+                               
+               List<String> roles = new ArrayList<String>();
+               
+               externalAccessPermsDetail.setType("test");
+               externalAccessPermsDetail.setInstance("test");
+               externalAccessPermsDetail.setAction("test");
+               externalAccessPermsDetail.setDescription("test");
+               externalAccessPermsDetail.setRoles(roles);
+               
+               return externalAccessPermsDetail;
+       }
+       
+       @Test
+       public void externalAccessPermsDetailTest(){
+               ExternalAccessPermsDetail externalAccessPermsDetail = mockExternalAccessPermsDetail();
+               
+               List<String> roles = new ArrayList<String>();
+               
+               assertEquals(externalAccessPermsDetail.getType(), "test");
+               assertEquals(externalAccessPermsDetail.getInstance(), "test");
+               assertEquals(externalAccessPermsDetail.getAction(), "test");
+               assertEquals(externalAccessPermsDetail.getDescription(), "test");
+               assertEquals(externalAccessPermsDetail.getRoles(), roles);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java
new file mode 100644 (file)
index 0000000..dfae604
--- /dev/null
@@ -0,0 +1,42 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
+
+public class ExternalAccessPermsTest {
+
+       public ExternalAccessPerms mockExternalAccessPerms(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+                               
+               externalAccessPerms.setType("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               
+               return externalAccessPerms;
+       }
+       
+       @Test
+       public void externalAccessPermsTest(){
+               ExternalAccessPerms externalAccessPerms = mockExternalAccessPerms();
+               
+               ExternalAccessPerms externalAccessPerms1 = new ExternalAccessPerms("test", "test", "test");
+               ExternalAccessPerms externalAccessPerms2 = new ExternalAccessPerms("test", "test", "test", "test");
+               ExternalAccessPerms externalAccessPerms3 = new ExternalAccessPerms();
+               externalAccessPerms3.setType("test");
+               externalAccessPerms3.setInstance("test");
+               externalAccessPerms3.setAction("test");
+               externalAccessPerms3.setDescription("test");
+               
+               assertEquals(externalAccessPerms.getType(), "test");
+               assertEquals(externalAccessPerms.getInstance(), "test");
+               assertEquals(externalAccessPerms.getAction(), "test");
+               assertEquals(externalAccessPerms.getDescription(), "test");
+               assertEquals(externalAccessPerms.hashCode(), externalAccessPerms3.hashCode());
+               
+               assertTrue(externalAccessPerms1.equals(new ExternalAccessPerms("test", "test", "test")));
+               assertTrue(externalAccessPerms2.equals(new ExternalAccessPerms("test", "test", "test", "test")));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java
new file mode 100644 (file)
index 0000000..4e736eb
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
+import org.openecomp.portalapp.portal.transport.ExternalAccessRolePerms;
+
+public class ExternalAccessRolePermsTest {
+
+       public ExternalAccessRolePerms mockExternalAccessRolePerms(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setType("test");
+               ExternalAccessRolePerms ExternalAccessRolePerms = new ExternalAccessRolePerms(externalAccessPerms, "test");
+               
+               return ExternalAccessRolePerms;
+       }
+       
+       @Test
+       public void externalAccessRolePermsTest(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setType("test");
+               
+               ExternalAccessRolePerms ExternalAccessRolePerms = mockExternalAccessRolePerms();
+               
+               assertEquals(ExternalAccessRolePerms.getRole(), "test");
+               assertEquals(ExternalAccessRolePerms.getPerm(), externalAccessPerms);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java
new file mode 100644 (file)
index 0000000..19dee19
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessRole;
+
+public class ExternalAccessRoleTest {
+
+       public ExternalAccessRole mockExternalAccessRole(){
+               ExternalAccessRole externalAccessRole = new ExternalAccessRole();
+               
+               externalAccessRole.setName("test");
+               externalAccessRole.setDescription("test");
+               
+               return externalAccessRole;
+       }
+       
+       @Test
+       public void externalAccessRoleTest(){
+               ExternalAccessRole externalAccessRole = mockExternalAccessRole();
+               
+               assertEquals(externalAccessRole.getName(), "test");
+               assertEquals(externalAccessRole.getDescription(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java
new file mode 100644 (file)
index 0000000..6ffab98
--- /dev/null
@@ -0,0 +1,47 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessUserRoleDetail;
+import org.openecomp.portalapp.portal.transport.ExternalRoleDescription;
+
+public class ExternalAccessUserRoleDetailTest {
+
+       public ExternalAccessUserRoleDetail mockExternalAccessUserRoleDetail(){
+               
+               ExternalRoleDescription externalRoleDescription = new ExternalRoleDescription();
+               externalRoleDescription.setId("test");
+               externalRoleDescription.setName("test");
+               externalRoleDescription.setActive("test");
+               externalRoleDescription.setPriority("test");
+               externalRoleDescription.setAppId("test");
+               externalRoleDescription.setAppRoleId("test");
+                           
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail = new ExternalAccessUserRoleDetail("test", externalRoleDescription);
+               
+               externalAccessUserRoleDetail.setName("test");
+               externalAccessUserRoleDetail.setDescription(externalRoleDescription);
+               return externalAccessUserRoleDetail;
+       }
+       
+       @Test
+       public void externalAccessUserRoleDetailTest(){
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail = mockExternalAccessUserRoleDetail();
+               
+               ExternalRoleDescription externalRoleDescription1 = new ExternalRoleDescription();
+               externalRoleDescription1.setId("test");
+               externalRoleDescription1.setName("test");
+               externalRoleDescription1.setActive("test");
+               externalRoleDescription1.setPriority("test");
+               externalRoleDescription1.setAppId("test");
+               externalRoleDescription1.setAppRoleId("test");
+                           
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail1 = new ExternalAccessUserRoleDetail("test", externalRoleDescription1);
+               
+               assertEquals(externalAccessUserRoleDetail.getName(), externalAccessUserRoleDetail1.getName());
+               assertEquals(externalAccessUserRoleDetail.getDescription(), externalAccessUserRoleDetail1.getDescription());
+               assertEquals(externalAccessUserRoleDetail.hashCode(), externalAccessUserRoleDetail1.hashCode());
+               assertTrue(externalAccessUserRoleDetail.equals(externalAccessUserRoleDetail1));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java
new file mode 100644 (file)
index 0000000..d2be97b
--- /dev/null
@@ -0,0 +1,24 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessUser;
+
+public class ExternalAccessUserTest {
+
+       public ExternalAccessUser mockExternalAccessUser(){
+               ExternalAccessUser externalAccessUser = new ExternalAccessUser("test", "test");
+               
+               return externalAccessUser;
+       }
+       
+       @Test
+       public void externalAccessUserTest(){
+               ExternalAccessUser externalAccessUser = mockExternalAccessUser();
+               
+               assertEquals(externalAccessUser.getRole(), "test");
+               assertEquals(externalAccessUser.getUser(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java
new file mode 100644 (file)
index 0000000..5b6fe82
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalRoleDescription;
+
+public class ExternalRoleDescriptionTest {
+
+       public ExternalRoleDescription mockExternalRoleDescription(){
+               
+               ExternalRoleDescription externalRoleDescription = new ExternalRoleDescription();
+                           
+           externalRoleDescription.setId("test");
+           externalRoleDescription.setName("test");
+           externalRoleDescription.setActive("test");
+           externalRoleDescription.setPriority("test");
+           externalRoleDescription.setAppId("test");
+           externalRoleDescription.setAppRoleId("test");
+           
+               return externalRoleDescription;
+       }
+       
+       @Test
+       public void externalRoleDescriptionTest(){
+               ExternalRoleDescription externalRoleDescription = mockExternalRoleDescription();
+               
+               assertEquals(externalRoleDescription.getId(), "test");
+               assertEquals(externalRoleDescription.getName(), "test");
+               assertEquals(externalRoleDescription.getActive(), "test");
+               assertEquals(externalRoleDescription.getPriority(), "test");
+               assertEquals(externalRoleDescription.getAppId(), "test");
+               assertEquals(externalRoleDescription.getAppRoleId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java
new file mode 100644 (file)
index 0000000..7d4b96e
--- /dev/null
@@ -0,0 +1,42 @@
+package org.openecomp.portalapp.portal.transport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+
+public class FunctionalMenuItemTest {
+       
+       public FunctionalMenuItem mockFunctionalMenuItem(){
+               FunctionalMenuItem functionalMenuItem = new FunctionalMenuItem();
+               
+               List<Integer> roles = new ArrayList<Integer>();
+               
+               functionalMenuItem.setRestrictedApp(false);
+               functionalMenuItem.setUrl("test");
+               functionalMenuItem.setRoles(roles);
+               
+               return functionalMenuItem;
+       }
+       
+       @Test
+       public void functionalMenuItemTest(){
+               FunctionalMenuItem functionalMenuItem = mockFunctionalMenuItem();
+               
+               FunctionalMenuItem functionalMenuItem1 = mockFunctionalMenuItem();
+               
+               List<Integer> roles = new ArrayList<Integer>();
+               
+               functionalMenuItem1.setRestrictedApp(false);
+               functionalMenuItem1.setUrl("test");
+               functionalMenuItem1.setRoles(roles);
+               
+               assertEquals(functionalMenuItem.getRoles(), functionalMenuItem1.getRoles());
+               assertEquals(functionalMenuItem.toString(), "FunctionalMenuItem [menuId=null, column=null, text=null, parentMenuId=null, url=test, active_yn=null, appid=null, roles=[], restrictedApp=false]");
+               // assertTrue(functionalMenuItem.normalize(), functionalMenuItem1.normalize());
+       }
+
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java
new file mode 100644 (file)
index 0000000..09f4bc6
--- /dev/null
@@ -0,0 +1,40 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+
+public class FunctionalMenuRoleTest {
+
+       public FunctionalMenuRole mockFunctionalMenuRole(){
+               FunctionalMenuRole functionalMenuRole = new FunctionalMenuRole();
+               
+               functionalMenuRole.setId(1);
+               functionalMenuRole.setMenuId((long)1);
+               functionalMenuRole.setAppId(1);
+               functionalMenuRole.setRoleId(1);
+               
+               return functionalMenuRole;
+       }
+       
+       @Test
+       public void functionalMenuRoleTest(){
+               FunctionalMenuRole functionalMenuRole = mockFunctionalMenuRole();
+               
+               FunctionalMenuRole functionalMenuRole1 = new FunctionalMenuRole();
+               functionalMenuRole1.setId(1);
+               functionalMenuRole1.setMenuId((long)1);
+               functionalMenuRole1.setAppId(1);
+               functionalMenuRole1.setRoleId(1);
+                                
+               assertEquals(functionalMenuRole.getId().toString(), "1");
+               assertEquals(functionalMenuRole.getMenuId(), new Long(1));
+               assertEquals(functionalMenuRole.getAppId().toString(), "1");
+               assertEquals(functionalMenuRole.getRoleId().toString(), "1");
+               assertEquals(functionalMenuRole.toString(), "FunctionalMenuRole [id=1, menuId=1, appId=1, roleId=1]");
+               assertTrue(functionalMenuRole.equals(functionalMenuRole1));
+               assertEquals(functionalMenuRole.hashCode(), functionalMenuRole1.hashCode());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java
new file mode 100644 (file)
index 0000000..ef926f6
--- /dev/null
@@ -0,0 +1,65 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RemoteRole;
+import org.openecomp.portalapp.portal.transport.RemoteUserWithRoles;
+
+public class RemoteUserWithRolesTest {
+
+       public RemoteUserWithRoles mockRemoteUserWithRoles(){
+               RemoteUserWithRoles remoteUserWithRoles = new RemoteUserWithRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               remoteUserWithRoles.setOrgId((long)1);
+               remoteUserWithRoles.setManagerId((long)1);
+               remoteUserWithRoles.setFirstName("test");
+               remoteUserWithRoles.setMiddleInitial("test");
+               remoteUserWithRoles.setLastName("test");
+               remoteUserWithRoles.setPhone("test");
+               remoteUserWithRoles.setEmail("test");
+               remoteUserWithRoles.setHrid("test");
+               remoteUserWithRoles.setOrgUserId("test");
+               remoteUserWithRoles.setOrgCode("test");
+               remoteUserWithRoles.setOrgManagerUserId("test");
+               remoteUserWithRoles.setJobTitle("test");
+               remoteUserWithRoles.setLoginId("test");
+               remoteUserWithRoles.setActive(false);
+               remoteUserWithRoles.setRoles(roles);
+               
+               return remoteUserWithRoles;
+       }
+       
+       @Test
+       public void remoteUserWithRolesTest(){
+               RemoteUserWithRoles remoteUserWithRoles = mockRemoteUserWithRoles();
+               
+               assertEquals(remoteUserWithRoles.getOrgId(), new Long(1));
+               assertEquals(remoteUserWithRoles.getManagerId(), new Long(1));
+               assertEquals(remoteUserWithRoles.getFirstName(), "test");
+               assertEquals(remoteUserWithRoles.getMiddleInitial(), "test");
+               assertEquals(remoteUserWithRoles.getLastName(), "test");
+               assertEquals(remoteUserWithRoles.getPhone(), "test");
+               assertEquals(remoteUserWithRoles.getEmail(), "test");
+               assertEquals(remoteUserWithRoles.getHrid(), "test");
+               assertEquals(remoteUserWithRoles.getOrgUserId(), "test");
+               assertEquals(remoteUserWithRoles.getOrgCode(), "test");
+               assertEquals(remoteUserWithRoles.getOrgManagerUserId(), "test");
+               assertEquals(remoteUserWithRoles.getJobTitle(), "test");
+               assertEquals(remoteUserWithRoles.getLoginId(), "test");
+               assertEquals(remoteUserWithRoles.getActive(), false);
+               assertEquals(remoteUserWithRoles.getRoles().size(), 1);
+               assertEquals(remoteUserWithRoles.toString(), "RemoteUserWithRoles [orgId=1, managerId=1, firstName=test, middleInitial=test, lastName=test, phone=test, "
+                               + "email=test, hrid=test, orgUserId=test, orgCode=test, orgManagerUserId=test, jobTitle=test, loginId=test, active=false, roles=[RemoteRole [id=1, name=test]]]");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java
new file mode 100644 (file)
index 0000000..66624c2
--- /dev/null
@@ -0,0 +1,37 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RoleInAppForUser;
+
+public class RoleInAppForUserTest {
+
+       public RoleInAppForUser mockRoleInAppForUser(){
+               RoleInAppForUser roleInAppForUser = new RoleInAppForUser((long)1 , "test");
+               roleInAppForUser.setRoleId((long)1);
+               roleInAppForUser.setRoleName("test");
+               roleInAppForUser.setIsApplied(false);
+               
+               return roleInAppForUser;
+       }
+       
+       @Test
+       public void roleInAppForUserTest(){
+               RoleInAppForUser roleInAppForUser = mockRoleInAppForUser();
+               
+               RoleInAppForUser roleInAppForUser1 = new RoleInAppForUser((long)1 , "test");
+               roleInAppForUser1.setRoleId((long)1);
+               roleInAppForUser1.setRoleName("test");
+               roleInAppForUser1.setIsApplied(false);
+               
+               assertEquals(roleInAppForUser.getRoleId(), new Long(1));
+               assertEquals(roleInAppForUser.getRoleName(), "test");
+               assertEquals(roleInAppForUser.getIsApplied(), false);
+               
+               assertEquals(roleInAppForUser.toString(), "RoleInAppForUser [roleId=1, roleName=test, isApplied=false]");
+               assertTrue(roleInAppForUser.equals(roleInAppForUser1));
+               assertEquals(roleInAppForUser.hashCode(), roleInAppForUser1.hashCode());
+               //constructor
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java
new file mode 100644 (file)
index 0000000..632eeb4
--- /dev/null
@@ -0,0 +1,58 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RemoteRole;
+import org.openecomp.portalapp.portal.transport.UserApplicationRoles;
+
+public class UserApplicationRolesTest {
+
+       public UserApplicationRoles mockUserApplicationRoles(){
+               UserApplicationRoles userApplicationRoles = new UserApplicationRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               userApplicationRoles.setAppId((long)1);
+               userApplicationRoles.setOrgUserId("test");
+               userApplicationRoles.setFirstName("test");
+               userApplicationRoles.setLastName("test");
+               userApplicationRoles.setRoles(roles);
+               
+               return userApplicationRoles;
+       }
+       
+       @Test
+       public void userApplicationRolesTest(){
+               UserApplicationRoles userApplicationRoles = mockUserApplicationRoles();
+               
+               UserApplicationRoles userApplicationRoles1 = new UserApplicationRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               userApplicationRoles1.setAppId((long)1);
+               userApplicationRoles1.setOrgUserId("test");
+               userApplicationRoles1.setFirstName("test");
+               userApplicationRoles1.setLastName("test");
+               userApplicationRoles1.setRoles(roles);
+               
+               assertEquals(userApplicationRoles.getAppId(), userApplicationRoles1.getAppId());
+               assertEquals(userApplicationRoles.getOrgUserId(), userApplicationRoles1.getOrgUserId());
+               assertEquals(userApplicationRoles.getFirstName(), userApplicationRoles1.getFirstName());
+               assertEquals(userApplicationRoles.getLastName(), userApplicationRoles1.getLastName());
+               assertEquals(userApplicationRoles.getRoles(), userApplicationRoles1.getRoles());
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java
new file mode 100644 (file)
index 0000000..7267dcd
--- /dev/null
@@ -0,0 +1,19 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.UserWithNameSurnameTitle;
+
+public class UserWithNameSurnameTitleTest {
+
+       @Test
+       public void userWithNameSurnameTitleTest(){
+               
+               UserWithNameSurnameTitle userWithNameSurnameTitle = new UserWithNameSurnameTitle("test", "test", "test", "test");
+               
+               assertEquals(userWithNameSurnameTitle, new UserWithNameSurnameTitle("test", "test", "test", "test"));
+               assertEquals(userWithNameSurnameTitle.hashCode(), new UserWithNameSurnameTitle("test", "test", "test", "test").hashCode());
+               assertTrue(userWithNameSurnameTitle.equals(new UserWithNameSurnameTitle("test", "test", "test", "test")));
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java
new file mode 100644 (file)
index 0000000..6681d0a
--- /dev/null
@@ -0,0 +1,25 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.WidgetCatalogPersonalization;
+
+public class WidgetCatalogPersonalizationTest {
+
+       public WidgetCatalogPersonalization mockWidgetCatalogPersonalization(){
+               WidgetCatalogPersonalization widgetCatalogPersonalization = new WidgetCatalogPersonalization();
+               
+               widgetCatalogPersonalization.setWidgetId((long)1);
+               widgetCatalogPersonalization.setSelect(false);
+               return widgetCatalogPersonalization;
+       }
+       
+       @Test
+       public void widgetCatalogPersonalizationTest(){
+               WidgetCatalogPersonalization widgetCatalogPersonalization = mockWidgetCatalogPersonalization();
+               
+               assertEquals(widgetCatalogPersonalization.getWidgetId(), new Long(1));
+               assertEquals(widgetCatalogPersonalization.getSelect(), false);
+       }
+}
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/test/exceptions/NoHealthyServiceExceptionTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/test/exceptions/NoHealthyServiceExceptionTest.java
new file mode 100644 (file)
index 0000000..33389fb
--- /dev/null
@@ -0,0 +1,23 @@
+package org.openecomp.portalapp.test.exceptions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.exceptions.NoHealthyServiceException;
+
+public class NoHealthyServiceExceptionTest {
+
+       public NoHealthyServiceException mockNoHealthyServiceException(){
+               NoHealthyServiceException noHealthyServiceException = new NoHealthyServiceException("test");
+               
+               return noHealthyServiceException;
+       }
+       
+       @Test
+       public void noHealthyServiceExceptionTest(){
+               NoHealthyServiceException noHealthyServiceException = mockNoHealthyServiceException();
+               
+       //      assertEquals(noHealthyServiceException, new NoHealthyServiceException("test"));
+               assertEquals(noHealthyServiceException.toString(), "NoHealthyServiceException [] test");
+       }
+}
index 79968b3..6e5e5ee 100644 (file)
@@ -15,7 +15,7 @@
                <epsdk.version>1.3.0</epsdk.version>
                <encoding>UTF-8</encoding>
                <!-- Tests usually require some setup that maven cannot do, so skip. -->
                <epsdk.version>1.3.0</epsdk.version>
                <encoding>UTF-8</encoding>
                <!-- Tests usually require some setup that maven cannot do, so skip. -->
-               <skipTests>true</skipTests>
+               <skipTests>false</skipTests>
                <nexusproxy>https://nexus.onap.org</nexusproxy>
                <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
                <stagingNexusPath>content/repositories/staging/</stagingNexusPath>
                <nexusproxy>https://nexus.onap.org</nexusproxy>
                <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
                <stagingNexusPath>content/repositories/staging/</stagingNexusPath>
                <finalName>${project.artifactId}</finalName>
 
                <plugins>
                <finalName>${project.artifactId}</finalName>
 
                <plugins>
-
+                       <plugin>
+                           <groupId>org.jacoco</groupId>
+                           <artifactId>jacoco-maven-plugin</artifactId>
+                           <version>0.7.6.201602180812</version>
+                           <inherited>True</inherited>
+                           <executions>
+                               <!-- Unit-Tests -->
+                               <execution>
+                                   <id>prepare-agent</id>
+                                   <goals>
+                                       <goal>prepare-agent</goal>
+                                   </goals>
+                                   <configuration>
+                                       <destFile>${sonar.jacoco.reportPath}</destFile>
+                                   </configuration>
+                               </execution>
+                               <execution>
+                                   <id>report</id>
+                                   <goals>
+                                       <goal>report</goal>
+                                   </goals>
+                                   <configuration>
+                                       <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                                       <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                                   </configuration>
+                               </execution>
+                               <!-- Will see build errors while running the test cases because of dual 
+                                                                       instrumentation -->
+                               <execution>
+                                   <id>default-instrument</id>
+                                   <goals>
+                                       <goal>instrument</goal>
+                                   </goals>
+                               </execution>
+                               <execution>
+                                   <id>default-restore-instrumented-classes</id>
+                                   <goals>
+                                       <goal>restore-instrumented-classes</goal>
+                                   </goals>
+                               </execution>
+                               <!-- Integration Tests (Only report goal) -->
+                               <execution>
+                                   <id>report-integration</id>
+                                   <goals>
+                                       <goal>report-integration</goal>
+                                   </goals>
+                                   <configuration>
+                                       <dataFile>${sonar.jacoco.itReportPath}</dataFile>
+                                       <outputDirectory>${project.basedir}/target/site/it-jacoco</outputDirectory>
+                                   </configuration>
+                               </execution>
+                           </executions>
+                       </plugin>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <version>3.1</version>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <version>3.1</version>
                                </exclusion>
                        </exclusions>
                </dependency>
                                </exclusion>
                        </exclusions>
                </dependency>
+               
 
                <!-- Hibernate -->
                <dependency>
 
                <!-- Hibernate -->
                <dependency>
                        <version>4.11</version>
                        <scope>test</scope>
                </dependency>
                        <version>4.11</version>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-api-mockito</artifactId>
+                       <version>1.6.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-core</artifactId>
+                       <version>1.6.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-module-junit4</artifactId>
+                       <version>1.6.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.mockito</groupId>
+                       <artifactId>mockito-core</artifactId>
+                       <version>1.8.5</version>
+               </dependency>
+               <dependency>
+                   <groupId>org.jacoco</groupId>
+                   <artifactId>jacoco-maven-plugin</artifactId>
+                   <version>0.7.6.201602180812</version>
+               </dependency>
 
                <dependency>
                        <groupId>commons-beanutils</groupId>
 
                <dependency>
                        <groupId>commons-beanutils</groupId>
                        <artifactId>springfox-swagger2</artifactId>
                        <version>2.5.0</version>
                </dependency>
                        <artifactId>springfox-swagger2</artifactId>
                        <version>2.5.0</version>
                </dependency>
-
                <dependency>
                        <groupId>io.springfox</groupId>
                        <artifactId>springfox-swagger-ui</artifactId>
                        <version>2.5.0</version>
                </dependency>
                <dependency>
                        <groupId>io.springfox</groupId>
                        <artifactId>springfox-swagger-ui</artifactId>
                        <version>2.5.0</version>
                </dependency>
-
+               
+               <!-- Schedulers required Libraries -->
+               
+               <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+               <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>2.23.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.jaxrs</groupId>
+            <artifactId>jackson-jaxrs-json-provider</artifactId>
+            <version>2.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.connectors</groupId>
+            <artifactId>jersey-jetty-connector</artifactId>
+            <version>2.23.1</version>
+        </dependency>
        </dependencies>
        </dependencies>
+       
 
        <!-- No deployment descriptor. -->
 
 
        <!-- No deployment descriptor. -->
 
index 986f638..dfea5fe 100644 (file)
@@ -78,9 +78,9 @@ public abstract class EPFusionBaseController extends FusionBaseController {
        public Map<String, Object> setMenu(Set<MenuData> menuResult) throws Exception {
                ObjectMapper mapper = new ObjectMapper();
                List<List<MenuData>> childItemList = new ArrayList<List<MenuData>>();
        public Map<String, Object> setMenu(Set<MenuData> menuResult) throws Exception {
                ObjectMapper mapper = new ObjectMapper();
                List<List<MenuData>> childItemList = new ArrayList<List<MenuData>>();
-               ;
+               
                List<MenuData> parentList = new ArrayList<MenuData>();
                List<MenuData> parentList = new ArrayList<MenuData>();
-               ;
+               
                Map<String, Object> model = new HashMap<String, Object>();
                for (MenuData menu : menuResult) {
                        MenuData parentData = new MenuData();
                Map<String, Object> model = new HashMap<String, Object>();
                for (MenuData menu : menuResult) {
                        MenuData parentData = new MenuData();
@@ -99,8 +99,8 @@ public abstract class EPFusionBaseController extends FusionBaseController {
                        }
                        childItemList.add(tempList);
                }
                        }
                        childItemList.add(tempList);
                }
-               model.put("childItemList", childItemList != null ? mapper.writeValueAsString(childItemList) : "");
-               model.put("parentList", parentList != null ? mapper.writeValueAsString(parentList) : "");
+               model.put("childItemList",  mapper.writeValueAsString(childItemList));
+               model.put("parentList", mapper.writeValueAsString(parentList));
                return model;
        }
 }
                return model;
        }
 }
index fabf5e1..1e9c83e 100644 (file)
@@ -25,6 +25,7 @@ import org.openecomp.portalsdk.core.domain.AuditLog;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
 import org.openecomp.portalsdk.core.service.AuditService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.slf4j.MDC;
 import org.openecomp.portalsdk.core.service.AuditService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.slf4j.MDC;
@@ -469,4 +470,18 @@ public class ExternalAccessRolesController implements BasicAuthenticationControl
                return functionsList;
        }
        
                return functionsList;
        }
        
+       
+       @ApiOperation(value = "Gets all active Users of application", response = String.class, responseContainer = "Json")
+       @RequestMapping(value = { "/users" }, method = RequestMethod.GET, produces = "application/json")
+       public  List<EcompUser> getUsersOfApplication(HttpServletRequest request, HttpServletResponse response) throws Exception {
+               List<EcompUser> users = null;
+               try {
+                       users = externalAccessRolesService.getAllAppUsers(request.getHeader(UEBKEY));
+               } catch (Exception e) {         
+                       response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+                       logger.error(EELFLoggerDelegate.errorLogger, "getUsersOfApplication failed", e);
+                       throw new Exception(e.getMessage());
+               }
+               return users;
+       }
 }
 }
index 490a182..21a6e8e 100644 (file)
@@ -267,6 +267,7 @@ public class FunctionalMenuController extends EPRestrictedBaseController {
        @RequestMapping(value = {
                        "/portalApi/functionalMenuForAuthUser" }, method = RequestMethod.GET, produces = "application/json")
        public List<FunctionalMenuItem> getMenuItemsForAuthUser(HttpServletRequest request, HttpServletResponse response) {
        @RequestMapping(value = {
                        "/portalApi/functionalMenuForAuthUser" }, method = RequestMethod.GET, produces = "application/json")
        public List<FunctionalMenuItem> getMenuItemsForAuthUser(HttpServletRequest request, HttpServletResponse response) {
+
                EPUser user = EPUserUtils.getUserSession(request);
                List<FunctionalMenuItem> menuItems = null;
                try {
                EPUser user = EPUserUtils.getUserSession(request);
                List<FunctionalMenuItem> menuItems = null;
                try {
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/PolicyController.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/PolicyController.java
new file mode 100644 (file)
index 0000000..5f691d2
--- /dev/null
@@ -0,0 +1,105 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package  org.openecomp.portalapp.portal.controller;
+
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.json.simple.JSONObject;
+import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
+import org.openecomp.portalapp.portal.scheduler.policy.PolicyProperties;
+import org.openecomp.portalapp.portal.scheduler.policy.PolicyResponseWrapper;
+import org.openecomp.portalapp.portal.scheduler.policy.PolicyRestInterfaceFactory;
+import org.openecomp.portalapp.portal.scheduler.policy.PolicyRestInterfaceIfc;
+import org.openecomp.portalapp.portal.scheduler.policy.PolicyUtil;
+import org.openecomp.portalapp.portal.scheduler.policy.RestObject;
+import org.openecomp.portalapp.portal.utils.PortalConstants;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+/*import org.openecomp.vid.policy.PolicyProperties;
+import org.openecomp.vid.policy.PolicyResponseWrapper;
+import org.openecomp.vid.policy.PolicyRestInterfaceFactory;
+import org.openecomp.vid.policy.PolicyRestInterfaceIfc;
+import org.openecomp.vid.policy.PolicyUtil;*/
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+
+
+/**
+ * Controller to handle Policy requests.
+ */
+
+@RestController
+@RequestMapping(PortalConstants.REST_AUX_API)
+@Configuration
+@EnableAspectJAutoProxy
+@EPAuditLog
+public class PolicyController implements BasicAuthenticationController{        
+               
+       /** The logger. */
+       static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PolicyController.class);
+       
+       @RequestMapping(value="/get_policy",method = RequestMethod.POST)        
+       public ResponseEntity<String> getPolicyInfo( HttpServletRequest request, @RequestBody JSONObject policy_request) throws Exception {     
+               
+               logger.debug(EELFLoggerDelegate.debugLogger,  "#####################POLICY API CALL STARTED ###############"+ PolicyProperties.POLICY_GET_CONFIG_VAL);
+               logger.debug(EELFLoggerDelegate.debugLogger,  "#####################Policy Request ###############"+policy_request.toString());
+
+               String path = SystemProperties.getProperty(PolicyProperties.POLICY_GET_CONFIG_VAL);
+               PolicyResponseWrapper policyResWrapper = getPolicyConfig(policy_request,path);
+               
+               logger.debug(EELFLoggerDelegate.debugLogger, "$$$$$$$$$$$$$$$$$$$$$$ " + new ResponseEntity<String>(policyResWrapper.getResponse(), HttpStatus.OK).toString());
+
+               return ( new ResponseEntity<String>(policyResWrapper.getResponse(), HttpStatus.valueOf(policyResWrapper.getStatus())) );                
+       }
+       
+       protected static PolicyResponseWrapper getPolicyConfig(JSONObject request, String path) throws Exception {
+               String methodName = "getPolicyConfig";
+               String uuid = UUID.randomUUID().toString();
+               logger.debug(EELFLoggerDelegate.debugLogger,  "starting getPolicyConfig ");
+
+               try {
+                       //STARTING REST API CALL AS AN FACTORY INSTACE
+                       PolicyRestInterfaceIfc policyRestController = PolicyRestInterfaceFactory.getInstance(); 
+                       
+                       RestObject<String> restObjStr = new RestObject<String>();
+                       String str = new String();
+                       restObjStr.set(str);
+                       policyRestController.<String>Post(str, request, uuid, path, restObjStr );
+                       PolicyResponseWrapper policyRespWrapper = PolicyUtil.wrapResponse (restObjStr);
+                       logger.debug(EELFLoggerDelegate.debugLogger, "<== " + methodName + " w=" + policyRespWrapper.getResponse());
+                       return policyRespWrapper;
+               } catch (Exception e) { 
+                       logger.debug(EELFLoggerDelegate.debugLogger, "EXCEPTION in getPolicyConfig <== " + "." + methodName + e.toString());
+
+                       throw e;
+               }
+       }
+}
+
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/SchedulerController.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/SchedulerController.java
new file mode 100644 (file)
index 0000000..54e95ae
--- /dev/null
@@ -0,0 +1,248 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.json.simple.JSONObject;
+import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
+import org.openecomp.portalapp.portal.scheduler.SchedulerProperties;
+import org.openecomp.portalapp.portal.scheduler.SchedulerRestInterface;
+import org.openecomp.portalapp.portal.scheduler.SchedulerUtil;
+import org.openecomp.portalapp.portal.scheduler.restobjects.GetTimeSlotsRestObject;
+import org.openecomp.portalapp.portal.scheduler.restobjects.PostCreateNewVnfRestObject;
+import org.openecomp.portalapp.portal.scheduler.restobjects.PostSubmitVnfChangeRestObject;
+import org.openecomp.portalapp.portal.scheduler.wrapper.GetTimeSlotsWrapper;
+import org.openecomp.portalapp.portal.scheduler.wrapper.PostCreateNewVnfWrapper;
+import org.openecomp.portalapp.portal.scheduler.wrapper.PostSubmitVnfChangeTimeSlotsWrapper;
+import org.openecomp.portalapp.portal.utils.PortalConstants;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(PortalConstants.REST_AUX_API)
+@Configuration
+@EnableAspectJAutoProxy
+@EPAuditLog
+public class SchedulerController implements BasicAuthenticationController {
+
+       @Autowired
+       private SchedulerRestInterface schedulerRestController;
+
+       private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerController.class);
+
+       /** The request date format. */
+       public DateFormat requestDateFormat = new SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss z");
+
+       @RequestMapping(value = "/get_time_slots/{scheduler_request}", method = RequestMethod.GET)
+       public ResponseEntity<String> getTimeSlots(HttpServletRequest request,
+                       @PathVariable("scheduler_request") String scheduler_request) throws Exception {
+
+               Date startingTime = new Date();
+               String startTimeRequest = requestDateFormat.format(startingTime);
+
+               System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+               System.out.println(startTimeRequest + " | Controller Scheduler GET : /get_time_slots/{scheduler_request} \n");
+               System.out.println("Original Request : \n " + scheduler_request + '\n');
+
+               String path = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_GET_TIME_SLOTS) + scheduler_request;
+
+               GetTimeSlotsWrapper schedulerResWrapper = getTimeSlots(scheduler_request, path, scheduler_request);
+
+               Date endTime = new Date();
+               String endTimeRequest = requestDateFormat.format(endTime);
+               System.out.println(endTimeRequest + " | Controller Scheduler - GET\n");
+
+               return (new ResponseEntity<String>(schedulerResWrapper.getResponse(), HttpStatus.OK));
+
+       }
+
+       protected GetTimeSlotsWrapper getTimeSlots(String request, String path, String uuid) throws Exception {
+
+               try {
+                       // STARTING REST API CALL AS AN FACTORY INSTACE
+                       System.out.println("<== Get Time Slots Request START \n");
+
+                       GetTimeSlotsRestObject<String> restObjStr = new GetTimeSlotsRestObject<String>();
+                       String str = new String();
+
+                       restObjStr.set(str);
+
+                       schedulerRestController.Get(str, uuid, path, restObjStr);
+                       GetTimeSlotsWrapper schedulerRespWrapper = SchedulerUtil.getTimeSlotsWrapResponse(restObjStr);
+
+                       System.out.println(
+                                       "<== Get Time Slots Request END : Response = " + schedulerRespWrapper.getResponse() + '\n');
+
+                       return schedulerRespWrapper;
+
+               } catch (Exception e) {
+                       System.out.println("<== Get Time Slots Request ERROR : " + e.toString() + '\n');
+                       logger.error(EELFLoggerDelegate.errorLogger, "Get Time Slots Request failed", e);
+                       throw e;
+               }
+       }
+
+       @SuppressWarnings("unchecked")
+       @RequestMapping(value = "/post_create_new_vnf_change", method = RequestMethod.POST)
+       public ResponseEntity<String> postCreateNewVNFChange(HttpServletRequest request,
+                       @RequestBody JSONObject scheduler_request) throws Exception {
+
+               Date startingTime = new Date();
+               String startTimeRequest = requestDateFormat.format(startingTime);
+
+               System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+               System.out.println(startTimeRequest + " | Controller Scheduler POST : post_create_new_vnf_change \n");
+
+               // Generating uuid
+               String uuid = UUID.randomUUID().toString();
+
+               scheduler_request.put("scheduleId", uuid);
+               System.out.println("<== UUID : " + uuid + '\n');
+
+               // adding uuid to the request payload
+               scheduler_request.put("scheduleId", uuid);
+
+               System.out.println("<== UUID : " + uuid + '\n');
+               System.out.println("Original Request : \n " + scheduler_request.toString() + '\n');
+
+               String path = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_CREATE_NEW_VNF_CHANGE_INSTANCE_VAL)
+                               + uuid;
+
+               PostCreateNewVnfWrapper responseWrapper = postSchedulingRequest(scheduler_request, path, uuid);
+
+               Date endTime = new Date();
+               String endTimeRequest = requestDateFormat.format(endTime);
+               System.out.println(endTimeRequest + " | Controller Scheduler - POST\n");
+
+               return (new ResponseEntity<String>(responseWrapper.getResponse(), HttpStatus.OK));
+       }
+
+       protected PostCreateNewVnfWrapper postSchedulingRequest(JSONObject request, String path, String uuid)
+                       throws Exception {
+
+               try {
+                       // STARTING REST API CALL AS AN FACTORY INSTACE
+                       System.out.println("<== Post Create New Vnf Scheduling Request START \n");
+
+                       PostCreateNewVnfRestObject<String> restObjStr = new PostCreateNewVnfRestObject<String>();
+                       String str = new String();
+
+                       restObjStr.set(str);
+                       schedulerRestController.<String>Post(str, request, path, restObjStr);
+
+                       int status = restObjStr.getStatusCode();
+                       if (status >= 200 && status <= 299) {
+                               restObjStr.setUUID(uuid);
+                       }
+
+                       PostCreateNewVnfWrapper responseWrapper = SchedulerUtil.postCreateNewVnfWrapResponse(restObjStr);
+
+                       System.out.println("<== Post Create New Vnf Scheduling Request END : Response = "
+                                       + responseWrapper.getResponse() + '\n');
+
+                       return responseWrapper;
+
+               } catch (Exception e) {
+                       System.out.println("<== Post Create New Vnf Scheduling Request ERROR : " + e.toString() + '\n');
+                       logger.error(EELFLoggerDelegate.errorLogger, "Post Create New Vnf Scheduling Request failed", e);
+                       throw e;
+               }
+       }
+
+       @RequestMapping(value = "/submit_vnf_change_timeslots", method = RequestMethod.POST)
+       public ResponseEntity<String> postSubmitVnfChangeTimeslots(HttpServletRequest request,
+                       @RequestBody JSONObject scheduler_request) throws Exception {
+
+               Date startingTime = new Date();
+               String startTimeRequest = requestDateFormat.format(startingTime);
+
+               System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+               System.out.println(startTimeRequest + " | Controller Scheduler POST : submit_vnf_change_timeslots \n");
+
+               // Generating uuid
+               String uuid = (String) scheduler_request.get("scheduleId");
+               scheduler_request.remove("scheduleId");
+
+               System.out.println("<== UUID : " + uuid + '\n');
+               System.out.println("Original Request : \n " + scheduler_request.toString() + '\n');
+
+               String path = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SUBMIT_NEW_VNF_CHANGE)
+                               .replace("{scheduleId}", uuid);
+
+               PostSubmitVnfChangeTimeSlotsWrapper responseWrapper = postSubmitSchedulingRequest(scheduler_request, path,
+                               uuid);
+
+               Date endTime = new Date();
+               String endTimeRequest = requestDateFormat.format(endTime);
+               System.out.println(endTimeRequest + " | Controller Scheduler - POST Submit\n");
+
+               return (new ResponseEntity<String>(responseWrapper.getResponse(), HttpStatus.OK));
+       }
+
+       protected PostSubmitVnfChangeTimeSlotsWrapper postSubmitSchedulingRequest(JSONObject request, String path,
+                       String uuid) throws Exception {
+
+               try {
+                       // STARTING REST API CALL AS AN FACTORY INSTACE
+                       System.out.println("<== Post Submit Scheduling Request START \n");
+
+                       PostSubmitVnfChangeRestObject<String> restObjStr = new PostSubmitVnfChangeRestObject<String>();
+                       String str = new String();
+
+                       restObjStr.set(str);
+                       schedulerRestController.<String>Post(str, request, path, restObjStr);
+
+                       int status = restObjStr.getStatusCode();
+                       if (status >= 200 && status <= 299) {
+                               restObjStr.setUUID(uuid);
+                       }
+
+                       PostSubmitVnfChangeTimeSlotsWrapper responseWrapper = SchedulerUtil
+                                       .postSubmitNewVnfWrapResponse(restObjStr);
+
+                       System.out.println(
+                                       "<== Post Submit Scheduling Request END : Response = " + responseWrapper.getResponse() + '\n');
+
+                       return responseWrapper;
+
+               } catch (Exception e) {
+                       System.out.println("<== Post Submit Scheduling Request ERROR : " + e.toString() + '\n');
+                       logger.error(EELFLoggerDelegate.errorLogger, "Post Submit Scheduling Request failed", e);
+                       throw e;
+               }
+       }
+
+}
index 222f450..7a5196c 100644 (file)
@@ -33,13 +33,12 @@ import org.openecomp.portalapp.portal.domain.EPUser;
 import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
 import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
 import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
 import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
 import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
 import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
+import org.openecomp.portalapp.portal.service.TicketEventService;
 import org.openecomp.portalapp.portal.service.UserNotificationService;
 import org.openecomp.portalapp.portal.transport.EpNotificationItem;
 import org.openecomp.portalapp.portal.transport.EpRoleNotificationItem;
 import org.openecomp.portalapp.portal.service.UserNotificationService;
 import org.openecomp.portalapp.portal.transport.EpNotificationItem;
 import org.openecomp.portalapp.portal.transport.EpRoleNotificationItem;
-import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
 import org.openecomp.portalapp.portal.utils.PortalConstants;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.openecomp.portalapp.portal.utils.PortalConstants;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
-import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
@@ -67,6 +66,9 @@ public class TicketEventController implements BasicAuthenticationController {
 
        @Autowired
        private UserNotificationService userNotificationService;
 
        @Autowired
        private UserNotificationService userNotificationService;
+       
+       @Autowired
+       private TicketEventService ticketEventService;
 
        private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(TicketEventController.class);
 
 
        private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(TicketEventController.class);
 
@@ -106,6 +108,7 @@ public class TicketEventController implements BasicAuthenticationController {
                        JsonNode event = ticketEventNotif.get("event");
                        JsonNode header = event.get("header");
                        JsonNode body = event.get("body");
                        JsonNode event = ticketEventNotif.get("event");
                        JsonNode header = event.get("header");
                        JsonNode body = event.get("body");
+                       JsonNode application = ticketEventNotif.get("application");
                        epItem.setMsgDescription(body.toString());
                        Long eventDate = System.currentTimeMillis();
                        if (body.get("eventDate") != null) {
                        epItem.setMsgDescription(body.toString());
                        Long eventDate = System.currentTimeMillis();
                        if (body.get("eventDate") != null) {
@@ -114,7 +117,7 @@ public class TicketEventController implements BasicAuthenticationController {
                        String eventSource = header.get("eventSource").asText();
                        epItem.setMsgSource(eventSource);
                        String ticket = body.get("ticketNum").asText();
                        String eventSource = header.get("eventSource").asText();
                        epItem.setMsgSource(eventSource);
                        String ticket = body.get("ticketNum").asText();
-                       String hyperlink = SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_SYSTEM_NOTIFICATION_URL)+eventSource+"num="+ticket;
+                       String hyperlink = ticketEventService.getNotificationHyperLink(application, ticket, eventSource);                       
                        if(body.get("notificationHyperlink")!=null){
                                hyperlink=body.get("notificationHyperlink").asText();
                        }
                        if(body.get("notificationHyperlink")!=null){
                                hyperlink=body.get("notificationHyperlink").asText();
                        }
@@ -201,7 +204,7 @@ public class TicketEventController implements BasicAuthenticationController {
                                .split(",");            
                List<EPUser> users = userNotificationService.getUsersByOrgIds(Arrays.asList(UserIds));
                if(users==null||users.size()==0)
                                .split(",");            
                List<EPUser> users = userNotificationService.getUsersByOrgIds(Arrays.asList(UserIds));
                if(users==null||users.size()==0)
-                       return "Invalid Attuid";
+                       return "Invalid Org User ID";
                return null;
        }
        
                return null;
        }
        
index 4bb447d..c5cd5c9 100644 (file)
@@ -153,17 +153,22 @@ public class UserRolesController extends EPRestrictedBaseController {
                }
 
                StringBuilder adminAppRoles = new StringBuilder();
                }
 
                StringBuilder adminAppRoles = new StringBuilder();
-               if (result != null && result.appsRoles.size() >= 1) {
-                       adminAppRoles.append("User '" + result.orgUserId + "' has admin role to the apps = {");
-                       for (AppNameIdIsAdmin adminAppRole : result.appsRoles) {
-                               if (adminAppRole.isAdmin) {
-                                       adminAppRoles.append(adminAppRole.appName + ", ");
+               if(result != null){
+                       if ( result.appsRoles.size() >= 1) {
+                               adminAppRoles.append("User '" + result.orgUserId + "' has admin role to the apps = {");
+                               for (AppNameIdIsAdmin adminAppRole : result.appsRoles) {
+                                       if (adminAppRole.isAdmin) {
+                                               adminAppRoles.append(adminAppRole.appName + ", ");
+                                       }
                                }
                                }
+                               adminAppRoles.append("}.");
+                       } else {
+                               adminAppRoles.append("User '" + result.orgUserId + "' has no Apps with Admin Role.");
                        }
                        }
-                       adminAppRoles.append("}.");
-               } else {
-                       adminAppRoles.append("User '" + result.orgUserId + "' has no Apps with Admin Role.");
+               }else{
+                       logger.error(EELFLoggerDelegate.errorLogger, "putAppWithUserRoleStateForUser: getAppsWithAdminRoleStateForUser result is null");
                }
                }
+               
                logger.info(EELFLoggerDelegate.errorLogger, adminAppRoles.toString());
 
                EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/adminAppsRoles", "get result =", result);
                logger.info(EELFLoggerDelegate.errorLogger, adminAppRoles.toString());
 
                EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/adminAppsRoles", "get result =", result);
@@ -189,18 +194,23 @@ public class UserRolesController extends EPRestrictedBaseController {
                // newAppsListWithAdminRoles.appsRoles
                FieldsValidator fieldsValidator = new FieldsValidator();
                StringBuilder newAppRoles = new StringBuilder();
                // newAppsListWithAdminRoles.appsRoles
                FieldsValidator fieldsValidator = new FieldsValidator();
                StringBuilder newAppRoles = new StringBuilder();
-               if (newAppsListWithAdminRoles != null && newAppsListWithAdminRoles.appsRoles.size() >= 1) {
-                       newAppRoles.append("User '" + newAppsListWithAdminRoles.orgUserId + "' has admin role to the apps = { ");
-                       for (AppNameIdIsAdmin adminAppRole : newAppsListWithAdminRoles.appsRoles) {
-                               if (adminAppRole.isAdmin) {
-                                       newAppRoles.append(adminAppRole.appName + " ,");
+               if(newAppsListWithAdminRoles != null ){
+                       if (newAppsListWithAdminRoles.appsRoles.size() >= 1) {
+                               newAppRoles.append("User '" + newAppsListWithAdminRoles.orgUserId + "' has admin role to the apps = { ");
+                               for (AppNameIdIsAdmin adminAppRole : newAppsListWithAdminRoles.appsRoles) {
+                                       if (adminAppRole.isAdmin) {
+                                               newAppRoles.append(adminAppRole.appName + " ,");
+                                       }
                                }
                                }
+                               newAppRoles.deleteCharAt(newAppRoles.length() - 1);
+                               newAppRoles.append("}.");
+                       } else {
+                               newAppRoles.append("User '" + newAppsListWithAdminRoles.orgUserId + "' has no Apps with Admin Role.");
                        }
                        }
-                       newAppRoles.deleteCharAt(newAppRoles.length() - 1);
-                       newAppRoles.append("}.");
-               } else {
-                       newAppRoles.append("User '" + newAppsListWithAdminRoles.orgUserId + "' has no Apps with Admin Role.");
+               }else{
+                       logger.error(EELFLoggerDelegate.errorLogger, "putAppWithUserRoleStateForUser: putAppsWithAdminRoleStateForUser result is null");
                }
                }
+               
                logger.info(EELFLoggerDelegate.errorLogger, newAppRoles.toString());
 
                EPUser user = EPUserUtils.getUserSession(request);
                logger.info(EELFLoggerDelegate.errorLogger, newAppRoles.toString());
 
                EPUser user = EPUserUtils.getUserSession(request);
@@ -339,7 +349,9 @@ public class UserRolesController extends EPRestrictedBaseController {
                boolean changesApplied = false;
                if (!adminRolesService.isAccountAdmin(user)) {
                        EcompPortalUtils.setBadPermissions(user, response, "putAppWithUserRoleStateForUser");
                boolean changesApplied = false;
                if (!adminRolesService.isAccountAdmin(user)) {
                        EcompPortalUtils.setBadPermissions(user, response, "putAppWithUserRoleStateForUser");
-               } else {
+               } else if(newAppRolesForUser==null){
+                       logger.error(EELFLoggerDelegate.errorLogger, "putAppWithUserRoleStateForUser: newAppRolesForUser is null");
+               } else{
                        changesApplied = userRolesService.setAppWithUserRoleStateForUser(user, newAppRolesForUser);
                        if (changesApplied) {
                                logger.info(EELFLoggerDelegate.applicationLogger,
                        changesApplied = userRolesService.setAppWithUserRoleStateForUser(user, newAppRolesForUser);
                        if (changesApplied) {
                                logger.info(EELFLoggerDelegate.applicationLogger,
index 662de30..44a5dcd 100644 (file)
@@ -178,7 +178,7 @@ public class WebAnalyticsExtAppController extends EPRestrictedRESTfulBaseControl
                                        MDC.get(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP),
                                        MDC.get(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP));
                        logger.info(EELFLoggerDelegate.auditLogger,
                                        MDC.get(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP),
                                        MDC.get(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP));
                        logger.info(EELFLoggerDelegate.auditLogger,
-                                       EPLogUtil.formatStoreAnalyticsAuditLogMessage(analyticsMap.getUserId(), appName,
+                                       EPLogUtil.formatStoreAnalyticsAuditLogMessage(analyticsMap.getUserid(), appName,
                                                        "WebAnalyticsExtAppController.postWebAnalyticsData",
                                                        EcompAuditLog.CD_ACTIVITY_STORE_ANALYTICS, analyticsMap.getAction(), analyticsMap.getPage(),
                                                        analyticsMap.getFunction(), analyticsMap.getType()));
                                                        "WebAnalyticsExtAppController.postWebAnalyticsData",
                                                        EcompAuditLog.CD_ACTIVITY_STORE_ANALYTICS, analyticsMap.getAction(), analyticsMap.getPage(),
                                                        analyticsMap.getFunction(), analyticsMap.getType()));
@@ -214,10 +214,10 @@ public class WebAnalyticsExtAppController extends EPRestrictedRESTfulBaseControl
        protected void storeAuxAnalytics(Analytics analyticsMap, String appName) {
                logger.info(EELFLoggerDelegate.debugLogger,
                                " Registering an action for recommendation: AppName/Function/UserId " + appName + "/"
        protected void storeAuxAnalytics(Analytics analyticsMap, String appName) {
                logger.info(EELFLoggerDelegate.debugLogger,
                                " Registering an action for recommendation: AppName/Function/UserId " + appName + "/"
-                                               + analyticsMap.getFunction() + "/" + analyticsMap.getUserId());
+                                               + analyticsMap.getFunction() + "/" + analyticsMap.getUserid());
 
                Map<String, String> requestMapping = new HashMap<String, String>();
 
                Map<String, String> requestMapping = new HashMap<String, String>();
-               requestMapping.put("id", analyticsMap.getUserId());
+               requestMapping.put("id", analyticsMap.getUserid());
                requestMapping.put("action", appName + "|" + analyticsMap.getFunction());
 
                HttpHeaders headers = new HttpHeaders();
                requestMapping.put("action", appName + "|" + analyticsMap.getFunction());
 
                HttpHeaders headers = new HttpHeaders();
index edb3c90..ad9dec5 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.openecomp.portalapp.portal.domain;
 
  */
 package org.openecomp.portalapp.portal.domain;
 
+import java.util.Arrays;
+
 import javax.persistence.Lob;
 
 import org.apache.commons.lang.StringUtils;
 import javax.persistence.Lob;
 
 import org.apache.commons.lang.StringUtils;
@@ -94,6 +96,8 @@ public class EPApp extends DomainVo {
                this.imageUrl = imageUrl;
        }
 
                this.imageUrl = imageUrl;
        }
 
+
+
        public byte[] getThumbnail() {
                return this.thumbnail;
        }
        public byte[] getThumbnail() {
                return this.thumbnail;
        }
@@ -312,4 +316,151 @@ public class EPApp extends DomainVo {
                return str;
        }
 
                return str;
        }
 
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((alternateUrl == null) ? 0 : alternateUrl.hashCode());
+               result = prime * result + ((appPassword == null) ? 0 : appPassword.hashCode());
+               result = prime * result + ((appRestEndpoint == null) ? 0 : appRestEndpoint.hashCode());
+               result = prime * result + ((appType == null) ? 0 : appType.hashCode());
+               result = prime * result + ((centralAuth == null) ? 0 : centralAuth.hashCode());
+               result = prime * result + ((contactUs == null) ? 0 : contactUs.hashCode());
+               result = prime * result + ((description == null) ? 0 : description.hashCode());
+               result = prime * result + ((enabled == null) ? 0 : enabled.hashCode());
+               result = prime * result + ((imageUrl == null) ? 0 : imageUrl.hashCode());
+               result = prime * result + ((mlAppAdminId == null) ? 0 : mlAppAdminId.hashCode());
+               result = prime * result + ((mlAppName == null) ? 0 : mlAppName.hashCode());
+               result = prime * result + ((motsId == null) ? 0 : motsId.hashCode());
+               result = prime * result + ((name == null) ? 0 : name.hashCode());
+               result = prime * result + ((nameSpace == null) ? 0 : nameSpace.hashCode());
+               result = prime * result + ((notes == null) ? 0 : notes.hashCode());
+               result = prime * result + ((open == null) ? 0 : open.hashCode());
+               result = prime * result + Arrays.hashCode(thumbnail);
+               result = prime * result + ((uebKey == null) ? 0 : uebKey.hashCode());
+               result = prime * result + ((uebSecret == null) ? 0 : uebSecret.hashCode());
+               result = prime * result + ((uebTopicName == null) ? 0 : uebTopicName.hashCode());
+               result = prime * result + ((url == null) ? 0 : url.hashCode());
+               result = prime * result + ((username == null) ? 0 : username.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               EPApp other = (EPApp) obj;
+               if (alternateUrl == null) {
+                       if (other.alternateUrl != null)
+                               return false;
+               } else if (!alternateUrl.equals(other.alternateUrl))
+                       return false;
+               if (appPassword == null) {
+                       if (other.appPassword != null)
+                               return false;
+               } else if (!appPassword.equals(other.appPassword))
+                       return false;
+               if (appRestEndpoint == null) {
+                       if (other.appRestEndpoint != null)
+                               return false;
+               } else if (!appRestEndpoint.equals(other.appRestEndpoint))
+                       return false;
+               if (appType == null) {
+                       if (other.appType != null)
+                               return false;
+               } else if (!appType.equals(other.appType))
+                       return false;
+               if (centralAuth == null) {
+                       if (other.centralAuth != null)
+                               return false;
+               } else if (!centralAuth.equals(other.centralAuth))
+                       return false;
+               if (contactUs == null) {
+                       if (other.contactUs != null)
+                               return false;
+               } else if (!contactUs.equals(other.contactUs))
+                       return false;
+               if (description == null) {
+                       if (other.description != null)
+                               return false;
+               } else if (!description.equals(other.description))
+                       return false;
+               if (enabled == null) {
+                       if (other.enabled != null)
+                               return false;
+               } else if (!enabled.equals(other.enabled))
+                       return false;
+               if (imageUrl == null) {
+                       if (other.imageUrl != null)
+                               return false;
+               } else if (!imageUrl.equals(other.imageUrl))
+                       return false;
+               if (mlAppAdminId == null) {
+                       if (other.mlAppAdminId != null)
+                               return false;
+               } else if (!mlAppAdminId.equals(other.mlAppAdminId))
+                       return false;
+               if (mlAppName == null) {
+                       if (other.mlAppName != null)
+                               return false;
+               } else if (!mlAppName.equals(other.mlAppName))
+                       return false;
+               if (motsId == null) {
+                       if (other.motsId != null)
+                               return false;
+               } else if (!motsId.equals(other.motsId))
+                       return false;
+               if (name == null) {
+                       if (other.name != null)
+                               return false;
+               } else if (!name.equals(other.name))
+                       return false;
+               if (nameSpace == null) {
+                       if (other.nameSpace != null)
+                               return false;
+               } else if (!nameSpace.equals(other.nameSpace))
+                       return false;
+               if (notes == null) {
+                       if (other.notes != null)
+                               return false;
+               } else if (!notes.equals(other.notes))
+                       return false;
+               if (open == null) {
+                       if (other.open != null)
+                               return false;
+               } else if (!open.equals(other.open))
+                       return false;
+               if (!Arrays.equals(thumbnail, other.thumbnail))
+                       return false;
+               if (uebKey == null) {
+                       if (other.uebKey != null)
+                               return false;
+               } else if (!uebKey.equals(other.uebKey))
+                       return false;
+               if (uebSecret == null) {
+                       if (other.uebSecret != null)
+                               return false;
+               } else if (!uebSecret.equals(other.uebSecret))
+                       return false;
+               if (uebTopicName == null) {
+                       if (other.uebTopicName != null)
+                               return false;
+               } else if (!uebTopicName.equals(other.uebTopicName))
+                       return false;
+               if (url == null) {
+                       if (other.url != null)
+                               return false;
+               } else if (!url.equals(other.url))
+                       return false;
+               if (username == null) {
+                       if (other.username != null)
+                               return false;
+               } else if (!username.equals(other.username))
+                       return false;
+               return true;
+       }
 }
 }
index a1e4457..90990ef 100644 (file)
@@ -199,4 +199,5 @@ public class EPRole extends DomainVo {
        public String toString() {
                return "[Id = " + id + ", name = " + name + "]";
        }
        public String toString() {
                return "[Id = " + id + ", name = " + name + "]";
        }
+
 }
 }
index c756ef5..616246d 100644 (file)
@@ -82,4 +82,59 @@ public class EPUserAppRolesRequest extends DomainVo {
        public void setEpRequestIdDetail(Set<EPUserAppRolesRequestDetail> epMyLoginsDetail) {
                this.epRequestIdDetail = epMyLoginsDetail;
        }
        public void setEpRequestIdDetail(Set<EPUserAppRolesRequestDetail> epMyLoginsDetail) {
                this.epRequestIdDetail = epMyLoginsDetail;
        }
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((appId == null) ? 0 : appId.hashCode());
+               result = prime * result + ((createdDate == null) ? 0 : createdDate.hashCode());
+               result = prime * result + ((epRequestIdDetail == null) ? 0 : epRequestIdDetail.hashCode());
+               result = prime * result + ((requestStatus == null) ? 0 : requestStatus.hashCode());
+               result = prime * result + ((updatedDate == null) ? 0 : updatedDate.hashCode());
+               result = prime * result + ((userId == null) ? 0 : userId.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               EPUserAppRolesRequest other = (EPUserAppRolesRequest) obj;
+               if (appId == null) {
+                       if (other.appId != null)
+                               return false;
+               } else if (!appId.equals(other.appId))
+                       return false;
+               if (createdDate == null) {
+                       if (other.createdDate != null)
+                               return false;
+               } else if (!createdDate.equals(other.createdDate))
+                       return false;
+               if (epRequestIdDetail == null) {
+                       if (other.epRequestIdDetail != null)
+                               return false;
+               } else if (!epRequestIdDetail.equals(other.epRequestIdDetail))
+                       return false;
+               if (requestStatus == null) {
+                       if (other.requestStatus != null)
+                               return false;
+               } else if (!requestStatus.equals(other.requestStatus))
+                       return false;
+               if (updatedDate == null) {
+                       if (other.updatedDate != null)
+                               return false;
+               } else if (!updatedDate.equals(other.updatedDate))
+                       return false;
+               if (userId == null) {
+                       if (other.userId != null)
+                               return false;
+               } else if (!userId.equals(other.userId))
+                       return false;
+               return true;
+       }
 }
 }
index 3b466f5..eeb3445 100644 (file)
@@ -53,4 +53,41 @@ public class EPUserAppRolesRequestDetail extends DomainVo {
                this.reqType = reqType;
        }
 
                this.reqType = reqType;
        }
 
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((epRequestIdData == null) ? 0 : epRequestIdData.hashCode());
+               result = prime * result + ((reqRoleId == null) ? 0 : reqRoleId.hashCode());
+               result = prime * result + ((reqType == null) ? 0 : reqType.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               EPUserAppRolesRequestDetail other = (EPUserAppRolesRequestDetail) obj;
+               if (epRequestIdData == null) {
+                       if (other.epRequestIdData != null)
+                               return false;
+               } else if (!epRequestIdData.equals(other.epRequestIdData))
+                       return false;
+               if (reqRoleId == null) {
+                       if (other.reqRoleId != null)
+                               return false;
+               } else if (!reqRoleId.equals(other.reqRoleId))
+                       return false;
+               if (reqType == null) {
+                       if (other.reqType != null)
+                               return false;
+               } else if (!reqType.equals(other.reqType))
+                       return false;
+               return true;
+       }
+
 }
 }
index 0796a5a..80c48fc 100644 (file)
  */
 package org.openecomp.portalapp.portal.domain;
 
  */
 package org.openecomp.portalapp.portal.domain;
 
-import javax.persistence.Column;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
 import org.openecomp.portalsdk.core.domain.support.DomainVo;
 
 public class MicroserviceParameter extends DomainVo {
 import org.openecomp.portalsdk.core.domain.support.DomainVo;
 
 public class MicroserviceParameter extends DomainVo {
index 331cdb8..81a5942 100644 (file)
@@ -75,4 +75,41 @@ public class PersUserAppSelection extends DomainVo {
                this.statusCode = statusCode;
        }
 
                this.statusCode = statusCode;
        }
 
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((appId == null) ? 0 : appId.hashCode());
+               result = prime * result + ((statusCode == null) ? 0 : statusCode.hashCode());
+               result = prime * result + ((userId == null) ? 0 : userId.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               PersUserAppSelection other = (PersUserAppSelection) obj;
+               if (appId == null) {
+                       if (other.appId != null)
+                               return false;
+               } else if (!appId.equals(other.appId))
+                       return false;
+               if (statusCode == null) {
+                       if (other.statusCode != null)
+                               return false;
+               } else if (!statusCode.equals(other.statusCode))
+                       return false;
+               if (userId == null) {
+                       if (other.userId != null)
+                               return false;
+               } else if (!userId.equals(other.userId))
+                       return false;
+               return true;
+       }
+
 }
 }
index 692479b..5ef8a21 100644 (file)
@@ -77,5 +77,42 @@ public class PersUserWidgetSelection extends DomainVo {
        public void setStatusCode(String statusCode) {
                this.statusCode = statusCode;
        }
        public void setStatusCode(String statusCode) {
                this.statusCode = statusCode;
        }
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((statusCode == null) ? 0 : statusCode.hashCode());
+               result = prime * result + ((userId == null) ? 0 : userId.hashCode());
+               result = prime * result + ((widgetId == null) ? 0 : widgetId.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               PersUserWidgetSelection other = (PersUserWidgetSelection) obj;
+               if (statusCode == null) {
+                       if (other.statusCode != null)
+                               return false;
+               } else if (!statusCode.equals(other.statusCode))
+                       return false;
+               if (userId == null) {
+                       if (other.userId != null)
+                               return false;
+               } else if (!userId.equals(other.userId))
+                       return false;
+               if (widgetId == null) {
+                       if (other.widgetId != null)
+                               return false;
+               } else if (!widgetId.equals(other.widgetId))
+                       return false;
+               return true;
+       }
        
 }
        
 }
index f9a6b90..27c4316 100644 (file)
@@ -218,9 +218,8 @@ public class HealthMonitor {
                                }
                        }
                };
                                }
                        }
                };
-               if (healthMonitorThread != null) {
-                       healthMonitorThread.start();
-               }
+               healthMonitorThread.start();
+               
        }
 
        @PreDestroy
        }
 
        @PreDestroy
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/RestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/RestObject.java
new file mode 100644 (file)
index 0000000..a1030e3
--- /dev/null
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler;
+
+
+public class RestObject<T> {
+       
+    private T t;
+   
+    private int statusCode= 0;
+    
+    public String uuid;
+    
+    public void set(T t) { this.t = t; }
+    
+    public T get() { return t; }
+          
+    public void setStatusCode(int v) { this.statusCode = v; }
+       
+    public int getStatusCode() { return this.statusCode; }
+        
+    public void setUUID(String uuid) { this.uuid = uuid; }
+    
+    public String getUUID() { return this.uuid; }
+}
+
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerProperties.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerProperties.java
new file mode 100644 (file)
index 0000000..2d65b6c
--- /dev/null
@@ -0,0 +1,20 @@
+package org.openecomp.portalapp.portal.scheduler;
+
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+
+public class SchedulerProperties extends SystemProperties { 
+       
+       public static final String SCHEDULER_USER_NAME_VAL =  "scheduler.user.name";;
+               
+       public static final String SCHEDULER_PASSWORD_VAL = "scheduler.password";
+       
+       public static final String SCHEDULER_SERVER_URL_VAL = "scheduler.server.url";
+       
+       public static final String SCHEDULER_CREATE_NEW_VNF_CHANGE_INSTANCE_VAL = "scheduler.create.new.vnf.change.instance";
+       
+       public static final String SCHEDULER_GET_TIME_SLOTS = "scheduler.get.time.slots";
+       
+       public static final String SCHEDULER_SUBMIT_NEW_VNF_CHANGE = "scheduler.submit.new.vnf.change";
+
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerResponseWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerResponseWrapper.java
new file mode 100644 (file)
index 0000000..d30f056
--- /dev/null
@@ -0,0 +1,71 @@
+package org.openecomp.portalapp.portal.scheduler;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ * This wrapper encapsulates the Scheduler response
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+           "status",
+           "entity",
+           "uuid"
+})
+
+public class SchedulerResponseWrapper {
+       
+       @JsonProperty("status")
+       private int status;
+
+       @JsonProperty("entity")
+       private String entity;
+       
+       @JsonProperty("uuid")
+       private String uuid;
+
+       @JsonProperty("entity")
+    public String getEntity() {
+        return entity;
+    }
+       
+       @JsonProperty("status")
+    public int getStatus() {
+        return status;
+    }
+       
+       @JsonProperty("uuid")
+    public String getUuid() {
+        return uuid;
+    }  
+       
+       @JsonProperty("status")
+    public void setStatus(int v) {
+        this.status = v;
+    }
+
+       @JsonProperty("entity")
+    public void setEntity(String v) {
+        this.entity = v;
+    }
+       
+       @JsonProperty("uuid")
+    public void setUuid(String v) {
+        this.uuid = v;
+    }  
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+    public String getResponse () {
+       
+       StringBuilder b = new StringBuilder ("{ \"status\": ");
+       b.append(getStatus()).append(", \"entity\": \" " ).append(this.getEntity()).append("\" ,\"uuid\": \"" ).append(this.getUuid()).append("\"}");
+        return (b.toString());
+    }
+
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInt.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInt.java
new file mode 100644 (file)
index 0000000..d532fd7
--- /dev/null
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class SchedulerRestInt {
+       
+       /** The logger. */
+       EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerRestInterface.class);
+       
+       /** The Constant dateFormat. */
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       /** The request date format. */
+       public DateFormat requestDateFormat = new SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss z");
+       
+       public SchedulerRestInt() {
+               requestDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterface.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterface.java
new file mode 100644 (file)
index 0000000..337c1fc
--- /dev/null
@@ -0,0 +1,200 @@
+package org.openecomp.portalapp.portal.scheduler;
+
+import java.util.Collections;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.Response;
+
+import org.apache.commons.codec.binary.Base64;
+import org.json.simple.JSONObject;
+import org.openecomp.portalapp.portal.scheduler.client.HttpBasicClient;
+import org.openecomp.portalapp.portal.scheduler.client.HttpsBasicClient;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.stereotype.Service;
+import org.openecomp.portalapp.portal.scheduler.restobjects.RestObject;
+
+
+@Service
+public class SchedulerRestInterface implements SchedulerRestInterfaceIfc {
+
+       private static Client client = null;
+               
+       private MultivaluedHashMap<String, Object> commonHeaders;
+       
+       public SchedulerRestInterface() {
+               super();
+       }
+       
+       public void initRestClient()
+       {
+               final String methodname = "initRestClient()";
+               
+               final String username = "";//SystemProperties.getProperty(SchedulerProperties.SCHEDULER_USER_NAME_VAL);
+               //final String password = "";//SystemProperties.getProperty(SchedulerProperties.SCHEDULER_PASSWORD_VAL);
+               final String scheduler_url = "";//SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL);
+               final String decrypted_password = "";//Password.deobfuscate(password);
+               
+               String authString = username + ":" + decrypted_password;
+               
+               byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
+               String authStringEnc = new String(authEncBytes);
+
+               commonHeaders = new MultivaluedHashMap<String, Object> ();
+               commonHeaders.put("Authorization",  Collections.singletonList((Object) ("Basic " + authStringEnc)));
+               
+               boolean use_ssl = true;
+               if ( (scheduler_url != null) && ( !(scheduler_url.isEmpty()) ) ) {
+                       if ( scheduler_url.startsWith("https")) {
+                               use_ssl = true;
+                       }
+                       else {
+                               use_ssl = false;
+                       }
+               }
+               if (client == null) {
+                       
+                       try {
+                               if ( use_ssl ) { 
+                                       
+                                       client = HttpsBasicClient.getClient();
+                               }
+                               else {
+                                       
+                                       client = HttpBasicClient.getClient();
+                               }
+                       } catch (Exception e) {
+                               System.out.println(  methodname + " Unable to get the SSL client");
+                       }
+               }
+       }
+               
+       @SuppressWarnings("unchecked")
+       public <T> void Get (T t, String sourceId, String path, org.openecomp.portalapp.portal.scheduler.restobjects.RestObject<T> restObject ) throws Exception {
+               
+               String methodName = "Get";
+               String url = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL) + path;
+               
+               
+               System.out.println( "<== URL FOR GET : " + url + "\n");
+
+        initRestClient();
+               
+               final Response cres = client.target(url)
+                        .request()
+                .accept("application/json")
+                .headers(commonHeaders)
+                .get();
+                               
+               int status = cres.getStatus();
+               restObject.setStatusCode (status);
+               
+               if (status == 200) {
+                        t = (T) cres.readEntity(t.getClass());
+                        restObject.set(t);
+                       
+                } else {
+                    throw new Exception(methodName + " with status="+ status + ", url= " + url );
+                }
+
+               return;
+       }
+               
+       @SuppressWarnings("unchecked")
+       public <T> void Post(T t, JSONObject requestDetails, String path, RestObject<T> restObject) throws Exception {
+               
+        String methodName = "Post";
+        String url = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL) + path;
+                       
+        System.out.println( "<== URL FOR POST : " + url + "\n");
+     
+        try {
+            
+            initRestClient();    
+    
+            // Change the content length
+            final Response cres = client.target(url)
+                .request()
+                 .accept("application/json")
+                        .headers(commonHeaders)
+                 //.header("content-length", 201)
+                 //.header("X-FromAppId",  sourceID)
+                 .post(Entity.entity(requestDetails, MediaType.APPLICATION_JSON));
+            
+            try {
+                               t = (T) cres.readEntity(t.getClass());
+                               restObject.set(t);
+            }
+            catch ( Exception e ) {
+               
+               System.out.println("<== " + methodName + " : No response entity, this is probably ok, e=" + e.getMessage());
+            }
+
+            int status = cres.getStatus();
+               restObject.setStatusCode (status);              
+                               
+               if ( status >= 200 && status <= 299 ) {
+                                               
+                       System.out.println( "<== " + methodName + " : REST api POST was successful!" + "\n");
+               
+             } else {
+                System.out.println( "<== " + methodName + " : FAILED with http status : "+status+", url = " + url + "\n");
+             }    
+   
+        } catch (Exception e)
+        {
+               System.out.println( "<== " + methodName + " : with url="+url+ ", Exception: " + e.toString() + "\n");
+               throw e;        
+        }
+    }
+       
+       @SuppressWarnings("unchecked")
+       public <T> void Delete(T t, JSONObject requestDetails, String sourceID, String path, RestObject<T> restObject) {
+        
+               String url="";
+               Response cres = null;
+               
+               try {
+                       initRestClient();
+                       
+                       url = SystemProperties.getProperty(SchedulerProperties.SCHEDULER_SERVER_URL_VAL) + path;
+               
+                       cres = client.target(url)
+                                        .request()
+                                .accept("application/json")
+                                .headers(commonHeaders)
+                                //.entity(r)
+                                .build("DELETE", Entity.entity(requestDetails, MediaType.APPLICATION_JSON)).invoke();
+                              //  .method("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON));
+                                //.delete(Entity.entity(r, MediaType.APPLICATION_JSON));
+                       
+                       int status = cres.getStatus();
+               restObject.setStatusCode (status);
+                               
+                       try {
+                               t = (T) cres.readEntity(t.getClass());
+                               restObject.set(t);
+            }
+            catch ( Exception e ) {
+            }
+   
+        } 
+               catch (Exception e)
+        {      
+                throw e;        
+        }
+       }
+       
+       public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException
+       {
+               return clazz.newInstance();
+       }
+
+       @Override
+       public void logRequest(JSONObject requestDetails) {
+               // TODO Auto-generated method stub
+               
+       }       
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceFactory.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceFactory.java
new file mode 100644 (file)
index 0000000..34433e5
--- /dev/null
@@ -0,0 +1,15 @@
+
+package org.openecomp.portalapp.portal.scheduler;
+
+public class SchedulerRestInterfaceFactory {
+
+       
+       public static SchedulerRestInterfaceIfc getInstance () {
+               SchedulerRestInterfaceIfc obj = null;
+
+               obj = new SchedulerRestInterface();
+               
+               return ( obj );
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceIfc.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerRestInterfaceIfc.java
new file mode 100644 (file)
index 0000000..77353e5
--- /dev/null
@@ -0,0 +1,22 @@
+
+package org.openecomp.portalapp.portal.scheduler;
+
+import org.json.simple.JSONObject;
+import org.springframework.stereotype.Service;
+import org.openecomp.portalapp.portal.scheduler.restobjects.RestObject;
+
+
+@Service
+public interface SchedulerRestInterfaceIfc {
+
+       public void initRestClient();
+
+       public <T> void Get(T t, String sourceId, String path, org.openecomp.portalapp.portal.scheduler.restobjects.RestObject<T> restObject ) throws Exception;
+
+       public <T> void Delete(T t, JSONObject requestDetails, String sourceID, String path, RestObject<T> restObject)
+                       throws Exception;
+
+       public <T> void Post(T t, JSONObject r, String path, RestObject<T> restObject) throws Exception;
+
+       public void logRequest(JSONObject requestDetails);
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerUtil.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/SchedulerUtil.java
new file mode 100644 (file)
index 0000000..37dddc2
--- /dev/null
@@ -0,0 +1,99 @@
+package org.openecomp.portalapp.portal.scheduler;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.openecomp.portalapp.portal.scheduler.restobjects.GetTimeSlotsRestObject;
+import org.openecomp.portalapp.portal.scheduler.restobjects.PostCreateNewVnfRestObject;
+import org.openecomp.portalapp.portal.scheduler.restobjects.PostSubmitVnfChangeRestObject;
+import org.openecomp.portalapp.portal.scheduler.wrapper.GetTimeSlotsWrapper;
+import org.openecomp.portalapp.portal.scheduler.wrapper.PostCreateNewVnfWrapper;
+import org.openecomp.portalapp.portal.scheduler.wrapper.PostSubmitVnfChangeTimeSlotsWrapper;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class SchedulerUtil {
+       
+       private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SchedulerUtil.class);
+       
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+
+       public static GetTimeSlotsWrapper getTimeSlotsWrapResponse (GetTimeSlotsRestObject<String> rs) {        
+               
+               String resp_str = "";
+               int status = 0;
+               
+               if ( rs != null ) {
+                       resp_str = rs.get();
+                       status = rs.getStatusCode();
+               }
+                               
+               GetTimeSlotsWrapper w = new GetTimeSlotsWrapper();
+               
+               w.setEntity(resp_str);
+               w.setStatus (status);
+               
+               return (w);
+       }
+       
+       public static PostSubmitVnfChangeTimeSlotsWrapper postSubmitNewVnfWrapResponse (PostSubmitVnfChangeRestObject<String> rs) {     
+               
+               String resp_str = "";
+               int status = 0;
+               String uuid = "";
+               
+               if ( rs != null ) {
+                       resp_str = rs.get();
+                       status = rs.getStatusCode();
+                       uuid = rs.getUUID();
+               }
+                               
+               PostSubmitVnfChangeTimeSlotsWrapper w = new PostSubmitVnfChangeTimeSlotsWrapper();
+               
+               w.setEntity(resp_str);
+               w.setStatus (status);
+               w.setUuid(uuid);
+               
+               return (w);
+       }
+       
+       public static PostCreateNewVnfWrapper postCreateNewVnfWrapResponse (PostCreateNewVnfRestObject<String> rs) {    
+               
+               String resp_str = "";
+               int status = 0;
+               String uuid = "";
+               
+               if ( rs != null ) {
+                       resp_str = rs.get();
+                       status = rs.getStatusCode();
+                       uuid = rs.getUUID();
+               }
+                               
+               PostCreateNewVnfWrapper w = new PostCreateNewVnfWrapper();
+               
+               w.setEntity(resp_str);
+               w.setStatus (status);
+               w.setUuid(uuid);
+               
+               return (w);
+       }
+       
+       public static <T> String convertPojoToString ( T t ) throws com.fasterxml.jackson.core.JsonProcessingException {
+               
+               String methodName = "convertPojoToString";
+               ObjectMapper mapper = new ObjectMapper();
+               String r_json_str = "";
+           if ( t != null ) {
+                   try {
+                       r_json_str = mapper.writeValueAsString(t);
+                   }
+                   catch ( com.fasterxml.jackson.core.JsonProcessingException j ) {
+                       logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " Unable to parse object as json");
+                   }
+           }
+           return (r_json_str);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpBasicClient.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpBasicClient.java
new file mode 100644 (file)
index 0000000..f0ec276
--- /dev/null
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.client;
+
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.ClientProperties;
+import org.openecomp.portalapp.portal.scheduler.util.CustomJacksonJaxBJsonProvider;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ *  General HTTP client.
+ */
+
+public class HttpBasicClient{
+       
+       /** The servlet context. */
+       @Autowired 
+       private ServletContext servletContext;
+       
+       /** The logger. */
+       EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HttpBasicClient.class);
+       
+       /** The Constant dateFormat. */
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       /**
+        * Obtain a basic HTTP client .
+        *
+        * @return Client client object
+        * @throws Exception the exception
+        */
+       public static Client getClient() throws Exception {
+               
+               ClientConfig config = new ClientConfig();
+               config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
+               
+               return ClientBuilder.newClient(config)
+                               .register(CustomJacksonJaxBJsonProvider.class);
+       }       
+}  
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpsBasicClient.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/client/HttpsBasicClient.java
new file mode 100644 (file)
index 0000000..be24486
--- /dev/null
@@ -0,0 +1,144 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.client;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+
+import org.eclipse.jetty.util.security.Password;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.ClientProperties;
+import org.openecomp.portalapp.portal.scheduler.properties.VidProperties;
+import org.openecomp.portalapp.portal.scheduler.util.CustomJacksonJaxBJsonProvider;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+ /**
+  *  General SSL client using the VID tomcat keystore. It doesn't use client certificates.
+  */
+public class HttpsBasicClient{
+       
+       /** The logger. */
+       static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HttpsBasicClient.class);
+       
+       /** The Constant dateFormat. */
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       /**
+        * Retrieve an SSL client.
+        *
+        * @return Client The SSL client
+        * @throws Exception the exception
+        */
+       public static Client getClient() throws Exception {
+               String methodName = "getClient";
+               ClientConfig config = new ClientConfig();
+               //config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
+               //config.getClasses().add(org.openecomp.aai.util.CustomJacksonJaxBJsonProvider.class);
+       
+               SSLContext ctx = null;
+               
+               try {
+                       
+                       config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
+                       
+                       String truststore_path = SystemProperties.getProperty(VidProperties.VID_TRUSTSTORE_FILENAME);
+                       logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " " + methodName + " truststore_path=" + truststore_path);
+                       String truststore_password = SystemProperties.getProperty(VidProperties.VID_TRUSTSTORE_PASSWD_X);
+                       
+                       
+                       String decrypted_truststore_password = Password.deobfuscate(truststore_password);
+                       //logger.debug(dateFormat.format(new Date()) + " " + methodName + " decrypted_truststore_password=" + decrypted_truststore_password);
+                       
+                       File tr = new File (truststore_path);
+                       logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " " + methodName + " absolute truststore path=" + tr.getAbsolutePath());
+                       
+                       //String keystore_path = certFilePath + AAIProperties.FILESEPARTOR + SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_FILENAME);
+                       //String keystore_password = SystemProperties.getProperty(AAIProperties.AAI_KEYSTORE_PASSWD_X);
+                       //String decrypted_keystore_password = EncryptedPropValue.decryptTriple(keystore_password);
+                       
+                   System.setProperty("javax.net.ssl.trustStore", truststore_path);
+                   System.setProperty("javax.net.ssl.trustStorePassword", decrypted_truststore_password);
+                       HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){
+                           public boolean verify(String string,SSLSession ssls) {
+                               return true;
+                           }
+                       });
+       
+                       //May need to make the algorithm a parameter. MSO requires TLSv1.1      or TLSv1.2
+                       ctx = SSLContext.getInstance("TLSv1.2");
+                       
+                       /* 
+                       KeyManagerFactory kmf = null;
+                       try {
+                               kmf = KeyManagerFactory.getInstance("SunX509");
+                               FileInputStream fin = new FileInputStream(keystore_path);
+                               KeyStore ks = KeyStore.getInstance("PKCS12");
+                               char[] pwd = decrypted_keystore_password.toCharArray();
+                               ks.load(fin, pwd);
+                               kmf.init(ks, pwd);
+                       } catch (Exception e) {
+                               System.out.println("Error setting up kmf: exiting");
+                               e.printStackTrace();
+                               System.exit(1);
+                       }
+
+                       ctx.init(kmf.getKeyManagers(), null, null);
+                       */
+                       ctx.init(null, null, null);
+                       //config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, 
+                       //                                                      new HTTPSProperties( , ctx));
+                       
+                       return ClientBuilder.newBuilder()
+                               .sslContext(ctx)
+                               .hostnameVerifier(new HostnameVerifier() {
+                                       @Override
+                                       public boolean verify( String s, SSLSession sslSession ) {
+                                               return true;
+                                       }
+                               }).withConfig(config)
+                               .build()
+                               .register(CustomJacksonJaxBJsonProvider.class);
+                       
+               } catch (Exception e) {
+                       logger.debug(EELFLoggerDelegate.debugLogger, "Error setting up config: exiting");
+                       //System.out.println("Error setting up config: exiting");
+                       e.printStackTrace();
+                       return null;
+               }
+                       
+               //Client client = ClientBuilder.newClient(config);
+               // uncomment this line to get more logging for the request/response
+               // client.addFilter(new LoggingFilter(System.out));
+               
+               //return client;
+       }
+}  
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyProperties.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyProperties.java
new file mode 100644 (file)
index 0000000..cf10d8f
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+
+public class PolicyProperties extends SystemProperties {
+       
+       public static final String POLICY_CLIENTAUTH_VAL =  "policy.ClientAuth";
+       
+       public static final String POLICY_CLIENT_MECHID_VAL =  "policy.client.mechId";
+       
+       public static final String POLICY_CLIENT_PASSWORD_VAL =  "policy.client.password";
+       
+       public static final String POLICY_USERNAME_VAL =  "policy.username";
+       
+       public static final String POLICY_PASSWORD_VAL =  "policy.password";
+       
+       public static final String POLICY_AUTHORIZATION_VAL = "policy.Authorization";
+       
+       public static final String POLICY_SERVER_URL_VAL = "policy.server.url";
+       
+       public static final String POLICY_ENVIRONMENT_VAL = "policy.environment";
+       
+       public static final String POLICY_GET_CONFIG_VAL = "policy.get.config"; 
+       
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyResponseWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyResponseWrapper.java
new file mode 100644 (file)
index 0000000..ed51456
--- /dev/null
@@ -0,0 +1,56 @@
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ * This wrapper encapsulates the Policy response
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+           "status",
+           "entity"
+})
+
+public class PolicyResponseWrapper {
+       
+       @JsonProperty("status")
+       private int status;
+
+       @JsonProperty("entity")
+       private String entity;
+
+       @JsonProperty("entity")
+    public String getEntity() {
+        return entity;
+    }
+       
+       @JsonProperty("status")
+    public int getStatus() {
+        return status;
+    }  
+       
+       @JsonProperty("status")
+    public void setStatus(int v) {
+        this.status = v;
+    }
+
+       @JsonProperty("entity")
+    public void setEntity(String v) {
+        this.entity = v;
+    }
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+    public String getResponse () {
+       
+       StringBuilder b = new StringBuilder ("{ \"status\": ");
+        b.append(getStatus()).append(", \"entity\": " ).append(this.getEntity()).append("}");
+        return (b.toString());
+    }
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInt.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInt.java
new file mode 100644 (file)
index 0000000..ce930c9
--- /dev/null
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.openecomp.portalapp.portal.scheduler.policy.rest.RequestDetails;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class PolicyRestInt {
+       
+       /** The logger. */
+       EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PolicyRestInterface.class);
+       
+       /** The Constant dateFormat. */
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       /** The request date format. */
+       public DateFormat requestDateFormat = new SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss z");
+       
+       public PolicyRestInt() {
+               requestDateFormat.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
+       }
+
+       /**
+        * Log request.
+        *
+        * @param r the r
+        */
+       public void logRequest ( RequestDetails r ) {
+       String methodName = "logRequest";
+           ObjectMapper mapper = new ObjectMapper();
+           String r_json_str = "";
+           if ( r != null ) {
+               r_json_str = r.toString();
+                   try {
+                       r_json_str = mapper.writeValueAsString(r);
+                   }
+                   catch ( com.fasterxml.jackson.core.JsonProcessingException j ) {
+                       logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " Unable to parse request as json");
+                   }
+           }
+           logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " Request=(" + r_json_str + ")");  
+    }
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterface.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterface.java
new file mode 100644 (file)
index 0000000..70b4f81
--- /dev/null
@@ -0,0 +1,235 @@
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Date;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.Response;
+
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jetty.util.security.Password;
+import org.json.simple.JSONObject;
+import org.openecomp.portalapp.portal.scheduler.client.HttpBasicClient;
+import org.openecomp.portalapp.portal.scheduler.policy.rest.RequestDetails;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+
+public class PolicyRestInterface extends PolicyRestInt implements PolicyRestInterfaceIfc {
+
+       /** The logger. */
+       EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PolicyRestInterface.class);
+       
+       /** The Constant dateFormat. */
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       /** The client. */
+       private static Client client = null;
+       
+       /** The common headers. */
+       private MultivaluedHashMap<String, Object> commonHeaders;
+       
+       public PolicyRestInterface() {
+               super();
+       }
+       
+       public void initRestClient()
+       {
+               final String methodname = "initRestClient()";
+               
+               //final String clientAuth = SystemProperties.getProperty(PolicyProperties.POLICY_CLIENTAUTH_VAL);
+               //final String authorization = SystemProperties.getProperty(PolicyProperties.POLICY_AUTHORIZATION_VAL);
+               final String mechId = SystemProperties.getProperty(PolicyProperties.POLICY_CLIENT_MECHID_VAL);
+               final String clientPassword = SystemProperties.getProperty(PolicyProperties.POLICY_CLIENT_PASSWORD_VAL);
+               final String username = SystemProperties.getProperty(PolicyProperties.POLICY_USERNAME_VAL);
+               final String password = SystemProperties.getProperty(PolicyProperties.POLICY_PASSWORD_VAL);
+               final String environment = SystemProperties.getProperty(PolicyProperties.POLICY_ENVIRONMENT_VAL);
+                               
+               final String decrypted_client_password = Password.deobfuscate(clientPassword);          
+               String mechAuthString = mechId + ":" + decrypted_client_password;               
+               byte[] mechAuthEncBytes = Base64.encodeBase64(mechAuthString.getBytes());
+               String clientAuth = new String(mechAuthEncBytes);
+               
+               final String decrypted_password = Password.deobfuscate(password);               
+               String authString = username + ":" + decrypted_password;                
+               byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
+               String authorization = new String(authEncBytes);
+               
+               commonHeaders = new MultivaluedHashMap<String, Object> ();
+               commonHeaders.put("ClientAuth",  Collections.singletonList((Object) ("Basic " + clientAuth)));
+               commonHeaders.put("Authorization",  Collections.singletonList((Object) ("Basic " + authorization)));
+               commonHeaders.put("Environment",  Collections.singletonList((Object) (environment)));
+               
+               if (client == null) {
+                       
+                       try {
+                               client = HttpBasicClient.getClient();
+                       } catch (Exception e) {
+                               System.out.println(  methodname + " Unable to get the SSL client");
+                       }
+               }
+       }
+       
+       @SuppressWarnings("unchecked")
+       public <T> void  Get (T t, String sourceId, String path, RestObject<T> restObject ) throws Exception {
+               String methodName = "Get";
+               
+               logger.debug(EELFLoggerDelegate.debugLogger, methodName + " start");
+               
+               String url="";
+               restObject.set(t);
+               
+               url = SystemProperties.getProperty(PolicyProperties.POLICY_SERVER_URL_VAL) + path;
+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " +  methodName + " sending request to url= " + url);
+               
+        initRestClient();
+               
+               final Response cres = client.target(url)
+                        .request()
+                .accept("application/json")
+                .headers(commonHeaders)
+                .get();
+               
+               int status = cres.getStatus();
+               restObject.setStatusCode (status);
+               
+               if (status == 200) {
+                        t = (T) cres.readEntity(t.getClass());
+                        restObject.set(t);
+                        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + methodName + " REST api was successfull!");
+                   
+                } else {
+                    throw new Exception(methodName + " with status="+ status + ", url= " + url );
+                }
+
+               logger.debug(EELFLoggerDelegate.debugLogger,methodName + " received status=" + status );
+               
+               return;
+       }
+   
+   @SuppressWarnings("unchecked")
+       public <T> void Delete(T t, RequestDetails r, String sourceID, String path, RestObject<T> restObject) {
+        
+               String methodName = "Delete";
+               String url="";
+               Response cres = null;
+               
+               logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " start");
+               logRequest (r);
+
+               try {
+                       initRestClient();
+                       
+                       url = SystemProperties.getProperty(PolicyProperties.POLICY_SERVER_URL_VAL) + path;
+                       logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + " methodName sending request to: " + url);
+       
+                       cres = client.target(url)
+                                        .request()
+                                .accept("application/json")
+                                .headers(commonHeaders)
+                                //.entity(r)
+                                .build("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON)).invoke();
+                              //  .method("DELETE", Entity.entity(r, MediaType.APPLICATION_JSON));
+                                //.delete(Entity.entity(r, MediaType.APPLICATION_JSON));
+                       
+                       int status = cres.getStatus();
+               restObject.setStatusCode (status);
+               
+                       if (status == 404) { // resource not found
+                               String msg = "Resource does not exist...: " + cres.getStatus();
+                               logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
+                       } else if (status == 200  || status == 204){
+                               logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + "Resource " + url + " deleted");
+                       } else if (status == 202) {
+                               String msg = "Delete in progress: " + status;
+                               logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
+                       }
+                       else {
+                               String msg = "Deleting Resource failed: " + status;
+                                       logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + msg);
+                       }
+                       
+                       try {
+                               t = (T) cres.readEntity(t.getClass());
+                               restObject.set(t);
+            }
+            catch ( Exception e ) {
+               logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " No response entity, this is probably ok, e="
+                               + e.getMessage());
+            }
+   
+        } 
+               catch (Exception e)
+        {
+                logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " + methodName + " with url="+url+ ", Exception: " + e.toString());
+                throw e;
+        
+        }
+       }
+       
+       @SuppressWarnings("unchecked")
+       public <T> void Post(T t, JSONObject requestDetails, String uuid, String path, RestObject<T> restObject) throws Exception {
+               
+        String methodName = "Post";
+        String url="";
+
+        System.out.println( "POST policy rest interface");
+       
+     //   logRequest (requestDetails);
+        try {
+            
+            initRestClient();    
+    
+            url = SystemProperties.getProperty(PolicyProperties.POLICY_SERVER_URL_VAL) + path;
+            System.out.println( "<== " +  methodName + " sending request to url= " + url);
+            // Change the content length
+            final Response cres = client.target(url)
+                .request()
+                 .accept("application/json")
+                        .headers(commonHeaders)
+                 //.header("content-length", 201)
+                 //.header("X-FromAppId",  sourceID)
+                 .post(Entity.entity(requestDetails, MediaType.APPLICATION_JSON));
+            
+            try {
+                               t = (T) cres.readEntity(t.getClass());
+                               restObject.set(t);
+            }
+            catch ( Exception e ) {
+               
+               System.out.println("<== " + methodName + " No response entity, this is probably ok, e=" + e.getMessage());
+            }
+
+            int status = cres.getStatus();
+               restObject.setStatusCode (status);
+               
+               if ( status >= 200 && status <= 299 ) {
+                       System.out.println( "<== " + methodName + " REST api POST was successful!");
+               
+             } else {
+                System.out.println( "<== " + methodName + " with status="+status+", url="+url);
+             }    
+   
+        } catch (Exception e)
+        {
+               System.out.println( "<== " + methodName + " with url="+url+ ", Exception: " + e.toString());
+                throw e;
+        
+        }
+    }
+       
+       public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException
+       {
+               return clazz.newInstance();
+       }
+
+       @Override
+       public void logRequest(RequestDetails r) {
+               // TODO Auto-generated method stub
+       }       
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceFactory.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceFactory.java
new file mode 100644 (file)
index 0000000..c6dd440
--- /dev/null
@@ -0,0 +1,14 @@
+
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+public class PolicyRestInterfaceFactory {
+
+       
+       public static PolicyRestInterfaceIfc getInstance () {
+               PolicyRestInterfaceIfc obj = null;
+
+               obj = new PolicyRestInterface();
+               
+               return ( obj );
+       }
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceIfc.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyRestInterfaceIfc.java
new file mode 100644 (file)
index 0000000..38fedb9
--- /dev/null
@@ -0,0 +1,58 @@
+
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import org.json.simple.JSONObject;
+import org.openecomp.portalapp.portal.scheduler.policy.rest.RequestDetails;
+
+public interface PolicyRestInterfaceIfc {      
+       /**
+        * Inits the rest client.
+        */
+       public void initRestClient();
+       
+       /**
+        * Gets the.
+        *
+        * @param <T> the generic type
+        * @param t the t
+        * @param sourceId the source id
+        * @param path the path
+        * @param restObject the rest object
+        * @throws Exception the exception
+        */
+       public <T> void Get (T t, String sourceId, String path, RestObject<T> restObject ) throws Exception;
+       
+       /**
+        * Delete.
+        *
+        * @param <T> the generic type
+        * @param t the t
+        * @param r the r
+        * @param sourceID the source ID
+        * @param path the path
+        * @param restObject the rest object
+        * @throws Exception the exception
+        */
+       public <T> void Delete(T t, RequestDetails r, String sourceID, String path, RestObject<T> restObject) throws Exception;
+       
+       /**
+        * Post.
+        *
+        * @param <T> the generic type
+        * @param t the t
+        * @param r the r
+        * @param sourceID the source ID
+        * @param path the path
+        * @param restObject the rest object
+        * @throws Exception the exception
+        */
+       public <T> void Post(T t, JSONObject r, String sourceID, String path, RestObject<T> restObject) throws Exception;
+       
+       /***
+        * Log request.
+        *
+        * @param r the r
+        */
+       public void logRequest ( RequestDetails r  );
+       
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyUtil.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/PolicyUtil.java
new file mode 100644 (file)
index 0000000..8ec8323
--- /dev/null
@@ -0,0 +1,71 @@
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.glassfish.jersey.client.ClientResponse;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+/*import org.openecomp.vid.policy.PolicyResponseWrapper;
+import org.openecomp.vid.policy.PolicyUtil;
+import org.openecomp.vid.policy.RestObject;*/
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class PolicyUtil {
+       
+       private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PolicyUtil.class);
+       
+       final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+       
+       public static PolicyResponseWrapper wrapResponse ( String body, int statusCode ) {
+               
+               PolicyResponseWrapper w = new PolicyResponseWrapper();
+               w.setStatus (statusCode);
+               w.setEntity(body);
+               
+               return w;
+       }
+       
+       public static PolicyResponseWrapper wrapResponse (ClientResponse cres) {        
+               String resp_str = "";
+               if ( cres != null ) {
+                       resp_str = cres.readEntity(String.class);
+               }
+               int statuscode = cres.getStatus();
+               PolicyResponseWrapper w = PolicyUtil.wrapResponse ( resp_str, statuscode );
+               return (w);
+       }
+       
+       public static PolicyResponseWrapper wrapResponse (RestObject<String> rs) {      
+               String resp_str = "";
+               int status = 0;
+               if ( rs != null ) {
+                       resp_str = rs.get();
+                       status = rs.getStatusCode();
+               }
+               PolicyResponseWrapper w = PolicyUtil.wrapResponse ( resp_str, status );
+               return (w);
+       }
+       
+       public static <T> String convertPojoToString ( T t ) throws com.fasterxml.jackson.core.JsonProcessingException {
+               
+               String methodName = "convertPojoToString";
+               ObjectMapper mapper = new ObjectMapper();
+               String r_json_str = "";
+           if ( t != null ) {
+                   try {
+                       r_json_str = mapper.writeValueAsString(t);
+                   }
+                   catch ( com.fasterxml.jackson.core.JsonProcessingException j ) {
+                       logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " Unable to parse object as json");
+                   }
+           }
+           return (r_json_str);
+       }
+       
+       
+       public static void main(String[] args) {
+               // TODO Auto-generated method stub              
+       }
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/RestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/RestObject.java
new file mode 100644 (file)
index 0000000..040971e
--- /dev/null
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.policy;
+
+/**
+ * The Class RestObject.
+ *
+ * @param <T> the generic type
+ */
+public class RestObject<T> {
+
+       /**
+        * Generic version of the RestObject class.
+        *
+        */
+    // T stands for "Type"
+    private T t;
+    
+    /** The status code. */
+    private int statusCode= 0;
+    
+    /**
+     * Sets the.
+     *
+     * @param t the t
+     */
+    public void set(T t) { this.t = t; }
+    
+    /**
+     * Gets the.
+     *
+     * @return the t
+     */
+    public T get() { return t; }
+       
+    /**
+     * Sets the status code.
+     *
+     * @param v the new status code
+     */
+    public void setStatusCode(int v) { this.statusCode = v; }
+    
+    /**
+     * Gets the status code.
+     *
+     * @return the status code
+     */
+    public int getStatusCode() { return this.statusCode; }
+    
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/rest/RequestDetails.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/policy/rest/RequestDetails.java
new file mode 100644 (file)
index 0000000..9c5debe
--- /dev/null
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.policy.rest;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+/*
+       [
+         {
+           "policyConfigMessage": "Config Retrieved! ",
+           "policyConfigStatus": "CONFIG_RETRIEVED",
+           "type": "JSON",
+           "config": "{\"service\":\"TimeLimitAndVerticalTopology\",\"policyName\":\"SNIRO_CM_1707.Demo_TimeLimitAndVerticalTopology_zone_localTime\",\"description\":\"dev instance\",\"templateVersion\":\"1702.03\",\"version\":\"1707\",\"priority\":\"4\",\"riskType\":\"test\",\"riskLevel\":\"3\",\"guard\":\"False\",\"content\":{\"serviceType\":\"networkOnDemand\",\"identity\":\"vnf_upgrade_policy\",\"policyScope\":{\"serviceType\":[\"networkOnDemand\"],\"aicZone\":[\" \"],\"entityType\":[\"vnf\"]},\"timeSchedule\":{\"allowedPeriodicTime\":[{\"day\":\"weekday\",\"timeRange\":[{\"start_time\":\"04:00:00\",\"end_time\":\"13:00:00\"}]}]},\"nodeType\":[\"vnf\"],\"type\":\"timeLimitAndVerticalTopology\",\"conflictScope\":\"vnf_zone\"}}",
+           "policyName": "SNIRO_CM_1707.Config_MS_Demo_TimeLimitAndVerticalTopology_zone_localTime.1.xml",
+           "policyVersion": "1",
+           "matchingConditions": {
+             "ECOMPName": "SNIRO-Placement",
+             "ConfigName": "",
+             "service": "TimeLimitAndVerticalTopology",
+             "uuid": "",
+             "Location": ""
+           },
+           "responseAttributes": {},
+           "property": null
+         },
+         {
+           "policyConfigMessage": "Config Retrieved! ",
+           "policyConfigStatus": "CONFIG_RETRIEVED",
+           "type": "JSON",
+           "config": "{\"service\":\"TimeLimitAndVerticalTopology\",\"policyName\":\"SNIRO_CM_1707.Demo_TimeLimitAndVerticalTopology_pserver_localTime\",\"description\":\"dev instance\",\"templateVersion\":\"1702.03\",\"version\":\"1707\",\"priority\":\"4\",\"riskType\":\"test\",\"riskLevel\":\"3\",\"guard\":\"False\",\"content\":{\"serviceType\":\"networkOnDemand\",\"identity\":\"vnf_upgrade_policy\",\"policyScope\":{\"serviceType\":[\"networkOnDemand\"],\"aicZone\":[\" \"],\"entityType\":[\"vnf\"]},\"timeSchedule\":{\"allowedPeriodicTime\":[{\"day\":\"weekday\",\"timeRange\":[{\"start_time\":\"04:00:00\",\"end_time\":\"13:00:00\"}]}]},\"nodeType\":[\"vnf\"],\"type\":\"timeLimitAndVerticalTopology\",\"conflictScope\":\"vnf_pserver\"}}",
+           "policyName": "SNIRO_CM_1707.Config_MS_Demo_TimeLimitAndVerticalTopology_pserver_localTime.1.xml",
+           "policyVersion": "1",
+           "matchingConditions": {
+             "ECOMPName": "SNIRO-Placement",
+             "ConfigName": "",
+             "service": "TimeLimitAndVerticalTopology",
+             "uuid": "",
+             "Location": ""
+           },
+           "responseAttributes": {},
+           "property": null
+         },
+         {
+           "policyConfigMessage": "Config Retrieved! ",
+           "policyConfigStatus": "CONFIG_RETRIEVED",
+           "type": "JSON",
+           "config": "{\"service\":\"TimeLimitAndVerticalTopology\",\"policyName\":\"SNIRO_CM_1707.Demo_TimeLimitAndVerticalTopology_vnf_localTime\",\"description\":\"dev instance\",\"templateVersion\":\"1702.03\",\"version\":\"1707\",\"priority\":\"4\",\"riskType\":\"test\",\"riskLevel\":\"3\",\"guard\":\"False\",\"content\":{\"serviceType\":\"networkOnDemand\",\"identity\":\"vnf_upgrade_policy\",\"policyScope\":{\"serviceType\":[\"networkOnDemand\"],\"aicZone\":[\" \"],\"entityType\":[\"vnf\"]},\"timeSchedule\":{\"allowedPeriodicTime\":[{\"day\":\"weekday\",\"timeRange\":[{\"start_time\":\"04:00:00\",\"end_time\":\"13:00:00\"}]}]},\"nodeType\":[\"vnf\"],\"type\":\"timeLimitAndVerticalTopology\",\"conflictScope\":\"vnf\"}}",
+           "policyName": "SNIRO_CM_1707.Config_MS_Demo_TimeLimitAndVerticalTopology_vnf_localTime.1.xml",
+           "policyVersion": "1",
+           "matchingConditions": {
+             "ECOMPName": "SNIRO-Placement",
+             "ConfigName": "",
+             "service": "TimeLimitAndVerticalTopology",
+             "uuid": "",
+             "Location": ""
+           },
+           "responseAttributes": {},
+           "property": null
+         }
+       ]
+*/
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "policyConfigMessage",
+    "policyConfigStatus",
+    "type",
+    "config",
+    "policyName",
+    "policyVersion",
+    "matchingConditions"
+})
+public class RequestDetails {
+       
+       @JsonProperty("policyName")
+    private String policyName;  
+    
+       @JsonProperty("policyName")
+    public String getPolicyName() {
+        return policyName;
+    }
+
+    @JsonProperty("policyName")
+    public void setPolicyName(String policyName) {
+        this.policyName = policyName;
+    }
+    
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/properties/VidProperties.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/properties/VidProperties.java
new file mode 100644 (file)
index 0000000..883f871
--- /dev/null
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.properties;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+/**
+ * The Class VidProperties.
+ */
+public class VidProperties extends SystemProperties {
+
+       //VID General Properties
+       
+       /** The Constant VID_TRUSTSTORE_FILENAME. */
+       public static final String VID_TRUSTSTORE_FILENAME = "vid.truststore.filename";
+       
+       /** The Constant VID_TRUSTSTORE_PASSWD_X. */
+       public static final String VID_TRUSTSTORE_PASSWD_X = "vid.truststore.passwd.x";
+       
+       /** The Constant FILESEPARATOR. */
+       public static final String FILESEPARATOR = (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
+       
+       
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/GetTimeSlotsRestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/GetTimeSlotsRestObject.java
new file mode 100644 (file)
index 0000000..3e7771a
--- /dev/null
@@ -0,0 +1,11 @@
+package org.openecomp.portalapp.portal.scheduler.restobjects;
+
+public class GetTimeSlotsRestObject<T> extends RestObject<T> {
+
+       public String uuid;
+       
+       public void setUUID(String uuid) { this.uuid = uuid; }
+           
+       public String getUUID() { return this.uuid; }
+
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostCreateNewVnfRestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostCreateNewVnfRestObject.java
new file mode 100644 (file)
index 0000000..7e92307
--- /dev/null
@@ -0,0 +1,10 @@
+package org.openecomp.portalapp.portal.scheduler.restobjects;
+
+public class PostCreateNewVnfRestObject<T> extends RestObject<T> {
+       
+       public String uuid;
+       
+       public void setUUID(String uuid) { this.uuid = uuid; }
+           
+       public String getUUID() { return this.uuid; }
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostSubmitVnfChangeRestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/PostSubmitVnfChangeRestObject.java
new file mode 100644 (file)
index 0000000..9dd66af
--- /dev/null
@@ -0,0 +1,10 @@
+package org.openecomp.portalapp.portal.scheduler.restobjects;
+
+public class PostSubmitVnfChangeRestObject<T> extends RestObject<T> {
+       
+       public String uuid;
+       
+       public void setUUID(String uuid) { this.uuid = uuid; }
+           
+       public String getUUID() { return this.uuid; }
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/RestObject.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/restobjects/RestObject.java
new file mode 100644 (file)
index 0000000..6bb7443
--- /dev/null
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.restobjects;
+
+
+public class RestObject<T> {
+       
+    private T t;
+   
+    private int statusCode= 0;
+        
+    public void set(T t) { this.t = t; }
+    
+    public T get() { return t; }
+          
+    public void setStatusCode(int v) { this.statusCode = v; }
+       
+    public int getStatusCode() { return this.statusCode; }
+        
+}
+
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/util/CustomJacksonJaxBJsonProvider.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/util/CustomJacksonJaxBJsonProvider.java
new file mode 100644 (file)
index 0000000..e695383
--- /dev/null
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.portalapp.portal.scheduler.util;
+
+
+import javax.ws.rs.ext.Provider;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
+
+/**
+ * The Class CustomJacksonJaxBJsonProvider.
+ */
+@Provider
+public class CustomJacksonJaxBJsonProvider extends JacksonJaxbJsonProvider {
+
+           /** The common mapper. */
+       private static ObjectMapper commonMapper = null;
+
+           /**
+        * Instantiates a new custom jackson jax B json provider.
+        */
+       public CustomJacksonJaxBJsonProvider() {
+               if (commonMapper == null) {
+                   ObjectMapper mapper = new ObjectMapper();
+
+                   mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+                   
+                   mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+                   mapper.configure(SerializationFeature.INDENT_OUTPUT, false);
+                   mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+
+                   mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+                   mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+
+                   mapper.registerModule(new JaxbAnnotationModule());
+
+                   commonMapper = mapper;
+               }
+               super.setMapper(commonMapper);
+           }
+           
+           /**
+        * Gets the mapper.
+        *
+        * @return the mapper
+        */
+       public ObjectMapper getMapper() {
+               return commonMapper;
+           }
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/GetTimeSlotsWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/GetTimeSlotsWrapper.java
new file mode 100644 (file)
index 0000000..81aafc6
--- /dev/null
@@ -0,0 +1,5 @@
+package org.openecomp.portalapp.portal.scheduler.wrapper;
+
+public class GetTimeSlotsWrapper extends SchedulerResponseWrapper {
+
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostCreateNewVnfWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostCreateNewVnfWrapper.java
new file mode 100644 (file)
index 0000000..38aa634
--- /dev/null
@@ -0,0 +1,39 @@
+package org.openecomp.portalapp.portal.scheduler.wrapper;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+           "uuid"
+})
+public class PostCreateNewVnfWrapper extends SchedulerResponseWrapper {
+
+       @JsonProperty("uuid")
+       private String uuid;
+       
+       @JsonProperty("uuid")
+    public String getUuid() {
+        return uuid;
+    }
+       
+       @JsonProperty("uuid")
+    public void setUuid(String v) {
+        this.uuid = v;
+    }
+       
+       @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+    public String getResponse () {
+       
+       StringBuilder b = new StringBuilder ("{ \"status\": ");
+       b.append(getStatus()).append(", \"entity\": \" " ).append(this.getEntity()).append("\" ,\"uuid\": \"" ).append(this.getUuid()).append("\"}");
+       return (b.toString());
+    }  
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostSubmitVnfChangeTimeSlotsWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/PostSubmitVnfChangeTimeSlotsWrapper.java
new file mode 100644 (file)
index 0000000..9d6725a
--- /dev/null
@@ -0,0 +1,38 @@
+package org.openecomp.portalapp.portal.scheduler.wrapper;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+           "uuid"
+})
+public class PostSubmitVnfChangeTimeSlotsWrapper extends SchedulerResponseWrapper  {
+       @JsonProperty("uuid")
+       private String uuid;
+       
+       @JsonProperty("uuid")
+    public String getUuid() {
+        return uuid;
+    }
+       
+       @JsonProperty("uuid")
+    public void setUuid(String v) {
+        this.uuid = v;
+    }
+       
+       @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+    public String getResponse () {
+       
+       StringBuilder b = new StringBuilder ("{ \"status\": ");
+       b.append(getStatus()).append(", \"entity\": \" " ).append(this.getEntity()).append("\" ,\"uuid\": \"" ).append(this.getUuid()).append("\"}");
+       return (b.toString());
+    }  
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/SchedulerResponseWrapper.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/scheduler/wrapper/SchedulerResponseWrapper.java
new file mode 100644 (file)
index 0000000..e10505c
--- /dev/null
@@ -0,0 +1,57 @@
+package org.openecomp.portalapp.portal.scheduler.wrapper;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ * This wrapper encapsulates the Scheduler response
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+           "status",
+           "entity"
+})
+
+public class SchedulerResponseWrapper {
+       
+       @JsonProperty("status")
+       private int status;
+
+       @JsonProperty("entity")
+       private String entity;
+
+       @JsonProperty("entity")
+    public String getEntity() {
+        return entity;
+    }
+       
+       @JsonProperty("status")
+    public int getStatus() {
+        return status;
+    }
+       
+       @JsonProperty("status")
+    public void setStatus(int v) {
+        this.status = v;
+    }
+
+       @JsonProperty("entity")
+    public void setEntity(String v) {
+        this.entity = v;
+    }
+       
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+    public String getResponse () {
+       
+       StringBuilder b = new StringBuilder ("{ \"status\": ");
+    
+       b.append(getStatus()).append(", \"entity\": " ).append(this.getEntity()).append("}");
+        return (b.toString());
+    }
+}
index b5bccfe..9025b59 100644 (file)
@@ -228,7 +228,10 @@ public class AdminRolesServiceImpl implements AdminRolesService {
                                                EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
                                                logger.error(EELFLoggerDelegate.errorLogger, "setAppsWithAdminRoleStateForUser: exception in point 2", e);
                                                try {
                                                EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
                                                logger.error(EELFLoggerDelegate.errorLogger, "setAppsWithAdminRoleStateForUser: exception in point 2", e);
                                                try {
-                                                       transaction.rollback();
+                                                       if(transaction!=null)
+                                                               transaction.rollback();
+                                                       else
+                                                               logger.error(EELFLoggerDelegate.errorLogger, "setAppsWithAdminRoleStateForUser: transaction is null cannot rollback");
                                                } catch (Exception ex) {
                                                        EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeExecuteRollbackError, e);
                                                        logger.error(EELFLoggerDelegate.errorLogger, "setAppsWithAdminRoleStateForUser: exception in point 3", ex);
                                                } catch (Exception ex) {
                                                        EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeExecuteRollbackError, e);
                                                        logger.error(EELFLoggerDelegate.errorLogger, "setAppsWithAdminRoleStateForUser: exception in point 3", ex);
index e509fcf..3efe438 100644 (file)
@@ -145,7 +145,7 @@ public class EPRoleServiceImpl implements EPRoleService {
                } else if (appId != 1 && !roleName.equals(PortalConstants.ADMIN_ROLE)) {
                        roles = (List<EPRole>) dataAccessService.executeNamedQuery("getAppRoles", params, null);
                }
                } else if (appId != 1 && !roleName.equals(PortalConstants.ADMIN_ROLE)) {
                        roles = (List<EPRole>) dataAccessService.executeNamedQuery("getAppRoles", params, null);
                }
-               int resultsCount = roles.size();
+               int resultsCount = (roles == null ? 0 : roles.size());
                if (resultsCount > 1) {
                        logger.error(EELFLoggerDelegate.errorLogger,
                                        "Trying to recover from duplicates by returning the first search result. This issue should be treated, it is probably not critical because duplicate roles should be similar.");
                if (resultsCount > 1) {
                        logger.error(EELFLoggerDelegate.errorLogger,
                                        "Trying to recover from duplicates by returning the first search result. This issue should be treated, it is probably not critical because duplicate roles should be similar.");
index 34088a2..77ce88c 100644 (file)
@@ -10,6 +10,7 @@ import org.openecomp.portalapp.portal.domain.EPUser;
 import org.openecomp.portalapp.portal.transport.CentralRole;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
 import org.openecomp.portalapp.portal.transport.CentralRole;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
 
 public interface ExternalAccessRolesService {
        
 
 public interface ExternalAccessRolesService {
        
@@ -246,6 +247,14 @@ public interface ExternalAccessRolesService {
         * @throws Exception
         */
        List<String> getMenuFunctionsList(String uebkey) throws Exception;
         * @throws Exception
         */
        List<String> getMenuFunctionsList(String uebkey) throws Exception;
-
+       
+       /**
+        * 
+        * @param uebkey applications UebKey
+        * @return
+        * @throws Exception
+        * Method getAllUsers returns all the active users of application
+        */
+       List<EcompUser> getAllAppUsers(String uebkey) throws Exception;
 
 }
 
 }
index 95e5ddc..97fa98e 100644 (file)
@@ -2,6 +2,7 @@ package org.openecomp.portalapp.portal.service;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -11,6 +12,7 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang.StringUtils;
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
@@ -33,6 +35,7 @@ import org.openecomp.portalapp.portal.transport.CentralApp;
 import org.openecomp.portalapp.portal.transport.CentralRole;
 import org.openecomp.portalapp.portal.transport.CentralUser;
 import org.openecomp.portalapp.portal.transport.CentralUserApp;
 import org.openecomp.portalapp.portal.transport.CentralRole;
 import org.openecomp.portalapp.portal.transport.CentralUser;
 import org.openecomp.portalapp.portal.transport.CentralUserApp;
+import org.openecomp.portalapp.portal.transport.EcompUserRoles;
 import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
 import org.openecomp.portalapp.portal.transport.ExternalAccessPermsDetail;
 import org.openecomp.portalapp.portal.transport.ExternalAccessRole;
 import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
 import org.openecomp.portalapp.portal.transport.ExternalAccessPermsDetail;
 import org.openecomp.portalapp.portal.transport.ExternalAccessRole;
@@ -45,6 +48,8 @@ import org.openecomp.portalapp.portal.utils.PortalConstants;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.openecomp.portalsdk.core.domain.Role;
 import org.openecomp.portalsdk.core.domain.RoleFunction;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.restful.domain.EcompRole;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.openecomp.portalsdk.core.service.DataAccessService;
 import org.openecomp.portalsdk.core.util.SystemProperties;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,6 +74,18 @@ import com.fasterxml.jackson.databind.type.TypeFactory;
 @EPAuditLog
 public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesService {
 
 @EPAuditLog
 public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesService {
 
+       private static final String AND_FUNCTION_CD_EQUALS = " and function_cd = '";
+
+       private static final String OWNER = ".owner";
+
+       private static final String ADMIN = ".admin";
+
+       private static final String ACCOUNT_ADMINISTRATOR = ".Account_Administrator";
+
+       private static final String FUNCTION_CD_LIKE_CLAUSE = " and function_cd like '%";
+
+       private static final String FUNCTION_PIPE = "|";
+
        private static final String IS_NULL_STRING = "null";
 
        private static final String EXTERNAL_AUTH_PERMS = "perms";
        private static final String IS_NULL_STRING = "null";
 
        private static final String EXTERNAL_AUTH_PERMS = "perms";
@@ -133,7 +150,7 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                List<EPApp> app = null;
                try {
                        app = (List<EPApp>) dataAccessService.getList(EPApp.class, " where ueb_key = '" + uebkey + "'", null, null);
                List<EPApp> app = null;
                try {
                        app = (List<EPApp>) dataAccessService.getList(EPApp.class, " where ueb_key = '" + uebkey + "'", null, null);
-                       if(!app.get(0).getEnabled()){
+                       if(!app.get(0).getEnabled() && !app.get(0).getId().equals(PortalConstants.PORTAL_APP_ID)){
                                throw new Exception("Application:"+app.get(0).getName()+" is Unavailable");
                        }
                } catch (Exception e) {
                                throw new Exception("Application:"+app.get(0).getName()+" is Unavailable");
                        }
                } catch (Exception e) {
@@ -225,7 +242,13 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                ExternalAccessRolePerms extRolePerms = null;
                ExternalAccessPerms extPerms = null;
                List<EPRole> epRoleList = null;
                ExternalAccessRolePerms extRolePerms = null;
                ExternalAccessPerms extPerms = null;
                List<EPRole> epRoleList = null;
-               epRoleList = dataAccessService.getList(EPRole.class, WHERE_ROLE_ID_EQUALS + updateExtRole.getId(), null, null);
+               if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
+                       epRoleList = dataAccessService.getList(EPRole.class,
+                                       WHERE_ROLE_ID_EQUALS + updateExtRole.getId() + " and app_id is null", null, null);
+               } else {
+                       epRoleList = dataAccessService.getList(EPRole.class,
+                                       " where app_role_id = " + updateExtRole.getId() + " and app_id = " + app.getId(), null, null);
+               }               
                String appRole = getSingleAppRole(epRoleList.get(0).getName(), app);
                if (!appRole.equals(IS_EMPTY_JSON_STRING)) {
                        JSONObject jsonObj = new JSONObject(appRole);
                String appRole = getSingleAppRole(epRoleList.get(0).getName(), app);
                if (!appRole.equals(IS_EMPTY_JSON_STRING)) {
                        JSONObject jsonObj = new JSONObject(appRole);
@@ -268,9 +291,10 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                        addRole(updateExtRole, app.getUebKey());
                                        addRoleFunctionsInExternalSystem(updateExtRole, mapper, app);
                                }
                                        addRole(updateExtRole, app.getUebKey());
                                        addRoleFunctionsInExternalSystem(updateExtRole, mapper, app);
                                }
+                               boolean checkPriorityStatus = StringUtils.equals(String.valueOf(sysRoleList.getPriority()),String.valueOf(updateExtRole.getPriority()));
                                ExternalAccessRole updateRole = new ExternalAccessRole();
                                if (!isActiveValueChanged
                                ExternalAccessRole updateRole = new ExternalAccessRole();
                                if (!isActiveValueChanged
-                                               || !sysRoleList.getPriority().equals(String.valueOf(updateExtRole.getPriority()))
+                                               || !checkPriorityStatus
                                                || sysRoleList.getId().equals(IS_NULL_STRING)
                                                || !sysRoleList.getId().equals(String.valueOf(epRoleList.get(0).getId()))) {
                                        String updateDesc = "";
                                                || sysRoleList.getId().equals(IS_NULL_STRING)
                                                || !sysRoleList.getId().equals(String.valueOf(epRoleList.get(0).getId()))) {
                                        String updateDesc = "";
@@ -278,17 +302,17 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                                        : APP_ID_EQUALS + app.getId();
                                        List<EPRole> getRole = dataAccessService.getList(EPRole.class,
                                                        WHERE_ROLE_NAME_EQUALS + updateExtRole.getName() + "' and " + appId, null, null);
                                                        : APP_ID_EQUALS + app.getId();
                                        List<EPRole> getRole = dataAccessService.getList(EPRole.class,
                                                        WHERE_ROLE_NAME_EQUALS + updateExtRole.getName() + "' and " + appId, null, null);
-                                       Map<String, Object> extSystemUpdateRoleJsonMapper = new LinkedHashMap<>();
-                                       extSystemUpdateRoleJsonMapper.put(ID, getRole.get(0).getId());
-                                       extSystemUpdateRoleJsonMapper.put(ROLE_NAME, updateExtRole.getName());
-                                       extSystemUpdateRoleJsonMapper.put(ACTIVE, updateExtRole.getActive());
-                                       extSystemUpdateRoleJsonMapper.put(PRIORITY, updateExtRole.getPriority());
+                                       Map<String, String> extSystemUpdateRoleJsonMapper = new LinkedHashMap<>();
+                                       extSystemUpdateRoleJsonMapper.put(ID, String.valueOf(getRole.get(0).getId()));
+                                       extSystemUpdateRoleJsonMapper.put(ROLE_NAME, String.valueOf(updateExtRole.getName()));
+                                       extSystemUpdateRoleJsonMapper.put(ACTIVE, String.valueOf(updateExtRole.getActive()));
+                                       extSystemUpdateRoleJsonMapper.put(PRIORITY, String.valueOf(updateExtRole.getPriority()));
                                        if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
                                        if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
-                                               extSystemUpdateRoleJsonMapper.put(APP_ID, null);
-                                               extSystemUpdateRoleJsonMapper.put(APP_ROLE_ID, null);
+                                               extSystemUpdateRoleJsonMapper.put(APP_ID, "null");
+                                               extSystemUpdateRoleJsonMapper.put(APP_ROLE_ID, "null");
                                        } else {
                                        } else {
-                                               extSystemUpdateRoleJsonMapper.put(APP_ID, app.getId());
-                                               extSystemUpdateRoleJsonMapper.put(APP_ROLE_ID, getRole.get(0).getAppRoleId());
+                                               extSystemUpdateRoleJsonMapper.put(APP_ID, String.valueOf(app.getId()));
+                                               extSystemUpdateRoleJsonMapper.put(APP_ROLE_ID, String.valueOf(getRole.get(0).getAppRoleId()));
 
                                        }
                                        updateDesc = mapper.writeValueAsString(extSystemUpdateRoleJsonMapper);
 
                                        }
                                        updateDesc = mapper.writeValueAsString(extSystemUpdateRoleJsonMapper);
@@ -465,13 +489,13 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                String addNewRole = "";
                ExternalAccessRole extRole = new ExternalAccessRole();
                String addDesc = null;
                String addNewRole = "";
                ExternalAccessRole extRole = new ExternalAccessRole();
                String addDesc = null;
-               Map<String, Object> extSystemJsonMapper = new LinkedHashMap<>();
-               extSystemJsonMapper.put(ID, newRole.get(0).getId());
-               extSystemJsonMapper.put(ROLE_NAME, newRole.get(0).getName());
-               extSystemJsonMapper.put(ACTIVE, newRole.get(0).getActive());
-               extSystemJsonMapper.put(PRIORITY, newRole.get(0).getPriority());
-               extSystemJsonMapper.put(APP_ID, newRole.get(0).getAppId());
-               extSystemJsonMapper.put(APP_ROLE_ID, newRole.get(0).getAppRoleId());
+               Map<String, String> extSystemJsonMapper = new LinkedHashMap<>();
+               extSystemJsonMapper.put(ID, String.valueOf(newRole.get(0).getId()));
+               extSystemJsonMapper.put(ROLE_NAME, String.valueOf(newRole.get(0).getName()));
+               extSystemJsonMapper.put(ACTIVE, String.valueOf(newRole.get(0).getActive()));
+               extSystemJsonMapper.put(PRIORITY, String.valueOf(newRole.get(0).getPriority()));
+               extSystemJsonMapper.put(APP_ID, String.valueOf(newRole.get(0).getAppId()));
+               extSystemJsonMapper.put(APP_ROLE_ID, String.valueOf(newRole.get(0).getAppRoleId()));
                addDesc = mapper.writeValueAsString(extSystemJsonMapper);
                extRole.setName(app.getNameSpace() + "." + newRole.get(0).getName().replaceAll(" ", "_"));
                extRole.setDescription(addDesc);
                addDesc = mapper.writeValueAsString(extSystemJsonMapper);
                extRole.setName(app.getNameSpace() + "." + newRole.get(0).getName().replaceAll(" ", "_"));
                extRole.setDescription(addDesc);
@@ -508,18 +532,18 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                ExternalAccessRole extRole = new ExternalAccessRole();
                List<EPRole> role = null;
                String addDesc = null;
                ExternalAccessRole extRole = new ExternalAccessRole();
                List<EPRole> role = null;
                String addDesc = null;
-               Map<String, Object> extSystemUpdateRole = new LinkedHashMap<>();
+               Map<String, String> extSystemUpdateRole = new LinkedHashMap<>();
                if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
                if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
-                       role = dataAccessService.getList(EPRole.class, WHERE_ROLE_ID_EQUALS + addRole.getId(), null, null);
+                       role = dataAccessService.getList(EPRole.class, WHERE_ROLE_ID_EQUALS + addRole.getId() + " and app_id is null", null, null);
                } else {
                } else {
-                       role = dataAccessService.getList(EPRole.class, " where app_role_id = " + addRole.getId(), null, null);
+                       role = dataAccessService.getList(EPRole.class, " where app_role_id = " + addRole.getId() + " and app_id ="+app.getId(), null, null);
                }
                }
-               extSystemUpdateRole.put(ID, role.get(0).getId());
-               extSystemUpdateRole.put(ROLE_NAME, addRole.getName());
-               extSystemUpdateRole.put(ACTIVE, role.get(0).getActive());
-               extSystemUpdateRole.put(PRIORITY, role.get(0).getPriority());
-               extSystemUpdateRole.put(APP_ID, role.get(0).getAppId());
-               extSystemUpdateRole.put(APP_ROLE_ID, role.get(0).getAppRoleId());
+               extSystemUpdateRole.put(ID, String.valueOf(role.get(0).getId()));
+               extSystemUpdateRole.put(ROLE_NAME, String.valueOf(addRole.getName()));
+               extSystemUpdateRole.put(ACTIVE, String.valueOf(role.get(0).getActive()));
+               extSystemUpdateRole.put(PRIORITY, String.valueOf(role.get(0).getPriority()));
+               extSystemUpdateRole.put(APP_ID, String.valueOf(role.get(0).getAppId()));
+               extSystemUpdateRole.put(APP_ROLE_ID, String.valueOf(role.get(0).getAppRoleId()));
                addDesc = mapper.writeValueAsString(extSystemUpdateRole);
                extRole.setName(app.getNameSpace() + "." + addRole.getName().replaceAll(" ", "_"));
                extRole.setDescription(addDesc);
                addDesc = mapper.writeValueAsString(extSystemUpdateRole);
                extRole.setName(app.getNameSpace() + "." + addRole.getName().replaceAll(" ", "_"));
                extRole.setDescription(addDesc);
@@ -652,13 +676,17 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
         * @param applicationRoles
         * @throws Exception
         */
         * @param applicationRoles
         * @throws Exception
         */
+       @SuppressWarnings("unchecked")
        private void saveRoleFunction(List<RoleFunction> roleFunctionListNew, EPApp app, List<EPRole> applicationRoles)
                        throws Exception {
                for (RoleFunction roleFunc : roleFunctionListNew) {
                        EPAppRoleFunction appRoleFunc = new EPAppRoleFunction();
                        appRoleFunc.setAppId(app.getId());
                        appRoleFunc.setRoleId(applicationRoles.get(0).getId());
        private void saveRoleFunction(List<RoleFunction> roleFunctionListNew, EPApp app, List<EPRole> applicationRoles)
                        throws Exception {
                for (RoleFunction roleFunc : roleFunctionListNew) {
                        EPAppRoleFunction appRoleFunc = new EPAppRoleFunction();
                        appRoleFunc.setAppId(app.getId());
                        appRoleFunc.setRoleId(applicationRoles.get(0).getId());
-                       appRoleFunc.setCode(roleFunc.getCode());
+                       // query to check if function code is different for safe operation
+                       List<CentralRoleFunction> roleFunction = dataAccessService.getList(CentralRoleFunction.class,
+                                       WHERE_APP_ID_EQUALS+ app.getId()+FUNCTION_CD_LIKE_CLAUSE + roleFunc.getCode() + "'", null, null);
+                       appRoleFunc.setCode(roleFunction.get(0).getCode());
                        dataAccessService.saveDomainObject(appRoleFunc, null);
                }
        }
                        dataAccessService.saveDomainObject(appRoleFunc, null);
                }
        }
@@ -739,15 +767,33 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
        @Override
        public List<CentralRoleFunction> getRoleFuncList(String uebkey) throws Exception {
                EPApp app = getApp(uebkey).get(0);
        @Override
        public List<CentralRoleFunction> getRoleFuncList(String uebkey) throws Exception {
                EPApp app = getApp(uebkey).get(0);
-               List<CentralRoleFunction> getRoleFuncList = null;
+               List<CentralRoleFunction> finalRoleList = new ArrayList<>();
                final Map<String, Long> params = new HashMap<>();
                params.put(APP_ID, app.getId());
                // Sync all functions from external system into Ecomp portal DB
                logger.debug(EELFLoggerDelegate.debugLogger, "getRoleFuncList: Entering into syncRoleFunctionFromExternalAccessSystem");
                syncRoleFunctionFromExternalAccessSystem(app);
                logger.debug(EELFLoggerDelegate.debugLogger, "getRoleFuncList: Finished syncRoleFunctionFromExternalAccessSystem");
                final Map<String, Long> params = new HashMap<>();
                params.put(APP_ID, app.getId());
                // Sync all functions from external system into Ecomp portal DB
                logger.debug(EELFLoggerDelegate.debugLogger, "getRoleFuncList: Entering into syncRoleFunctionFromExternalAccessSystem");
                syncRoleFunctionFromExternalAccessSystem(app);
                logger.debug(EELFLoggerDelegate.debugLogger, "getRoleFuncList: Finished syncRoleFunctionFromExternalAccessSystem");
-               getRoleFuncList = dataAccessService.executeNamedQuery("getAllRoleFunctions", params, null);
-               return getRoleFuncList;
+               List<CentralRoleFunction> getRoleFuncList = dataAccessService.executeNamedQuery("getAllRoleFunctions", params, null);
+               for(CentralRoleFunction roleFuncItem : getRoleFuncList ){
+                       if(roleFuncItem.getCode().contains(FUNCTION_PIPE)){
+                               String code = "";
+                               int count = StringUtils.countMatches(roleFuncItem.getCode(), FUNCTION_PIPE);
+                               if (count == 2)
+                                       code = roleFuncItem.getCode().substring(
+                                                       roleFuncItem.getCode().indexOf(FUNCTION_PIPE) + 1,
+                                                       roleFuncItem.getCode().lastIndexOf(FUNCTION_PIPE));
+                               else
+                                       code = roleFuncItem.getCode()
+                                                       .substring(roleFuncItem.getCode().lastIndexOf(FUNCTION_PIPE) + 1);
+                               
+                               roleFuncItem.setCode(code);
+                               finalRoleList.add(roleFuncItem);
+                       } else{
+                               finalRoleList.add(roleFuncItem);
+                       }
+               }
+               return finalRoleList;
        }
 
        /**
        }
 
        /**
@@ -792,8 +838,24 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                                                .executeNamedQuery("getAppRoleFunctionList", params, null);
                                                SortedSet<CentralRoleFunction> roleFunctionSet = new TreeSet<>();
                                                for (CentralRoleFunction roleFunc : appRoleFunctionList) {
                                                                .executeNamedQuery("getAppRoleFunctionList", params, null);
                                                SortedSet<CentralRoleFunction> roleFunctionSet = new TreeSet<>();
                                                for (CentralRoleFunction roleFunc : appRoleFunctionList) {
-                                                       CentralRoleFunction cenRoleFunc = new CentralRoleFunction(roleFunc.getId(),
-                                                                       roleFunc.getCode(), roleFunc.getName(), null, null);
+                                                       String functionCode = "";
+                                                       if (roleFunc.getCode().contains(FUNCTION_PIPE)) {
+                                                               int count = StringUtils.countMatches(roleFunc.getCode(), FUNCTION_PIPE);
+                                                               String finalFunctionCodeVal;
+                                                               if (count == 2)
+                                                                       finalFunctionCodeVal = roleFunc.getCode().substring(
+                                                                                       roleFunc.getCode().indexOf(FUNCTION_PIPE) + 1,
+                                                                                       roleFunc.getCode().lastIndexOf(FUNCTION_PIPE));
+                                                               else
+                                                                       finalFunctionCodeVal = roleFunc.getCode()
+                                                                                       .substring(roleFunc.getCode().lastIndexOf(FUNCTION_PIPE) + 1);
+
+                                                               functionCode = finalFunctionCodeVal;
+                                                       } else {
+                                                               functionCode = roleFunc.getCode();
+                                                       }
+                                                       CentralRoleFunction cenRoleFunc = new CentralRoleFunction(roleFunc.getId(), functionCode,
+                                                                       roleFunc.getName(), null, null);
                                                        roleFunctionSet.add(cenRoleFunc);
                                                }
                                                Long userRoleId = null;
                                                        roleFunctionSet.add(cenRoleFunc);
                                                }
                                                Long userRoleId = null;
@@ -892,7 +954,22 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                        params, null);
                        SortedSet<CentralRoleFunction> roleFunctionSet = new TreeSet<>();
                        for (CentralRoleFunction roleFunc : cenRoleFuncList) {
                                        params, null);
                        SortedSet<CentralRoleFunction> roleFunctionSet = new TreeSet<>();
                        for (CentralRoleFunction roleFunc : cenRoleFuncList) {
-                               CentralRoleFunction cenRoleFunc = new CentralRoleFunction(role.getId(), roleFunc.getCode(),
+                               String functionCode = "";
+                               if (roleFunc.getCode().contains(FUNCTION_PIPE)) {
+                                       int count = StringUtils.countMatches(roleFunc.getCode(), FUNCTION_PIPE);
+                                       String finalFunctionCodeVal;
+                                       if (count == 2)
+                                               finalFunctionCodeVal = roleFunc.getCode().substring(
+                                                               roleFunc.getCode().indexOf(FUNCTION_PIPE) + 1,
+                                                               roleFunc.getCode().lastIndexOf(FUNCTION_PIPE));
+                                       else
+                                               finalFunctionCodeVal = roleFunc.getCode()
+                                                               .substring(roleFunc.getCode().lastIndexOf(FUNCTION_PIPE) + 1);
+                                       functionCode = finalFunctionCodeVal;
+                               } else {
+                                       functionCode = roleFunc.getCode();
+                               }
+                               CentralRoleFunction cenRoleFunc = new CentralRoleFunction(role.getId(), functionCode,
                                                roleFunc.getName(), null, null);
                                roleFunctionSet.add(cenRoleFunc);
                        }
                                                roleFunc.getName(), null, null);
                                roleFunctionSet.add(cenRoleFunc);
                        }
@@ -925,13 +1002,20 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                        getRoleFuncList = dataAccessService.executeNamedQuery("getRoleFunction", params, null);
                        if (getRoleFuncList.isEmpty()) {
                                return roleFunc;
                        getRoleFuncList = dataAccessService.executeNamedQuery("getRoleFunction", params, null);
                        if (getRoleFuncList.isEmpty()) {
                                return roleFunc;
+                       } else{
+                               String functionCodeFormat = getRoleFuncList.get(0).getCode();
+                               if(functionCodeFormat.contains(FUNCTION_PIPE)){
+                                       String newfunctionCodeFormat = functionCodeFormat.substring(functionCodeFormat.lastIndexOf(FUNCTION_PIPE)+1); 
+                                       roleFunc = new CentralRoleFunction(getRoleFuncList.get(0).getId(), newfunctionCodeFormat, getRoleFuncList.get(0).getName(), getRoleFuncList.get(0).getAppId(), getRoleFuncList.get(0).getEditUrl());
+                               } else{
+                                       roleFunc = new CentralRoleFunction(getRoleFuncList.get(0).getId(), functionCodeFormat, getRoleFuncList.get(0).getName(), getRoleFuncList.get(0).getAppId(), getRoleFuncList.get(0).getEditUrl());
+                               }
                        }
                        }
-
                } catch (Exception e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "getRoleFunction: failed", e);
                        throw new Exception("getRoleFunction failed", e);
                }
                } catch (Exception e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "getRoleFunction: failed", e);
                        throw new Exception("getRoleFunction failed", e);
                }
-               return getRoleFuncList.get(0);
+               return roleFunc;
        }
 
        @Override
        }
 
        @Override
@@ -959,13 +1043,10 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
        private void addRoleFunctionInExternalSystem(CentralRoleFunction domainCentralRoleFunction, EPApp app)
                        throws Exception {
                ObjectMapper mapper = new ObjectMapper();
        private void addRoleFunctionInExternalSystem(CentralRoleFunction domainCentralRoleFunction, EPApp app)
                        throws Exception {
                ObjectMapper mapper = new ObjectMapper();
-               final Map<String, String> params = new HashMap<>();
-               params.put("functionCd", domainCentralRoleFunction.getCode());
-               params.put(APP_ID, String.valueOf(app.getId()));
                ExternalAccessPerms extPerms = new ExternalAccessPerms();
                HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
                ExternalAccessPerms extPerms = new ExternalAccessPerms();
                HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
-               List<CentralRoleFunction> appRoleFunc = dataAccessService.executeNamedQuery("getAppFunctionDetails", params,
-                               null);
+               List<CentralRoleFunction> appRoleFunc = dataAccessService.getList(CentralRoleFunction.class,
+                               WHERE_APP_ID_EQUALS + app.getId() + AND_FUNCTION_CD_EQUALS + domainCentralRoleFunction.getCode() + "'", null, null);
                String roleFuncName = null;
                if (!appRoleFunc.isEmpty()) {
                        roleFuncName = appRoleFunc.get(0).getCode();
                String roleFuncName = null;
                if (!appRoleFunc.isEmpty()) {
                        roleFuncName = appRoleFunc.get(0).getCode();
@@ -1034,10 +1115,10 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                boolean deleteFunctionResponse = false;
                try {
                        final Map<String, String> params = new HashMap<>();
                boolean deleteFunctionResponse = false;
                try {
                        final Map<String, String> params = new HashMap<>();
-                       params.put("functionCd", code);
+                       params.put("functionCode", code);
                        params.put(APP_ID, String.valueOf(app.getId()));
                        CentralRoleFunction domainCentralRoleFunction = (CentralRoleFunction) dataAccessService
                        params.put(APP_ID, String.valueOf(app.getId()));
                        CentralRoleFunction domainCentralRoleFunction = (CentralRoleFunction) dataAccessService
-                                       .executeNamedQuery("getAppFunctionDetails", params, null).get(0);
+                                       .executeNamedQuery("getRoleFunction", params, null).get(0);
                        deleteRoleFunctionInExternalSystem(domainCentralRoleFunction, app);
                        // Delete role function dependency records
                        deleteAppRoleFunctions(code, app);
                        deleteRoleFunctionInExternalSystem(domainCentralRoleFunction, app);
                        // Delete role function dependency records
                        deleteAppRoleFunctions(code, app);
@@ -1057,7 +1138,7 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
         */
        private void deleteAppRoleFunctions(String code, EPApp app) {
                dataAccessService.deleteDomainObjects(EPAppRoleFunction.class,
         */
        private void deleteAppRoleFunctions(String code, EPApp app) {
                dataAccessService.deleteDomainObjects(EPAppRoleFunction.class,
-                               APP_ID_EQUALS + app.getId() + " and function_cd = '" + code + "'", null);
+                               APP_ID_EQUALS + app.getId() + FUNCTION_CD_LIKE_CLAUSE + code + "'", null);
        }
        
        /**
        }
        
        /**
@@ -1073,7 +1154,13 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                try {
                        ObjectMapper mapper = new ObjectMapper();
                        ExternalAccessPerms extPerms = new ExternalAccessPerms();
                try {
                        ObjectMapper mapper = new ObjectMapper();
                        ExternalAccessPerms extPerms = new ExternalAccessPerms();
-                       String checkType = domainCentralRoleFunction.getCode().contains("menu") ? "menu" : "url";
+                       String instanceValue = "";
+                       if(domainCentralRoleFunction.getCode().contains(FUNCTION_PIPE)){
+                               instanceValue = domainCentralRoleFunction.getCode().substring(domainCentralRoleFunction.getCode().lastIndexOf(FUNCTION_PIPE)+1);
+                       }else{
+                               instanceValue = domainCentralRoleFunction.getCode();
+                       }
+                       String checkType = instanceValue.contains("menu") ? "menu" : "url";
                        HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
                        extPerms.setAction("*");
                        extPerms.setInstance(domainCentralRoleFunction.getCode());
                        HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
                        extPerms.setAction("*");
                        extPerms.setInstance(domainCentralRoleFunction.getCode());
@@ -1298,21 +1385,29 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                        ExternalAccessPermsDetail permDetails = null;
                        List<ExternalAccessPermsDetail> permsDetailList = new ArrayList<>();
                        for (int i = 0; i < extPerms.length(); i++) {
                        ExternalAccessPermsDetail permDetails = null;
                        List<ExternalAccessPermsDetail> permsDetailList = new ArrayList<>();
                        for (int i = 0; i < extPerms.length(); i++) {
+                               String description = null;
+                               if(extPerms.getJSONObject(i).has("description")){
+                                       description = extPerms.getJSONObject(i).getString(EXTERNAL_AUTH_ROLE_DESCRIPTION);
+                               } else{
+                                       description = extPerms.getJSONObject(i).getString("instance");
+                               }
                                if (extPerms.getJSONObject(i).has("roles")) {
                                        ObjectMapper rolesListMapper = new ObjectMapper();
                                        JSONArray resRoles = extPerms.getJSONObject(i).getJSONArray("roles");
                                        List<String> list = rolesListMapper.readValue(resRoles.toString(),
                                                        TypeFactory.defaultInstance().constructCollectionType(List.class, String.class));
                                        permDetails = new ExternalAccessPermsDetail(extPerms.getJSONObject(i).getString("type"),
                                if (extPerms.getJSONObject(i).has("roles")) {
                                        ObjectMapper rolesListMapper = new ObjectMapper();
                                        JSONArray resRoles = extPerms.getJSONObject(i).getJSONArray("roles");
                                        List<String> list = rolesListMapper.readValue(resRoles.toString(),
                                                        TypeFactory.defaultInstance().constructCollectionType(List.class, String.class));
                                        permDetails = new ExternalAccessPermsDetail(extPerms.getJSONObject(i).getString("type"),
-                                                       extPerms.getJSONObject(i).getString("instance"),
-                                                       extPerms.getJSONObject(i).getString("action"), list,
-                                                       extPerms.getJSONObject(i).getString(EXTERNAL_AUTH_ROLE_DESCRIPTION));
+                                                       extPerms.getJSONObject(i).getString("type").substring(app.getNameSpace().length() + 1)
+                                                                       + FUNCTION_PIPE + extPerms.getJSONObject(i).getString("instance") + FUNCTION_PIPE
+                                                                       + extPerms.getJSONObject(i).getString("action"),
+                                                       extPerms.getJSONObject(i).getString("action"), list, description);
                                        permsDetailList.add(permDetails);
                                } else {
                                        permDetails = new ExternalAccessPermsDetail(extPerms.getJSONObject(i).getString("type"),
                                        permsDetailList.add(permDetails);
                                } else {
                                        permDetails = new ExternalAccessPermsDetail(extPerms.getJSONObject(i).getString("type"),
-                                                       extPerms.getJSONObject(i).getString("instance"),
-                                                       extPerms.getJSONObject(i).getString("action"),
-                                                       extPerms.getJSONObject(i).getString(EXTERNAL_AUTH_ROLE_DESCRIPTION));
+                                                       extPerms.getJSONObject(i).getString("type").substring(app.getNameSpace().length() + 1)
+                                                                       + FUNCTION_PIPE + extPerms.getJSONObject(i).getString("instance") + FUNCTION_PIPE
+                                                                       + extPerms.getJSONObject(i).getString("action"),
+                                                       extPerms.getJSONObject(i).getString("action"), description);
                                        permsDetailList.add(permDetails);
                                }
                        }
                                        permsDetailList.add(permDetails);
                                }
                        }
@@ -1329,20 +1424,34 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                        }
                        // delete all application role functions
                        dataAccessService.deleteDomainObjects(EPAppRoleFunction.class, APP_ID_EQUALS + app.getId(), null);
                        }
                        // delete all application role functions
                        dataAccessService.deleteDomainObjects(EPAppRoleFunction.class, APP_ID_EQUALS + app.getId(), null);
-
                        // Add if new functions and app role functions were added in external auth system
                        for (ExternalAccessPermsDetail permsDetail : permsDetailList) {
                        // Add if new functions and app role functions were added in external auth system
                        for (ExternalAccessPermsDetail permsDetail : permsDetailList) {
-                               if (!roleFuncMap.containsKey(permsDetail.getInstance())) {
-                                       try{
-                                       CentralRoleFunction addFunction = new CentralRoleFunction();
-                                       addFunction.setAppId(app.getId());
-                                       addFunction.setCode(permsDetail.getInstance());
-                                       addFunction.setName(permsDetail.getDescription());
-                                       dataAccessService.saveDomainObject(addFunction, null);
-                                       } catch(Exception e){
-                                               logger.error(EELFLoggerDelegate.errorLogger, "syncRoleFunctionFromExternalAccessSystem: Failed to add function", e);
+                               String code = permsDetail.getInstance();
+                               CentralRoleFunction getFunctionCodeKey = roleFuncMap.get(permsDetail.getInstance());
+                               if (null == getFunctionCodeKey) {
+                                       String finalFunctionCodeVal = "";
+                                       if (permsDetail.getInstance().contains(FUNCTION_PIPE)) {
+                                               int count = StringUtils.countMatches(permsDetail.getInstance(), FUNCTION_PIPE);
+                                               if (count == 2)
+                                                       finalFunctionCodeVal = permsDetail.getInstance().substring(
+                                                                       permsDetail.getInstance().indexOf(FUNCTION_PIPE) + 1,
+                                                                       permsDetail.getInstance().lastIndexOf(FUNCTION_PIPE));
+                                               else
+                                                       finalFunctionCodeVal = permsDetail.getInstance()
+                                                                       .substring(permsDetail.getInstance().lastIndexOf(FUNCTION_PIPE) + 1);
+                                       } else {
+                                               finalFunctionCodeVal = permsDetail.getInstance();
                                        }
                                        }
-                               }
+                                       CentralRoleFunction checkIfCodeStillExits = roleFuncMap.get(finalFunctionCodeVal);
+                                       if (null == checkIfCodeStillExits) {
+                                               logger.debug(EELFLoggerDelegate.debugLogger,
+                                                               "syncRoleFunctionFromExternalAccessSystem: Adding function: {} ", code);
+                                               addFunctionInEcompDB(app, permsDetail, code);
+                                               logger.debug(EELFLoggerDelegate.debugLogger,
+                                                               "syncRoleFunctionFromExternalAccessSystem: Finished adding function: {} ", code);
+
+                                       }
+                               }                               
                                List<EPRole> epRolesList = null;
                                List<String> roles = permsDetail.getRoles();
                                if (roles != null) {
                                List<EPRole> epRolesList = null;
                                List<String> roles = permsDetail.getRoles();
                                if (roles != null) {
@@ -1372,17 +1481,53 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                                                                                + roleList.substring(app.getNameSpace().length() + 1) + "'",
                                                                                null, null);
                                                        }
                                                                                                + roleList.substring(app.getNameSpace().length() + 1) + "'",
                                                                                null, null);
                                                        }
+                                                       // Adding new role thats does not exits in Local but exists in external access system
+                                                       if (epRolesList.isEmpty()) {
+                                                               Role role = addRoleInDBIfDoesNotExists(app, roleList.substring(app.getNameSpace().length() + 1));
+                                                               addIfRoleDescriptionNotExitsInExtSystem(role, app);
+                                                               epRolesList = dataAccessService.getList(EPRole.class,
+                                                                               WHERE_APP_ID_EQUALS + app.getId() + " and role_name = '"
+                                                                                               + role.getName() + "'",
+                                                                               null, null);
+                                                       }
                                                }
                                                // save all application role functions
                                                if (!epRolesList.isEmpty()) {
                                                }
                                                // save all application role functions
                                                if (!epRolesList.isEmpty()) {
-                                                       try{
-                                                       EPAppRoleFunction addAppRoleFunc = new EPAppRoleFunction();
-                                                       addAppRoleFunc.setAppId(app.getId());
-                                                       addAppRoleFunc.setCode(permsDetail.getInstance());
-                                                       addAppRoleFunc.setRoleId(epRolesList.get(0).getId());
-                                                       dataAccessService.saveDomainObject(addAppRoleFunc, null);
-                                                       } catch(Exception e){
-                                                               logger.error(EELFLoggerDelegate.errorLogger, "syncRoleFunctionFromExternalAccessSystem: Failed to save app role function ", e);
+                                                       try {
+                                                               List<CentralRoleFunction> roleFunctionList = null;
+                                                               String functionCode = "";
+                                                               if (permsDetail.getInstance().contains(FUNCTION_PIPE)) {
+                                                                       int count = StringUtils.countMatches(permsDetail.getInstance(), FUNCTION_PIPE);
+                                                                       String finalFunctionCodeVal;
+                                                                       if (count == 2)
+                                                                               finalFunctionCodeVal = permsDetail.getInstance().substring(
+                                                                                               permsDetail.getInstance().indexOf(FUNCTION_PIPE) + 1,
+                                                                                               permsDetail.getInstance().lastIndexOf(FUNCTION_PIPE));
+                                                                       else
+                                                                               finalFunctionCodeVal = permsDetail.getInstance()
+                                                                                               .substring(permsDetail.getInstance().lastIndexOf(FUNCTION_PIPE) + 1);
+
+                                                                       functionCode = finalFunctionCodeVal;
+                                                               }
+                                                               roleFunctionList = dataAccessService.getList(CentralRoleFunction.class,
+                                                                               " where app_id = " + app.getId() + AND_FUNCTION_CD_EQUALS + functionCode + "'",
+                                                                               null, null);
+                                                               if (roleFunctionList.isEmpty()) {
+                                                                       roleFunctionList = dataAccessService.getList(CentralRoleFunction.class,
+                                                                                       " where app_id = " + app.getId() + AND_FUNCTION_CD_EQUALS + code + "'",
+                                                                                       null, null);
+                                                               }
+                                                               if (!roleFunctionList.isEmpty()) {
+                                                                       EPAppRoleFunction addAppRoleFunc = new EPAppRoleFunction();
+                                                                       addAppRoleFunc.setAppId(app.getId());
+                                                                       addAppRoleFunc.setCode(roleFunctionList.get(0).getCode());
+                                                                       addAppRoleFunc.setRoleId(epRolesList.get(0).getId());
+                                                                       dataAccessService.saveDomainObject(addAppRoleFunc, null);
+                                                               }
+                                                       } catch (Exception e) {
+                                                               logger.error(EELFLoggerDelegate.errorLogger,
+                                                                               "syncRoleFunctionFromExternalAccessSystem: Failed to save app role function ",
+                                                                               e);
                                                        }
                                                }
                                        }
                                                        }
                                                }
                                        }
@@ -1394,6 +1539,97 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
 
                }
        }
 
                }
        }
+       
+       /**
+        * 
+        * Add function into local DB
+        * 
+        * @param app
+        * @param permsDetail
+        * @param code
+        */
+       private void addFunctionInEcompDB(EPApp app, ExternalAccessPermsDetail permsDetail, String code) {
+               try{
+               CentralRoleFunction addFunction = new CentralRoleFunction();
+               addFunction.setAppId(app.getId());
+               addFunction.setCode(code);
+               addFunction.setName(permsDetail.getDescription());
+               dataAccessService.saveDomainObject(addFunction, null);
+               } catch(Exception e){
+                       logger.error(EELFLoggerDelegate.errorLogger, "addFunctionInEcompDB: Failed to add function", e);
+               }
+       }
+
+       /**
+        * 
+        * It updates description of a role in external auth system
+        * 
+        * @param role
+        * @param app
+        * @throws Exception
+        */
+       private void addIfRoleDescriptionNotExitsInExtSystem(Role role, EPApp app) throws Exception {
+               String addRoleNew = updateExistingRoleInExternalSystem(role, app);
+               HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
+               try {
+                       HttpEntity<String> entity = new HttpEntity<>(addRoleNew, headers);
+                       template.exchange(
+                                       SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL) + "role",
+                                       HttpMethod.PUT, entity, String.class);
+               } catch (HttpClientErrorException e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "HttpClientErrorException - Failed to addIfRoleDescriptionNotExitsInExtSystem",
+                                       e);
+                       EPLogUtil.logExternalAuthAccessAlarm(logger, e.getStatusCode());
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "addIfRoleDescriptionNotExitsInExtSystem: Failed",
+                                       e);
+               }
+       }
+
+       /**
+        * 
+        * While sync functions form external auth system if new role found we should add in local and return Role.class object
+        * 
+        * @param app
+        * @param role
+        * @return
+        */
+       @SuppressWarnings("unchecked")
+       private Role addRoleInDBIfDoesNotExists(EPApp app, String role) {
+               Role setNewRole = new Role();
+               EPRole epRoleNew = new EPRole();
+               try {
+                       epRoleNew.setActive(true);
+                       epRoleNew.setName(role);
+                       if (app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
+                               epRoleNew.setAppId(null);
+                       } else {
+                               epRoleNew.setAppId(app.getId());
+                       }
+                       dataAccessService.saveDomainObject(epRoleNew, null);
+                       List<EPRole> getRoleCreated = null;
+                       if (!app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
+                               List<EPRole> roleCreated = dataAccessService.getList(EPRole.class,
+                                               WHERE_ROLE_NAME_EQUALS + role + "' and app_id = " + app.getId(), null, null);
+                               EPRole epUpdateRole = roleCreated.get(0);
+                               epUpdateRole.setAppRoleId(epUpdateRole.getId());
+                               dataAccessService.saveDomainObject(epUpdateRole, null);
+                               getRoleCreated = dataAccessService.getList(EPRole.class,
+                                               WHERE_ROLE_NAME_EQUALS + role + "' and app_id = " + app.getId(), null, null);
+                       } else {
+                               getRoleCreated = dataAccessService.getList(EPRole.class,
+                                               WHERE_ROLE_NAME_EQUALS + role + "' and app_id is null", null, null);
+                       }
+                       EPRole roleObject = getRoleCreated.get(0);
+                       setNewRole.setId(roleObject.getId());
+                       setNewRole.setName(roleObject.getName());
+                       setNewRole.setActive(roleObject.getActive());
+                       setNewRole.setPriority(roleObject.getPriority());
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "addRoleInDBIfDoesNotExists: Failed", e);
+               }
+               return setNewRole;
+       }
 
        @Override
        @SuppressWarnings("unchecked")
 
        @Override
        @SuppressWarnings("unchecked")
@@ -1610,28 +1846,27 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                        ObjectMapper mapper = new ObjectMapper();
                        HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
                        HttpEntity<String> entity = new HttpEntity<>(headers);
                        ObjectMapper mapper = new ObjectMapper();
                        HttpHeaders headers = EcompPortalUtils.base64encodeKeyForAAFBasicAuth();
                        HttpEntity<String> entity = new HttpEntity<>(headers);
-                       logger.debug(EELFLoggerDelegate.debugLogger, "syncApplicationRolesWithEcompDB: {} " , CONNECTING_TO_EXTERNAL_AUTH_SYSTEM_LOG_MESSAGE);
+                       logger.debug(EELFLoggerDelegate.debugLogger, "syncApplicationRolesWithEcompDB: {} ",
+                                       CONNECTING_TO_EXTERNAL_AUTH_SYSTEM_LOG_MESSAGE);
                        response = template
                                        .exchange(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL)
                                                        + "roles/ns/" + app.getNameSpace(), HttpMethod.GET, entity, String.class);
                        String res = response.getBody();
                        response = template
                                        .exchange(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL)
                                                        + "roles/ns/" + app.getNameSpace(), HttpMethod.GET, entity, String.class);
                        String res = response.getBody();
-                       logger.debug(EELFLoggerDelegate.debugLogger, "syncApplicationRolesWithEcompDB: Finished GET roles from External Auth system and the result is :",
+                       logger.debug(EELFLoggerDelegate.debugLogger,
+                                       "syncApplicationRolesWithEcompDB: Finished GET roles from External Auth system and the result is :",
                                        res);
                        JSONObject jsonObj = new JSONObject(res);
                        JSONArray extRole = jsonObj.getJSONArray("role");
                        for (int i = 0; i < extRole.length(); i++) {
                                        res);
                        JSONObject jsonObj = new JSONObject(res);
                        JSONArray extRole = jsonObj.getJSONArray("role");
                        for (int i = 0; i < extRole.length(); i++) {
-                               if (extRole.getJSONObject(i).getString(ROLE_NAME).equals(app.getNameSpace() + ".admin")
-                                               || extRole.getJSONObject(i).getString(ROLE_NAME).equals(app.getNameSpace() + ".owner")) {
+                               if (extRole.getJSONObject(i).getString(ROLE_NAME).equals(app.getNameSpace() + ADMIN)
+                                               || extRole.getJSONObject(i).getString(ROLE_NAME).equals(app.getNameSpace() + OWNER)
+                                               || (extRole.getJSONObject(i).getString(ROLE_NAME).equals(app.getNameSpace() + ACCOUNT_ADMINISTRATOR)
+                                                               && !app.getId().equals(PortalConstants.PORTAL_APP_ID))) {
                                        extRole.remove(i);
                                        i--;
                                        extRole.remove(i);
                                        i--;
-                               }
-                               if (!app.getId().equals(PortalConstants.PORTAL_APP_ID) && extRole.getJSONObject(i).get(ROLE_NAME)
-                                               .equals(app.getNameSpace() + "." + PortalConstants.ADMIN_ROLE.replaceAll(" ", "_"))) {
-                                       extRole.remove(i);
-                                       i--;
-                               }
+                               }                       
                        }
                        }
-                       List<EPAppRoleFunction> applicationRoleFunctionList = new ArrayList<>();
+                       dataAccessService.deleteDomainObjects(EPAppRoleFunction.class, APP_ID_EQUALS + app.getId(), null);
                        for (int i = 0; i < extRole.length(); i++) {
                                ExternalRoleDetails externalRoleDetail = new ExternalRoleDetails();
                                EPAppRoleFunction ePAppRoleFunction = new EPAppRoleFunction();
                        for (int i = 0; i < extRole.length(); i++) {
                                ExternalRoleDetails externalRoleDetail = new ExternalRoleDetails();
                                EPAppRoleFunction ePAppRoleFunction = new EPAppRoleFunction();
@@ -1664,7 +1899,7 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                if (ApplicationRole.getActive().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setActive(false);
                                } else {
                                if (ApplicationRole.getActive().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setActive(false);
                                } else {
-                                       externalRoleDetail.setActive(Boolean.parseBoolean(ApplicationRole.getActive().toString()));
+                                       externalRoleDetail.setActive(Boolean.parseBoolean(ApplicationRole.getActive()));
                                }
                                externalRoleDetail.setName(ApplicationRole.getName());
 
                                }
                                externalRoleDetail.setName(ApplicationRole.getName());
 
@@ -1673,13 +1908,13 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                } else if (ApplicationRole.getAppId().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setAppId(app.getId());
                                } else {
                                } else if (ApplicationRole.getAppId().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setAppId(app.getId());
                                } else {
-                                       externalRoleDetail.setAppId(Long.parseLong(ApplicationRole.getAppId().toString()));
+                                       externalRoleDetail.setAppId(Long.parseLong(ApplicationRole.getAppId()));
                                }
 
                                if (ApplicationRole.getPriority().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setPriority(null);
                                } else {
                                }
 
                                if (ApplicationRole.getPriority().equals(IS_NULL_STRING)) {
                                        externalRoleDetail.setPriority(null);
                                } else {
-                                       externalRoleDetail.setPriority(Integer.parseInt(ApplicationRole.getPriority().toString()));
+                                       externalRoleDetail.setPriority(Integer.parseInt(ApplicationRole.getPriority()));
                                }
 
                                if (ApplicationRole.getAppRoleId().equals(IS_NULL_STRING) && app.getId() == 1) {
                                }
 
                                if (ApplicationRole.getAppRoleId().equals(IS_NULL_STRING) && app.getId() == 1) {
@@ -1687,17 +1922,40 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                }
 
                                if (!externalAccessPermsOfRole.isEmpty()) {
                                }
 
                                if (!externalAccessPermsOfRole.isEmpty()) {
+                                       // Adding functions to roles  
                                        for (ExternalAccessPerms externalpermission : externalAccessPermsOfRole) {
                                        for (ExternalAccessPerms externalpermission : externalAccessPermsOfRole) {
-                                               EPAppRoleFunction apRoleFunction = new EPAppRoleFunction();
-                                               apRoleFunction.setAppId(app.getId());
-                                               apRoleFunction.setRoleId(Long.parseLong(ApplicationRole.getId()));
-                                               apRoleFunction.setCode(externalpermission.getInstance());
-                                               applicationRoleFunctionList.add(apRoleFunction);
+                                               try {
+                                                       logger.debug(EELFLoggerDelegate.debugLogger,
+                                                                       "SyncApplicationRolesWithEcompDB: Adding function to the role: {}",
+                                                                       externalpermission.getInstance());
+                                                       List<CentralRoleFunction> roleFunction = null;
+                                                       roleFunction = dataAccessService.getList(
+                                                                       CentralRoleFunction.class, " where function_cd = '"
+                                                                                       + externalpermission.getInstance() + "' and " + APP_ID_EQUALS + app.getId(),
+                                                                       null, null);
+                                                       if (roleFunction.isEmpty()) {
+                                                               String funcCode = externalpermission.getType()
+                                                                               .substring(app.getNameSpace().length() + 1) + FUNCTION_PIPE
+                                                                               + externalAccessPerms.getInstance();
+                                                               roleFunction = dataAccessService.getList(CentralRoleFunction.class,
+                                                                               " where function_cd = '" + funcCode + "' and " + APP_ID_EQUALS + app.getId(), null,
+                                                                               null);
+                                                       }
+                                                       if(!roleFunction.isEmpty()){
+                                                       EPAppRoleFunction apRoleFunction = new EPAppRoleFunction();
+                                                       apRoleFunction.setAppId(app.getId());
+                                                       apRoleFunction.setRoleId(Long.parseLong(ApplicationRole.getId()));
+                                                       apRoleFunction.setCode(roleFunction.get(0).getCode());
+                                                       dataAccessService.saveDomainObject(apRoleFunction, null);
+                                                       }
+                                               } catch (Exception e) {
+                                                       logger.error(EELFLoggerDelegate.errorLogger,
+                                                                       "SyncApplicationRolesWithEcompDB: Failed to add role function", e);
+                                               }
                                        }
                                }
                                externalRoleDetailsList.add(externalRoleDetail);
                        }
                                        }
                                }
                                externalRoleDetailsList.add(externalRoleDetail);
                        }
-
                        for (ExternalRoleDetails externalRole : externalRoleDetailsList) {
                                EPRole ecompRole = convertExternalRoleDetailstoEpRole(externalRole);
                                finalRoleList.add(ecompRole);
                        for (ExternalRoleDetails externalRole : externalRoleDetailsList) {
                                EPRole ecompRole = convertExternalRoleDetailstoEpRole(externalRole);
                                finalRoleList.add(ecompRole);
@@ -1717,32 +1975,37 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                }
                        }
 
                                }
                        }
 
-                       // Check if roles exits in external Access system and make it
-                       // inactive
+                       // Check if roles exits in external Access system and make it inactive
                        final Map<String, EPRole> checkRolesInactive = new HashMap<>();
                        for (EPRole extrole : finalRoleList) {
                                checkRolesInactive.put(extrole.getName(), extrole);
                        }
                        for (EPRole role : applicationRolesList) {
                        final Map<String, EPRole> checkRolesInactive = new HashMap<>();
                        for (EPRole extrole : finalRoleList) {
                                checkRolesInactive.put(extrole.getName(), extrole);
                        }
                        for (EPRole role : applicationRolesList) {
-                               final Map<String, String> extRoleParams = new HashMap<>();
-                               List<EPRole> roleList = new ArrayList<>();
-                               extRoleParams.put("appRoleName", role.getName());
-                               if (!checkRolesInactive.containsKey(role.getName())) {
-                                       if (app.getId() == 1) {
-                                               roleList = dataAccessService.executeNamedQuery("getPortalAppRoles", extRoleParams, null);
-                                       } else {
-                                               extRoleParams.put(APP_ID, app.getId().toString());
-                                               roleList = dataAccessService.executeNamedQuery("getRoletoUpdateAAF", extRoleParams, null);
+                               try {
+                                       final Map<String, String> extRoleParams = new HashMap<>();
+                                       List<EPRole> roleList = null;
+                                       extRoleParams.put("appRoleName", role.getName());
+                                       if (!checkRolesInactive.containsKey(role.getName())) {
+                                               if (app.getId() == 1) {
+                                                       roleList = dataAccessService.executeNamedQuery("getPortalAppRoles", extRoleParams, null);
+                                               } else {
+                                                       extRoleParams.put(APP_ID, app.getId().toString());
+                                                       roleList = dataAccessService.executeNamedQuery("getRoletoUpdateAAF", extRoleParams, null);
+                                               }
+                                               EPRole updateRoleInactive = roleList.get(0);
+                                               updateRoleInactive.setActive(false);
+                                               dataAccessService.saveDomainObject(updateRoleInactive, null);
                                        }
                                        }
-                                       EPRole updateRoleInactive = roleList.get(0);
-                                       updateRoleInactive.setActive(false);
-                                       dataAccessService.saveDomainObject(updateRoleInactive, null);
+                               } catch (Exception e) {
+                                       logger.error(EELFLoggerDelegate.errorLogger,
+                                                       "syncApplicationRolesWithEcompDB: Failed to de-activate role ", e);
                                }
                        }
 
                                }
                        }
 
+                       // It checks properties in the external auth system app role description and updates role in local
                        for (EPRole roleItem : finalRoleList) {
                                final Map<String, String> roleParams = new HashMap<>();
                        for (EPRole roleItem : finalRoleList) {
                                final Map<String, String> roleParams = new HashMap<>();
-                               List<EPRole> currentList = new ArrayList<>();
+                               List<EPRole> currentList = null;
                                roleParams.put("appRoleName", roleItem.getName());
                                if (app.getId() == 1) {
                                        currentList = dataAccessService.executeNamedQuery("getPortalAppRoles", roleParams, null);
                                roleParams.put("appRoleName", roleItem.getName());
                                if (app.getId() == 1) {
                                        currentList = dataAccessService.executeNamedQuery("getPortalAppRoles", roleParams, null);
@@ -1752,65 +2015,71 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                                }
 
                                if (!currentList.isEmpty()) {
                                }
 
                                if (!currentList.isEmpty()) {
-                                       Boolean aafRoleActive;
-                                       Boolean localRoleActive;
-                                       boolean result;
-                                       aafRoleActive = Boolean.valueOf(roleItem.getActive());
-                                       localRoleActive = Boolean.valueOf(currentList.get(0).getActive());
-                                       result = aafRoleActive.equals(localRoleActive);
-                                       EPRole updateRole = currentList.get(0);
-
-                                       if (!result) {
-                                               updateRole.setActive(roleItem.getActive());
-                                               dataAccessService.saveDomainObject(updateRole, null);
-                                       }
-                                       if (roleItem.getPriority() != null
-                                                       && !currentList.get(0).getPriority().equals(roleItem.getPriority())) {
-                                               updateRole.setPriority(roleItem.getPriority());
-                                               dataAccessService.saveDomainObject(updateRole, null);
+                                       try {
+                                               Boolean aafRoleActive;
+                                               Boolean localRoleActive;
+                                               boolean result;
+                                               aafRoleActive = Boolean.valueOf(roleItem.getActive());
+                                               localRoleActive = Boolean.valueOf(currentList.get(0).getActive());
+                                               result = aafRoleActive.equals(localRoleActive);
+                                               EPRole updateRole = currentList.get(0);
+
+                                               if (!result) {
+                                                       updateRole.setActive(roleItem.getActive());
+                                                       dataAccessService.saveDomainObject(updateRole, null);
+                                               }
+                                               if (roleItem.getPriority() != null
+                                                               && !currentList.get(0).getPriority().equals(roleItem.getPriority())) {
+                                                       updateRole.setPriority(roleItem.getPriority());
+                                                       dataAccessService.saveDomainObject(updateRole, null);
+                                               }
+                                       } catch (Exception e) {
+                                               logger.error(EELFLoggerDelegate.errorLogger,
+                                                               "syncApplicationRolesWithEcompDB: Failed to update role ", e);
                                        }
                                }
                        }
 
                        EPRole roleToBeAddedInEcompDB = new EPRole();
                        for (int i = 0; i < roleListToBeAddInEcompDB.size(); i++) {
                                        }
                                }
                        }
 
                        EPRole roleToBeAddedInEcompDB = new EPRole();
                        for (int i = 0; i < roleListToBeAddInEcompDB.size(); i++) {
-                               roleToBeAddedInEcompDB = roleListToBeAddInEcompDB.get(i);
-                               if (app.getId() == 1) {
-                                       roleToBeAddedInEcompDB.setAppRoleId(null);
-                               }
-                               dataAccessService.saveDomainObject(roleToBeAddedInEcompDB, null);
-                               List<EPRole> getRoleCreatedInSync = null;
-                               if (!app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
-                                       getRoleCreatedInSync = dataAccessService.getList(EPRole.class,
-                                                       WHERE_ROLE_NAME_EQUALS + roleToBeAddedInEcompDB.getName() + "'", null, null);
-                                       EPRole epUpdateRole = getRoleCreatedInSync.get(0);
-                                       epUpdateRole.setAppRoleId(epUpdateRole.getId());
-                                       dataAccessService.saveDomainObject(epUpdateRole, null);
-                               }
-                               List<EPRole> roleList = new ArrayList<>();
-                               final Map<String, String> params = new HashMap<>();
+                               try {
+                                       roleToBeAddedInEcompDB = roleListToBeAddInEcompDB.get(i);
+                                       if (app.getId() == 1) {
+                                               roleToBeAddedInEcompDB.setAppRoleId(null);
+                                       }
+                                       dataAccessService.saveDomainObject(roleToBeAddedInEcompDB, null);
+                                       List<EPRole> getRoleCreatedInSync = null;
+                                       if (!app.getId().equals(PortalConstants.PORTAL_APP_ID)) {
+                                               getRoleCreatedInSync = dataAccessService.getList(EPRole.class,
+                                                               WHERE_ROLE_NAME_EQUALS + roleToBeAddedInEcompDB.getName() + "' and app_id = "+app.getId(), null, null);
+                                               EPRole epUpdateRole = getRoleCreatedInSync.get(0);
+                                               epUpdateRole.setAppRoleId(epUpdateRole.getId());
+                                               dataAccessService.saveDomainObject(epUpdateRole, null);
+                                       }
+                                       List<EPRole> roleList = new ArrayList<>();
+                                       final Map<String, String> params = new HashMap<>();
 
 
-                               params.put("appRoleName", roleToBeAddedInEcompDB.getName());
-                               if (app.getId() == 1) {
-                                       roleList = dataAccessService.executeNamedQuery("getPortalAppRoles", params, null);
-                               } else {
-                                       params.put(APP_ID, app.getId().toString());
-                                       roleList = dataAccessService.executeNamedQuery("getRoletoUpdateAAF", params, null);
+                                       params.put("appRoleName", roleToBeAddedInEcompDB.getName());
+                                       if (app.getId() == 1) {
+                                               roleList = dataAccessService.executeNamedQuery("getPortalAppRoles", params, null);
+                                       } else {
+                                               params.put(APP_ID, app.getId().toString());
+                                               roleList = dataAccessService.executeNamedQuery("getRoletoUpdateAAF", params, null);
+                                       }
+                                       EPRole role = roleList.get(0);
+                                       Role aaFrole = new Role();
+                                       aaFrole.setId(role.getId());
+                                       aaFrole.setActive(role.getActive());
+                                       aaFrole.setPriority(role.getPriority());
+                                       aaFrole.setName(role.getName());
+                                       updateRoleInExternalSystem(aaFrole, app);
+                               } catch (Exception e) {
+                                       logger.error(EELFLoggerDelegate.errorLogger,
+                                                       "SyncApplicationRolesWithEcompDB: Failed to add or update role in external auth system", e);
                                }
                                }
-                               EPRole role = roleList.get(0);
-                               Role aaFrole = new Role();
-                               aaFrole.setId(role.getId());
-                               aaFrole.setActive(role.getActive());
-                               aaFrole.setPriority(role.getPriority());
-                               aaFrole.setName(role.getName());
-                               updateRoleInExternalSystem(aaFrole, app);
-                       }
-                       dataAccessService.deleteDomainObjects(EPAppRoleFunction.class, APP_ID_EQUALS + app.getId(), null);
-                       for (EPAppRoleFunction rolefun : applicationRoleFunctionList) {
-                               dataAccessService.saveDomainObject(rolefun, null);
                        }
                        logger.debug(EELFLoggerDelegate.debugLogger, "syncApplicationRolesWithEcompDB: Finished");
                        }
                        logger.debug(EELFLoggerDelegate.debugLogger, "syncApplicationRolesWithEcompDB: Finished");
-               } catch(HttpClientErrorException e){
+               } catch (HttpClientErrorException e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "Failed to SyncApplicationRolesWithEcompDB", e);
                        EPLogUtil.logExternalAuthAccessAlarm(logger, e.getStatusCode());
                } catch (Exception e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "Failed to SyncApplicationRolesWithEcompDB", e);
                        EPLogUtil.logExternalAuthAccessAlarm(logger, e.getStatusCode());
                } catch (Exception e) {
@@ -1966,4 +2235,67 @@ public class ExternalAccessRolesServiceImpl implements ExternalAccessRolesServic
                }
                return appMenuFunctionsList;
        }
                }
                return appMenuFunctionsList;
        }
+
+       @SuppressWarnings({ "unchecked"})
+       @Override
+       public List<EcompUser> getAllAppUsers(String uebkey) throws Exception {
+               List<String> usersList = new ArrayList<>();
+               List<EcompUser> usersfinalList = new ArrayList<>();
+               try {
+                       EPApp app = getApp(uebkey).get(0);
+                       final Map<String, Long> appParams = new HashMap<>();
+                       appParams.put("appId", app.getId());
+                       List<EcompUserRoles> userList = (List<EcompUserRoles>) dataAccessService
+                                       .executeNamedQuery("ApplicationUserRoles", appParams, null);
+                       for (EcompUserRoles ecompUserRole : userList) {
+                               boolean found = false;
+                               Set<EcompRole> roles = null;
+                               for (EcompUser user : usersfinalList) {
+                                       if (user.getOrgUserId().equals(ecompUserRole.getOrgUserId())) {
+                                               EcompRole ecompRole = new EcompRole();
+                                               ecompRole.setId(ecompUserRole.getRoleId());
+                                               ecompRole.setName(ecompUserRole.getRoleName());
+                                               roles = user.getRoles();
+                                               roles.add(ecompRole);
+                                               user.setRoles(roles);
+                                               found = true;
+                                               break;
+                                       }
+                               }
+
+                               if (!found) {
+                                       EcompUser epUser = new EcompUser();
+                                       epUser.setOrgId(ecompUserRole.getOrgId());
+                                       epUser.setManagerId(ecompUserRole.getManagerId());
+                                       epUser.setFirstName(ecompUserRole.getFirstName());
+                                       epUser.setLastName(ecompUserRole.getLastName());
+                                       epUser.setPhone(ecompUserRole.getPhone());
+                                       epUser.setEmail(ecompUserRole.getEmail());
+                                       epUser.setOrgUserId(ecompUserRole.getOrgUserId());
+                                       epUser.setOrgCode(ecompUserRole.getOrgCode());
+                                       epUser.setOrgManagerUserId(ecompUserRole.getOrgManagerUserId());
+                                       epUser.setJobTitle(ecompUserRole.getJobTitle());
+                                       epUser.setLoginId(ecompUserRole.getLoginId());
+                                       epUser.setActive(true);
+                                       roles = new HashSet<>();
+                                       EcompRole ecompRole = new EcompRole();
+                                       ecompRole.setId(ecompUserRole.getRoleId());
+                                       ecompRole.setName(ecompUserRole.getRoleName());
+                                       roles.add(ecompRole);
+                                       epUser.setRoles(roles);
+                                       usersfinalList.add(epUser);
+                               }
+                       }
+                       ObjectMapper mapper = new ObjectMapper();
+
+                       for (EcompUser u1 : usersfinalList) {
+                               String str = mapper.writeValueAsString(u1);
+                               usersList.add(str);
+                       }
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "getAllUsers failed", e);
+                       throw e;
+               }
+               return usersfinalList;
+       }
 }
 }
index 6a71bc7..87143e8 100644 (file)
@@ -284,7 +284,7 @@ public class FunctionalMenuServiceImpl implements FunctionalMenuService {
                logQuery(sql);
                @SuppressWarnings("unchecked")
                List<FunctionalMenuRole> roleItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuRole.class, null);
                logQuery(sql);
                @SuppressWarnings("unchecked")
                List<FunctionalMenuRole> roleItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuRole.class, null);
-               if (roleItems.size() > 0) {
+               if (roleItems.size() > 0 && menuItem != null) {
                        Integer appid = roleItems.get(0).appId;
                        menuItem.appid = appid;
                        List<Integer> roles = new ArrayList<Integer>();
                        Integer appid = roleItems.get(0).appId;
                        menuItem.appid = appid;
                        List<Integer> roles = new ArrayList<Integer>();
index 5979fe8..10490e7 100644 (file)
@@ -144,7 +144,10 @@ public class PortalAdminServiceImpl implements PortalAdminService {
 
                                transaction.commit();
                                // Add role in the external central auth system
 
                                transaction.commit();
                                // Add role in the external central auth system
-                               result = addPortalAdminInExternalCentralAuth(user.getOrgUserId(), PortalConstants.PORTAL_ADMIN_ROLE);
+                               if(user != null)
+                                       result = addPortalAdminInExternalCentralAuth(user.getOrgUserId(), PortalConstants.PORTAL_ADMIN_ROLE);
+                               else
+                                       logger.error(EELFLoggerDelegate.errorLogger, "PortalAdminServiceImpl createPortalAdmin: failed to Add role in the external central auth system since User obj is null" );
                        } catch (Exception e) {
                                EcompPortalUtils.rollbackTransaction(transaction, "createPortalAdmin rollback, exception = " + e);
                                logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));
                        } catch (Exception e) {
                                EcompPortalUtils.rollbackTransaction(transaction, "createPortalAdmin rollback, exception = " + e);
                                logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/TicketEventService.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/TicketEventService.java
new file mode 100644 (file)
index 0000000..1c9a735
--- /dev/null
@@ -0,0 +1,9 @@
+package org.openecomp.portalapp.portal.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+public interface TicketEventService {
+
+       public String getNotificationHyperLink(JsonNode application, String ticket, String eventSource);
+       
+}
index d7aac63..0751c72 100644 (file)
@@ -58,6 +58,7 @@ import org.openecomp.portalapp.portal.logging.aop.EPMetricsLog;
 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
 import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
 import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
+import org.openecomp.portalapp.portal.transport.CentralRole;
 import org.openecomp.portalapp.portal.transport.EPUserAppCurrentRoles;
 import org.openecomp.portalapp.portal.transport.EcompUserAppRoles;
 import org.openecomp.portalapp.portal.transport.ExternalAccessUser;
 import org.openecomp.portalapp.portal.transport.EPUserAppCurrentRoles;
 import org.openecomp.portalapp.portal.transport.EcompUserAppRoles;
 import org.openecomp.portalapp.portal.transport.ExternalAccessUser;
@@ -537,6 +538,7 @@ public class UserRolesCommonServiceImpl  {
                                        externalAccessRolesService.deleteRoleDependencyRecords(localSession, roleId, appId);
                                        logger.debug(EELFLoggerDelegate.debugLogger, "syncAppRoles: about to delete the role: " + role.toString());
                                        localSession.delete(role);
                                        externalAccessRolesService.deleteRoleDependencyRecords(localSession, roleId, appId);
                                        logger.debug(EELFLoggerDelegate.debugLogger, "syncAppRoles: about to delete the role: " + role.toString());
                                        localSession.delete(role);
+                                       localSession.flush();
                                        logger.debug(EELFLoggerDelegate.debugLogger, "syncAppRoles: deleted the role");
                                }
                        }
                                        logger.debug(EELFLoggerDelegate.debugLogger, "syncAppRoles: deleted the role");
                                }
                        }
@@ -1292,7 +1294,7 @@ public class UserRolesCommonServiceImpl  {
                                }
                                // Check if list contains just account admin role
                                boolean checkIfAdminRoleExists = false;
                                }
                                // Check if list contains just account admin role
                                boolean checkIfAdminRoleExists = false;
-                               if (reqType.equals("DELETE")) {
+                               if (reqType.equals("DELETE") && userRoleList!=null) {
                                        checkIfAdminRoleExists = userRoleList.stream()
                                                        .anyMatch(userRole -> userRole.getRoleId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID));
                                } else {
                                        checkIfAdminRoleExists = userRoleList.stream()
                                                        .anyMatch(userRole -> userRole.getRoleId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID));
                                } else {
@@ -1307,10 +1309,10 @@ public class UserRolesCommonServiceImpl  {
                                                if (!app.getId().equals(PortalConstants.PORTAL_APP_ID) && !(checkIfAdminRoleExists
                                                                && reqType.equals("DELETE")) && roleInAppForUserList.size() > 1) {
                                                        EPUser remoteAppUser = null;
                                                if (!app.getId().equals(PortalConstants.PORTAL_APP_ID) && !(checkIfAdminRoleExists
                                                                && reqType.equals("DELETE")) && roleInAppForUserList.size() > 1) {
                                                        EPUser remoteAppUser = null;
-                                                       remoteAppUser = checkIfRemoteUserExits(userId.getOrgUserId(), app,
+                                                       remoteAppUser = checkIfRemoteUserExits(orgUserId, app,
                                                                        applicationsRestClientService);
                                                        if (remoteAppUser == null) {
                                                                        applicationsRestClientService);
                                                        if (remoteAppUser == null) {
-                                                               addRemoteUser(roleInAppForUserList, userId.getOrgUserId(), app, mapper, searchService,
+                                                               addRemoteUser(roleInAppForUserList, orgUserId, app, mapper, searchService,
                                                                                applicationsRestClientService);
                                                                reqMessage = "Saved Successfully";
                                                        }
                                                                                applicationsRestClientService);
                                                                reqMessage = "Saved Successfully";
                                                        }
@@ -1342,9 +1344,9 @@ public class UserRolesCommonServiceImpl  {
                                        // If adding just account admin role don't do remote application user call
                                        if(!((roleInAppForUserList.size() == 1 || reqType.equals("DELETE")) && checkIfAdminRoleExists)){
                                        EPUser remoteAppUser = null;
                                        // If adding just account admin role don't do remote application user call
                                        if(!((roleInAppForUserList.size() == 1 || reqType.equals("DELETE")) && checkIfAdminRoleExists)){
                                        EPUser remoteAppUser = null;
-                                               remoteAppUser = checkIfRemoteUserExits(userId.getOrgUserId(), app, applicationsRestClientService);
+                                               remoteAppUser = checkIfRemoteUserExits(orgUserId, app, applicationsRestClientService);
                                        if (remoteAppUser == null) {
                                        if (remoteAppUser == null) {
-                                               remoteAppUser = addRemoteUser(roleInAppForUserList, userId.getOrgUserId(), app, mapper, searchService, applicationsRestClientService);
+                                               remoteAppUser = addRemoteUser(roleInAppForUserList, orgUserId, app, mapper, searchService, applicationsRestClientService);
                                                reqMessage = "Saved Successfully";
                                        }
                                                if (remoteAppUser != null) {
                                                reqMessage = "Saved Successfully";
                                        }
                                                if (remoteAppUser != null) {
@@ -1396,7 +1398,7 @@ public class UserRolesCommonServiceImpl  {
                                logger.error(EELFLoggerDelegate.errorLogger, message, e);
                                result = false;
                                reqMessage = e.getMessage();
                                logger.error(EELFLoggerDelegate.errorLogger, message, e);
                                result = false;
                                reqMessage = e.getMessage();
-                                if(epRequestIdSize > 0 && !userInfo.isEmpty()){
+                                if(epRequestIdSize > 0 && userInfo!=null && !userInfo.isEmpty()){
                                 updateStatus = "F";
                                 applyChangesToAppRolesRequest(app.getId(), userId.getId(),
                                 updateStatus, epRequestId.get(0));
                                 updateStatus = "F";
                                 applyChangesToAppRolesRequest(app.getId(), userId.getId(),
                                 updateStatus, epRequestId.get(0));
@@ -1525,9 +1527,21 @@ public class UserRolesCommonServiceImpl  {
                EPApp app = appsService.getApp(appId);
                try {
                        // for ecomp portal app, no need to make a remote call
                EPApp app = appsService.getApp(appId);
                try {
                        // for ecomp portal app, no need to make a remote call
+                       List<Role> roleList = new ArrayList<>();
                        if (appId == PortalConstants.PORTAL_APP_ID) {           
                        if (appId == PortalConstants.PORTAL_APP_ID) {           
-
-                               List<Role> roleList = roleService.getAvailableRoles(userId);
+                               if(app.getCentralAuth()){
+                                       List<CentralRole> cenRoleList = externalAccessRolesService.getRolesForApp(app.getUebKey());
+                                       for(CentralRole cenRole : cenRoleList){
+                                               Role role = new Role();
+                                               role.setActive(cenRole.isActive());
+                                               role.setId(cenRole.getId());
+                                               role.setName(cenRole.getName());
+                                               role.setPriority(cenRole.getPriority());
+                                               roleList.add(role);
+                                       }
+                               }else{
+                                       roleList = roleService.getAvailableRoles(userId);
+                               }
                                List<Role> activeRoleList = new ArrayList<Role>();
                                for(Role role: roleList) {
                                        if(role.getActive()) {
                                List<Role> activeRoleList = new ArrayList<Role>();
                                for(Role role: roleList) {
                                        if(role.getActive()) {
@@ -1554,8 +1568,8 @@ public class UserRolesCommonServiceImpl  {
                        EcompRole[] appRoles = null;
                        List<EcompRole> roles = new ArrayList<>();
                        if(app.getCentralAuth()){
                        EcompRole[] appRoles = null;
                        List<EcompRole> roles = new ArrayList<>();
                        if(app.getCentralAuth()){
-                               //Sync application roles from External Access System
-                               externalAccessRolesService.syncApplicationRolesWithEcompDB(app);
+                               //Sync application functions from External Access System
+                               externalAccessRolesService.syncRoleFunctionFromExternalAccessSystem(app);
                                List<EPRole> applicationRoles = dataAccessService.getList(EPRole.class, " where app_id = "+app.getId()+ " and active_yn = 'Y'", null, null);;
                                for(EPRole role : applicationRoles){
                                        EcompRole ecompRole = new EcompRole();
                                List<EPRole> applicationRoles = dataAccessService.getList(EPRole.class, " where app_id = "+app.getId()+ " and active_yn = 'Y'", null, null);;
                                for(EPRole role : applicationRoles){
                                        EcompRole ecompRole = new EcompRole();
@@ -1625,12 +1639,14 @@ public class UserRolesCommonServiceImpl  {
                                        
                                         HashMap<Long, EcompRole> appRolesActiveMap =hashMapFromEcompRoles(appRoles);
                                                ArrayList<EcompRole> activeRoles = new ArrayList<EcompRole>();
                                        
                                         HashMap<Long, EcompRole> appRolesActiveMap =hashMapFromEcompRoles(appRoles);
                                                ArrayList<EcompRole> activeRoles = new ArrayList<EcompRole>();
-                                               for (int i = 0; i < userAppRoles.length; i++) {
-                                                       if (appRolesActiveMap.containsKey(userAppRoles[i].getId())) {
-                                                               EcompRole role = new EcompRole();
-                                                               role.setId(userAppRoles[i].getId());
-                                                               role.setName(userAppRoles[i].getName());
-                                                               activeRoles.add(role);
+                                               if(userAppRoles != null){
+                                                       for (int i = 0; i < userAppRoles.length; i++) {
+                                                               if (appRolesActiveMap.containsKey(userAppRoles[i].getId())) {
+                                                                       EcompRole role = new EcompRole();
+                                                                       role.setId(userAppRoles[i].getId());
+                                                                       role.setName(userAppRoles[i].getName());
+                                                                       activeRoles.add(role);
+                                                               }
                                                        }
                                                }
                                                EcompRole[]     userAppRolesActive = activeRoles.toArray(new EcompRole[activeRoles.size()]);
                                                        }
                                                }
                                                EcompRole[]     userAppRolesActive = activeRoles.toArray(new EcompRole[activeRoles.size()]);
index 059999a..b6e6c24 100644 (file)
@@ -27,7 +27,7 @@ public class Analytics {
        private String action;
        private String page;
        private String function;
        private String action;
        private String page;
        private String function;
-       private String userId;
+       private String userid;
        private String type;
        
        public String getType() {
        private String type;
        
        public String getType() {
@@ -54,11 +54,11 @@ public class Analytics {
        public void setFunction(String function) {
                this.function = function;
        }
        public void setFunction(String function) {
                this.function = function;
        }
-       public String getUserId() {
-               return userId;
+       public String getUserid() {
+               return userid;
        }
        }
-       public void setUserId(String userId) {
-               this.userId = userId;
+       public void setUserid(String userId) {
+               this.userid = userId;
        }
        
        
        }
        
        
index 9790742..5a03bf5 100644 (file)
@@ -1,5 +1,6 @@
 package org.openecomp.portalapp.portal.transport;
 
 package org.openecomp.portalapp.portal.transport;
 
+import java.util.Arrays;
 import java.util.Date;
 
 public class CentralApp {
 import java.util.Date;
 
 public class CentralApp {
@@ -205,6 +206,166 @@ public class CentralApp {
        public void setUebTopicName(String uebTopicName) {
                this.uebTopicName = uebTopicName;
        }
        public void setUebTopicName(String uebTopicName) {
                this.uebTopicName = uebTopicName;
        }
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((alternateUrl == null) ? 0 : alternateUrl.hashCode());
+               result = prime * result + ((appPassword == null) ? 0 : appPassword.hashCode());
+               result = prime * result + ((created == null) ? 0 : created.hashCode());
+               result = prime * result + ((createdId == null) ? 0 : createdId.hashCode());
+               result = prime * result + ((description == null) ? 0 : description.hashCode());
+               result = prime * result + ((enabled == null) ? 0 : enabled.hashCode());
+               result = prime * result + ((id == null) ? 0 : id.hashCode());
+               result = prime * result + ((imageUrl == null) ? 0 : imageUrl.hashCode());
+               result = prime * result + ((mlAppAdminId == null) ? 0 : mlAppAdminId.hashCode());
+               result = prime * result + ((mlAppName == null) ? 0 : mlAppName.hashCode());
+               result = prime * result + ((modified == null) ? 0 : modified.hashCode());
+               result = prime * result + ((modifiedId == null) ? 0 : modifiedId.hashCode());
+               result = prime * result + ((motsId == null) ? 0 : motsId.hashCode());
+               result = prime * result + ((name == null) ? 0 : name.hashCode());
+               result = prime * result + ((notes == null) ? 0 : notes.hashCode());
+               result = prime * result + ((open == null) ? 0 : open.hashCode());
+               result = prime * result + ((restEndpoint == null) ? 0 : restEndpoint.hashCode());
+               result = prime * result + ((rowNum == null) ? 0 : rowNum.hashCode());
+               result = prime * result + Arrays.hashCode(thumbnail);
+               result = prime * result + ((uebKey == null) ? 0 : uebKey.hashCode());
+               result = prime * result + ((uebSecret == null) ? 0 : uebSecret.hashCode());
+               result = prime * result + ((uebTopicName == null) ? 0 : uebTopicName.hashCode());
+               result = prime * result + ((url == null) ? 0 : url.hashCode());
+               result = prime * result + ((username == null) ? 0 : username.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               CentralApp other = (CentralApp) obj;
+               if (alternateUrl == null) {
+                       if (other.alternateUrl != null)
+                               return false;
+               } else if (!alternateUrl.equals(other.alternateUrl))
+                       return false;
+               if (appPassword == null) {
+                       if (other.appPassword != null)
+                               return false;
+               } else if (!appPassword.equals(other.appPassword))
+                       return false;
+               if (created == null) {
+                       if (other.created != null)
+                               return false;
+               } else if (!created.equals(other.created))
+                       return false;
+               if (createdId == null) {
+                       if (other.createdId != null)
+                               return false;
+               } else if (!createdId.equals(other.createdId))
+                       return false;
+               if (description == null) {
+                       if (other.description != null)
+                               return false;
+               } else if (!description.equals(other.description))
+                       return false;
+               if (enabled == null) {
+                       if (other.enabled != null)
+                               return false;
+               } else if (!enabled.equals(other.enabled))
+                       return false;
+               if (id == null) {
+                       if (other.id != null)
+                               return false;
+               } else if (!id.equals(other.id))
+                       return false;
+               if (imageUrl == null) {
+                       if (other.imageUrl != null)
+                               return false;
+               } else if (!imageUrl.equals(other.imageUrl))
+                       return false;
+               if (mlAppAdminId == null) {
+                       if (other.mlAppAdminId != null)
+                               return false;
+               } else if (!mlAppAdminId.equals(other.mlAppAdminId))
+                       return false;
+               if (mlAppName == null) {
+                       if (other.mlAppName != null)
+                               return false;
+               } else if (!mlAppName.equals(other.mlAppName))
+                       return false;
+               if (modified == null) {
+                       if (other.modified != null)
+                               return false;
+               } else if (!modified.equals(other.modified))
+                       return false;
+               if (modifiedId == null) {
+                       if (other.modifiedId != null)
+                               return false;
+               } else if (!modifiedId.equals(other.modifiedId))
+                       return false;
+               if (motsId == null) {
+                       if (other.motsId != null)
+                               return false;
+               } else if (!motsId.equals(other.motsId))
+                       return false;
+               if (name == null) {
+                       if (other.name != null)
+                               return false;
+               } else if (!name.equals(other.name))
+                       return false;
+               if (notes == null) {
+                       if (other.notes != null)
+                               return false;
+               } else if (!notes.equals(other.notes))
+                       return false;
+               if (open == null) {
+                       if (other.open != null)
+                               return false;
+               } else if (!open.equals(other.open))
+                       return false;
+               if (restEndpoint == null) {
+                       if (other.restEndpoint != null)
+                               return false;
+               } else if (!restEndpoint.equals(other.restEndpoint))
+                       return false;
+               if (rowNum == null) {
+                       if (other.rowNum != null)
+                               return false;
+               } else if (!rowNum.equals(other.rowNum))
+                       return false;
+               if (!Arrays.equals(thumbnail, other.thumbnail))
+                       return false;
+               if (uebKey == null) {
+                       if (other.uebKey != null)
+                               return false;
+               } else if (!uebKey.equals(other.uebKey))
+                       return false;
+               if (uebSecret == null) {
+                       if (other.uebSecret != null)
+                               return false;
+               } else if (!uebSecret.equals(other.uebSecret))
+                       return false;
+               if (uebTopicName == null) {
+                       if (other.uebTopicName != null)
+                               return false;
+               } else if (!uebTopicName.equals(other.uebTopicName))
+                       return false;
+               if (url == null) {
+                       if (other.url != null)
+                               return false;
+               } else if (!url.equals(other.url))
+                       return false;
+               if (username == null) {
+                       if (other.username != null)
+                               return false;
+               } else if (!username.equals(other.username))
+                       return false;
+               return true;
+       }
        
        
 }
        
        
 }
index a3c3c9d..de576ad 100644 (file)
@@ -156,4 +156,92 @@ public class CentralRole implements Comparable{
                return (c1 == null || c2 == null) ? 1 : c1.compareTo(c2);
            }
 
                return (c1 == null || c2 == null) ? 1 : c1.compareTo(c2);
            }
 
+               @Override
+               public int hashCode() {
+                       final int prime = 31;
+                       int result = 1;
+                       result = prime * result + (active ? 1231 : 1237);
+                       result = prime * result + ((childRoles == null) ? 0 : childRoles.hashCode());
+                       result = prime * result + ((created == null) ? 0 : created.hashCode());
+                       result = prime * result + ((createdId == null) ? 0 : createdId.hashCode());
+                       result = prime * result + ((id == null) ? 0 : id.hashCode());
+                       result = prime * result + ((modified == null) ? 0 : modified.hashCode());
+                       result = prime * result + ((modifiedId == null) ? 0 : modifiedId.hashCode());
+                       result = prime * result + ((name == null) ? 0 : name.hashCode());
+                       result = prime * result + ((parentRoles == null) ? 0 : parentRoles.hashCode());
+                       result = prime * result + ((priority == null) ? 0 : priority.hashCode());
+                       result = prime * result + ((roleFunctions == null) ? 0 : roleFunctions.hashCode());
+                       result = prime * result + ((rowNum == null) ? 0 : rowNum.hashCode());
+                       return result;
+               }
+
+               @Override
+               public boolean equals(Object obj) {
+                       if (this == obj)
+                               return true;
+                       if (obj == null)
+                               return false;
+                       if (getClass() != obj.getClass())
+                               return false;
+                       CentralRole other = (CentralRole) obj;
+                       if (active != other.active)
+                               return false;
+                       if (childRoles == null) {
+                               if (other.childRoles != null)
+                                       return false;
+                       } else if (!childRoles.equals(other.childRoles))
+                               return false;
+                       if (created == null) {
+                               if (other.created != null)
+                                       return false;
+                       } else if (!created.equals(other.created))
+                               return false;
+                       if (createdId == null) {
+                               if (other.createdId != null)
+                                       return false;
+                       } else if (!createdId.equals(other.createdId))
+                               return false;
+                       if (id == null) {
+                               if (other.id != null)
+                                       return false;
+                       } else if (!id.equals(other.id))
+                               return false;
+                       if (modified == null) {
+                               if (other.modified != null)
+                                       return false;
+                       } else if (!modified.equals(other.modified))
+                               return false;
+                       if (modifiedId == null) {
+                               if (other.modifiedId != null)
+                                       return false;
+                       } else if (!modifiedId.equals(other.modifiedId))
+                               return false;
+                       if (name == null) {
+                               if (other.name != null)
+                                       return false;
+                       } else if (!name.equals(other.name))
+                               return false;
+                       if (parentRoles == null) {
+                               if (other.parentRoles != null)
+                                       return false;
+                       } else if (!parentRoles.equals(other.parentRoles))
+                               return false;
+                       if (priority == null) {
+                               if (other.priority != null)
+                                       return false;
+                       } else if (!priority.equals(other.priority))
+                               return false;
+                       if (roleFunctions == null) {
+                               if (other.roleFunctions != null)
+                                       return false;
+                       } else if (!roleFunctions.equals(other.roleFunctions))
+                               return false;
+                       if (rowNum == null) {
+                               if (other.rowNum != null)
+                                       return false;
+                       } else if (!rowNum.equals(other.rowNum))
+                               return false;
+                       return true;
+               }
+
 }
 }
index f817482..b44e25d 100644 (file)
@@ -132,6 +132,334 @@ public class CentralUser {
                this.userApps = userApps;
                this.pseudoRoles = pseudoRoles;
        }
                this.userApps = userApps;
                this.pseudoRoles = pseudoRoles;
        }
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + (active ? 1231 : 1237);
+               result = prime * result + ((address1 == null) ? 0 : address1.hashCode());
+               result = prime * result + ((address2 == null) ? 0 : address2.hashCode());
+               result = prime * result + ((addressId == null) ? 0 : addressId.hashCode());
+               result = prime * result + ((alertMethodCd == null) ? 0 : alertMethodCd.hashCode());
+               result = prime * result + ((businessCountryCode == null) ? 0 : businessCountryCode.hashCode());
+               result = prime * result + ((businessCountryName == null) ? 0 : businessCountryName.hashCode());
+               result = prime * result + ((businessUnit == null) ? 0 : businessUnit.hashCode());
+               result = prime * result + ((businessUnitName == null) ? 0 : businessUnitName.hashCode());
+               result = prime * result + ((cellular == null) ? 0 : cellular.hashCode());
+               result = prime * result + ((chatId == null) ? 0 : chatId.hashCode());
+               result = prime * result + ((city == null) ? 0 : city.hashCode());
+               result = prime * result + ((commandChain == null) ? 0 : commandChain.hashCode());
+               result = prime * result + ((company == null) ? 0 : company.hashCode());
+               result = prime * result + ((companyCode == null) ? 0 : companyCode.hashCode());
+               result = prime * result + ((costCenter == null) ? 0 : costCenter.hashCode());
+               result = prime * result + ((country == null) ? 0 : country.hashCode());
+               result = prime * result + ((created == null) ? 0 : created.hashCode());
+               result = prime * result + ((createdId == null) ? 0 : createdId.hashCode());
+               result = prime * result + ((department == null) ? 0 : department.hashCode());
+               result = prime * result + ((departmentName == null) ? 0 : departmentName.hashCode());
+               result = prime * result + ((email == null) ? 0 : email.hashCode());
+               result = prime * result + ((fax == null) ? 0 : fax.hashCode());
+               result = prime * result + ((financialLocCode == null) ? 0 : financialLocCode.hashCode());
+               result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
+               result = prime * result + ((hrid == null) ? 0 : hrid.hashCode());
+               result = prime * result + ((id == null) ? 0 : id.hashCode());
+               result = prime * result + (internal ? 1231 : 1237);
+               result = prime * result + ((jobTitle == null) ? 0 : jobTitle.hashCode());
+               result = prime * result + ((lastLoginDate == null) ? 0 : lastLoginDate.hashCode());
+               result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
+               result = prime * result + ((locationClli == null) ? 0 : locationClli.hashCode());
+               result = prime * result + ((loginId == null) ? 0 : loginId.hashCode());
+               result = prime * result + ((loginPwd == null) ? 0 : loginPwd.hashCode());
+               result = prime * result + ((managerId == null) ? 0 : managerId.hashCode());
+               result = prime * result + ((middleInitial == null) ? 0 : middleInitial.hashCode());
+               result = prime * result + ((modified == null) ? 0 : modified.hashCode());
+               result = prime * result + ((modifiedId == null) ? 0 : modifiedId.hashCode());
+               result = prime * result + (online ? 1231 : 1237);
+               result = prime * result + ((orgCode == null) ? 0 : orgCode.hashCode());
+               result = prime * result + ((orgId == null) ? 0 : orgId.hashCode());
+               result = prime * result + ((orgManagerUserId == null) ? 0 : orgManagerUserId.hashCode());
+               result = prime * result + ((orgUserId == null) ? 0 : orgUserId.hashCode());
+               result = prime * result + ((phone == null) ? 0 : phone.hashCode());
+               result = prime * result + ((pseudoRoles == null) ? 0 : pseudoRoles.hashCode());
+               result = prime * result + ((rowNum == null) ? 0 : rowNum.hashCode());
+               result = prime * result + ((selectedProfileId == null) ? 0 : selectedProfileId.hashCode());
+               result = prime * result + ((siloStatus == null) ? 0 : siloStatus.hashCode());
+               result = prime * result + ((state == null) ? 0 : state.hashCode());
+               result = prime * result + ((timeZoneId == null) ? 0 : timeZoneId.hashCode());
+               result = prime * result + ((userApps == null) ? 0 : userApps.hashCode());
+               result = prime * result + ((zipCode == null) ? 0 : zipCode.hashCode());
+               result = prime * result + ((zipCodeSuffix == null) ? 0 : zipCodeSuffix.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               CentralUser other = (CentralUser) obj;
+               if (active != other.active)
+                       return false;
+               if (address1 == null) {
+                       if (other.address1 != null)
+                               return false;
+               } else if (!address1.equals(other.address1))
+                       return false;
+               if (address2 == null) {
+                       if (other.address2 != null)
+                               return false;
+               } else if (!address2.equals(other.address2))
+                       return false;
+               if (addressId == null) {
+                       if (other.addressId != null)
+                               return false;
+               } else if (!addressId.equals(other.addressId))
+                       return false;
+               if (alertMethodCd == null) {
+                       if (other.alertMethodCd != null)
+                               return false;
+               } else if (!alertMethodCd.equals(other.alertMethodCd))
+                       return false;
+               if (businessCountryCode == null) {
+                       if (other.businessCountryCode != null)
+                               return false;
+               } else if (!businessCountryCode.equals(other.businessCountryCode))
+                       return false;
+               if (businessCountryName == null) {
+                       if (other.businessCountryName != null)
+                               return false;
+               } else if (!businessCountryName.equals(other.businessCountryName))
+                       return false;
+               if (businessUnit == null) {
+                       if (other.businessUnit != null)
+                               return false;
+               } else if (!businessUnit.equals(other.businessUnit))
+                       return false;
+               if (businessUnitName == null) {
+                       if (other.businessUnitName != null)
+                               return false;
+               } else if (!businessUnitName.equals(other.businessUnitName))
+                       return false;
+               if (cellular == null) {
+                       if (other.cellular != null)
+                               return false;
+               } else if (!cellular.equals(other.cellular))
+                       return false;
+               if (chatId == null) {
+                       if (other.chatId != null)
+                               return false;
+               } else if (!chatId.equals(other.chatId))
+                       return false;
+               if (city == null) {
+                       if (other.city != null)
+                               return false;
+               } else if (!city.equals(other.city))
+                       return false;
+               if (commandChain == null) {
+                       if (other.commandChain != null)
+                               return false;
+               } else if (!commandChain.equals(other.commandChain))
+                       return false;
+               if (company == null) {
+                       if (other.company != null)
+                               return false;
+               } else if (!company.equals(other.company))
+                       return false;
+               if (companyCode == null) {
+                       if (other.companyCode != null)
+                               return false;
+               } else if (!companyCode.equals(other.companyCode))
+                       return false;
+               if (costCenter == null) {
+                       if (other.costCenter != null)
+                               return false;
+               } else if (!costCenter.equals(other.costCenter))
+                       return false;
+               if (country == null) {
+                       if (other.country != null)
+                               return false;
+               } else if (!country.equals(other.country))
+                       return false;
+               if (created == null) {
+                       if (other.created != null)
+                               return false;
+               } else if (!created.equals(other.created))
+                       return false;
+               if (createdId == null) {
+                       if (other.createdId != null)
+                               return false;
+               } else if (!createdId.equals(other.createdId))
+                       return false;
+               if (department == null) {
+                       if (other.department != null)
+                               return false;
+               } else if (!department.equals(other.department))
+                       return false;
+               if (departmentName == null) {
+                       if (other.departmentName != null)
+                               return false;
+               } else if (!departmentName.equals(other.departmentName))
+                       return false;
+               if (email == null) {
+                       if (other.email != null)
+                               return false;
+               } else if (!email.equals(other.email))
+                       return false;
+               if (fax == null) {
+                       if (other.fax != null)
+                               return false;
+               } else if (!fax.equals(other.fax))
+                       return false;
+               if (financialLocCode == null) {
+                       if (other.financialLocCode != null)
+                               return false;
+               } else if (!financialLocCode.equals(other.financialLocCode))
+                       return false;
+               if (firstName == null) {
+                       if (other.firstName != null)
+                               return false;
+               } else if (!firstName.equals(other.firstName))
+                       return false;
+               if (hrid == null) {
+                       if (other.hrid != null)
+                               return false;
+               } else if (!hrid.equals(other.hrid))
+                       return false;
+               if (id == null) {
+                       if (other.id != null)
+                               return false;
+               } else if (!id.equals(other.id))
+                       return false;
+               if (internal != other.internal)
+                       return false;
+               if (jobTitle == null) {
+                       if (other.jobTitle != null)
+                               return false;
+               } else if (!jobTitle.equals(other.jobTitle))
+                       return false;
+               if (lastLoginDate == null) {
+                       if (other.lastLoginDate != null)
+                               return false;
+               } else if (!lastLoginDate.equals(other.lastLoginDate))
+                       return false;
+               if (lastName == null) {
+                       if (other.lastName != null)
+                               return false;
+               } else if (!lastName.equals(other.lastName))
+                       return false;
+               if (locationClli == null) {
+                       if (other.locationClli != null)
+                               return false;
+               } else if (!locationClli.equals(other.locationClli))
+                       return false;
+               if (loginId == null) {
+                       if (other.loginId != null)
+                               return false;
+               } else if (!loginId.equals(other.loginId))
+                       return false;
+               if (loginPwd == null) {
+                       if (other.loginPwd != null)
+                               return false;
+               } else if (!loginPwd.equals(other.loginPwd))
+                       return false;
+               if (managerId == null) {
+                       if (other.managerId != null)
+                               return false;
+               } else if (!managerId.equals(other.managerId))
+                       return false;
+               if (middleInitial == null) {
+                       if (other.middleInitial != null)
+                               return false;
+               } else if (!middleInitial.equals(other.middleInitial))
+                       return false;
+               if (modified == null) {
+                       if (other.modified != null)
+                               return false;
+               } else if (!modified.equals(other.modified))
+                       return false;
+               if (modifiedId == null) {
+                       if (other.modifiedId != null)
+                               return false;
+               } else if (!modifiedId.equals(other.modifiedId))
+                       return false;
+               if (online != other.online)
+                       return false;
+               if (orgCode == null) {
+                       if (other.orgCode != null)
+                               return false;
+               } else if (!orgCode.equals(other.orgCode))
+                       return false;
+               if (orgId == null) {
+                       if (other.orgId != null)
+                               return false;
+               } else if (!orgId.equals(other.orgId))
+                       return false;
+               if (orgManagerUserId == null) {
+                       if (other.orgManagerUserId != null)
+                               return false;
+               } else if (!orgManagerUserId.equals(other.orgManagerUserId))
+                       return false;
+               if (orgUserId == null) {
+                       if (other.orgUserId != null)
+                               return false;
+               } else if (!orgUserId.equals(other.orgUserId))
+                       return false;
+               if (phone == null) {
+                       if (other.phone != null)
+                               return false;
+               } else if (!phone.equals(other.phone))
+                       return false;
+               if (pseudoRoles == null) {
+                       if (other.pseudoRoles != null)
+                               return false;
+               } else if (!pseudoRoles.equals(other.pseudoRoles))
+                       return false;
+               if (rowNum == null) {
+                       if (other.rowNum != null)
+                               return false;
+               } else if (!rowNum.equals(other.rowNum))
+                       return false;
+               if (selectedProfileId == null) {
+                       if (other.selectedProfileId != null)
+                               return false;
+               } else if (!selectedProfileId.equals(other.selectedProfileId))
+                       return false;
+               if (siloStatus == null) {
+                       if (other.siloStatus != null)
+                               return false;
+               } else if (!siloStatus.equals(other.siloStatus))
+                       return false;
+               if (state == null) {
+                       if (other.state != null)
+                               return false;
+               } else if (!state.equals(other.state))
+                       return false;
+               if (timeZoneId == null) {
+                       if (other.timeZoneId != null)
+                               return false;
+               } else if (!timeZoneId.equals(other.timeZoneId))
+                       return false;
+               if (userApps == null) {
+                       if (other.userApps != null)
+                               return false;
+               } else if (!userApps.equals(other.userApps))
+                       return false;
+               if (zipCode == null) {
+                       if (other.zipCode != null)
+                               return false;
+               } else if (!zipCode.equals(other.zipCode))
+                       return false;
+               if (zipCodeSuffix == null) {
+                       if (other.zipCodeSuffix != null)
+                               return false;
+               } else if (!zipCodeSuffix.equals(other.zipCodeSuffix))
+                       return false;
+               return true;
+       }
        
        
 
        
        
 
index ceb5d46..5be1fb7 100644 (file)
@@ -31,7 +31,6 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 
 /**
  * This is to handle portal admins
 
 /**
  * This is to handle portal admins
- * @author aw3218
  */
 @Entity 
 @Table(name="fn_common_widget_data")
  */
 @Entity 
 @Table(name="fn_common_widget_data")
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserRoles.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/transport/EcompUserRoles.java
new file mode 100644 (file)
index 0000000..50c14ca
--- /dev/null
@@ -0,0 +1,172 @@
+package org.openecomp.portalapp.portal.transport;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class EcompUserRoles implements Serializable{
+       
+       private static final long serialVersionUID = 1L;
+       
+       @Id
+       @Column(name = "org_id")
+       private Long orgId;
+       @Id
+       @Column(name = "manager_id")
+       private String managerId;
+       @Id
+       @Column(name = "first_name")
+       private String firstName;
+       @Id
+       @Column(name = "middle_name")
+       private String middleInitial;
+       @Id
+       @Column(name = "last_name")
+       private String lastName;
+       @Id
+       @Column(name = "phone")
+       private String phone;
+       @Id
+       @Column(name = "email")
+       private String email;
+       @Id
+       @Column(name = "hrid")
+       private String hrid;
+       @Id
+       @Column(name = "org_user_id")
+       private String orgUserId;
+       @Id
+       @Column(name = "org_code")
+       private String orgCode;
+       @Id
+       @Column(name = "org_manager_userid")
+       private String orgManagerUserId;
+       @Id
+       @Column(name = "job_title")
+       private String jobTitle;
+       @Id
+       @Column(name = "login_id")
+       private String loginId;
+
+       @Id
+       @Column(name = "app_role_id")
+       private Long roleId;
+       @Id
+       @Column(name = "role_name")
+       private String roleName;
+       @Id
+       @Column(name = "active_yn")
+       private boolean active;
+       public Long getOrgId() {
+               return orgId;
+       }
+       public void setOrgId(Long orgId) {
+               this.orgId = orgId;
+       }
+       public String getManagerId() {
+               return managerId;
+       }
+       public void setManagerId(String managerId) {
+               this.managerId = managerId;
+       }
+       public String getFirstName() {
+               return firstName;
+       }
+       public void setFirstName(String firstName) {
+               this.firstName = firstName;
+       }
+       public String getMiddleInitial() {
+               return middleInitial;
+       }
+       public void setMiddleInitial(String middleInitial) {
+               this.middleInitial = middleInitial;
+       }
+       public String getLastName() {
+               return lastName;
+       }
+       public void setLastName(String lastName) {
+               this.lastName = lastName;
+       }
+       public String getPhone() {
+               return phone;
+       }
+       public void setPhone(String phone) {
+               this.phone = phone;
+       }
+       public String getEmail() {
+               return email;
+       }
+       public void setEmail(String email) {
+               this.email = email;
+       }
+       public String getHrid() {
+               return hrid;
+       }
+       public void setHrid(String hrid) {
+               this.hrid = hrid;
+       }
+       public String getOrgUserId() {
+               return orgUserId;
+       }
+       public void setOrgUserId(String orgUserId) {
+               this.orgUserId = orgUserId;
+       }
+       public String getOrgCode() {
+               return orgCode;
+       }
+       public void setOrgCode(String orgCode) {
+               this.orgCode = orgCode;
+       }
+       public String getOrgManagerUserId() {
+               return orgManagerUserId;
+       }
+       public void setOrgManagerUserId(String orgManagerUserId) {
+               this.orgManagerUserId = orgManagerUserId;
+       }
+       public String getJobTitle() {
+               return jobTitle;
+       }
+       public void setJobTitle(String jobTitle) {
+               this.jobTitle = jobTitle;
+       }
+       public String getLoginId() {
+               return loginId;
+       }
+       public void setLoginId(String loginId) {
+               this.loginId = loginId;
+       }
+       
+       public Long getRoleId() {
+               return roleId;
+       }
+       public void setRoleId(Long roleId) {
+               this.roleId = roleId;
+       }
+       public String getRoleName() {
+               return roleName;
+       }
+       public void setRoleName(String roleName) {
+               this.roleName = roleName;
+       }
+       
+       public boolean isActive() {
+               return active;
+       }
+       public void setActive(boolean active) {
+               this.active = active;
+       }
+       @Override
+       public String toString() {
+               return "EcompUserRoles [orgId=" + orgId + ", managerId=" + managerId + ", firstName=" + firstName
+                               + ", middleInitial=" + middleInitial + ", lastName=" + lastName + ", phone=" + phone + ", email="
+                               + email + ", hrid=" + hrid + ", orgUserId=" + orgUserId + ", orgCode=" + orgCode + ", orgManagerUserId="
+                               + orgManagerUserId + ", jobTitle=" + jobTitle + ", loginId=" + loginId + ", active=" + active
+                               + ", roleId=" + roleId + ", roleName=" + roleName + "]";
+       }
+       
+
+}
index 60f9f63..27d0dd0 100644 (file)
@@ -91,6 +91,53 @@ public class ExternalAccessPerms implements Serializable, Comparable{
 
        return (c1 == null || c2 == null) ? 1 : c1.compareTo(c2);
        }
 
        return (c1 == null || c2 == null) ? 1 : c1.compareTo(c2);
        }
+
+
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((action == null) ? 0 : action.hashCode());
+               result = prime * result + ((description == null) ? 0 : description.hashCode());
+               result = prime * result + ((instance == null) ? 0 : instance.hashCode());
+               result = prime * result + ((type == null) ? 0 : type.hashCode());
+               return result;
+       }
+
+
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               ExternalAccessPerms other = (ExternalAccessPerms) obj;
+               if (action == null) {
+                       if (other.action != null)
+                               return false;
+               } else if (!action.equals(other.action))
+                       return false;
+               if (description == null) {
+                       if (other.description != null)
+                               return false;
+               } else if (!description.equals(other.description))
+                       return false;
+               if (instance == null) {
+                       if (other.instance != null)
+                               return false;
+               } else if (!instance.equals(other.instance))
+                       return false;
+               if (type == null) {
+                       if (other.type != null)
+                               return false;
+               } else if (!type.equals(other.type))
+                       return false;
+               return true;
+       }
        
        
 }
        
        
 }
index e5d89e2..1a8aeb6 100644 (file)
@@ -31,6 +31,37 @@ public class ExternalAccessUserRoleDetail {
        public void setDescription(ExternalRoleDescription description) {
                this.description = description;
        }
        public void setDescription(ExternalRoleDescription description) {
                this.description = description;
        }
+
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((description == null) ? 0 : description.hashCode());
+               result = prime * result + ((name == null) ? 0 : name.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               ExternalAccessUserRoleDetail other = (ExternalAccessUserRoleDetail) obj;
+               if (description == null) {
+                       if (other.description != null)
+                               return false;
+               } else if (!description.equals(other.description))
+                       return false;
+               if (name == null) {
+                       if (other.name != null)
+                               return false;
+               } else if (!name.equals(other.name))
+                       return false;
+               return true;
+       }
        
        
 }
        
        
 }
index d6eba63..824dc5b 100644 (file)
@@ -45,6 +45,59 @@ public class ExternalRoleDescription {
        public void setAppRoleId(String appRoleId) {
                this.appRoleId = appRoleId;
        }
        public void setAppRoleId(String appRoleId) {
                this.appRoleId = appRoleId;
        }
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((active == null) ? 0 : active.hashCode());
+               result = prime * result + ((appId == null) ? 0 : appId.hashCode());
+               result = prime * result + ((appRoleId == null) ? 0 : appRoleId.hashCode());
+               result = prime * result + ((id == null) ? 0 : id.hashCode());
+               result = prime * result + ((name == null) ? 0 : name.hashCode());
+               result = prime * result + ((priority == null) ? 0 : priority.hashCode());
+               return result;
+       }
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               ExternalRoleDescription other = (ExternalRoleDescription) obj;
+               if (active == null) {
+                       if (other.active != null)
+                               return false;
+               } else if (!active.equals(other.active))
+                       return false;
+               if (appId == null) {
+                       if (other.appId != null)
+                               return false;
+               } else if (!appId.equals(other.appId))
+                       return false;
+               if (appRoleId == null) {
+                       if (other.appRoleId != null)
+                               return false;
+               } else if (!appRoleId.equals(other.appRoleId))
+                       return false;
+               if (id == null) {
+                       if (other.id != null)
+                               return false;
+               } else if (!id.equals(other.id))
+                       return false;
+               if (name == null) {
+                       if (other.name != null)
+                               return false;
+               } else if (!name.equals(other.name))
+                       return false;
+               if (priority == null) {
+                       if (other.priority != null)
+                               return false;
+               } else if (!priority.equals(other.priority))
+                       return false;
+               return true;
+       }
     
     
 }
     
     
 }
index 8a2d623..74dbd1a 100644 (file)
@@ -41,4 +41,33 @@ public class RemoteRole {
        public String toString() {
                return "RemoteRole [id=" + id + ", name=" + name + "]";
        }
        public String toString() {
                return "RemoteRole [id=" + id + ", name=" + name + "]";
        }
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((id == null) ? 0 : id.hashCode());
+               result = prime * result + ((name == null) ? 0 : name.hashCode());
+               return result;
+       }
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               RemoteRole other = (RemoteRole) obj;
+               if (id == null) {
+                       if (other.id != null)
+                               return false;
+               } else if (!id.equals(other.id))
+                       return false;
+               if (name == null) {
+                       if (other.name != null)
+                               return false;
+               } else if (!name.equals(other.name))
+                       return false;
+               return true;
+       }
 }
 }
index ba411e6..bcd6595 100644 (file)
@@ -36,4 +36,47 @@ public class UserWithNameSurnameTitle {
                this.jobTitle = jobTitle;
        }
 
                this.jobTitle = jobTitle;
        }
 
+       @Override
+       public int hashCode() {
+               final int prime = 31;
+               int result = 1;
+               result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
+               result = prime * result + ((jobTitle == null) ? 0 : jobTitle.hashCode());
+               result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
+               result = prime * result + ((orgUserId == null) ? 0 : orgUserId.hashCode());
+               return result;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (this == obj)
+                       return true;
+               if (obj == null)
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               UserWithNameSurnameTitle other = (UserWithNameSurnameTitle) obj;
+               if (firstName == null) {
+                       if (other.firstName != null)
+                               return false;
+               } else if (!firstName.equals(other.firstName))
+                       return false;
+               if (jobTitle == null) {
+                       if (other.jobTitle != null)
+                               return false;
+               } else if (!jobTitle.equals(other.jobTitle))
+                       return false;
+               if (lastName == null) {
+                       if (other.lastName != null)
+                               return false;
+               } else if (!lastName.equals(other.lastName))
+                       return false;
+               if (orgUserId == null) {
+                       if (other.orgUserId != null)
+                               return false;
+               } else if (!orgUserId.equals(other.orgUserId))
+                       return false;
+               return true;
+       }
+
 }
 }
index a80517d..55137cb 100644 (file)
@@ -134,9 +134,8 @@ public class EPUebHelper {
                        refreshPublisherList();
                    }
                };
                        refreshPublisherList();
                    }
                };
-               if (thread != null) {
-                   thread.start();
-               }
+               thread.start();
+               
        }
 
        @EPMetricsLog
        }
 
        @EPMetricsLog
index 11c0890..2bdd0ca 100644 (file)
@@ -54,56 +54,57 @@ public class SessionCommunication {
                String appResponse = "";
                String appName = "Unknwon";
                int responseCode = 0;
                String appResponse = "";
                String appName = "Unknwon";
                int responseCode = 0;
-               
-               try {
-                       if (app != null && app.name != null && app.name != "") {
-                               appName = app.name;
-                       }
-                       String url = app.restUrl + "/sessionTimeOuts";
-                       String encriptedPwdDB = app.appPassword;
-                       String appUserName = app.username;
-
-                       setLocalMDCContext(app, "/sessionTimeOuts", url);
-
-                       URL obj = new URL(url);
-
-                       HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-                       // optional default is GET
-                       con.setRequestMethod("GET");
-                       con.setConnectTimeout(3000);
-                       con.setReadTimeout(8000);
-                       // add request header
-                       con.setRequestProperty("username", appUserName);
-                       con.setRequestProperty("password", encriptedPwdDB);
-
-                       // con.set
-                       responseCode = con.getResponseCode();
-                       logger.debug(EELFLoggerDelegate.debugLogger, "Response Code : " + responseCode);
-                                               
-                       BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-                       String inputLine;
-                       StringBuffer response = new StringBuffer();
-
-                       while ((inputLine = in.readLine()) != null) {
-                               response.append(inputLine);
+               if (app != null && app.name != null && app.name != "") {
+                       try {           
+                               appName = app.name;                             
+                               String url = app.restUrl + "/sessionTimeOuts";
+                               String encriptedPwdDB = app.appPassword;
+                               String appUserName = app.username;
+       
+                               setLocalMDCContext(app, "/sessionTimeOuts", url);
+       
+                               URL obj = new URL(url);
+       
+                               HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+       
+                               // optional default is GET
+                               con.setRequestMethod("GET");
+                               con.setConnectTimeout(3000);
+                               con.setReadTimeout(8000);
+                               // add request header
+                               con.setRequestProperty("username", appUserName);
+                               con.setRequestProperty("password", encriptedPwdDB);
+       
+                               // con.set
+                               responseCode = con.getResponseCode();
+                               logger.debug(EELFLoggerDelegate.debugLogger, "Response Code : " + responseCode);
+                                                       
+                               BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+                               String inputLine;
+                               StringBuffer response = new StringBuffer();
+       
+                               while ((inputLine = in.readLine()) != null) {
+                                       response.append(inputLine);
+                               }
+       
+                               in.close();
+                               appResponse = response.toString();
+                       } catch (UrlAccessRestrictedException e) {
+                               responseCode = HttpServletResponse.SC_UNAUTHORIZED;
+                               logger.error(EELFLoggerDelegate.errorLogger, String.format("SessionCommunication.sendGet received an un-authorized exception. AppName: %s", appName));
+                               EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeRestApiAuthenticationError, e);
+                       } catch (Exception e) {
+                               responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+                               String message = String.format(
+                                               "SessionCommunication.sendGet encountered an Exception. AppName: %s, Details: %s", appName,
+                                               EcompPortalUtils.getStackTrace(e));
+                               EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHttpConnectionError, e);
+                               logger.error(EELFLoggerDelegate.errorLogger, message);
+                       } finally {
+                               EcompPortalUtils.setExternalAppResponseCode(responseCode);
                        }
                        }
-
-                       in.close();
-                       appResponse = response.toString();
-               } catch (UrlAccessRestrictedException e) {
-                       responseCode = HttpServletResponse.SC_UNAUTHORIZED;
-                       logger.error(EELFLoggerDelegate.errorLogger, String.format("SessionCommunication.sendGet received an un-authorized exception. AppName: %s", appName));
-                       EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeRestApiAuthenticationError, e);
-               } catch (Exception e) {
-                       responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-                       String message = String.format(
-                                       "SessionCommunication.sendGet encountered an Exception. AppName: %s, Details: %s", appName,
-                                       EcompPortalUtils.getStackTrace(e));
-                       EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHttpConnectionError, e);
-                       logger.error(EELFLoggerDelegate.errorLogger, message);
-               } finally {
-                       EcompPortalUtils.setExternalAppResponseCode(responseCode);
+               }else{
+                       logger.error(EELFLoggerDelegate.errorLogger, "SessionCommunication sendGet: app is null");
                }
                return appResponse;
        }
                }
                return appResponse;
        }
@@ -113,10 +114,11 @@ public class SessionCommunication {
                String appName = "Unknwon";
                int responseCode = 0;
                try {
                String appName = "Unknwon";
                int responseCode = 0;
                try {
+                       if(app==null)
+                               throw new Exception("SessionCommunication.pingSession app is null");
                        if (app != null && app.name != null && app.name != "") {
                                appName = app.name;
                        }
                        if (app != null && app.name != null && app.name != "") {
                                appName = app.name;
                        }
-                       
                        String url = app.restUrl + "/updateSessionTimeOuts";
                        String encriptedPwdDB = app.appPassword;
                        String appUserName = app.username;
                        String url = app.restUrl + "/updateSessionTimeOuts";
                        String encriptedPwdDB = app.appPassword;
                        String appUserName = app.username;
@@ -171,55 +173,56 @@ public class SessionCommunication {
        public Boolean timeoutSession(OnboardingApp app, String portalJSessionId) throws Exception {
                String appName = "Unknwon";
                int responseCode = 0;
        public Boolean timeoutSession(OnboardingApp app, String portalJSessionId) throws Exception {
                String appName = "Unknwon";
                int responseCode = 0;
-               try {
-                       if (app != null && app.name != null && app.name != "") {
+               if (app != null && app.name != null && app.name != "") {
+                       try {
                                appName = app.name;
                                appName = app.name;
+                               String url = app.restUrl + "/timeoutSession" + "?portalJSessionId=" + portalJSessionId;
+       
+                               String encriptedPwdDB = app.appPassword;
+                               String appUserName = app.username;
+                               // String decreptedPwd = CipherUtil.decrypt(encriptedPwdDB,
+                               // SystemProperties.getProperty(SystemProperties.Decryption_Key));
+       
+                               setLocalMDCContext(app, "/timeoutSession", url);
+       
+                               URL obj = new URL(url);
+                               HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+       
+                               // optional default is GET
+                               con.setRequestMethod("POST");
+                               con.setConnectTimeout(3000);
+                               con.setReadTimeout(15000);
+       
+                               // add request header
+                               con.setRequestProperty("username", appUserName);
+                               con.setRequestProperty("password", encriptedPwdDB);
+       
+                               // con.setRequestProperty("portalJSessionId", portalJSessionId);
+                               con.setDoInput(true);
+                               con.setDoOutput(true);
+                               con.getOutputStream().flush();
+                               con.getOutputStream().close();
+       
+                               responseCode = con.getResponseCode();
+                               logger.debug(EELFLoggerDelegate.debugLogger, "Response Code : " + responseCode);
+                       } catch (UrlAccessRestrictedException e) {
+                               responseCode = HttpServletResponse.SC_UNAUTHORIZED;
+                               String message = String.format(
+                                               "SessionCommunication.timeoutSession received an un-authorized exception. AppName: %s", appName);
+                               logger.error(EELFLoggerDelegate.errorLogger, message);
+                               EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeRestApiAuthenticationError, e);
+                       } catch (Exception e) {
+                               responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+                               String message = String.format(
+                                               "SessionCommunication.timeoutSession encountered an Exception. AppName: %s, Details: %s", appName,
+                                               EcompPortalUtils.getStackTrace(e));
+                               EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHttpConnectionError, e);
+                               logger.error(EELFLoggerDelegate.errorLogger, message);
+                       } finally {
+                               EcompPortalUtils.setExternalAppResponseCode(responseCode);
                        }
                        }
-                       
-                       String url = app.restUrl + "/timeoutSession" + "?portalJSessionId=" + portalJSessionId;
-
-                       String encriptedPwdDB = app.appPassword;
-                       String appUserName = app.username;
-                       // String decreptedPwd = CipherUtil.decrypt(encriptedPwdDB,
-                       // SystemProperties.getProperty(SystemProperties.Decryption_Key));
-
-                       setLocalMDCContext(app, "/timeoutSession", url);
-
-                       URL obj = new URL(url);
-                       HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-                       // optional default is GET
-                       con.setRequestMethod("POST");
-                       con.setConnectTimeout(3000);
-                       con.setReadTimeout(15000);
-
-                       // add request header
-                       con.setRequestProperty("username", appUserName);
-                       con.setRequestProperty("password", encriptedPwdDB);
-
-                       // con.setRequestProperty("portalJSessionId", portalJSessionId);
-                       con.setDoInput(true);
-                       con.setDoOutput(true);
-                       con.getOutputStream().flush();
-                       con.getOutputStream().close();
-
-                       responseCode = con.getResponseCode();
-                       logger.debug(EELFLoggerDelegate.debugLogger, "Response Code : " + responseCode);
-               } catch (UrlAccessRestrictedException e) {
-                       responseCode = HttpServletResponse.SC_UNAUTHORIZED;
-                       String message = String.format(
-                                       "SessionCommunication.timeoutSession received an un-authorized exception. AppName: %s", appName);
-                       logger.error(EELFLoggerDelegate.errorLogger, message);
-                       EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeRestApiAuthenticationError, e);
-               } catch (Exception e) {
-                       responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-                       String message = String.format(
-                                       "SessionCommunication.timeoutSession encountered an Exception. AppName: %s, Details: %s", appName,
-                                       EcompPortalUtils.getStackTrace(e));
-                       EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHttpConnectionError, e);
-                       logger.error(EELFLoggerDelegate.errorLogger, message);
-               } finally {
-                       EcompPortalUtils.setExternalAppResponseCode(responseCode);
+               }else{
+                       logger.error(EELFLoggerDelegate.errorLogger, "SessionCommunication pingSession: app is null");
                }
                return true;
        }
                }
                return true;
        }
index 1574a9a..5526670 100644 (file)
        </class>
 
        <!-- User Role class mapping details -->
        </class>
 
        <!-- User Role class mapping details -->
-       <class name="EPRole" table="FN_ROLE">
+       <class name="EPRole" table="FN_ROLE" >
                <id name="id" column="role_id">
                        <generator class="native">
                                <param name="sequence">seq_fn_role</param>
                <id name="id" column="role_id">
                        <generator class="native">
                                <param name="sequence">seq_fn_role</param>
@@ -1800,22 +1800,11 @@ where fn_role.app_id = fn_app.app_id and fn_app.enabled='Y' and fn_role.active_y
                        class="org.openecomp.portalapp.portal.domain.CentralRoleFunction" />
                        <![CDATA[
                        
                        class="org.openecomp.portalapp.portal.domain.CentralRoleFunction" />
                        <![CDATA[
                        
-                       SELECT * from ep_app_function where function_cd = :functionCode and app_id =:appId
+                       SELECT * from ep_app_function where function_cd like CONCAT('%', :functionCode,'%') and app_id =:appId
                        ;
                        
                        ]]>
        </sql-query>
                        ;
                        
                        ]]>
        </sql-query>
-       
-       <!-- Gets the record from ep_app_function table and requires two parameters  -->
-       <sql-query name="getAppFunctionDetails">
-               <return alias="appFunctionDetails"
-                       class="org.openecomp.portalapp.portal.domain.CentralRoleFunction" />
-                       <![CDATA[
-                       
-                                       select * from ep_app_function where app_id =:appId and function_cd =:functionCd
-                       ;               
-                       ]]>
-       </sql-query>
                
        <!-- Gets the current user app roles records and requires two parameters  -->
        <sql-query name="getUserAppCurrentRoles">
                
        <!-- Gets the current user app roles records and requires two parameters  -->
        <sql-query name="getUserAppCurrentRoles">
@@ -1940,4 +1929,18 @@ where fn_role.app_id = fn_app.app_id and fn_app.enabled='Y' and fn_role.active_y
                ]]>
        </sql-query>
        
                ]]>
        </sql-query>
        
+       <sql-query name="ApplicationUserRoles">
+               <return alias="ApplicationUserRoles" class="org.openecomp.portalapp.portal.transport.EcompUserRoles" />
+               <![CDATA[ 
+                   select distinct fu.org_id, fu.manager_id, fu.first_name, fu.middle_name, fu.last_name, fu.phone, fu.email, fu.hrid, fu.org_user_id, fu.org_code, fu.org_manager_userid, fu.job_title, fu.login_id, 
+                       fu.active_yn , fr.app_role_id, fr.role_name
+                       from fn_user fu, fn_role fr, fn_user_role fur
+                       where fu.user_id = fur.user_id and fu.active_yn='Y' and fur.role_id = fr.role_id and fr.app_id =:appId and fr.active_yn='Y'
+               union
+            select distinct fu.org_id, fu.manager_id, fu.first_name, fu.middle_name, fu.last_name, fu.phone, fu.email, fu.hrid, fu.org_user_id, fu.org_code, fu.org_manager_userid, fu.job_title, fu.login_id, fu.active_yn , fr.role_id, fr.role_name
+                       from fn_user fu, fn_role fr, fn_user_role fur
+                       where fu.user_id = fur.user_id and fu.active_yn='Y' and fur.app_id=:appId and fr.role_name like 'global%' and fr.active_yn='Y'
+            ;
+               ]]>
+       </sql-query>
 </hibernate-mapping>
 </hibernate-mapping>
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppCatalogControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppCatalogControllerTest.java
new file mode 100644 (file)
index 0000000..16d2c8d
--- /dev/null
@@ -0,0 +1,263 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.AppCatalogController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.AppCatalogItem;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.EPAppCommonServiceImpl;
+import org.openecomp.portalapp.portal.service.EPAppService;
+import org.openecomp.portalapp.portal.service.PersUserAppService;
+import org.openecomp.portalapp.portal.service.PersUserAppServiceImpl;
+import org.openecomp.portalapp.portal.transport.AppCatalogPersonalization;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+public class AppCatalogControllerTest extends MockitoTestSuite {
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+
+       @Mock
+       EPAppService appService = new EPAppCommonServiceImpl();
+
+       @InjectMocks
+       AppCatalogController appCatalogController = new AppCatalogController();
+
+       PersUserAppService persUserAppService = Mockito.spy(new PersUserAppServiceImpl());
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       @Mock
+       EPUser epuser;
+
+       NullPointerException nullPointerException = new NullPointerException();
+
+       MockEPUser mockUser = new MockEPUser();
+
+       public AppCatalogItem mockAppCatalogItem() {
+               AppCatalogItem appCatalogItem = new AppCatalogItem();
+               appCatalogItem.setId((long) 1);
+               appCatalogItem.setName("Ecomp Portal");
+               appCatalogItem.setImageUrl("Test_URL");
+               appCatalogItem.setDescription("Testing");
+               appCatalogItem.setNotes("Test");
+               appCatalogItem.setUrl("test");
+               appCatalogItem.setAlternateUrl("test");
+               appCatalogItem.setRestricted(false);
+               appCatalogItem.setOpen(false);
+               appCatalogItem.setAccess(true);
+               appCatalogItem.setSelect(true);
+               appCatalogItem.setPending(false);
+
+               return appCatalogItem;
+       }
+
+       @Test
+       public void getAppCatalogTestIfUserNotAdmin() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppCatalogItem> actualAppCatalogList = null;
+
+               List<AppCatalogItem> expectedAppCatalog = new ArrayList<>();
+
+               AppCatalogItem appCatalogItem = mockAppCatalogItem();
+               expectedAppCatalog.add(appCatalogItem);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(appService.getUserAppCatalog(user)).thenReturn(expectedAppCatalog);
+               actualAppCatalogList = appCatalogController.getAppCatalog(mockedRequest, mockedResponse);
+
+               assertTrue(actualAppCatalogList.contains(appCatalogItem));
+
+       }
+
+       @Test
+       public void getAppCatalogTestIfUserIsAdmin() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppCatalogItem> actualAppCatalogList = null;
+
+               List<AppCatalogItem> expectedAppCatalog = new ArrayList<>();
+
+               AppCatalogItem appCatalogItem = mockAppCatalogItem();
+
+               expectedAppCatalog.add(appCatalogItem);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAdminAppCatalog(user)).thenReturn(expectedAppCatalog);
+               actualAppCatalogList = appCatalogController.getAppCatalog(mockedRequest, mockedResponse);
+
+               assertTrue(actualAppCatalogList.contains(appCatalogItem));
+
+       }
+
+       @Test
+       public void getAppCatalogTestIfUserisNull() throws IOException {
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(null);
+               List<AppCatalogItem> actualAppCatalogList = new ArrayList<>();
+               ;
+               actualAppCatalogList = appCatalogController.getAppCatalog(mockedRequest, mockedResponse);
+               assertNull(actualAppCatalogList);
+
+       }
+
+       @Test
+       public void getAppCatalogTestIfUserThrowsExceptionTest() throws IOException {
+               EPUser user = new EPUser();
+               user.setFirstName("test");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppCatalogItem> actualAppCatalogList = new ArrayList<>();
+               ;
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+
+               Mockito.when(appCatalogController.getAppCatalog(mockedRequest, mockedResponse)).thenThrow(nullPointerException);
+
+               actualAppCatalogList = appCatalogController.getAppCatalog(mockedRequest, mockedResponse);
+               assertNull(actualAppCatalogList);
+
+       }
+
+       @Test
+       public void putAppCatalogSelectionTestWhenAppIsNull() throws IOException {
+
+               AppCatalogPersonalization persRequest = new AppCatalogPersonalization();
+               persRequest.setAppId((long) 1);
+               persRequest.setPending(false);
+               persRequest.setSelect(false);
+
+               EPUser user = mockUser.mockEPUser();
+
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               ;
+
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(fields);
+               expectedFieldValidator.setErrorCode(null);
+
+               EPApp app = null;
+
+               Mockito.when(appService.getApp(persRequest.getAppId())).thenReturn(app);
+
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               actualFieldValidator = appCatalogController.putAppCatalogSelection(mockedRequest, persRequest, mockedResponse);
+               assertEquals(expectedFieldValidator, actualFieldValidator);
+
+       }
+
+       @Test
+       public void putAppCatalogSelectionTest() throws IOException {
+
+               AppCatalogPersonalization persRequest = new AppCatalogPersonalization();
+               persRequest.setAppId((long) 1);
+               persRequest.setPending(false);
+               persRequest.setSelect(false);
+
+               EPUser user = mockUser.mockEPUser();
+
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               ;
+
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(fields);
+               expectedFieldValidator.setErrorCode(null);
+
+               EPApp app = new EPApp();
+
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+
+               Mockito.when(appService.getApp(persRequest.getAppId())).thenReturn(app);
+
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.doNothing().when(persUserAppService).setPersUserAppValue(user, app, persRequest.getSelect(),
+                               persRequest.getPending());
+
+               actualFieldValidator = appCatalogController.putAppCatalogSelection(mockedRequest, persRequest, mockedResponse);
+
+               assertEquals(expectedFieldValidator, actualFieldValidator);
+
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppContactUsControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppContactUsControllerTest.java
new file mode 100644 (file)
index 0000000..01cf27e
--- /dev/null
@@ -0,0 +1,274 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.AppContactUsController;
+import org.openecomp.portalapp.portal.ecomp.model.AppCategoryFunctionsItem;
+import org.openecomp.portalapp.portal.ecomp.model.AppContactUsItem;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.AppContactUsService;
+import org.openecomp.portalapp.portal.service.AppContactUsServiceImpl;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class AppContactUsControllerTest extends MockitoTestSuite{
+
+       @Mock
+       AppContactUsService contactUsService = new AppContactUsServiceImpl();
+
+       @InjectMocks
+       AppContactUsController appContactUsController = new AppContactUsController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       public List<AppContactUsItem> mockResponse() {
+               List<AppContactUsItem> appContactUsItemList = new ArrayList<AppContactUsItem>();
+               AppContactUsItem appContactUsItem = new AppContactUsItem();
+               appContactUsItem.setAppId((long) 1);
+               appContactUsItem.setAppName("ECOMP Portal");
+               appContactUsItem.setDescription("Test");
+               appContactUsItem.setContactName("Test");
+               appContactUsItem.setContactEmail("person@onap.org");
+               appContactUsItem.setUrl("Test_URL");
+               appContactUsItem.setActiveYN("Y");
+               appContactUsItemList.add(appContactUsItem);
+
+               return appContactUsItemList;
+
+       }
+
+       public PortalRestResponse<List<AppContactUsItem>> successPortalRestResponse() {
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               List<AppContactUsItem> appContactUsItemList = mockResponse();
+               expectedportalRestResponse.setMessage("success");
+               expectedportalRestResponse.setResponse(appContactUsItemList);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               return expectedportalRestResponse;
+
+       }
+
+       public PortalRestResponse<List<AppContactUsItem>> exceptionPortalRestResponse() {
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(null);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               return expectedportalRestResponse;
+
+       }
+
+       @Test
+       public void getAppContactUsList() throws Exception {
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = successPortalRestResponse();
+               List<AppContactUsItem> appContactUsItemList = mockResponse();
+               PortalRestResponse<List<AppContactUsItem>> actualPortalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               Mockito.when(contactUsService.getAppContactUs()).thenReturn(appContactUsItemList);
+               actualPortalRestResponse = appContactUsController.getAppContactUsList(mockedRequest);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void getAppContactUsListCatchesExeptionTest() throws Exception {
+
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = exceptionPortalRestResponse();
+               PortalRestResponse<List<AppContactUsItem>> actualPortalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               Mockito.when(contactUsService.getAppContactUs()).thenThrow(nullPointerException);
+               actualPortalRestResponse = appContactUsController.getAppContactUsList(mockedRequest);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void getAppsAndContactsTest() throws Exception {
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = successPortalRestResponse();
+               List<AppContactUsItem> appContactUsItemList = mockResponse();
+               PortalRestResponse<List<AppContactUsItem>> actualPortalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               Mockito.when(contactUsService.getAppsAndContacts()).thenReturn(appContactUsItemList);
+               actualPortalRestResponse = appContactUsController.getAppsAndContacts(mockedRequest);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+
+       }
+
+       @Test
+       public void getAppsAndContactsCatchesExceptionTest() throws Exception {
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = exceptionPortalRestResponse();
+               PortalRestResponse<List<AppContactUsItem>> actualPortalRestResponse = new PortalRestResponse<List<AppContactUsItem>>();
+               Mockito.when(contactUsService.getAppsAndContacts()).thenThrow(nullPointerException);
+               actualPortalRestResponse = appContactUsController.getAppsAndContacts(mockedRequest);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+
+       }
+
+       @Test
+       public void getAppCategoryFunctionsTest() throws Exception {
+               PortalRestResponse<List<AppCategoryFunctionsItem>> actualportalRestResponse = null;
+
+               List<AppCategoryFunctionsItem> contents = new ArrayList<AppCategoryFunctionsItem>();
+
+               AppCategoryFunctionsItem appCategoryFunctionsItem = new AppCategoryFunctionsItem();
+               AppCategoryFunctionsItem appCategoryFunctionsItem1 = new AppCategoryFunctionsItem();
+
+               appCategoryFunctionsItem.setRowId("1");
+               appCategoryFunctionsItem.setAppId("1");
+               appCategoryFunctionsItem.setApplication("Ecomp-portal");
+               appCategoryFunctionsItem.setCategory("test");
+               appCategoryFunctionsItem.setFunctions("test");
+
+               appCategoryFunctionsItem1.setRowId("2");
+               appCategoryFunctionsItem1.setAppId("2");
+               appCategoryFunctionsItem1.setApplication("Ecomp-portal-test");
+               appCategoryFunctionsItem1.setCategory("test");
+               appCategoryFunctionsItem1.setFunctions("test");
+               contents.add(appCategoryFunctionsItem);
+               contents.add(appCategoryFunctionsItem1);
+
+               PortalRestResponse<List<AppCategoryFunctionsItem>> expectedportalRestResponse = new PortalRestResponse<List<AppCategoryFunctionsItem>>();
+               expectedportalRestResponse.setMessage("success");
+               expectedportalRestResponse.setResponse(contents);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
+
+               Mockito.when(contactUsService.getAppCategoryFunctions()).thenReturn(contents);
+               actualportalRestResponse = appContactUsController.getAppCategoryFunctions(mockedRequest);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+
+       }
+
+       @Test
+       public void getAppCategoryFunctionsCatchesExceptionTest() throws Exception {
+               PortalRestResponse<List<AppCategoryFunctionsItem>> actualportalRestResponse = null;
+               PortalRestResponse<List<AppContactUsItem>> expectedportalRestResponse = exceptionPortalRestResponse();
+               Mockito.when(contactUsService.getAppCategoryFunctions()).thenThrow(nullPointerException);
+               actualportalRestResponse = appContactUsController.getAppCategoryFunctions(mockedRequest);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+
+       }
+
+       @Test
+       public void saveTest() throws Exception {
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+
+               AppContactUsItem contactUs = new AppContactUsItem();
+               contactUs.setAppId((long) 1);
+               contactUs.setAppName("Ecomp Portal");
+               contactUs.setDescription("Test");
+               contactUs.setContactName("Test");
+               contactUs.setContactEmail("person@onap.org");
+               contactUs.setUrl("Test_URL");
+               contactUs.setActiveYN("Y");
+
+               Mockito.when(contactUsService.saveAppContactUs(contactUs)).thenReturn("SUCCESS");
+               actualSaveAppContactUS = appContactUsController.save(contactUs);
+               assertEquals(actualSaveAppContactUS.getMessage(), "SUCCESS");
+       }
+
+       @Test
+       public void saveExceptionTest() throws Exception {
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+
+               AppContactUsItem contactUs = new AppContactUsItem();
+               contactUs.setAppId((long) 1);
+               contactUs.setAppName("Ecomp Portal");
+               contactUs.setDescription("Test");
+               contactUs.setContactName("Test");
+               contactUs.setContactEmail("person@onap.org");
+               contactUs.setUrl("Test_URL");
+               contactUs.setActiveYN("Y");
+
+               Mockito.when(contactUsService.saveAppContactUs(contactUs)).thenThrow(new Exception());
+               actualSaveAppContactUS = appContactUsController.save(contactUs);
+               assertEquals(actualSaveAppContactUS.getMessage(), "failure");
+       }
+
+       @Test
+       public void saveWhenAppContactUsItemNullTest() throws Exception {
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+               AppContactUsItem contactUs = null;
+               actualSaveAppContactUS = appContactUsController.save(contactUs);
+               assertEquals(actualSaveAppContactUS.getMessage(), "failure");
+
+       }
+
+       @Test
+       public void saveAllTest() throws Exception {
+
+               List<AppContactUsItem> contactUs = mockResponse();
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+               Mockito.when(contactUsService.saveAppContactUs(contactUs)).thenReturn("SUCCESS");
+               actualSaveAppContactUS = appContactUsController.save(contactUs);
+               assertEquals(actualSaveAppContactUS.getMessage(), "SUCCESS");
+       }
+
+       @Test
+       public void saveAllExceptionTest() throws Exception {
+
+               List<AppContactUsItem> contactUs = mockResponse();
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+               Mockito.when(contactUsService.saveAppContactUs(contactUs)).thenThrow(new Exception());
+               actualSaveAppContactUS = appContactUsController.save(contactUs);
+               assertEquals(actualSaveAppContactUS.getMessage(), "failure");
+       }
+
+       @Test
+       public void deleteTest() throws Exception {
+
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+               Long id = (long) 1;
+               String saveAppContactUs = "SUCCESS";
+               Mockito.when(contactUsService.deleteContactUs(id)).thenReturn(saveAppContactUs);
+               actualSaveAppContactUS = appContactUsController.delete(id);
+               assertEquals(actualSaveAppContactUS.getMessage(), "SUCCESS");
+       }
+
+       @Test
+       public void deleteExceptionTest() throws Exception {
+
+               PortalRestResponse<String> actualSaveAppContactUS = null;
+               Long id = (long) 1;
+               Mockito.when(contactUsService.deleteContactUs(id)).thenThrow(new Exception());
+               actualSaveAppContactUS = appContactUsController.delete(id);
+               assertEquals(actualSaveAppContactUS.getMessage(), "failure");
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestTest.java
new file mode 100644 (file)
index 0000000..e62a940
--- /dev/null
@@ -0,0 +1,273 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.AppsControllerExternalRequest;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.EPAppService;
+import org.openecomp.portalapp.portal.service.PortalAdminService;
+import org.openecomp.portalapp.portal.service.UserService;
+import org.openecomp.portalapp.portal.service.UserServiceImpl;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.OnboardingApp;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class AppsControllerExternalRequestTest extends MockitoTestSuite {
+
+       @Mock
+       AdminRolesService adminRolesService;
+
+       @Mock
+       EPAppService appService;
+
+       @Mock
+       PortalAdminService portalAdminService;
+
+       @Mock
+       UserService userService = new UserServiceImpl();
+
+       @InjectMocks
+       AppsControllerExternalRequest appsControllerExternalRequest = new AppsControllerExternalRequest();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       MockEPUser mockUser = new MockEPUser();
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       @Test
+       public void postPortalAdminIfUSerNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Missing required field: email, loginId, or loginPwd");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postPortalAdminTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("java.lang.NullPointerException");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               user.setLoginPwd("pwd");
+               user.setLoginId("Test");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userService.getUserByUserId(user.getOrgUserId())).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postPortalAdminCreateUserIfNotFoundTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               user.setLoginPwd("pwd");
+               user.setLoginId("Test");
+               List<EPUser> expectedList = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userService.getUserByUserId(user.getOrgUserId())).thenReturn(expectedList);
+               Mockito.when(userService.saveNewUser(user, "Yes")).thenReturn(null);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postPortalAdminCreateUserIfFoundTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               user.setLoginPwd("pwd");
+               user.setLoginId("Test");
+               List<EPUser> expectedList = new ArrayList<EPUser>();
+               expectedList.add(user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userService.getUserByUserId(user.getOrgUserId())).thenReturn(expectedList);
+               Mockito.when(userService.saveNewUser(user, "Yes")).thenReturn(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postPortalAdminCreateUserIfNotSuperAdminTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               user.setLoginPwd("pwd");
+               user.setLoginId("Test");
+               List<EPUser> expectedList = new ArrayList<EPUser>();
+               expectedList.add(user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userService.getUserByUserId(user.getOrgUserId())).thenReturn(expectedList);
+               Mockito.when(userService.saveNewUser(user, "Yes")).thenReturn(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(portalAdminService.createPortalAdmin(user.getOrgUserId())).thenReturn(expectedFieldValidator);
+
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postPortalAdminCreateUserIfFieldValidatorErrorTest() throws Exception {
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 500);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FieldsValidator [httpStatusCode=500, errorCode=null, fields=null]");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("guestT@test.portal.onap.org");
+               user.setLoginPwd("pwd");
+               user.setLoginId("Test");
+               List<EPUser> expectedList = new ArrayList<EPUser>();
+               expectedList.add(user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userService.getUserByUserId(user.getOrgUserId())).thenReturn(expectedList);
+               Mockito.when(userService.saveNewUser(user, "Yes")).thenReturn(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(portalAdminService.createPortalAdmin(user.getOrgUserId())).thenReturn(expectedFieldValidator);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postPortalAdmin(mockedRequest, mockedResponse, user);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void getOnboardAppExternalTest() {
+               EPApp epApp = new EPApp();
+               Long appId = (long) 1;
+               Mockito.when(appService.getApp(appId)).thenReturn(epApp);
+               OnboardingApp expectedApp = new OnboardingApp();
+               Mockito.doNothing().when(appService).createOnboardingFromApp(epApp, expectedApp);
+               OnboardingApp actualApp = appsControllerExternalRequest.getOnboardAppExternal(mockedRequest, mockedResponse,
+                               appId);
+               assertEquals(expectedApp.getClass(), actualApp.getClass());
+       }
+
+       @Test
+       public void postOnboardAppExternalExceptionTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Unexpected field: id");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = (long) 1;
+
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postOnboardAppExternal(mockedRequest, mockedResponse, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void postOnboardAppExternalTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(
+                               "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = null;
+
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postOnboardAppExternal(mockedRequest, mockedResponse, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+
+       }
+
+       @Test
+       public void putOnboardAppExternalifAppNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Unexpected value for field: id");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               Long appId = null;
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = null;
+
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .putOnboardAppExternal(mockedRequest, mockedResponse, appId, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void putOnboardAppExternalIfOnboardingAppDetailsNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(
+                               "Missing required field: name, url, restUrl, restrictedApp, isOpen, isEnabled, myLoginsAppOwner");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               Long appId = (long) 1;
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = (long) 1;
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .putOnboardAppExternal(mockedRequest, mockedResponse, appId, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerTest.java
new file mode 100644 (file)
index 0000000..d4181a6
--- /dev/null
@@ -0,0 +1,914 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.AppsController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.AdminUserApplications;
+import org.openecomp.portalapp.portal.domain.AppIdAndNameTransportModel;
+import org.openecomp.portalapp.portal.domain.AppsResponse;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.EcompApp;
+import org.openecomp.portalapp.portal.domain.UserRole;
+import org.openecomp.portalapp.portal.domain.UserRoles;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.EPAppCommonServiceImpl;
+import org.openecomp.portalapp.portal.service.EPAppService;
+import org.openecomp.portalapp.portal.service.EPLeftMenuService;
+import org.openecomp.portalapp.portal.service.EPLeftMenuServiceImpl;
+import org.openecomp.portalapp.portal.transport.EPAppsManualPreference;
+import org.openecomp.portalapp.portal.transport.EPAppsSortPreference;
+import org.openecomp.portalapp.portal.transport.EPDeleteAppsManualSortPref;
+import org.openecomp.portalapp.portal.transport.EPWidgetsSortPreference;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.LocalRole;
+import org.openecomp.portalapp.portal.transport.OnboardingApp;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.openecomp.portalsdk.core.web.support.AppUtils;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.MediaType;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SystemProperties.class,AppUtils.class, EPUserUtils.class, MediaType.class})
+public class AppsControllerTest extends MockitoTestSuite{
+
+       @InjectMocks
+       AppsController appsController = new AppsController();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+
+       @Mock
+       EPAppService appService = new EPAppCommonServiceImpl();
+
+       @Mock
+       EPLeftMenuService leftMenuService = new EPLeftMenuServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       @Mock
+       AppUtils appUtils = new AppUtils();
+
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getUserAppsTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EcompApp> expectedEcompApps = new ArrayList<EcompApp>();
+
+               EcompApp ecompApp = new EcompApp();
+               ecompApp.setId((long) 1);
+               ecompApp.setName("Test_app");
+               ecompApp.setUrl("Test_URL");
+               ecompApp.setUebKey("Test_key");
+               ecompApp.setAlternateUrl("Test_alt_URL");
+               expectedEcompApps.add(ecompApp);
+               List<EcompApp> actualEcompApps = new ArrayList<EcompApp>();
+               Mockito.when(appService.transformAppsToEcompApps(appService.getUserApps(user))).thenReturn(expectedEcompApps);
+               actualEcompApps = appsController.getUserApps(mockedRequest, mockedResponse);
+               assertEquals(expectedEcompApps, actualEcompApps);
+       }
+
+       @Test
+       public void getUserAppsNoUserTest() {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.transformAppsToEcompApps(appService.getUserApps(user))).thenReturn(null);
+               assertNull(appsController.getUserApps(mockedRequest, mockedResponse));
+
+       }
+
+       @Test
+       public void getUserAppsExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.transformAppsToEcompApps(appService.getUserApps(user))).thenThrow(nullPointerException);
+               assertNull(appsController.getUserApps(mockedRequest, mockedResponse));
+
+       }
+
+       @Test
+       public void getPersUserAppsIfUserIsAdminTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EcompApp> expectedEcompApps = new ArrayList<EcompApp>();
+
+               EcompApp ecompApp = new EcompApp();
+               ecompApp.setId((long) 1);
+               ecompApp.setName("Test_app");
+               ecompApp.setUrl("Test_URL");
+               ecompApp.setUebKey("Test_key");
+               ecompApp.setAlternateUrl("Test_alt_URL");
+               expectedEcompApps.add(ecompApp);
+               List<EcompApp> actualEcompApps = new ArrayList<EcompApp>();
+
+               List<EPApp> expectedApps = new ArrayList<EPApp>();
+
+               EPApp app = new EPApp();
+
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+
+               expectedApps.add(app);
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getPersAdminApps(user)).thenReturn(expectedApps);
+
+               Mockito.when(appService.transformAppsToEcompApps(expectedApps)).thenReturn(expectedEcompApps);
+               actualEcompApps = appsController.getPersUserApps(mockedRequest, mockedResponse);
+               assertEquals(expectedEcompApps, actualEcompApps);
+       }
+
+       @Test
+       public void getPersUserAppsIfUserNotAdminTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EcompApp> expectedEcompApps = new ArrayList<EcompApp>();
+
+               EcompApp ecompApp = new EcompApp();
+               ecompApp.setId((long) 1);
+               ecompApp.setName("Test_app");
+               ecompApp.setUrl("Test_URL");
+               ecompApp.setUebKey("Test_key");
+               ecompApp.setAlternateUrl("Test_alt_URL");
+               expectedEcompApps.add(ecompApp);
+               List<EcompApp> actualEcompApps = new ArrayList<EcompApp>();
+
+               List<EPApp> expectedApps = new ArrayList<EPApp>();
+
+               EPApp app = new EPApp();
+
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+
+               expectedApps.add(app);
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(appService.getPersUserApps(user)).thenReturn(expectedApps);
+               Mockito.when(appService.transformAppsToEcompApps(expectedApps)).thenReturn(expectedEcompApps);
+               actualEcompApps = appsController.getPersUserApps(mockedRequest, mockedResponse);
+               assertEquals(expectedEcompApps, actualEcompApps);
+       }
+
+       @Test
+       public void getPersUserAppsIfUserNullTest() throws IOException {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               assertNull(appsController.getPersUserApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getPersUserAppsExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getPersAdminApps(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getPersUserApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAdminAppsIfNotAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               assertNull(appsController.getAdminApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAdminAppsTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppIdAndNameTransportModel> expectedAdminApps = new ArrayList<AppIdAndNameTransportModel>();
+               AppIdAndNameTransportModel appIdAndNameTransportModel = new AppIdAndNameTransportModel();
+               appIdAndNameTransportModel.setId((long) 1);
+               appIdAndNameTransportModel.setName("Test_app");
+               expectedAdminApps.add(appIdAndNameTransportModel);
+               List<AppIdAndNameTransportModel> actualAdminApps = new ArrayList<AppIdAndNameTransportModel>();
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAdminApps(user)).thenReturn(expectedAdminApps);
+               actualAdminApps = appsController.getAdminApps(mockedRequest, mockedResponse);
+               assertEquals(actualAdminApps, expectedAdminApps);
+
+       }
+
+       @Test
+       public void getAdminAppsExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAdminApps(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getAdminApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsForSuperAdminAndAccountAdminifOnlyAccountAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               assertNull(appsController.getAppsForSuperAdminAndAccountAdmin(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsForSuperAdminAndAccountAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppIdAndNameTransportModel> expectedAdminApps = new ArrayList<AppIdAndNameTransportModel>();
+               AppIdAndNameTransportModel appIdAndNameTransportModel = new AppIdAndNameTransportModel();
+               appIdAndNameTransportModel.setId((long) 1);
+               appIdAndNameTransportModel.setName("Test_app");
+               expectedAdminApps.add(appIdAndNameTransportModel);
+               List<AppIdAndNameTransportModel> actualAdminApps = new ArrayList<AppIdAndNameTransportModel>();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAppsForSuperAdminAndAccountAdmin(user)).thenReturn(expectedAdminApps);
+               actualAdminApps = appsController.getAppsForSuperAdminAndAccountAdmin(mockedRequest, mockedResponse);
+               assertEquals(actualAdminApps, expectedAdminApps);
+
+       }
+
+       @Test
+       public void getAppsForSuperAdminExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(appService.getAppsForSuperAdminAndAccountAdmin(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getAppsForSuperAdminAndAccountAdmin(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void putUserAppsSortingManualTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPAppsManualPreference> ePAppsManualPreference = new ArrayList<EPAppsManualPreference>();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               Mockito.when(appService.saveAppsSortManual(ePAppsManualPreference, user)).thenReturn(expectedFieldValidator);
+               actualFieldValidator = appsController.putUserAppsSortingManual(mockedRequest, ePAppsManualPreference,
+                               mockedResponse);
+               assertEquals(actualFieldValidator, expectedFieldValidator);
+       }
+
+       @Test
+       public void putUserAppsSortingManualExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPAppsManualPreference> ePAppsManualPreference = new ArrayList<EPAppsManualPreference>();
+               Mockito.when(appService.saveAppsSortManual(ePAppsManualPreference, user)).thenThrow(nullPointerException);
+               assertNull(appsController.putUserAppsSortingManual(mockedRequest, ePAppsManualPreference, mockedResponse));
+       }
+
+       @Test
+       public void putUserWidgetsSortManualTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPWidgetsSortPreference> ePWidgetsSortPreference = new ArrayList<EPWidgetsSortPreference>();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               Mockito.when(appService.saveWidgetsSortManual(ePWidgetsSortPreference, user))
+                               .thenReturn(expectedFieldValidator);
+               actualFieldValidator = appsController.putUserWidgetsSortManual(mockedRequest, ePWidgetsSortPreference,
+                               mockedResponse);
+               assertEquals(actualFieldValidator, expectedFieldValidator);
+       }
+
+       @Test
+       public void putUserWidgetsSortManualExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPAppsManualPreference> ePAppsManualPreference = new ArrayList<EPAppsManualPreference>();
+               Mockito.when(appService.saveAppsSortManual(ePAppsManualPreference, user)).thenThrow(nullPointerException);
+               assertNull(appsController.putUserAppsSortingManual(mockedRequest, ePAppsManualPreference, mockedResponse));
+       }
+
+       @Test
+       public void putUserWidgetsSortPrefTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPWidgetsSortPreference> ePWidgetsSortPreference = new ArrayList<EPWidgetsSortPreference>();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               Mockito.when(appService.deleteUserWidgetSortPref(ePWidgetsSortPreference, user))
+                               .thenReturn(expectedFieldValidator);
+               actualFieldValidator = appsController.putUserWidgetsSortPref(mockedRequest, ePWidgetsSortPreference,
+                               mockedResponse);
+               assertEquals(actualFieldValidator, expectedFieldValidator);
+       }
+
+       @Test
+       public void putUserWidgetsSortPrefExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPWidgetsSortPreference> ePWidgetsSortPreference = new ArrayList<EPWidgetsSortPreference>();
+               Mockito.when(appService.deleteUserWidgetSortPref(ePWidgetsSortPreference, user))
+                               .thenThrow(nullPointerException);
+               assertNull(appsController.putUserWidgetsSortPref(mockedRequest, ePWidgetsSortPreference, mockedResponse));
+       }
+
+       @Test
+       public void deleteUserAppSortManualTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = new EPDeleteAppsManualSortPref();
+
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               Mockito.when(appService.deleteUserAppSortManual(epDeleteAppsManualSortPref, user))
+                               .thenReturn(expectedFieldValidator);
+               actualFieldValidator = appsController.deleteUserAppSortManual(mockedRequest, epDeleteAppsManualSortPref,
+                               mockedResponse);
+               assertEquals(actualFieldValidator, expectedFieldValidator);
+       }
+
+       @Test
+       public void deleteUserAppSortManualExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = new EPDeleteAppsManualSortPref();
+               Mockito.when(appService.deleteUserAppSortManual(epDeleteAppsManualSortPref, user))
+                               .thenThrow(nullPointerException);
+               assertNull(appsController.deleteUserAppSortManual(mockedRequest, epDeleteAppsManualSortPref, mockedResponse));
+       }
+
+       @Test
+       public void putUserAppsSortingPreferenceTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               EPAppsSortPreference userAppsValue = new EPAppsSortPreference();
+
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               Mockito.when(appService.saveAppsSortPreference(userAppsValue, user)).thenReturn(expectedFieldValidator);
+               actualFieldValidator = appsController.putUserAppsSortingPreference(mockedRequest, userAppsValue,
+                               mockedResponse);
+               assertEquals(actualFieldValidator, expectedFieldValidator);
+       }
+
+       @Test
+       public void putUserAppsSortingPreferenceExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               EPAppsSortPreference userAppsValue = new EPAppsSortPreference();
+               Mockito.when(appService.saveAppsSortPreference(userAppsValue, user)).thenThrow(nullPointerException);
+               assertNull(appsController.putUserAppsSortingPreference(mockedRequest, userAppsValue, mockedResponse));
+       }
+
+       @Test
+       public void getUserAppsSortTypePreferenceTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String expectedUserSortPreference = "TEST_DECE";
+               String actualUserSortPreference = new String();
+               Mockito.when(appService.getUserAppsSortTypePreference(user)).thenReturn(expectedUserSortPreference);
+               actualUserSortPreference = appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse);
+               assertEquals(actualUserSortPreference, expectedUserSortPreference);
+       }
+
+       @Test
+       public void getUserAppsSortTypePreferenceExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.getUserAppsSortTypePreference(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getUserAppsSortTypePreferenceIfUserNullTest() throws IOException {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.getUserAppsSortTypePreference(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsAdministratorsTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AdminUserApplications> expecteAdminUserApplications = new ArrayList<AdminUserApplications>();
+               List<AdminUserApplications> actualAdminUserApplications = new ArrayList<AdminUserApplications>();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAppsAdmins()).thenReturn(expecteAdminUserApplications);
+               actualAdminUserApplications = appsController.getAppsAdministrators(mockedRequest, mockedResponse);
+               assertEquals(expecteAdminUserApplications, actualAdminUserApplications);
+       }
+
+       @Test
+       public void getAppsAdministratorsIfUserNotSuperAdminTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsAdministratorsExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAppsAdmins()).thenThrow(nullPointerException);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppsResponse> expectedApps = new ArrayList<AppsResponse>();
+               AppsResponse apps = new AppsResponse((long) 1, "test", true, true);
+               expectedApps.add(apps);
+
+               List<AppsResponse> atualApps = new ArrayList<AppsResponse>();
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAllApps(false)).thenReturn(expectedApps);
+               atualApps = appsController.getApps(mockedRequest, mockedResponse);
+               assertEquals(expectedApps, atualApps);
+       }
+
+       @Test
+       public void getAppsExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               assertNull(appsController.getApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsIfUserNotSuperAdminTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAllApps(false)).thenThrow(nullPointerException);
+               assertNull(appsController.getApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAllAppsTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<AppsResponse> expectedApps = new ArrayList<AppsResponse>();
+               AppsResponse apps = new AppsResponse((long) 1, "test", true, true);
+               expectedApps.add(apps);
+               List<AppsResponse> atualApps = new ArrayList<AppsResponse>();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAllApps(true)).thenReturn(expectedApps);
+               atualApps = appsController.getAllApps(mockedRequest, mockedResponse);
+               assertEquals(expectedApps, atualApps);
+       }
+
+       @Test
+       public void getAllAppsExceptionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               assertNull(appsController.getAllApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAllAppsIfUserNotSuperAdminTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getAllApps(true)).thenThrow(nullPointerException);
+               assertNull(appsController.getAllApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppsFullListTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EcompApp> expectedEcompApps = new ArrayList<EcompApp>();
+
+               EcompApp ecompApp = new EcompApp();
+               ecompApp.setId((long) 1);
+               ecompApp.setName("Test_app");
+               ecompApp.setUrl("Test_URL");
+               ecompApp.setUebKey("Test_key");
+               ecompApp.setAlternateUrl("Test_alt_URL");
+               expectedEcompApps.add(ecompApp);
+               List<EcompApp> actualEcompApps = new ArrayList<EcompApp>();
+               Mockito.when(appService.getEcompAppAppsFullList()).thenReturn(expectedEcompApps);
+               actualEcompApps = appsController.getAppsFullList(mockedRequest, mockedResponse);
+               assertEquals(expectedEcompApps, actualEcompApps);
+       }
+
+//     @Test
+//     public void getAppsFullListNoUserTest() {
+//             EPUser user = null;
+//             Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+//             Mockito.when(appService.getEcompAppAppsFullList()).thenReturn(null);
+//             assertNull(appsController.getAppsFullList(mockedRequest, mockedResponse));
+//
+//     }
+
+       @Test
+       public void getUserProfileTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               UserRole userRole = new UserRole();
+               userRole.setUser_Id((long) 1);
+               userRole.setOrgUserId("guest");
+               userRole.setFirstName("Test_User_FirstName");
+               userRole.setLastName("Test_User_LastName");
+               userRole.setRoleId((long) 1);
+               userRole.setRoleName("test");
+
+               UserRoles unexpectedserAndRoles = new UserRoles(userRole);
+               unexpectedserAndRoles.setFirstName("Test_User_FirstName");
+               unexpectedserAndRoles.setLastName("Test_User_LastName");
+               unexpectedserAndRoles.setGuestSession(false);
+               unexpectedserAndRoles.setOrgUserId("guest");
+               List<String> roles = new ArrayList<String>();
+               roles.add("Test");
+               unexpectedserAndRoles.setRoles(roles);
+               Mockito.when(appService.getUserProfileNormalized(user)).thenReturn(unexpectedserAndRoles);
+               UserRoles actualUserAndRoles = appsController.getUserProfile(mockedRequest, mockedResponse);
+               assertEquals(unexpectedserAndRoles, actualUserAndRoles);
+       }
+
+       @Test
+       public void getUserProfileIfUserNullTest() throws IOException {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.getUserProfileNormalized(user)).thenReturn(null);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getUserProfileExcpetionTest() throws IOException {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(appService.getUserProfileNormalized(user)).thenThrow(nullPointerException);
+               assertNull(appsController.getUserAppsSortTypePreference(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getAppRolesTest() {
+               List<LocalRole> expectedRoleList = new ArrayList<LocalRole>();
+               LocalRole localRole = new LocalRole();
+               localRole.setRoleId(1);
+               localRole.setRolename("test");
+               expectedRoleList.add(localRole);
+               long appId = 1;
+               Mockito.when(appService.getAppRoles(appId)).thenReturn(expectedRoleList);
+               List<LocalRole> actualRoleList = appsController.getAppRoles(mockedRequest, appId);
+               assertEquals(actualRoleList, expectedRoleList);
+       }
+
+       @Test
+       public void getAppRolesExceptionTest() {
+               long appId = 1;
+               Mockito.when(appService.getAppRoles(appId)).thenThrow(nullPointerException);
+               assertNull(appsController.getAppRoles(mockedRequest, appId));
+       }
+
+       @Test
+       public void getOnboardingAppsTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<OnboardingApp> expectedOnboardingApps = new ArrayList<OnboardingApp>();
+               OnboardingApp onboardingApp = new OnboardingApp();
+               onboardingApp.setUebKey("test");
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getOnboardingApps()).thenReturn(expectedOnboardingApps);
+               List<OnboardingApp> actualOnboardingApps = appsController.getOnboardingApps(mockedRequest, mockedResponse);
+               assertEquals(expectedOnboardingApps, actualOnboardingApps);
+       }
+
+       @Test
+       public void getOnboardingAppsifSuperAdiminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               assertNull(appsController.getOnboardingApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getOnboardingAppsExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(!adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.getOnboardingApps()).thenThrow(nullPointerException);
+               assertNull(appsController.getOnboardingApps(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void putOnboardingAppTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.modifyOnboardingApp(OnboardingApp, user)).thenReturn(expectedFieldValidator);
+               FieldsValidator actualFieldValidator = appsController.putOnboardingApp(mockedRequest, OnboardingApp,
+                               mockedResponse);
+               assertEquals(expectedFieldValidator, actualFieldValidator);
+       }
+
+       @Test
+       public void putOnboardingAppIfSuperAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               FieldsValidator expectedFieldValidator = null;
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(appService.modifyOnboardingApp(OnboardingApp, user)).thenReturn(expectedFieldValidator);
+               assertNull(appsController.putOnboardingApp(mockedRequest, OnboardingApp, mockedResponse));
+       }
+
+       @Test
+       public void putOnboardingAppExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.modifyOnboardingApp(OnboardingApp, user)).thenThrow(nullPointerException);
+               assertNull(appsController.putOnboardingApp(mockedRequest, OnboardingApp, mockedResponse));
+       }
+       
+       @Test
+       public void postOnboardingAppTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.addOnboardingApp(OnboardingApp, user)).thenReturn(expectedFieldValidator);
+               FieldsValidator actualFieldValidator = appsController.postOnboardingApp(mockedRequest, OnboardingApp,
+                               mockedResponse);
+               assertEquals(expectedFieldValidator, actualFieldValidator);
+       }
+
+       @Test
+       public void postOnboardingAppIfSuperAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               FieldsValidator expectedFieldValidator = null;
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(appService.addOnboardingApp(OnboardingApp, user)).thenReturn(expectedFieldValidator);
+               assertNull(appsController.postOnboardingApp(mockedRequest, OnboardingApp, mockedResponse));
+       }
+
+       @Test
+       public void postOnboardingAppExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               OnboardingApp OnboardingApp = new OnboardingApp();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.addOnboardingApp(OnboardingApp, user)).thenThrow(nullPointerException);
+               assertNull(appsController.postOnboardingApp(mockedRequest, OnboardingApp, mockedResponse));
+       }
+       
+       @Test
+       public void deleteOnboardingAppTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               long appId = 1;
+               Mockito.when(appService.deleteOnboardingApp(user,appId )).thenReturn(expectedFieldValidator);
+               FieldsValidator actualFieldValidator = appsController.deleteOnboardingApp(mockedRequest,appId,
+                               mockedResponse);
+               assertEquals(expectedFieldValidator, actualFieldValidator);
+       }
+
+       @Test
+       public void deleteOnboardingAppIfSuperAdminTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               FieldsValidator expectedFieldValidator = null;
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               long appId = 1;
+        Mockito.when(appService.deleteOnboardingApp(user,appId)).thenReturn(expectedFieldValidator);
+               assertNull(appsController.deleteOnboardingApp(mockedRequest,appId,mockedResponse));
+       }
+
+       @Test
+       public void deleteOnboardingAppExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               long appId = 1;
+      Mockito.when(appService.deleteOnboardingApp(user,appId)).thenThrow(nullPointerException);
+               assertNull(appsController.deleteOnboardingApp(mockedRequest,appId,mockedResponse));
+       }
+       
+       @Test
+       public void getLeftMenuItemsTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               String menuList = "Test";
+               PowerMockito.mockStatic(EPUserUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Set menuSet = new HashSet<>();
+               menuSet.add(1);
+               Mockito.when(AppUtils.getSession(mockedRequest)
+                               .getAttribute(SystemProperties.getProperty(SystemProperties.APPLICATION_MENU_ATTRIBUTE_NAME))).thenReturn(menuSet);
+               Mockito.when(AppUtils.getSession(mockedRequest)
+                               .getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME))).thenReturn(menuSet);
+               Mockito.when(leftMenuService.getLeftMenuItems(user, menuSet, menuSet)).thenReturn(menuList);
+               String response = appsController.getLeftMenuItems(mockedRequest, mockedResponse);
+               assertTrue(response.equals("Test"));
+       }
+       
+       @Test
+       public void getLeftMenuItemsExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               String menuList = "Test";
+               PowerMockito.mockStatic(EPUserUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Set menuSet = new HashSet<>();
+               menuSet.add(1);
+               Mockito.when(AppUtils.getSession(mockedRequest)
+                               .getAttribute(SystemProperties.getProperty(SystemProperties.APPLICATION_MENU_ATTRIBUTE_NAME))).thenReturn(menuSet);
+               Mockito.when(AppUtils.getSession(mockedRequest)
+                               .getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME))).thenReturn(menuSet);
+               Mockito.when(leftMenuService.getLeftMenuItems(user, menuSet, menuSet)).thenThrow(nullPointerException);
+               assertNull(appsController.getLeftMenuItems(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void getAppThumbnailExceptionTest()
+       {
+               EPApp app = null;
+               assertNull(appsController.getAppThumbnail(mockedRequest, (long) 1, mockedResponse));
+       }
+       
+       @Test
+       public void getAppThumbnailTest()
+       {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppType(1);
+               app.setImageUrl("www.ecomp.com");
+               app.setThumbnail(new byte[] {1, 6, 3});
+               Mockito.when(appService.getApp((long) 1)).thenReturn(app);
+               HttpEntity<byte[]> response = appsController.getAppThumbnail(mockedRequest, (long) 1, mockedResponse);
+               assertEquals(response.getHeaders().getContentLength(), 3);
+       }
+       
+       @Test
+       public void getAppThumbnailForMediaTypePngTest()
+       {
+               
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppType(1);
+               app.setImageUrl("www.ecomp.png");
+               app.setThumbnail(new byte[] {1, 6, 3});
+               Mockito.when(appService.getApp((long) 1)).thenReturn(app);
+               PowerMockito.mockStatic(MediaType.class);
+               HttpEntity<byte[]> response = appsController.getAppThumbnail(mockedRequest, (long) 1, mockedResponse);
+               assertEquals(response.getHeaders().getContentLength(), 3);
+       }
+       
+       @Test
+       public void getUserAppsOrderBySortPrefIfUSerNullTest(){
+               List<EcompApp> listOfApps = new ArrayList<EcompApp>();
+               
+               EcompApp app = new EcompApp();
+               listOfApps.add(app);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(null);
+               assertNull(appsController.getUserAppsOrderBySortPref(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void getUserAppsOrderBySortPrefTest(){
+               List<EcompApp> listOfApps = new ArrayList<EcompApp>();
+               
+               EcompApp app = new EcompApp();
+               listOfApps.add(app);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(mockedRequest.getParameter("mparams")).thenReturn("");
+               Mockito.when(appService.transformAppsToEcompApps(appService.getAppsOrderByName(user))).thenReturn(listOfApps);
+               List<EcompApp> listOfActualApps =       appsController.getUserAppsOrderBySortPref(mockedRequest, mockedResponse);
+               assertEquals(listOfActualApps.size(), 1);
+       }
+       
+       @Test
+       public void getUserAppsOrderBySortPrefIfusrSortPrefIsMTest(){
+               List<EcompApp> listOfApps = new ArrayList<EcompApp>();
+               
+               EcompApp app = new EcompApp();
+               listOfApps.add(app);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(mockedRequest.getParameter("mparams")).thenReturn("M");
+               Mockito.when(appService.transformAppsToEcompApps(appService.getAppsOrderByName(user))).thenReturn(listOfApps);
+               List<EcompApp> listOfActualApps =       appsController.getUserAppsOrderBySortPref(mockedRequest, mockedResponse);
+               assertEquals(listOfActualApps.size(), 1);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AuditLogControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/AuditLogControllerTest.java
new file mode 100644 (file)
index 0000000..971089e
--- /dev/null
@@ -0,0 +1,102 @@
+package org.openecomp.portalapp.portal.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.AuditLogController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(EPUserUtils.class)
+public class AuditLogControllerTest {
+
+       
+       @Mock
+       AuditService auditService;
+       
+       @InjectMocks
+     AuditLogController auditLogController = new AuditLogController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       @Test
+       public void auditLogTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+       
+       @Test
+       public void auditLogTabTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "tab", "test");
+       }
+       
+       @Test
+       public void auditLogfunctionalTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "functional", "test");
+       }
+       
+       @Test
+       public void auditLogleftMenuTest()
+       {
+               PowerMockito.mockStatic(EPUserUtils.class);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "leftMenu", "test");
+       }
+       
+       @Test(expected = NumberFormatException.class)
+       public void auditLogExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(EPUserUtils.getUserId(mockedRequest)).thenReturn((int)1);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+       
+       @Test
+       public void auditLogerrorTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenThrow(nullPointerException);
+               auditLogController.auditLog(mockedRequest, "1", "app", "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BEPropertyReaderControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BEPropertyReaderControllerTest.java
new file mode 100644 (file)
index 0000000..ec8d0e7
--- /dev/null
@@ -0,0 +1,72 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.BEPropertyReaderController;
+import org.openecomp.portalapp.portal.domain.BEProperty;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
+public class BEPropertyReaderControllerTest extends MockitoTestSuite {
+
+       @InjectMocks
+       BEPropertyReaderController bEPropertyReaderController = new BEPropertyReaderController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void readPropertyTest() {
+               String key = "DOMAIN_CLASS_LOCATION";
+               BEProperty beProperty = new BEProperty("DOMAIN_CLASS_LOCATION", "domain_class_location");
+               PortalRestResponse<BEProperty> ecpectedPortalRestResponse = new PortalRestResponse<BEProperty>();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(beProperty);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               PortalRestResponse<BEProperty> actualPortalRestResponse = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty("DOMAIN_CLASS_LOCATION")).thenReturn("domain_class_location");
+               actualPortalRestResponse = bEPropertyReaderController.readProperty(mockedRequest, key);
+               assertTrue(actualPortalRestResponse.equals(ecpectedPortalRestResponse));
+
+       }
+       
+       @Test
+       public void readPropertyExceptionTest() {
+               String key =null;
+               //BEProperty beProperty = new BEProperty("DOMAIN_CLASS_LOCATION", "domain_class_location");
+               PortalRestResponse<BEProperty> ecpectedPortalRestResponse = new PortalRestResponse<BEProperty>();
+               ecpectedPortalRestResponse.setMessage("java.lang.NullPointerException");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               PortalRestResponse<BEProperty> actualPortalRestResponse = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(new BEProperty(key, SystemProperties.getProperty(key))).thenThrow(nullPointerException);
+               actualPortalRestResponse = bEPropertyReaderController.readProperty(mockedRequest, key);
+               assertTrue(actualPortalRestResponse.equals(ecpectedPortalRestResponse));
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BasicAuthAccountControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/BasicAuthAccountControllerTest.java
new file mode 100644 (file)
index 0000000..793d687
--- /dev/null
@@ -0,0 +1,264 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.BasicAuthAccountController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.BasicAuthCredentials;
+import org.openecomp.portalapp.portal.domain.EPEndpoint;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.BasicAuthAccountService;
+import org.openecomp.portalapp.portal.service.BasicAuthAccountServiceImpl;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class BasicAuthAccountControllerTest extends MockitoTestSuite {
+
+       @Mock
+       BasicAuthAccountService basicAuthAccountService = new BasicAuthAccountServiceImpl();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+
+       @InjectMocks
+       BasicAuthAccountController basicAuthAccountController = new BasicAuthAccountController();
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       MockEPUser mockUser = new MockEPUser();
+
+       public BasicAuthCredentials basicAuthCredentials() {
+               BasicAuthCredentials basicAuthCredentials = new BasicAuthCredentials();
+
+               basicAuthCredentials.setId((long) 1);
+               basicAuthCredentials.setApplicationName("test");
+               basicAuthCredentials.setUsername("Test");
+               basicAuthCredentials.setPassword("Password");
+               basicAuthCredentials.setIsActive("YES");
+
+               List<EPEndpoint> endpoints = new ArrayList<EPEndpoint>();
+
+               EPEndpoint ePEndpoint = new EPEndpoint();
+               ePEndpoint.setId((long) 1);
+               ePEndpoint.setName("Test");
+               endpoints.add(ePEndpoint);
+               basicAuthCredentials.setEndpoints(endpoints);
+
+               return basicAuthCredentials;
+
+       }
+
+       @Test
+       public void createBasicAuthAccountTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("SUCCESS");
+               expectedResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               long accountd = 1;
+
+               Mockito.when(basicAuthAccountService.saveBasicAuthAccount(basicAuthCredentials)).thenReturn(accountd);
+
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
+                               mockedResponse, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void createBasicAuthAccountAdminTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("Authorization Required");
+               expectedResponse.setResponse("Admin Only Operation! ");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
+                               mockedResponse, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void createBasicAuthAccountIfInputNullTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("FAILURE");
+               expectedResponse.setResponse("newBasicAuthAccount cannot be null or empty");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.createBasicAuthAccount(mockedRequest,
+                               mockedResponse, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void getBasicAuthAccountTest() throws Exception {
+               PortalRestResponse<List<BasicAuthCredentials>> expectedPortalResponse = new PortalRestResponse<List<BasicAuthCredentials>>();
+               List<BasicAuthCredentials> basicAuthCredentialsList = new ArrayList<BasicAuthCredentials>();
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+               basicAuthCredentialsList.add(basicAuthCredentials);
+
+               expectedPortalResponse.setMessage("Success");
+               expectedPortalResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedPortalResponse.setStatus(portalRestStatusEnum.OK);
+
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(basicAuthAccountService.getAccountData()).thenReturn(null);
+               PortalRestResponse<List<BasicAuthCredentials>> actualResponse = basicAuthAccountController
+                               .getBasicAuthAccount(mockedRequest, mockedResponse);
+               assertEquals(expectedPortalResponse, actualResponse);
+       }
+
+       @Test
+       public void getBasicAuthAccountIfSuperAdminTest() throws Exception {
+               PortalRestResponse<List<BasicAuthCredentials>> expectedPortalResponse = new PortalRestResponse<List<BasicAuthCredentials>>();
+               List<BasicAuthCredentials> basicAuthCredentialsList = new ArrayList<BasicAuthCredentials>();
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+               basicAuthCredentialsList.add(basicAuthCredentials);
+
+               expectedPortalResponse.setMessage("UnAuthorized! Admin Only Operation");
+               expectedPortalResponse.setResponse(new ArrayList<>());
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedPortalResponse.setStatus(portalRestStatusEnum.ERROR);
+
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(basicAuthAccountService.getAccountData()).thenReturn(null);
+               PortalRestResponse<List<BasicAuthCredentials>> actualResponse = basicAuthAccountController
+                               .getBasicAuthAccount(mockedRequest, mockedResponse);
+               assertEquals(expectedPortalResponse, actualResponse);
+       }
+
+       @Test
+       public void updateAccountTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("SUCCESS");
+               expectedResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               long accountd = 1;
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
+                               mockedResponse, accountd, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void updateAccountIfSuperAdminTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = basicAuthCredentials();
+
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("Authorization Required");
+               expectedResponse.setResponse("Admin Only Operation! ");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               long accountd = 1;
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
+                               mockedResponse, accountd, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void updateAccountIfInputNullTest() throws Exception {
+               BasicAuthCredentials basicAuthCredentials = null;
+
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("FAILURE");
+               expectedResponse.setResponse("BasicAuthCredentials cannot be null or empty");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               long accountd = 1;
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.updateAccount(mockedRequest,
+                               mockedResponse, accountd, basicAuthCredentials);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void deleteAccountTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("SUCCESS");
+               expectedResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.OK);
+               long accountd = 1;
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
+                               mockedResponse, accountd);
+               assertEquals(actualResponse, expectedResponse);
+       }
+
+       @Test
+       public void deleteAccountIfNotSuperAdminTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("Authorization Required");
+               expectedResponse.setResponse("Admin Only Operation! ");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedResponse.setStatus(portalRestStatusEnum.ERROR);
+               long accountd = 1;
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               PortalRestResponse<String> actualResponse = basicAuthAccountController.deleteAccount(mockedRequest,
+                               mockedResponse, accountd);
+               System.out.println(actualResponse);
+               assertEquals(actualResponse, expectedResponse);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/CommonWidgetControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/CommonWidgetControllerTest.java
new file mode 100644 (file)
index 0000000..d6d149a
--- /dev/null
@@ -0,0 +1,84 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.CommonWidgetController;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+
+public class CommonWidgetControllerTest {
+
+       @Mock
+       DashboardSearchService dashboardSearchService = new DashboardSearchServiceImpl();
+
+       @InjectMocks
+       CommonWidgetController commonWidgetController = new CommonWidgetController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getWidgetDataTest() {
+               String resourceType = "Test";
+               PortalRestResponse<CommonWidgetMeta> acutualPoratlRestResponse = null;
+               @SuppressWarnings("rawtypes")
+               PortalRestResponse ecpectedPortalRestResponse = new PortalRestResponse();
+               ecpectedPortalRestResponse.setMessage("Unexpected resource type Test");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               acutualPoratlRestResponse = commonWidgetController.getWidgetData(mockedRequest, resourceType);
+               assertTrue(acutualPoratlRestResponse.equals(ecpectedPortalRestResponse));
+
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getWidgetDataTestNew() {
+               String resourceType = "EVENTS";
+               PortalRestResponse<CommonWidgetMeta> acutualPoratlRestResponse = null;
+               @SuppressWarnings("rawtypes")
+               PortalRestResponse ecpectedPortalRestResponse = new PortalRestResponse();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               acutualPoratlRestResponse = commonWidgetController.getWidgetData(mockedRequest, resourceType);
+               assertTrue(acutualPoratlRestResponse.equals(ecpectedPortalRestResponse));
+
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getWidgetDataExceptionTest() {
+               String resourceType = "null";
+               PortalRestResponse<CommonWidgetMeta> acutualPoratlRestResponse = null;
+               @SuppressWarnings("rawtypes")
+               PortalRestResponse ecpectedPortalRestResponse = new PortalRestResponse();
+               ecpectedPortalRestResponse.setMessage("Unexpected resource type null");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               acutualPoratlRestResponse = commonWidgetController.getWidgetData(mockedRequest, resourceType);
+               assertTrue(acutualPoratlRestResponse.equals(ecpectedPortalRestResponse));
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ConsulClientControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ConsulClientControllerTest.java
new file mode 100644 (file)
index 0000000..672f421
--- /dev/null
@@ -0,0 +1,142 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.ConsulClientController;
+import org.openecomp.portalapp.portal.domain.BEProperty;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ConsulHealthService;
+import org.openecomp.portalapp.portal.service.ConsulHealthServiceImpl;
+
+import com.orbitz.consul.ConsulException;
+import com.orbitz.consul.model.health.ServiceHealth;
+
+import io.searchbox.client.config.exception.NoServerConfiguredException;
+
+public class ConsulClientControllerTest {
+
+       @Mock
+       ConsulHealthService consulHealthService = new ConsulHealthServiceImpl();
+
+       @InjectMocks
+       ConsulClientController consulClientController = new ConsulClientController();
+
+       NoServerConfiguredException noServerConfiguredException = new NoServerConfiguredException(null);
+
+       String service = "Test";
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       ConsulException consulException = new ConsulException(nullPointerException);
+
+       @Test
+       public void getServiceLocationTest() {
+               PortalRestResponse<BEProperty> ecpectedPortalRestResponse = new PortalRestResponse<BEProperty>();
+               ecpectedPortalRestResponse.setMessage("Success!");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               PortalRestResponse<String> actualPortalRestRespone = new PortalRestResponse<String>();
+               actualPortalRestRespone = consulClientController.getServiceLocation(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.equals(ecpectedPortalRestResponse));
+       }
+
+       @Test
+       public void getServiceLocationExceptionTest() {
+               PortalRestResponse<BEProperty> ecpectedPortalRestResponse = new PortalRestResponse<BEProperty>();
+               ecpectedPortalRestResponse.setMessage("Warning!");
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.WARN);
+               PortalRestResponse<String> actualPortalRestRespone = new PortalRestResponse<String>();
+               Mockito.when(consulHealthService.getServiceLocation(service, null)).thenThrow(noServerConfiguredException);
+               actualPortalRestRespone = consulClientController.getServiceLocation(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.getMessage().equals(ecpectedPortalRestResponse.getMessage()));
+               assertTrue(actualPortalRestRespone.getStatus().equals(ecpectedPortalRestResponse.getStatus()));
+
+       }
+
+       @Test
+       public void getServiceLocationExceptionConsulExceptionTest() {
+               PortalRestResponse<BEProperty> ecpectedPortalRestResponse = new PortalRestResponse<BEProperty>();
+               ecpectedPortalRestResponse.setMessage("Error!");
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               PortalRestResponse<String> actualPortalRestRespone = new PortalRestResponse<String>();
+               Mockito.when(consulHealthService.getServiceLocation(service, null)).thenThrow(consulException);
+               actualPortalRestRespone = consulClientController.getServiceLocation(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.getMessage().equals(ecpectedPortalRestResponse.getMessage()));
+               assertTrue(actualPortalRestRespone.getStatus().equals(ecpectedPortalRestResponse.getStatus()));
+       }
+
+       public PortalRestResponse<List<ServiceHealth>> successResponse() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = new PortalRestResponse<List<ServiceHealth>>();
+               List<ServiceHealth> healths = new ArrayList<ServiceHealth>();
+               ecpectedPortalRestResponse.setMessage("Success!");
+               ecpectedPortalRestResponse.setResponse(healths);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               return ecpectedPortalRestResponse;
+       }
+
+       public PortalRestResponse<List<ServiceHealth>> errorResponse() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = new PortalRestResponse<List<ServiceHealth>>();
+               List<ServiceHealth> healths = new ArrayList<ServiceHealth>();
+               ecpectedPortalRestResponse.setMessage("Error!");
+               ecpectedPortalRestResponse.setResponse(healths);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               return ecpectedPortalRestResponse;
+       }
+
+       @Test
+       public void getAllHealthyNodesTest() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = successResponse();
+               PortalRestResponse<List<ServiceHealth>> actualPortalRestRespone = new PortalRestResponse<List<ServiceHealth>>();
+               actualPortalRestRespone = consulClientController.getAllHealthyNodes(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.equals(ecpectedPortalRestResponse));
+
+       }
+
+       @Test
+       public void getAllHealthyNodesExceptionTest() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = errorResponse();
+               PortalRestResponse<List<ServiceHealth>> actualPortalRestRespone = new PortalRestResponse<List<ServiceHealth>>();
+               Mockito.when(consulHealthService.getAllHealthyNodes(service)).thenThrow(consulException);
+               actualPortalRestRespone = consulClientController.getAllHealthyNodes(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.equals(ecpectedPortalRestResponse));
+       }
+
+       @Test
+       public void getAllNodesTest() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = successResponse();
+               PortalRestResponse<List<ServiceHealth>> actualPortalRestRespone = new PortalRestResponse<List<ServiceHealth>>();
+               actualPortalRestRespone = consulClientController.getAllNodes(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.equals(ecpectedPortalRestResponse));
+       }
+
+       @Test
+       public void getAllNodesExceptionTest() {
+               PortalRestResponse<List<ServiceHealth>> ecpectedPortalRestResponse = errorResponse();
+               PortalRestResponse<List<ServiceHealth>> actualPortalRestRespone = new PortalRestResponse<List<ServiceHealth>>();
+               Mockito.when(consulHealthService.getAllNodes(service)).thenThrow(consulException);
+               actualPortalRestRespone = consulClientController.getAllNodes(mockedRequest, mockedResponse, service);
+               assertTrue(actualPortalRestRespone.equals(ecpectedPortalRestResponse));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardControllerTest.java
new file mode 100644 (file)
index 0000000..d861955
--- /dev/null
@@ -0,0 +1,427 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.DashboardController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.transport.CommonWidget;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.domain.support.CollaborateList;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EPUserUtils.class, CollaborateList.class, SystemProperties.class, EPCommonSystemProperties.class})
+public class DashboardControllerTest {
+       
+       @Mock
+       DashboardSearchService searchService = new DashboardSearchServiceImpl();
+       
+       @InjectMocks
+       DashboardController dashboardController = new DashboardController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       public CommonWidgetMeta mockCommonWidgetMeta() {
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("testhref");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("testDate");
+           commonWidget.setSortOrder(1);                   
+               widgetList.add(commonWidget);           
+               commonWidgetMeta.setItems(widgetList);
+               
+               return commonWidgetMeta;
+       }
+       
+       public CommonWidget mockCommonWidget() {
+               
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("testhref");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("testDate");
+           commonWidget.setSortOrder(1);
+           
+           return commonWidget;
+       }
+       
+       
+       @Test
+       public void getWidgetDataTest() throws IOException {
+               
+               String resourceType = null;
+               PortalRestResponse<CommonWidgetMeta> expectedData = new PortalRestResponse<CommonWidgetMeta>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Unexpected resource type null");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<CommonWidgetMeta> actualResponse =   dashboardController.getWidgetData(mockedRequest, resourceType);
+               assertEquals(expectedData,actualResponse);              
+       }       
+       
+       @Test
+       public void getWidgetDataWithValidResourceTest() throws IOException {
+               String resourceType = "EVENTS";
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory(null);
+                               
+               Mockito.when(searchService.getWidgetData(resourceType)).thenReturn(commonWidgetMeta);
+               PortalRestResponse<CommonWidgetMeta> expectedData = new PortalRestResponse<CommonWidgetMeta>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(commonWidgetMeta);
+               
+               PortalRestResponse<CommonWidgetMeta> actualResponse = dashboardController.getWidgetData(mockedRequest, resourceType);
+               System.out.println(actualResponse);
+               assertEquals(expectedData,actualResponse);
+       }
+               
+       @Test
+       public void saveWidgetDataBulkNullTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory(null);
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("ERROR");
+               expectedData.setResponse("Category cannot be null or empty");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetUnexpectedDataBulkTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory("Unexpected Data");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Unexpected resource type Unexpected Data");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+               
+       @Test
+       public void saveWidgetInvalidDataBulkTest() throws IOException {
+               CommonWidgetMeta commonWidgetMeta= mockCommonWidgetMeta();
+               commonWidgetMeta.setCategory("EVENTS");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Invalid category: test");
+               expectedData.setResponse(null);
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataBulkTest() throws IOException {
+               
+               List<CommonWidget> widgetList = new ArrayList<>();              
+               CommonWidget commonWidget = new CommonWidget("EVENTS", "http://test.com", "testTitle", "testcontent", "2017-07-01", 1);
+               widgetList.add(commonWidget);
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta("EVENTS", widgetList);
+               
+                                   
+                               
+       /*      commonWidgetMeta.setItems(widgetList);
+               
+               commonWidgetMeta.setCategory("EVENTS");*/
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("success");
+               
+               Mockito.when(searchService.saveWidgetDataBulk(commonWidgetMeta)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataNullTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget(); 
+               commonWidget.setId((long)1);
+               commonWidget.setContent("test");
+               commonWidget.setCategory(null);
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("ERROR");
+               expectedData.setResponse("Category cannot be null or empty");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+       
+       @Test
+       public void saveWidgetDataErrorTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget();         
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("Invalid category: test");
+               expectedData.setResponse(null); 
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);              
+       }
+       
+       @Test
+       public void saveWidgetDataTest() throws IOException {
+                               
+               CommonWidgetMeta commonWidgetMeta= new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();         
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("EVENTS");
+               commonWidget.setHref("http://test.com");
+               commonWidget.setTitle("testTitle");
+           commonWidget.setContent("testcontent");
+           commonWidget.setEventDate("2017-07-01");
+           commonWidget.setSortOrder(1);                   
+               widgetList.add(commonWidget);           
+               commonWidgetMeta.setItems(widgetList);
+               
+               commonWidgetMeta.setCategory("EVENTS");
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("success"); 
+               
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.saveWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+       
+       @Test
+       public void deleteWidgetDataTest() throws IOException {
+                               
+               CommonWidget commonWidget = mockCommonWidget();
+               
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(null); 
+               
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn("success");
+               
+               PortalRestResponse<String> actualResponse = dashboardController.deleteWidgetData(commonWidget);
+               assertEquals(expectedData,actualResponse);
+               
+       }
+               
+       @Test
+       public void getActiveUsersTest(){
+               List<String> activeUsers = new ArrayList<>();
+               List<String> expectedUsersList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenReturn(activeUsers);
+               expectedUsersList=      dashboardController.getActiveUsers(mockedRequest);
+               assertEquals(expectedUsersList, activeUsers);
+       }
+       
+       
+       @Test
+       public void getActiveUsersExceptionTest(){
+               List<String> activeUsers = new ArrayList<>();
+               List<String> expectedUsersList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenThrow(nullPointerException);
+               expectedUsersList = dashboardController.getActiveUsers(mockedRequest);
+               assertEquals(expectedUsersList, activeUsers);
+       }
+               
+       @Test
+       public void getOnlineUserUpdateRateTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("{onlineUserUpdateRate=1400000, onlineUserUpdateDuration=1400000}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_RATE)).thenReturn("1400"); 
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_DURATION)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getOnlineUserUpdateRate(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getOnlineUserUpdateRateExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_RATE)).thenThrow(nullPointerException); 
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.ONLINE_USER_UPDATE_DURATION)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getOnlineUserUpdateRate(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForRightMenuTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse("{windowWidth=1400}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_RIGHT_MENU)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForRightMenu(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForRightMenuExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_RIGHT_MENU)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForRightMenu(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForLeftMenuTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");             
+               expectedData.setResponse("{windowWidth=1400}"); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_LEFT_MENU)).thenReturn("1400");
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForLeftMenu(mockedRequest);
+               assertEquals(expectedData.getStatus(),actualResponse.getStatus());
+       }
+       
+       @Test
+       public void getWindowWidthThresholdForLeftMenuExceptionTest(){
+               PortalRestResponse<String> expectedData = new PortalRestResponse<String>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("java.lang.NullPointerException");
+               expectedData.setResponse(null); 
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WINDOW_WIDTH_THRESHOLD_LEFT_MENU)).thenThrow(nullPointerException);
+               
+               PortalRestResponse<Map<String, String>> actualResponse = dashboardController.getWindowWidthThresholdForLeftMenu(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+               
+       @Test
+       public void getActiveUsersNullTest(){
+               PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+               expectedData.setStatus(PortalRestStatusEnum.ERROR);
+               expectedData.setMessage("User object is null? - check logs");
+               expectedData.setResponse(new ArrayList<>()); 
+
+               PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+       @Test
+       public void activeUsersTest(){
+               EPUser user = mockUser.mockEPUser();
+               PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+               expectedData.setStatus(PortalRestStatusEnum.OK);
+               expectedData.setMessage("success");
+               expectedData.setResponse(new ArrayList<>()); 
+               PowerMockito.mockStatic(EPUserUtils.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+               assertEquals(expectedData,actualResponse);
+       }
+       
+//     @Test
+//     public void activeUsersExceptionTest(){
+//             EPUser user = mockUser.mockEPUser();
+//             user.setLoginId("test");
+//             String loginId = "abc";
+//             PortalRestResponse<List<String>> expectedData = new PortalRestResponse<List<String>>();
+//             expectedData.setStatus(PortalRestStatusEnum.ERROR);
+//             expectedData.setMessage("java.lang.NullPointerException");
+//             expectedData.setResponse(null);  
+//             
+////           PowerMockito.mockStatic(EPUserUtils.class);
+//             Mockito.when(searchService.getRelatedUsers(user.getLoginId(user.getLoginId()))).thenReturn(nullPointerException);
+//             PortalRestResponse<List<String>> actualResponse = dashboardController.activeUsers(mockedRequest);
+//             System.out.println(actualResponse);
+//             //assertEquals(expectedData,actualResponse);
+//     }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardSearchResultControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/DashboardSearchResultControllerTest.java
new file mode 100644 (file)
index 0000000..7f87c15
--- /dev/null
@@ -0,0 +1,366 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.DashboardSearchResultController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.ecomp.model.SearchResultItem;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.transport.CommonWidget;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class DashboardSearchResultControllerTest {
+
+       @Mock
+       DashboardSearchService searchService = new DashboardSearchServiceImpl();
+
+       @InjectMocks
+       DashboardSearchResultController dashboardSearchResultController = new DashboardSearchResultController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getWidgetDataTest() {
+               String resourceType = "test";
+               PortalRestResponse<CommonWidgetMeta> ecpectedPortalRestResponse = new PortalRestResponse<CommonWidgetMeta>();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               Mockito.when(searchService.getWidgetData(resourceType)).thenReturn(null);
+               PortalRestResponse<CommonWidgetMeta> acutualPoratlRestResponse = dashboardSearchResultController
+                               .getWidgetData(mockedRequest, resourceType);
+               assertEquals(acutualPoratlRestResponse, ecpectedPortalRestResponse);
+
+       }
+
+       @Test
+       public void saveWidgetDataBulkTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+
+               CommonWidgetMeta commonWidgetMeta = new CommonWidgetMeta();
+               commonWidgetMeta.setCategory("test");
+
+               List<CommonWidget> commonWidgetList = new ArrayList<CommonWidget>();
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("test_href");
+               commonWidget.setTitle("test_title");
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate(null);
+               commonWidget.setSortOrder(1);
+
+               commonWidgetList.add(commonWidget);
+
+               commonWidgetMeta.setItems(commonWidgetList);
+
+               Mockito.when(searchService.saveWidgetDataBulk(commonWidgetMeta)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+       }
+
+       @Test
+       public void saveWidgetDataBulkIfCategoryNullTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("java.text.ParseException: Unparseable date: \"1\"");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+
+               CommonWidgetMeta commonWidgetMeta = new CommonWidgetMeta();
+               commonWidgetMeta.setCategory("test");
+
+               List<CommonWidget> commonWidgetList = new ArrayList<CommonWidget>();
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId(null);
+               commonWidget.setCategory(null);
+               commonWidget.setHref(null);
+               commonWidget.setTitle(null);
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate("1");
+               commonWidget.setSortOrder(1);
+               commonWidgetList.add(commonWidget);
+               commonWidgetMeta.setItems(commonWidgetList);
+
+               Mockito.when(searchService.saveWidgetDataBulk(commonWidgetMeta)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .saveWidgetDataBulk(commonWidgetMeta);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+       }
+
+       @Test
+       public void saveWidgetDataTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("test_href");
+               commonWidget.setTitle("test_title");
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate(null);
+               commonWidget.setSortOrder(1);
+
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .saveWidgetData(commonWidget);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+
+       }
+
+       @Test
+       public void saveWidgetDataExceptionTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("ERROR");
+               ecpectedPortalRestResponse.setResponse("Cateogry cannot be null or empty");
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("");
+               commonWidget.setHref("test_href");
+               commonWidget.setTitle("test_title");
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate(null);
+               commonWidget.setSortOrder(1);
+
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .saveWidgetData(commonWidget);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+
+       }
+
+       @Test
+       public void saveWidgetDataDateErrorTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("java.text.ParseException: Unparseable date: \"1\"");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("test_href");
+               commonWidget.setTitle("test_title");
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate("1");
+               commonWidget.setSortOrder(1);
+
+               Mockito.when(searchService.saveWidgetData(commonWidget)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .saveWidgetData(commonWidget);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+
+       }
+
+       public void deleteWidgetDataTest() {
+               PortalRestResponse<String> ecpectedPortalRestResponse = new PortalRestResponse<String>();
+               ecpectedPortalRestResponse.setMessage("success");
+               ecpectedPortalRestResponse.setResponse(null);
+               ecpectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               CommonWidget commonWidget = new CommonWidget();
+               commonWidget.setId((long) 1);
+               commonWidget.setCategory("test");
+               commonWidget.setHref("test_href");
+               commonWidget.setTitle("test_title");
+               commonWidget.setContent("test_content");
+               commonWidget.setEventDate(null);
+               commonWidget.setSortOrder(1);
+               Mockito.when(searchService.deleteWidgetData(commonWidget)).thenReturn(null);
+
+               PortalRestResponse<String> actualPortalRestResponse = dashboardSearchResultController
+                               .deleteWidgetData(commonWidget);
+               System.out.println(actualPortalRestResponse);
+               assertEquals(actualPortalRestResponse, ecpectedPortalRestResponse);
+       }
+
+       @Test
+       public void searchPortalIfUserIsNull() {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String searchString = "test";
+
+               PortalRestResponse<Map<String, List<SearchResultItem>>> expectedResult = new PortalRestResponse<Map<String, List<SearchResultItem>>>();
+               expectedResult.setMessage("searchPortal: User object is null? - check logs");
+               expectedResult.setResponse(new HashMap<String, List<SearchResultItem>>());
+               expectedResult.setStatus(PortalRestStatusEnum.ERROR);
+               PortalRestResponse<Map<String, List<SearchResultItem>>> actualResult = dashboardSearchResultController
+                               .searchPortal(mockedRequest, searchString);
+               assertEquals(expectedResult, actualResult);
+       }
+
+       @Test
+       public void searchPortalIfSearchStringNullTest() {
+               EPUser user = mockUser.mockEPUser();
+               ;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String searchString = null;
+
+               PortalRestResponse<Map<String, List<SearchResultItem>>> expectedResult = new PortalRestResponse<Map<String, List<SearchResultItem>>>();
+               expectedResult.setMessage("searchPortal: String string is null");
+               expectedResult.setResponse(new HashMap<String, List<SearchResultItem>>());
+               expectedResult.setStatus(PortalRestStatusEnum.ERROR);
+
+               PortalRestResponse<Map<String, List<SearchResultItem>>> actualResult = dashboardSearchResultController
+                               .searchPortal(mockedRequest, searchString);
+               assertEquals(expectedResult, actualResult);
+       }
+
+       @Test
+       public void searchPortalIfSearchTest() {
+               EPUser user = mockUser.mockEPUser();
+               ;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String searchString = "test";
+               List<SearchResultItem> searchResultItemList = new ArrayList<SearchResultItem>();
+               SearchResultItem searchResultItem = new SearchResultItem();
+
+               searchResultItem.setId((long) 1);
+               searchResultItem.setCategory("test");
+               searchResultItem.setName("test_name");
+               searchResultItem.setTarget("test_target");
+               searchResultItem.setUuid("test_UUId");
+               searchResultItemList.add(searchResultItem);
+               Map<String, List<SearchResultItem>> expectedResultMap = new HashMap<String, List<SearchResultItem>>();
+               expectedResultMap.put(searchString, searchResultItemList);
+
+               PortalRestResponse<Map<String, List<SearchResultItem>>> expectedResult = new PortalRestResponse<Map<String, List<SearchResultItem>>>();
+               expectedResult.setMessage("success");
+               expectedResult.setResponse(expectedResultMap);
+               expectedResult.setStatus(PortalRestStatusEnum.OK);
+
+               Mockito.when(searchService.searchResults(user.getLoginId(), searchString)).thenReturn(expectedResultMap);
+               PortalRestResponse<Map<String, List<SearchResultItem>>> actualResult = dashboardSearchResultController
+                               .searchPortal(mockedRequest, searchString);
+               assertEquals(expectedResult, actualResult);
+
+       }
+
+       @Test
+       public void searchPortalIfSearchExcptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               ;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String searchString = "test";
+
+               PortalRestResponse<Map<String, List<SearchResultItem>>> expectedResult = new PortalRestResponse<Map<String, List<SearchResultItem>>>();
+               expectedResult.setMessage("null - check logs.");
+               expectedResult.setResponse(new HashMap<String, List<SearchResultItem>>());
+               expectedResult.setStatus(PortalRestStatusEnum.ERROR);
+
+               Mockito.when(searchService.searchResults(user.getLoginId(), searchString)).thenThrow(nullPointerException);
+               PortalRestResponse<Map<String, List<SearchResultItem>>> actualResult = dashboardSearchResultController
+                               .searchPortal(mockedRequest, searchString);
+               assertEquals(expectedResult, actualResult);
+       }
+
+       @Test
+       public void getActiveUsersTest() {
+               List<String> expectedActiveUsers = new ArrayList<String>();
+               EPUser user = mockUser.mockEPUser();
+               ;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenReturn(expectedActiveUsers);
+               List<String> actualOnlineUsers = dashboardSearchResultController.getActiveUsers(mockedRequest);
+               assertEquals(expectedActiveUsers, actualOnlineUsers);
+
+       }
+
+       @Test
+       public void getActiveUsersExceptionTest() {
+               List<String> expectedActiveUsers = new ArrayList<String>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               String userId = user.getOrgUserId();
+               Mockito.when(searchService.getRelatedUsers(userId)).thenThrow(nullPointerException);
+               List<String> actualOnlineUsers = dashboardSearchResultController.getActiveUsers(mockedRequest);
+               assertEquals(expectedActiveUsers, actualOnlineUsers);
+
+       }
+
+       @Test
+       public void activeUsersTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<List<String>> expectedResult = new PortalRestResponse<List<String>>();
+               expectedResult.setMessage("success");
+               expectedResult.setResponse(new ArrayList<>());
+               expectedResult.setStatus(PortalRestStatusEnum.OK);
+               PortalRestResponse<List<String>> actualResult = dashboardSearchResultController.activeUsers(mockedRequest);
+
+               assertEquals(actualResult, expectedResult);
+
+       }
+
+       @Test
+       public void activeUsersIfUserNullTest() {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<List<String>> expectedResult = new PortalRestResponse<List<String>>();
+               expectedResult.setMessage("User object is null? - check logs");
+               expectedResult.setResponse(new ArrayList<>());
+               expectedResult.setStatus(PortalRestStatusEnum.ERROR);
+               PortalRestResponse<List<String>> actualResult = dashboardSearchResultController.activeUsers(mockedRequest);
+               assertEquals(actualResult, expectedResult);
+
+       }
+
+       @Test
+       public void activeUsersExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<List<String>> expectedResult = new PortalRestResponse<List<String>>();
+               expectedResult.setMessage("null - check logs.");
+               expectedResult.setResponse(new ArrayList<>());
+               expectedResult.setStatus(PortalRestStatusEnum.ERROR);
+               Mockito.when(searchService.getRelatedUsers(user.getLoginId())).thenThrow(nullPointerException);
+               PortalRestResponse<List<String>> actualResult = dashboardSearchResultController.activeUsers(mockedRequest);
+               assertEquals(actualResult, expectedResult);
+
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/EPFusionBaseControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/EPFusionBaseControllerTest.java
new file mode 100644 (file)
index 0000000..e6db1d0
--- /dev/null
@@ -0,0 +1,63 @@
+//package org.openecomp.portalapp.portal.test.controller;
+//
+//import java.util.HashMap;
+//import java.util.Map;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//
+//import org.junit.Before;
+//import org.junit.Test;
+//import org.junit.runner.RunWith;
+//import org.mockito.InjectMocks;
+//import org.mockito.Mock;
+//import org.mockito.Mockito;
+//import org.mockito.MockitoAnnotations;
+//import org.openecomp.portalapp.controller.EPFusionBaseController;
+//import org.openecomp.portalapp.portal.core.MockEPUser;
+//import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+//import org.openecomp.portalapp.portal.service.DashboardSearchService;
+//import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+//import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+//import org.openecomp.portalapp.util.EPUserUtils;
+//import org.openecomp.portalsdk.core.util.SystemProperties;
+//import org.powermock.api.mockito.PowerMockito;
+//import org.powermock.core.classloader.annotations.PrepareForTest;
+//import org.powermock.modules.junit4.PowerMockRunner;
+//
+//@RunWith(PowerMockRunner.class)
+//@PrepareForTest({EPUserUtils.class, SystemProperties.class})
+//public class EPFusionBaseControllerTest {
+//
+//     @Mock
+//     DashboardSearchService searchService = new DashboardSearchServiceImpl();
+//     
+//     @InjectMocks
+//     EPFusionBaseController epFusionBaseController; /*= mock(EPFusionBaseController.class);*/
+//
+//     @Before
+//     public void setup() {
+//             MockitoAnnotations.initMocks(this);
+//     }
+//
+//     MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+//
+//     HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+//     HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+//
+//     NullPointerException nullPointerException = new NullPointerException();
+//     
+//     MockEPUser mockUser = new MockEPUser();
+//     
+//     @Test
+//     public void messagesTest(){
+//             Map<String, Object> expectedData = new HashMap<String, Object>();
+//             Map<String, Object> actualData = null;
+//             
+//             PowerMockito.mockStatic(SystemProperties.class);
+//             Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.APPLICATION_MENU_ATTRIBUTE_NAME)).then(null);
+//             actualData = epFusionBaseController.messages(mockedRequest);
+//             System.out.println();
+//             
+//     }
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAccessRolesControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAccessRolesControllerTest.java
new file mode 100644 (file)
index 0000000..8196224
--- /dev/null
@@ -0,0 +1,532 @@
+package org.openecomp.portalapp.portal.controller;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesService;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesServiceImpl;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalsdk.core.domain.AuditLog;
+import org.openecomp.portalsdk.core.domain.Role;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
+public class ExternalAccessRolesControllerTest {
+
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService = new ExternalAccessRolesServiceImpl();
+
+       @InjectMocks
+       ExternalAccessRolesController externalAccessRolesController = new ExternalAccessRolesController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       @Mock
+       AuditLog auditLog = new AuditLog();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Failed");
+
+       MockEPUser mockUser = new MockEPUser();
+       String loginId = "guestT";
+       String uebKey = "testUebKey";
+
+       @Test
+       public void getUserTest() throws Exception {
+                List<EPUser> userList = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getUser(loginId)).thenReturn(userList);
+               assertNull(externalAccessRolesController.getUser(mockedRequest, mockedResponse, loginId));
+       }
+
+       @Test
+       public void getUserExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getUser(loginId))
+                               .thenThrow(nullPointerException);
+               assertNull(externalAccessRolesController.getUser(mockedRequest, mockedResponse, loginId));
+       }
+       
+       public EPApp mockApp()
+       {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+       
+       @Test
+       public void getRolesForAppTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               Mockito.when(externalAccessRolesService.getRolesForApp(mockedRequest.getHeader(uebKey))).thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRolesForApp(mockedRequest, mockedResponse), answer);
+       }
+
+       @Test
+       public void getRolesForAppExceptionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               Mockito.when(externalAccessRolesService.getRolesForApp(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRolesForApp(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getRoleFunctionsListTest() throws Exception {
+               List<CentralRoleFunction> answer = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getRoleFuncList(mockedRequest.getHeader(uebKey))).thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRoleFunctionsList(mockedRequest, mockedResponse), answer);
+       }
+
+       @Test
+       public void getRoleFunctionsListExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getRoleFuncList(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleFunctionsList(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void getRoleInfoTest() throws Exception {
+               CentralRole answer = new CentralRole();
+               long roleId = 1;
+               Mockito.when(externalAccessRolesService.getRoleInfo(roleId, mockedRequest.getHeader(uebKey)))
+                               .thenReturn(answer);
+               assertEquals(externalAccessRolesController.getRoleInfo(mockedRequest, mockedResponse, roleId), answer);
+       }
+
+       @Test
+       public void getRoleInfoExceptionTest() throws Exception {
+               long roleId = 1;
+               Mockito.when(externalAccessRolesService.getRoleInfo(roleId, mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleInfo(mockedRequest, mockedResponse, roleId));
+       }
+
+       @Test
+       public void getRoleFunctionTest() throws Exception {
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               String code = "test_menu";
+               Mockito.when(externalAccessRolesService.getRoleFunction(code, mockedRequest.getHeader(uebKey)))
+                               .thenReturn(centralRoleFunction);
+               assertEquals(externalAccessRolesController.getRoleFunction(mockedRequest, mockedResponse, code),
+                               centralRoleFunction);
+       }
+
+       @Test
+       public void getRoleFunctionExceptionTest() throws Exception {
+               String code = "test_menu";
+               Mockito.when(externalAccessRolesService.getRoleFunction(code, mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getRoleFunction(mockedRequest, mockedResponse, code));
+       }
+
+       @Test
+       public void saveRoleFunctionIfIsIsNotDeletedTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenReturn(false);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionExceptionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenThrow(nullPointerException);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               System.out.println(portalRestResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionTest() throws Exception {
+               List<EPApp> applicationList = new ArrayList<EPApp>();
+               List<CentralRole> answer = new ArrayList<>();
+               EPApp app = mockApp();
+               applicationList.add(app);
+               Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader(uebKey))).thenReturn(applicationList);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               String data = null;
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               Mockito.when(externalAccessRolesService.saveCentralRoleFunction(centralRoleFunction, app)).thenReturn(true);
+               portalRestResponse = externalAccessRolesController.saveRoleFunction(mockedRequest, mockedResponse, data);
+               System.out.println(portalRestResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+//     @Test
+//     public void deleteRoleFunctionTest() throws Exception {
+//             PortalRestResponse<String> portalRestResponse = null;
+//             PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+//             expectedportalRestResponse.setMessage("Successfully Deleted");
+//             expectedportalRestResponse.setResponse("Success");
+//             PortalRestStatusEnum portalRestStatusEnum = null;
+//             EPUser user = mockUser.mockEPUser();
+//             EPApp app = mockApp();
+//             expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+//             String code ="testNew";
+//             Mockito.when(externalAccessRolesService.getUser(mockedRequest.getHeader("LOGIN_ID"))).thenReturn((List<EPUser>) user);
+//             Mockito.when(externalAccessRolesService.getApp(mockedRequest.getHeader("UEBKEY")).get(0)).thenReturn(app);
+//             Mockito.when(externalAccessRolesService.deleteCentralRoleFunction(code, app)).thenReturn(true);
+//             portalRestResponse = externalAccessRolesController.deleteRoleFunction(mockedRequest, mockedResponse, code);
+//             assertEquals(portalRestResponse, expectedportalRestResponse);
+//     }
+
+       @Test
+       public void getActiveRolesTest() throws Exception {
+               List<CentralRole> cenRole = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getActiveRoles(mockedRequest.getHeader(uebKey))).thenReturn(cenRole);
+               List<CentralRole> expectedCenRole = externalAccessRolesController.getActiveRoles(mockedRequest, mockedResponse);
+               assertEquals(expectedCenRole, cenRole);
+       }
+
+       @Test
+       public void getActiveRolesExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getActiveRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getActiveRoles(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void deleteDependcyRoleRecordExceptionTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to deleteDependencyRoleRecord");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               long roleId = 123;
+               portalRestResponse = externalAccessRolesController.deleteDependencyRoleRecord(mockedRequest, mockedResponse, roleId);
+               assertEquals(expectedportalRestResponse, portalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadFunctionsTest() throws Exception {
+               Integer result = 0;
+               Mockito.when(externalAccessRolesService.bulkUploadFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               portalRestResponse = externalAccessRolesController.bulkUploadFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadFunctionsExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadFunctions");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRolesTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadRoles(mockedRequest.getHeader(uebKey))).thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRolesTestException() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadRoles");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRoleFunctionsTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadRolesFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoleFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadRoleFunctionsException() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadRolesFunctions(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadRoleFunctions");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadRoleFunctions(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadUserRolesTest() throws Exception {
+               Integer result = 0;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added: 0");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               Mockito.when(externalAccessRolesService.bulkUploadUserRoles(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(result);
+               portalRestResponse = externalAccessRolesController.bulkUploadUserRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadUserRolesExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.bulkUploadUserRoles(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to bulkUploadUserRoles");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.bulkUploadUserRoles(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void bulkUploadPartnerFunctionsTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerFunctions(mockedRequest, mockedResponse, null);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+
+       @Test
+       public void bulkUploadPartnerRolesTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoles(mockedRequest, mockedResponse,
+                               upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+
+        @Test
+        public void bulkUploadPartnerRolesExceptionTest() throws Exception
+        {
+                ExternalAccessRolesService externalAccessRolesService = null;
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoles(mockedRequest, mockedResponse,
+                               upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+        }
+
+       @Test
+       public void getMenuFunctionsTest() throws Exception {
+               List<String> functionsList = new ArrayList<>();
+               Mockito.when(externalAccessRolesService.getMenuFunctionsList(mockedRequest.getHeader(uebKey)))
+                               .thenReturn(functionsList);
+               List<String> expectedFunctionsList = externalAccessRolesController.getMenuFunctions(mockedRequest,
+                               mockedResponse);
+               assertEquals(functionsList, expectedFunctionsList);
+       }
+
+       @Test
+       public void getMenuFunctionsExceptionTest() throws Exception {
+               Mockito.when(externalAccessRolesService.getMenuFunctionsList(mockedRequest.getHeader(uebKey)))
+                               .thenThrow(httpClientErrorException);
+               assertNull(externalAccessRolesController.getMenuFunctions(mockedRequest, mockedResponse));
+       }
+
+//     @Test
+//     public void getUsersOfApplicationTest() throws Exception {
+//             List<String> users = new ArrayList<>();
+//             Mockito.when(externalAccessRolesService.getAllUsers(mockedRequest.getHeader(uebKey))).thenReturn(users);
+//             List<String> expectedusers = externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse);
+//             assertEquals(users, expectedusers);
+//     }
+
+//     @Test
+//     public void getUsersOfApplicationExceptionTest() throws Exception {
+//             Mockito.when(externalAccessRolesService.getAllUsers(mockedRequest.getHeader(uebKey)))
+//                             .thenThrow(httpClientErrorException);
+//             assertNull(externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse));
+//     }
+       
+       @Test
+       public void saveRoleExceptionTest() throws Exception {
+               Role role = new Role();
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to saveRole");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.saveRole(mockedRequest, mockedResponse,role);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void deleteRoleExceptionTest() throws Exception {
+               String role = "TestNew";
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Failed to deleteRole for 'TestNew'");
+               expectedportalRestResponse.setResponse("Failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               portalRestResponse = externalAccessRolesController.deleteRole(mockedRequest, mockedResponse,role);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       
+       @Test
+       public void bulkUploadPartnerRoleFunctionsTest() throws Exception {
+               PortalRestResponse<String> portalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Successfully added");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<Role> upload = new ArrayList<>();
+               portalRestResponse = externalAccessRolesController.bulkUploadPartnerRoleFunctions(mockedRequest, mockedResponse,upload);
+               assertEquals(portalRestResponse, expectedportalRestResponse);
+       }
+       
+       @Test
+       public void getUsersOfApplicationTest() throws Exception
+       {
+               List<EcompUser> users = new ArrayList<>();
+               EcompUser user = new EcompUser();
+               user.setOrgUserId("guestT");
+               users.add(user);
+               Mockito.when(externalAccessRolesService.getAllAppUsers(mockedRequest.getHeader(uebKey))).thenReturn(users);
+               List<EcompUser> expectedUsers =         externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse);
+               assertEquals(expectedUsers, users);
+       }
+       
+       @Test(expected = Exception.class)
+       public void getUsersOfApplicationExceptionTest() throws Exception
+       {
+               List<EcompUser> users = new ArrayList<>();
+               EcompUser user = new EcompUser();
+               user.setOrgUserId("guestT");
+               users.add(user);
+               Mockito.when(externalAccessRolesService.getAllAppUsers(mockedRequest.getHeader(uebKey))).thenThrow(nullPointerException);
+               assertNull(externalAccessRolesController.getUsersOfApplication(mockedRequest, mockedResponse));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAppsRestfulControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ExternalAppsRestfulControllerTest.java
new file mode 100644 (file)
index 0000000..9bc4417
--- /dev/null
@@ -0,0 +1,174 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.ExternalAppsRestfulController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.EPLoginService;
+import org.openecomp.portalapp.portal.service.EPLoginServiceImpl;
+import org.openecomp.portalapp.portal.service.EPRoleService;
+import org.openecomp.portalapp.portal.service.EPRoleServiceImpl;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.service.UserNotificationService;
+import org.openecomp.portalapp.portal.service.UserNotificationServiceImpl;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.MDC;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ MDC.class, EPCommonSystemProperties.class })
+public class ExternalAppsRestfulControllerTest {
+
+       @InjectMocks
+       ExternalAppsRestfulController externalAppsRestfulController = new ExternalAppsRestfulController();
+       @Mock
+       FunctionalMenuService functionalMenuService = new FunctionalMenuServiceImpl();
+
+       @Mock
+       EPLoginService epLoginService = new EPLoginServiceImpl();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+
+       @Mock
+       UserNotificationService userNotificationService = new UserNotificationServiceImpl();
+
+       @Mock
+       EPRoleService epRoleService = new EPRoleServiceImpl();
+
+       @Mock
+       EcompPortalUtils EcompPortalUtils = new EcompPortalUtils();
+       
+       @Mock
+       DataAccessService DataAccessService = new DataAccessServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       MockEPUser mockUser = new MockEPUser();
+
+        @Test(expected = Exception.class)
+        public void getFunctionalMenuItemsForUserIfUSerNullTest() throws
+        Exception
+        {
+        PowerMockito.mockStatic(EPCommonSystemProperties.class);
+        PowerMockito.mockStatic(MDC.class);
+        EPUser epUser = null;
+        String loginId = "guestT";
+        Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+        Mockito.when(epLoginService.findUserWithoutPwd(loginId)).thenReturn(epUser);
+        externalAppsRestfulController.getFunctionalMenuItemsForUser(mockedRequest,
+        mockedResponse);
+        }
+       
+       @Test
+       public void getFunctionalMenuItemsForUserIfSuperAdminTest() throws Exception {
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(MDC.class);
+               EPUser epUser = mockUser.mockEPUser();
+               epUser.setId((long) 1);
+               epUser.setLoginId("guestT");
+               String loginId = "guestT";
+               Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+               Mockito.when(epLoginService.findUserWithoutPwd(loginId)).thenReturn(epUser);
+               List<FunctionalMenuItem> expectedList = new ArrayList<FunctionalMenuItem>();
+               FunctionalMenuItem functionalMenuItem = new FunctionalMenuItem();
+               expectedList.add(functionalMenuItem);
+               Mockito.when(mockedRequest.getHeader("LoginId")).thenReturn("guestT");
+               Mockito.when(adminRolesService.isSuperAdmin(epUser)).thenReturn(true);
+               Mockito.when(functionalMenuService.getFunctionalMenuItems()).thenReturn(expectedList);
+               List<FunctionalMenuItem> actualList = externalAppsRestfulController.getFunctionalMenuItemsForUser(mockedRequest,
+                               mockedResponse);
+               assertNull(actualList.get(0).menuId);
+       }
+
+       @Test
+       public void getFunctionalMenuItemsForUserTest() throws Exception {
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(MDC.class);
+               EPUser epUser = mockUser.mockEPUser();
+               epUser.setId((long) 1);
+               epUser.setLoginId("guestT");
+               String loginId = "guestT";
+               Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+               Mockito.when(epLoginService.findUserWithoutPwd(loginId)).thenReturn(epUser);
+               List<FunctionalMenuItem> expectedList = new ArrayList<FunctionalMenuItem>();
+               FunctionalMenuItem functionalMenuItem = new FunctionalMenuItem();
+               expectedList.add(functionalMenuItem);
+               Mockito.when(mockedRequest.getHeader("LoginId")).thenReturn("guestT");
+               Mockito.when(adminRolesService.isSuperAdmin(epUser)).thenReturn(false);
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForUser(epUser.getOrgUserId()))
+                               .thenReturn(expectedList);
+               List<FunctionalMenuItem> actualList = externalAppsRestfulController.getFunctionalMenuItemsForUser(mockedRequest,
+                               mockedResponse);
+               assertNull(actualList.get(0).menuId);
+       }
+
+       @Test(expected = Exception.class)
+       public void getFavoritesForUserIfUserNullTest() throws Exception {
+               List<FavoritesFunctionalMenuItemJson> favorites = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               FavoritesFunctionalMenuItemJson favoritesFunctionalMenuItemJson = new FavoritesFunctionalMenuItemJson();
+               favorites.add(favoritesFunctionalMenuItemJson);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(MDC.class);
+               Mockito.when(mockedRequest.getHeader(EPCommonSystemProperties.MDC_LOGIN_ID)).thenReturn("Login_URL");
+               Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+               EPUser epUser = null;
+               externalAppsRestfulController.getFavoritesForUser(mockedRequest, mockedResponse);
+       }
+
+       @Test
+       public void getFavoritesForUserTest() throws Exception {
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(MDC.class);
+               EPUser epUser = mockUser.mockEPUser();
+               epUser.setId((long) 1);
+               epUser.setLoginId("guestT");
+               String loginId = "guestT";
+               Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+               List<FavoritesFunctionalMenuItemJson> favorites = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               FavoritesFunctionalMenuItemJson favoritesFunctionalMenuItemJson = new FavoritesFunctionalMenuItemJson();
+               favorites.add(favoritesFunctionalMenuItemJson);
+               Mockito.when(mockedRequest.getHeader(EPCommonSystemProperties.MDC_LOGIN_ID)).thenReturn("Login_URL");
+               Mockito.when(MDC.get(EPCommonSystemProperties.PARTNER_NAME)).thenReturn("Test");
+               Mockito.when(epLoginService.findUserWithoutPwd("Login_URL")).thenReturn(epUser);
+               Mockito.when(functionalMenuService.getFavoriteItems(epUser.getId())).thenReturn(favorites);
+               List<FavoritesFunctionalMenuItemJson> actaulFavorites = externalAppsRestfulController
+                               .getFavoritesForUser(mockedRequest, mockedResponse);
+               assertEquals(actaulFavorites.size(), 1);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/FunctionalMenuControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/FunctionalMenuControllerTest.java
new file mode 100644 (file)
index 0000000..af0a588
--- /dev/null
@@ -0,0 +1,506 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.openecomp.portalapp.portal.controller.FunctionalMenuController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.service.SearchService;
+import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;
+import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRolesList;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItemWithRoles;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
+public class FunctionalMenuControllerTest extends MockitoTestSuite {
+
+       String userid = "ab1234";
+
+       @Mock
+       FunctionalMenuService functionalMenuService = new FunctionalMenuServiceImpl();
+
+       @InjectMocks
+       FunctionalMenuController functionalMenuController = new FunctionalMenuController();
+
+       @Mock
+       private DataAccessService dataAccessService;
+       
+       @Mock
+       SearchService searchService;
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       @InjectMocks
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       @Mock
+       EPUser epuser;
+
+       MockEPUser mockUser = new MockEPUser();
+
+       List<BusinessCardApplicationRolesList> appRoles = new ArrayList<BusinessCardApplicationRolesList>();
+       List<BusinessCardApplicationRolesList> appRolesActual = new ArrayList<BusinessCardApplicationRolesList>();
+
+       List<BusinessCardApplicationRole> userAppRoleList = new ArrayList<BusinessCardApplicationRole>();
+
+       public List<BusinessCardApplicationRole> mockBusinessCardApplicationRole() {
+               List<BusinessCardApplicationRole> userAppRoleList = new ArrayList<BusinessCardApplicationRole>();
+
+               BusinessCardApplicationRole businessCardApplicationRole = new BusinessCardApplicationRole();
+               businessCardApplicationRole.setRoleName("ADMIN");
+               businessCardApplicationRole.setAppName("ASDC");
+
+               BusinessCardApplicationRole businessCardApplicationRole1 = new BusinessCardApplicationRole();
+               businessCardApplicationRole1.setAppName("ASDC");
+               businessCardApplicationRole1.setRoleName("Tester");
+
+               userAppRoleList.add(businessCardApplicationRole);
+               userAppRoleList.add(businessCardApplicationRole1);
+               return userAppRoleList;
+       }
+
+       public List<BusinessCardApplicationRolesList> mockBusinessCardApplicationRolesList() {
+               List<BusinessCardApplicationRolesList> appRolesActual = new ArrayList<BusinessCardApplicationRolesList>();
+
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = new BusinessCardApplicationRolesList();
+               businessCardApplicationRolesList.setAppName("ASDC");
+
+               List<String> roleNames = new ArrayList<String>();
+               roleNames.add("ADMIN");
+               roleNames.add("Tester");
+               businessCardApplicationRolesList.setRoleNames(roleNames);
+
+               appRolesActual.add(businessCardApplicationRolesList);
+               return appRolesActual;
+       }
+
+       @Test
+       public void getAppListTestIfAppAlredyExistsBusinessCardApplicationRolesList() throws IOException {
+
+               userAppRoleList = mockBusinessCardApplicationRole();
+               appRolesActual = mockBusinessCardApplicationRolesList();
+
+               Mockito.when(functionalMenuService.getUserAppRolesList(userid)).thenReturn(userAppRoleList);
+
+               appRoles = functionalMenuController.getAppList(mockedRequest, userid);
+
+               assertEquals(appRolesActual.size(), appRoles.size());
+               assertEquals(appRolesActual.get(0).getAppName(), appRoles.get(0).getAppName());
+               assertEquals(appRolesActual.get(0).getRoleNames(), appRoles.get(0).getRoleNames());
+
+       }
+
+       @Test
+       public void getAppListTestIfAppDoesnotExistsInBusinessCardApplicationRolesList() throws IOException {
+
+               userAppRoleList = mockBusinessCardApplicationRole();
+               BusinessCardApplicationRole businessCardApplicationRole = new BusinessCardApplicationRole();
+               businessCardApplicationRole.setAppName("CCD");
+               businessCardApplicationRole.setRoleName("ADMIN");
+               userAppRoleList.add(businessCardApplicationRole);
+               appRolesActual = mockBusinessCardApplicationRolesList();
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = new BusinessCardApplicationRolesList();
+               businessCardApplicationRolesList.setAppName("CCD");
+               List<String> roleNames1 = new ArrayList<String>();
+               roleNames1.add("ADMIN");
+               businessCardApplicationRolesList.setRoleNames(roleNames1);
+               appRolesActual.add(businessCardApplicationRolesList);
+               Mockito.when(functionalMenuService.getUserAppRolesList(userid)).thenReturn(userAppRoleList);
+               appRoles = functionalMenuController.getAppList(mockedRequest, userid);
+               assertEquals(appRolesActual.size(), appRoles.size());
+               assertEquals(appRolesActual.get(0).getAppName(), appRoles.get(0).getAppName());
+               assertEquals(appRolesActual.get(0).getRoleNames(), appRoles.get(0).getRoleNames());
+               assertEquals(appRolesActual.get(1).getAppName(), appRoles.get(1).getAppName());
+               assertEquals(appRolesActual.get(1).getRoleNames(), appRoles.get(1).getRoleNames());
+
+       }
+
+       @Test
+       public void regenerateAncestorTableTest() {
+               EPUser user = mockUser.mockEPUser();
+
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               FieldsValidator acutualFieldValidator = null;
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(fields);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(!adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(functionalMenuService.regenerateAncestorTable()).thenReturn(expectedFieldValidator);
+               acutualFieldValidator = functionalMenuController.regenerateAncestorTable(mockedRequest, mockedResponse);
+               assertTrue(acutualFieldValidator.equals(expectedFieldValidator));
+       }
+       
+       @Test
+       public void getFunctionalMenuStaticInfoExceptionTest(){
+               String fnMenuStaticactualResponse = null;
+               String fnMenuStaticexpectedResponse = null;
+               String orgUserIdStr = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(searchService.searchUserByUserId(orgUserIdStr)).thenReturn(user);  
+               fnMenuStaticactualResponse = functionalMenuController.getFunctionalMenuStaticInfo(mockedRequest, mockedResponse);
+               
+               assertEquals(fnMenuStaticactualResponse, fnMenuStaticexpectedResponse);
+               
+       }
+       
+       @Test
+       public void getFunctionalMenuStaticInfoTest(){
+               String fnMenuStaticactualResponse = null;
+               String fnMenuStaticexpectedResponse = "{\"firstName\":\"test\",\"lastName\":\"test\",\"last_login\":\"09/08/2017 03:48:13-0400\",\"userId\":\"guestT\",\"email\":\"test\"}";
+               String orgUserIdStr = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               user.setEmail("test");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(searchService.searchUserByUserId(orgUserIdStr)).thenReturn(user);  
+               fnMenuStaticactualResponse = functionalMenuController.getFunctionalMenuStaticInfo(mockedRequest, mockedResponse);
+               assertEquals(fnMenuStaticactualResponse.length(), fnMenuStaticexpectedResponse.length());               
+       }
+       
+       @Test
+       public void getMenuItemsForAuthUserNullTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = null;
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForAuthUserIsSuperAdminTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = new ArrayList<FunctionalMenuItem>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
+
+       @Test
+       public void getMenuItemsForAuthUserTest(){
+               List<FunctionalMenuItem> actualmenuItems = null;
+               List<FunctionalMenuItem> expectedmenuItems = new ArrayList<FunctionalMenuItem>();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               
+               actualmenuItems = functionalMenuController.getMenuItemsForAuthUser(mockedRequest, mockedResponse);
+               assertEquals(actualmenuItems, expectedmenuItems);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsBadPermissionTest(){
+               Integer menuId = 1234;
+               FunctionalMenuItem actualmenuItem = null;
+               FunctionalMenuItem expectedmenuItem = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               
+               actualmenuItem = functionalMenuController.getFunctionalMenuItemDetails(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualmenuItem, expectedmenuItem);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsTest(){
+               Integer menuId = 1234;
+               FunctionalMenuItem actualmenuItem = null;
+               FunctionalMenuItem expectedmenuItem = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItemDetails(menuId)).thenReturn(actualmenuItem);    
+               
+               actualmenuItem = functionalMenuController.getFunctionalMenuItemDetails(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualmenuItem, expectedmenuItem);
+       }
+       
+       @Test
+       public void getMenuItemsForEditingTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItems(true)).thenReturn(actualMenuItems);   
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForEditing(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForEditingBadPermissionsTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);   
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.getFunctionalMenuItems(true)).thenReturn(actualMenuItems);   
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForEditing(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForNotificationsTest(){
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = new ArrayList<FunctionalMenuItem>();
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForNotificationTree(false)).thenReturn(actualMenuItems);       
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForNotifications(mockedRequest, mockedResponse);
+               assertEquals(actualMenuItems, expectedMenuItems);
+       }
+       
+       @Test
+       public void getMenuItemsForAppTest(){
+               Integer appId = 1234;
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForApp(appId)).thenReturn(actualMenuItems);
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForApp(mockedRequest, appId);
+               assertEquals(actualMenuItems, expectedMenuItems);               
+       }
+       
+       @Test
+       public void getMenuItemsForUserTest(){
+               String orgUserId ="test";
+               List<FunctionalMenuItem> actualMenuItems = null;
+               List<FunctionalMenuItem> expectedMenuItems = null;
+               Mockito.when(functionalMenuService.getFunctionalMenuItemsForUser(orgUserId)).thenReturn(actualMenuItems);                
+               
+               actualMenuItems = functionalMenuController.getMenuItemsForUser(mockedRequest, orgUserId);
+               assertEquals(actualMenuItems, expectedMenuItems);               
+       }
+       
+       @Test
+       public void createFunctionalMenuItemTest(){
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(functionalMenuService.createFunctionalMenuItem(menuItemJson)).thenReturn(expectedFieldsValidator);
+               actualFieldsValidator = functionalMenuController.createFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void createFunctionalMenuItemBadPermisssionsTest(){
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.createFunctionalMenuItem(menuItemJson)).thenReturn(expectedFieldsValidator);
+               actualFieldsValidator = functionalMenuController.createFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getFavoritesForUserTest(){
+               List<FavoritesFunctionalMenuItemJson> actualFavoritesFunctionalMenuItemsJson = null;
+               List<FavoritesFunctionalMenuItemJson> expectedFunctionalMenuItemsJson = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.getFavoriteItems(user.getId())).thenReturn(expectedFunctionalMenuItemsJson);
+               actualFavoritesFunctionalMenuItemsJson = functionalMenuController.getFavoritesForUser(mockedRequest, mockedResponse);
+               assertEquals(actualFavoritesFunctionalMenuItemsJson, expectedFunctionalMenuItemsJson);
+       }
+       
+       @Test
+       public void deleteFavoriteItemTest(){
+               Long userId = (long)1;
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.removeFavoriteItem(user.getId(), menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFavoriteItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void addFavoriteItemTest(){
+               FavoritesFunctionalMenuItem menuItemJson = new FavoritesFunctionalMenuItem();
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(functionalMenuService.setFavoriteItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.addFavoriteItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getMenuItemsTest(){
+               List<FunctionalMenuItem> actualFunctionalMenuItems = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedFunctionalMenuItems = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> menuItems = new ArrayList<FunctionalMenuItem>();
+               Mockito.when(functionalMenuService.getFunctionalMenuItems()).thenReturn(menuItems);
+               actualFunctionalMenuItems = functionalMenuController.getMenuItems(mockedRequest, mockedResponse);
+               assertEquals(actualFunctionalMenuItems, expectedFunctionalMenuItems);
+       }
+       
+       @Test
+       public void deleteFunctionalMenuItemTest(){
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(functionalMenuService.deleteFunctionalMenuItem(menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFunctionalMenuItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void deleteFunctionalMenuItemBadPermissionsTest(){
+               Long menuId = (long)1;
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(functionalMenuService.deleteFunctionalMenuItem(menuId)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.deleteFunctionalMenuItem(mockedRequest, menuId, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void editFunctionalMenuItemTest(){
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               FieldsValidator actualFieldsValidator = new FieldsValidator();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+               expectedFieldsValidator.setHttpStatusCode((long) 200);
+               expectedFieldsValidator.setFields(fields);
+               expectedFieldsValidator.setErrorCode(null);
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true); 
+               Mockito.when(functionalMenuService.editFunctionalMenuItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.editFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void editFunctionalMenuItemBadPermissionsTest(){
+               FunctionalMenuItemWithRoles menuItemJson = new FunctionalMenuItemWithRoles();
+               FieldsValidator actualFieldsValidator = null;
+               FieldsValidator expectedFieldsValidator = null;
+               EPUser user = mockUser.mockEPUser();    
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false); 
+               Mockito.when(functionalMenuService.editFunctionalMenuItem(menuItemJson)).thenReturn(actualFieldsValidator);
+               actualFieldsValidator = functionalMenuController.editFunctionalMenuItem(mockedRequest, menuItemJson, mockedResponse);
+               assertEquals(actualFieldsValidator, expectedFieldsValidator);
+       }
+       
+       @Test
+       public void getECOMPTitleTest(){
+               PortalRestResponse<String> actualportalRestResponse = null;
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               expectedportalRestResponse.setMessage("success");
+               expectedportalRestResponse.setResponse("Portal");
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)).thenReturn("Portal");
+               actualportalRestResponse = functionalMenuController.getECOMPTitle(mockedRequest, mockedResponse);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/GetAccessControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/GetAccessControllerTest.java
new file mode 100644 (file)
index 0000000..8ee27f8
--- /dev/null
@@ -0,0 +1,71 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.GetAccessController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.GetAccessResult;
+import org.openecomp.portalapp.portal.service.GetAccessService;
+import org.openecomp.portalapp.portal.service.GetAccessServiceImpl;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class GetAccessControllerTest {
+
+       @Mock
+       GetAccessService getAccessService = new GetAccessServiceImpl();
+
+       @InjectMocks
+       GetAccessController getAccessController = new GetAccessController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       MockEPUser mockUser = new MockEPUser();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       
+       @Test
+       public void getAppList() throws IOException
+       {
+               List<GetAccessResult> expectedAppsList = new ArrayList<GetAccessResult>();
+               EPUser user = mockUser.mockEPUser();
+               GetAccessResult getAccessResult = new GetAccessResult();
+               getAccessResult.setRowId("1");
+               getAccessResult.setRoleId((long) 1);
+               getAccessResult.setEcompFunction("test");
+               getAccessResult.setAppName("Test_App");
+               getAccessResult.setAppMotsId(1);
+               getAccessResult.setRoleName("Test_role");
+               getAccessResult.setRoleActive("N");
+               getAccessResult.setReqType("test");
+               
+               expectedAppsList.add(getAccessResult);
+               
+               List<GetAccessResult> actualAppsList = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(getAccessService.getAppAccessList(user)).thenReturn(expectedAppsList);
+               actualAppsList = getAccessController.getAppList(mockedRequest);
+               assertTrue(actualAppsList.contains(getAccessResult));
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ManifestControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/ManifestControllerTest.java
new file mode 100644 (file)
index 0000000..c7a870c
--- /dev/null
@@ -0,0 +1,56 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.Attributes;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.ManifestController;
+import org.openecomp.portalapp.portal.service.ManifestService;
+import org.openecomp.portalapp.portal.service.ManifestServiceImpl;
+
+public class ManifestControllerTest extends MockitoTestSuite{
+
+       
+       @Mock
+       ManifestService manifestService = new ManifestServiceImpl();
+       
+       @InjectMocks
+       ManifestController  manifestController = new  ManifestController();
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       @Test
+       public void getManifestTest() throws IOException
+       {
+               Map<String, Object> expectedResponse = new HashMap<String, Object>();
+               Attributes attributes  = new Attributes();
+               expectedResponse.put("test", attributes);
+               Mockito.when(manifestService.getWebappManifest()).thenReturn(attributes);
+               Map<String, Object> actualResponse = manifestController.getManifest(mockedRequest);
+               assertTrue((actualResponse.keySet().toArray().length) == 1);
+               
+       }
+       
+       @Test
+       public void getManifestExceptionTest() throws IOException
+       {
+               Mockito.when(manifestService.getWebappManifest()).thenThrow(nullPointerException);
+               Map<String, Object> actualResponse = manifestController.getManifest(mockedRequest);
+               assertTrue((actualResponse.keySet().toArray().length) == 1);
+               assertTrue(actualResponse.get("error").equals("failed to get manifest: java.lang.NullPointerException"));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceControllerTest.java
new file mode 100644 (file)
index 0000000..0b12e3b
--- /dev/null
@@ -0,0 +1,232 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.MicroserviceController;
+import org.openecomp.portalapp.portal.domain.MicroserviceData;
+import org.openecomp.portalapp.portal.domain.WidgetCatalog;
+import org.openecomp.portalapp.portal.domain.WidgetServiceHeaders;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ConsulHealthService;
+import org.openecomp.portalapp.portal.service.ConsulHealthServiceImpl;
+import org.openecomp.portalapp.portal.service.MicroserviceService;
+import org.openecomp.portalapp.portal.service.MicroserviceServiceImpl;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(WidgetServiceHeaders.class)
+public class MicroserviceControllerTest extends MockitoTestSuite{
+
+       @InjectMocks
+       MicroserviceController microserviceController = new MicroserviceController();
+
+       @Mock
+       ConsulHealthService consulHealthService = new ConsulHealthServiceImpl();
+
+       @Mock
+       MicroserviceService microserviceService = new MicroserviceServiceImpl();
+
+       @Mock
+       RestTemplate template = new RestTemplate();
+
+       @Mock
+       MicroserviceData microserviceData = new MicroserviceData();
+
+       @SuppressWarnings("rawtypes")
+       @Mock
+       ResponseEntity<List<WidgetCatalog>> ans = new ResponseEntity<List<WidgetCatalog>>(HttpStatus.OK);
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @Mock
+       EcompPortalUtils EcompPortalUtils = new EcompPortalUtils();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void createMicroserviceIfServiceDataNullTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FAILURE");
+               expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               MicroserviceData microserviceData = null;
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
+                               mockedResponse, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void createMicroserviceTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("SUCCESS");
+               expectedportalRestResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
+                               mockedResponse, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void createMicroserviceExceptionTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FAILURE");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               Mockito.when(microserviceService.saveMicroservice(microserviceData)).thenReturn((long) 1);
+               Mockito.when(microserviceData.getParameterList()).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.createMicroservice(mockedRequest,
+                               mockedResponse, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void getMicroserviceTest() throws Exception {
+               Mockito.when(microserviceService.getMicroserviceData()).thenReturn(null);
+               List<MicroserviceData> list = microserviceController.getMicroservice(mockedRequest, mockedResponse);
+               assertEquals(list, null);
+       }
+
+       @Test
+       public void updateMicroserviceIfServiceISNullTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FAILURE");
+               expectedportalRestResponse.setResponse("MicroserviceData cannot be null or empty");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               MicroserviceData microserviceData = null;
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
+                               mockedResponse, 1, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void updateMicroserviceTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("SUCCESS");
+               expectedportalRestResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
+                               mockedResponse, 1, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void updateMicroserviceExceptionTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FAILURE");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               Mockito.when(microserviceController.updateMicroservice(mockedRequest, mockedResponse, 1, microserviceData))
+                               .thenThrow(nullPointerException);
+               PortalRestResponse<String> actualportalRestResponse = microserviceController.updateMicroservice(mockedRequest,
+                               mockedResponse, 1, microserviceData);
+               assertEquals(actualportalRestResponse, expectedportalRestResponse);
+       }
+
+       @Test
+       public void deleteMicroserviceExceptionTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FAILURE");
+               expectedportalRestResponse.setResponse(
+                               "I/O error on GET request for \""  + EcompPortalUtils.widgetMsProtocol() + "://null/widget/microservices/widgetCatalog/service/1\":null; nested exception is java.net.UnknownHostException: null");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               PowerMockito.mockStatic(WidgetServiceHeaders.class);
+               PortalRestResponse<String> actuaPportalRestResponse = microserviceController.deleteMicroservice(mockedRequest,
+                               mockedResponse, 1);
+               assertEquals(actuaPportalRestResponse.getStatus(), expectedportalRestResponse.getStatus());
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void deleteMicroserviceTest() throws Exception {
+               String HTTPS = "https://";
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("SOME WIDGETS ASSOICATE WITH THIS SERVICE");
+               expectedportalRestResponse.setResponse("'null' ,'null' ");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.WARN);
+               List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
+               WidgetCatalog widgetCatalog = new WidgetCatalog();
+               widgetCatalog.setId(1);
+               WidgetCatalog widgetCatalog1 = new WidgetCatalog();
+               widgetCatalog.setId(2);
+               List.add(widgetCatalog);
+               List.add(widgetCatalog1);
+               PowerMockito.mockStatic(WidgetServiceHeaders.class);
+               String whatService = "widgets-service";
+               Mockito.when(consulHealthService.getServiceLocation(whatService, SystemProperties.getProperty("microservices.widget.local.port"))).thenReturn("Test");
+               Mockito.when(ans.getBody()).thenReturn(List);
+               ParameterizedTypeReference<List<WidgetCatalog>> typeRef = new ParameterizedTypeReference<List<WidgetCatalog>>() {
+               };
+               Mockito.when(template.exchange(
+                               HTTPS + consulHealthService.getServiceLocation(whatService, SystemProperties.getProperty("microservices.widget.local.port"))
+                                               + "/widget/microservices/widgetCatalog/service/" + 1,
+                               HttpMethod.GET, new HttpEntity(WidgetServiceHeaders.getInstance()), typeRef)).thenReturn(ans);
+
+               PortalRestResponse<String> actuaPportalRestResponse = microserviceController.deleteMicroservice(mockedRequest,
+                               mockedResponse, 1);
+               assertEquals(actuaPportalRestResponse, expectedportalRestResponse);
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void deleteMicroserviceWhenNoWidgetsAssociatedTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("SUCCESS");
+               expectedportalRestResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               List<WidgetCatalog> List = new ArrayList<WidgetCatalog>();
+               PowerMockito.mockStatic(WidgetServiceHeaders.class);
+               String whatService = "widgets-service";
+               Mockito.when(consulHealthService.getServiceLocation(whatService, SystemProperties.getProperty("microservices.widget.local.port"))).thenReturn("Test");
+               Mockito.when(ans.getBody()).thenReturn(List);
+               ParameterizedTypeReference<List<WidgetCatalog>> typeRef = new ParameterizedTypeReference<List<WidgetCatalog>>() {
+               };
+               Mockito.when(template.exchange(
+                               EcompPortalUtils.widgetMsProtocol() + "://" + consulHealthService.getServiceLocation(whatService, SystemProperties.getProperty("microservices.widget.local.port"))
+                                               + "/widget/microservices/widgetCatalog/service/" + 1,
+                               HttpMethod.GET, new HttpEntity(WidgetServiceHeaders.getInstance()), typeRef)).thenReturn(ans);
+               PortalRestResponse<String> actuaPportalRestResponse = microserviceController.deleteMicroservice(mockedRequest,
+                               mockedResponse, 1);
+               assertEquals(actuaPportalRestResponse, expectedportalRestResponse);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceProxyControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/MicroserviceProxyControllerTest.java
new file mode 100644 (file)
index 0000000..0cb8dcd
--- /dev/null
@@ -0,0 +1,106 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.MicroserviceProxyController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.MicroserviceProxyService;
+import org.openecomp.portalapp.portal.service.MicroserviceProxyServiceImpl;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+
+public class MicroserviceProxyControllerTest extends MockitoTestSuite {
+
+       @Mock
+       MicroserviceProxyService microserviceProxyService = new MicroserviceProxyServiceImpl();
+
+       @InjectMocks
+       MicroserviceProxyController microserviceProxyController = new MicroserviceProxyController();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+       @Mock
+       ObjectMapper objectMapper = new ObjectMapper();
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getMicroserviceProxyTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestination(1, user, mockedRequest)).thenReturn("Success");
+               String acutualString = microserviceProxyController.getMicroserviceProxy(mockedRequest, getMockedResponse(), 1);
+               assertTrue(acutualString.equals("{\"error\":\"Success\"}"));
+       }
+
+       @Test(expected = NullPointerException.class)
+       public void getMicroserviceProxyNullPoniterExceptionTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestination(1, user, mockedRequest))
+                               .thenThrow(nullPointerException);
+               microserviceProxyController.getMicroserviceProxy(mockedRequest, getMockedResponse(), 1);
+       }
+
+       @Test
+       public void getMicroserviceProxyExceptionTest() throws Exception {
+               HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.OK, "Success");
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestination(1, user, mockedRequest))
+                               .thenThrow(httpClientErrorException);
+               String acutualString = microserviceProxyController.getMicroserviceProxy(mockedRequest, getMockedResponse(), 1);
+               assertTrue(acutualString.equals("{\"error\":\"\"}"));
+       }
+
+       @Test
+       public void getMicroserviceProxyByWidgetIdTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestinationByWidgetId(1, user, mockedRequest))
+                               .thenReturn("Success");
+               String acutualString = microserviceProxyController.getMicroserviceProxyByWidgetId(mockedRequest,
+                               getMockedResponse(), 1);
+               assertTrue(acutualString.equals("{\"error\":\"Success\"}"));
+       }
+
+       @Test(expected = NullPointerException.class)
+       public void getMicroserviceProxyByWidgetIdNullPointerExceptionTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestinationByWidgetId(1, user, mockedRequest))
+                               .thenThrow(nullPointerException);
+               microserviceProxyController.getMicroserviceProxyByWidgetId(mockedRequest, getMockedResponse(), 1);
+       }
+
+       @Test
+       public void getMicroserviceProxyByWidgetIdExceptionTest() throws Exception {
+               HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.OK, "Success");
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(microserviceProxyService.proxyToDestinationByWidgetId(1, user, mockedRequest))
+                               .thenThrow(httpClientErrorException);
+               String acutualString = microserviceProxyController.getMicroserviceProxyByWidgetId(mockedRequest,
+                               getMockedResponse(), 1);
+               assertTrue(acutualString.equals("{\"error\":\"\"}"));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerTest.java
new file mode 100644 (file)
index 0000000..6917b6e
--- /dev/null
@@ -0,0 +1,155 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.PortalAdminController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.exceptions.NoHealthyServiceException;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.PortalAdminService;
+import org.openecomp.portalapp.portal.service.PortalAdminServiceImpl;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.PortalAdmin;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.openecomp.portalsdk.core.service.AuditServiceImpl;
+
+public class PortalAdminControllerTest extends MockitoTestSuite{
+
+       @InjectMocks
+       PortalAdminController portalAdminController = new PortalAdminController();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+       
+       @Mock
+       PortalAdminService portalAdminService = new PortalAdminServiceImpl();
+
+       @Mock
+       AuditService auditService = new AuditServiceImpl();
+
+        
+       @Mock
+       EcompPortalUtils ecompPortalUtils = new EcompPortalUtils();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       MockEPUser mockUser = new MockEPUser();
+       
+       
+       @Test
+       public void getPortalAdminsTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<PortalAdmin> expectedPortalAdminsList = new ArrayList<PortalAdmin>();
+               PortalAdmin portalAdmin= new PortalAdmin();
+               
+               portalAdmin.setUserId((long) 1);
+               portalAdmin.setLoginId("guestT");
+               portalAdmin.setFirstName("Test_FirstName");
+               portalAdmin.setLastName("Test_LastName");
+               
+               expectedPortalAdminsList.add(portalAdmin);
+               
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               
+         Mockito.when(portalAdminService.getPortalAdmins()).thenReturn(expectedPortalAdminsList);
+         List<PortalAdmin> actualPortalAdminsList =  portalAdminController.getPortalAdmins(mockedRequest, mockedResponse);
+         assertEquals(actualPortalAdminsList,expectedPortalAdminsList);
+
+       }
+//     @Test
+//     public void getPortalAdminsIfUserIsNullTest()
+//     {
+//             EPUser user = null;
+//             Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+//
+//         assertNull(portalAdminController.getPortalAdmins(mockedRequest, mockedResponse));
+//
+//     }
+       
+       @Test
+       public void getPortalAdminsIfUserIsSuperAdminTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+                assertNull(portalAdminController.getPortalAdmins(mockedRequest, mockedResponse));
+
+       }
+       
+       
+       
+       @Test
+       public void createPortalAdminTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+       
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               String sbcid = "Test";
+               
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(portalAdminService.createPortalAdmin(sbcid)).thenReturn(expectedFieldValidator);
+               actualFieldValidator = portalAdminController.createPortalAdmin(mockedRequest, sbcid, mockedResponse);
+        assertEquals(actualFieldValidator,expectedFieldValidator);
+
+       }
+               
+//     @Test
+//     public void createPortalAdminIfUserIsNullTest()
+//     {
+//             //EPUser user = null;
+//             Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(null);
+//             String sbcid = "null";
+//             assertNull(portalAdminController.createPortalAdmin(mockedRequest, sbcid, mockedResponse));
+//
+//     }
+       
+       @Test
+       public void createPortalAdminIfUserIsSuperAdminTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               String sbcid = "Test";
+               assertNull(portalAdminController.createPortalAdmin(mockedRequest, sbcid, mockedResponse));
+
+       }
+                       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RoleManageControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RoleManageControllerTest.java
new file mode 100644 (file)
index 0000000..ea7b532
--- /dev/null
@@ -0,0 +1,189 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.core.RoleController;
+import org.openecomp.portalapp.controller.core.RoleFunctionListController;
+import org.openecomp.portalapp.controller.core.RoleListController;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.RoleManageController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.ExternalAccessRolesService;
+import org.springframework.web.servlet.ModelAndView;
+
+public class RoleManageControllerTest {
+
+       
+       
+       @Mock
+        RoleController roleController;
+
+       @Mock
+    RoleListController roleListController;
+
+       @Mock
+    RoleFunctionListController roleFunctionListController;
+
+
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService;
+       
+       @Mock
+       ExternalAccessRolesService externalAccessRolesService1 = null;
+       
+       @InjectMocks
+       RoleManageController roleManageController = new RoleManageController(); 
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Test
+       public void toggleRoleTest()
+       {
+               PortalRestResponse<String> portalRestResponse = new PortalRestResponse<String>();
+               portalRestResponse.setMessage("success");
+               portalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               portalRestResponse.setStatus(portalRestStatusEnum.OK);
+               
+               PortalRestResponse<String> expectedpPortalRestResponse=roleManageController.toggleRole(mockedRequest, mockedResponse);
+               assertEquals(portalRestResponse,expectedpPortalRestResponse);
+               
+       }
+       
+//     @Test
+//     public void toggleRoleExceptionTest()
+//     {
+//             PortalRestResponse<String> portalRestResponse = new PortalRestResponse<String>();
+//             portalRestResponse.setMessage("success");
+//             portalRestResponse.setResponse(null);
+//             PortalRestStatusEnum portalRestStatusEnum = null;
+//             portalRestResponse.setStatus(portalRestStatusEnum.OK);
+//             Mockito.doNothing().when(roleListController).toggleRole(mockedRequest, mockedResponse))).th
+//             getRoleListController().toggleRole(request, response)
+//             
+//             PortalRestResponse<String> expectedpPortalRestResponse=roleManageController.toggleRole(mockedRequest, mockedResponse);
+//             assertEquals(portalRestResponse,expectedpPortalRestResponse);
+//             
+//     }
+       @Test
+       public void removeRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleListController.removeRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void saveRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.saveRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.saveRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void removeRoleRoleFunctionTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.removeRoleFunction(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeRoleRoleFunction(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void addRoleRoRoleFunctionTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.addRoleFunction(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.addRoleRoRoleFunction(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       @Test
+       public void removeChildRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.removeChildRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.removeChildRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+       
+       
+       @Test
+       public void getRoleTest() throws Exception
+       {
+               Mockito.doNothing().when(roleController).getRole(mockedRequest, mockedResponse);
+               roleManageController.getRole(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void getRolesTest() throws Exception
+       {
+               Mockito.doNothing().when(roleListController).getRoles(mockedRequest, mockedResponse);
+               roleManageController.getRoles(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void getRoleFunctionListTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).getRoleFunctionList(mockedRequest, mockedResponse);
+               roleManageController.getRoleFunctionList(mockedRequest, mockedResponse);
+       }
+       
+       @Test
+       public void saveRoleFunctionTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).saveRoleFunction(mockedRequest, mockedResponse, "test");
+               roleManageController.saveRoleFunction(mockedRequest, mockedResponse, "test");
+       }
+       
+       @Test
+       public void removeRoleFunctionTest() throws Exception
+       {
+               Mockito.doNothing().when(roleFunctionListController).removeRoleFunction(mockedRequest, mockedResponse, "test");
+               roleManageController.removeRoleFunction(mockedRequest, mockedResponse, "test");
+       }
+       
+       @Test
+       public void syncRolesTest() throws Exception
+       {
+               EPApp app = new EPApp();
+               Mockito.doNothing().when(externalAccessRolesService).syncApplicationRolesWithEcompDB(app);
+               roleManageController.syncRoles(app);
+       }
+       
+       
+       @Test
+       public void addeChildRoleTest() throws Exception
+       {
+               ModelAndView modelandView = new ModelAndView("login.htm");
+               Mockito.when(roleController.addChildRole(mockedRequest, mockedResponse)).thenReturn(modelandView);
+               ModelAndView expectedModelandView =     roleManageController.addChildRole(mockedRequest, mockedResponse);
+               assertEquals(expectedModelandView, modelandView);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RolesApprovalSystemControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/RolesApprovalSystemControllerTest.java
new file mode 100644 (file)
index 0000000..e55b9a9
--- /dev/null
@@ -0,0 +1,336 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.externalsystemapproval.model.ExternalSystemRoleApproval;
+import org.openecomp.portalapp.externalsystemapproval.model.ExternalSystemUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.RolesApprovalSystemController;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.UserRolesService;
+import org.openecomp.portalapp.portal.transport.ExternalRequestFieldsValidator;
+
+public class RolesApprovalSystemControllerTest extends MockitoTestSuite {
+
+       @Mock
+       UserRolesService userRolesService;
+
+       @InjectMocks
+       RolesApprovalSystemController rolesApprovalSystemController = new RolesApprovalSystemController();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @Test
+       public void postUserProfileIfRolesNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Request has no roles");
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = null;
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .postUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void postUserProfileTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Saved Successfully");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(true,
+                               "Saved Successfully");
+
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "POST"))
+                               .thenReturn(externalRequestFieldsValidator);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .postUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void postUserProfileFailureTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Received Bad String");
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(false,
+                               "Received Bad String");
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "POST"))
+                               .thenReturn(externalRequestFieldsValidator);
+
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .postUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void postUserProfileExceptionTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "POST")).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .postUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void putUserProfileIfLoginIdNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Request has no login ID");
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId(null);
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .putUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void putUserProfileTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Updated Successfully");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(true,
+                               "Updated Successfully");
+
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "PUT"))
+                               .thenReturn(externalRequestFieldsValidator);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .putUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void putUserProfileFailureTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Received Bad String");
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(false,
+                               "Received Bad String");
+
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "PUT"))
+                               .thenReturn(externalRequestFieldsValidator);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .putUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void putUserProfileExceptionTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("save user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "PUT")).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .putUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void deleteUserProfileIfApplicationNameNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Request has no application name");
+               expectedportalRestResponse.setResponse("delete user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName(null);
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .deleteUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void deleteUserProfileIfMyloginrequestIdNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Request has no request ID");
+               expectedportalRestResponse.setResponse("delete user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId(null);
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .deleteUserProfile(mockedRequest, extSysUser, mockedResponse);
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void deleteUserProfileTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Deleted Successfully");
+               expectedportalRestResponse.setResponse("Success");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(true,
+                               "Success");
+
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "DELETE"))
+                               .thenReturn(externalRequestFieldsValidator);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .deleteUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void deleteUserProfileFailureTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("failed");
+               expectedportalRestResponse.setResponse("delete user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               ExternalRequestFieldsValidator externalRequestFieldsValidator = new ExternalRequestFieldsValidator(false,
+                               "failed");
+
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "DELETE"))
+                               .thenReturn(externalRequestFieldsValidator);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .deleteUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+
+       @Test
+       public void deleteUserProfileExceptionTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse("delete user profile failed");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               ExternalSystemUser extSysUser = new ExternalSystemUser();
+               extSysUser.setApplicationName("Test_App");
+               extSysUser.setLoginId("1");
+               extSysUser.setMyloginrequestId("Test");
+               List<ExternalSystemRoleApproval> externalSystemRoleApprovalList = new ArrayList<ExternalSystemRoleApproval>();
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApprovalList.add(externalSystemRoleApproval);
+               extSysUser.setRoles(externalSystemRoleApprovalList);
+               Mockito.when(userRolesService.setExternalRequestUserAppRole(extSysUser, "DELETE")).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualportalRestResponse = rolesApprovalSystemController
+                               .deleteUserProfile(mockedRequest, extSysUser, mockedResponse);
+
+               assertEquals(expectedportalRestResponse, actualportalRestResponse);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/SessionCommunicationControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/SessionCommunicationControllerTest.java
new file mode 100644 (file)
index 0000000..0f6f6ca
--- /dev/null
@@ -0,0 +1,59 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.drools.core.command.assertion.AssertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.sessionmgt.SessionCommunicationController;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.service.sessionmgt.ManageService;
+
+public class SessionCommunicationControllerTest {
+       
+
+       @Mock
+       ManageService manageService;
+
+       @InjectMocks
+       SessionCommunicationController SessionCommunicationController = new SessionCommunicationController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       
+       @Test
+       public void getSessionSlotCheckIntervalTest() throws Exception
+       {
+               Mockito.when(manageService.fetchSessionSlotCheckInterval()).thenReturn(1);
+               int result = SessionCommunicationController.getSessionSlotCheckInterval(mockedRequest, mockedResponse);
+               assertEquals(result, 1);
+               
+       }
+
+       @Test
+       public void extendSessionTimeOutsTest() throws Exception
+       {
+               Mockito.doNothing().when(manageService).extendSessionTimeOuts("test");
+               Boolean result = SessionCommunicationController.extendSessionTimeOuts(mockedRequest, mockedResponse, "test");
+               assertEquals(result, true);
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/TicketEventControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/TicketEventControllerTest.java
new file mode 100644 (file)
index 0000000..9347cf6
--- /dev/null
@@ -0,0 +1,99 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.TicketEventController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.UserNotificationService;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(UserUtils.class)
+public class TicketEventControllerTest {
+
+       @Mock
+       UserNotificationService userNotificationService;
+
+       @InjectMocks
+       TicketEventController ticketEventController = new TicketEventController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockEPUser mockUser = new MockEPUser();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+//     @Test
+//     public void saveTest() throws Exception {
+//             String ticketEventJson = "{\"application\": \"cbus\",\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+//             PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+//                             mockedResponse, ticketEventJson);
+//             assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.OK) == 0);
+//     }
+
+       @Test
+       public void saveTestForException() throws Exception {
+               String ticketEventJson = "\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+               PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+                               mockedResponse, ticketEventJson);
+               assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.ERROR) == 0);
+       }
+
+//     @Test
+//     public void saveTestForApplicationValid() throws Exception {
+//             String ticketEventJson = "{\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+//             PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+//                             mockedResponse, ticketEventJson);
+//             assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.ERROR) == 0);
+//             assertEquals(actualPortalRestResponse.getMessage(), "application is mandatory");
+//
+//     }
+
+       @Test
+       public void saveTestForBodyValid() throws Exception {
+               String ticketEventJson = "{\"application\": \"cbus\",\"event\": {\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",\"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+               PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+                               mockedResponse, ticketEventJson);
+               assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.ERROR) == 0);
+               assertEquals(actualPortalRestResponse.getMessage(), "body is mandatory");
+       }
+
+       @Test
+       public void saveTestForEventSourceValid() throws Exception {
+               String ticketEventJson = "{\"application\": \"cbus\",\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+               PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+                               mockedResponse, ticketEventJson);
+               assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.ERROR) == 0);
+               assertEquals(actualPortalRestResponse.getMessage(), "Message Source is mandatory");
+       }
+
+       @Test
+       public void saveTestForUserListValid() throws Exception {
+               String ticketEventJson = "{\"application\": \"cbus\",\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {}}";
+               PortalRestResponse<String> actualPortalRestResponse = ticketEventController.handleRequest(mockedRequest,
+                               mockedResponse, ticketEventJson);
+               assertTrue(actualPortalRestResponse.getStatus().compareTo(PortalRestStatusEnum.ERROR) == 0);
+               assertEquals(actualPortalRestResponse.getMessage(), "At least one user Id is mandatory");
+       }
+}
\ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserControllerTest.java
new file mode 100644 (file)
index 0000000..acfa25a
--- /dev/null
@@ -0,0 +1,141 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.UserController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.UserService;
+import org.openecomp.portalapp.portal.service.UserServiceImpl;
+import org.openecomp.portalapp.portal.transport.ProfileDetail;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(CipherUtil.class)
+public class UserControllerTest extends MockitoTestSuite {
+
+       @InjectMocks
+       UserController userController = new UserController();
+
+       @Mock
+       UserService userService = new UserServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getLoggedinUserExceptionTest() {
+               EPUser epUser = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(epUser);
+               PortalRestResponse<ProfileDetail> expectedResponse = new PortalRestResponse<ProfileDetail>();
+               expectedResponse.setMessage(null);
+               expectedResponse.setResponse(null);
+               PortalRestStatusEnum enu = null;
+               expectedResponse.setStatus(enu.ERROR);
+               PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
+               assertEquals(response, expectedResponse);
+       }
+
+       @Test
+       public void getLoggedinUserTest() throws Exception {
+               EPUser epUser = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(epUser);
+               PortalRestResponse<ProfileDetail> expectedResponse = new PortalRestResponse<ProfileDetail>();
+               expectedResponse.setMessage("success");
+               ProfileDetail profileDetail = new ProfileDetail();
+               expectedResponse.setResponse(profileDetail);
+               PortalRestStatusEnum enu = null;
+               expectedResponse.setStatus(enu.OK);
+               PowerMockito.mockStatic(CipherUtil.class);
+               Mockito.when(CipherUtil.decrypt(epUser.getLoginPwd())).thenReturn("Password");
+               PortalRestResponse<ProfileDetail> response = userController.getLoggedinUser(mockedRequest);
+               assertEquals(response.getMessage(), expectedResponse.getMessage());
+               assertEquals(response.getStatus(), expectedResponse.getStatus());
+       }
+
+       @Test
+       public void modifyLoggedinUserIfProfileNullTest() {
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("java.lang.NullPointerException");
+               expectedResponse.setResponse(null);
+               PortalRestStatusEnum enu = null;
+               expectedResponse.setStatus(enu.ERROR);
+               ProfileDetail profileDetail = null;
+               PortalRestResponse<String> actualResponse = userController.modifyLoggedinUser(mockedRequest, profileDetail);
+               assertEquals(actualResponse, expectedResponse);
+               assertEquals(actualResponse.getStatus(), expectedResponse.getStatus());
+       }
+
+       @Test
+       public void modifyLoggedinUserExceptionTest() {
+               EPUser epUser = mockUser.mockEPUser();
+
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage(
+                               "java.lang.ClassCastException: com.sun.crypto.provider.AESCipher$General cannot be cast to javax.crypto.CipherSpi");
+               expectedResponse.setResponse(null);
+               PortalRestStatusEnum enu = null;
+               expectedResponse.setStatus(enu.ERROR);
+               ProfileDetail profileDetail = new ProfileDetail();
+               profileDetail.setFirstName("Test_FirstName");
+               profileDetail.setLastName("Test_LastName");
+               profileDetail.setEmail("Test_Email");
+               profileDetail.setLoginId("Test_LoginId");
+               profileDetail.setLoginPassword("Test_LoginPassword");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(epUser);
+               PortalRestResponse<String> actualResponse = userController.modifyLoggedinUser(mockedRequest, profileDetail);
+               assertEquals(actualResponse, expectedResponse);
+
+       }
+
+       /*@Test
+       public void modifyLoggedinUserTest() throws Exception {
+               EPUser epUser = mockUser.mockEPUser();
+               PortalRestResponse<String> expectedResponse = new PortalRestResponse<String>();
+               expectedResponse.setMessage("success");
+               expectedResponse.setResponse(null);
+               PortalRestStatusEnum enu = null;
+               expectedResponse.setStatus(enu.OK);
+               ProfileDetail profileDetail = new ProfileDetail();
+               profileDetail.setFirstName("Test_FirstName");
+               profileDetail.setLastName("Test_LastName");
+               profileDetail.setEmail("Test_Email");
+               profileDetail.setLoginId("Test_LoginId");
+               profileDetail.setLoginPassword("Test_LoginPassword");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(epUser);
+               PowerMockito.mockStatic(CipherUtil.class);
+               Mockito.when(CipherUtil.decrypt(epUser.getLoginPwd())).thenReturn("Password");
+               PortalRestResponse<String> actualResponse = userController.modifyLoggedinUser(mockedRequest, profileDetail);
+               System.out.println(actualResponse);
+       }*/
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserNotificationControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserNotificationControllerTest.java
new file mode 100644 (file)
index 0000000..ebe5f7c
--- /dev/null
@@ -0,0 +1,263 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.UserNotificationController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.service.UserNotificationService;
+import org.openecomp.portalapp.portal.service.UserNotificationServiceImpl;
+import org.openecomp.portalapp.portal.transport.EpNotificationItem;
+import org.openecomp.portalapp.portal.transport.EpNotificationItemVO;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(UserUtils.class)
+public class UserNotificationControllerTest {
+
+       @Mock
+       FunctionalMenuService functionalMenuService = new FunctionalMenuServiceImpl();
+
+       @Mock
+       UserNotificationService userNotificationService = new UserNotificationServiceImpl();
+
+       @InjectMocks
+       UserNotificationController userNotificationController = new UserNotificationController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockEPUser mockUser = new MockEPUser();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void getMenuIdRoleIdTest() {
+               List<FunctionalMenuRole> expectedMenuRoleList = new ArrayList<FunctionalMenuRole>();
+               FunctionalMenuRole functionalMenuRole = new FunctionalMenuRole();
+               functionalMenuRole.setId(new Integer(99999999));
+               functionalMenuRole.setMenuId((long) 137);
+               functionalMenuRole.setAppId(new Integer(456));
+               functionalMenuRole.setRoleId(new Integer(6214));
+               expectedMenuRoleList.add(functionalMenuRole);
+               List<FunctionalMenuRole> actualFunctionalMenuRoleList = null;
+               Mockito.when(functionalMenuService.getFunctionalMenuRole()).thenReturn(expectedMenuRoleList);
+               actualFunctionalMenuRoleList = userNotificationController.getMenuIdRoleId(mockedRequest, mockedResponse);
+               assertTrue(actualFunctionalMenuRoleList.equals(expectedMenuRoleList));
+
+       }
+
+       @Test
+       public void getNotificationsTest() {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EpNotificationItem> expectedEpNotificationList = new ArrayList<EpNotificationItem>();
+               EpNotificationItem epNotificationItem = new EpNotificationItem();
+               epNotificationItem.setNotificationId((long) 200);
+               expectedEpNotificationList.add(epNotificationItem);
+               PortalRestResponse<List<EpNotificationItem>> expectedportalRestResponse = new PortalRestResponse<List<EpNotificationItem>>();
+               expectedportalRestResponse.setMessage("success");
+               expectedportalRestResponse.setResponse(expectedEpNotificationList);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               PortalRestResponse<List<EpNotificationItem>> actualPortalRestResponse = null;
+               Mockito.when(userNotificationService.getNotifications(user.getId())).thenReturn(expectedEpNotificationList);
+               actualPortalRestResponse = userNotificationController.getNotifications(mockedRequest, mockedResponse);
+               assertTrue(expectedportalRestResponse.equals(actualPortalRestResponse));
+
+       }
+
+       @Test
+       public void getNotificationsCatchesExceptionTest() {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EpNotificationItem> expectedEpNotificationList = null;
+               PortalRestResponse<List<EpNotificationItem>> expectedportalRestResponse = new PortalRestResponse<List<EpNotificationItem>>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(expectedEpNotificationList);
+               expectedportalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               PortalRestResponse<List<EpNotificationItem>> actualPortalRestResponse = null;
+               Mockito.when(userNotificationService.getNotifications(user.getId())).thenThrow(new NullPointerException());
+               actualPortalRestResponse = userNotificationController.getNotifications(mockedRequest, mockedResponse);
+               assertTrue(expectedportalRestResponse.equals(actualPortalRestResponse));
+       }
+
+       @Test
+       public void getAdminNotificationsTest() {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EpNotificationItemVO> actualEpNotificationsList = new ArrayList<EpNotificationItemVO>();
+               List<EpNotificationItemVO> expectedEpNotificationsList = new ArrayList<EpNotificationItemVO>();
+               EpNotificationItemVO epNotificationItemVO = new EpNotificationItemVO();
+               epNotificationItemVO.setId((long) 1);
+               expectedEpNotificationsList.add(epNotificationItemVO);
+               Mockito.when(userNotificationService.getAdminNotificationVOS(Matchers.anyLong())).thenReturn(expectedEpNotificationsList);
+               actualEpNotificationsList = userNotificationController.getAdminNotifications(mockedRequest, mockedResponse);
+               assertTrue(actualEpNotificationsList.equals(expectedEpNotificationsList));
+       }
+
+       @Test
+       public void saveTestWhenNotificationIsNull() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+               PortalRestResponse<String> actualPortalRestResponse = new PortalRestResponse<String>();
+               PortalRestResponse<String> expectedPortalRestResponse = new PortalRestResponse<String>();
+               expectedPortalRestResponse.setMessage("FAILURE");
+               expectedPortalRestResponse.setResponse("Notification Header cannot be null or empty");
+               expectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+
+               EpNotificationItem notificationItem = null;
+               actualPortalRestResponse = userNotificationController.save(mockedRequest, mockedResponse, notificationItem);
+               assertTrue(actualPortalRestResponse.equals(expectedPortalRestResponse));
+       }
+
+       @Test
+       public void saveTestWhenEndTimeIsGreater() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<String> actualPortalRestResponse = new PortalRestResponse<String>();
+               PortalRestResponse<String> expectedPortalRestResponse = new PortalRestResponse<String>();
+               expectedPortalRestResponse.setMessage("FAILURE");
+               expectedPortalRestResponse.setResponse("End Time should be greater than  start time");
+               expectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               EpNotificationItem notificationItem = new EpNotificationItem();
+               notificationItem.setNotificationId((long) 1);
+               notificationItem.setMsgHeader("Test");
+               Date currentDate = new Date();
+               Calendar c = Calendar.getInstance();
+               c.setTime(currentDate);
+               c.add(Calendar.DATE, 1);
+               Date currentDatePlusOne = c.getTime();
+               notificationItem.setStartTime(currentDatePlusOne);
+               notificationItem.setEndTime(currentDate);
+
+               actualPortalRestResponse = userNotificationController.save(mockedRequest, mockedResponse, notificationItem);
+               assertTrue(actualPortalRestResponse.equals(expectedPortalRestResponse));
+
+       }
+
+       @Test
+       public void saveTestWhenNoRoleIDExists() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<String> actualPortalRestResponse = new PortalRestResponse<String>();
+               PortalRestResponse<String> expectedPortalRestResponse = new PortalRestResponse<String>();
+               expectedPortalRestResponse.setMessage("FAILURE");
+               expectedPortalRestResponse.setResponse("No Roles Ids Exist for the selected Roles");
+               expectedPortalRestResponse.setStatus(PortalRestStatusEnum.ERROR);
+               EpNotificationItem notificationItem = new EpNotificationItem();
+               notificationItem.setNotificationId((long) 1);
+               notificationItem.setMsgHeader("Test");
+               notificationItem.setIsForAllRoles("N");
+               Date currentDate = new Date();
+               Calendar c = Calendar.getInstance();
+               c.setTime(currentDate);
+               c.add(Calendar.DATE, 1);
+               Date currentDatePlusOne = c.getTime();
+               notificationItem.setStartTime(currentDate);
+               notificationItem.setEndTime(currentDatePlusOne);
+               List<Long> roleList = new ArrayList<Long>();
+               notificationItem.setRoleIds(roleList);
+               actualPortalRestResponse = userNotificationController.save(mockedRequest, mockedResponse, notificationItem);
+               assertTrue(actualPortalRestResponse.equals(expectedPortalRestResponse));
+       }
+
+       @Test
+       public void saveTest() throws Exception {
+               EPUser user = mockUser.mockEPUser();
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute("user", user);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<String> actualPortalRestResponse = new PortalRestResponse<String>();
+               PortalRestResponse<String> expectedPortalRestResponse = new PortalRestResponse<String>();
+               expectedPortalRestResponse.setMessage("SUCCESS");
+               expectedPortalRestResponse.setResponse("");
+               expectedPortalRestResponse.setStatus(PortalRestStatusEnum.OK);
+               EpNotificationItem notificationItem = new EpNotificationItem();
+               notificationItem.setNotificationId((long) 1);
+               notificationItem.setMsgHeader("Test");
+               notificationItem.setIsForAllRoles("Y");
+               Date currentDate = new Date();
+               Calendar c = Calendar.getInstance();
+               c.setTime(currentDate);
+               c.add(Calendar.DATE, 1);
+               Date currentDatePlusOne = c.getTime();
+               notificationItem.setStartTime(currentDate);
+               notificationItem.setEndTime(currentDatePlusOne);
+               List<Long> roleList = new ArrayList<Long>();
+               Long role1 = (long) 1;
+               roleList.add(role1);
+               notificationItem.setRoleIds(roleList);
+               HttpServletRequest request = mockitoTestSuite.getMockedRequest();
+               PowerMockito.mockStatic(UserUtils.class);
+               Mockito.when(UserUtils.getUserIdAsLong(request)).thenReturn((long) 1);
+               Mockito.when(userNotificationService.saveNotification(notificationItem)).thenReturn("Test");
+               actualPortalRestResponse = userNotificationController.save(mockedRequest, mockedResponse, notificationItem);
+               assertTrue(actualPortalRestResponse.equals(expectedPortalRestResponse));
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserRolesControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/UserRolesControllerTest.java
new file mode 100644 (file)
index 0000000..56fa6a4
--- /dev/null
@@ -0,0 +1,308 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.UserRolesController;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.EcompAuditLog;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.SearchService;
+import org.openecomp.portalapp.portal.service.UserRolesService;
+import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
+import org.openecomp.portalapp.portal.transport.AppsListWithAdminRole;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.FieldsValidator.FieldName;
+import org.openecomp.portalapp.portal.transport.RoleInAppForUser;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EcompPortalUtils.class, EPCommonSystemProperties.class, EcompAuditLog.class, SystemProperties.class})
+public class UserRolesControllerTest extends MockitoTestSuite {
+
+       String userid = "ab1234";
+
+       @Mock
+       UserRolesService userRolesService;
+       
+       @Mock
+       SearchService searchService;
+       
+       @Mock
+       AuditService auditService;
+       
+       @Mock
+       AdminRolesService adminRolesService;
+
+       @Mock
+       FieldsValidator fieldsValidator;
+
+       @InjectMocks
+       UserRolesController userRolesController = new UserRolesController();
+
+       @Mock
+       private DataAccessService dataAccessService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       @Mock
+       EPUser epuser;
+
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void putAppWithUserRoleRequestTest() {
+
+               FieldsValidator actualFieldsValidator = null;
+
+               AppWithRolesForUser appWithRolesForUser = new AppWithRolesForUser();
+               List<RoleInAppForUser> listofRoles = new ArrayList<RoleInAppForUser>();
+
+               appWithRolesForUser.setOrgUserId("guest");
+               appWithRolesForUser.setAppId((long) 550);
+               appWithRolesForUser.setAppName("D2 Services Analytics Dashboard");
+               appWithRolesForUser.setAppRoles(listofRoles);
+
+               RoleInAppForUser roleInAppForUser = new RoleInAppForUser();
+               roleInAppForUser.setIsApplied(false);
+               roleInAppForUser.setRoleId((long) 1);
+               roleInAppForUser.setRoleName("System Administrator");
+
+               RoleInAppForUser roleInAppForUser1 = new RoleInAppForUser();
+               roleInAppForUser1.setIsApplied(true);
+               roleInAppForUser1.setRoleId((long) 16);
+               roleInAppForUser1.setRoleName("Standard User");
+
+               listofRoles.add(roleInAppForUser);
+               listofRoles.add(roleInAppForUser1);
+               EPUser user = mockUser.mockEPUser();
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               List<FieldName> fields = new ArrayList<>();
+
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(fields);
+               expectedFieldValidator.setErrorCode(null);
+               HttpSession session = mockedRequest.getSession();
+               session.setAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(userRolesService.putUserAppRolesRequest(appWithRolesForUser, user))
+                               .thenReturn(expectedFieldValidator);
+
+               actualFieldsValidator = userRolesController.putAppWithUserRoleRequest(mockedRequest, appWithRolesForUser,
+                               mockedResponse);
+               assertEquals(expectedFieldValidator.getHttpStatusCode(), actualFieldsValidator.getHttpStatusCode());
+               assertEquals(expectedFieldValidator.getErrorCode(), actualFieldsValidator.getErrorCode());
+               assertEquals(expectedFieldValidator.getFields(), actualFieldsValidator.getFields());
+
+       }
+       
+       @Test
+       public void getPhoneBookSearchResultBadPermissionsTest() {
+               String searchString = "test";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getPhoneBookSearchResultValidationTest() {
+               String searchString = " t";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getPhoneBookSearchResultTest() {
+               String searchString = "test";
+               String actualResult = null;
+               String expectedResult = null;
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }
+       
+       @Test
+       public void getAppsWithAdminRoleStateForUserTest(){
+               
+               String orgUserId = "hb123f";
+               AppsListWithAdminRole actualResult = new AppsListWithAdminRole();
+               AppsListWithAdminRole expectedResult = new AppsListWithAdminRole();
+               EPUser user = mockUser.mockEPUser();
+       //      PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.getAppsWithAdminRoleStateForUser(orgUserId)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getAppsWithAdminRoleStateForUser(mockedRequest, orgUserId, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       }
+       
+       /*@Test
+       public void getAppsWithAdminRoleStateForUserBadRequestTest(){
+               
+               String orgUserId = "hb123f";
+               AppsListWithAdminRole actualResult = null;
+               AppsListWithAdminRole expectedResult = null;
+               EPUser user = mockUser.mockEPUser();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.when(EcompPortalUtils.legitimateUserId(orgUserId)).thenReturn(false);
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.getAppsWithAdminRoleStateForUser(orgUserId)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getAppsWithAdminRoleStateForUser(mockedRequest, orgUserId, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       }*/
+       
+       @Test
+       public void putAppsWithAdminRoleStateForUserBadStatusCodeTest(){
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fieldNames = new ArrayList<FieldName>();
+               expectedFieldsValidator.setErrorCode(null);
+               expectedFieldsValidator.setFields(fieldNames);
+               expectedFieldsValidator.setHttpStatusCode((long)200);
+               
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+               assertEquals(expectedFieldsValidator, actualFieldsValidator);
+       }
+       
+       
+       /*@Test
+       public void putAppsWithAdminRoleStateForUserTest() {
+               
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(EcompAuditLog.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EcompAuditLog.CD_ACTIVITY_UPDATE_ACCOUNT_ADMIN)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP)).thenReturn("1400");
+               Mockito.when(SystemProperties.getProperty(SystemProperties.MDC_TIMER)).thenReturn("1400");
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+
+               System.out.println(actualFieldsValidator);
+               Mockito.when(searchService.searchUsersInPhoneBook(searchString)).thenReturn(actualResult);
+               
+               actualResult = userRolesController.getPhoneBookSearchResult(mockedRequest, searchString, mockedResponse);
+               assertEquals(expectedResult, actualResult);
+       
+       }*/
+       
+       /*@Test
+       public void putAppsWithAdminRoleStateForUserTest(){
+               FieldsValidator actualFieldsValidator = null;
+               AppsListWithAdminRole newAppsListWithAdminRoles = new  AppsListWithAdminRole();
+               FieldsValidator expectedFieldsValidator = new FieldsValidator();
+               List<FieldName> fieldNames = new ArrayList<FieldName>();
+               expectedFieldsValidator.setErrorCode(null);
+               expectedFieldsValidator.setFields(fieldNames);
+               expectedFieldsValidator.setHttpStatusCode((long)200);
+               
+               EPUser user = mockUser.mockEPUser();
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               PowerMockito.mockStatic(EcompAuditLog.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(adminRolesService.setAppsWithAdminRoleStateForUser(newAppsListWithAdminRoles));
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+
+       //      Mockito.call(auditService.logActivity(auditLog, null));
+//             Mockito.when(SystemProperties.getProperty(EcompAuditLog.CD_ACTIVITY_UPDATE_ACCOUNT_ADMIN)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP)).thenReturn("1400");
+//             Mockito.when(SystemProperties.getProperty(SystemProperties.MDC_TIMER)).thenReturn("1400");
+               
+               actualFieldsValidator = userRolesController.putAppsWithAdminRoleStateForUser(mockedRequest, newAppsListWithAdminRoles, mockedResponse);
+               assertEquals(expectedFieldsValidator, actualFieldsValidator);
+       }*/
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WebAnalyticsExtAppControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WebAnalyticsExtAppControllerTest.java
new file mode 100644 (file)
index 0000000..fde2991
--- /dev/null
@@ -0,0 +1,110 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.WebAnalyticsExtAppController;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.AppsCacheService;
+import org.openecomp.portalapp.portal.service.AppsCacheServiceImple;
+import org.openecomp.portalapp.portal.transport.Analytics;
+import org.openecomp.portalsdk.core.onboarding.crossapi.PortalAPIResponse;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.openecomp.portalsdk.core.service.AuditServiceImpl;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SystemProperties.class,IOUtils.class,Object.class})
+public class WebAnalyticsExtAppControllerTest {
+
+       
+       
+       @InjectMocks
+       WebAnalyticsExtAppController webAnalyticsExtAppController = new WebAnalyticsExtAppController();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+       
+       @Mock
+       AppsCacheService appCacheService = new AppsCacheServiceImple();
+
+       @Mock
+       AuditService auditService = new AuditServiceImpl();
+
+//     @Mock 
+//     InputStream analyticsFileStream;
+
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       /*@Test
+       public void getAnalyticsScriptTest() throws Exception
+       {
+               String expectedResponse = "http://www.ecomp.com";
+
+               InputStream analyticsFileStream = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(IOUtils.class);
+               Mockito.when(IOUtils.toString(analyticsFileStream, StandardCharsets.UTF_8.name())).thenReturn("PORTAL_ENV_URL");
+               Mockito.when(SystemProperties.getProperty("frontend_url")).thenReturn("http://www.ecomp.com/test");
+               String actualResponse = webAnalyticsExtAppController.getAnalyticsScript(mockedRequest);
+//     assertNull(webAnalyticsExtAppController.getAnalyticsScript(mockedRequest));
+               
+       //      System.out.println(actualResponse);
+               assertTrue(actualResponse.equals(expectedResponse));    
+       }*/
+
+       /*@Test
+       public void getAnalyticsScriptExceptionTest() throws Exception
+       {
+               String expectedResponse = "";
+               InputStream analyticsFileStream = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(IOUtils.class);
+               Mockito.when(IOUtils.toString(analyticsFileStream, StandardCharsets.UTF_8.name())).thenThrow(nullPointerException);
+               Mockito.when(SystemProperties.getProperty("frontend_url")).thenReturn("http://www.ecomp.com/test");
+       String actualResponse = webAnalyticsExtAppController.getAnalyticsScript(mockedRequest);
+         assertEquals(actualResponse,expectedResponse);
+       }*/
+
+       @Test
+       public void storeAnalyticsScriptIfAnalyticsNullTest() throws Exception
+       {
+               PortalAPIResponse       expectedPortalAPIResponse = new PortalAPIResponse(true, "error");
+               Analytics analytics= null;
+               Mockito.when(mockedRequest.getHeader("uebkey")).thenReturn(null);
+               PortalAPIResponse       actualPortalAPIResponse =       webAnalyticsExtAppController.storeAnalyticsScript(mockedRequest, analytics);
+               assertTrue(expectedPortalAPIResponse.getMessage().equals(actualPortalAPIResponse.getMessage()));
+               assertTrue(expectedPortalAPIResponse.getStatus().equals(actualPortalAPIResponse.getStatus()));  
+       }
+               
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogControllerTest.java
new file mode 100644 (file)
index 0000000..4087a59
--- /dev/null
@@ -0,0 +1,87 @@
+//package org.openecomp.portalapp.portal.controller;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//
+//import org.junit.Before;
+//import org.junit.runner.RunWith;
+//import org.mockito.InjectMocks;
+//import org.mockito.Mock;
+//import org.mockito.MockitoAnnotations;
+//import org.openecomp.portalapp.portal.core.MockEPUser;
+//import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+//import org.openecomp.portalapp.portal.service.ConsulHealthService;
+//import org.openecomp.portalapp.portal.service.ConsulHealthServiceImpl;
+//import org.openecomp.portalapp.portal.service.MicroserviceService;
+//import org.openecomp.portalapp.portal.service.MicroserviceServiceImpl;
+//import org.openecomp.portalapp.portal.service.WidgetParameterService;
+//import org.openecomp.portalapp.portal.service.WidgetParameterServiceImpl;
+//import org.openecomp.portalapp.util.EPUserUtils;
+//import org.powermock.core.classloader.annotations.PrepareForTest;
+//import org.powermock.modules.junit4.PowerMockRunner;
+//
+//@RunWith(PowerMockRunner.class)
+//@PrepareForTest({EPUserUtils.class})
+//public class WidgetsCatalogControllerTest {
+//
+//     @Mock
+//     ConsulHealthService consulHealthService = new ConsulHealthServiceImpl();
+//     
+//     @Mock
+//     MicroserviceService microserviceService = new MicroserviceServiceImpl();
+//     
+//     @Mock
+//     WidgetParameterService widgetParameterService = new WidgetParameterServiceImpl();
+//     
+//     @InjectMocks
+//     WidgetsCatalogController widgetsCatalogController = new WidgetsCatalogController();
+//
+//     @Before
+//     public void setup() {
+//             MockitoAnnotations.initMocks(this);
+//     }
+//
+//     MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+//
+//     HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+//     HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+//
+//     NullPointerException nullPointerException = new NullPointerException();
+//     
+//     MockEPUser mockUser = new MockEPUser();
+//     
+//     /*public List<WidgetCatalog> getUserWidgetCatalog(HttpServletRequest request, HttpServletResponse response,
+//                     @PathVariable("loginName") String loginName) throws RestClientException, Exception {
+//             List<WidgetCatalog> widgets = new ArrayList<>();
+//             try {
+//                     CustomLoggingFilter d;
+//                     ResponseEntity<ArrayList> ans = template.exchange(
+//                                     EcompPortalUtils.widgetMsProtocol() + "://" + consulHealthService.getServiceLocation(whatService,
+//                                                     SystemProperties.getProperty("microservices.widget.local.port"))
+//                                                     + "/widget/microservices/widgetCatalog/" + loginName,
+//                                     HttpMethod.GET, new HttpEntity(WidgetServiceHeaders.getInstance()), ArrayList.class);
+//                     widgets = ans.getBody();
+//             } catch (Exception e) {
+//                     logger.error(EELFLoggerDelegate.errorLogger, "getUserWidgetCatalog failed", e);
+//                     // returning null because null help check on the UI if there was a
+//                     // communication problem with Microservice.
+//                     return null;
+//             }
+//             return widgets;
+//     }
+//     
+//     @Test
+//     public void getWidgetDataTest(){
+//             
+//             String resourceType = null;
+//             List<WidgetCatalog> expectedData = new ArrayList<WidgetCatalog>();
+//             expectedData.setStatus(PortalRestStatusEnum.ERROR);
+//             expectedData.setMessage("Unexpected resource type null");
+//             expectedData.setResponse(null);
+//             
+//             PortalRestResponse<CommonWidgetMeta> actualResponse =   dashboardController.getWidgetData(mockedRequest, resourceType);
+//             assertEquals(expectedData,actualResponse);      
+//             
+//             
+//     }*/
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogMarkupControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/controller/WidgetsCatalogMarkupControllerTest.java
new file mode 100644 (file)
index 0000000..bba49f7
--- /dev/null
@@ -0,0 +1,72 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.controller.WidgetsCatalogMarkupController;
+import org.openecomp.portalapp.portal.domain.WidgetServiceHeaders;
+import org.openecomp.portalapp.portal.service.ConsulHealthService;
+import org.openecomp.portalapp.portal.service.ConsulHealthServiceImpl;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(WidgetServiceHeaders.class)
+public class WidgetsCatalogMarkupControllerTest extends MockitoTestSuite {
+       
+       @InjectMocks
+       WidgetsCatalogMarkupController widgetsCatalogMarkupController = new WidgetsCatalogMarkupController();
+       
+       @Mock
+       ConsulHealthService consulHealthService = new ConsulHealthServiceImpl();
+       
+       @Mock
+       RestTemplate template = new RestTemplate();
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+    @Mock
+    CipherUtil cipherUtil= new CipherUtil();
+    
+    @Mock
+    EcompPortalUtils EcompPortalUtils =new EcompPortalUtils();
+       
+       @Mock
+       WidgetServiceHeaders WidgetServiceHeaders ;
+       
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       @SuppressWarnings("static-access")
+       @Test
+       public void getWidgetMarkupTest() throws RestClientException, Exception
+       {
+               String whatService = "widgets-service";
+               PowerMockito.mockStatic(WidgetServiceHeaders.class);
+               Mockito.when(template.getForObject(EcompPortalUtils.widgetMsProtocol() + "://" + consulHealthService.getServiceLocation(whatService, null) + "/widget/microservices/markup/" + 1, String.class,
+                               WidgetServiceHeaders.getInstance())).thenReturn("Success");
+               String response = widgetsCatalogMarkupController.getWidgetMarkup(mockedRequest, mockedResponse, 1);
+               assertTrue(response.equals("Success")); 
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/MockEPUser.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/MockEPUser.java
new file mode 100644 (file)
index 0000000..9c220ce
--- /dev/null
@@ -0,0 +1,84 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.core;
+
+import java.util.Date;
+
+import org.openecomp.portalapp.portal.domain.EPUser;
+
+public class MockEPUser {
+
+       public EPUser mockEPUser() {
+
+               EPUser ePUser = new EPUser();
+               ePUser.setOrgId(null);
+               ePUser.setManagerId(null);
+               ePUser.setFirstName("test");
+               ePUser.setLastName("test");
+               ePUser.setMiddleInitial(null);
+               ePUser.setPhone(null);
+               ePUser.setFax(null);
+               ePUser.setCellular(null);
+               ePUser.setEmail(null);
+               ePUser.setAddressId(null);
+               ePUser.setAlertMethodCd(null);
+               ePUser.setHrid(null);
+               ePUser.setOrgUserId("guestT");
+               ePUser.setOrgCode(null);
+               ePUser.setAddress1(null);
+               ePUser.setAddress2(null);
+               ePUser.setCity(null);
+               ePUser.setState(null);
+               ePUser.setZipCode(null);
+               ePUser.setCountry(null);
+               ePUser.setOrgManagerUserId(null);
+               ePUser.setLocationClli(null);
+               ePUser.setBusinessCountryCode(null);
+               ePUser.setBusinessCountryName(null);
+               ePUser.setBusinessUnit(null);
+               ePUser.setBusinessUnitName(null);
+               ePUser.setDepartment(null);
+               ePUser.setDepartmentName(null);
+               ePUser.setCompanyCode(null);
+               ePUser.setCompany(null);
+               ePUser.setZipCodeSuffix(null);
+               ePUser.setJobTitle(null);
+               ePUser.setCommandChain(null);
+               ePUser.setSiloStatus(null);
+               ePUser.setCostCenter(null);
+               ePUser.setFinancialLocCode(null);
+
+               ePUser.setLoginId(null);
+               ePUser.setLoginPwd(null);
+               Date date = new Date();
+               ePUser.setLastLoginDate(date);
+               ePUser.setActive(true);
+               ePUser.setInternal(false);
+               ePUser.setSelectedProfileId(null);
+               ePUser.setTimeZoneId(null);
+               ePUser.setOnline(true);
+               ePUser.setChatId(null);
+               ePUser.setUserApps(null);
+               ePUser.setPseudoRoles(null);
+
+               ePUser.setId((long) -1);
+               return ePUser;
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/PopulateSampleTestData.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/PopulateSampleTestData.java
new file mode 100644 (file)
index 0000000..2458f47
--- /dev/null
@@ -0,0 +1,66 @@
+///*-
+// * ================================================================================
+// * ECOMP Portal
+// * ================================================================================
+// * Copyright (C) 2017 AT&T Intellectual Property
+// * ================================================================================
+// * Licensed 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.
+// * ================================================================================
+// */
+//package org.openecomp.portalapp.portal.core;
+//
+//import java.sql.Connection;
+//import java.sql.SQLException;
+//
+//import javax.sql.DataSource;
+//
+//import org.junit.Before;
+//import org.junit.Test;
+//import org.openecomp.portalapp.framework.ApplicationCommonContextTestSuite;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.core.io.ClassPathResource;
+//import org.springframework.jdbc.datasource.DataSourceUtils;
+//import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
+//
+//public class PopulateSampleTestData extends ApplicationCommonContextTestSuite {
+//
+//     @Autowired
+//     DataSource dataSource;
+//
+//     @Before
+//     public void populateTestData() throws SQLException {
+//
+//             String sql = "PopulateTestData.sql";
+//             createConnection(sql);
+//     }
+//
+//     public void createConnection(String sql) {
+//             Connection connection = null;
+//             ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
+//             populator.addScript(new ClassPathResource(sql));
+//             try {
+//                     connection = DataSourceUtils.getConnection(dataSource);
+//                     populator.populate(connection);
+//             } finally {
+//                     if (connection != null) {
+//                             DataSourceUtils.releaseConnection(connection, dataSource);
+//                     }
+//             }
+//     }
+//
+//     @Test
+//     public void populateTest() {
+//             assert (true);
+//     }
+//
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RemoveSampleTestData.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RemoveSampleTestData.java
new file mode 100644 (file)
index 0000000..1e20cd1
--- /dev/null
@@ -0,0 +1,65 @@
+///*-
+// * ================================================================================
+// * ECOMP Portal
+// * ================================================================================
+// * Copyright (C) 2017 AT&T Intellectual Property
+// * ================================================================================
+// * Licensed 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.
+// * ================================================================================
+// */
+//package org.openecomp.portalapp.portal.core;
+//
+//import java.sql.Connection;
+//import java.sql.SQLException;
+//
+//import javax.sql.DataSource;
+//
+//import org.junit.After;
+//import org.junit.Test;
+//import org.openecomp.portalapp.framework.ApplicationCommonContextTestSuite;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.core.io.ClassPathResource;
+//import org.springframework.jdbc.datasource.DataSourceUtils;
+//import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
+//
+//public class RemoveSampleTestData extends ApplicationCommonContextTestSuite {
+//     @Autowired
+//     DataSource dataSource;
+//
+//     public static int count = 0;
+//
+//     @After
+//     public void removeTestData() throws SQLException {
+//             String sql = "RemoveTestData.sql";
+//             createConnection(sql);
+//     }
+//
+//     public void createConnection(String sql) {
+//             Connection connection = null;
+//             ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
+//             populator.addScript(new ClassPathResource(sql));
+//             try {
+//                     connection = DataSourceUtils.getConnection(dataSource);
+//                     populator.populate(connection);
+//             } finally {
+//                     if (connection != null) {
+//                             DataSourceUtils.releaseConnection(connection, dataSource);
+//                     }
+//             }
+//     }
+//
+//     @Test
+//     public void removeTest() {
+//             assert (true);
+//     }
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RestURLsTestSuite.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/core/RestURLsTestSuite.java
new file mode 100644 (file)
index 0000000..4ff2b8d
--- /dev/null
@@ -0,0 +1,334 @@
+///*-
+// * ================================================================================
+// * ECOMP Portal
+// * ================================================================================
+// * Copyright (C) 2017 AT&T Intellectual Property
+// * ================================================================================
+// * Licensed 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.
+// * ================================================================================
+// */
+//package org.openecomp.portalapp.portal.core;
+//
+//import static org.junit.Assert.assertEquals;
+//import static org.junit.Assert.assertTrue;
+//
+//import java.io.IOException;
+//import java.nio.charset.Charset;
+//import java.util.ArrayList;
+//
+//import org.junit.Assert;
+//import org.junit.Test;
+//import org.openecomp.portalapp.framework.ApplicationCommonContextTestSuite;
+//import org.openecomp.portalapp.portal.domain.EPUser;
+//import org.openecomp.portalapp.portal.test.core.MockEPUser;
+//import org.openecomp.portalapp.portal.transport.AppNameIdIsAdmin;
+//import org.openecomp.portalapp.portal.transport.AppsListWithAdminRole;
+//import org.openecomp.portalsdk.core.util.SystemProperties;
+//import org.springframework.http.MediaType;
+//import org.springframework.test.web.servlet.ResultActions;
+//import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+//import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+//
+//import com.fasterxml.jackson.annotation.JsonInclude;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//
+///**
+// * 
+// * Use RestURLsTestSuite to test Rest API URL's
+// */
+//public class RestURLsTestSuite extends ApplicationCommonContextTestSuite {
+//
+//     public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(),
+//                     MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
+//
+//     String url = null;
+//
+//     MockEPUser mockUser = new MockEPUser();
+//
+//     public byte[] convertObjectToJsonBytes(Object object) throws IOException {
+//             ObjectMapper mapper = new ObjectMapper();
+//             mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+//             return mapper.writeValueAsBytes(object);
+//     }
+//
+//     public void requestBuilder(String url) throws Exception {
+//             EPUser user = mockUser.mockEPUser();
+//
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(url);
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertData(ra);
+//     }
+//
+//     public void assertData(ResultActions ra) {
+//             Assert.assertEquals("application/json", ra.andReturn().getResponse().getContentType());
+//             Assert.assertEquals(200, ra.andReturn().getResponse().getStatus());
+//
+//     }
+//
+//     @Test
+//     public void getMenuItemsTest() throws Exception {
+//             url = "/portalApi/functionalMenu";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getMenuItemsForNotificationsTest() throws Exception {
+//             url = "/portalApi/functionalMenuForNotificationTree";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getUserAppsTestnew() throws Exception {
+//             url = "/portalApi/userApps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getPersUserAppsTest() throws Exception {
+//             url = "/portalApi/persUserApps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAppCatalogTest() throws Exception {
+//             url = "/portalApi/appCatalog";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAppListNewTest() throws Exception {
+//             ResultActions ra = getMockMvc()
+//                             .perform(MockMvcRequestBuilders.get("/portalApi/userApplicationRoles").param("userId", "guest"));
+//             assertData(ra);
+//     }
+//
+//     @Test
+//     public void getAvailableAppListTest() throws Exception {
+//             url = "/portalApi/availableApps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAllAppsTest() throws Exception {
+//             url = "/portalApi/allAvailableApps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getUserProfileTest() throws Exception {
+//             url = "/portalApi/userProfile";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getRolesByAppTest() throws Exception {
+//             EPUser user = mockUser.mockEPUser();
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/portalApi/adminAppsRoles/550");
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertData(ra);
+//     }
+//
+//     @Test
+//     public void getAppsWithAdminRoleStateForUserTest() throws Exception {
+//             url = "/portalApi/adminAppsRoles?user=guest";
+//             requestBuilder(url);
+//
+//     }
+//
+//     @Test
+//     public void getUsersFromAppEndpointTest() throws Exception {
+//             url = "/portalApi/app/550/users";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getOnboardingAppsTest() throws Exception {
+//             url = "/portalApi/onboardingApps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getMenuItemsForAuthUserTest() throws Exception {
+//             url = "/portalApi/functionalMenuForAuthUser";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getMenuItemsForEditingTest() throws Exception {
+//             url = "/portalApi/functionalMenuForEditing";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAppRolesTest() throws Exception {
+//             url = "/portalApi/appRoles/455";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void regenerateAncestorTableTest() throws Exception {
+//
+//             EPUser user = mockUser.mockEPUser();
+//
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
+//                             .get("/portalApi/regenerateFunctionalMenuAncestors");
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertEquals("application/json;charset=UTF-8", ra.andReturn().getResponse().getContentType());
+//             Assert.assertEquals(200, ra.andReturn().getResponse().getStatus());
+//
+//     }
+//
+//     @Test
+//     public void getAppListTest() throws Exception {
+//             url = "/portalApi/getAppList";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getFavoritesForUserTest() throws Exception {
+//             url = "/portalApi/getFavoriteItems";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getManifestTest() throws Exception {
+//             url = "/portalApi/manifest";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getActiveUsersTest() throws Exception {
+//             url = "/portalApi/dashboard/activeUsers";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void searchPortalTest() throws Exception {
+//             EPUser user = mockUser.mockEPUser();
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/portalApi/dashboard/search")
+//                             .param("searchString", "guest");
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertData(ra);
+//     }
+//
+//     @Test
+//     public void getWidgetDataTest() throws Exception {
+//             EPUser user = mockUser.mockEPUser();
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/portalApi/dashboard/widgetData")
+//                             .param("resourceType", "guest");
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertData(ra);
+//     }
+//
+//     @Test
+//     public void getAppsAndContactsTest() throws Exception {
+//             url = "/portalApi/contactus/allapps";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getPortalDetailsTest() throws Exception {
+//             url = "/portalApi/contactus/feedback";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAppCategoryFunctionsTest() throws Exception {
+//             url = "/portalApi/contactus/functions";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getOnlineUserUpdateRateTest() throws Exception {
+//             url = "/portalApi/dashboard/onlineUserUpdateRate";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getMenuIdRoleIdTest() throws Exception {
+//             url = "/portalApi/getFunctionalMenuRole";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getNotificationsTest() throws Exception {
+//             url = "/portalApi/getNotifications";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getAdminNotificationsTest() throws Exception {
+//             url = "/portalApi/getAdminNotifications";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getNotificationAppRolesTest() throws Exception {
+//             url = "/portalApi/getNotificationAppRoles";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void getNotificationUpdateRateTest() throws Exception {
+//             url = "/portalApi/notificationUpdateRate";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void notificationReadTest() throws Exception {
+//             url = "/portalApi/notificationRead?notificationId=262";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void testGetRolesTest() throws Exception {
+//             url = "/portalApi/notificationRole/248/roles";
+//             requestBuilder(url);
+//     }
+//
+//     @Test
+//     public void putAppsWithAdminRoleStateForUserTest() throws Exception {
+//
+//             AppsListWithAdminRole appsListWithAdminRole = new AppsListWithAdminRole();
+//             appsListWithAdminRole.setOrgUserId("guest");
+//             ArrayList<AppNameIdIsAdmin> appsRoles = new ArrayList<AppNameIdIsAdmin>();
+//             AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+//             appNameIdIsAdmin.setId((long) 455);
+//             appNameIdIsAdmin.setAppName("CCD");
+//             appNameIdIsAdmin.setIsAdmin(true);
+//             appNameIdIsAdmin.setRestrictedApp(false);
+//             appsRoles.add(appNameIdIsAdmin);
+//             appsListWithAdminRole.setAppsRoles(appsRoles);
+//             EPUser user = mockUser.mockEPUser();
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.put("/portalApi/adminAppsRoles")
+//                             .contentType(APPLICATION_JSON_UTF8).content(convertObjectToJsonBytes(appsListWithAdminRole));
+//
+//             requestBuilder.sessionAttr(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME), user);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertData(ra);
+//     }
+//
+//     @Test
+//     public void ticketEventControllerForExternalSystem() throws Exception {
+//             String ticketEventJson = "{\"application\": \"cbus\",\"event\": {\"body\": {\"ticketStatePhrase\": \"We recently detected a problem with the equipment at your site. The event is in queue for immediate work.\", \"ivrNotificationFlag\": \"1\",\"expectedRestoreDate\": 0,\"bridgeTransport\": \"AOTS\",  \"reptRequestType\": 0,\"ticketNum\": \"000002000857405\",\"assetID\": \"CISCO_1921C1_ISR_G2\", \"eventDate\": 1490545134601,\"eventAbstract\": \"ospfIfConfigError trap received from Cisco_1921c1_ISR_G2 with arguments: ospfRouterId=Cisco_1921c1_ISR_G2; ospfIfIpAddress=1921c1_288266; ospfAddressLessIf=0; ospfPacketSrc=172.17.0.11; ospfConfigErrorType=2; ospfPacketType=1\",\"severity\": \"2 - Major\",\"ticketPriority\": \"3\",\"reportedCustomerImpact\": 0,\"testAutoIndicator\": 0,\"supportGroupName\": \"US-TEST-ORT\",\"lastModifiedDate\": \"1487687703\",\"messageGroup\": \"SNMP\",\"csi\": 0,\"mfabRestoredTime\": 0},\"header\": {\"timestamp\": \"2017-02-21T14:35:05.219+0000\",\"eventSource\": \"aotstm\",\"entityId\": \"000002000857405\",      \"sequenceNumber\": 2 },\"blinkMsgId\": \"f38c071e-1a47-4b55-9e72-1db830100a61\",\"sourceIP\": \"130.4.165.158\"},\"SubscriberInfo\": {\"UserList\": [\"hk8777\"] }}";
+//             MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/auxapi/ticketevent")
+//                             .contentType(APPLICATION_JSON_UTF8).content(ticketEventJson);
+//             ResultActions ra = getMockMvc().perform(requestBuilder);
+//             assertTrue(ra.andReturn().getResponse().getContentType().contains("application/json"));
+//     }
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserAppTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserAppTest.java
new file mode 100644 (file)
index 0000000..8e56a77
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AdminUserApp;
+
+public class AdminUserAppTest {
+
+       public AdminUserApp mockAdminUserApp(){
+               
+               AdminUserApp adminUserApp = new AdminUserApp();
+       
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               
+               return adminUserApp;
+       }
+       
+       @Test
+       public void adminUserAppTest(){
+               AdminUserApp adminUserApp = mockAdminUserApp();
+               
+               assertEquals(adminUserApp.getUser_Id(), new Long(1));
+               assertEquals(adminUserApp.getFirstName(), "test");
+               assertEquals(adminUserApp.getLastName(), "test");
+               assertEquals(adminUserApp.getOrgUserId(), "test");
+               assertEquals(adminUserApp.getAppName(), "test");
+               assertEquals(adminUserApp.getAppId(), new Long(1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserApplicationsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AdminUserApplicationsTest.java
new file mode 100644 (file)
index 0000000..2c3c930
--- /dev/null
@@ -0,0 +1,57 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AdminUserApp;
+import org.openecomp.portalapp.portal.domain.AdminUserApplications;
+
+public class AdminUserApplicationsTest {
+
+       public AdminUserApplications mockAdminUserApplications(){
+               
+               AdminUserApp adminUserApp = new AdminUserApp();
+               
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               
+               AdminUserApplications adminUserApplications = new AdminUserApplications(adminUserApp);
+               
+               adminUserApplications.setUser_Id((long)1);
+               adminUserApplications.setFirstName("test");
+               adminUserApplications.setLastName("test");
+               adminUserApplications.setOrgUserId("test");     
+               return adminUserApplications;
+       }
+       
+       @Test
+       public void adminUserAppTest(){
+               AdminUserApplications adminUserApplications = mockAdminUserApplications();
+           AdminUserApp adminUserApp = new AdminUserApp();
+               
+               adminUserApp.setUserId((long)1);
+               adminUserApp.setFirstName("test");
+               adminUserApp.setLastName("test");
+               adminUserApp.setOrgUserId("test");
+               adminUserApp.setAppId((long)1);
+               adminUserApp.setAppName("test");
+               AdminUserApplications adminUserApplications1 = new AdminUserApplications(adminUserApp);
+               
+               assertEquals(adminUserApplications.getUser_Id(), new Long(1));
+               assertEquals(adminUserApplications.getFirstName(), "test");
+               assertEquals(adminUserApplications.getLastName(), "test");
+               assertEquals(adminUserApplications.getOrgUserId(), "test");
+               
+               
+               assertEquals(adminUserApplications1.getApps().get(0).getAppId(),adminUserApp.getAppId());
+               assertEquals(adminUserApplications1.getApps().get(0).getAppName(),adminUserApp.getAppName());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AppContactUsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/AppContactUsTest.java
new file mode 100644 (file)
index 0000000..474434d
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.AppContactUs;
+
+public class AppContactUsTest {
+
+       public AppContactUs  mockAppContactUs(){
+               AppContactUs appContactUs = new AppContactUs();
+               appContactUs.setDescription("test");
+               appContactUs.setContactEmail("test");
+               appContactUs.setContactName("test");
+               appContactUs.setUrl("test");
+               appContactUs.setActiveYN("test");
+                               
+               return appContactUs;
+       }
+       
+       @Test
+       public void mockAppContactUsTest(){
+               AppContactUs appContactUs = mockAppContactUs();
+               
+               assertEquals(appContactUs.getDescription(), "test");
+               assertEquals(appContactUs.getContactEmail(), "test");
+               assertEquals(appContactUs.getContactName(), "test");
+               assertEquals(appContactUs.getUrl(), "test");
+               assertEquals(appContactUs.getActiveYN(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/CentralRoleFunctionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/CentralRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..4c05160
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+
+public class CentralRoleFunctionTest {
+
+       public CentralRoleFunction mockCentralRoleFunction(){
+               
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+                  
+                  centralRoleFunction.setCode("test");
+                  centralRoleFunction.setName("test");
+                  centralRoleFunction.setAppId((long)1);
+                  centralRoleFunction.setEditUrl("test");
+                  
+               return centralRoleFunction;
+       }
+       
+       @Test
+       public void centralRoleFunctionTest(){
+               CentralRoleFunction centralRoleFunction = mockCentralRoleFunction();
+               
+               assertEquals(centralRoleFunction.getAppId(), new Long(1));
+               assertEquals(centralRoleFunction.getCode(), "test");
+               assertEquals(centralRoleFunction.getName(), "test");
+               assertEquals(centralRoleFunction.getEditUrl(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppRoleFunctionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..864b6aa
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+
+public class EPAppRoleFunctionTest {
+
+       public EPAppRoleFunction mockEPAppRoleFunction(){
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               return epAppRoleFunction;
+       }
+       
+       @Test
+       public void epAppRoleFunctionTest(){
+               EPAppRoleFunction epAppRoleFunction = mockEPAppRoleFunction();
+               
+               assertEquals(epAppRoleFunction.getRoleId(), new Long(1));
+               assertEquals(epAppRoleFunction.getAppId(), new Long(1));
+               assertEquals(epAppRoleFunction.getCode(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPAppTest.java
new file mode 100644 (file)
index 0000000..eb92b88
--- /dev/null
@@ -0,0 +1,61 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPApp;
+
+public class EPAppTest {
+
+       public EPApp mockEPApp(){
+               EPApp epApp = new EPApp();
+                               
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+               epApp.setOpen(false);
+               epApp.setEnabled(false);
+               epApp.setUebTopicName("test");
+               epApp.setUebSecret("test");
+               epApp.setAppType(1);
+               epApp.setCentralAuth(false);
+               epApp.setNameSpace("test");
+               
+               return epApp;
+       }
+       
+       @Test
+       public void epAppTest(){
+               EPApp epApp = mockEPApp();
+               
+               assertEquals(epApp.getName(), "test");
+               assertEquals(epApp.getImageUrl(), "test");
+               assertEquals(epApp.getDescription(), "test");
+               assertEquals(epApp.getNotes(), "test");
+               assertEquals(epApp.getUrl(), "test");
+               assertEquals(epApp.getAlternateUrl(), "test");
+               assertEquals(epApp.getAppRestEndpoint(), "test");
+               assertEquals(epApp.getMlAppName(), "test");
+               assertEquals(epApp.getMlAppAdminId(), "test");
+               assertEquals(epApp.getMotsId(), new Long(1));
+               assertEquals(epApp.getUsername(), "test");
+               assertEquals(epApp.getAppPassword(), "test");
+               assertEquals(epApp.getOpen(), false);
+               assertEquals(epApp.getEnabled(), false);
+               assertEquals(epApp.getUebTopicName(), "test");
+               assertEquals(epApp.getUebSecret(), "test");
+               assertEquals(epApp.getAppType(), Integer.valueOf(1));
+               assertEquals(epApp.getCentralAuth(), false);
+               assertEquals(epApp.getNameSpace(), "test");
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointAccountTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointAccountTest.java
new file mode 100644 (file)
index 0000000..c19ecf8
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPEndpointAccount;
+
+public class EPEndpointAccountTest {
+
+       public EPEndpointAccount mockEPEndpointAccount(){
+               EPEndpointAccount epEndpointAccount = new EPEndpointAccount();
+               
+               epEndpointAccount.setEp_id((long)1);
+               epEndpointAccount.setAccount_id((long)1);
+               epEndpointAccount.setId((long)1);
+               
+               return epEndpointAccount;
+       }
+       
+       @Test
+       public void epEndpointAccount(){
+               EPEndpointAccount epEndpointAccount = mockEPEndpointAccount();
+               assertEquals(epEndpointAccount.getEp_id(), new Long(1));
+               assertEquals(epEndpointAccount.getAccount_id(), new Long(1));
+               assertEquals(epEndpointAccount.getId(), new Long(1));
+               
+               assertEquals(epEndpointAccount.toString(), "EPEndpointAccount [id=1, ep_id=1, account_id=1]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPEndpointTest.java
new file mode 100644 (file)
index 0000000..45184de
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPEndpoint;
+
+public class EPEndpointTest {
+
+       public EPEndpoint mockEPEndpoint(){
+               EPEndpoint epEndpoint = new EPEndpoint();
+               
+               epEndpoint.setId((long)1);
+               epEndpoint.setName("test");
+               
+               return epEndpoint;
+       }
+       
+       @Test
+       public void epEndpointTest(){
+               EPEndpoint epEndpoint = mockEPEndpoint();
+               
+               assertEquals(epEndpoint.getId(), new Long(1));
+               assertEquals(epEndpoint.getName(), "test");
+               assertEquals("EPEndpoint [id=1, name=test]", epEndpoint.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPRoleTest.java
new file mode 100644 (file)
index 0000000..830eaa5
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPRole;
+
+public class EPRoleTest {
+
+       public EPRole mockEPRole(){
+               EPRole epRole = new EPRole();
+               
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+                  
+               return epRole;
+       }
+       
+       @Test
+       public void epRoleTest(){
+               EPRole epRole = mockEPRole();
+               
+               assertEquals(epRole.getName(), "test");
+               assertEquals(epRole.getActive(), false);
+               assertEquals(epRole.getPriority().toString(),"1");
+               assertEquals(epRole.getAppId(), new Long(1));
+               assertEquals(epRole.getAppRoleId(), new Long(1));
+               
+               assertEquals(epRole.toString(), "[Id = null, name = test]");
+
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppCatalogRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppCatalogRolesTest.java
new file mode 100644 (file)
index 0000000..40bb16c
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppCatalogRoles;
+
+public class EPUserAppCatalogRolesTest {
+
+       public EPUserAppCatalogRoles mockEPUserAppCatalogRoles(){
+               EPUserAppCatalogRoles epUserAppCatalogRoles = new EPUserAppCatalogRoles();
+                               
+               epUserAppCatalogRoles.setRequestedRoleId((long)1);
+               epUserAppCatalogRoles.setRolename("test");
+               epUserAppCatalogRoles.setRequestStatus("status");
+               epUserAppCatalogRoles.setAppId((long)1);
+               
+               return epUserAppCatalogRoles;
+       }
+       
+       @Test
+       public void epUserAppCatalogRolesTest(){
+               EPUserAppCatalogRoles epUserAppCatalogRoles = mockEPUserAppCatalogRoles();
+               
+               assertEquals(epUserAppCatalogRoles.getRequestedRoleId(), new Long(1));
+               assertEquals(epUserAppCatalogRoles.getRolename(), "test");
+               assertEquals(epUserAppCatalogRoles.getRequestStatus(), "status");
+               assertEquals(epUserAppCatalogRoles.getAppId(), new Long(1));
+               
+               assertEquals("EPUserAppCatalogRoles [requestedRoleId=1, rolename=test, requestStatus=status, appId=1]", epUserAppCatalogRoles.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesRequestDetailTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesRequestDetailTest.java
new file mode 100644 (file)
index 0000000..fec58db
--- /dev/null
@@ -0,0 +1,54 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppRolesRequest;
+import org.openecomp.portalapp.portal.domain.EPUserAppRolesRequestDetail;
+
+public class EPUserAppRolesRequestDetailTest {
+
+       public EPUserAppRolesRequestDetail mockEPUserAppRolesRequestDetail(){
+               
+               EPUserAppRolesRequest epUserAppRolesRequest = new EPUserAppRolesRequest();
+               epUserAppRolesRequest.setUserId((long)1);
+               epUserAppRolesRequest.setAppId((long)1);
+               epUserAppRolesRequest.setCreated(new Date());
+               epUserAppRolesRequest.setUpdatedDate(new Date());
+               epUserAppRolesRequest.setRequestStatus("test");
+                       
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail = new EPUserAppRolesRequestDetail();
+               epUserAppRolesRequestDetail.setReqRoleId((long)1);
+               epUserAppRolesRequestDetail.setReqType("test");
+               epUserAppRolesRequestDetail.setEpRequestIdData(epUserAppRolesRequest);
+               
+               return epUserAppRolesRequestDetail;
+       }
+       
+       @Test
+       public void epUserAppRolesRequestDetailTest(){
+               
+               EPUserAppRolesRequest epUserAppRolesRequest = new EPUserAppRolesRequest();
+               epUserAppRolesRequest.setUserId((long)1);
+               epUserAppRolesRequest.setAppId((long)1);
+               epUserAppRolesRequest.setCreated(new Date());
+               epUserAppRolesRequest.setUpdatedDate(new Date());
+               epUserAppRolesRequest.setRequestStatus("test");
+               
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail = mockEPUserAppRolesRequestDetail();
+               
+               EPUserAppRolesRequestDetail epUserAppRolesRequestDetail1 = new EPUserAppRolesRequestDetail();
+               epUserAppRolesRequestDetail1.setReqRoleId((long)1);
+               epUserAppRolesRequestDetail1.setReqType("test");
+               epUserAppRolesRequestDetail1.setEpRequestIdData(epUserAppRolesRequest);
+               
+               assertEquals(epUserAppRolesRequestDetail.getReqRoleId(), new Long(1));
+               assertEquals(epUserAppRolesRequestDetail.getReqType(), "test");
+               assertEquals(epUserAppRolesRequestDetail.getEpRequestIdData(), epUserAppRolesRequest);
+//             assertEquals(epUserAppRolesRequestDetail.hashCode(), epUserAppRolesRequestDetail1.hashCode());
+               
+       }               
+               
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppRolesTest.java
new file mode 100644 (file)
index 0000000..b13ae14
--- /dev/null
@@ -0,0 +1,28 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppRoles;
+
+public class EPUserAppRolesTest {
+
+       public EPUserAppRoles mockEPUserAppRoles(){
+               EPUserAppRoles epUserAppRoles = new EPUserAppRoles();
+               
+               epUserAppRoles.setRoleId((long)1);
+               epUserAppRoles.setAppId((long)1); 
+               
+               return epUserAppRoles;
+       }
+       
+       @Test
+       public void epUserAppRolesTest(){
+               EPUserAppRoles epUserAppRoles = mockEPUserAppRoles();
+               
+               assertEquals(epUserAppRoles.getRoleId(), new Long(1));
+               assertEquals(epUserAppRoles.getAppId(), new Long(1));
+               assertEquals("EpUserAppRoles [roleId=1, appId=1]", epUserAppRoles.toString());
+       }
+}
+
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppTest.java
new file mode 100644 (file)
index 0000000..0de0b59
--- /dev/null
@@ -0,0 +1,85 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUserApp;
+
+public class EPUserAppTest {
+
+       public EPUserApp mockEPUserApp(){
+               
+               EPApp epApp = new EPApp();
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+                       
+               
+               //Role
+               EPRole epRole = new EPRole();
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+               
+               EPUserApp user = new EPUserApp();
+               user.setUserId((long)1);
+               user.setApp(epApp);
+               user.setRole(epRole);
+               user.setPriority((short)32767);
+               
+               
+               return user;
+       }
+       
+       @Test
+       public void userTest(){
+               EPUserApp user = mockEPUserApp();
+               
+               EPApp epApp = new EPApp();
+               epApp.setName("test");
+               epApp.setImageUrl("test");
+               epApp.setDescription("test");
+               epApp.setNotes("test");
+               epApp.setUrl("test");
+               epApp.setAlternateUrl("test");
+               epApp.setAppRestEndpoint("test");
+               epApp.setMlAppName("test");
+               epApp.setMlAppAdminId("test");
+               epApp.setMotsId((long)1);
+               epApp.setUsername("test");
+               epApp.setAppPassword("test");
+               user.setApp(epApp);
+               
+               //Role
+               EPRole epRole = new EPRole();
+               epRole.setName("test");
+               epRole.setActive(false);
+               epRole.setPriority(1);
+               epRole.setAppId((long)1);
+               epRole.setAppRoleId((long)1);
+               
+               
+        assertEquals(user.getUserId(),Long.valueOf(1));
+               assertEquals(user.getApp(), epApp); 
+               assertEquals(user.getPriority().getClass(), Short.class);
+       
+               assertEquals(user.toString(), "[u: 1; a: null, r: null; appRoleId: 1]");
+               
+               assertEquals(user.hashCode(), user.hashCode());
+               
+               
+               }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsManualSortPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsManualSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..0f4bb62
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppsManualSortPreference;
+
+public class EPUserAppsManualSortPreferenceTest {
+
+       public EPUserAppsManualSortPreference mockEPUserAppsManualSortPreference(){
+               
+               EPUserAppsManualSortPreference epUserAppsManualSortPreference = new EPUserAppsManualSortPreference();
+               epUserAppsManualSortPreference.setUserId(1);
+               epUserAppsManualSortPreference.setAppId((long)1);
+               epUserAppsManualSortPreference.setAppManualSortOrder(1);
+               
+               return epUserAppsManualSortPreference;
+       }
+       
+       @Test
+       public void epUserAppsManualSortPreferenceTest(){
+       
+               EPUserAppsManualSortPreference epUserAppsManualSortPreference = mockEPUserAppsManualSortPreference();
+               
+               assertEquals(epUserAppsManualSortPreference.getUserId(), 1);
+               assertEquals(epUserAppsManualSortPreference.getAppId(), new Long(1));
+               assertEquals(epUserAppsManualSortPreference.getAppManualSortOrder(), 1);
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsSortPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserAppsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..4f70ea7
--- /dev/null
@@ -0,0 +1,43 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserAppsSortPreference;
+
+public class EPUserAppsSortPreferenceTest {
+
+       public EPUserAppsSortPreference mockEPUserAppsSortPreferenceTest(){
+
+               EPUserAppsSortPreference epUserAppsSortPreference = new EPUserAppsSortPreference();
+               epUserAppsSortPreference.setUserId(1);
+               epUserAppsSortPreference.setSortPref("test");
+               epUserAppsSortPreference.setId((long)1);
+               epUserAppsSortPreference.setCreated(new Date());
+               epUserAppsSortPreference.setModified(new Date());
+               epUserAppsSortPreference.setModifiedId((long)1);
+               epUserAppsSortPreference.setRowNum((long)1);
+               epUserAppsSortPreference.setAuditTrail(null);
+               
+               return epUserAppsSortPreference;
+       }
+       
+       @Test
+       public void epUserAppsSortPreferenceTest() {
+               EPUserAppsSortPreference epUserAppsSortPreference = mockEPUserAppsSortPreferenceTest();
+               
+               assertEquals(epUserAppsSortPreference.getUserId(), 1);
+               assertEquals(epUserAppsSortPreference.getSortPref(), "test");
+               assertEquals(epUserAppsSortPreference.getId(), new Long(1));
+//             assertEquals(epUserAppsSortPreference.getCreated(), new Date());
+//             assertEquals(epUserAppsSortPreference.getModified(), new Date());
+               assertEquals(epUserAppsSortPreference.getModifiedId(), new Long(1));
+               assertEquals(epUserAppsSortPreference.getRowNum(), new Long(1));
+               assertEquals(epUserAppsSortPreference.getAuditTrail(), null);
+               
+               
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserNotificationTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserNotificationTest.java
new file mode 100644 (file)
index 0000000..e896d08
--- /dev/null
@@ -0,0 +1,34 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUserNotification;
+
+public class EPUserNotificationTest {
+
+       public EPUserNotification mockEPUserNotification(){
+               
+               EPUserNotification epUserNotification = new EPUserNotification();
+                               
+               epUserNotification.setUserId((long)1);
+               epUserNotification.setNotificationId((long)1);
+               epUserNotification.setViewed("test");
+               epUserNotification.setUpdateTime(new Date());           
+               
+               return epUserNotification;
+       }
+       
+       @Test
+       public void epUserNotificationTest(){
+               EPUserNotification epUserNotification = mockEPUserNotification();
+               
+               assertEquals(epUserNotification.getUserId(), new Long(1));
+               assertEquals(epUserNotification.getNotificationId(), new Long(1));
+               assertEquals(epUserNotification.getViewed(), "test");
+       //      assertEquals(epUserNotification.getUpdateTime(), new Date());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPUserTest.java
new file mode 100644 (file)
index 0000000..98065a2
--- /dev/null
@@ -0,0 +1,114 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPUser;
+
+public class EPUserTest {
+
+       public EPUser mockEPUser(){
+               
+               EPUser epUser = new EPUser();
+               
+               epUser.setId((long)1);
+               epUser.setManagerId((long) 1234);
+               epUser.setFirstName("test");
+               epUser.setLastName("test");
+               epUser.setMiddleInitial("test");
+               epUser.setPhone("test");
+               epUser.setFax("test");
+               epUser.setCellular("test");
+               epUser.setEmail("test");
+               epUser.setAddressId((long) 123); 
+               epUser.setAlertMethodCd("test");
+               epUser.setHrid("test");
+               epUser.setOrgUserId("test");
+               epUser.setOrgCode("test");
+               epUser.setAddress1("test");
+               epUser.setAddress2("test");
+               epUser.setCity("test");
+               epUser.setState("test");
+               epUser.setZipCode("test");
+               epUser.setCountry("test");
+               epUser.setOrgManagerUserId("test");
+               epUser.setLocationClli("test");
+               epUser.setBusinessCountryCode("test");
+               epUser.setBusinessCountryName("test");
+               epUser.setBusinessUnit("test");
+               epUser.setBusinessUnitName("test");
+               epUser.setDepartment("test");
+               epUser.setDepartmentName("test");
+               epUser.setCompanyCode("test");
+               epUser.setCompany("test");
+               epUser.setZipCodeSuffix("test");
+               epUser.setJobTitle("test");
+               epUser.setCommandChain("test");
+               epUser.setSiloStatus("test");
+               epUser.setCostCenter("test");
+               epUser.setFinancialLocCode("test");
+               epUser.setLoginId("test");
+               epUser.setLoginPwd("test");
+               epUser.setLastLoginDate(new Date());
+               epUser.setActive(false);
+               epUser.setInternal(false);
+               epUser.setSelectedProfileId((long) 12345);
+               epUser.setTimeZoneId((long) 12345);
+               epUser.setOnline(false);
+               epUser.setChatId("test");
+               return epUser;
+                                   
+       }
+       
+       @Test
+       public void userTest(){
+               EPUser user = mockEPUser();
+               
+               assertEquals(user.getId(), new Long(1));
+               assertEquals(user.getManagerId(), new Long(1234));
+               assertEquals(user.getFirstName(), "test");
+               assertEquals(user.getLastName(), "test");
+               assertEquals(user.getMiddleInitial(), "test");
+               assertEquals(user.getPhone(), "test");
+               assertEquals(user.getFax(), "test");
+               assertEquals(user.getCellular(), "test");               
+               assertEquals(user.getEmail(), "test");
+               assertEquals(user.getAddressId(), new Long(123) );
+               assertEquals(user.getAlertMethodCd(), "test");
+               assertEquals(user.getHrid(), "test");
+               assertEquals(user.getOrgUserId(), "test");
+               assertEquals(user.getOrgCode(), "test");
+               assertEquals(user.getAddress1(), "test");
+               assertEquals(user.getAddress2(), "test");
+               assertEquals(user.getState(), "test");
+               assertEquals(user.getZipCode(), "test");
+               assertEquals(user.getCountry(), "test");
+               assertEquals(user.getOrgManagerUserId(), "test");
+               assertEquals(user.getLocationClli(), "test");
+               assertEquals(user.getBusinessCountryCode(), "test");
+               assertEquals(user.getBusinessCountryName(), "test");
+               assertEquals(user.getBusinessUnit(), "test");
+               assertEquals(user.getBusinessUnitName(), "test");
+               assertEquals(user.getDepartment(), "test");
+               assertEquals(user.getDepartmentName(), "test");
+               assertEquals(user.getCompanyCode(), "test");
+               assertEquals(user.getCompany(), "test");
+               assertEquals(user.getZipCodeSuffix(), "test");
+               assertEquals(user.getJobTitle(), "test");
+               assertEquals(user.getCommandChain(), "test");
+               assertEquals(user.getSiloStatus(), "test");
+               assertEquals(user.getFinancialLocCode(), "test");
+               assertEquals(user.getLoginId(), "test");
+               assertEquals(user.getLoginPwd(), "test");
+               assertEquals(user.getActive(), false);
+               assertEquals(user.getInternal(), false);
+               assertEquals(user.getSelectedProfileId(), new Long (12345));
+               assertEquals(user.getTimeZoneId(), new Long (12345));
+               assertEquals(user.getChatId(), "test");
+               
+               //assertEquals(user.toString(), "EPUser [orgId=null, managerId=1234, firstName=test, middleInitial=test, lastName=test, phone=test, fax=test, cellular=test, email=test, addressId=123, alertMethodCd=test, hrid=test, orgUserId=test, orgCode=test, address1=test, address2=test, city=test, state=test, zipCode=test, country=test, orgManagerUserId=test, locationClli=test, businessCountryCode=test, businessCountryName=test, businessUnit=test, businessUnitName=test, department=test, departmentName=test, companyCode=test, company=test, zipCodeSuffix=test, jobTitle=test, commandChain=test, siloStatus=test, costCenter=test, financialLocCode=test, loginId=test, loginPwd=test, lastLoginDate=Tue Sep 05 11:04:49 EDT 2017, active=false, internal=false, selectedProfileId=12345, timeZoneId=12345, online=false, chatId=test, isGuest=false, userApps=[], pseudoRoles=[]]");
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPWidgetsManualSortPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EPWidgetsManualSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..fd7cb76
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPWidgetsManualSortPreference;
+
+public class EPWidgetsManualSortPreferenceTest {
+
+       public EPWidgetsManualSortPreference mockEPWidgetsManualSortPreference(){
+               EPWidgetsManualSortPreference epWidgetsManualSortPreference = new EPWidgetsManualSortPreference();
+                               
+               epWidgetsManualSortPreference.setUserId(1);
+               epWidgetsManualSortPreference.setWidgetId((long)1);
+               epWidgetsManualSortPreference.setWidgetRow(1);
+               epWidgetsManualSortPreference.setWidgetCol(1);
+               epWidgetsManualSortPreference.setWidgetWidth(1);
+               epWidgetsManualSortPreference.setWidgetHeight(1);
+                               
+               return epWidgetsManualSortPreference;
+       }
+       
+       @Test
+       public void epWidgetsManualSortPreferenceTest(){
+               EPWidgetsManualSortPreference epWidgetsManualSortPreference = mockEPWidgetsManualSortPreference();
+               
+               assertEquals(epWidgetsManualSortPreference.getWidgetId(), new Long(1));
+               assertEquals(epWidgetsManualSortPreference.getUserId(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetRow(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetCol(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetHeight(), 1);
+               assertEquals(epWidgetsManualSortPreference.getWidgetWidth(), 1);
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleIdTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleIdTest.java
new file mode 100644 (file)
index 0000000..bca8c49
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EcompAppRoleId;
+
+public class EcompAppRoleIdTest {
+       
+       public EcompAppRoleId mockEcompAppRoleId(){
+               
+               EcompAppRoleId ecompAppRoleId = new EcompAppRoleId();
+               
+               ecompAppRoleId.setAppId((long)1);
+               ecompAppRoleId.setAppName("test");
+               ecompAppRoleId.setRoleId(1);
+               ecompAppRoleId.setRoleName("test");
+                               
+               return ecompAppRoleId;
+       }
+       
+       @Test
+       public void ecompAppRoleIdTest(){
+               
+       EcompAppRoleId ecompAppRoleId = mockEcompAppRoleId();
+       
+       assertEquals(ecompAppRoleId.getAppId(), new Long(1));
+       assertEquals(ecompAppRoleId.getAppName(), "test");
+       assertEquals(ecompAppRoleId.getRoleId().toString(), "1");
+       assertEquals(ecompAppRoleId.getRoleName(), "test");
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/EcompAppRoleTest.java
new file mode 100644 (file)
index 0000000..fc2c7b0
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EcompAppRole;
+
+public class EcompAppRoleTest {
+
+       public EcompAppRole mockEcompAppRole(){
+               EcompAppRole ecompAppRole = new EcompAppRole();
+               
+               ecompAppRole.setAppId((long)1);
+               ecompAppRole.setAppName("test");
+               ecompAppRole.setRoleId(1);
+               ecompAppRole.setRoleName("test");
+               
+               return ecompAppRole;
+       }
+       
+       @Test
+       public void ecompAppRoleTest(){
+               EcompAppRole ecompAppRole = mockEcompAppRole();
+               
+               assertEquals(ecompAppRole.getAppId(), new Long(1));
+               assertEquals(ecompAppRole.getAppName(), "test");
+               assertEquals(ecompAppRole.getRoleId().toString(), "1");
+               assertEquals(ecompAppRole.getRoleName(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalRoleDetailsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalRoleDetailsTest.java
new file mode 100644 (file)
index 0000000..5d62d34
--- /dev/null
@@ -0,0 +1,59 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+import org.openecomp.portalapp.portal.domain.ExternalRoleDetails;
+
+public class ExternalRoleDetailsTest {
+
+       public ExternalRoleDetails mockExternalRoleDetails(){
+               
+               List<EPAppRoleFunction> epAppRoleFunctionList = new ArrayList<EPAppRoleFunction>();
+               
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               epAppRoleFunctionList.add(epAppRoleFunction);
+               
+               ExternalRoleDetails externalRoleDetails = new ExternalRoleDetails();
+               
+               externalRoleDetails.setName("test");
+               externalRoleDetails.setActive(false);
+               externalRoleDetails.setPriority(1);
+               externalRoleDetails.setAppId((long)1);
+               externalRoleDetails.setAppRoleId((long)1);
+               externalRoleDetails.setPerms(epAppRoleFunctionList);
+               
+               return externalRoleDetails;
+       }
+       
+       @Test
+       public void externalRoleDetailsTest(){
+               
+               List<EPAppRoleFunction> epAppRoleFunctionList = new ArrayList<EPAppRoleFunction>();
+               
+               EPAppRoleFunction epAppRoleFunction = new EPAppRoleFunction();
+               epAppRoleFunction.setRoleId((long)1);
+               epAppRoleFunction.setAppId((long)1);
+               epAppRoleFunction.setCode("test");
+               
+               epAppRoleFunctionList.add(epAppRoleFunction);
+               
+               ExternalRoleDetails externalRoleDetails = mockExternalRoleDetails();
+               
+               assertEquals(externalRoleDetails.getAppId(), new Long(1));
+               assertEquals(externalRoleDetails.getAppRoleId(), new Long(1));
+               assertEquals(externalRoleDetails.getPriority().toString(), "1");
+               assertEquals(externalRoleDetails.getName(), "test");
+               assertEquals(externalRoleDetails.getPriority().toString(),  "1");
+               assertEquals(externalRoleDetails.getPerms().size(), epAppRoleFunctionList.size());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemAccessTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemAccessTest.java
new file mode 100644 (file)
index 0000000..aea2c42
--- /dev/null
@@ -0,0 +1,27 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.ExternalSystemAccess;
+
+public class ExternalSystemAccessTest {
+       
+       public ExternalSystemAccess mockExternalSystemAccess(){
+               ExternalSystemAccess externalSystemAccess = new ExternalSystemAccess("test", false);
+       
+               externalSystemAccess.setKey("test");
+               externalSystemAccess.setAccessValue(false);
+               
+               return externalSystemAccess;
+       }
+
+       @Test
+       public void externalSystemAccessTest(){
+               ExternalSystemAccess externalSystemAccess = mockExternalSystemAccess();
+               
+               assertEquals(externalSystemAccess.getKey(), "test");
+               assertEquals(externalSystemAccess.getAccessValue(), false);
+       }
+}
+
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemRoleApprovalTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ExternalSystemRoleApprovalTest.java
new file mode 100644 (file)
index 0000000..b014b66
--- /dev/null
@@ -0,0 +1,23 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.externalsystemapproval.model.ExternalSystemRoleApproval;
+
+public class ExternalSystemRoleApprovalTest {
+
+       public ExternalSystemRoleApproval mockExternalSystemRoleApproval(){
+               ExternalSystemRoleApproval externalSystemRoleApproval = new ExternalSystemRoleApproval();
+               externalSystemRoleApproval.setRoleName("test");
+               
+               return externalSystemRoleApproval;              
+       }
+       
+       @Test
+       public void externalSystemRoleApprovalTest(){
+               ExternalSystemRoleApproval externalSystemRoleApproval = mockExternalSystemRoleApproval();
+               
+               assertEquals(externalSystemRoleApproval.getRoleName(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/FunctionalMenuItemWithAppIDTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/FunctionalMenuItemWithAppIDTest.java
new file mode 100644 (file)
index 0000000..0e5bf9c
--- /dev/null
@@ -0,0 +1,28 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.FunctionalMenuItemWithAppID;
+
+public class FunctionalMenuItemWithAppIDTest {
+
+       public FunctionalMenuItemWithAppID mockFunctionalMenuItemWithAppID(){
+               FunctionalMenuItemWithAppID functionalMenuItemWithAppID = new FunctionalMenuItemWithAppID();
+       
+               functionalMenuItemWithAppID.setRestrictedApp(false);
+               functionalMenuItemWithAppID.setUrl("test");
+               
+               
+               return functionalMenuItemWithAppID;
+       }
+       
+       @Test
+       public void functionalMenuItemWithAppIDTest(){
+               FunctionalMenuItemWithAppID functionalMenuItemWithAppID = mockFunctionalMenuItemWithAppID();
+
+               assertEquals(functionalMenuItemWithAppID.toString(), "FunctionalMenuItem [menuId=null, column=null, text=null, parentMenuId=null, url=test, active_yn=null, appid=null, roles=null, restrictedApp=false]");
+       
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/GetAccessResultIdTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/GetAccessResultIdTest.java
new file mode 100644 (file)
index 0000000..004d06b
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.GetAccessResultId;
+
+public class GetAccessResultIdTest {
+       
+       public GetAccessResultId mockGetAccessResultId(){
+               
+               GetAccessResultId getAccessResultIdObj = new GetAccessResultId();
+               getAccessResultIdObj.setEcompFunction("test");
+               getAccessResultIdObj.setAppName("test");
+               getAccessResultIdObj.setRoleName("test");
+               
+               return getAccessResultIdObj;
+       }
+
+       @Test
+       public void getAccessResultIdObjTest(){
+               GetAccessResultId getAccessResultIdObj = mockGetAccessResultId();
+               
+               assertEquals(getAccessResultIdObj.getEcompFunction(), "test");
+               assertEquals(getAccessResultIdObj.getAppName(), "test");
+               assertEquals(getAccessResultIdObj.getRoleName(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceDataTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceDataTest.java
new file mode 100644 (file)
index 0000000..9401461
--- /dev/null
@@ -0,0 +1,57 @@
+package org.openecomp.portalapp.portal.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.MicroserviceData;
+import org.openecomp.portalapp.portal.domain.MicroserviceParameter;
+
+public class MicroserviceDataTest {
+
+       public MicroserviceData mockMicroserviceData(){
+               
+               MicroserviceData microserviceData= new MicroserviceData();
+               
+               List<MicroserviceParameter> parameterList = new ArrayList<MicroserviceParameter>();
+               
+               MicroserviceParameter microserviceParameter = new MicroserviceParameter();
+               microserviceParameter.setId((long)1);
+               microserviceParameter.setServiceId((long)1);
+               microserviceParameter.setPara_key("test");
+               microserviceParameter.setPara_value("test");
+               parameterList.add(microserviceParameter);
+               
+               microserviceData.setId((long)1);
+               microserviceData.setName("test");
+               microserviceData.setActive("test");
+               microserviceData.setDesc("test");
+               microserviceData.setAppId((long)1);
+               microserviceData.setUrl("test");
+               microserviceData.setSecurityType("test");
+               microserviceData.setUsername("test");
+               microserviceData.setPassword("test");
+               
+               
+               return microserviceData;
+       }
+       
+       @Test
+       public void microserviceDataTest(){
+               MicroserviceData microserviceData= mockMicroserviceData();
+               
+               assertEquals(microserviceData.getId(), new Long(1));
+               assertEquals(microserviceData.getName(), "test");
+               assertEquals(microserviceData.getActive(), "test");
+               assertEquals(microserviceData.getDesc(), "test");
+       //      assertEquals(microserviceData.getAppId(), new long(1));
+               assertEquals(microserviceData.getUrl(), "test");
+               assertEquals(microserviceData.getSecurityType(), "test");
+               assertEquals(microserviceData.getUsername(), "test");
+               assertEquals(microserviceData.getPassword(), "test");
+               
+               assertEquals(microserviceData.toString(), "MicroserviceData [id=1, name=test, desc=test, appId=1, "
+                               + "url=test, securityType=test, username=test, password=test, parameterList=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceParameterTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/MicroserviceParameterTest.java
new file mode 100644 (file)
index 0000000..bcd3ff3
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.MicroserviceParameter;
+
+public class MicroserviceParameterTest {
+       
+       public MicroserviceParameter mockMicroserviceParameter(){
+               MicroserviceParameter microserviceParameter = new MicroserviceParameter();
+                               
+               microserviceParameter.setId((long)1);
+               microserviceParameter.setServiceId((long)1);
+               microserviceParameter.setPara_key("test");
+               microserviceParameter.setPara_value("test");
+               
+               return microserviceParameter;
+       }
+
+       @Test
+       public void microserviceParameterTest(){
+               MicroserviceParameter microserviceParameter = mockMicroserviceParameter();
+               assertEquals(microserviceParameter.getId(), new Long(1));
+               assertEquals(microserviceParameter.getServiceId(),(long)1);
+               assertEquals(microserviceParameter.getPara_key(), "test");
+               assertEquals(microserviceParameter.getPara_value(), "test");
+               
+               assertEquals(microserviceParameter.toString(), "MicroserviceParameter [id=1, serviceId=1, para_key=test, para_value=test]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserAppSelectionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserAppSelectionTest.java
new file mode 100644 (file)
index 0000000..3aff8cc
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.PersUserAppSelection;
+
+public class PersUserAppSelectionTest {
+
+       public PersUserAppSelection mockPersUserAppSelection(){
+               
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setUserId((long)1);
+               persUserAppSelection.setAppId((long)1);
+               persUserAppSelection.setStatusCode("test");
+               
+               return persUserAppSelection;
+       }
+       
+       @Test
+       public void persUserAppSelectionTest(){
+               
+               PersUserAppSelection persUserAppSelection1 = new PersUserAppSelection((long)1, (long)1, (long)1,"test");
+               
+               PersUserAppSelection persUserAppSelection = mockPersUserAppSelection();
+               
+               assertEquals(persUserAppSelection.getUserId(), new Long(1));
+               assertEquals(persUserAppSelection.getAppId(), new Long(1));
+               assertEquals(persUserAppSelection.getStatusCode(), "test");
+               assertEquals(persUserAppSelection1.hashCode(), new PersUserAppSelection((long)1, (long)1, (long)1,"test").hashCode());
+               assertEquals(persUserAppSelection1, new PersUserAppSelection((long)1, (long)1, (long)1,"test"));
+               assertTrue(persUserAppSelection1.equals(new PersUserAppSelection((long)1, (long)1, (long)1,"test")));
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserWidgetSelectionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/PersUserWidgetSelectionTest.java
new file mode 100644 (file)
index 0000000..da48013
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.PersUserWidgetSelection;
+
+public class PersUserWidgetSelectionTest {
+
+       public PersUserWidgetSelection mockPersUserWidgetSelection(){
+               
+               PersUserWidgetSelection persUserWidgetSelection = new PersUserWidgetSelection();
+               
+               persUserWidgetSelection.setUserId((long)1);
+               persUserWidgetSelection.setWidgetId((long)1);
+               persUserWidgetSelection.setStatusCode("test");
+               
+               return persUserWidgetSelection;
+       }
+       
+       @Test
+       public void persUserWidgetSelectionTest(){
+               PersUserWidgetSelection persUserWidgetSelection = mockPersUserWidgetSelection();
+               
+               PersUserWidgetSelection persUserWidgetSelection1 = new PersUserWidgetSelection((long)1, (long)1, (long)1, "test");
+               
+               assertEquals(persUserWidgetSelection.getUserId(), new Long(1));
+               assertEquals(persUserWidgetSelection.getWidgetId(), new Long(1));
+               assertEquals(persUserWidgetSelection.getStatusCode(), "test");
+               assertEquals(persUserWidgetSelection1,  new PersUserWidgetSelection((long)1, (long)1, (long)1, "test"));
+               assertTrue(persUserWidgetSelection1.equals(new PersUserWidgetSelection((long)1, (long)1, (long)1,"test")));
+               assertEquals(persUserWidgetSelection.hashCode(), persUserWidgetSelection1.hashCode());
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ResultTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/ResultTest.java
new file mode 100644 (file)
index 0000000..19991b5
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.model.Result;
+
+public class ResultTest {
+       
+       public Result mockResult(){
+               
+               Result result= new Result("test");
+               
+               result.setResult("test");
+               return result;
+       }
+
+       @Test
+       public void resultTest(){
+               
+               Result result = mockResult();           
+               result.setResult("test");
+               
+               assertEquals(result.getResult(), "test");
+               
+       }
+       
+                               
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/SharedContextTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/SharedContextTest.java
new file mode 100644 (file)
index 0000000..8e2ff42
--- /dev/null
@@ -0,0 +1,36 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.SharedContext;
+
+public class SharedContextTest {
+
+       public SharedContext mockSharedContext(){
+               
+               SharedContext sharedContext = new SharedContext();
+               sharedContext.setId((long)1);
+               sharedContext.setCreate_time(new Date());
+               sharedContext.setContext_id("test");
+               sharedContext.setCkey("test");
+               sharedContext.setCvalue("test");
+               
+               return sharedContext;
+       }
+       
+       @Test
+       public void sharedContextTest(){
+               SharedContext sharedContext = mockSharedContext();
+               
+               assertEquals(sharedContext.getId(), new Long(1));
+       //      assertEquals(sharedContext.getCreate_time(), new Date());
+               assertEquals(sharedContext.getContext_id(), "test");
+               assertEquals(sharedContext.getCkey(), "test");
+               assertEquals(sharedContext.getCvalue(), "test");
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/UserIdRoleIdTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/UserIdRoleIdTest.java
new file mode 100644 (file)
index 0000000..b41bcad
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.UserIdRoleId;
+
+public class UserIdRoleIdTest {
+
+       public UserIdRoleId mockUserIdRoleId(){
+               UserIdRoleId userIdRoleId = new UserIdRoleId();
+               userIdRoleId.setUser_Id("test");
+               userIdRoleId.setRoleId("test");
+               userIdRoleId.setOrgUserId("test");
+               userIdRoleId.setAppId("test");
+               
+               return userIdRoleId;
+       }
+       
+       @Test
+       public void userIdRoleIdTest(){
+               UserIdRoleId userIdRoleId = mockUserIdRoleId();
+               
+               assertEquals(userIdRoleId.getUser_Id(), "test");
+               assertEquals(userIdRoleId.getRoleId(), "test");
+               assertEquals(userIdRoleId.getOrgUserId(), "test");
+               assertEquals(userIdRoleId.getAppId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogParameterTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogParameterTest.java
new file mode 100644 (file)
index 0000000..7db79b8
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.WidgetCatalogParameter;
+
+public class WidgetCatalogParameterTest {
+
+       public WidgetCatalogParameter mockWidgetCatalogParameter(){
+               WidgetCatalogParameter widgetCatalogParameter = new WidgetCatalogParameter();
+               
+               widgetCatalogParameter.setId((long)1);
+               widgetCatalogParameter.setWidgetId((long)1);
+               widgetCatalogParameter.setUserId((long)1);
+               widgetCatalogParameter.setParamId((long)1);
+               widgetCatalogParameter.setUser_value("test");
+               
+               return widgetCatalogParameter;
+       }
+       
+       @Test
+       public void widgetCatalogParameterTest(){
+               WidgetCatalogParameter widgetCatalogParameter = mockWidgetCatalogParameter();
+               
+               assertEquals(widgetCatalogParameter.getId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getWidgetId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getUserId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getParamId(), new Long(1));
+               assertEquals(widgetCatalogParameter.getUser_value(), "test");
+               assertEquals(widgetCatalogParameter.toString(), "WidgetCatalogParameter [id=1, widgetId=1, userId=1, paramId=1, user_value=test]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetCatalogTest.java
new file mode 100644 (file)
index 0000000..9e606fc
--- /dev/null
@@ -0,0 +1,84 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.App;
+import org.openecomp.portalapp.portal.domain.RoleApp;
+import org.openecomp.portalapp.portal.domain.WidgetCatalog;
+
+public class WidgetCatalogTest {
+
+       public WidgetCatalog mockWidgetCatalog() {
+
+               WidgetCatalog widgetCatalog = new WidgetCatalog();
+
+               Set<RoleApp> roleAppSet = new HashSet<RoleApp>();
+               // App
+               App app = new App();
+               app.setAppId((long) 1);
+               app.setAppName("test");
+
+               // RoleApp
+               RoleApp roleApp = new RoleApp();
+               roleApp.setRoleId((long) 1);
+               roleApp.setRoleName("test");
+               roleApp.setApp(app);
+               roleApp.setWidgets(null);
+
+               roleAppSet.add(roleApp);
+
+               widgetCatalog.setId((long) 1);
+               widgetCatalog.setName("test");
+               widgetCatalog.setDesc("test");
+               widgetCatalog.setFileLocation("test");
+               widgetCatalog.setAllowAllUser("test");
+               widgetCatalog.setServiceId((long) 1);
+               widgetCatalog.setSortOrder("test");
+               widgetCatalog.setStatusCode("test");
+
+               widgetCatalog.setWidgetRoles(roleAppSet);
+
+               return widgetCatalog;
+
+       }
+       
+       @Test
+       public void widgetCatalogTest() {
+
+               // App
+               App app = new App();
+               app.setAppId((long) 1);
+               app.setAppName("test");
+
+               Set<RoleApp> roleAppSet = new HashSet<RoleApp>();
+               // RoleApp
+               RoleApp roleApp = new RoleApp();
+               roleApp.setRoleId((long) 1);
+               roleApp.setRoleName("test");
+               roleApp.setApp(app);
+               roleApp.setWidgets(null);
+
+               roleAppSet.add(roleApp);
+
+               WidgetCatalog widgetCatalog = mockWidgetCatalog();
+
+       
+               assertEquals(widgetCatalog.getId(), (long)1);
+               assertEquals(widgetCatalog.getName(), "test");
+               assertEquals(widgetCatalog.getDesc(), "test");
+               assertEquals(widgetCatalog.getFileLocation(), "test");
+               assertEquals(widgetCatalog.getAllowAllUser(), "test");
+               assertEquals(widgetCatalog.getServiceId(), new Long (1));
+               assertEquals(widgetCatalog.getSortOrder(), "test");
+               assertEquals(widgetCatalog.getStatusCode(), "test");
+               assertEquals(widgetCatalog.getWidgetRoles().size(),1);
+               
+               assertEquals("WidgetCatalog [id=1, name=test, desc=test, fileLocation=test, allowAllUser=test]", widgetCatalog.toString());
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetParameterResultTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetParameterResultTest.java
new file mode 100644 (file)
index 0000000..4e80bdb
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.WidgetParameterResult;
+
+public class WidgetParameterResultTest {
+
+       public WidgetParameterResult mockWidgetParameterResult(){
+                               
+               WidgetParameterResult widgetParameterResult = new WidgetParameterResult();
+               widgetParameterResult.setParam_id((long)1);
+               widgetParameterResult.setParam_key("test");
+               widgetParameterResult.setUser_value("test");
+               widgetParameterResult.setDefault_value("test");
+               
+               return widgetParameterResult;
+       }
+       
+       @Test
+       public void widgetParameterResultTest(){
+               
+               WidgetParameterResult widgetParameterResult = mockWidgetParameterResult();
+               
+               assertEquals(widgetParameterResult.getParam_key(), "test");
+               assertEquals(widgetParameterResult.getParam_id(), new Long(1));
+               assertEquals(widgetParameterResult.getUser_value(), "test");
+               assertEquals(widgetParameterResult.getDefault_value(), "test");
+               
+               assertEquals("WidgetParameterResult [param_id=1, param_key=test, user_value=test, default_value=test]", widgetParameterResult.toString());
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/domain/WidgetTest.java
new file mode 100644 (file)
index 0000000..bb75836
--- /dev/null
@@ -0,0 +1,34 @@
+package org.openecomp.portalapp.portal.domain;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.Widget;
+
+public class WidgetTest {
+
+       public Widget mockWidget(){
+               
+               Widget widget = new Widget();
+               widget.setName("test");
+               widget.setWidth(100);
+               widget.setHeight(100);
+               widget.setUrl("test");
+               widget.setAppId((long)1);
+                               
+               return widget;
+       }
+        
+       @Test
+       public void widgetTest(){
+               Widget widget = mockWidget();
+               
+               assertEquals(widget.getName(), "test");
+               assertTrue(widget.getWidth() == 100);
+               assertTrue(widget.getHeight() == 100);
+               assertEquals(widget.getUrl(), "test");
+               assertEquals(widget.getAppId(), new Long(1)); 
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/exceptions/NoHealthyServiceExceptionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/exceptions/NoHealthyServiceExceptionTest.java
new file mode 100644 (file)
index 0000000..71f620f
--- /dev/null
@@ -0,0 +1,23 @@
+package org.openecomp.portalapp.portal.exceptions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.exceptions.NoHealthyServiceException;
+
+public class NoHealthyServiceExceptionTest {
+
+       public NoHealthyServiceException mockNoHealthyServiceException(){
+               NoHealthyServiceException noHealthyServiceException = new NoHealthyServiceException("test");
+               
+               return noHealthyServiceException;
+       }
+       
+       @Test
+       public void noHealthyServiceExceptionTest(){
+               NoHealthyServiceException noHealthyServiceException = mockNoHealthyServiceException();
+               
+       //      assertEquals(noHealthyServiceException, new NoHealthyServiceException("test"));
+               assertEquals(noHealthyServiceException.toString(), "NoHealthyServiceException [] test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/ApplicationCommonContextTestSuite.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/ApplicationCommonContextTestSuite.java
new file mode 100644 (file)
index 0000000..96d7f31
--- /dev/null
@@ -0,0 +1,172 @@
+///*-
+// * ================================================================================
+// * ECOMP Portal
+// * ================================================================================
+// * Copyright (C) 2017 AT&T Intellectual Property
+// * ================================================================================
+// * Licensed 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.
+// * ================================================================================
+// */
+//package org.openecomp.portalapp.portal.framework;
+//
+//import java.io.IOException;
+//
+//import org.junit.Before;
+//import org.junit.runner.RunWith;
+//import org.openecomp.portalsdk.core.conf.AppConfig;
+////import org.openecomp.portalapp.conf.ExternalAppConfig;
+////import org.openecomp.portalapp.conf.HibernateMappingLocations;
+//import org.openecomp.portalsdk.core.conf.HibernateConfiguration;
+//import org.openecomp.portalsdk.core.conf.HibernateMappingLocatable;
+//import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager;
+//import org.openecomp.portalsdk.core.util.CacheManager;
+//import org.openecomp.portalsdk.core.util.SystemProperties;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.ComponentScan;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.FilterType;
+//import org.springframework.context.annotation.Profile;
+//import org.springframework.core.io.ClassPathResource;
+//import org.springframework.core.io.Resource;
+//import org.springframework.test.context.ActiveProfiles;
+//import org.springframework.test.context.ContextConfiguration;
+//import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+//import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
+//import org.springframework.test.context.web.WebAppConfiguration;
+//import org.springframework.test.web.servlet.MockMvc;
+//import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+//import org.springframework.web.context.WebApplicationContext;
+//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+//
+///**
+// * 
+// * In order to write a unit test, 1. inherit this class 2. place the "war"
+// * folder on your test class's classpath 3. run the test with the following VM
+// * argument; This is important because when starting the application from
+// * Container, the System Properties file (SystemProperties.java) can have the
+// * direct path but, when running from the Mock Junit container, the path should
+// * be prefixed with "classpath" to enable the mock container to search for the
+// * file in the classpath -Dcontainer.classpath="classpath:"
+// */
+//
+//@SuppressWarnings("deprecation")
+//@RunWith(SpringJUnit4ClassRunner.class)
+//@WebAppConfiguration
+//@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { MockAppConfig.class })
+//@ActiveProfiles(value = "test")
+//public class ApplicationCommonContextTestSuite {
+//
+//     @Autowired
+//     public WebApplicationContext wac;
+//
+//     private MockMvc mockMvc;
+//
+//     @Before
+//     public void setup() {
+//             if (mockMvc == null) {
+//                     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+//
+//             }
+//     }
+//
+//     public Object getBean(String name) {
+//             return this.wac.getBean(name);
+//     }
+//
+//     public MockMvc getMockMvc() {
+//             return mockMvc;
+//     }
+//
+//     public void setMockMvc(MockMvc mockMvc) {
+//             this.mockMvc = mockMvc;
+//     }
+//
+//     public WebApplicationContext getWebApplicationContext() {
+//             return wac;
+//     }
+//
+//}
+//
+//@Configuration
+//@ComponentScan(basePackages = "org.openecomp", excludeFilters = {
+//             // the following source configurations should not be scanned; instead of
+//             // using Exclusion filter, we can use the @Profile annotation to exclude
+//             // them
+//             @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.openecomp.portalsdk.core.controller.LogoutController*"),
+//             @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.openecomp.portalsdk.core.controller.SDKLoginController*"),
+//             @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.openecomp.portalapp.conf.ExternalAppConfig*"),
+//             @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.openecomp.*.*InitUebHandler*") })
+//@Profile("test")
+//class MockAppConfig extends AppConfig {
+//
+//     @Bean
+//     HibernateMappingLocatable locatable() {
+//             return new MockHibernateMappingLocations();
+//     }
+//
+//     @Bean
+//     HibernateConfiguration hibConfiguration() {
+//             return new HibernateConfiguration();
+//     }
+//
+//     @Bean
+//     public SystemProperties systemProperties() {
+//             return new MockSystemProperties();
+//     }
+//
+//     @Bean
+//     public AbstractCacheManager cacheManager() {
+//             return new CacheManager() {
+//
+//                     public void configure() throws IOException {
+//
+//                     }
+//             };
+//     }
+//
+//     public String[] tileDefinitions() {
+//             return new String[] { "classpath:/WEB-INF/fusion/defs/definitions.xml",
+//                             "classpath:/WEB-INF/defs/definitions.xml" };
+//     }
+//
+//     public void addInterceptors(InterceptorRegistry registry) {
+//             // registry.addInterceptor(new
+//             // SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout());
+//             // registry.addInterceptor(resourceInterceptor());
+//     }
+//
+//     public static class MockSystemProperties extends SystemProperties {
+//
+//             public MockSystemProperties() {
+//             }
+//
+//     }
+//
+//}
+//
+//@Profile("test")
+//class MockHibernateMappingLocations implements HibernateMappingLocatable {
+//
+//     public Resource[] getMappingLocations() {
+//             return new Resource[] { new ClassPathResource("WEB-INF/fusion/orm/Fusion.hbm.xml"),
+//                             new ClassPathResource("WEB-INF/fusion/orm/EP.hbm.xml"),
+//                             new ClassPathResource("WEB-INF/fusion/orm/Workflow.hbm.xml") };
+//
+//     }
+//
+//     public String[] getPackagesToScan() {
+//             return new String[] { "org.openecomp", "src" };
+//     }
+//
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java
new file mode 100644 (file)
index 0000000..ccda5f3
--- /dev/null
@@ -0,0 +1,76 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.framework;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MockitoTestSuite {
+
+
+       public MockHttpServletRequestWrapper mockedRequest = new MockHttpServletRequestWrapper(
+                       Mockito.mock(HttpServletRequest.class));
+       public HttpServletResponse mockedResponse = Mockito.mock(HttpServletResponse.class);
+
+       public MockHttpServletRequestWrapper getMockedRequest() {
+               return mockedRequest;
+       }
+
+       public HttpServletResponse getMockedResponse() {
+               return mockedResponse;
+       }
+
+       public class MockHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+               HttpSession session = Mockito.mock(HttpSession.class);
+
+               public MockHttpServletRequestWrapper(HttpServletRequest request) {
+                       super(request);
+
+               }
+
+               @Override
+               public HttpSession getSession() {
+
+                       return session;
+               }
+
+               @Override
+               public HttpSession getSession(boolean create) {
+
+                       return session;
+               }
+
+       }
+    
+       @Test
+       public void test()
+       {
+               assert(true);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/FusionLicenseManagerImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/FusionLicenseManagerImplTest.java
new file mode 100644 (file)
index 0000000..6c1e52f
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.lm;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.lm.FusionLicenseManagerImpl;
+
+public class FusionLicenseManagerImplTest {
+
+               
+       @Test
+       public void FusionLicenseManagerImplTest(){
+               FusionLicenseManagerImpl fusionLicenseManagerImpl = new FusionLicenseManagerImpl();
+               
+               String nvlReturn = null;
+               
+               int installLicenseInt = fusionLicenseManagerImpl.installLicense();      
+               nvlReturn = fusionLicenseManagerImpl.nvl("test");               
+               Date expiredDateReturn = fusionLicenseManagerImpl.getExpiredDate();
+               
+               assertEquals(installLicenseInt, 0);             
+               assertEquals(nvlReturn, null); 
+               assertEquals(expiredDateReturn, null);  
+       
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/LicenseableClassImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/lm/LicenseableClassImplTest.java
new file mode 100644 (file)
index 0000000..b57291e
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.lm;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileNotFoundException;
+
+import org.junit.Test;
+import org.openecomp.portalapp.lm.LicenseableClassImpl;
+
+public class LicenseableClassImplTest {
+
+       @Test
+       public void licenseableClassImplTest() throws FileNotFoundException{
+               LicenseableClassImpl licenseableClassImpl = new LicenseableClassImpl();
+               
+               String appNameReturn = licenseableClassImpl.getApplicationName();
+               java.io.InputStream inputStream = licenseableClassImpl.getPublicKeystoreAsInputStream();
+               String aliasReturn = licenseableClassImpl.getAlias();
+               String pswdReturn = licenseableClassImpl.getKeyPasswd();
+               String pkPswd = licenseableClassImpl.getPublicKeystorePassword();
+               String cpPswd = licenseableClassImpl.getCipherParamPassword();
+               
+               assertEquals(appNameReturn, "");
+               assertEquals(inputStream, null);
+               assertEquals(aliasReturn, "");
+               assertEquals(pswdReturn, "");
+               assertEquals(pkPswd, "");
+               assertEquals(cpPswd, "");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCatalogItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCatalogItemTest.java
new file mode 100644 (file)
index 0000000..5b8440b
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.model;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppCatalogItem;
+
+public class AppCatalogItemTest {
+
+       public AppCatalogItem mockAppCatalogItem(){
+               AppCatalogItem appCatalogItem = new AppCatalogItem();
+               
+               appCatalogItem.setAlternateUrl("test");
+               appCatalogItem.setMlAppName("test");
+               
+               return appCatalogItem;
+       }
+       
+       @Test
+       public void appCatalogItemTest(){
+               AppCatalogItem appCatalogItem = mockAppCatalogItem();
+               
+               AppCatalogItem appCatalogItem1 = new AppCatalogItem();
+               appCatalogItem1.setAlternateUrl("test");
+               appCatalogItem1.setMlAppName("test");
+               
+               assertEquals(appCatalogItem.getAlternateUrl(), appCatalogItem1.getAlternateUrl());
+               assertEquals(appCatalogItem.getMlAppName(), appCatalogItem1.getMlAppName());
+
+               assertEquals(appCatalogItem.toString(), "AppCatalogItem [id=null, name=null, access=null, select=null, pending=null]");
+               assertEquals(appCatalogItem.hashCode(), appCatalogItem1.hashCode());
+               assertTrue(appCatalogItem.equals(appCatalogItem1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCategoryFunctionsItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppCategoryFunctionsItemTest.java
new file mode 100644 (file)
index 0000000..817f5e1
--- /dev/null
@@ -0,0 +1,42 @@
+package org.openecomp.portalapp.portal.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppCategoryFunctionsItem;
+
+public class AppCategoryFunctionsItemTest {
+
+       public AppCategoryFunctionsItem mockAppCategoryFunctionsItem(){
+               AppCategoryFunctionsItem appCategoryFunctionsItem = new AppCategoryFunctionsItem();
+               
+               appCategoryFunctionsItem.setRowId("test");
+               appCategoryFunctionsItem.setAppId("test");
+               appCategoryFunctionsItem.setApplication("test");
+               appCategoryFunctionsItem.setFunctions("test");
+               
+               return appCategoryFunctionsItem;
+       }
+       
+       @Test
+       public void appCategoryFunctionsItemTest(){
+               AppCategoryFunctionsItem appCategoryFunctionsItem = mockAppCategoryFunctionsItem();
+               
+               AppCategoryFunctionsItem appCategoryFunctionsItem1 = new AppCategoryFunctionsItem();
+               
+               appCategoryFunctionsItem1.setRowId("test");
+               appCategoryFunctionsItem1.setAppId("test");
+               appCategoryFunctionsItem1.setApplication("test");
+               appCategoryFunctionsItem1.setFunctions("test");
+               
+               assertEquals(appCategoryFunctionsItem.getRowId(), appCategoryFunctionsItem1.getRowId());
+               assertEquals(appCategoryFunctionsItem.getAppId(), appCategoryFunctionsItem1.getAppId());
+               assertEquals(appCategoryFunctionsItem.getApplication(), appCategoryFunctionsItem1.getApplication());
+               assertEquals(appCategoryFunctionsItem.getFunctions(), appCategoryFunctionsItem1.getFunctions());
+               assertEquals(appCategoryFunctionsItem.toString(), "AppCategoryFunctionsItem [rowId=test, appId=test, application=test, category=null, functions=test]");
+               assertEquals(appCategoryFunctionsItem.hashCode(), appCategoryFunctionsItem1.hashCode());
+               assertTrue(appCategoryFunctionsItem.equals(appCategoryFunctionsItem1));
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppContactUsItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/AppContactUsItemTest.java
new file mode 100644 (file)
index 0000000..1e28620
--- /dev/null
@@ -0,0 +1,49 @@
+package org.openecomp.portalapp.portal.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.AppContactUsItem;
+
+public class AppContactUsItemTest {
+       
+       public AppContactUsItem mockAppContactUsItem(){
+               AppContactUsItem appContactUsItem = new AppContactUsItem();
+                               
+               appContactUsItem.setAppId((long)1);
+               appContactUsItem.setAppName("test");
+               appContactUsItem.setDescription("test");
+               appContactUsItem.setContactName("test");
+               appContactUsItem.setContactEmail("test");
+               appContactUsItem.setUrl("test");
+               appContactUsItem.setActiveYN("test");
+               
+               return appContactUsItem;
+       }
+
+       @Test
+       public void appContactUsItemTest(){
+               AppContactUsItem appContactUsItem = mockAppContactUsItem();
+               
+               AppContactUsItem appContactUsItem1 = new AppContactUsItem();
+               appContactUsItem1.setAppId((long)1);
+               appContactUsItem1.setAppName("test");
+               appContactUsItem1.setDescription("test");
+               appContactUsItem1.setContactName("test");
+               appContactUsItem1.setContactEmail("test");
+               appContactUsItem1.setUrl("test");
+               appContactUsItem1.setActiveYN("test");
+               
+               assertEquals(appContactUsItem.getAppId(), appContactUsItem1.getAppId());
+               assertEquals(appContactUsItem.getAppName(), appContactUsItem1.getAppName());
+               assertEquals(appContactUsItem.getDescription(), appContactUsItem1.getDescription());
+               assertEquals(appContactUsItem.getContactName(), appContactUsItem1.getContactName());
+               assertEquals(appContactUsItem.getContactEmail(), appContactUsItem1.getContactEmail());
+               assertEquals(appContactUsItem.getUrl(), appContactUsItem1.getUrl());
+               assertEquals(appContactUsItem.getActiveYN(), appContactUsItem1.getActiveYN());
+               assertEquals(appContactUsItem.toString(), "AppContactUsItem [appId=1, appName=test, description=test, contactName=test, contactEmail=test, url=test, activeYN=test]");
+               assertEquals(appContactUsItem.hashCode(), appContactUsItem1.hashCode());
+               assertTrue(appContactUsItem.equals(appContactUsItem1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/SearchResultItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/model/SearchResultItemTest.java
new file mode 100644 (file)
index 0000000..84527d0
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.model;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.ecomp.model.SearchResultItem;
+
+public class SearchResultItemTest {
+
+       public SearchResultItem mockSearchResultItem(){
+               SearchResultItem searchResultItem = new SearchResultItem();
+                               
+               searchResultItem.setRowId("test");
+               searchResultItem.setCategory("test");
+               searchResultItem.setName("test");
+               searchResultItem.setTarget("test");
+               searchResultItem.setUuid("test");
+               
+               return searchResultItem;
+       }
+       
+       @Test
+       public void searchResultItemTest(){
+               SearchResultItem searchResultItem = mockSearchResultItem();
+               
+               SearchResultItem searchResultItem1 = new SearchResultItem();
+               searchResultItem1.setRowId("test");
+               searchResultItem1.setCategory("test");
+               searchResultItem1.setName("test");
+               searchResultItem1.setTarget("test");
+               searchResultItem1.setUuid("test");
+               
+               assertEquals(searchResultItem.getRowId(), searchResultItem.getRowId());
+               assertEquals(searchResultItem.getCategory(), searchResultItem.getCategory());
+               assertEquals(searchResultItem.getName(), searchResultItem.getName());
+               assertEquals(searchResultItem.getTarget(), searchResultItem.getTarget());
+               assertEquals(searchResultItem.getUuid(), searchResultItem.getUuid());
+               assertEquals(searchResultItem.toString(), searchResultItem.toString());
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/AppContactUsServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/AppContactUsServiceImplTest.java
new file mode 100644 (file)
index 0000000..5c6d04f
--- /dev/null
@@ -0,0 +1,147 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.AppContactUs;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.ecomp.model.AppCategoryFunctionsItem;
+import org.openecomp.portalapp.portal.ecomp.model.AppContactUsItem;
+import org.openecomp.portalapp.portal.service.AppContactUsService;
+import org.openecomp.portalapp.portal.service.AppContactUsServiceImpl;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+
+public class AppContactUsServiceImplTest {
+
+       
+     @Mock
+        DataAccessService dataAccessService = new DataAccessServiceImpl();
+    
+     @Mock
+     AppContactUsService AppContactUsService = new AppContactUsServiceImpl();
+     
+     @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+     @InjectMocks
+     AppContactUsServiceImpl appContactUsServiceImpl = new AppContactUsServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+       @Test
+       public void getAppContactUsTest() throws Exception
+       {
+               
+               List<AppContactUsItem> contactUsItemList  = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppName("testNew");
+               contactUsItemList.add(appContactUsItem);
+               AppContactUsItem appContactUsItem1= new AppContactUsItem();
+               appContactUsItem1.setAppName("test");
+               contactUsItemList.add(appContactUsItem1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAppContactUsItems", null, null)).thenReturn(contactUsItemList);
+               List<AppContactUsItem> expectedcontactUsItemList = appContactUsServiceImpl.getAppContactUs();
+               assertEquals(expectedcontactUsItemList, contactUsItemList);             
+       }
+       
+       @Test
+       public void getAppsAndContactsTest() throws Exception
+       {
+               List<AppContactUsItem> contactUsItemList  = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppName("testNew");
+               contactUsItemList.add(appContactUsItem);
+               AppContactUsItem appContactUsItem1= new AppContactUsItem();
+               appContactUsItem1.setAppName("test");
+               contactUsItemList.add(appContactUsItem1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAppsAndContacts", null, null)).thenReturn(contactUsItemList);
+               List<AppContactUsItem> expectedcontactUsItemList = appContactUsServiceImpl.getAppsAndContacts();
+               assertEquals(expectedcontactUsItemList, contactUsItemList);             
+       }
+       
+       @Test
+       public void getAppCategoryFunctionsTest() throws Exception
+       {
+               List<AppCategoryFunctionsItem> list  = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getAppCategoryFunctions", null, null)).thenReturn(list);
+               List<AppCategoryFunctionsItem> expectedlist = appContactUsServiceImpl.getAppCategoryFunctions();
+               assertEquals(list, expectedlist); 
+       }
+       
+       @Test(expected = java.lang.Exception.class)
+       public void saveAppContactUsTest() throws Exception
+       {
+               HashMap<String, Object> map = new HashMap<String, Object>();
+               List<AppContactUsItem> contactUsModelList = new ArrayList<>();
+               AppContactUsItem appContactUsItem= new AppContactUsItem();
+               appContactUsItem.setAppId((long) 1);
+               contactUsModelList.add(appContactUsItem);
+               AppContactUs appContact = new AppContactUs();
+               Mockito.when(dataAccessService.getDomainObject(AppContactUs.class, 1, map)).thenReturn(appContact);
+               EPApp app = getApp();
+               Mockito.when(dataAccessService.getDomainObject(EPApp.class, 1, new HashMap<String, Object>())).thenReturn(app);
+               AppContactUs contactUs  = new AppContactUs();
+               contactUs.setApp(app);
+               contactUs.setDescription(appContactUsItem.getDescription());
+               contactUs.setContactName(appContactUsItem.getContactName());
+               contactUs.setContactEmail(appContactUsItem.getContactEmail());
+               contactUs.setActiveYN(appContactUsItem.getActiveYN());
+               contactUs.setUrl(appContactUsItem.getUrl());
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(contactUs,map);
+               appContactUsServiceImpl.saveAppContactUs(contactUsModelList);
+       }
+       
+       @Test(expected = java.lang.NullPointerException.class)
+       public void deleteContactUsTest() throws Exception
+       {
+               HashMap<String, Object> map = new HashMap<String, Object>();
+               AppContactUs contactUs = new AppContactUs();
+               Mockito.when((AppContactUs) dataAccessService.getDomainObject(AppContactUs.class, 1, map)).thenReturn(contactUs);
+               appContactUsServiceImpl.deleteContactUs((long) 1);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/DashboardSearchServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/DashboardSearchServiceImplTest.java
new file mode 100644 (file)
index 0000000..d67f877
--- /dev/null
@@ -0,0 +1,114 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.ecomp.model.SearchResultItem;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.CommonWidget;
+import org.openecomp.portalapp.portal.transport.CommonWidgetMeta;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class DashboardSearchServiceImplTest {
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @InjectMocks
+       DashboardSearchServiceImpl dashboardSearchServiceImpl = new DashboardSearchServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+    
+       @Test
+       public void searchResultsTest()
+       {
+               Map<String, String> params = new HashMap<>();
+               params.put("userId", "guestT");
+               params.put("searchQuery", "test");
+               
+               List<SearchResultItem> list = new ArrayList<>();
+               SearchResultItem searchResultItem= new SearchResultItem();
+               searchResultItem.setCategory("test");
+               list.add(searchResultItem);
+               Mockito.when(dataAccessService.executeNamedQuery("searchPortal", params, null)).thenReturn(list);
+               Map<String, List<SearchResultItem>> result  =   dashboardSearchServiceImpl.searchResults("guestT", "test");
+               assertTrue(result.keySet().contains("test"));
+       }
+       
+       @Test
+       public void getRelatedUsersTest()
+       {
+               List<String> activeUsers = new ArrayList<>();
+               Map<String, String> params = new HashMap<>();
+               params.put("userId", "guestT");
+               Mockito.when(dataAccessService.executeNamedQuery("relatedUsers", params, null)).thenReturn(activeUsers);
+               List<String> expectedActiveUsers  =     dashboardSearchServiceImpl.getRelatedUsers("guestT");
+               assertEquals(expectedActiveUsers,activeUsers);
+       }
+       @Test
+       public void getWidgetDataTest()
+       {
+               CommonWidgetMeta CommonWidgetMeta = null;
+               Map<String, String> params = new HashMap<>();
+               params.put("cat", "test");
+               @SuppressWarnings("unchecked")
+               List<CommonWidget> widgetItems = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();
+               widgetItems.add(commonWidget);
+               Mockito.when(dataAccessService.executeNamedQuery("getCommonWidgetItem", params, null)).thenReturn(widgetItems);
+               CommonWidgetMeta expectedCommonWidgetMeta =dashboardSearchServiceImpl.getWidgetData("test");
+               assertEquals(expectedCommonWidgetMeta.getCategory(), "test");
+       }
+       
+       @Test
+       public void saveWidgetDataBulkTest()
+       {
+               CommonWidgetMeta CommonWidgetMeta = new CommonWidgetMeta();
+               List<CommonWidget> widgetList = new ArrayList<>();
+               CommonWidget commonWidget = new CommonWidget();
+               widgetList.add(commonWidget);
+               CommonWidgetMeta.setItems(widgetList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(commonWidget, null);
+        assertEquals(dashboardSearchServiceImpl.saveWidgetDataBulk(CommonWidgetMeta), "success");
+       }
+       
+       @Test
+       public void saveWidgetDataTest()
+       {
+               CommonWidget commonWidget = new CommonWidget();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(commonWidget, null);
+                assertEquals(dashboardSearchServiceImpl.saveWidgetData(commonWidget), "success");
+       }
+       
+       @Test
+       public void deleteWidgetDataTest()
+       {
+               CommonWidget commonWidget = new CommonWidget();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(commonWidget, null);
+                assertEquals(dashboardSearchServiceImpl.deleteWidgetData(commonWidget), "success");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceCentralizedImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceCentralizedImplTest.java
new file mode 100644 (file)
index 0000000..789f2bf
--- /dev/null
@@ -0,0 +1,89 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.hibernate.SessionFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionServiceCentralizedImpl;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
+public class EPRoleFunctionServiceCentralizedImplTest {
+
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @Mock
+       SessionFactory sessionFactory;
+
+       @InjectMocks
+       EPRoleFunctionServiceCentralizedImpl ePRoleFunctionServiceCentralizedImpl = new EPRoleFunctionServiceCentralizedImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       
+       @Test
+       public void getRoleFunctions()
+       {
+               List<CentralRoleFunction> getRoleFuncList = new ArrayList<>();
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               getRoleFuncList.add(centralRoleFunction);
+               List<RoleFunction> getRoleFuncListOfPortal = new ArrayList<>();
+               RoleFunction roleFunction = new RoleFunction();
+               getRoleFuncListOfPortal.add(roleFunction);
+               final Map<String, Long> params = new HashMap<>();
+               params.put("appId", (long) 1);
+               Mockito.when(dataAccessService.executeNamedQuery("getAllRoleFunctions", params, null)).thenReturn(getRoleFuncList);
+               List<RoleFunction> expectedGetRoleFuncListOfPortal = ePRoleFunctionServiceCentralizedImpl.getRoleFunctions();
+               assertEquals(expectedGetRoleFuncListOfPortal.size(),getRoleFuncListOfPortal.size());
+       }
+       
+       @Test
+       public void getRoleFunctionsNewTest()
+       {
+               HttpSession session = mockedRequest.getSession();
+               EPUser user = mockUser.mockEPUser();
+               user.setId((long) 1);
+               String userId = user.getId().toString();
+               final Map<String, String> params = new HashMap<>();
+               params.put("userId", userId);           
+               @SuppressWarnings("unused")
+               List getRoleFuncListOfPortal = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getRoleFunctionsOfUser", params, null)).thenReturn(getRoleFuncListOfPortal);
+               Set<String> getRoleFuncListOfPortalSet = ePRoleFunctionServiceCentralizedImpl.getRoleFunctions(mockedRequest, user);
+               assertTrue(getRoleFuncListOfPortalSet.size() == 0);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleFunctionServiceImplTest.java
new file mode 100644 (file)
index 0000000..07eeed7
--- /dev/null
@@ -0,0 +1,98 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionServiceImpl;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ SystemProperties.class, EPUserUtils.class })
+public class EPRoleFunctionServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+
+       @InjectMocks
+       EPRoleFunctionServiceImpl ePRoleFunctionServiceImpl = new EPRoleFunctionServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       MockEPUser mockUser = new MockEPUser();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+
+       @Test
+       public void getRoleFunctionsTest() {
+               List<RoleFunction> functions = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(RoleFunction.class, null)).thenReturn(functions);
+               List<RoleFunction> expectedFunctions = ePRoleFunctionServiceImpl.getRoleFunctions();
+               assertEquals(expectedFunctions, functions);
+       }
+
+       @Test
+       public void getRoleFunctionsRequestTest() {
+               EPUser user = mockUser.mockEPUser();
+               HashSet roleFunctions = new HashSet<>();
+               PowerMockito.mockStatic(SystemProperties.class);
+               HttpSession session = mockedRequest.getSession();
+               Mockito.when(session.getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME)))
+                               .thenReturn(roleFunctions);
+               HashSet expectedRoleFunctions = (HashSet) ePRoleFunctionServiceImpl.getRoleFunctions(mockedRequest, user);
+               assertEquals(expectedRoleFunctions, roleFunctions);
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getRoleFunctionsRequestIfNullTest() {
+               EPUser user = mockUser.mockEPUser();
+               HashSet roleFunctions = null;
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPUserUtils.class);
+               HttpSession session = mockedRequest.getSession();
+               Mockito.when(session.getAttribute(SystemProperties.getProperty(SystemProperties.ROLE_FUNCTIONS_ATTRIBUTE_NAME)))
+                               .thenReturn(roleFunctions);
+               HashMap roles = new HashMap<>();
+               EPRole role = new EPRole();
+               SortedSet<RoleFunction> roleFunctionSet = new TreeSet<RoleFunction>();
+               RoleFunction rolefun = new RoleFunction();
+               roleFunctionSet.add(rolefun);
+               role.setRoleFunctions(roleFunctionSet);
+               roles.put((long) 1, role);
+               Mockito.when(EPUserUtils.getRoles(mockedRequest)).thenReturn(roles);
+               HashSet expectedRoleFunctions = (HashSet) ePRoleFunctionServiceImpl.getRoleFunctions(mockedRequest, user);
+               assertTrue(expectedRoleFunctions.size() == 1);
+
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/EPRoleServiceImplTest.java
new file mode 100644 (file)
index 0000000..766d51b
--- /dev/null
@@ -0,0 +1,208 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.service.EPRoleServiceImpl;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.domain.RoleFunction;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class EPRoleServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @InjectMocks
+       EPRoleServiceImpl ePRoleServiceImpl = new EPRoleServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void getRoleFunctionsTest() {
+               List<RoleFunction> roleFunctionList = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(RoleFunction.class, null)).thenReturn(roleFunctionList);
+               List<RoleFunction> expectedRoleFunctionList = ePRoleServiceImpl.getRoleFunctions();
+               assertEquals(roleFunctionList, expectedRoleFunctionList);
+       }
+
+       @Test
+       public void getAvailableChildRolesIfRoleIdIsNullTest() {
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               role.addChildRole(role1);
+               roleList.add(role);
+               Mockito.when(dataAccessService.getList(EPRole.class, null)).thenReturn(roleList);
+               List<EPRole> expectedRoleList = ePRoleServiceImpl.getAvailableChildRoles(null);
+               assertEquals(roleList, expectedRoleList);
+       }
+
+       // @Test
+       // public void getAvailableChildRolesIfRoleIdNotNullTest()
+       // {
+       // List<EPRole> roleList = new ArrayList<>();
+       // EPRole role = new EPRole();
+       // EPRole role1= new EPRole();
+       // role.addChildRole(role1);
+       // roleList.add(role);
+       // Mockito.when(dataAccessService.getDomainObject(EPRole.class, 1,
+       // null)).thenReturn(role);
+       // Mockito.when(dataAccessService.getList(EPRole.class,
+       // null)).thenReturn(roleList);
+       //
+       // List<EPRole> expectedRoleList =
+       // ePRoleServiceImpl.getAvailableChildRoles((long) 1);
+       // System.out.println(expectedRoleList);
+       // assertEquals(roleList,expectedRoleList);
+       // }
+       //
+       @Test
+       public void getRoleFunctionTest() {
+               RoleFunction roleFunction = new RoleFunction();
+               Mockito.when(dataAccessService.getDomainObject(RoleFunction.class, "test", null)).thenReturn(roleFunction);
+               RoleFunction expectedRoleFunction = ePRoleServiceImpl.getRoleFunction("test");
+               assertEquals(expectedRoleFunction, roleFunction);
+       }
+
+       @Test
+       public void saveRoleFunctionTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(role, null);
+               ePRoleServiceImpl.saveRole(role);
+       }
+
+       @Test
+       public void deleteRoleFunctionTest() {
+               RoleFunction roleFunction = new RoleFunction();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(roleFunction, null);
+               ePRoleServiceImpl.deleteRoleFunction(roleFunction);
+       }
+
+       @Test
+       public void getRoleTest() {
+               EPRole role = null;
+               Mockito.when(dataAccessService.getDomainObject(EPRole.class, 1, null)).thenReturn(role);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1);
+               assertEquals(expectedRole, role);
+       }
+
+       @Test
+       public void getRoleIfappIdNullTest() {
+               assertNull(ePRoleServiceImpl.getRole(null, null));
+
+       }
+
+       @Test
+       public void getRoleIfappIdNotNullTest() {
+               List<EPRole> roles = new ArrayList<>();
+               EPRole role = new EPRole();
+               roles.add(role);
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1, (long) 1);
+               assertEquals(expectedRole, role);
+
+       }
+
+       @Test
+       public void getRoleIfListSizeIsMoreThan1Test() {
+               List<EPRole> roles = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               roles.add(role);
+               roles.add(role1);
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               EPRole expectedRole = ePRoleServiceImpl.getRole((long) 1, (long) 1);
+               assertEquals(expectedRole, role);
+
+       }
+
+       @Test
+       public void getRoleIfListSizeIsEmptyTest() {
+               List<EPRole> roles = new ArrayList<>();
+               String sql = "SELECT * FROM fn_role where APP_ID = 1 AND APP_ROLE_ID = 1";
+               Mockito.when(dataAccessService.executeSQLQuery(sql, EPRole.class, null)).thenReturn(roles);
+               assertNull(ePRoleServiceImpl.getRole((long) 1, (long) 1));
+
+       }
+
+       @Test
+       public void saveRoleTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(role, null);
+               ePRoleServiceImpl.saveRole(role);
+       }
+
+       @Test
+       public void deleteRoleTest() {
+               EPRole role = new EPRole();
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(role, null);
+               ePRoleServiceImpl.deleteRole(role);
+       }
+
+       @Test
+       public void getAvailableRolesTest() {
+               List<EPRole> roleList = new ArrayList<>();
+               Mockito.when(dataAccessService.getList(EPRole.class, null)).thenReturn(roleList);
+               List<EPRole> expectedRoleList = ePRoleServiceImpl.getAvailableRoles();
+               assertEquals(expectedRoleList, roleList);
+       }
+
+       @Test
+       public void getAppRolesTest() {
+               final Map<String, String> portalParams = null;
+               List<EPRole> roleList = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getPortalAppRoles", portalParams, null)).thenReturn(roleList);
+               assertNull(ePRoleServiceImpl.getAppRole("test", (long) 1));
+
+       }
+
+       @SuppressWarnings("unchecked")
+       @Test
+       public void getAppRolesIfNotPortalTest() {
+               final Map<String, String> params = null;
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole role = new EPRole();
+               EPRole role1 = new EPRole();
+               roleList.add(role);
+               roleList.add(role1);
+               Mockito.when((List<EPRole>) dataAccessService.executeNamedQuery("getAppRoles", params, null))
+                               .thenReturn(roleList);
+               List<EPRole> expectedRoleList = (List<EPRole>) ePRoleServiceImpl.getAppRole("test", (long) 10);
+               System.out.println(expectedRoleList);
+
+       }
+
+       @Test
+       public void saveRoleFunction() {
+               RoleFunction domainRoleFunction = new RoleFunction();
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(domainRoleFunction, null);
+               ePRoleServiceImpl.saveRoleFunction(domainRoleFunction);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ExternalAccessRolesServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ExternalAccessRolesServiceImplTest.java
new file mode 100644 (file)
index 0000000..4c67fa0
--- /dev/null
@@ -0,0 +1,391 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPAppRoleFunction;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.transport.EcompUserRoles;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalsdk.core.domain.Role;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ EcompPortalUtils.class, SystemProperties.class, EPCommonSystemProperties.class })
+public class ExternalAccessRolesServiceImplTest {
+       @Mock
+       DataAccessService dataAccessService1 = new DataAccessServiceImpl();
+
+       @Mock
+       RestTemplate template = new RestTemplate();
+
+       @InjectMocks
+       ExternalAccessRolesServiceImpl externalAccessRolesServiceImpl = new ExternalAccessRolesServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       String uebKey = "test-ueb-key";
+
+       public EPApp mockApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 10);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(false);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test
+       public void getAppRolesIfAppIsPortalTest() throws Exception {
+               List<EPRole> applicationRoles = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+               List<EPRole> expectedApplicationRoles = externalAccessRolesServiceImpl.getAppRoles((long) 1);
+               assertEquals(expectedApplicationRoles, applicationRoles);
+       }
+
+       @Test
+       public void getAppRolesTest() throws Exception {
+               List<EPRole> applicationRoles = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+               List<EPRole> expectedApplicationRoles = externalAccessRolesServiceImpl.getAppRoles((long) 10);
+               assertEquals(expectedApplicationRoles, applicationRoles);
+       }
+
+       // @SuppressWarnings("null")
+       // @Test(expected = java.lang.Exception.class)
+       // public void getAppRolesExceptionTest() throws Exception{
+       // List<EPRole> applicationRoles = new ArrayList<>();
+       // DataAccessService dataAccessService = null ;
+       // Mockito.when(dataAccessService.getList(EPRole.class, "where app_id = 10",
+       // null, null)).thenThrow(nullPointerException);
+       // List<EPRole> expectedApplicationRoles =
+       // externalAccessRolesServiceImpl.getAppRoles((long) 10);
+       // assertEquals(expectedApplicationRoles,applicationRoles);
+       // }
+
+       @Test(expected = java.lang.Exception.class)
+       public void getAppExceptionTest() throws Exception {
+               List<EPApp> app = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(app);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+               assertEquals(app, expectedapp);
+       }
+
+       @Test(expected = java.lang.Exception.class)
+       public void getAppTest() throws Exception {
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = mockApp();
+               appList.add(app);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+       }
+
+       @Test
+       public void getAppErrorTest() throws Exception {
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = mockApp();
+               app.setId((long) 1);
+               appList.add(app);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               List<EPApp> expectedapp = externalAccessRolesServiceImpl.getApp(uebKey);
+               assertEquals(appList, expectedapp);
+       }
+
+       @Test
+       public void addRoleTest() throws Exception {
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               String uebKey = "test-ueb-key";
+               Role role = new Role();
+               role.setId((long) 25);
+               EPApp app = mockApp();
+               app.setEnabled(true);
+               app.setId((long) 10);
+               app.setNameSpace("test_namesapce");
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<EPApp> appList = new ArrayList<>();
+               appList.add(app);
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole ePRole = new EPRole();
+               role.setName("Test Role");
+               roleList.add(ePRole);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               Mockito.when(dataAccessService1.getList(EPRole.class, " where app_role_id = " + role.getId() + " and app_id ="+app.getId(), null, null)).thenReturn(roleList);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL))
+                               .thenReturn("Testurl");
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.CREATED);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.POST),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+
+               assertTrue(externalAccessRolesServiceImpl.addRole(role, uebKey));
+       }
+
+
+       @Test
+       public void addRoleMethodNotAllowedTest() throws Exception {
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(EPCommonSystemProperties.class);
+               Role role = new Role();
+               role.setId((long) 25);
+               EPApp app = mockApp();
+               app.setEnabled(true);
+               app.setId((long) 10);
+               app.setNameSpace("test_namesapce");
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<EPApp> appList = new ArrayList<>();
+               appList.add(app);
+               List<EPRole> roleList = new ArrayList<>();
+               EPRole ePRole = new EPRole();
+               role.setName("Test Role");
+               roleList.add(ePRole);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null))
+                               .thenReturn(appList);
+               
+               Mockito.when(dataAccessService1.getList(EPRole.class, " where app_role_id = " + role.getId() + " and app_id ="+app.getId(), null, null)).thenReturn(roleList);
+//             Mockito.when(dataAccessService1.getList(EPRole.class, " where app_role_id = " + role.getId(), null, null))
+//                             .thenReturn(roleList);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_CENTRAL_ACCESS_URL))
+                               .thenReturn("Testurl");
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.METHOD_NOT_ALLOWED);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.POST),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+
+               assertFalse(externalAccessRolesServiceImpl.addRole(role, uebKey));
+       }
+
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test
+       public void deleteCentralRoleFunctionTest() throws Exception {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCode", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getRoleFunction", params, null))
+                               .thenReturn(centralRoleFunctionList);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.OK);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.DELETE),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+
+               Mockito.doNothing().when(dataAccessService1).deleteDomainObjects(EPAppRoleFunction.class,
+                               "app_id = " + app.getId() + " and function_cd = '" + "menu_fun_code" + "'", null);
+
+               assertTrue(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+       @Test
+       public void deleteCentralRoleFunctionFailTest() throws Exception {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCode", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               HttpClientErrorException httpClientErrorException = new HttpClientErrorException(HttpStatus.NOT_FOUND);
+               Mockito.when(dataAccessService1.executeNamedQuery("getRoleFunction", params, null))
+                               .thenReturn(centralRoleFunctionList);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.NOT_FOUND);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.DELETE),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenThrow(httpClientErrorException);
+               HttpHeaders headers = new HttpHeaders();
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+
+               Mockito.doNothing().when(dataAccessService1).deleteDomainObjects(EPAppRoleFunction.class,
+                               "app_id = " + app.getId() + " and function_cd = '" + "menu_fun_code" + "'", null);
+
+               assertTrue(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+
+       @Test
+       public void deleteCentralRoleFunctionExceptionTest() {
+               final Map<String, String> params = new HashMap<>();
+               EPApp app = mockApp();
+               params.put("functionCd", "menu_fun_code");
+               params.put("appId", String.valueOf(10));
+               List<CentralRoleFunction> centralRoleFunctionList = new ArrayList<>();
+               CentralRoleFunction domainCentralRoleFunction = new CentralRoleFunction();
+               domainCentralRoleFunction.setCode("menu_fun_code");
+               centralRoleFunctionList.add(domainCentralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params, null))
+                               .thenThrow(nullPointerException);
+               assertFalse(externalAccessRolesServiceImpl.deleteCentralRoleFunction("menu_fun_code", app));
+       }
+
+       @Test
+       public void getUserTest() {
+               List<EPUser> userList = new ArrayList<>();
+               EPUser user = mockUser.mockEPUser();
+               userList.add(user);
+               Mockito.when(dataAccessService1.getList(EPUser.class, " where org_user_id = '" + "guestT" + "'", null, null))
+                               .thenReturn(userList);
+               List<EPUser> expectedUserList = externalAccessRolesServiceImpl.getUser("guestT");
+               assertEquals(expectedUserList, userList);
+       }
+    
+       
+       public void saveCentralRoleFunctionTest() throws Exception {
+               CentralRoleFunction centralRoleFunction = new CentralRoleFunction();
+               centralRoleFunction.setCode("menu_test");
+               EPApp app = mockApp();
+               app.setId((long) 1);
+               final Map<String, String> params = new HashMap<>();
+               params.put("functionCd", "menu_test");
+               params.put("appId", String.valueOf(1));
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               HttpHeaders headers = new HttpHeaders();
+               Mockito.when(EcompPortalUtils.base64encodeKeyForAAFBasicAuth()).thenReturn(headers);
+               List<CentralRoleFunction> appRoleFunc  = new ArrayList<>();
+               appRoleFunc.add(centralRoleFunction);
+               Mockito.when(dataAccessService1.executeNamedQuery("getAppFunctionDetails", params,
+                               null)).thenReturn(appRoleFunc);
+               ResponseEntity<String> addResponse = new ResponseEntity<>(HttpStatus.OK);
+               Mockito.when(template.exchange(Matchers.anyString(), Matchers.eq(HttpMethod.GET),
+                               Matchers.<HttpEntity<String>>any(), Matchers.eq(String.class))).thenReturn(addResponse);
+       }
+       
+//     @Test
+//     public void getAllAppUsersIfAppIsPortalTest() throws Exception
+//     {
+//             List<EPApp> expectedapps =  new ArrayList<>();
+//             EPApp app = new EPApp();
+//             app.setEnabled(true);
+//             app.setId((long) 1);
+//             expectedapps.add(app);
+//             List<EPRole> applicationRoles = new ArrayList<>();
+//             Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+//             Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null)).thenReturn(expectedapps);
+//             externalAccessRolesServiceImpl.getAllAppUsers(uebKey);
+//     }
+       
+       
+       @Test
+       public void getAllAppUsersTest() throws Exception
+       {
+               List<EPApp> expectedapps =  new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setEnabled(true);
+               app.setId((long) 10);
+               expectedapps.add(app);
+               List<EPRole> applicationRoles = new ArrayList<>();
+               Mockito.when(dataAccessService1.getList(EPRole.class, "test", null, null)).thenReturn(applicationRoles);
+               Mockito.when(dataAccessService1.getList(EPApp.class, " where ueb_key = '" + uebKey + "'", null, null)).thenReturn(expectedapps);
+               final Map<String, Long> appParams = new HashMap<>();
+               appParams.put("appId", app.getId());
+               List<EcompUserRoles> userList = new ArrayList<>();
+               EcompUserRoles ecompUserRoles = new EcompUserRoles();
+               ecompUserRoles.setOrgUserId("guestT");
+               ecompUserRoles.setRoleId((long) 1);
+               ecompUserRoles.setRoleName("test");
+               
+               EcompUserRoles ecompUserRoles2 = new EcompUserRoles();
+               ecompUserRoles2.setOrgUserId("guestT");
+               ecompUserRoles2.setRoleId((long) 2);
+               ecompUserRoles2.setRoleName("test new");
+               userList.add(ecompUserRoles);
+               userList.add(ecompUserRoles2);
+               
+               Mockito.when(dataAccessService1.executeNamedQuery("ApplicationUserRoles", appParams, null)).thenReturn(userList);
+               List<EcompUser> usersfinalList = externalAccessRolesServiceImpl.getAllAppUsers(uebKey);
+               assertEquals(usersfinalList.get(0).getRoles().size(), 2);
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuMockServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuMockServiceImplTest.java
new file mode 100644 (file)
index 0000000..77988aa
--- /dev/null
@@ -0,0 +1,204 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.FunctionalMenuItemWithAppID;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuServiceImpl;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SystemProperties.class, EPCommonSystemProperties.class})
+public class FunctionalMenuMockServiceImplTest {
+
+       @Mock
+       FunctionalMenuService functionalMenuService;
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+    @InjectMocks
+       FunctionalMenuServiceImpl functionalMenuServiceImpl= new FunctionalMenuServiceImpl();
+       
+       @Test
+       public void assignHelpURLsTest(){
+               List<FunctionalMenuItem> menuItems = new ArrayList<FunctionalMenuItem>();
+               FunctionalMenuItem functionalMenuItem1 = new FunctionalMenuItem();
+               functionalMenuItem1.text = "Contact Us";
+               FunctionalMenuItem functionalMenuItem2 = new FunctionalMenuItem();
+               functionalMenuItem2.text = "Get Access";
+               FunctionalMenuItem functionalMenuItem3 = new FunctionalMenuItem();
+               functionalMenuItem3.text = "User Guide";                
+               menuItems.add(functionalMenuItem1);
+               menuItems.add(functionalMenuItem2);
+               menuItems.add(functionalMenuItem3);
+               
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.USER_GUIDE_URL)).thenReturn("http://todo_enter_user_guide_link");
+//             Mockito.doNothing().when(functionalMenuServiceImpl).assignHelpURLs(menuItems);
+               functionalMenuServiceImpl.assignHelpURLs(menuItems);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, "
+                               + "fn_menu_functional_roles r WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  "
+                               + "UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  "
+                               + "WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItems(true);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsNegativeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, "
+                               + "fn_menu_functional_roles r WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  "
+                               + "UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  "
+                               + "WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItems(false);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForNotificationTreeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, fn_menu_functional_roles r "
+                               + "WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id,"
+                               + " m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForNotificationTree(true);
+                assertEquals(actualResult, expectedResult);
+               
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForNotificationNegativeTreeTest(){
+               String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id FROM fn_menu_functional m, fn_menu_functional_roles r "
+                               + "WHERE m.menu_id = r.menu_id  AND UPPER(m.active_yn) = 'Y'  AND r.role_id != '900'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id,"
+                               + " m.url, m.active_yn,-1 app_id  FROM fn_menu_functional m  WHERE m.url=''  AND UPPER(m.active_yn) = 'Y'";
+                List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+                List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForNotificationTree(false);
+                assertEquals(actualResult, expectedResult);            
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForAppTest(){
+               String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a, fn_menu_functional_roles mr  "
+                               + "WHERE  mr.app_id='1'  AND mr.menu_id = m.menu_id  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y' AND a.menu_id = m.menu_id  "
+                               + "AND a.ancestor_menu_id = m1.menu_id";
+               Integer appId = 1;
+               List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+                Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+                actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForApp(appId);
+                assertEquals(actualResult, expectedResult);
+       }
+       
+       @Test
+       public void getFunctionalMenuItemsForUserTest(){
+               String orgUserId = "test";
+               String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a,  fn_menu_functional_roles mr, fn_user u , fn_user_role ur  "
+                               + "WHERE  u.org_user_id='test'  AND u.user_id = ur.user_id  AND ur.app_id = mr.app_id  AND (ur.role_id = mr.role_id      OR ur.role_id = '999')  "
+                               + "AND m.menu_id = mr.menu_id  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y'  AND a.menu_id = m.menu_id  "
+                               + "AND a.ancestor_menu_id = m1.menu_id  UNION  select m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m1.active_yn  "
+                               + "FROM fn_menu_functional m, fn_menu_functional_roles mr, fn_menu_functional m1,  fn_menu_functional_ancestors a  where a.menu_id = m.menu_id  AND a.ancestor_menu_id = m1.menu_id  AND m.menu_id != m1.menu_id  AND m.menu_id = mr.menu_id  AND mr.role_id = '900'  AND UPPER(m.active_yn) = 'Y' AND UPPER(m1.active_yn) ='Y'  UNION  SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn  FROM fn_menu_functional m  WHERE m.text in ('Favorites','Get Access','Contact Us','Support','User Guide','Help')";
+               List<FunctionalMenuItem> actualResult = new ArrayList<FunctionalMenuItem>();
+               List<FunctionalMenuItem> expectedResult = new ArrayList<FunctionalMenuItem>();
+                
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(expectedResult);
+                
+               actualResult = functionalMenuServiceImpl.getFunctionalMenuItemsForUser(orgUserId);
+               assertEquals(actualResult, expectedResult);             
+       }
+       
+       @Test
+       public void getFunctionalMenuItemDetailsTest(){
+               Integer menuid = 1;
+               String sql = "SELECT * FROM fn_menu_functional_roles WHERE menu_id = '1'";
+               FunctionalMenuItem actualResult = null;
+               FunctionalMenuItem expectedResult = null;
+               List<FunctionalMenuRole> roleItems = new ArrayList<FunctionalMenuRole>();
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FunctionalMenuItemWithAppID.class, null)).thenReturn(roleItems);
+                
+               actualResult = functionalMenuServiceImpl.getFunctionalMenuItemDetails(menuid);
+               assertEquals(actualResult, expectedResult);             
+       }
+               
+       @Test
+       public void getFavoriteItemsTest(){
+               Long userId = (long)1;
+               String sql = "SELECT DISTINCT f.user_id,f.menu_id,m.text,m.url  "
+                               + "FROM fn_menu_favorites f, fn_menu_functional m, fn_menu_functional_roles mr  "
+                               + "WHERE f.user_id='1' AND f.menu_id = m.menu_id  AND f.menu_id = mr.menu_id  AND mr.role_id != '900' ";
+               List<FavoritesFunctionalMenuItemJson> actualResult = new ArrayList<FavoritesFunctionalMenuItemJson>();
+               List<FavoritesFunctionalMenuItemJson> expectedResult = new ArrayList<FavoritesFunctionalMenuItemJson>();
+                
+               Mockito.when(dataAccessService.executeSQLQuery(sql, FavoritesFunctionalMenuItemJson.class, null)).thenReturn(expectedResult);
+                
+               actualResult = functionalMenuServiceImpl.getFavoriteItems(userId);
+               assertEquals(actualResult, expectedResult);             
+       }       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/FunctionalMenuServiceImplTest.java
new file mode 100644 (file)
index 0000000..71bf067
--- /dev/null
@@ -0,0 +1,73 @@
+///*-
+// * ================================================================================
+// * ECOMP Portal
+// * ================================================================================
+// * Copyright (C) 2017 AT&T Intellectual Property
+// * ================================================================================
+// * Licensed 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.
+// * ================================================================================
+// */
+//package org.openecomp.portalapp.portal.test.service;
+//
+//import static org.junit.Assert.assertTrue;
+//
+//import java.util.ArrayList;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+//import org.junit.Test;
+//import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+//import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;
+//import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+//import org.openecomp.portalapp.test.framework.ApplicationCommonContextTestSuite;
+//import org.springframework.beans.factory.annotation.Autowired;
+//
+//public class FunctionalMenuServiceImplTest extends ApplicationCommonContextTestSuite {
+//
+//     @Autowired
+//     FunctionalMenuService functionalMenuService;
+//
+//     @Test
+//     public void getAppListTestService() throws Exception {
+//
+//             String userId = "guestT";
+//             List<BusinessCardApplicationRole> userAppRolesActualResult = null;
+//
+//             List<BusinessCardApplicationRole> userAppRolesExpectedResult = new ArrayList<BusinessCardApplicationRole>();
+//             BusinessCardApplicationRole businessCardApplicationRole = new BusinessCardApplicationRole();
+//             businessCardApplicationRole.setAppName("ECOMP Portal");
+//             businessCardApplicationRole.setRoleName("System Administrator");
+//             userAppRolesExpectedResult.add(businessCardApplicationRole);
+//             Map<String, String> params = new HashMap<String, String>();
+//             params.put("userId", userId);
+//             userAppRolesActualResult = functionalMenuService.getUserAppRolesList(userId);
+//             assertTrue(userAppRolesActualResult.contains(businessCardApplicationRole));
+//
+//     }
+//
+//     @Test
+//     public void getFunctionalMenuRoleTest() throws Exception {
+//
+//             FunctionalMenuRole expectedFunctionalMenuRole = new FunctionalMenuRole();
+//             expectedFunctionalMenuRole.setId(new Integer(-1));
+//
+//             expectedFunctionalMenuRole.setMenuId((long) 137);
+//             expectedFunctionalMenuRole.setAppId(new Integer(456));
+//             expectedFunctionalMenuRole.setRoleId(new Integer(6214));
+//             List<FunctionalMenuRole> actualFunctionalMenuRoleList = null;
+//             actualFunctionalMenuRoleList = functionalMenuService.getFunctionalMenuRole();
+//             assertTrue(actualFunctionalMenuRoleList.contains(expectedFunctionalMenuRole));
+//
+//     }
+//}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/GetAccessServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/GetAccessServiceImplTest.java
new file mode 100644 (file)
index 0000000..84096f1
--- /dev/null
@@ -0,0 +1,50 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.GetAccessResult;
+import org.openecomp.portalapp.portal.service.GetAccessServiceImpl;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.openecomp.portalsdk.core.service.DataAccessServiceImpl;
+
+public class GetAccessServiceImplTest {
+
+       
+    @Mock
+       DataAccessService dataAccessService = new DataAccessServiceImpl();
+    @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+    
+    @InjectMocks
+    GetAccessServiceImpl getAccessServiceImpl = new GetAccessServiceImpl();
+
+    MockEPUser mockUser = new MockEPUser();
+    
+    @Test
+       public void getAppAccessListTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Map<String, Long> params = new HashMap<>();
+               params.put("userId", user.getId());
+               List<GetAccessResult> appAccessList = new ArrayList<>();
+               Mockito.when(dataAccessService.executeNamedQuery("getAppAccessFunctionRole", params, null)).thenReturn(appAccessList);
+               
+               List<GetAccessResult> expectedAppAccessList =   getAccessServiceImpl.getAppAccessList(user);
+               assertEquals(expectedAppAccessList, appAccessList); 
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/LicenseableClassImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/LicenseableClassImplTest.java
new file mode 100644 (file)
index 0000000..d04355d
--- /dev/null
@@ -0,0 +1,61 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.lm.LicenseableClassImpl;
+
+public class LicenseableClassImplTest {
+       
+       @InjectMocks
+       LicenseableClassImpl licenseableClassImpl= new LicenseableClassImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       
+       @Test
+       public void getApplicationNameTest()
+       {               
+               assertEquals(licenseableClassImpl.getApplicationName(), "");
+       }
+       @Test
+       public void getPublicKeystoreAsInputStreamTest() throws IOException
+       {               
+               assertNull(licenseableClassImpl.getPublicKeystoreAsInputStream());
+       }
+       @Test
+       public void getAliasTest()
+       {               
+               assertEquals(licenseableClassImpl.getAlias(), "");
+       }
+       @Test
+       public void getKeyPasswdTest()
+       {               
+               assertEquals(licenseableClassImpl.getKeyPasswd(), "");
+       }
+       @Test
+       public void getPublicKeystorePasswordTest()
+       {               
+               assertEquals(licenseableClassImpl.getPublicKeystorePassword(), "");
+       }
+       @Test
+       public void getCipherParamPasswordTest()
+       {               
+               assertEquals(licenseableClassImpl.getPublicKeystorePassword(), "");
+       }
+       @Test
+       public void getClassToLicenseTest()
+       {               
+               assertEquals(licenseableClassImpl.getClassToLicense(), LicenseableClassImpl.class);
+       }
+       
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ManifestServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/ManifestServiceImplTest.java
new file mode 100644 (file)
index 0000000..1c09a49
--- /dev/null
@@ -0,0 +1,55 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.Attributes;
+
+import javax.servlet.ServletContext;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.service.ManifestServiceImpl;
+
+public class ManifestServiceImplTest {
+
+       @Mock
+       ServletContext context;
+
+       @Mock
+       ServletContext context1 = null;
+
+       @InjectMocks
+       ManifestServiceImpl manifestServiceImpl = new ManifestServiceImpl();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test
+       public void getWebappManifestTest() throws IOException {
+               final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF";
+               InputStream inputStream = new ByteArrayInputStream("test data".getBytes());
+               Mockito.when(context.getResourceAsStream(MANIFEST_RESOURCE_PATH)).thenReturn(inputStream);
+               Attributes attributes = manifestServiceImpl.getWebappManifest();
+               assertTrue(attributes.size() == 0);
+       }
+
+       @Test(expected = java.lang.NullPointerException.class)
+       public void getWebappManifestExceptionTest() throws IOException {
+               final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF";
+               InputStream inputStream = new ByteArrayInputStream("test data".getBytes());
+               Mockito.when(context1.getResourceAsStream(MANIFEST_RESOURCE_PATH)).thenThrow(nullPointerException);
+               Attributes attributes = manifestServiceImpl.getWebappManifest();
+               assertTrue(attributes.size() == 0);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/PersUserAppServiceImplTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/service/PersUserAppServiceImplTest.java
new file mode 100644 (file)
index 0000000..7155e14
--- /dev/null
@@ -0,0 +1,181 @@
+package org.openecomp.portalapp.portal.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.EPUserApp;
+import org.openecomp.portalapp.portal.domain.PersUserAppSelection;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.PersUserAppServiceImpl;
+import org.openecomp.portalapp.portal.service.UserRolesService;
+import org.openecomp.portalapp.portal.core.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+
+public class PersUserAppServiceImplTest {
+
+       @Mock
+       DataAccessService dataAccessService;
+       @Mock
+       AdminRolesService adminRolesService;
+       @Mock
+       UserRolesService userRolesService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @InjectMocks
+       PersUserAppServiceImpl persUserAppServiceImpl = new PersUserAppServiceImpl();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       public EPApp getApp() {
+               EPApp app = new EPApp();
+               app.setName("Test");
+               app.setImageUrl("test");
+               app.setDescription("test");
+               app.setNotes("test");
+               app.setUrl("test");
+               app.setId((long) 1);
+               app.setAppRestEndpoint("test");
+               app.setAlternateUrl("test");
+               app.setName("test");
+               app.setMlAppName("test");
+               app.setMlAppAdminId("test");
+               app.setUsername("test");
+               app.setAppPassword("test");
+               app.setOpen(true);
+               app.setEnabled(false);
+               app.setUebKey("test");
+               app.setUebSecret("test");
+               app.setUebTopicName("test");
+               app.setAppType(1);
+               return app;
+       }
+
+       @Test(expected = IllegalArgumentException.class)
+       public void setPersUserAppValueIfUserNull() {
+               persUserAppServiceImpl.setPersUserAppValue(null, null, false, false);
+       }
+
+       @Test
+       public void setPersUserAppValueTest() {
+               EPApp app = getApp();
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, false, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfSelectTest() {
+               EPApp app = getApp();
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfOpenTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, true);
+       }
+
+       @Test
+       public void setPersUserAppValueIfAppNotOpenTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, false);
+       }
+
+       @Test
+       public void setPersUserAppValueIfNotPortalAdminTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).deleteDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, true, false);
+       }
+
+       @Test
+       public void setPersUserAppValueNewTest() {
+               EPApp app = getApp();
+               app.setOpen(false);
+               EPUser user = mockUser.mockEPUser();
+               List<PersUserAppSelection> persUserAppSelectionList = new ArrayList<>();
+               PersUserAppSelection persUserAppSelection = new PersUserAppSelection();
+               persUserAppSelection.setId((long) 1);
+               persUserAppSelectionList.add(persUserAppSelection);
+               Mockito.when(dataAccessService.getList(PersUserAppSelection.class, "test", null, null))
+                               .thenReturn(persUserAppSelectionList);
+               Mockito.doNothing().when(dataAccessService).saveDomainObject(persUserAppSelection, null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               List<EPUserApp> roles = new ArrayList<>();
+               EPUserApp epUserApp = new EPUserApp();
+               roles.add(epUserApp);
+               Mockito.when(userRolesService.getCachedAppRolesForUser(app.getId(), user.getId())).thenReturn(roles);
+               persUserAppServiceImpl.setPersUserAppValue(user, app, false, false);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AnalyticsTest.java
new file mode 100644 (file)
index 0000000..7fd3c03
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.Analytics;
+
+public class AnalyticsTest {
+
+       public Analytics mockAnalytics(){
+               Analytics analytics = new Analytics();
+                               
+               analytics.setAction("test");
+               analytics.setPage("test");
+               analytics.setFunction("test");
+               analytics.setUserid("test");
+               analytics.setType("test");
+               
+               return analytics;
+       }
+       
+       @Test
+       public void analyticsTest(){
+               Analytics analytics = mockAnalytics();
+               
+               assertEquals(analytics.getAction(), "test");
+               assertEquals(analytics.getPage(), "test");
+               assertEquals(analytics.getFunction(), "test");
+               assertEquals(analytics.getUserid(), "test");
+               assertEquals(analytics.getType(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppCatalogPersonalizationTest.java
new file mode 100644 (file)
index 0000000..c583c9c
--- /dev/null
@@ -0,0 +1,25 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class AppCatalogPersonalizationTest {
+       
+       public AppCatalogPersonalization mockAppCatalogPersonalization(){
+               AppCatalogPersonalization appCatalogPersonalization = new AppCatalogPersonalization();
+               
+               return appCatalogPersonalization;
+       }
+       
+       @Test
+       public void appCatalogPersonalizationTest(){
+               AppCatalogPersonalization appCatalogPersonalization = mockAppCatalogPersonalization();
+               
+               AppCatalogPersonalization appCatalogPersonalization1 = new AppCatalogPersonalization();
+               
+               assertEquals(appCatalogPersonalization.hashCode(), appCatalogPersonalization1.hashCode());
+               assertTrue(appCatalogPersonalization.equals(appCatalogPersonalization1));
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppNameIdIsAdminTest.java
new file mode 100644 (file)
index 0000000..a1dffd2
--- /dev/null
@@ -0,0 +1,38 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.AppNameIdIsAdmin;
+
+public class AppNameIdIsAdminTest {
+
+       public AppNameIdIsAdmin mockAppNameIdIsAdmin(){
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appNameIdIsAdmin.setId((long)1);
+               appNameIdIsAdmin.setAppName("test");
+               appNameIdIsAdmin.setRestrictedApp(false);
+               appNameIdIsAdmin.setIsAdmin(false);
+               return appNameIdIsAdmin;
+       }
+       
+       @Test
+       public void appNameIdIsAdminTest(){
+               AppNameIdIsAdmin appNameIdIsAdmin = mockAppNameIdIsAdmin(); 
+               
+               AppNameIdIsAdmin appNameIdIsAdmin1 = new AppNameIdIsAdmin();
+               appNameIdIsAdmin1.setId((long)1);
+               appNameIdIsAdmin1.setAppName("test");
+               appNameIdIsAdmin1.setRestrictedApp(false);
+               appNameIdIsAdmin1.setIsAdmin(false);
+               
+               assertEquals(appNameIdIsAdmin.getId(), new Long(1));
+               assertEquals(appNameIdIsAdmin.getAppName(), "test");
+               assertEquals(appNameIdIsAdmin.getRestrictedApp(), false);
+               assertEquals(appNameIdIsAdmin.getIsAdmin(), false);
+               
+               assertEquals(appNameIdIsAdmin.toString(), "AppNameIdIsAdmin [id=1, appName=test, isAdmin=false, restrictedApp=false]");
+               assertEquals(appNameIdIsAdmin.hashCode(), appNameIdIsAdmin1.hashCode());
+               assertTrue(appNameIdIsAdmin.equals(appNameIdIsAdmin1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppWithRolesForUserTest.java
new file mode 100644 (file)
index 0000000..2a7c343
--- /dev/null
@@ -0,0 +1,32 @@
+package org.openecomp.portalapp.portal.transport;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import org.openecomp.portalapp.portal.transport.AppWithRolesForUser;
+
+public class AppWithRolesForUserTest {
+
+       public AppWithRolesForUser mockAppWithRolesForUser(){
+               AppWithRolesForUser appWithRolesForUser = new AppWithRolesForUser();
+               
+       //      List<RoleInAppForUser> appRoles = new ArrayList<RoleInAppForUser>();            
+               
+               appWithRolesForUser.setOrgUserId("test");
+               appWithRolesForUser.setAppId((long)1);
+               appWithRolesForUser.setAppName("test");
+               appWithRolesForUser.setAppRoles(null);
+               
+               return appWithRolesForUser;
+       }
+       
+       @Test
+       public void roleInAppForUserTest(){
+               AppWithRolesForUser appWithRolesForUser = mockAppWithRolesForUser();
+               
+               assertEquals(appWithRolesForUser.getOrgUserId(), "test");
+               assertEquals(appWithRolesForUser.getAppId(), new Long(1));
+               assertEquals(appWithRolesForUser.getAppName(), "test");
+               assertEquals(appWithRolesForUser.getAppRoles(), null);
+               assertEquals(appWithRolesForUser.toString(), "AppWithRolesForUser [orgUserId=test, appId=1, appName=test, appRoles=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/AppsListWithAdminRoleTest.java
new file mode 100644 (file)
index 0000000..2c601d3
--- /dev/null
@@ -0,0 +1,46 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.AppNameIdIsAdmin;
+import org.openecomp.portalapp.portal.transport.AppsListWithAdminRole;
+
+public class AppsListWithAdminRoleTest {
+       
+       public AppsListWithAdminRole mockAppsListWithAdminRole(){
+               AppsListWithAdminRole appsListWithAdminRole = new AppsListWithAdminRole();
+               
+               ArrayList<AppNameIdIsAdmin> appsRoles = new ArrayList<AppNameIdIsAdmin>();
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appsRoles.add(appNameIdIsAdmin);
+               
+               appsListWithAdminRole.setOrgUserId("test");
+               appsListWithAdminRole.setAppsRoles(appsRoles);
+               
+               return appsListWithAdminRole;
+       }
+
+       @Test
+       public void appsListWithAdminRoleTest(){
+               AppsListWithAdminRole appsListWithAdminRole = mockAppsListWithAdminRole();
+               
+               AppsListWithAdminRole appsListWithAdminRole1 = new AppsListWithAdminRole();
+               
+               ArrayList<AppNameIdIsAdmin> appsRoles = new ArrayList<AppNameIdIsAdmin>();
+               AppNameIdIsAdmin appNameIdIsAdmin = new AppNameIdIsAdmin();
+               appsRoles.add(appNameIdIsAdmin);
+               
+               appsListWithAdminRole1.setOrgUserId("test");
+               appsListWithAdminRole1.setAppsRoles(appsRoles);
+                               
+               assertEquals(appsListWithAdminRole.getOrgUserId(), "test");
+               assertEquals(appsListWithAdminRole.getAppsRoles(), appsRoles);
+               
+               assertTrue(appsListWithAdminRole.equals(appsListWithAdminRole1));
+               assertEquals(appsListWithAdminRole.hashCode(), appsListWithAdminRole1.hashCode());
+               assertEquals(appsListWithAdminRole.toString(), "AppsListWithAdminRole [orgUserId=test, appsRoles=[AppNameIdIsAdmin [id=null, appName=null, isAdmin=null, restrictedApp=null]]]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadRoleFunctionTest.java
new file mode 100644 (file)
index 0000000..854afcc
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.BulkUploadRoleFunction;
+
+public class BulkUploadRoleFunctionTest {
+
+       public BulkUploadRoleFunction mockBulkUploadRoleFunction(){
+               
+               BulkUploadRoleFunction bulkUploadRoleFunction = new BulkUploadRoleFunction();
+                                               
+               bulkUploadRoleFunction.setFunctionName("test");
+               bulkUploadRoleFunction.setFunctionCd("test");
+               
+               return bulkUploadRoleFunction;
+       }
+       
+       @Test
+       public void bulkUploadRoleFunctionTest(){
+               BulkUploadRoleFunction bulkUploadRoleFunction = mockBulkUploadRoleFunction();
+               
+               BulkUploadRoleFunction bulkUploadRoleFunction1 = new BulkUploadRoleFunction();
+               
+               bulkUploadRoleFunction1.setFunctionName("test");
+               bulkUploadRoleFunction1.setFunctionCd("test");
+               
+               assertEquals(bulkUploadRoleFunction.getFunctionCd(), "test");
+               assertEquals(bulkUploadRoleFunction.getFunctionName(), "test");
+               assertEquals(bulkUploadRoleFunction.hashCode(), bulkUploadRoleFunction1.hashCode());
+               assertTrue(bulkUploadRoleFunction.equals(bulkUploadRoleFunction1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BulkUploadUserRolesTest.java
new file mode 100644 (file)
index 0000000..b2bbba6
--- /dev/null
@@ -0,0 +1,37 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.BulkUploadUserRoles;
+
+public class BulkUploadUserRolesTest {
+
+       public BulkUploadUserRoles mockBulkUploadUserRoles(){
+               BulkUploadUserRoles bulkUploadUserRoles = new BulkUploadUserRoles();
+                               
+               bulkUploadUserRoles.setRoleName("test");
+               bulkUploadUserRoles.setOrgUserId("test");
+               bulkUploadUserRoles.setAppNameSpace("test");
+               
+               return bulkUploadUserRoles;
+       }
+       
+       @Test
+       public void bulkUploadUserRolesTest(){
+               BulkUploadUserRoles bulkUploadUserRoles = mockBulkUploadUserRoles();
+               
+               BulkUploadUserRoles bulkUploadUserRoles1 = new BulkUploadUserRoles();
+               
+               bulkUploadUserRoles1.setRoleName("test");
+               bulkUploadUserRoles1.setOrgUserId("test");
+               bulkUploadUserRoles1.setAppNameSpace("test");
+               
+               assertEquals(bulkUploadUserRoles.getRoleName(), "test");
+               assertEquals(bulkUploadUserRoles.getOrgUserId(), "test");
+               assertEquals(bulkUploadUserRoles.getAppNameSpace(), "test");
+               
+               assertEquals(bulkUploadUserRoles.hashCode(), bulkUploadUserRoles1.hashCode());
+               assertTrue(bulkUploadUserRoles.equals(bulkUploadUserRoles1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRoleTest.java
new file mode 100644 (file)
index 0000000..0ed06b1
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class BusinessCardApplicationRoleTest {
+
+       public BusinessCardApplicationRole mockBusinessCardApplicationRole(){
+               BusinessCardApplicationRole businessCardApplicationRole = new BusinessCardApplicationRole();
+               
+               return businessCardApplicationRole;
+       }
+       
+       @Test
+       public void businessCardApplicationRoleTest(){
+               BusinessCardApplicationRole businessCardApplicationRole = mockBusinessCardApplicationRole();
+               
+               BusinessCardApplicationRole businessCardApplicationRole1 = new BusinessCardApplicationRole();
+               
+               assertEquals(businessCardApplicationRole.hashCode(), businessCardApplicationRole1.hashCode());
+               assertTrue(businessCardApplicationRole.equals(businessCardApplicationRole1));
+               assertEquals(businessCardApplicationRole.toString(), "BusinessCardUserApplicationRoles [appName=null, roleName=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/BusinessCardApplicationRolesListTest.java
new file mode 100644 (file)
index 0000000..9f5e678
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class BusinessCardApplicationRolesListTest {
+
+       public BusinessCardApplicationRolesList mockBusinessCardApplicationRolesList(){
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = new BusinessCardApplicationRolesList();
+               
+               return businessCardApplicationRolesList;
+       }
+       
+       @Test
+       public void businessCardApplicationRolesListTest(){
+               BusinessCardApplicationRolesList businessCardApplicationRolesList = mockBusinessCardApplicationRolesList();
+               
+               BusinessCardApplicationRolesList businessCardApplicationRolesList1 = new BusinessCardApplicationRolesList();
+               
+               assertEquals(businessCardApplicationRolesList.hashCode(), businessCardApplicationRolesList1.hashCode());
+               assertTrue(businessCardApplicationRolesList.equals(businessCardApplicationRolesList1));
+               assertEquals(businessCardApplicationRolesList.toString(), "BusinessCardUserAppRoles [appName=null, roleNames=null]");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralAppTest.java
new file mode 100644 (file)
index 0000000..97c9c59
--- /dev/null
@@ -0,0 +1,102 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralApp;
+
+public class CentralAppTest {
+
+       public CentralApp mockCentralApp(){
+               CentralApp centralApp = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+       
+
+       /*      public CentralApp(Long id, Date created, Date modified, Long createdId, Long modifiedId, Long rowNum, String name,
+                               String imageUrl, String description, String notes, String url, String alternateUrl, String restEndpoint,
+                               String mlAppName, String mlAppAdminId, String motsId, String appPassword, String open, String enabled,
+                               byte[] thumbnail, String username, String uebKey, String uebSecret, String uebTopicName)*/
+               
+               centralApp.setId((long)1);
+               centralApp.setCreatedId((long)1);
+               centralApp.setModifiedId((long)1);
+               centralApp.setRowNum((long)1);
+               centralApp.setName("test");
+               centralApp.setImageUrl("test");
+               centralApp.setDescription("test");
+               centralApp.setNotes("test");
+               centralApp.setUrl("test");
+               centralApp.setAlternateUrl("test");
+               centralApp.setRestEndpoint("test");
+               centralApp.setMlAppName("test");
+               centralApp.setMlAppAdminId("test");
+               centralApp.setMotsId("test");
+               centralApp.setAppPassword("test");
+               centralApp.setOpen("test");
+               centralApp.setEnabled("test");
+               centralApp.setUsername("test");
+               centralApp.setUebKey("test");
+               centralApp.setUebSecret("test");
+               centralApp.setUebTopicName("test");
+               
+               return centralApp;
+       }
+       
+       @Test
+       public void centralAppTest(){
+               CentralApp centralApp = mockCentralApp();
+               
+               CentralApp centralApp1 =  new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               /*centralApp1.setId((long)1);
+               centralApp1.setCreatedId((long)1);
+               centralApp1.setModifiedId((long)1);
+               centralApp1.setRowNum((long)1);
+               centralApp1.setName("test");
+               centralApp1.setImageUrl("test");
+               centralApp1.setDescription("test");
+               centralApp1.setNotes("test");
+               centralApp1.setUrl("test");
+               centralApp1.setAlternateUrl("test");
+               centralApp1.setRestEndpoint("test");
+               centralApp1.setMlAppName("test");
+               centralApp1.setMlAppAdminId("test");
+               centralApp1.setMotsId("test");
+               centralApp1.setAppPassword("test");
+               centralApp1.setOpen("test");
+               centralApp1.setEnabled("test");
+               centralApp1.setUsername("test");
+               centralApp1.setUebKey("test");
+               centralApp1.setUebSecret("test");
+               centralApp1.setUebTopicName("test");*/
+               
+               assertEquals(centralApp.getId(), new Long(1));
+               assertEquals(centralApp.getCreatedId(), new Long(1));
+               assertEquals(centralApp.getModifiedId(), new Long(1));
+               assertEquals(centralApp.getRowNum(), new Long(1));
+               assertEquals(centralApp.getName(), "test");
+               assertEquals(centralApp.getImageUrl(), "test");
+               assertEquals(centralApp.getDescription(), "test");
+               assertEquals(centralApp.getNotes(), "test");
+               assertEquals(centralApp.getUrl(), "test");
+               assertEquals(centralApp.getAlternateUrl(), "test");
+               assertEquals(centralApp.getRestEndpoint(), "test");
+               assertEquals(centralApp.getMlAppName(), "test");
+               assertEquals(centralApp.getMlAppAdminId(), "test");
+               assertEquals(centralApp.getMotsId(), "test");
+               assertEquals(centralApp.getAppPassword(), "test");
+               assertEquals(centralApp.getOpen(), "test");
+               assertEquals(centralApp.getEnabled(), "test");
+               assertEquals(centralApp.getUsername(), "test");
+               assertEquals(centralApp.getUebKey(), "test");
+               assertEquals(centralApp.getUebSecret(), "test");
+               assertEquals(centralApp.getUebTopicName(), "test");
+               
+               assertTrue(centralApp.equals(centralApp1));
+               assertEquals(centralApp.hashCode(), centralApp1.hashCode());
+               /*      assertTrue(centralApp.equals(new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test")));*/
+       }
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralRoleTest.java
new file mode 100644 (file)
index 0000000..6ba0a44
--- /dev/null
@@ -0,0 +1,63 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.Date;
+import java.util.SortedSet;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.domain.CentralRoleFunction;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+
+public class CentralRoleTest {
+
+       public CentralRole mockCentralRole(){
+               CentralRole centralRole = new CentralRole((long)1, null, null, (long)1, (long)1, (long)1,
+                               "test", false, 1, null, null, null);
+           
+           centralRole.setId((long)1);
+           centralRole.setCreatedId((long)1);
+           centralRole.setModifiedId((long)1);
+           centralRole.setRowNum((long)1);
+           centralRole.setName("test");
+           centralRole.setActive(false);
+           centralRole.setPriority(1);
+           
+           centralRole.setCreated(null);
+           centralRole.setModified(null);
+           centralRole.setRoleFunctions(null);
+           centralRole.setChildRoles(null);
+           centralRole.setParentRoles(null);
+           
+               return centralRole;
+       }
+       
+       @Test
+       public void centralRoleTest(){
+               CentralRole centralRole = mockCentralRole();
+               
+               CentralRole centralRole1 = new CentralRole((long)1, null, null, (long)1, (long)1, (long)1,
+                               "test", false, 1, null, null, null);
+               
+               CentralRole centralRole2 = new CentralRole((long)1, "test");
+               
+               assertEquals(centralRole.getId(), new Long(1));
+               assertEquals(centralRole.getCreatedId(), new Long(1));
+               assertEquals(centralRole.getModifiedId(), new Long(1));
+               assertEquals(centralRole.getRowNum(), new Long(1));
+               assertEquals(centralRole.getName(), "test");
+               assertEquals(centralRole.isActive(), false);
+               assertEquals(centralRole.getCreated(), null);
+               assertEquals(centralRole.getModified(), null);
+               assertEquals(centralRole.getRoleFunctions(), null);
+               assertEquals(centralRole.getChildRoles(), null);
+               assertEquals(centralRole.getParentRoles(), null);               
+               assertEquals(centralRole.getPriority().toString(), "1");
+               assertEquals(centralRole.hashCode(), centralRole1.hashCode());
+               assertTrue(centralRole.equals(centralRole1));
+               assertEquals(centralRole, centralRole1);
+               assertEquals(centralRole2, new CentralRole((long)1, "test"));
+       }
+       
+       
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserAppTest.java
new file mode 100644 (file)
index 0000000..f358264
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralApp;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalapp.portal.transport.CentralUserApp;
+
+public class CentralUserAppTest {
+
+       public CentralUserApp mockCentralUserApp(){
+               CentralUserApp centralUserApp = new CentralUserApp();
+                               
+               CentralApp app = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               CentralRole role = new CentralRole();
+                
+               centralUserApp.setUserId((long)1);
+               centralUserApp.setApp(app);
+               centralUserApp.setRole(role);
+               centralUserApp.setPriority((short) 123);
+               
+               return centralUserApp;
+       }
+       
+       @Test
+       public void centralUserAppTest(){
+               CentralUserApp centralUserApp = mockCentralUserApp();
+               
+               CentralApp app1 = new CentralApp((long)1, null, null, (long)1, (long)1, (long)1, "test", "test", "test", "test", "test", "test", "test", "test", "test", 
+                               "test", "test", "test", "test", null, "test", "test", "test", "test");
+               
+               CentralRole role1 = new CentralRole();
+               
+               assertEquals(centralUserApp.getUserId(), new Long(1));
+               assertEquals(centralUserApp.getPriority(), new Short((short) 123));
+               assertEquals(centralUserApp.getApp(), app1);
+               assertEquals(centralUserApp.getRole(), role1);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/CentralUserTest.java
new file mode 100644 (file)
index 0000000..9df86bc
--- /dev/null
@@ -0,0 +1,52 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.CentralRole;
+import org.openecomp.portalapp.portal.transport.CentralUser;
+import org.openecomp.portalapp.portal.transport.CentralUserApp;
+
+public class CentralUserTest {
+
+       public CentralUser mockCentralUser(){
+               Set<CentralUserApp> userApps = new HashSet<CentralUserApp>();
+               Set<CentralRole> pseudoRoles = new HashSet<CentralRole>();
+               CentralUser centralUser = new CentralUser((long)1, null, null, (long)1, (long)1, (long)1, (long)1,
+                               (long)1, "test", "test", "test", "test", "test",
+                               "test", "test", (long)1, "test", "test", "test",
+                               "test", "test", "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", null,
+                               false, false, (long)1, (long)1, false, "test", userApps, pseudoRoles);
+               
+               return centralUser;
+       }
+       
+       @Test
+       public void centralRoleTest(){
+               CentralUser centralUser = mockCentralUser();
+               
+               Set<CentralUserApp> userApps = new HashSet<CentralUserApp>();
+               Set<CentralRole> pseudoRoles = new HashSet<CentralRole>();
+               CentralUser centralUser1 = new CentralUser((long)1, null, null, (long)1, (long)1, (long)1, (long)1,
+                               (long)1, "test", "test", "test", "test", "test",
+                               "test", "test", (long)1, "test", "test", "test",
+                               "test", "test", "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", "test",
+                               "test", "test", "test", "test", null,
+                               false, false, (long)1, (long)1, false, "test", userApps, pseudoRoles);
+               
+               
+               assertEquals(centralUser, centralUser1);
+               assertEquals(centralUser.hashCode(), centralUser1.hashCode());
+               assertTrue(centralUser.equals(centralUser1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsManualPreferenceTest.java
new file mode 100644 (file)
index 0000000..6e8b401
--- /dev/null
@@ -0,0 +1,47 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPAppsManualPreference;
+
+public class EPAppsManualPreferenceTest {
+
+       public EPAppsManualPreference mockEPAppsManualPreference(){
+               EPAppsManualPreference epAppsManualPreference = new EPAppsManualPreference();
+                               
+               epAppsManualPreference.setAppid((long)1);
+               epAppsManualPreference.setCol(1);
+               epAppsManualPreference.setHeaderText("test");
+               epAppsManualPreference.setImageLink("test");
+               epAppsManualPreference.setOrder(1);
+               epAppsManualPreference.setRestrictedApp(false);
+               epAppsManualPreference.setRow(1);
+               epAppsManualPreference.setSizeX(1);
+               epAppsManualPreference.setSizeY(1);
+               epAppsManualPreference.setSubHeaderText("test");
+               epAppsManualPreference.setUrl("test");
+               epAppsManualPreference.setAddRemoveApps(false);
+               
+               return epAppsManualPreference;
+       }
+       
+       @Test
+       public void epAppsManualPreferenceTest(){
+               
+               EPAppsManualPreference epAppsManualPreference = mockEPAppsManualPreference();
+               
+               assertEquals(epAppsManualPreference.getAppid(), new Long(1));
+               assertEquals(epAppsManualPreference.getCol(), 1);
+               assertEquals(epAppsManualPreference.getHeaderText(), "test");
+               assertEquals(epAppsManualPreference.getImageLink(), "test");
+               assertEquals(epAppsManualPreference.getOrder(), 1);
+               assertEquals(epAppsManualPreference.isRestrictedApp(), false);
+               assertEquals(epAppsManualPreference.getRow(), 1);
+               assertEquals(epAppsManualPreference.getSizeX(), 1);
+               assertEquals(epAppsManualPreference.getSizeY(), 1);
+               assertEquals(epAppsManualPreference.getSubHeaderText(), "test");
+               assertEquals(epAppsManualPreference.getUrl(), "test");
+               assertEquals(epAppsManualPreference.isAddRemoveApps(), false);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPAppsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..6c67424
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPAppsSortPreference;
+
+public class EPAppsSortPreferenceTest {
+
+       public EPAppsSortPreference mockEPAppsSortPreference(){
+               EPAppsSortPreference epAppsSortPreference = new EPAppsSortPreference();
+               
+               epAppsSortPreference.setIndex(1);
+               epAppsSortPreference.setValue("test");
+               epAppsSortPreference.setTitle("test");
+               
+               return epAppsSortPreference;
+       }
+       
+       @Test
+       public void epAppsSortPreferenceTest(){
+               EPAppsSortPreference epAppsSortPreference = mockEPAppsSortPreference();
+               
+               assertEquals(epAppsSortPreference.getIndex(), 1);
+               assertEquals(epAppsSortPreference.getValue(), "test");
+               assertEquals(epAppsSortPreference.getTitle(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPDeleteAppsManualSortPrefTest.java
new file mode 100644 (file)
index 0000000..78bb847
--- /dev/null
@@ -0,0 +1,29 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPDeleteAppsManualSortPref;
+
+public class EPDeleteAppsManualSortPrefTest {
+
+       public EPDeleteAppsManualSortPref mockEPDeleteAppsManualSortPref(){
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = new EPDeleteAppsManualSortPref();
+               
+               epDeleteAppsManualSortPref.setAppId((long)1);
+               epDeleteAppsManualSortPref.setSelect(false);
+               epDeleteAppsManualSortPref.setPending(false);
+
+               return epDeleteAppsManualSortPref;
+       }
+       
+       @Test
+       public void epDeleteAppsManualSortPrefTest(){
+               EPDeleteAppsManualSortPref epDeleteAppsManualSortPref = mockEPDeleteAppsManualSortPref();
+               
+               assertEquals(epDeleteAppsManualSortPref.getAppId(), new Long(1));
+               assertEquals(epDeleteAppsManualSortPref.isSelect(), false);
+               assertEquals(epDeleteAppsManualSortPref.isPending(), false);
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPUserAppCurrentRolesTest.java
new file mode 100644 (file)
index 0000000..9c82ad3
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPUserAppCurrentRoles;
+
+public class EPUserAppCurrentRolesTest {
+
+       public EPUserAppCurrentRoles mockEPUserAppCurrentRoles(){
+               EPUserAppCurrentRoles epUserAppCurrentRoles = new EPUserAppCurrentRoles();
+                       
+               epUserAppCurrentRoles.setRoleName("test");
+               epUserAppCurrentRoles.setUserId((long)1);
+               epUserAppCurrentRoles.setPriority("test");
+               epUserAppCurrentRoles.setRoleId((long)1);
+               
+               return epUserAppCurrentRoles;
+       }
+       
+       @Test
+       public void epUserAppCurrentRolesTest(){
+               EPUserAppCurrentRoles epUserAppCurrentRoles = mockEPUserAppCurrentRoles();
+               
+               EPUserAppCurrentRoles epUserAppCurrentRoles1 = new EPUserAppCurrentRoles();
+               
+               epUserAppCurrentRoles1.setRoleName("test");
+               epUserAppCurrentRoles1.setUserId((long)1);
+               epUserAppCurrentRoles1.setPriority("test");
+               epUserAppCurrentRoles1.setRoleId((long)1);
+               
+               assertEquals(epUserAppCurrentRoles.getRoleName(), "test");
+               assertEquals(epUserAppCurrentRoles.getUserId(), new Long(1));
+               assertEquals(epUserAppCurrentRoles.getRoleId(), new Long(1));
+               assertEquals(epUserAppCurrentRoles.getPriority(), "test");
+               assertEquals(epUserAppCurrentRoles.hashCode(), epUserAppCurrentRoles1.hashCode());
+               assertTrue(epUserAppCurrentRoles.equals(epUserAppCurrentRoles1));
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EPWidgetsSortPreferenceTest.java
new file mode 100644 (file)
index 0000000..d466d91
--- /dev/null
@@ -0,0 +1,41 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EPWidgetsSortPreference;
+
+public class EPWidgetsSortPreferenceTest {
+       
+       public EPWidgetsSortPreference mockEPWidgetsSortPreference(){
+               EPWidgetsSortPreference epWidgetsSortPreference = new EPWidgetsSortPreference();
+                               
+               epWidgetsSortPreference.setSizeX(1);
+               epWidgetsSortPreference.setSizeY(1);
+               epWidgetsSortPreference.setHeaderText("test");
+               epWidgetsSortPreference.setUrl("test");
+               epWidgetsSortPreference.setWidgetid((long)1);
+               epWidgetsSortPreference.setWidgetIdentifier("test");
+               epWidgetsSortPreference.setRow(1);
+               epWidgetsSortPreference.setCol(1);
+               
+               return epWidgetsSortPreference;
+       }
+       
+       @Test
+       public void epWidgetsSortPreferenceTest(){
+               EPWidgetsSortPreference epWidgetsSortPreference = mockEPWidgetsSortPreference();
+               
+               assertEquals(epWidgetsSortPreference.getSizeX(), 1);
+               assertEquals(epWidgetsSortPreference.getSizeY(), 1);
+               assertEquals(epWidgetsSortPreference.getHeaderText(), "test");
+               assertEquals(epWidgetsSortPreference.getUrl(), "test");
+               assertEquals(epWidgetsSortPreference.getWidgetid(), new Long(1));
+               assertEquals(epWidgetsSortPreference.getWidgetIdentifier(), "test");
+               assertEquals(epWidgetsSortPreference.getRow(), 1);
+               assertEquals(epWidgetsSortPreference.getRow(), 1);
+               
+       }
+       
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EcompUserAppRolesTest.java
new file mode 100644 (file)
index 0000000..928c373
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EcompUserAppRoles;
+
+public class EcompUserAppRolesTest {
+
+       public EcompUserAppRoles mockEcompUserAppRoles(){
+               EcompUserAppRoles ecompUserAppRoles = new EcompUserAppRoles();
+                       
+               ecompUserAppRoles.setAppId("test");
+               ecompUserAppRoles.setUserId((long)1);
+               ecompUserAppRoles.setPriority("test");
+               ecompUserAppRoles.setRoleId((long)1);
+               ecompUserAppRoles.setRoleName("test");
+               
+               return ecompUserAppRoles;
+       }
+       
+       @Test
+       public void ecompUserAppRolesTest(){
+               
+               EcompUserAppRoles ecompUserAppRoles = mockEcompUserAppRoles();
+               
+               assertEquals(ecompUserAppRoles.getAppId(), "test");
+               assertEquals(ecompUserAppRoles.getPriority(), "test");
+               assertEquals(ecompUserAppRoles.getRoleName(), "test");
+               assertEquals(ecompUserAppRoles.getUserId(), new Long(1));
+               assertEquals(ecompUserAppRoles.getRoleId(), new Long(1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemExtVOTest.java
new file mode 100644 (file)
index 0000000..11fe2cf
--- /dev/null
@@ -0,0 +1,33 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItemExtVO;
+
+public class EpNotificationItemExtVOTest {
+
+       public EpNotificationItemExtVO mockEpNotificationItemExtVO(){
+               EpNotificationItemExtVO epNotificationItemExtVO = new EpNotificationItemExtVO();
+               
+               //epNotificationItemExtVO.setActiveYn("abc");
+               epNotificationItemExtVO.setMsgHeader("test");
+               epNotificationItemExtVO.setMsgDescription("test");
+               epNotificationItemExtVO.setPriority(1);
+               epNotificationItemExtVO.setCreatorId(1);
+               epNotificationItemExtVO.setLoginId("test");
+               
+               return epNotificationItemExtVO;
+       }
+       
+       @Test
+       public void epNotificationItemExtVOTest(){
+               EpNotificationItemExtVO epNotificationItemExtVO = mockEpNotificationItemExtVO();
+               
+               assertEquals(epNotificationItemExtVO.getMsgHeader(), "test");
+               assertEquals(epNotificationItemExtVO.getMsgDescription(), "test");
+               assertEquals(epNotificationItemExtVO.getPriority().toString(), "1");
+               assertEquals(epNotificationItemExtVO.getCreatorId().toString(), "1");
+               assertEquals(epNotificationItemExtVO.getLoginId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemTest.java
new file mode 100644 (file)
index 0000000..6e1e48c
--- /dev/null
@@ -0,0 +1,64 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItem;
+
+public class EpNotificationItemTest {
+       
+       public EpNotificationItem mockEpNotificationItem(){
+               EpNotificationItem epNotificationItem = new EpNotificationItem();
+               
+               epNotificationItem.setNotificationId((long)1);
+               epNotificationItem.setIsForOnlineUsers("test");
+               epNotificationItem.setIsForAllRoles("test");
+               epNotificationItem.setActiveYn("test");
+               epNotificationItem.setMsgHeader("test");
+               epNotificationItem.setMsgDescription("test");
+               epNotificationItem.setMsgSource("test");
+               
+               epNotificationItem.setPriority((long)1);
+               epNotificationItem.setCreatedId((long)1);
+               epNotificationItem.setNotificationHyperlink("test");
+               
+               return epNotificationItem;
+       }
+       
+       @Test
+       public void epNotificationItemTest(){
+               EpNotificationItem epNotificationItem = mockEpNotificationItem();
+               
+               EpNotificationItem epNotificationItem1 = new EpNotificationItem();
+               epNotificationItem1.setNotificationId((long)1);
+               epNotificationItem1.setIsForOnlineUsers("test");
+               epNotificationItem1.setIsForAllRoles("test");
+               epNotificationItem1.setActiveYn("test");
+               epNotificationItem1.setMsgHeader("test");
+               epNotificationItem1.setMsgDescription("test");
+               epNotificationItem1.setMsgSource("test");
+               
+               epNotificationItem1.setPriority((long)1);
+               epNotificationItem1.setCreatedId((long)1);
+               epNotificationItem1.setNotificationHyperlink("test");
+               
+               assertEquals(epNotificationItem.getNotificationId(), new Long(1));
+               assertEquals(epNotificationItem.getIsForOnlineUsers(), "test");
+               assertEquals(epNotificationItem.getIsForAllRoles(), "test");
+               assertEquals(epNotificationItem.getActiveYn(), "test");
+               assertEquals(epNotificationItem.getMsgHeader(), "test");
+               assertEquals(epNotificationItem.getMsgDescription(), "test");
+               assertEquals(epNotificationItem.getMsgSource(), "test");
+               assertEquals(epNotificationItem.getPriority(), new Long(1));
+               assertEquals(epNotificationItem.getCreatedId(), new Long(1));
+               assertEquals(epNotificationItem.getNotificationHyperlink(), "test");
+               
+               assertEquals(epNotificationItem.toString(), "EpNotificationItem [notificationId=1, isForOnlineUsers=test, isForAllRoles=test, activeYn=test, msgHeader=test, msgDescription=test, msgSource=test, startTime=null, endTime=null, priority=1, creatorId=null, createdDate=null, roles=null, roleIds=null]");
+               assertEquals(epNotificationItem.hashCode(), epNotificationItem1.hashCode());
+               assertTrue(epNotificationItem.equals(epNotificationItem1));
+                               
+       }
+
+}
+
+
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpNotificationItemVOTest.java
new file mode 100644 (file)
index 0000000..35a1183
--- /dev/null
@@ -0,0 +1,46 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpNotificationItemVO;
+
+public class EpNotificationItemVOTest {
+
+       public EpNotificationItemVO mockEpNotificationItemVO(){
+               EpNotificationItemVO epNotificationItemVO = new EpNotificationItemVO();
+                               
+               epNotificationItemVO.setNotificationId(1);
+               epNotificationItemVO.setIsForOnlineUsers('a');
+               epNotificationItemVO.setIsForAllRoles('a');
+               epNotificationItemVO.setActiveYn('a');
+               epNotificationItemVO.setMsgHeader("test");
+               epNotificationItemVO.setMsgDescription("test");
+               epNotificationItemVO.setMsgSource("test");
+               epNotificationItemVO.setPriority(1);
+               epNotificationItemVO.setCreatorId(1);
+               epNotificationItemVO.setLoginId("test");
+               epNotificationItemVO.setNotificationHyperlink("test");
+               
+                return epNotificationItemVO;
+       }
+       
+       @Test
+       public void epNotificationItemVOTest(){
+               EpNotificationItemVO epNotificationItemVO = mockEpNotificationItemVO();
+               
+               assertEquals(epNotificationItemVO.getNotificationId().toString(), "1");
+               /*assertEquals(epNotificationItemVO.getIsForOnlineUsers(), 'a');
+               assertEquals(epNotificationItemVO.getIsForAllRoles(), 'a');
+               assertEquals(epNotificationItemVO.getActiveYn(), 'a');*/
+               assertEquals(epNotificationItemVO.getMsgHeader(), "test");
+               assertEquals(epNotificationItemVO.getMsgDescription(), "test");
+               assertEquals(epNotificationItemVO.getMsgSource(), "test");
+               assertEquals(epNotificationItemVO.getPriority().toString(), "1");
+               assertEquals(epNotificationItemVO.getCreatorId().toString(), "1");
+               assertEquals(epNotificationItemVO.getLoginId(), "test");
+               assertEquals(epNotificationItemVO.getNotificationHyperlink(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/EpRoleNotificationItemTest.java
new file mode 100644 (file)
index 0000000..beb67ba
--- /dev/null
@@ -0,0 +1,31 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.EpRoleNotificationItem;
+
+public class EpRoleNotificationItemTest {
+       
+       public EpRoleNotificationItem mockEpRoleNotificationItem(){
+               EpRoleNotificationItem epRoleNotificationItem = new EpRoleNotificationItem();
+               
+               epRoleNotificationItem.setId((long)1);
+               epRoleNotificationItem.setNotificationId((long)1);
+               epRoleNotificationItem.setRoleId(1);
+               epRoleNotificationItem.setRecvUserId(1);
+               
+               return epRoleNotificationItem;
+       }
+       
+       @Test
+       public void epRoleNotificationItemTest(){
+               EpRoleNotificationItem epRoleNotificationItem = mockEpRoleNotificationItem();
+               
+               assertEquals(epRoleNotificationItem.getId(), new Long(1));
+               assertEquals(epRoleNotificationItem.getNotificationId(), new Long(1));
+               assertEquals(epRoleNotificationItem.getRoleId().toString(), "1");
+               assertEquals(epRoleNotificationItem.getRecvUserId().toString(), "1");
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsDetailTest.java
new file mode 100644 (file)
index 0000000..f490973
--- /dev/null
@@ -0,0 +1,39 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPermsDetail;
+
+public class ExternalAccessPermsDetailTest {
+
+       public ExternalAccessPermsDetail mockExternalAccessPermsDetail(){
+               ExternalAccessPermsDetail externalAccessPermsDetail = new ExternalAccessPermsDetail();
+                               
+               List<String> roles = new ArrayList<String>();
+               
+               externalAccessPermsDetail.setType("test");
+               externalAccessPermsDetail.setInstance("test");
+               externalAccessPermsDetail.setAction("test");
+               externalAccessPermsDetail.setDescription("test");
+               externalAccessPermsDetail.setRoles(roles);
+               
+               return externalAccessPermsDetail;
+       }
+       
+       @Test
+       public void externalAccessPermsDetailTest(){
+               ExternalAccessPermsDetail externalAccessPermsDetail = mockExternalAccessPermsDetail();
+               
+               List<String> roles = new ArrayList<String>();
+               
+               assertEquals(externalAccessPermsDetail.getType(), "test");
+               assertEquals(externalAccessPermsDetail.getInstance(), "test");
+               assertEquals(externalAccessPermsDetail.getAction(), "test");
+               assertEquals(externalAccessPermsDetail.getDescription(), "test");
+               assertEquals(externalAccessPermsDetail.getRoles(), roles);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessPermsTest.java
new file mode 100644 (file)
index 0000000..dfae604
--- /dev/null
@@ -0,0 +1,42 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
+
+public class ExternalAccessPermsTest {
+
+       public ExternalAccessPerms mockExternalAccessPerms(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+                               
+               externalAccessPerms.setType("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               
+               return externalAccessPerms;
+       }
+       
+       @Test
+       public void externalAccessPermsTest(){
+               ExternalAccessPerms externalAccessPerms = mockExternalAccessPerms();
+               
+               ExternalAccessPerms externalAccessPerms1 = new ExternalAccessPerms("test", "test", "test");
+               ExternalAccessPerms externalAccessPerms2 = new ExternalAccessPerms("test", "test", "test", "test");
+               ExternalAccessPerms externalAccessPerms3 = new ExternalAccessPerms();
+               externalAccessPerms3.setType("test");
+               externalAccessPerms3.setInstance("test");
+               externalAccessPerms3.setAction("test");
+               externalAccessPerms3.setDescription("test");
+               
+               assertEquals(externalAccessPerms.getType(), "test");
+               assertEquals(externalAccessPerms.getInstance(), "test");
+               assertEquals(externalAccessPerms.getAction(), "test");
+               assertEquals(externalAccessPerms.getDescription(), "test");
+               assertEquals(externalAccessPerms.hashCode(), externalAccessPerms3.hashCode());
+               
+               assertTrue(externalAccessPerms1.equals(new ExternalAccessPerms("test", "test", "test")));
+               assertTrue(externalAccessPerms2.equals(new ExternalAccessPerms("test", "test", "test", "test")));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRolePermsTest.java
new file mode 100644 (file)
index 0000000..4e736eb
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessPerms;
+import org.openecomp.portalapp.portal.transport.ExternalAccessRolePerms;
+
+public class ExternalAccessRolePermsTest {
+
+       public ExternalAccessRolePerms mockExternalAccessRolePerms(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setType("test");
+               ExternalAccessRolePerms ExternalAccessRolePerms = new ExternalAccessRolePerms(externalAccessPerms, "test");
+               
+               return ExternalAccessRolePerms;
+       }
+       
+       @Test
+       public void externalAccessRolePermsTest(){
+               ExternalAccessPerms externalAccessPerms = new ExternalAccessPerms();
+               externalAccessPerms.setAction("test");
+               externalAccessPerms.setDescription("test");
+               externalAccessPerms.setInstance("test");
+               externalAccessPerms.setType("test");
+               
+               ExternalAccessRolePerms ExternalAccessRolePerms = mockExternalAccessRolePerms();
+               
+               assertEquals(ExternalAccessRolePerms.getRole(), "test");
+               assertEquals(ExternalAccessRolePerms.getPerm(), externalAccessPerms);
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessRoleTest.java
new file mode 100644 (file)
index 0000000..19dee19
--- /dev/null
@@ -0,0 +1,26 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessRole;
+
+public class ExternalAccessRoleTest {
+
+       public ExternalAccessRole mockExternalAccessRole(){
+               ExternalAccessRole externalAccessRole = new ExternalAccessRole();
+               
+               externalAccessRole.setName("test");
+               externalAccessRole.setDescription("test");
+               
+               return externalAccessRole;
+       }
+       
+       @Test
+       public void externalAccessRoleTest(){
+               ExternalAccessRole externalAccessRole = mockExternalAccessRole();
+               
+               assertEquals(externalAccessRole.getName(), "test");
+               assertEquals(externalAccessRole.getDescription(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserRoleDetailTest.java
new file mode 100644 (file)
index 0000000..6ffab98
--- /dev/null
@@ -0,0 +1,47 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessUserRoleDetail;
+import org.openecomp.portalapp.portal.transport.ExternalRoleDescription;
+
+public class ExternalAccessUserRoleDetailTest {
+
+       public ExternalAccessUserRoleDetail mockExternalAccessUserRoleDetail(){
+               
+               ExternalRoleDescription externalRoleDescription = new ExternalRoleDescription();
+               externalRoleDescription.setId("test");
+               externalRoleDescription.setName("test");
+               externalRoleDescription.setActive("test");
+               externalRoleDescription.setPriority("test");
+               externalRoleDescription.setAppId("test");
+               externalRoleDescription.setAppRoleId("test");
+                           
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail = new ExternalAccessUserRoleDetail("test", externalRoleDescription);
+               
+               externalAccessUserRoleDetail.setName("test");
+               externalAccessUserRoleDetail.setDescription(externalRoleDescription);
+               return externalAccessUserRoleDetail;
+       }
+       
+       @Test
+       public void externalAccessUserRoleDetailTest(){
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail = mockExternalAccessUserRoleDetail();
+               
+               ExternalRoleDescription externalRoleDescription1 = new ExternalRoleDescription();
+               externalRoleDescription1.setId("test");
+               externalRoleDescription1.setName("test");
+               externalRoleDescription1.setActive("test");
+               externalRoleDescription1.setPriority("test");
+               externalRoleDescription1.setAppId("test");
+               externalRoleDescription1.setAppRoleId("test");
+                           
+               ExternalAccessUserRoleDetail externalAccessUserRoleDetail1 = new ExternalAccessUserRoleDetail("test", externalRoleDescription1);
+               
+               assertEquals(externalAccessUserRoleDetail.getName(), externalAccessUserRoleDetail1.getName());
+               assertEquals(externalAccessUserRoleDetail.getDescription(), externalAccessUserRoleDetail1.getDescription());
+               assertEquals(externalAccessUserRoleDetail.hashCode(), externalAccessUserRoleDetail1.hashCode());
+               assertTrue(externalAccessUserRoleDetail.equals(externalAccessUserRoleDetail1));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalAccessUserTest.java
new file mode 100644 (file)
index 0000000..d2be97b
--- /dev/null
@@ -0,0 +1,24 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalAccessUser;
+
+public class ExternalAccessUserTest {
+
+       public ExternalAccessUser mockExternalAccessUser(){
+               ExternalAccessUser externalAccessUser = new ExternalAccessUser("test", "test");
+               
+               return externalAccessUser;
+       }
+       
+       @Test
+       public void externalAccessUserTest(){
+               ExternalAccessUser externalAccessUser = mockExternalAccessUser();
+               
+               assertEquals(externalAccessUser.getRole(), "test");
+               assertEquals(externalAccessUser.getUser(), "test");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/ExternalRoleDescriptionTest.java
new file mode 100644 (file)
index 0000000..5b6fe82
--- /dev/null
@@ -0,0 +1,35 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.ExternalRoleDescription;
+
+public class ExternalRoleDescriptionTest {
+
+       public ExternalRoleDescription mockExternalRoleDescription(){
+               
+               ExternalRoleDescription externalRoleDescription = new ExternalRoleDescription();
+                           
+           externalRoleDescription.setId("test");
+           externalRoleDescription.setName("test");
+           externalRoleDescription.setActive("test");
+           externalRoleDescription.setPriority("test");
+           externalRoleDescription.setAppId("test");
+           externalRoleDescription.setAppRoleId("test");
+           
+               return externalRoleDescription;
+       }
+       
+       @Test
+       public void externalRoleDescriptionTest(){
+               ExternalRoleDescription externalRoleDescription = mockExternalRoleDescription();
+               
+               assertEquals(externalRoleDescription.getId(), "test");
+               assertEquals(externalRoleDescription.getName(), "test");
+               assertEquals(externalRoleDescription.getActive(), "test");
+               assertEquals(externalRoleDescription.getPriority(), "test");
+               assertEquals(externalRoleDescription.getAppId(), "test");
+               assertEquals(externalRoleDescription.getAppRoleId(), "test");
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuItemTest.java
new file mode 100644 (file)
index 0000000..7d4b96e
--- /dev/null
@@ -0,0 +1,42 @@
+package org.openecomp.portalapp.portal.transport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+
+public class FunctionalMenuItemTest {
+       
+       public FunctionalMenuItem mockFunctionalMenuItem(){
+               FunctionalMenuItem functionalMenuItem = new FunctionalMenuItem();
+               
+               List<Integer> roles = new ArrayList<Integer>();
+               
+               functionalMenuItem.setRestrictedApp(false);
+               functionalMenuItem.setUrl("test");
+               functionalMenuItem.setRoles(roles);
+               
+               return functionalMenuItem;
+       }
+       
+       @Test
+       public void functionalMenuItemTest(){
+               FunctionalMenuItem functionalMenuItem = mockFunctionalMenuItem();
+               
+               FunctionalMenuItem functionalMenuItem1 = mockFunctionalMenuItem();
+               
+               List<Integer> roles = new ArrayList<Integer>();
+               
+               functionalMenuItem1.setRestrictedApp(false);
+               functionalMenuItem1.setUrl("test");
+               functionalMenuItem1.setRoles(roles);
+               
+               assertEquals(functionalMenuItem.getRoles(), functionalMenuItem1.getRoles());
+               assertEquals(functionalMenuItem.toString(), "FunctionalMenuItem [menuId=null, column=null, text=null, parentMenuId=null, url=test, active_yn=null, appid=null, roles=[], restrictedApp=false]");
+               // assertTrue(functionalMenuItem.normalize(), functionalMenuItem1.normalize());
+       }
+
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/FunctionalMenuRoleTest.java
new file mode 100644 (file)
index 0000000..09f4bc6
--- /dev/null
@@ -0,0 +1,40 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuRole;
+
+public class FunctionalMenuRoleTest {
+
+       public FunctionalMenuRole mockFunctionalMenuRole(){
+               FunctionalMenuRole functionalMenuRole = new FunctionalMenuRole();
+               
+               functionalMenuRole.setId(1);
+               functionalMenuRole.setMenuId((long)1);
+               functionalMenuRole.setAppId(1);
+               functionalMenuRole.setRoleId(1);
+               
+               return functionalMenuRole;
+       }
+       
+       @Test
+       public void functionalMenuRoleTest(){
+               FunctionalMenuRole functionalMenuRole = mockFunctionalMenuRole();
+               
+               FunctionalMenuRole functionalMenuRole1 = new FunctionalMenuRole();
+               functionalMenuRole1.setId(1);
+               functionalMenuRole1.setMenuId((long)1);
+               functionalMenuRole1.setAppId(1);
+               functionalMenuRole1.setRoleId(1);
+                                
+               assertEquals(functionalMenuRole.getId().toString(), "1");
+               assertEquals(functionalMenuRole.getMenuId(), new Long(1));
+               assertEquals(functionalMenuRole.getAppId().toString(), "1");
+               assertEquals(functionalMenuRole.getRoleId().toString(), "1");
+               assertEquals(functionalMenuRole.toString(), "FunctionalMenuRole [id=1, menuId=1, appId=1, roleId=1]");
+               assertTrue(functionalMenuRole.equals(functionalMenuRole1));
+               assertEquals(functionalMenuRole.hashCode(), functionalMenuRole1.hashCode());
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RemoteUserWithRolesTest.java
new file mode 100644 (file)
index 0000000..ef926f6
--- /dev/null
@@ -0,0 +1,65 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RemoteRole;
+import org.openecomp.portalapp.portal.transport.RemoteUserWithRoles;
+
+public class RemoteUserWithRolesTest {
+
+       public RemoteUserWithRoles mockRemoteUserWithRoles(){
+               RemoteUserWithRoles remoteUserWithRoles = new RemoteUserWithRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               remoteUserWithRoles.setOrgId((long)1);
+               remoteUserWithRoles.setManagerId((long)1);
+               remoteUserWithRoles.setFirstName("test");
+               remoteUserWithRoles.setMiddleInitial("test");
+               remoteUserWithRoles.setLastName("test");
+               remoteUserWithRoles.setPhone("test");
+               remoteUserWithRoles.setEmail("test");
+               remoteUserWithRoles.setHrid("test");
+               remoteUserWithRoles.setOrgUserId("test");
+               remoteUserWithRoles.setOrgCode("test");
+               remoteUserWithRoles.setOrgManagerUserId("test");
+               remoteUserWithRoles.setJobTitle("test");
+               remoteUserWithRoles.setLoginId("test");
+               remoteUserWithRoles.setActive(false);
+               remoteUserWithRoles.setRoles(roles);
+               
+               return remoteUserWithRoles;
+       }
+       
+       @Test
+       public void remoteUserWithRolesTest(){
+               RemoteUserWithRoles remoteUserWithRoles = mockRemoteUserWithRoles();
+               
+               assertEquals(remoteUserWithRoles.getOrgId(), new Long(1));
+               assertEquals(remoteUserWithRoles.getManagerId(), new Long(1));
+               assertEquals(remoteUserWithRoles.getFirstName(), "test");
+               assertEquals(remoteUserWithRoles.getMiddleInitial(), "test");
+               assertEquals(remoteUserWithRoles.getLastName(), "test");
+               assertEquals(remoteUserWithRoles.getPhone(), "test");
+               assertEquals(remoteUserWithRoles.getEmail(), "test");
+               assertEquals(remoteUserWithRoles.getHrid(), "test");
+               assertEquals(remoteUserWithRoles.getOrgUserId(), "test");
+               assertEquals(remoteUserWithRoles.getOrgCode(), "test");
+               assertEquals(remoteUserWithRoles.getOrgManagerUserId(), "test");
+               assertEquals(remoteUserWithRoles.getJobTitle(), "test");
+               assertEquals(remoteUserWithRoles.getLoginId(), "test");
+               assertEquals(remoteUserWithRoles.getActive(), false);
+               assertEquals(remoteUserWithRoles.getRoles().size(), 1);
+               assertEquals(remoteUserWithRoles.toString(), "RemoteUserWithRoles [orgId=1, managerId=1, firstName=test, middleInitial=test, lastName=test, phone=test, "
+                               + "email=test, hrid=test, orgUserId=test, orgCode=test, orgManagerUserId=test, jobTitle=test, loginId=test, active=false, roles=[RemoteRole [id=1, name=test]]]");
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/RoleInAppForUserTest.java
new file mode 100644 (file)
index 0000000..66624c2
--- /dev/null
@@ -0,0 +1,37 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RoleInAppForUser;
+
+public class RoleInAppForUserTest {
+
+       public RoleInAppForUser mockRoleInAppForUser(){
+               RoleInAppForUser roleInAppForUser = new RoleInAppForUser((long)1 , "test");
+               roleInAppForUser.setRoleId((long)1);
+               roleInAppForUser.setRoleName("test");
+               roleInAppForUser.setIsApplied(false);
+               
+               return roleInAppForUser;
+       }
+       
+       @Test
+       public void roleInAppForUserTest(){
+               RoleInAppForUser roleInAppForUser = mockRoleInAppForUser();
+               
+               RoleInAppForUser roleInAppForUser1 = new RoleInAppForUser((long)1 , "test");
+               roleInAppForUser1.setRoleId((long)1);
+               roleInAppForUser1.setRoleName("test");
+               roleInAppForUser1.setIsApplied(false);
+               
+               assertEquals(roleInAppForUser.getRoleId(), new Long(1));
+               assertEquals(roleInAppForUser.getRoleName(), "test");
+               assertEquals(roleInAppForUser.getIsApplied(), false);
+               
+               assertEquals(roleInAppForUser.toString(), "RoleInAppForUser [roleId=1, roleName=test, isApplied=false]");
+               assertTrue(roleInAppForUser.equals(roleInAppForUser1));
+               assertEquals(roleInAppForUser.hashCode(), roleInAppForUser1.hashCode());
+               //constructor
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserApplicationRolesTest.java
new file mode 100644 (file)
index 0000000..632eeb4
--- /dev/null
@@ -0,0 +1,58 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.RemoteRole;
+import org.openecomp.portalapp.portal.transport.UserApplicationRoles;
+
+public class UserApplicationRolesTest {
+
+       public UserApplicationRoles mockUserApplicationRoles(){
+               UserApplicationRoles userApplicationRoles = new UserApplicationRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               userApplicationRoles.setAppId((long)1);
+               userApplicationRoles.setOrgUserId("test");
+               userApplicationRoles.setFirstName("test");
+               userApplicationRoles.setLastName("test");
+               userApplicationRoles.setRoles(roles);
+               
+               return userApplicationRoles;
+       }
+       
+       @Test
+       public void userApplicationRolesTest(){
+               UserApplicationRoles userApplicationRoles = mockUserApplicationRoles();
+               
+               UserApplicationRoles userApplicationRoles1 = new UserApplicationRoles();
+               
+               List<RemoteRole> roles = new ArrayList<RemoteRole>();
+               RemoteRole remoteRole = new RemoteRole();
+               remoteRole.setId((long)1);
+               remoteRole.setName("test");
+               roles.add(remoteRole);
+               
+               userApplicationRoles1.setAppId((long)1);
+               userApplicationRoles1.setOrgUserId("test");
+               userApplicationRoles1.setFirstName("test");
+               userApplicationRoles1.setLastName("test");
+               userApplicationRoles1.setRoles(roles);
+               
+               assertEquals(userApplicationRoles.getAppId(), userApplicationRoles1.getAppId());
+               assertEquals(userApplicationRoles.getOrgUserId(), userApplicationRoles1.getOrgUserId());
+               assertEquals(userApplicationRoles.getFirstName(), userApplicationRoles1.getFirstName());
+               assertEquals(userApplicationRoles.getLastName(), userApplicationRoles1.getLastName());
+               assertEquals(userApplicationRoles.getRoles(), userApplicationRoles1.getRoles());
+               
+               
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/UserWithNameSurnameTitleTest.java
new file mode 100644 (file)
index 0000000..7267dcd
--- /dev/null
@@ -0,0 +1,19 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.UserWithNameSurnameTitle;
+
+public class UserWithNameSurnameTitleTest {
+
+       @Test
+       public void userWithNameSurnameTitleTest(){
+               
+               UserWithNameSurnameTitle userWithNameSurnameTitle = new UserWithNameSurnameTitle("test", "test", "test", "test");
+               
+               assertEquals(userWithNameSurnameTitle, new UserWithNameSurnameTitle("test", "test", "test", "test"));
+               assertEquals(userWithNameSurnameTitle.hashCode(), new UserWithNameSurnameTitle("test", "test", "test", "test").hashCode());
+               assertTrue(userWithNameSurnameTitle.equals(new UserWithNameSurnameTitle("test", "test", "test", "test")));
+       }
+}
diff --git a/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java b/ecomp-portal-BE-common/src/test/java/org/openecomp/portalapp/portal/transport/WidgetCatalogPersonalizationTest.java
new file mode 100644 (file)
index 0000000..6681d0a
--- /dev/null
@@ -0,0 +1,25 @@
+package org.openecomp.portalapp.portal.transport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openecomp.portalapp.portal.transport.WidgetCatalogPersonalization;
+
+public class WidgetCatalogPersonalizationTest {
+
+       public WidgetCatalogPersonalization mockWidgetCatalogPersonalization(){
+               WidgetCatalogPersonalization widgetCatalogPersonalization = new WidgetCatalogPersonalization();
+               
+               widgetCatalogPersonalization.setWidgetId((long)1);
+               widgetCatalogPersonalization.setSelect(false);
+               return widgetCatalogPersonalization;
+       }
+       
+       @Test
+       public void widgetCatalogPersonalizationTest(){
+               WidgetCatalogPersonalization widgetCatalogPersonalization = mockWidgetCatalogPersonalization();
+               
+               assertEquals(widgetCatalogPersonalization.getWidgetId(), new Long(1));
+               assertEquals(widgetCatalogPersonalization.getSelect(), false);
+       }
+}
index b30d7e7..45b0a79 100644 (file)
@@ -34,6 +34,14 @@ Version 1.1.0 (Amsterdam), November 2017
 - [Portal-61] Fixed the routing problem, loaded data and changed the notification hyperlink 
 - [Portal-77] Changes to remove preview image and update the new image automatically on App onbarding page
 - [Portal-82] Unable to pick Role in Widget onboarding for assigned app
 - [Portal-61] Fixed the routing problem, loaded data and changed the notification hyperlink 
 - [Portal-77] Changes to remove preview image and update the new image automatically on App onbarding page
 - [Portal-82] Unable to pick Role in Widget onboarding for assigned app
+- [Portal-94] Unable to see the updates on Edit Functional Menu
+- [Portal-104] Replaced mysql DB connector with mariaDB
+- [Portal-72] Sonar scan - resolving severity Blocker issues 
+- [Portal-103] Fix to enhanced notification ticket source for ONAP
+- [Portal-50] Fix to get the Sonar coverage for ONAP
+- [Portal-86] Remove internal att.com usages from tests and other files
+- [Portal-102] Fixed the page refresh issue on App Account Management page
+- [Portal-104] replace mysql DB connector with mariaDB connector
 
 Version 1.0.0, February 2017
 - Initial release
 
 Version 1.0.0, February 2017
 - Initial release
index 00e77c2..0a45000 100644 (file)
                <!-- If skipTests is false use this command to generate the report:
                        mvn clean jacoco:prepare-agent install jacoco:report  -->
                <skipTests>false</skipTests>
                <!-- If skipTests is false use this command to generate the report:
                        mvn clean jacoco:prepare-agent install jacoco:report  -->
                <skipTests>false</skipTests>
-               <skipCoverage>true</skipCoverage>               
+               <skipCoverage>false</skipCoverage>              
                <jacoco.data.file>${project.build.directory}/coverage-reports/jacoco-ut.exec</jacoco.data.file>
                <sonar-jacoco-listeners.version>3.8</sonar-jacoco-listeners.version>
                <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
                <jacoco.data.file>${project.build.directory}/coverage-reports/jacoco-ut.exec</jacoco.data.file>
                <sonar-jacoco-listeners.version>3.8</sonar-jacoco-listeners.version>
                <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
-               <sonar.jacoco.reportPath>${project.build.directory}/code-coverage/jacoco.exec</sonar.jacoco.reportPath>
+        <sonar.jacoco.reportPath>${project.build.directory}/code-coverage/jacoco.exec</sonar.jacoco.reportPath>
                <sonar.jacoco.itReportPath>${project.build.directory}/code-coverage/jacoco-it.exec</sonar.jacoco.itReportPath>
                <!-- Note: This list should match jacoco-maven-plugin's exclusion list below -->
                <sonar.exclusions>**.js</sonar.exclusions>
                <sonar.jacoco.itReportPath>${project.build.directory}/code-coverage/jacoco-it.exec</sonar.jacoco.itReportPath>
                <!-- Note: This list should match jacoco-maven-plugin's exclusion list below -->
                <sonar.exclusions>**.js</sonar.exclusions>
                                        <target>1.8</target>
                                </configuration>
                        </plugin>
                                        <target>1.8</target>
                                </configuration>
                        </plugin>
-                       <plugin>
-                               <groupId>org.jacoco</groupId>
-                               <artifactId>jacoco-maven-plugin</artifactId>
-                               <version>0.7.5.201505241946</version>
-                               <executions>
-                                       <!-- Prepares the property pointing to the JaCoCo runtime agent which 
-                                            is passed as VM argument when Maven the Surefire plugin is executed. -->
-                                       <execution>
-                                               <id>pre-unit-test</id>
-                                               <goals>
-                                                       <goal>prepare-agent</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <!-- path to the file which contains the execution data. -->
-                                                       <destFile>${jacoco.data.file}</destFile>
-                                                       <!-- name of the property containing the settings for JaCoCo runtime agent. -->
-                                                       <propertyName>surefireArgLine</propertyName>
-                                                       <skip>${skipCoverage}</skip>
-                                               </configuration>
-                                       </execution>
-                                       <!-- Ensures that the code coverage report for unit tests is created 
-                                               after unit tests have been run. -->
-                                       <execution>
-                                               <id>post-unit-test</id>
-                                               <phase>test</phase>
-                                               <goals>
-                                                       <goal>report</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <!-- path to the file which contains the execution data. -->
-                                                       <dataFile>${jacoco.data.file}</dataFile>
-                                                       <!-- output directory for the code coverage report. -->
-                                                       <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
-                                                       <skip>${skipCoverage}</skip>
-                                               </configuration>
-                                       </execution>
-                                       <!-- Will see build errors while running the test cases because of dual 
-                                               instrumentation -->
-                                       <execution>
-                                               <id>default-instrument</id>
-                                               <goals>
-                                                       <goal>instrument</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <skip>${skipCoverage}</skip>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>default-restore-instrumented-classes</id>
-                                               <goals>
-                                                       <goal>restore-instrumented-classes</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <skip>${skipCoverage}</skip>
-                                               </configuration>
-                                       </execution>
-                               </executions>
+                                               <plugin>
+                           <groupId>org.jacoco</groupId>
+                           <artifactId>jacoco-maven-plugin</artifactId>
+                           <version>0.7.6.201602180812</version>
+                           <executions>
+                               <execution>
+                                   <id>prepare-agent</id>
+                                   <goals>
+                                       <goal>prepare-agent</goal>
+                                   </goals>
+                                   <phase>test</phase>
+                                   <configuration>
+                                       <destFile>${sonar.jacoco.reportPath}</destFile>
+                                       <skip>${skipCoverage}</skip>
+                                   </configuration>
+                               </execution>
+                               <execution>
+                                   <id>report</id>
+                                   <goals>
+                                       <goal>report</goal>
+                                   </goals>
+                                   <phase>test</phase>
+                                   <configuration>
+                                       <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                                       <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                                       <skip>${skipCoverage}</skip>
+                                   </configuration>
+                               </execution>
+                               <!-- Integration Tests (Only report goal) -->
+                               <execution>
+                                   <id>report-integration</id>
+                                   <goals>
+                                       <goal>report-integration</goal>
+                                   </goals>
+                                   <configuration>
+                                       <dataFile>${sonar.jacoco.itReportPath}</dataFile>
+                                       <outputDirectory>${project.basedir}/target/site/it-jacoco</outputDirectory>
+                                       <skip>${skipCoverage}</skip>
+                                   </configuration>
+                               </execution>
+                               <!-- Will see build errors while running the test cases because of dual 
+                                                                       instrumentation -->
+                               <execution>
+                                   <id>default-instrument</id>
+                                   <goals>
+                                       <goal>instrument</goal>
+                                   </goals>
+                                   <configuration>
+                                       <skip>${skipCoverage}</skip>
+                                   </configuration>
+                               </execution>
+                               <execution>
+                                   <id>default-restore-instrumented-classes</id>
+                                   <goals>
+                                       <goal>restore-instrumented-classes</goal>
+                                   </goals>
+                                   <configuration>
+                                       <skip>${skipCoverage}</skip>
+                                   </configuration>
+                               </execution>
+                           </executions>
                        </plugin>
                        
                        <plugin>
                        </plugin>
                        
                        <plugin>
                                                        </resources>
                                                </configuration>
                                        </execution>
                                                        </resources>
                                                </configuration>
                                        </execution>
-                                       <execution>
-                                               <id>copy-src</id>
-                                               <phase>generate-resources</phase>
-                                               <goals>
-                                                       <goal>copy-resources</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <outputDirectory>${basedir}/target/classes</outputDirectory>
-                                                       <overwrite>false</overwrite>
-                                                       <skip>${skipTests}</skip>
-                                                       <resources>
-                                                               <resource>
-                                                                       <directory>${basedir}/../ecomp-portal-BE-common/target/classes</directory>
-                                                               </resource>
-                                                       </resources>
-                                               </configuration>
-                                       </execution>
+<!--                                   <execution> -->
+<!--                                           <id>copy-src</id> -->
+<!--                                           <phase>generate-resources</phase> -->
+<!--                                           <goals> -->
+<!--                                                   <goal>copy-resources</goal> -->
+<!--                                           </goals> -->
+<!--                                           <configuration> -->
+<!--                                                   <outputDirectory>${basedir}/target/classes</outputDirectory> -->
+<!--                                                   <overwrite>false</overwrite> -->
+<!--                                                   <skip>${skipTests}</skip> -->
+<!--                                                   <resources> -->
+<!--                                                           <resource> -->
+<!--                                                                   <directory>${basedir}/../ecomp-portal-BE-common/target/classes</directory> -->
+<!--                                                           </resource> -->
+<!--                                                   </resources> -->
+<!--                                           </configuration> -->
+<!--                                   </execution> -->
                                </executions>
                        </plugin>
                </plugins>
                                </executions>
                        </plugin>
                </plugins>
                        <artifactId>classmate</artifactId>
                        <version>1.3.1</version>
                </dependency>
                        <artifactId>classmate</artifactId>
                        <version>1.3.1</version>
                </dependency>
-
+       
+               <!-- Use Mariadb connector/j for failover -->
                <dependency>
                <dependency>
-                       <groupId>mysql</groupId>
-                       <artifactId>mysql-connector-java</artifactId>
-                       <version>5.1.22</version>
+                       <groupId>org.mariadb.jdbc</groupId>
+                       <artifactId>mariadb-java-client</artifactId>
+                       <version>1.5.8</version>
                </dependency>
                </dependency>
-
+               
                <!-- Elastic Search -->
                <dependency>
                        <groupId>org.elasticsearch</groupId>
                <!-- Elastic Search -->
                <dependency>
                        <groupId>org.elasticsearch</groupId>
                        <scope>test</scope>
                </dependency>
                <dependency>
                        <scope>test</scope>
                </dependency>
                <dependency>
-                       <groupId>org.onap.portal</groupId>
-                       <artifactId>ecomp-portal-BE-common-test</artifactId>
-                       <version>${portal.version}</version>
-                       <scope>test</scope>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-api-mockito</artifactId>
+                       <version>1.6.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-core</artifactId>
+                       <version>1.6.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-module-junit4</artifactId>
+                       <version>1.6.1</version>
                </dependency>
                <dependency>
                        <groupId>org.mockito</groupId>
                </dependency>
                <dependency>
                        <groupId>org.mockito</groupId>
index 5247310..9d8a789 100644 (file)
@@ -48,7 +48,7 @@ public class ONAPWelcomeController extends EPRestrictedBaseController{
                return "/index";
     }
        
                return "/index";
     }
        
-       @RequestMapping(value = {"/applicationsHome", "/dashboard", "/widgetsHome", "/kpidash*", "/admins", "/users", "/portalAdmins", "/applications", "/widgets", "/functionalMenu", "/contactUs", "/getAccess","/appCatalog" }, method = RequestMethod.GET)
+       @RequestMapping(value = {"/applicationsHome", "/dashboard", "/widgetsHome", "/kpidash*", "/admins", "/users", "/portalAdmins", "/applications", "/widgets", "/functionalMenu", "/contactUs", "/getAccess","/appCatalog", "/widgetOnboarding", "/accountOnboarding"}, method = RequestMethod.GET)
     public String getEcompSinglePage(HttpServletRequest request, HttpServletResponse response) {
                return "forward:/index.html";
     }
     public String getEcompSinglePage(HttpServletRequest request, HttpServletResponse response) {
                return "forward:/index.html";
     }
index 35fc00b..2be9524 100644 (file)
@@ -185,6 +185,7 @@ public class SearchServiceImpl implements SearchService {
                        }
                } catch (Exception e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "searchInPhoneBookWithToken Exception = " + EcompPortalUtils.getStackTrace(e));
                        }
                } catch (Exception e) {
                        logger.error(EELFLoggerDelegate.errorLogger, "searchInPhoneBookWithToken Exception = " + EcompPortalUtils.getStackTrace(e));
+                       return null;
                }
                return foundUsers.get(0);
        }
                }
                return foundUsers.get(0);
        }
diff --git a/ecomp-portal-BE-os/src/main/java/org/openecomp/portalapp/portal/service/TicketEventServiceImpl.java b/ecomp-portal-BE-os/src/main/java/org/openecomp/portalapp/portal/service/TicketEventServiceImpl.java
new file mode 100644 (file)
index 0000000..37acfe5
--- /dev/null
@@ -0,0 +1,18 @@
+package org.openecomp.portalapp.portal.service;
+
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+@Service("ticketService")
+public class TicketEventServiceImpl implements TicketEventService{
+
+       @Override
+       public String getNotificationHyperLink(JsonNode application, String ticket, String eventSource) {
+               String hyperlink = SystemProperties.getProperty(EPCommonSystemProperties.EXTERNAL_SYSTEM_NOTIFICATION_URL)+ticket;
+               return hyperlink;
+       }
+
+}
index 8f74a9f..860cc47 100644 (file)
@@ -18,8 +18,8 @@
 # ================================================================================
 ###
 
 # ================================================================================
 ###
 
-db.driver = com.mysql.jdbc.Driver
-db.connectionURL = jdbc:mysql://localhost:3306/ecomp_portal
+db.driver = org.mariadb.jdbc.Driver
+db.connectionURL = jdbc:mariadb:failover://localhost:3306/ecomp_portal
 db.userName = XXXX
 db.password = XXXX
 # is the db.password property encrypted?
 db.userName = XXXX
 db.password = XXXX
 # is the db.password property encrypted?
@@ -118,4 +118,24 @@ window_width_threshold_left_menu = 1400
 window_width_threshold_right_menu = 1350
 
 #External system notification URL
 window_width_threshold_right_menu = 1350
 
 #External system notification URL
-external_system_notification_url= http://todo_external_system_notification_url?
+external_system_notification_url= https://jira.onap.org/browse/
+
+#scheduler properties
+scheduler.server.url=http://mtanjv9sdlg10.aic.cip.onap.com:8989/scheduler
+scheduler.create.new.vnf.change.instance=/v1/ChangeManagement/schedules/
+scheduler.get.time.slots=/v1/ChangeManagement/schedules/
+scheduler.submit.new.vnf.change=/v1/ChangeManagement/schedules/{scheduleId}/approvals
+vid.truststore.filename=C:\\Temp\\vid_keystore.jks
+vid.truststore.passwd.x=OBF:1wgg1wfq1uus1uui1x131x0r1x1v1x1j1uvo1uve1wg81wfi
+
+#scheduler-policy properties
+policy.server.url=https://policypdp-conexus-e2e.ecomp.cci.onap.com:8081/pdp
+policy.get.config=/api/getConfig
+policy.ClientAuth=UHlQRFBTZXJ2ZXI6dGVzdA==
+policy.client.mechId=m06814@controller.dcae.ecomp.onap.com
+policy.client.password=OBF:1ffu1qvu1t2z1l161fuk1i801nz91ro41xf71xfv1rqi1nx51i7y1fuq1kxw1t371qxw1fh0
+policy.username=testpdp
+policy.password=OBF:1igd1kft1l1a1sw61svs1kxs1kcl1idt
+policy.Authorization=dGVzdHBkcDphbHBoYTEyMw==
+policy.environment=TEST
+
diff --git a/ecomp-portal-BE-os/src/main/webapp/WEB-INF/jsp/welcome.jsp b/ecomp-portal-BE-os/src/main/webapp/WEB-INF/jsp/welcome.jsp
deleted file mode 100644 (file)
index 054c38f..0000000
+++ /dev/null
@@ -1,695 +0,0 @@
-<%--
-  ================================================================================
-  eCOMP Portal
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property
-  ================================================================================
-  Licensed 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.
-  ================================================================================
-  --%>
-<%@ taglib prefix="c"      uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib prefix="fmt"    uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib prefix="fn"     uri="http://java.sun.com/jsp/jstl/functions" %>
-
-<link rel="stylesheet" type="text/css" href="static/fusion/sample/css/slider.css">
-<link rel="stylesheet" type="text/css" href="static/fusion/sample/css/scribble.css" />
-<link rel="stylesheet" type="text/css" href="static/fusion/sample/css/spacegallery.css" />
-<link rel="stylesheet" href="static/fusion/css/att_angular_gridster/ui-gridster.css"/>
-<link rel="stylesheet" href="static/fusion/css/att_angular_gridster/sandbox-gridster.css"/>
-
-<script src= "static/ebz/angular_js/angular.js"></script> 
-<script src= "static/ebz/angular_js/angular-sanitize.js"></script>
-
-<script src= "static/ebz/angular_js/app.js"></script>
-<script src= "static/ebz/angular_js/gestures.js"></script>
-
-<script src="static/js/jquery-1.10.2.js"></script>
-<!-- <script src="static/fusion/js/jquery.resize.js"></script> -->
-<script src="static/fusion/js/att_angular_gridster/ui-gridster-tpls.js"></script>
-<script src="static/fusion/js/att_angular_gridster/angular-gridster.js"></script>
-
-<script src= "static/ebz/angular_js/checklist-model.js"></script>
-<script src= "static/js/modalService.js"></script>
-<script src="static/js/jquery.mask.min.js" type="text/javascript"></script>
-<script src="static/js/jquery-ui.js" type="text/javascript"></script>
-<script src="static/ebz/sandbox/att-abs-tpls.js" type="text/javascript"></script>
-<script src="static/ebz/sandbox/att-abs-tpls.min.js" type="text/javascript"></script>
-<style>
-.button--small, [class*=bg-] .button--small {
-    font-size: 14px;
- };
-</style>
-
-<style>
-.gridster-item-container .gridster-item-body{
-bottom:0px;
-}
-.gridster-item-container{
-min-height:50px;
-}
-.att-accordion {
-    border-width: 0px;
-}
-</style>
-
-<style>
-  #myGallery {
-       width: 100%;
-       height: 400px;
-  }
-  
-  #myGallery img {
-       border: 2px solid #52697E;
-  }
-  
-  a.loading {
-       background: #fff url(../images/ajax_small.gif) no-repeat center;
-  }
-  
-  .center {
-    margin-left: auto;
-    margin-right: auto;
-  }
-
-</style>
-
-<script type="text/javascript" src="static/fusion/sample/js/FusionCharts.js"></script> <!--  Charts -->
-<script type="text/javascript" src="static/fusion/sample/js/charts.js"></script> <!--  Charts -->
-
-<script type="text/javascript" src="static/fusion/sample/js/slides.min.jquery.js"></script> <!-- Image Slider -->
-<script type="text/javascript" src="static/fusion/sample/js/scribble.js"></script>          <!-- Scribble -->
-<script type="text/javascript" src="static/fusion/sample/js/eye.js"></script>               <!-- Space Gallery -->
-<script type="text/javascript" src="static/fusion/sample/js/utils.js"></script>             <!-- Space Gallery -->
-<script type="text/javascript" src="static/fusion/sample/js/spacegallery.js"></script>      <!-- Space Gallery -->
-
- <!--  Carousel rendering -->
-  <script>
-  (function($){
-               var initLayout = function() {
-                       $('#myGallery').spacegallery({loadingClass: 'loading'});
-               };
-
-               EYE.register(initLayout, 'init');
-       })(jQuery)
-  </script>
-
-  <!--  Slider rendering -->
-  <script>
-  $(function(){
-         $('#slides').slides({
-                       preload: true,
-                       preloadImage: 'static/fusion/sample/images/loading.gif',
-                       play: 5000,
-                       pause: 10000,
-                       hoverPause: true,
-                       animationStart: function(current){
-                               $('.caption').animate({
-                                       bottom:-35
-                               },100);
-                               if (window.console && console.log) {
-                                       // example return of current slide number
-                                       //console.log('animationStart on slide: ', current);
-                               };
-                       },
-                       animationComplete: function(current){
-                               $('.caption').animate({
-                                       bottom:0
-                               },200);
-                               if (window.console && console.log) {
-                                       // example return of current slide number
-                                       //console.log('animationComplete on slide: ', current);
-                               };
-                       },
-                       slidesLoaded: function() {
-                               $('.caption').animate({
-                                       bottom:0
-                               },200);
-                       }
-               });
-    });
-  
-
-  </script>
-
-<div ng-controller="welcomeController">
-       <fmt:message key="general.home" var="title" /> 
-       <div>
-               <span style="font-weight:bold;font-size:11pt;">Welcome ${sessionScope.user.firstName} ${sessionScope.user.lastName}</span>&nbsp;
-       (Last Login:&nbsp;<fmt:formatDate value="${sessionScope.user.lastLoginDate}" type="date" pattern="dd MMM yyyy hh:mma zzz" var="lastLogin" /> ${lastLogin})
-       </div>
-       
-       <div style="float:left; width:320px; height:320px; margin:10px 27px 10px 27px;color:#222222;text-shadow: 1px 1px 2px #A0A0A0;" >
-           <p style="font-weight:bold;font-size:16pt;color:#0046B8;">Network </p>
-           <p style="font-weight:bold;font-size:16pt;color:#0046B8;">Visualization </p>
-           
-       </div>
-       
-       <!-- Spacer required to center the Image slider (can also be used for content) -->
-         <div style="float:right; width:120px; height:320px; margin:10px 27px 10px 10px;color:#222222;text-shadow: 1px 1px 2px #A0A0A0;">
-           <p style="font-weight:bold;font-size:9pt;">
-             You can toggle between the Image Slider and Carousel controls by clicking on the respective radio button below:
-           </p>
-           <input type="radio" name="viewer" onClick="$('#example').show();$('#myGallery').hide();" value="Slider" />Slider<br/>
-           <input type="radio" name="viewer" onClick="$('#example').hide();$('#myGallery').show();" value="Carousel" />Carousel 
-               
-           <br/>
-         </div>
-       
-         <div id="container">
-
-               <div style="position:relative">
-                       <div id="myGallery" class="spacegallery" style="position:static">
-                     <img src="static/fusion/sample/images/carousel/slide_b_drive_test_map.png" alt="Drive test analytics" />
-                     <img src="static/fusion/sample/images/carousel/slide_b_ios_throughput.png" alt="MTSA - Nationwide DL throughput for iOS devices over cellular network" />
-                     <img src="static/fusion/sample/images/carousel/slide_b_eppt_county.png" alt="Location based services county level drive test" />
-                         <img src="static/fusion/sample/images/carousel/slide_b_lata_map.png" alt="Network demand data by LATA (2020 forecast)" />
-                         <img src="static/fusion/sample/images/carousel/slide_b_eppt_regression.png" alt="Linear regression prediction of LBS/E911 drive test accuracy" />
-                         <img src="static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png" alt="SDN Simulator - SNRC Traffic" />
-                     <span style="float:right; color:#222222;">(Click on Image to Rotate)</span>
-                       </div>
-               </div>
-               <div id="example">
-                 <div id="slides">
-                       <div class="slides_container">
-                         <div class="slide">
-                               <a href="#" title="Drive test analytics"><img src="static/fusion/sample/images/carousel/slide_b_drive_test_map.png" width="570" height="270" alt="Drive test analytics"></a>
-                               <div class="caption">
-                                 <p>Drive test analytics</p>
-                               </div>
-                         </div>
-                         <div class="slide">
-                               <a href="doclib.htm" title="MTSA - Nationwide DL throughput for iOS devices over cellular network"><img src="static/fusion/sample/images/carousel/slide_b_ios_throughput.png" width="570" height="270" alt="MTSA - Nationwide DL throughput for iOS devices over cellular network"></a>
-                               <div class="caption">
-                                 <p>Nationwide DL throughput for iOS devices over cellular network</p>
-                               </div>
-                         </div>
-                         <div class="slide">
-                               <a href="#" title="Network demand data by LATA (2020 forecast)"><img src="static/fusion/sample/images/carousel/slide_b_lata_map.png" width="570" height="270" alt="Network demand data by LATA (2020 forecast)"></a>
-                               <div class="caption">
-                                 <p>Network demand data by LATA (2020 forecast)</p>
-                               </div>
-                         </div>
-                         <div class="slide">
-                               <a href="#" title="Location based services county level drive test"><img src="static/fusion/sample/images/carousel/slide_b_eppt_county.png" width="570" height="270" alt="Location based services county level drive test"></a>
-                               <div class="caption">
-                                 <p>Location based services county level drive test</p>
-                               </div>
-                         </div>
-                         <div class="slide">
-                               <a href="broadcast_list.htm" title="SDN Simulator - SNRC Traffic"><img src="static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png" width="570" height="270" alt="SDN Simulator - SNRC Traffic"></a>
-                               <div class="caption">
-                                 <p>SDN Simulator - SNRC Traffic</p>
-                               </div>
-                         </div>
-                         <div class="slide">
-                               <a href="#" title="Linear regression prediction of LBS/E911 drive test accuracy"><img src="static/fusion/sample/images/carousel/slide_b_eppt_regression.png" width="570" height="270" alt="Linear regression prediction of LBS/E911 drive test accuracy"></a>
-                               <div class="caption" style="bottom:0">
-                                 <p>Linear regression prediction of LBS/E911 drive test accuracy</p>
-                               </div>
-                         </div>
-                       </div>
-                       <a href="#" class="prev"><img src="static/fusion/sample/images/arrow-prev.png" width="24" height="43" alt="Arrow Prev"></a>
-                       <a href="#" class="next"><img src="static/fusion/sample/images/arrow-next.png" width="24" height="43" alt="Arrow Next"></a>
-                 </div>
-                 <img src="static/fusion/sample/images/example-frame.png" width="739" height="341" alt="Example Frame" id="frame">
-               </div>
-         </div>
-               
-       <center>
-        <div class="gridster-container">
-            <div att-gridster att-gridster-options='gridsterOpts'>
-                <div att-gridster-item='item' ng-repeat="item in standardItems">
-                    <div att-gridster-item-header 
-                         header-text={{item.headerText}} 
-                         sub-header-text={{item.subHeaderText}}>
-                            <!--ICON BUTTONS PLACEHOLDER START-->
-                            <div class="tileMinMaxBtn" ng-click="toggleMinMax($index,'')">
-                                                               <span class="tileMinMaxIcon">
-                                                                       <i      class="icon-chevron-up" style="color:gray"  ng-show="item.max"></i>
-                                                                       <i      class="icon-chevron-down" style="color:gray"  ng-hide="item.max"></i>
-                                                               </span>
-                                                       </div>
-                            <!--ICON BUTTONS PLACEHOLDER END-->
-                    </div>
-                               <div att-gridster-item-body >
-                               <!--ACTUAL BODY CONTENT START-->
-                                       <div align="center" style="margin-top:10px;">
-                                               <div align="left" ng-if="item.headerText=='Dashboard' && item.max">
-                                                       <label>&nbsp; Sample Charts</label><BR>
-                                                       <iframe scrolling="no" frameBorder="0" style="width: 430px; height: 360px;" src="static/fusion/sample/html/wordcloud.html"></iframe>
-                                               </div>
-                                               <div ng-if="item.headerText=='Donut Chart' && item.max">
-                                                       <iframe scrolling="no" frameBorder="0"  style="width: 310px; height: 210px;" src="static/fusion/sample/html/donut_d3.html"></iframe>
-                                               </div>
-                                               <div ng-if="item.headerText=='Area Chart' && item.max">
-                                                       <iframe scrolling="no" frameBorder="0"  style="width: 310px; height: 210px;" src="static/fusion/sample/html/area_chart.html"></iframe>
-                                               </div>
-                                               <div ng-if="item.headerText=='Pie Chart' && item.max">
-                                                       <iframe scrolling="no" frameBorder="0"  style="width: 310px; height: 210px;" src="static/fusion/sample/html/pie_chart.html"></iframe>
-                                               </div>
-                                               <div ng-if="item.headerText=='Line Chart' && item.max">
-                                                       <iframe scrolling="no" frameBorder="0"  style="width: 310px; height: 210px;" src="static/fusion/sample/html/line_chart.html"></iframe>
-                                               </div>
-                                               <div ng-if="item.headerText=='Gauges' && item.max">
-                                                       <iframe scrolling="no" frameBorder="0"  style="width: 310pxx; height: 210px;" src="static/fusion/sample/html/d3_gauges_demo.html"></iframe>
-                                               </div>
-                                               
-                                               <div align="left" ng-if="item.headerText=='Traffic distribution by day of week' && item.max">
-                                                       <att-tabs title="gTabs" class="tabs" >
-                                                               <floating-tabs ng-model='activeTabId' size="small"></floating-tabs>
-                                                               </att-Tabs>
-                                                               <div>   
-                                                                       <div id="Monday" align="left"><img src="static/fusion/sample/images/tunnels/1_mon.png" width=100% height=100% alt="Monday"></div>
-                                                                               <div id="Tuesday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/2_tue.png" width=100% height=100% alt="Tuesday"></div>
-                                                                               <div id="Wednesday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/3_wed.png" width=100% height=100% alt="Wednesday"></div>
-                                                                               <div id="Thursday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/4_thu.png" width=100% height=100% alt="Thursday"></div>
-                                                                               <div id="Friday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/5_fri.png" width=100% height=100% alt="Friday"></div>
-                                                                               <div id="Saturday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/6_sat.png" width=100% height=100% alt="Saturday"></div>
-                                                                               <div id="Sunday" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/7_sun.png" width=100% height=100% alt="Sunday"></div>
-                                                               </div>
-                                               </div>
-                                               <div align="left" ng-if="item.headerText=='Busy hour traffic analysis by day of week' && item.max">
-                                                       <att-tabs title="gTabs2">
-                                                               <floating-tabs ng-model='activeTabId2' size="small"></floating-tabs>
-                                                               </att-Tabs>
-                                                               <div>   
-                                                                       <div id="Incoming" align="left"><img src="static/fusion/sample/images/tunnels/BH_DLSTX_IN.png" width=100% height=100% alt="Monday"></div>
-                                                                               <div id="Outgoing" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png" width=100% height=100% alt="Tuesday"></div>
-                                                                               <div id="Default" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/BH_Nat_Def.png" width=100% height=100% alt="Wednesday"></div>
-                                                                               <div id="Priority" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/BH_Nat_Priority.png" width=100% height=100% alt="Thursday"></div>
-                                                                               <div id="BHNational" class="hidden" align="center"><img src="static/fusion/sample/images/tunnels/BH_Nat.png" width=100% height=100% alt="Friday"></div>
-                                                               </div>
-                                               </div>
-
-                                               <div align="left" ng-if="item.headerText=='Additional Samples' && item.max">
-                                                       <label>&nbsp;Quick Links</label>                                                         
-                                                               <table att-table >
-                                                           
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="" target="_blank">Contacts</a></td>
-                                                                                   <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="" target="_blank">Developer Program</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="http://www.zkoss.org" target="_blank">ZK Framework</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="http://jquery.com" target="_blank">JQuery</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="force_cluster.html" target="_blank">RNC Visualization</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                   <td att-table-body width="90%" ><a href="sample_heat_map.htm" target="">Heat Map</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                       <td att-table-body width="90%" ><a href="sample_animated_map.htm" target="">Animated Map</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                       <td att-table-body width="90%" ><a href="jbpm_drools.htm" target="_blank">Process Management</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                                 <tr>
-                                                                                       <td att-table-body width="90%" ><a href="chatRoom.htm">Chat Session</a></td>
-                                                                                       <td att-table-body width="10%">
-                                                                                       <a ng-click="removeRole();" ><img src="static/fusion/sample/images/deleteicon.gif"></a>
-                                                                                    </td>
-                                                                                 </tr>
-                                                                       </table>
-                                               </div>
-                                               <div ng-if="item.headerText=='Sticky Notes' && item.max">
-                                                       <div style="width:100%; height:400px" id="scribble-pad"><pre id="scribble" contenteditable="true" onkeyup="storeUserScribble(this.id);"></pre></div>
-                                               </div>
-                                               <div ng-if="item.headerText=='Service Configuration' && item.max">
-                                                                 <accordion close-others="true" css="att-accordion">
-                                                                                                 <accordion-group heading="Service Configuration" is-open="group11.open"> 
-                                                                                                               <iframe scrolling="no" frameBorder="0" align="center" width="100%" height="400px"  src="static/fusion/sample/org_chart/example.html" ></iframe>         
-                                                                                                 </accordion-group>
-                                                                                                 <accordion-group heading="VSP Service Configuration" is-open="group12.open">                  
-                                                                                                       <iframe scrolling="no" frameBorder="0" align="center" width="100%" height="400px" src="static/fusion/sample/org_chart/example_vsp.html" ></iframe>
-                                                                                                 </accordion-group>
-                                                                                 </accordion>  
-                                               </div>
-                                               
-                                               </div>
-                                                       
-                               <!--ACTUAL BODY CONTENT END-->
-                       </div>
-                   <!--  <div att-gridster-item-footer 
-                         att-gridster-item-footer-link={{item.footerLink}}>
-                        {{item.footerLinkText}}
-                    </div> -->
-                </div>
-            </div>
-        </div>
-    </center>
-    
-</div>
-       
-<script>
-$(document).ready(function(){
-         $( "#rightIcon" ).hide();
-               $( "#leftIcon" ).show();
-});
-var app=angular.module("abs", ["att.abs", "modalServices","att.gridster","checklist-model"]);
-app.controller('welcomeController', function ($scope, modalService, $modal) { 
-
-       $scope.gridsterOpts = {
-                   columns: 3, // the width of the grid, in columns
-                   pushing: true, // whether to push other items out of the way on move or resize
-                   floating: true, // whether to automatically float items up so they stack (you can temporarily disable if you are adding unsorted items with ng-repeat)
-                   width: 'auto', // can be an integer or 'auto'. 'auto' scales gridster to be the full width of its containing element
-                   colWidth: 'auto', // can be an integer or 'auto'.  'auto' uses the pixel width of the element divided by 'columns'
-                   rowHeight: 60, // can be an integer or 'match'.  Match uses the colWidth, giving you square widgets.
-                   margins: [10, 10], // the pixel distance between each widget
-                   outerMargin: true, // whether margins apply to outer edges of the grid
-               swapping: true,
-               draggable: {
-                   enabled: true, // whether dragging items is supported
-                   stop: function(event, uiWidget, $element) {$scope.setCookie();} // optional callback fired when item is finished dragging
-                }
-
-               };
-       
-       /* $scope.gridsterOpts = {
-            columns: 6,
-            width: 'auto',
-            colWidth: '230',
-                       rowHeight: '120',
-                       margins: [10, 10],
-                       outerMargin: true,
-                       pushing: true,
-                       floating: true,
-            swapping: true
-               }; */
-               
-       
-       $scope.toggleMinMax = function(index, tileName){
-               if(tileName==''){
-                       $scope.standardItems[index].max = !$scope.standardItems[index].max;
-                       if($scope.standardItems[index].max)
-                               $scope.standardItems[index].sizeY=$scope.standardItems[index].maxHeight;
-                       else
-                               $scope.standardItems[index].sizeY=0;    
-               }else{
-                       $scope.tileTemp = $scope.$eval(tileName);
-                       var tileMax = $parse(tileName+'.max');
-                       tileMax.assign($scope, !$scope.$eval(tileName).max);
-                       var tileSizeY = $parse(tileName+'.sizeY');
-                       if($scope.tileTemp.max)
-                               tileSizeY.assign($scope, $scope.tileTemp.maxHeight);
-                       else
-                               tileSizeY.assign($scope, 0);
-               }
-       };
-               // These map directly to gridsterItem options
-                   // IMPORTANT: Items should be placed in the grid in the order in which 
-                   // they should appear.
-                   // In most cases the sorting should be by row ASC, col ASC
-                   $scope.standardItems = [{
-                       sizeX: 1,
-                       sizeY: 8,
-               maxHeight: 8,
-                       row: 0,
-                       col: 0,
-                           headerText:'Dashboard',
-                           max:false
-                           
-                           
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 5,
-               maxHeight: 5,
-                       row: 0,
-                       col: 1,
-                           headerText:'Donut Chart',
-                           max:false
-                           
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 5,
-               maxHeight: 5,
-                       row: 0,
-                       col: 2,
-                           headerText:'Area Chart',
-                           max:true
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 5,
-               maxHeight: 5,
-                       row: 8,
-                       col: 0,
-                           headerText:'Pie Chart',
-                           max:false
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 5,
-               maxHeight: 5,
-                       row: 8,
-                       col: 1,
-                           headerText:'Line Chart',
-                           max:true
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 5,
-               maxHeight: 5,
-                       row: 8,
-                       col: 2,
-                           headerText:'Gauges',
-                           max:false
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 8,
-               maxHeight: 8,
-                       row: 16,
-                       col: 0,
-                           headerText:'Traffic distribution by day of week',
-                           max:false
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 8,
-               maxHeight: 8,
-                       row: 16,
-                       col: 1,
-                           headerText:'Busy hour traffic analysis by day of week',
-                           max:false
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 6,
-               maxHeight: 6,
-                       row: 24,
-                       col: 0,
-                           headerText:'Additional Samples',
-                           max:false
-               },
-                   {
-                       sizeX: 1,
-                       sizeY: 8,
-               maxHeight: 8,
-                       row: 24,
-                       col: 1,
-                           headerText:'Sticky Notes',
-                           max:false
-               },
-                   {
-                       sizeX: 3,
-                       sizeY: 10,
-               maxHeight: 10,
-                       row: 32,
-                       col: 0,
-                           headerText:'Service Configuration',
-                           max:false
-               }];
-       
-       $.each($scope.standardItems, function(i, a){ 
-                   $scope.toggleMinMax(i,'');
-       });
-        $scope.activeTabId = 'Monday';
-       //for generic tabs
-    $scope.gTabs = [{
-            title: 'Monday',
-            id: 'Monday',
-            url: '#Monday',
-            selected: true
-        },{
-            title: 'Tuesday',
-            id: 'Tuesday',
-            url: '#Tuesday'
-        },{
-            title: 'Wednesday',
-            id: 'Wednesday',
-            url: '#Wednesday'
-        },{
-            title: 'Thursday',
-            id: 'Thursday',
-            url: '#Thursday'
-        },{
-            title: 'Friday',
-            id: 'Friday',
-            url: '#Friday'
-        },{
-            title: 'Saturday',
-            id: 'Saturday',
-            url: '#Saturday'
-        },{
-            title: 'Sunday',
-            id: 'Sunday',
-            url: '#Sunday'
-        }
-    ];
-
-    $scope.activeTabId2 = 'Incoming';
-       //for generic tabs
-    $scope.gTabs2 = [{
-            title: 'BH SNRC DLSTX - Incoming',
-            id: 'Incoming',
-            url: '#Incoming',
-            selected: true
-        },{
-            title: 'BH SNRC DLSTX - Outgoing',
-            id: 'Outgoing',
-            url: '#Outgoing'
-        },{
-            title: 'BH National - Default',
-            id: 'Default',
-            url: '#Default'
-        },{
-            title: 'BH National - Priority',
-            id: 'Priority',
-            url: '#Priority'
-        },{
-            title: 'BH National',
-            id: 'BHNational',
-            url: '#BHNational'
-        }
-    ];
-       
-    $scope.activeTabId3 = 'Incoming';
-       //for generic tabs
-    $scope.gTabs3 = [{
-            title: 'BH SNRC DLSTX - Incoming',
-            id: 'Incoming',
-            url: '#Incoming',
-            selected: true            
-        },{
-            title: 'BH SNRC DLSTX - Outgoing',
-            id: 'Outgoing',
-            url: '#Outgoing'
-        },{
-            title: 'BH National - Default',
-            id: 'Default',
-            url: '#Default'
-        },{
-            title: 'BH National - Priority',
-            id: 'Priority',
-            url: '#Priority'
-        },{
-            title: 'BH National',
-            id: 'BHNational',
-            url: '#BHNational'
-        }
-    ];
-
-       /* $scope.$watch('activeTabId', function(newVal) {
-               alert(newval);
-               $('#'+newval).show();
-       }, true); */
-       
-       $scope.toggleEastToWest = function() {
-               $( "#toggle" ).toggle( 'slide');        
-               if ($("#leftIcon").is(":visible")) {
-                       $( "#rightIcon" ).show();
-                       $( "#leftIcon" ).hide();
-           } 
-               else if ($("#rightIcon").is(":visible")) {
-               $( "#rightIcon" ).hide();
-                       $( "#leftIcon" ).show();
-           }
-       };
-       
-       $scope.group1 = {
-            open: true
-        };
-       $scope.group2 = {
-            open: true
-        };
-       $scope.group3 = {
-            open: true
-        };
-       $scope.group4 = {
-            open: true
-        };
-       $scope.group5 = {
-            open: true
-        };
-       $scope.group6 = {
-            open: true
-        };     
-       $scope.group7 = {
-            open: true
-        };
-       $scope.group71 = {
-            open: true
-        };
-       $scope.group8 = {
-            open: true
-        };
-       $scope.group9 = {
-            open: true
-        };
-       $scope.group10 = {
-            open: true
-        };
-       $scope.group11 = {
-            open: true
-        };
-       $scope.group12 = {
-            open: false
-        };
-});
-</script>
-
-  <!-- Select the Slider control by default -->
-  <script>$('input[name=viewer]:eq(1)').click();</script>
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/OpenIdConnectLoginStrategyTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/OpenIdConnectLoginStrategyTest.java
new file mode 100644 (file)
index 0000000..4386ccd
--- /dev/null
@@ -0,0 +1,118 @@
+package org.openecomp.portalapp.portal.authentication;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mitre.openid.connect.model.DefaultUserInfo;
+import org.mitre.openid.connect.model.UserInfo;
+import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.authentication.OpenIdConnectLoginStrategy;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.utils.EPSystemProperties;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalapp.util.SessionCookieUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.util.StringUtils;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({StringUtils.class, EPUserUtils.class , SessionCookieUtil.class,SystemProperties.class})
+public class OpenIdConnectLoginStrategyTest {
+       
+       @InjectMocks
+       OpenIdConnectLoginStrategy OpenIdConnectLoginStrategy = new OpenIdConnectLoginStrategy();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+               
+       @Test
+       public void loginTest()
+       {
+               PowerMockito.mockStatic(StringUtils.class);
+               PowerMockito.mockStatic(EPUserUtils.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               
+               UserInfo  userInfo = new DefaultUserInfo();
+               userInfo.setPreferredUsername("Test");
+               userInfo.setEmail("test@gmail.com");
+               userInfo.setName("first_name");
+               userInfo.setFamilyName("last_name");
+               Mockito.when(mockedRequest.getAttribute("userInfo")).thenReturn(userInfo);
+               assertTrue(OpenIdConnectLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void loginIfUserNullTest()
+       {               
+               PowerMockito.mockStatic(SystemProperties.class);
+               UserInfo  userInfo = null;
+               Mockito.when(mockedRequest.getAttribute("userInfo")).thenReturn(userInfo);
+//             Mockito.when(SystemProperties.getProperty("authentication_mechanism")).thenReturn("auth");
+               assertFalse(OpenIdConnectLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void loginIfUserIfAuthIsOIDCTest()
+       {               
+               PowerMockito.mockStatic(SystemProperties.class);
+               UserInfo  userInfo = null;
+               Mockito.when(mockedRequest.getAttribute("userInfo")).thenReturn(userInfo);
+               Mockito.when(SystemProperties.getProperty("authentication_mechanism")).thenReturn("OIDC");
+               Mockito.when(SystemProperties.getProperty(EPSystemProperties.LOGIN_URL_NO_RET_VAL)).thenReturn("login_url");
+               assertFalse(OpenIdConnectLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void loginIfUserIfAuthNotNullTest()
+       {               
+               PowerMockito.mockStatic(SystemProperties.class);
+               UserInfo  userInfo = null;
+               Mockito.when(mockedRequest.getAttribute("userInfo")).thenReturn(userInfo);
+               Mockito.when(SystemProperties.getProperty("authentication_mechanism")).thenReturn("test");
+               Mockito.when(SystemProperties.getProperty(EPSystemProperties.LOGIN_URL_NO_RET_VAL)).thenReturn("login_url");
+               assertFalse(OpenIdConnectLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+       
+       @Test
+       public void loginIfUserExceptionest()
+       {               
+               PowerMockito.mockStatic(SystemProperties.class);
+               UserInfo  userInfo = null;
+               Mockito.when(mockedRequest.getAttribute("userInfo")).thenReturn(userInfo);
+               Mockito.when(SystemProperties.getProperty("authentication_mechanism")).thenThrow(nullPointerException);
+               Mockito.when(SystemProperties.getProperty(EPSystemProperties.LOGIN_URL_NO_RET_VAL)).thenReturn("login_url");
+               assertFalse(OpenIdConnectLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+       @Test(expected =  Exception.class)
+       public void doLoginTest() throws Exception
+       {
+               OpenIdConnectLoginStrategy.doLogin(mockedRequest, mockedResponse);
+       }
+       
+       @Test(expected =  PortalAPIException.class)
+       public void getUserIdTest() throws Exception
+       {
+               OpenIdConnectLoginStrategy.getUserId(mockedRequest);
+       }
+       
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SessionTimeoutInterceptorTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SessionTimeoutInterceptorTest.java
new file mode 100644 (file)
index 0000000..fc827f7
--- /dev/null
@@ -0,0 +1,55 @@
+package org.openecomp.portalapp.portal.authentication;
+
+import static org.junit.Assert.assertFalse;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.authentication.LoginStrategy;
+import org.openecomp.portalapp.authentication.SimpleLoginStrategy;
+import org.openecomp.portalapp.controller.EPFusionBaseController;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.interceptor.SessionTimeoutInterceptor;
+import org.springframework.web.method.HandlerMethod;
+
+public class SessionTimeoutInterceptorTest {
+
+       
+       @Mock
+       LoginStrategy loginStrategy = new SimpleLoginStrategy();
+       
+       @Mock
+       EPFusionBaseController ePFusionBaseController = new EPFusionBaseController() {
+       };
+       
+       @Mock
+       HandlerMethod handlerMethod;
+       
+       @InjectMocks
+       SessionTimeoutInterceptor  sessionTimeoutInterceptor = new  SessionTimeoutInterceptor();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       
+       @Test
+       public void preHandleTest() throws Exception{
+               assertFalse(sessionTimeoutInterceptor.preHandle(mockedRequest, mockedResponse, ePFusionBaseController));
+       }
+       
+       @Test
+       public void preHandleTestIfMethodIsinstanceOfHandlerMethod() throws Exception{
+               assertFalse(sessionTimeoutInterceptor.preHandle(mockedRequest, mockedResponse, handlerMethod));
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SimpleLoginStrategyTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/authentication/SimpleLoginStrategyTest.java
new file mode 100644 (file)
index 0000000..5093fae
--- /dev/null
@@ -0,0 +1,134 @@
+package org.openecomp.portalapp.portal.authentication;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.authentication.SimpleLoginStrategy;
+import org.openecomp.portalapp.command.EPLoginBean;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.service.EPLoginService;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionService;
+import org.openecomp.portalapp.portal.service.EPRoleService;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalapp.util.SessionCookieUtil;
+import org.openecomp.portalsdk.core.menu.MenuProperties;
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.util.StringUtils;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ StringUtils.class, EPUserUtils.class, SessionCookieUtil.class, SystemProperties.class,
+               SessionCookieUtil.class, MenuProperties.class })
+public class SimpleLoginStrategyTest {
+
+       @InjectMocks
+       SimpleLoginStrategy simpleLoginStrategy = new SimpleLoginStrategy();
+
+       @Mock
+       EPLoginService loginService;
+       @Mock
+       EPRoleService roleService;
+       @Mock
+    EPRoleFunctionService ePRoleFunctionService;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Test(expected = Exception.class)
+       public void loginTest() throws Exception {
+               PowerMockito.mockStatic(MenuProperties.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               PowerMockito.mockStatic(StringUtils.class);
+               Mockito.when(SessionCookieUtil.getUserIdFromCookie(mockedRequest, mockedResponse)).thenReturn("guestT");
+               Mockito.when(StringUtils.isEmpty("guestT")).thenReturn(false);
+               EPLoginBean commandBean = new EPLoginBean();
+               EPUser user = new EPUser();
+               commandBean.setUser(user);
+               commandBean.setOrgUserId("guestT");
+               Mockito.when(mockedRequest.getAttribute(MenuProperties.MENU_PROPERTIES_FILENAME_KEY))
+                               .thenReturn("menu_properties_filename");
+               Mockito.when(loginService.findUser(commandBean, "menu_properties_filename", null)).thenReturn(commandBean);
+               assertTrue(simpleLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void loginIfUserEmptyTest() throws Exception {
+               PowerMockito.mockStatic(MenuProperties.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               PowerMockito.mockStatic(StringUtils.class);
+               Mockito.when(SessionCookieUtil.getUserIdFromCookie(mockedRequest, mockedResponse)).thenReturn("guestT");
+               Mockito.when(StringUtils.isEmpty("guestT")).thenReturn(true);
+               EPLoginBean commandBean = new EPLoginBean();
+               EPUser user = new EPUser();
+               commandBean.setUser(user);
+               commandBean.setOrgUserId("guestT");
+               assertFalse(simpleLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void loginIfAuthIsBothTest() throws Exception {
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               PowerMockito.mockStatic(StringUtils.class);
+               Mockito.when(SessionCookieUtil.getUserIdFromCookie(mockedRequest, mockedResponse)).thenReturn("guestT");
+               Mockito.when(StringUtils.isEmpty("guestT")).thenReturn(true);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn("BOTH");
+               assertFalse(simpleLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void loginIfAuthIsNotNullTest() throws Exception {
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               PowerMockito.mockStatic(StringUtils.class);
+               Mockito.when(SessionCookieUtil.getUserIdFromCookie(mockedRequest, mockedResponse)).thenReturn("guestT");
+               Mockito.when(StringUtils.isEmpty("guestT")).thenReturn(true);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn("Test");
+               assertFalse(simpleLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+
+       @Test
+       public void loginExceptionTest() throws Exception {
+               PowerMockito.mockStatic(SystemProperties.class);
+               PowerMockito.mockStatic(SessionCookieUtil.class);
+               PowerMockito.mockStatic(StringUtils.class);
+               Mockito.when(SessionCookieUtil.getUserIdFromCookie(mockedRequest, mockedResponse)).thenReturn("guestT");
+               Mockito.when(StringUtils.isEmpty("guestT")).thenReturn(true);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM))
+                               .thenThrow(nullPointerException);
+               assertFalse(simpleLoginStrategy.login(mockedRequest, mockedResponse));
+       }
+
+       @Test(expected = Exception.class)
+       public void doLoginTest() throws Exception {
+               simpleLoginStrategy.doLogin(mockedRequest, mockedResponse);
+       }
+
+       @Test(expected = PortalAPIException.class)
+       public void getUserIdTest() throws Exception {
+               simpleLoginStrategy.getUserId(mockedRequest);
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestOSTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsControllerExternalRequestOSTest.java
new file mode 100644 (file)
index 0000000..049f723
--- /dev/null
@@ -0,0 +1,119 @@
+/*package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.EPAppService;
+import org.openecomp.portalapp.portal.service.PortalAdminService;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.OnboardingApp;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class AppsControllerExternalRequestOSTest {
+
+       @Mock
+       AdminRolesService adminRolesService;
+
+       @Mock
+       EPAppService appService;
+
+       @Mock
+       PortalAdminService portalAdminService;
+
+
+       @InjectMocks
+       AppsControllerExternalRequest appsControllerExternalRequest = new AppsControllerExternalRequest();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       MockEPUser mockUser = new MockEPUser();
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+       
+       @Test
+       public void postOnboardAppExternalFieldValidatorTestTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("FieldsValidator [httpStatusCode=500, errorCode=null, fields=null]");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = null;
+               expectedOnboardingApp.name = "Test";
+               expectedOnboardingApp.url = "Test";
+               expectedOnboardingApp.restUrl = "Test";
+               expectedOnboardingApp.restrictedApp = false;
+               expectedOnboardingApp.isOpen = false;
+               expectedOnboardingApp.isEnabled = false;
+               List<EPUser> userList = new ArrayList<EPUser>();
+               EPUser user = mockUser.mockEPUser();
+               userList.add(user);
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 500);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.addOnboardingApp(expectedOnboardingApp, user)).thenReturn(expectedFieldValidator);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postOnboardAppExternal(mockedRequest, mockedResponse, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+
+       }
+       
+       @Test
+       public void postOnboardAppExternalIfSuperAdminTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage(null);
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               OnboardingApp expectedOnboardingApp = new OnboardingApp();
+               expectedOnboardingApp.id = null;
+               expectedOnboardingApp.name = "Test";
+               expectedOnboardingApp.url = "Test";
+               expectedOnboardingApp.restUrl = "Test";
+               expectedOnboardingApp.restrictedApp = false;
+               expectedOnboardingApp.isOpen = false;
+               expectedOnboardingApp.isEnabled = false;
+               List<EPUser> userList = new ArrayList<EPUser>();
+               EPUser user = mockUser.mockEPUser();
+               userList.add(user);
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(appService.addOnboardingApp(expectedOnboardingApp, user)).thenReturn(expectedFieldValidator);
+               PortalRestResponse<String> actualPortalRestResponse = appsControllerExternalRequest
+                               .postOnboardAppExternal(mockedRequest, mockedResponse, expectedOnboardingApp);
+               assertEquals(actualPortalRestResponse, expectedportalRestResponse);
+
+       }
+}
+*/
\ No newline at end of file
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsOSControllerTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/AppsOSControllerTest.java
new file mode 100644 (file)
index 0000000..70e7a0c
--- /dev/null
@@ -0,0 +1,150 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.drools.core.command.assertion.AssertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.EPAppService;
+import org.openecomp.portalapp.portal.service.PersUserAppService;
+import org.openecomp.portalapp.portal.service.UserService;
+import org.openecomp.portalapp.portal.framework.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+
+public class AppsOSControllerTest {
+
+       @Mock
+       AdminRolesService adminRolesService;
+
+       @Mock
+       EPAppService appService;
+
+       @Mock
+       PersUserAppService persUserAppService;
+
+       @Mock
+       UserService userService;
+
+       @Mock
+       EPUserUtils ePUserUtils;
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       @InjectMocks
+       AppsOSController appsOSController = new AppsOSController();
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+
+       @Test
+       public void saveNewUserIfUserISNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("failure");
+               expectedportalRestResponse.setResponse("New User cannot be null or empty");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               PortalRestResponse<String> actualPortalRestResponse = appsOSController.saveNewUser(mockedRequest, null);
+               assertEquals(expectedportalRestResponse, actualPortalRestResponse);
+       }
+
+       @Test
+       public void saveNewUserIfUserNOtNullTest() {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("failure");
+               expectedportalRestResponse.setResponse("UnAuthorized");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               EPUser user1 = mockUser.mockEPUser();
+               user1.setLoginId("guest");
+               user.setLoginId("guestT");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user1);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               PortalRestResponse<String> actualPortalRestResponse = appsOSController.saveNewUser(mockedRequest, user);
+               assertEquals(expectedportalRestResponse, actualPortalRestResponse);
+       }
+
+       @Test
+       public void saveNewUserAndLoggedInUserIdSameTest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("Success");
+               expectedportalRestResponse.setResponse("");
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.OK);
+               EPUser user = mockUser.mockEPUser();
+               user.setLoginId("guestT");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(mockedRequest.getParameter("isCheck")).thenReturn("test");
+               Mockito.when(userService.saveNewUser(user, "test")).thenReturn("Success");
+               PortalRestResponse<String> actualPortalRestResponse = appsOSController.saveNewUser(mockedRequest, user);
+               assertEquals(expectedportalRestResponse, actualPortalRestResponse);
+       }
+
+       @Test
+       public void saveNewUserexceptionest() throws Exception {
+               PortalRestResponse<String> expectedportalRestResponse = new PortalRestResponse<String>();
+               expectedportalRestResponse.setMessage("failure");
+               expectedportalRestResponse.setResponse(null);
+               PortalRestStatusEnum portalRestStatusEnum = null;
+               expectedportalRestResponse.setStatus(portalRestStatusEnum.ERROR);
+               EPUser user = mockUser.mockEPUser();
+               user.setLoginId("guestT");
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               Mockito.when(adminRolesService.isAccountAdmin(user)).thenReturn(false);
+               Mockito.when(mockedRequest.getParameter("isCheck")).thenReturn("test");
+               Mockito.when(userService.saveNewUser(user, "test")).thenThrow(nullPointerException);
+               PortalRestResponse<String> actualPortalRestResponse = appsOSController.saveNewUser(mockedRequest, user);
+               assertEquals(expectedportalRestResponse, actualPortalRestResponse);
+       }
+
+       @Test
+       public void getCurrentUserProfileTest() {
+               String loginId = "guestT";
+               EPUser user = mockUser.mockEPUser();
+               List<EPUser> expectedList = new ArrayList<EPUser>();
+               expectedList.add(user);
+               Mockito.when(userService.getUserByUserId(loginId)).thenReturn(expectedList);
+               String expectedString = appsOSController.getCurrentUserProfile(mockedRequest, loginId);
+               assertEquals("{\"firstName\":\"test\",\"lastName\":\"test\"}", expectedString);
+       }
+
+       @Test
+       public void getCurrentUserProfileExceptionTest() {
+               String loginId = "guestT";
+               EPUser user = mockUser.mockEPUser();
+               List<EPUser> expectedList = new ArrayList<EPUser>();
+               expectedList.add(user);
+               Mockito.when(userService.getUserByUserId(loginId)).thenThrow(nullPointerException);
+               String expectedString = appsOSController.getCurrentUserProfile(mockedRequest, loginId);
+               assertEquals("{}", expectedString);
+       }
+
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ECOMPLogoutControllerTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ECOMPLogoutControllerTest.java
new file mode 100644 (file)
index 0000000..729deba
--- /dev/null
@@ -0,0 +1,77 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.ServletRequestWrapper;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.OngoingStubbing;
+import org.openecomp.portalapp.controller.ECOMPLogoutController;
+import org.openecomp.portalapp.portal.service.DashboardSearchService;
+import org.openecomp.portalapp.portal.service.DashboardSearchServiceImpl;
+import org.openecomp.portalapp.portal.framework.MockEPUser;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.core.NamedThreadLocal;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.servlet.ModelAndView;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({EPUserUtils.class, EPCommonSystemProperties.class,RequestContextHolder.class,RequestAttributes.class})
+public class ECOMPLogoutControllerTest {
+
+       @Mock
+       DashboardSearchService searchService = new DashboardSearchServiceImpl();
+       
+       @InjectMocks
+       ECOMPLogoutController ecompLogoutController = new ECOMPLogoutController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Mock
+       RequestContextHolder requestContextHolder;
+       
+       @Mock
+       RequestAttributes requestAttributes;
+       
+       @Test
+       public void logOutTest() throws Exception{
+               ModelAndView actualData = new ModelAndView("redirect:login.htm");
+               ModelAndView expedtedData = null;
+               ThreadLocal<RequestAttributes> requestAttributesHolder =
+                               new NamedThreadLocal<RequestAttributes>("Request attributes");
+               RequestAttributes requestAttributes = new ServletRequestAttributes(mockedRequest);
+               PowerMockito.mockStatic(RequestContextHolder.class);
+               PowerMockito.mockStatic(RequestAttributes.class);
+           Mockito.when((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).thenReturn((ServletRequestAttributes) requestAttributes);
+               expedtedData = ecompLogoutController.logOut(mockedRequest, mockedResponse);
+               assertEquals(actualData.getViewName(),expedtedData.getViewName());
+       }
+       
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/LoginControllerTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/LoginControllerTest.java
new file mode 100644 (file)
index 0000000..968f581
--- /dev/null
@@ -0,0 +1,84 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.LoginController;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.service.EPLoginService;
+import org.openecomp.portalapp.portal.service.EPRoleFunctionService;
+import org.openecomp.portalapp.portal.service.EPRoleService;
+import org.openecomp.portalapp.portal.service.SharedContextService;
+import org.openecomp.portalapp.service.EPProfileService;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.web.servlet.ModelAndView;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(SystemProperties.class)
+public class LoginControllerTest {
+
+       @Mock
+       EPProfileService service;
+       @Mock
+    EPLoginService loginService;
+       @Mock
+        SharedContextService sharedContextService;
+       @Mock
+        EPRoleService roleService;
+       @Mock
+        EPRoleFunctionService ePRoleFunctionService;
+       
+       @InjectMocks
+       LoginController loginController = new LoginController();
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       @Test
+       public void loginIfAuthNullTest()
+       {
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn(null);
+               ModelAndView result = loginController.login(mockedRequest);
+               assertEquals(result.getViewName(),"openIdLogin") ;
+       }
+       
+       @Test
+       public void loginIfAuthOIDCTest()
+       {
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn("OIDC");
+               ModelAndView result = loginController.login(mockedRequest);
+               assertEquals(result.getViewName(),"openIdLogin") ;
+       }
+       
+       @Test
+       public void loginTest()
+       {
+               PowerMockito.mockStatic(SystemProperties.class);
+               Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn("Test");
+               ModelAndView result = loginController.login(mockedRequest);
+               assertEquals(result.getViewName(),"login") ;
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPLoginControllerTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPLoginControllerTest.java
new file mode 100644 (file)
index 0000000..06dfc90
--- /dev/null
@@ -0,0 +1,89 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.ONAPLoginController;
+import org.openecomp.portalapp.portal.framework.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalsdk.core.auth.LoginStrategy;
+import org.openecomp.portalsdk.core.service.LoginService;
+import org.openecomp.portalsdk.core.service.ProfileService;
+import org.openecomp.portalsdk.core.service.ProfileServiceImpl;
+import org.springframework.web.servlet.ModelAndView;
+
+public class ONAPLoginControllerTest { 
+       
+       @Mock
+       ProfileService ProfileService = new ProfileServiceImpl();
+       
+       @Mock
+       LoginService mockLoginService;
+       
+       @Mock
+       LoginStrategy loginStrategy ;
+       
+       @InjectMocks
+       ONAPLoginController oNAPLoginController = new ONAPLoginController();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       MockEPUser mockUser = new MockEPUser();
+       
+       
+       @Test
+       public void doLogin() throws Exception
+       {
+               ModelAndView expectedModelandView = null;
+               ModelAndView actualModelandView = null;
+               Mockito.when(loginStrategy.doLogin(mockedRequest, mockedResponse)).thenReturn(expectedModelandView);
+               actualModelandView= oNAPLoginController.doLogin(mockedRequest, mockedResponse);
+               assertEquals(actualModelandView,expectedModelandView);
+       }
+       
+       
+       @Test
+       public void ViewTest() throws Exception
+       {
+               ModelAndView expectedModelandView = new ModelAndView();
+               expectedModelandView.setViewName("testView");
+               ModelAndView actualModelandView = null;
+               Mockito.when(loginStrategy.doLogin(mockedRequest, mockedResponse)).thenReturn(expectedModelandView);
+               actualModelandView= oNAPLoginController.doLogin(mockedRequest, mockedResponse);
+               assertEquals(actualModelandView.getViewName(),expectedModelandView.getViewName());
+       }
+       @Test
+       public void getJessionIdTest() throws Exception
+       {
+        assertNull(oNAPLoginController.getJessionId(mockedRequest));
+       }
+       
+       @Test
+       public void getLoginServiceTest() throws Exception
+       {
+               LoginService expectedLoginService =     oNAPLoginController.getLoginService();
+               assertEquals(mockLoginService,expectedLoginService);
+       }
+       
+       
+       
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPWelcomeControllerTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/ONAPWelcomeControllerTest.java
new file mode 100644 (file)
index 0000000..c15f366
--- /dev/null
@@ -0,0 +1,47 @@
+package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.controller.ONAPWelcomeController;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+
+public class ONAPWelcomeControllerTest {
+
+       @InjectMocks
+       ONAPWelcomeController oNAPWelcomeController = new ONAPWelcomeController();
+       
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       @Test
+       public void getIndexPageTest()
+       {
+               assertEquals(oNAPWelcomeController.getIndexPage(mockedRequest), "/index");
+       }
+       
+       @Test
+       public void getEcompSinglePageTest()
+       {
+               assertEquals(oNAPWelcomeController.getEcompSinglePage(mockedRequest, mockedResponse), "forward:/index.html");
+       }
+       
+       @Test
+       public void userTest()
+       {
+               assertEquals(oNAPWelcomeController.user(null), "oid-user");
+       }
+   
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerOSTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/controller/PortalAdminControllerOSTest.java
new file mode 100644 (file)
index 0000000..6592597
--- /dev/null
@@ -0,0 +1,142 @@
+/*package org.openecomp.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPRole;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.AdminRolesServiceImpl;
+import org.openecomp.portalapp.portal.service.PortalAdminService;
+import org.openecomp.portalapp.portal.service.PortalAdminServiceImpl;
+import org.openecomp.portalapp.portal.test.core.MockEPUser;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.test.framework.MockitoTestSuite;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.service.AuditService;
+import org.openecomp.portalsdk.core.service.AuditServiceImpl;
+
+public class PortalAdminControllerOSTest {
+
+       @InjectMocks
+       PortalAdminController portalAdminController = new PortalAdminController();
+
+       @Mock
+       AdminRolesService adminRolesService = new AdminRolesServiceImpl();
+       
+       @Mock
+       PortalAdminService portalAdminService = new PortalAdminServiceImpl();
+
+       @Mock
+       AuditService auditService = new AuditServiceImpl();
+
+        
+       @Mock
+       EcompPortalUtils ecompPortalUtils = new EcompPortalUtils();
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+       NullPointerException nullPointerException = new NullPointerException();
+
+       @Mock
+       EPUserUtils ePUserUtils = new EPUserUtils();
+
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Test
+       public void deletePortalAdminIfUserIsSuperAdminTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               String userInfo = "1-test";
+               assertNull(portalAdminController.deletePortalAdmin(mockedRequest, userInfo, mockedResponse));
+
+       }
+       
+       @Test
+       public void deletePortalAdminTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+       
+               FieldsValidator expectedFieldValidator = new FieldsValidator();
+               expectedFieldValidator.setHttpStatusCode((long) 200);
+               expectedFieldValidator.setFields(null);
+               expectedFieldValidator.setErrorCode(null);
+               FieldsValidator actualFieldValidator = new FieldsValidator();
+               String userInfo = "1-test";
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(true);
+               Mockito.when(portalAdminService.deletePortalAdmin((long) 1)).thenReturn(expectedFieldValidator);
+               actualFieldValidator = portalAdminController.deletePortalAdmin(mockedRequest, userInfo, mockedResponse);
+       assertEquals(actualFieldValidator,expectedFieldValidator);
+
+       }
+       
+       @Test
+       public void deletePortalAdminWithNoUserInfoTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Mockito.when(adminRolesService.isSuperAdmin(user)).thenReturn(false);
+               String userInfo = "";
+               assertNull(portalAdminController.deletePortalAdmin(mockedRequest, userInfo, mockedResponse));
+       }
+       
+       @Test
+       public void getRolesByAppExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPRole> expectedRoleList = new ArrayList<EPRole>();        
+               EPRole ePRole = new EPRole();
+               expectedRoleList.add(ePRole);
+               Long appId = (long) 1;
+               Mockito.when(adminRolesService.getRolesByApp(user, appId)).thenThrow(nullPointerException);
+               assertNull(portalAdminController.getRolesByApp(mockedRequest, appId, mockedResponse));
+       }
+       
+       @Test
+       public void getRolesByAppIfUserNullTest()
+       {
+               EPUser user = null;
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               Long appId = (long) 1;
+               assertNull(portalAdminController.getRolesByApp(mockedRequest, appId, mockedResponse));
+       }
+       
+       @Test
+       public void getRolesByAppTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               Mockito.when(EPUserUtils.getUserSession(mockedRequest)).thenReturn(user);
+               List<EPRole> expectedRoleList = new ArrayList<EPRole>();        
+               EPRole ePRole = new EPRole();
+               expectedRoleList.add(ePRole);
+               Long appId = (long) 1;
+               Mockito.when(adminRolesService.getRolesByApp(user, appId)).thenReturn(expectedRoleList);
+               List<EPRole> actualRoleList =   portalAdminController.getRolesByApp(mockedRequest, appId, mockedResponse);
+               assertEquals(actualRoleList,expectedRoleList);
+       }
+}
+*/
\ No newline at end of file
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockEPUser.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockEPUser.java
new file mode 100644 (file)
index 0000000..d132ccf
--- /dev/null
@@ -0,0 +1,84 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.framework;
+
+import java.util.Date;
+
+import org.openecomp.portalapp.portal.domain.EPUser;
+
+public class MockEPUser {
+
+       public EPUser mockEPUser() {
+
+               EPUser ePUser = new EPUser();
+               ePUser.setOrgId(null);
+               ePUser.setManagerId(null);
+               ePUser.setFirstName("test");
+               ePUser.setLastName("test");
+               ePUser.setMiddleInitial(null);
+               ePUser.setPhone(null);
+               ePUser.setFax(null);
+               ePUser.setCellular(null);
+               ePUser.setEmail(null);
+               ePUser.setAddressId(null);
+               ePUser.setAlertMethodCd(null);
+               ePUser.setHrid(null);
+               ePUser.setOrgUserId("guestT");
+               ePUser.setOrgCode(null);
+               ePUser.setAddress1(null);
+               ePUser.setAddress2(null);
+               ePUser.setCity(null);
+               ePUser.setState(null);
+               ePUser.setZipCode(null);
+               ePUser.setCountry(null);
+               ePUser.setOrgManagerUserId(null);
+               ePUser.setLocationClli(null);
+               ePUser.setBusinessCountryCode(null);
+               ePUser.setBusinessCountryName(null);
+               ePUser.setBusinessUnit(null);
+               ePUser.setBusinessUnitName(null);
+               ePUser.setDepartment(null);
+               ePUser.setDepartmentName(null);
+               ePUser.setCompanyCode(null);
+               ePUser.setCompany(null);
+               ePUser.setZipCodeSuffix(null);
+               ePUser.setJobTitle(null);
+               ePUser.setCommandChain(null);
+               ePUser.setSiloStatus(null);
+               ePUser.setCostCenter(null);
+               ePUser.setFinancialLocCode(null);
+
+               ePUser.setLoginId(null);
+               ePUser.setLoginPwd(null);
+               Date date = new Date();
+               ePUser.setLastLoginDate(date);
+               ePUser.setActive(true);
+               ePUser.setInternal(false);
+               ePUser.setSelectedProfileId(null);
+               ePUser.setTimeZoneId(null);
+               ePUser.setOnline(true);
+               ePUser.setChatId(null);
+               ePUser.setUserApps(null);
+               ePUser.setPseudoRoles(null);
+
+               ePUser.setId((long) -1);
+               return ePUser;
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockTestSuite.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockTestSuite.java
deleted file mode 100644 (file)
index 492079f..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.openecomp.portalapp.portal.framework;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.openecomp.portalapp.portal.test.controller.AppCatalogControllerTest;
-import org.openecomp.portalapp.portal.test.controller.AppContactUsControllerTest;
-import org.openecomp.portalapp.portal.test.controller.AppsControllerExternalRequestTest;
-import org.openecomp.portalapp.portal.test.controller.AppsControllerTest;
-import org.openecomp.portalapp.portal.test.controller.BEPropertyReaderControllerTest;
-import org.openecomp.portalapp.portal.test.controller.BasicAuthAccountControllerTest;
-import org.openecomp.portalapp.portal.test.controller.CommonWidgetControllerTest;
-import org.openecomp.portalapp.portal.test.controller.ConsulClientControllerTest;
-import org.openecomp.portalapp.portal.test.controller.DashboardSearchResultControllerTest;
-import org.openecomp.portalapp.portal.test.controller.ExternalAppsRestfulControllerTest;
-import org.openecomp.portalapp.portal.test.controller.FunctionalMenuControllerTest;
-import org.openecomp.portalapp.portal.test.controller.GetAccessControllerTest;
-import org.openecomp.portalapp.portal.test.controller.ManifestControllerTest;
-import org.openecomp.portalapp.portal.test.controller.MicroserviceControllerTest;
-import org.openecomp.portalapp.portal.test.controller.MicroserviceProxyControllerTest;
-import org.openecomp.portalapp.portal.test.controller.PortalAdminControllerTest;
-import org.openecomp.portalapp.portal.test.controller.RolesApprovalSystemControllerTest;
-import org.openecomp.portalapp.portal.test.controller.TicketEventControllerTest;
-import org.openecomp.portalapp.portal.test.controller.UserControllerTest;
-import org.openecomp.portalapp.portal.test.controller.UserNotificationControllerTest;
-import org.openecomp.portalapp.portal.test.controller.UserRolesControllerTest;
-import org.openecomp.portalapp.portal.test.controller.WebAnalyticsExtAppControllerTest;
-import org.openecomp.portalapp.portal.test.controller.WidgetsCatalogMarkupControllerTest;
-
-
-
-/**
- * 
- * 
- * Create the Test class in ecmop-portal-BE-common-test and extend from MockitoTestSuite
- * Add the class in Suite to test it
- *
- */
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-UserRolesControllerTest.class,
-FunctionalMenuControllerTest.class,
-AppCatalogControllerTest.class,
-AppContactUsControllerTest.class,
-UserNotificationControllerTest.class,
-TicketEventControllerTest.class,
-CommonWidgetControllerTest.class,
-ConsulClientControllerTest.class,
-GetAccessControllerTest.class,
-AppsControllerTest.class,
-BasicAuthAccountControllerTest.class,
-DashboardSearchResultControllerTest.class,
-//PortalAdminControllerTest.class,
-ManifestControllerTest.class,
-BEPropertyReaderControllerTest.class,
-WebAnalyticsExtAppControllerTest.class,
-AppsControllerExternalRequestTest.class,
-WidgetsCatalogMarkupControllerTest.class,
-RolesApprovalSystemControllerTest.class,
-MicroserviceProxyControllerTest.class,
-MicroserviceControllerTest.class,
-ExternalAppsRestfulControllerTest.class,
-UserControllerTest.class
-})
-public class MockTestSuite {
-
-}
-
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/framework/MockitoTestSuite.java
new file mode 100644 (file)
index 0000000..3ff837d
--- /dev/null
@@ -0,0 +1,75 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.framework;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MockitoTestSuite {
+
+
+       public MockHttpServletRequestWrapper mockedRequest = new MockHttpServletRequestWrapper(
+                       Mockito.mock(HttpServletRequest.class));
+       public HttpServletResponse mockedResponse = Mockito.mock(HttpServletResponse.class);
+
+       public MockHttpServletRequestWrapper getMockedRequest() {
+               return mockedRequest;
+       }
+
+       public HttpServletResponse getMockedResponse() {
+               return mockedResponse;
+       }
+
+       public class MockHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+               HttpSession session = Mockito.mock(HttpSession.class);
+
+               public MockHttpServletRequestWrapper(HttpServletRequest request) {
+                       super(request);
+
+               }
+
+               @Override
+               public HttpSession getSession() {
+
+                       return session;
+               }
+
+               @Override
+               public HttpSession getSession(boolean create) {
+
+                       return session;
+               }
+
+       }
+       @Test
+       public void test()
+       {
+               assert(true);
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/RemoteWebServiceCallServiceImplTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/RemoteWebServiceCallServiceImplTest.java
new file mode 100644 (file)
index 0000000..d38525b
--- /dev/null
@@ -0,0 +1,148 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPApp;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.service.RemoteWebServiceCallServiceImpl;
+import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ CipherUtil.class , SystemProperties.class})
+public class RemoteWebServiceCallServiceImplTest {
+       
+
+       @InjectMocks
+       RemoteWebServiceCallServiceImpl remoteWebServiceCallServiceImpl = new RemoteWebServiceCallServiceImpl();
+
+       @Mock
+       AppsCacheService appCacheService;
+       
+       @Mock
+       DataAccessService dataAccessService;
+       
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       
+       @Test
+       public void verifyRESTCredentialTest() throws Exception
+       {
+               PowerMockito.mockStatic(CipherUtil.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               String criteria= " where ueb_key = 'requestUebKey'";
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setAppPassword("password");
+               appList.add(app);
+               Mockito.when(dataAccessService.getList(EPApp.class, criteria.toString(), null, null)).thenReturn(appList);
+               String secretKey = null;
+               Mockito.when(SystemProperties.getProperty(SystemProperties.Decryption_Key)).thenReturn(secretKey);
+               Mockito.when(CipherUtil.decrypt("password",
+                               secretKey == null ? null : secretKey)).thenReturn("pwd");
+               assertFalse(remoteWebServiceCallServiceImpl.verifyRESTCredential(secretKey,"requestUebKey","requestAppName","requestPassword"));
+       }
+       
+       @Test
+       public void verifyRESTCredentialExceptionTest() throws Exception
+       {
+               PowerMockito.mockStatic(CipherUtil.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               String criteria= " where ueb_key = 'requestUebKey'";
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setAppPassword("password");
+               app.setUsername("requestAppName");
+               appList.add(app);
+               Mockito.when(dataAccessService.getList(EPApp.class, criteria.toString(), null, null)).thenReturn(appList);
+               String secretKey = null;
+               Mockito.when(SystemProperties.getProperty(SystemProperties.Decryption_Key)).thenReturn(secretKey);
+               Mockito.when(CipherUtil.decrypt("password",
+                               secretKey == null ? null : secretKey)).thenReturn("pwd");
+               assertTrue(remoteWebServiceCallServiceImpl.verifyRESTCredential(secretKey,"requestUebKey","requestAppName","pwd"));
+       }
+       
+       @Test
+       public void verifyRESTCredentialIfAppNullTest() throws Exception
+       {
+               PowerMockito.mockStatic(CipherUtil.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               String criteria= " where ueb_key = 'requestUebKey'";
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setAppPassword("password");
+               app.setUsername("requestAppName");
+               appList.add(app);
+               Mockito.when(dataAccessService.getList(EPApp.class, criteria.toString(), null, null)).thenReturn(null);
+               String secretKey = null;
+               Mockito.when(SystemProperties.getProperty(SystemProperties.Decryption_Key)).thenReturn(secretKey);
+               Mockito.when(CipherUtil.decrypt("password",
+                               secretKey == null ? null : secretKey)).thenReturn("pwd");
+               assertFalse(remoteWebServiceCallServiceImpl.verifyRESTCredential(secretKey,"requestUebKey","requestAppName","pwd"));
+       }
+       
+       @Test
+       public void verifyAppKeyCredentialIfKeyIsNullTest() throws Exception
+       {
+               assertFalse(remoteWebServiceCallServiceImpl.verifyAppKeyCredential(null));
+       }
+       
+       @Test
+       public void verifyAppKeyCredentialTest() throws Exception
+       {
+               PowerMockito.mockStatic(CipherUtil.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               StringBuffer criteria = new  StringBuffer("where ueb_key = 'requestUebKey'");
+//             String criteria= " where ueb_key = 'requestUebKey'";
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setAppPassword("password");
+               app.setUsername("requestAppName");
+               appList.add(app);
+               Mockito.when(dataAccessService.getList(EPApp.class, criteria.toString(), null, null)).thenReturn(null);
+               assertFalse(remoteWebServiceCallServiceImpl.verifyAppKeyCredential("test"));
+       }
+       
+       @Test
+       public void verifyAppKeyCredentialSuccessTest() throws Exception
+       {
+               PowerMockito.mockStatic(CipherUtil.class);
+               PowerMockito.mockStatic(SystemProperties.class);
+               String criteria= " where ueb_key = 'test'";
+               List<EPApp> appList = new ArrayList<>();
+               EPApp app = new EPApp();
+               app.setAppPassword("password");
+               app.setUsername("requestAppName");
+               appList.add(app);
+               Mockito.when(dataAccessService.getList(EPApp.class, criteria.toString(), null, null)).thenReturn(appList);
+               assertTrue(remoteWebServiceCallServiceImpl.verifyAppKeyCredential("test"));
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/SearchServiceImplTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/SearchServiceImplTest.java
new file mode 100644 (file)
index 0000000..fd6578f
--- /dev/null
@@ -0,0 +1,189 @@
+package org.openecomp.portalapp.portal.service;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.framework.MockEPUser;
+import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+import org.openecomp.portalapp.portal.transport.UserWithNameSurnameTitle;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ EcompPortalUtils.class})
+public class SearchServiceImplTest {
+       
+       @InjectMocks
+       SearchServiceImpl searchServiceImpl = new SearchServiceImpl();
+
+       @Mock
+       UserService userService;
+       
+
+       @Before
+       public void setup() {
+               MockitoAnnotations.initMocks(this);
+       }
+
+       MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+       HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+       HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+       NullPointerException nullPointerException = new NullPointerException();
+       MockEPUser mockUser = new MockEPUser();
+       
+       @Test
+       public void searchUsersInPhoneBookTest()
+       {
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+               List<String> list = new ArrayList<>();
+               String str = "Test";
+               list.add(str);
+               Mockito.when(EcompPortalUtils.parsingByRegularExpression("Test", " ")).thenReturn(list);
+               assertEquals(searchServiceImpl.searchUsersInPhoneBook("Test"), "[]");
+       }
+       
+       @Test
+       public void searchUsersInFnTableToFindUserIdTest()
+       {
+       PowerMockito.mockStatic(EcompPortalUtils.class);
+       List<String> list = new ArrayList<>();
+       String str = "Test";
+       String str2 = "Test new";
+       String str1 = "Test new1";
+       list.add(str);
+       list.add(str1);
+       list.add(str2);
+       Mockito.when(EcompPortalUtils.parsingByRegularExpression("Test", " ")).thenReturn(list);
+       List<EPUser> userList = new ArrayList();
+       EPUser user = mockUser.mockEPUser();
+       user.setLastName("Test new");
+       userList.add(user);
+       Mockito.when( this.userService.getUserByFirstLastName("Test","Test new")).thenReturn(userList);
+       String result = searchServiceImpl.searchUsersInPhoneBook("Test");
+       assertEquals("[{\"orgUserId\":\"guestT\",\"firstName\":\"test\",\"lastName\":\"Test new\",\"jobTitle\":null}]" , result);
+       }
+       
+       
+       
+       @Test
+       public void searchUsersInFnTableFirstNameTest()
+       {
+       PowerMockito.mockStatic(EcompPortalUtils.class);
+       List<String> list = new ArrayList<>();
+       String str = "TestTT";
+       String str2 = "Test new1";
+       String str1 = "Test new";
+       String str3 = "Test new2";
+       list.add(str);
+       list.add(str1);
+       list.add(str2);
+       list.add(str3);
+       Mockito.when(EcompPortalUtils.parsingByRegularExpression("TestTT", " ")).thenReturn(list);
+       List<EPUser> userList = new ArrayList();
+       EPUser user = mockUser.mockEPUser();
+       user.setLastName("Test new");
+       user.setFirstName(null);
+       userList.add(user);
+       Mockito.when( this.userService.getUserByFirstLastName("TestTT","Test new")).thenReturn(userList);
+       assertEquals(searchServiceImpl.searchUsersInPhoneBook("TestTT"), "[]"); }
+
+       
+       @Test
+       public void searchUsersInFnTableLastNameTest()
+       {
+               PowerMockito.mockStatic(EcompPortalUtils.class);
+           List<String> list = new ArrayList<>();
+               String str = "Test";
+               String str2 = "Test new";
+               String str1 = "Test new1";
+               list.add(str);
+               list.add(str1);
+               list.add(str2);
+               Mockito.when(EcompPortalUtils.parsingByRegularExpression("Test", " ")).thenReturn(list);
+               List<EPUser> userList = new ArrayList();
+               EPUser user = mockUser.mockEPUser();
+               user.setLastName(null);
+               userList.add(user);
+               Mockito.when( this.userService.getUserByFirstLastName("Test","Test new")).thenReturn(userList);
+               assertEquals(searchServiceImpl.searchUsersInPhoneBook("Test"), "[]");   }
+               
+       
+
+       @Test
+       public void searchUserByUserIdTest()
+       {
+               List<EPUser> userList = new ArrayList();
+               EPUser user = mockUser.mockEPUser();
+               user.setLastName("Test new");
+               userList.add(user);
+               List<EPUser> foundUsers = new ArrayList<EPUser>();
+               Mockito.when(this.userService.getUserByUserId("guestT")).thenReturn(userList);
+               
+               EPUser expectedUser = searchServiceImpl.searchUserByUserId("guestT");
+               assertEquals(user, expectedUser);
+       }
+       
+       @Test
+       public void searchUserByUserIdExceptionTest()
+       {
+               Mockito.when(this.userService.getUserByUserId("guestT")).thenThrow(nullPointerException);
+               assertNull(searchServiceImpl.searchUserByUserId("guestT"));
+               
+       }
+       
+       @Test
+       public void searchUsersByUserIdTest()
+       {
+               
+               List<EPUser> userList = new ArrayList();
+               EPUser user = mockUser.mockEPUser();
+               user.setLastName("Test new");
+               userList.add(user);
+               Mockito.when(this.userService.getUserByUserId("guestT")).thenReturn(userList);
+               List<UserWithNameSurnameTitle> foundUsers = searchServiceImpl.searchUsersByUserId(user);
+               assertEquals(foundUsers.size(), 1);
+               
+       }
+       
+       @Test
+       public void searchUsersByUserIdExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               user.setLastName("Test new");
+               Mockito.when(this.userService.getUserByUserId("guestT")).thenThrow(nullPointerException);
+               List<UserWithNameSurnameTitle> foundUsers =  searchServiceImpl.searchUsersByUserId(user);
+               assertEquals(foundUsers.size(), 0);
+               
+       }
+       
+       @Test
+       public void searchUsersByNameExceptionTest()
+       {
+               EPUser user = mockUser.mockEPUser();
+               user.setLastName("test");
+               user.setFirstName("test");
+
+               Mockito.when(this.userService.getUserByFirstLastName("test","test")).thenThrow(nullPointerException);
+               List<UserWithNameSurnameTitle> foundUsers =     searchServiceImpl.searchUsersByName(user);
+               assertEquals(foundUsers.size(), 0);
+               
+       }
+}
diff --git a/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/UserServiceImplTest.java b/ecomp-portal-BE-os/src/test/java/org/openecomp/portalapp/portal/service/UserServiceImplTest.java
new file mode 100644 (file)
index 0000000..63a710e
--- /dev/null
@@ -0,0 +1,63 @@
+//package org.openecomp.portalapp.portal.service;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//
+//import org.junit.Before;
+//import org.junit.Test;
+//import org.junit.runner.RunWith;
+//import org.mockito.InjectMocks;
+//import org.mockito.Mock;
+//import org.mockito.Mockito;
+//import org.mockito.MockitoAnnotations;
+//import org.openecomp.portalapp.portal.framework.MockitoTestSuite;
+//import org.openecomp.portalapp.portal.utils.EPSystemProperties;
+//import org.openecomp.portalsdk.core.service.DataAccessService;
+//import org.openecomp.portalsdk.core.util.SystemProperties;
+//import org.powermock.api.mockito.PowerMockito;
+//
+//import java.io.BufferedReader;
+//import java.io.IOException;
+//import java.io.InputStreamReader;
+//import java.io.UnsupportedEncodingException;
+//import java.net.HttpURLConnection;
+//import org.powermock.core.classloader.annotations.PrepareForTest;
+//import org.powermock.modules.junit4.PowerMockRunner;
+//
+//
+//@RunWith(PowerMockRunner.class)
+//@PrepareForTest({ SystemProperties.class , EPSystemProperties.class , SystemProperties.class})
+//public class UserServiceImplTest {
+//
+//     
+//     @InjectMocks
+//     UserServiceImpl userServiceImpl = new UserServiceImpl();
+//
+//     @Mock
+//     DataAccessService dataAccessService;
+//     
+//     @Mock
+//     HttpURLConnection con;
+//     
+//     @Before
+//     public void setup() {
+//             MockitoAnnotations.initMocks(this);
+//     }
+//
+//     MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+//
+//     HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+//     HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+//     
+//     @Test
+//     public void getUserByUserIdTest() throws UnsupportedEncodingException, IOException
+//     {
+//              BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+//             PowerMockito.mockStatic(SystemProperties.class);
+//             PowerMockito.mockStatic(EPSystemProperties.class);
+//             Mockito.when(SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM)).thenReturn("OIDC");
+//             Mockito.when(EPSystemProperties.getProperty(EPSystemProperties.AUTH_USER_SERVER)).thenReturn("http://www.google.com");
+//             Mockito.when(new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"))).thenReturn(reader).thenReturn(reader);
+//             userServiceImpl.getUserByUserId("guestT");
+//     }
+//}
index 99cbdfa..1ff699f 100644 (file)
@@ -1284,7 +1284,7 @@ create table  ep_endpoints_basic_auth_account (
 
 CREATE TABLE ep_app_function (
 app_id INT(11) NOT NULL,
 
 CREATE TABLE ep_app_function (
 app_id INT(11) NOT NULL,
-function_cd VARCHAR(50) NOT NULL,
+function_cd VARCHAR(250) NOT NULL,
 function_name VARCHAR(50) NOT NULL,
 PRIMARY KEY (function_cd, app_id),
 INDEX fk_ep_app_function_app_id (app_id),
 function_name VARCHAR(50) NOT NULL,
 PRIMARY KEY (function_cd, app_id),
 INDEX fk_ep_app_function_app_id (app_id),
@@ -1299,7 +1299,7 @@ CREATE TABLE `ep_app_role_function` (
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `app_id` INT(11) NOT NULL,
 `role_id` INT(11) NOT NULL,
 `id` INT(11) NOT NULL AUTO_INCREMENT,
 `app_id` INT(11) NOT NULL,
 `role_id` INT(11) NOT NULL,
-`function_cd` VARCHAR(50) NOT NULL,
+`function_cd` VARCHAR(250) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE INDEX `UNIQUE KEY` (`app_id`, `role_id`, `function_cd`),
 CONSTRAINT `fk_ep_app_role_function_app_id` FOREIGN KEY (`app_id`) REFERENCES `fn_app` (`app_id`),
 PRIMARY KEY (`id`),
 UNIQUE INDEX `UNIQUE KEY` (`app_id`, `role_id`, `function_cd`),
 CONSTRAINT `fk_ep_app_role_function_app_id` FOREIGN KEY (`app_id`) REFERENCES `fn_app` (`app_id`),
index e3c9711..5cdac0b 100644 (file)
@@ -75,7 +75,7 @@
 //    it('should populate retrieved users when search users service returns a list ', ()=> {
 //        //spyOn(usersServiceMock, 'searchUsers');
 //        let usersListRes = [{user: 1}, {user: 2}];
 //    it('should populate retrieved users when search users service returns a list ', ()=> {
 //        //spyOn(usersServiceMock, 'searchUsers');
 //        let usersListRes = [{user: 1}, {user: 2}];
-//        newCtrl.searchUserString = 'some att user name';
+//        newCtrl.searchUserString = 'some org user name';
 //        deferredUsersList.resolve(usersListRes);
 //        newCtrl.searchUsers();
 //        $rootScope.$apply();
 //        deferredUsersList.resolve(usersListRes);
 //        newCtrl.searchUsers();
 //        $rootScope.$apply();
index d7d4607..0eea70c 100644 (file)
@@ -17,9 +17,7 @@
  * limitations under the License.
  * ================================================================================
  */
  * limitations under the License.
  * ================================================================================
  */
-/**
- * Created by wl849v on 12/14/2016.
- */
+
 'use strict';
 (function () {
     class NotificationService {
 'use strict';
 (function () {
     class NotificationService {
index aff4e0c..7767cdb 100644 (file)
 
                        dashboardService.saveCommonWidgetData($scope.newWidgetObject)
                        .then(function(res){
 
                        dashboardService.saveCommonWidgetData($scope.newWidgetObject)
                        .then(function(res){
-                               if (res.status == 'OK') {
-                                       $scope.widgetForm.$setPristine();  
+                               if (res.status == 'OK') {  
                                        confirmBoxService.showInformation('You have added a new item').then(isConfirmed => {
                                        });
                                        dashboardService.getCommonWidgetData(message.type)
                                        confirmBoxService.showInformation('You have added a new item').then(isConfirmed => {
                                        });
                                        dashboardService.getCommonWidgetData(message.type)
index a425297..764399a 100644 (file)
                     functionalMenuService.saveEditedMenuItem(activeMenuItem)
                         .then(() => {
                             $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
                     functionalMenuService.saveEditedMenuItem(activeMenuItem)
                         .then(() => {
                             $log.debug('MenuDetailsModalCtrl::saveChanges:  Menu Item saved');
-                           // $scope.closeThisDialog(true);
-                            $scope.$dismiss('cancel');
-
+                            $scope.$close(true);
                         }).catch(err => {
                         if(err.status === 409){//Conflict
                             handleConflictErrors(err);
                         }).catch(err => {
                         if(err.status === 409){//Conflict
                             handleConflictErrors(err);
index 5a6314f..eb0f14a 100644 (file)
@@ -510,6 +510,13 @@ column-count: 4;
        
 }
 
        
 }
 
+#header-favorites{
+       height:200px;
+       overflow:auto;
+       overflow-x:hidden;
+       -ms-overflow-x:hidden;  
+}
+
 #header-favorites ul li{
        width:100%;
 }
 #header-favorites ul li{
        width:100%;
 }
index c992b9a..dff938a 100644 (file)
                 userProfileService.getUserProfile()
                 .then(profile=> {
                     $log.info('AppDetailsModalCtrl::emptyCookies profile: ', profile);
                 userProfileService.getUserProfile()
                 .then(profile=> {
                     $log.info('AppDetailsModalCtrl::emptyCookies profile: ', profile);
-                    $scope.attuid = profile.attuid;
-                    $log.info('user has the following attuid: ' + profile.attuid);
-                    if ($cookies.getObject($scope.attuid + '_widget') != undefined && $cookies.getObject($scope.attuid + '_widget') != null) {
-                        $cookies.remove($scope.attuid + '_widget');
+                    $scope.orgUserId = profile.orgUserId;
+                    $log.info('user has the following orgUserId: ' + profile.orgUserId);
+                    if ($cookies.getObject($scope.orgUserId + '_widget') != undefined && $cookies.getObject($scope.orgUserId + '_widget') != null) {
+                        $cookies.remove($scope.orgUserId + '_widget');
                     }
                 });
             };
                     }
                 });
             };
index 366fb21..65395f1 100644 (file)
     userNotificationsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'confirmBoxService', 'notificationService', '$modal', 'ngDialog', '$state', '$filter', 'items'];
     angular.module('ecompApp').controller('userNotificationsModalCtrl', userNotificationsModalCtrl);
 
     userNotificationsModalCtrl.$inject = ['$scope', '$log', 'functionalMenuService', 'confirmBoxService', 'notificationService', '$modal', 'ngDialog', '$state', '$filter', 'items'];
     angular.module('ecompApp').controller('userNotificationsModalCtrl', userNotificationsModalCtrl);
 
-    angular.module('ecompApp').directive('attDatepickerCustom', ['$log', function($log) {
-        return {
-            restrict: 'A',
-            require: 'ngModel',
-            scope: {},
-
-            controller: ['$scope', '$element', '$attrs', '$compile', 'datepickerConfig', 'datepickerService', function($scope, $element, $attrs, $compile, datepickerConfig, datepickerService) {
-                var dateFormatString = angular.isDefined($attrs.dateFormat) ? $scope.$parent.$eval($attrs.dateFormat) : datepickerConfig.dateFormat;
-                var selectedDateMessage = '<div class="sr-focus hidden-spoken" tabindex="-1">the date you selected is {{$parent.current | date : \'' + dateFormatString + '\'}}</div>';
-                $element.removeAttr('att-datepicker-custom');
-                $element.removeAttr('ng-model');
-                $element.attr('ng-value', '$parent.current |  date:"EEEE, MMMM d, y"');
-                $element.attr('aria-describedby', 'datepicker');
-
-                $element.attr('maxlength', 10);
-
-                var wrapperElement = angular.element('<div></div>');
-                wrapperElement.attr('datepicker-popup', '');
-                wrapperElement.attr('current', 'current');
-
-                datepickerService.setAttributes($attrs, wrapperElement);
-                datepickerService.bindScope($attrs, $scope);
-
-                wrapperElement.html('');
-                wrapperElement.append($element.prop('outerHTML'));
-                if (navigator.userAgent.match(/MSIE 8/) === null) {
-                    wrapperElement.append(selectedDateMessage);
-                }
-                var elm = wrapperElement.prop('outerHTML');
-                elm = $compile(elm)($scope);
-                $element.replaceWith(elm);
-            }],
-            link: function(scope, elem, attr, ctrl) {
-                if (!ctrl) {
-                    // do nothing if no ng-model
-                    $log.error("ng-model is required.");
-                    return;
-                }
-
-                scope.$watch('current', function(value) {
-                    ctrl.$setViewValue(value);
-                });
-                ctrl.$render = function() {
-                    scope.current = ctrl.$viewValue;
-                };
-
-            }
-        };
-    }]);
-
-
 })();
\ No newline at end of file
 })();
\ No newline at end of file
index 5d1698e..95da781 100644 (file)
@@ -6,7 +6,7 @@
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   ================================================================================
   Licensed 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
+  You may obtain a copy of the License at 
   
        http://www.apache.org/licenses/LICENSE-2.0
   
   
        http://www.apache.org/licenses/LICENSE-2.0
   
                                                        <small class="mandatory-categories">Please enter valid date in MM/DD/YYYY format!</small>
                                                </div>
                                                <div id="user-startdate-required" ng-show="!isStartDateValidFromToday(newNotifModel.startTime)">
                                                        <small class="mandatory-categories">Please enter valid date in MM/DD/YYYY format!</small>
                                                </div>
                                                <div id="user-startdate-required" ng-show="!isStartDateValidFromToday(newNotifModel.startTime)">
-                                                       <small class="date-validation">Date should be greater than or equal to current date!</small>
+                                                       <small class="date-validation">Date should not be greater than 4 months from current date!</small>
                                                </div>
                                        </div>
                                </div>
                                                </div>
                                        </div>
                                </div>
                                                <small class="mandatory-categories">Please enter valid date in MM/DD/YYYY format!</small>
                                        </div>
                                        <div id="user-startdate-required"  ng-show="!isStartDateValidFromToday(newNotifModel.endTime)">
                                                <small class="mandatory-categories">Please enter valid date in MM/DD/YYYY format!</small>
                                        </div>
                                        <div id="user-startdate-required"  ng-show="!isStartDateValidFromToday(newNotifModel.endTime)">
-                                               <small class="endDate-validation">Date should be greater than or equal to current date!</small>
+                                               <small class="endDate-validation">Date should not be greater than 4 months from current date!</small>
                                        </div>
                                        <div id="user-enddate-error" ng-show="newNotifModel.endTime&&newNotifModel.startTime&&newNotifModel.startTime.getTime()>=newNotifModel.endTime.getTime()" class="user-enddate-error-txt">
                                                <small class="mandatory-categories">End Date must be greater than start Date</small>
                                        </div>
                                        <div id="user-enddate-error" ng-show="newNotifModel.endTime&&newNotifModel.startTime&&newNotifModel.startTime.getTime()>=newNotifModel.endTime.getTime()" class="user-enddate-error-txt">
                                                <small class="mandatory-categories">End Date must be greater than start Date</small>
index 5367ecf..10d6c95 100644 (file)
                             app.isDoneUpdating = true;
                             this.numberAppsSucceeded++;
                         }).catch(err => {
                             app.isDoneUpdating = true;
                             this.numberAppsSucceeded++;
                         }).catch(err => {
-                            $log.error(err);
-                            app.isErrorUpdating = true;
+                               $log.error(err);                       
+                            var errorMessage = 'Failed to update the user application roles: ' + err.status;
+                            if(err.status == 504){ 
+                               this.numberAppsSucceeded++;
+                               errorMessage = 'Request is being processed, please check back later!';
+                            } else{
+                               app.isErrorUpdating = true;
+                            }
                             confirmBoxService.showInformation(
                             confirmBoxService.showInformation(
-                                       'Failed to update the user application roles: ' + err.status)
-                                       .then(isConfirmed => {});
+                                       errorMessage)
+                                       .then(isConfirmed => {});                       
                         }).finally(()=>{
                             this.numberAppsProcessed++;
                             if (this.numberAppsProcessed === this.adminApps.length) {
                         }).finally(()=>{
                             this.numberAppsProcessed++;
                             if (this.numberAppsProcessed === this.adminApps.length) {
index 8dc2201..a579362 100644 (file)
             };
            
             this.filterByDropdownValue = item => {             
             };
            
             this.filterByDropdownValue = item => {             
-                if(this.filterByApp.value === '')
+                if(this.filterByApp.value === '' || this.filterByApp.value === 'All Applications')
                     return true;
                 
                for(var i = 0; i < item.appName.length; i++){
                     return true;
                 
                for(var i = 0; i < item.appName.length; i++){
index 4df4e39..2fe1d80 100644 (file)
@@ -17,8 +17,5 @@
  * limitations under the License.
  * ================================================================================
  */
  * limitations under the License.
  * ================================================================================
  */
-/**
- * Created by wl849v on 12/14/2016.
- */
 
 /*As Recommendation code belongs to internal use  Just kept an empty file in order to avoid 404 errors in the browser console */
\ No newline at end of file
 
 /*As Recommendation code belongs to internal use  Just kept an empty file in order to avoid 404 errors in the browser console */
\ No newline at end of file
index 550b9fa..689329f 100644 (file)
                 userProfileService.getUserProfile()
                     .then(profile=> {
                         // $log.info(profile);
                 userProfileService.getUserProfile()
                     .then(profile=> {
                         // $log.info(profile);
-                        $scope.orgUserId = profile.attuid;
-                        $log.debug('AppDetailsModalCtrl:emptyCookies for the following attuid: ' + profile.attuid);
+                        $scope.orgUserId = profile.orgUserId;
+                        $log.debug('AppDetailsModalCtrl:emptyCookies for the following orgUserId: ' + profile.orgUserId);
                         if ($cookies.getObject($scope.orgUserId + '_apps') != undefined && $cookies.getObject($scope.orgUserId + '_apps') != null) {
                             $cookies.remove($scope.orgUserId + '_apps');
                             $log.debug('AppDetailsModalCtrl:emptyCookies removed: ' + $scope.orgUserId + '_apps');
                         if ($cookies.getObject($scope.orgUserId + '_apps') != undefined && $cookies.getObject($scope.orgUserId + '_apps') != null) {
                             $cookies.remove($scope.orgUserId + '_apps');
                             $log.debug('AppDetailsModalCtrl:emptyCookies removed: ' + $scope.orgUserId + '_apps');
index a08d0aa..d3f5a9e 100644 (file)
@@ -35,7 +35,7 @@
                <div id="reg-header-snippet">
 
                        <div tabindex="0" class="reg-profileDetails" id="reg-searchPop-id">
                <div id="reg-header-snippet">
 
                        <div tabindex="0" class="reg-profileDetails" id="reg-searchPop-id">
-                               <div id="contentVertical" att-scrollbar="y"
+                               <div id="contentVertical" 
                                        class="ng-scope vertical" style="position: relative;">
                                        <ul class="searchUl">
                                                <li><a class="icon-tiles"></a> <a id="search-app-title"
                                        class="ng-scope vertical" style="position: relative;">
                                        <ul class="searchUl">
                                                <li><a class="icon-tiles"></a> <a id="search-app-title"
index ae3921a..894d39d 100644 (file)
                                        </filesets>
                                </configuration>
                        </plugin>
                                        </filesets>
                                </configuration>
                        </plugin>
-
+                       <plugin>
+                               <groupId>org.jacoco</groupId>
+                               <artifactId>jacoco-maven-plugin</artifactId>
+                               <version>0.7.6.201602180812</version>
+                               <configuration>
+                                       <skip>true</skip>
+                               </configuration>
+            </plugin>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-resources-plugin</artifactId>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-resources-plugin</artifactId>
index 8ccebee..3298432 100644 (file)
@@ -15,27 +15,7 @@ function EventsCtrl($rootScope, applicationsService , $log,
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
-                       ngDialog.open({
-                                               templateUrl : 'app/views/dashboard/dashboard-widget-manage.html',
-                                               controller : 'CommonWidgetController',
-                                               resolve : {
-                                                       message : function message() {
-                                                               var message = {
-                                                                       type : resourceType,
-                                                                       availableData : $scope.editData
-                                                               };
-                                                               return message;
-                                                       }
-                                               }
-                                       }).closePromise.then(needUpdate => {    
-                                               if(resourceType=='NEWS'){
-                                                       $scope.updateNews();
-                                               }else if(resourceType=='EVENTS'){
-                                                       $scope.updateEvents();
-                                               }else if(resourceType=='IMPORTANTRESOURCES'){
-                                                       $scope.updateImportRes();
-                                               }
-                       });             
+                       
                };
                /*Setting News data*/
                $scope.eventData = [];
                };
                /*Setting News data*/
                $scope.eventData = [];
index 1313333..b5880c0 100644 (file)
@@ -16,27 +16,7 @@ function NewsCtrl($rootScope, applicationsService , $log,
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
-                       ngDialog.open({
-                                               templateUrl : 'app/views/dashboard/dashboard-widget-manage.html',
-                                               controller : 'CommonWidgetController',
-                                               resolve : {
-                                                       message : function message() {
-                                                               var message = {
-                                                                       type : resourceType,
-                                                                       availableData : $scope.editData
-                                                               };
-                                                               return message;
-                                                       }
-                                               }
-                                       }).closePromise.then(needUpdate => {    
-                                               if(resourceType=='NEWS'){
-                                                       $scope.updateNews();
-                                               }else if(resourceType=='EVENTS'){
-                                                       $scope.updateEvents();
-                                               }else if(resourceType=='IMPORTANTRESOURCES'){
-                                                       $scope.updateImportRes();
-                                               }
-                       });             
+                       
                };
                
                /*Setting News data*/
                };
                
                /*Setting News data*/
index 6a6d54b..a5b51bf 100644 (file)
                                 </configuration>
                         </plugin>
 
                                 </configuration>
                         </plugin>
 
+                                               <plugin>
+                                                       <groupId>org.jacoco</groupId>
+                                                       <artifactId>jacoco-maven-plugin</artifactId>
+                                                       <version>0.7.6.201602180812</version>
+                                                       <configuration>
+                                                               <skip>true</skip>
+                                                       </configuration>
+                                                       <inherited>True</inherited>
+                                                       <executions>
+                                                               <!-- Unit-Tests -->
+                                                               <execution>
+                                                                       <id>prepare-agent</id>
+                                                                       <goals>
+                                                                               <goal>prepare-agent</goal>
+                                                                       </goals>
+                                                                       <phase>test</phase>
+                                                                       <configuration>
+                                                                               <destFile>${sonar.jacoco.reportPath}</destFile>
+                                                                       </configuration>
+                                                               </execution>
+                                                               <execution>
+                                                                       <id>report</id>
+                                                                       <goals>
+                                                                               <goal>report</goal>
+                                                                       </goals>
+                                                                       <phase>test</phase>
+                                                                       <configuration>
+                                                                               <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                                                                               <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                                                                       </configuration>
+                                                               </execution>
+                                                       </executions>
+                                               </plugin>
                </plugins>
                </plugins>
-
        </build>
 
 </project>
        </build>
 
 </project>
index 1313333..b5880c0 100644 (file)
@@ -16,27 +16,7 @@ function NewsCtrl($rootScope, applicationsService , $log,
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
 
                        $scope.editData = JSON.stringify(availableData);
                        $scope.availableDataTemp = $scope.availableData;
-                       ngDialog.open({
-                                               templateUrl : 'app/views/dashboard/dashboard-widget-manage.html',
-                                               controller : 'CommonWidgetController',
-                                               resolve : {
-                                                       message : function message() {
-                                                               var message = {
-                                                                       type : resourceType,
-                                                                       availableData : $scope.editData
-                                                               };
-                                                               return message;
-                                                       }
-                                               }
-                                       }).closePromise.then(needUpdate => {    
-                                               if(resourceType=='NEWS'){
-                                                       $scope.updateNews();
-                                               }else if(resourceType=='EVENTS'){
-                                                       $scope.updateEvents();
-                                               }else if(resourceType=='IMPORTANTRESOURCES'){
-                                                       $scope.updateImportRes();
-                                               }
-                       });             
+                       
                };
                
                /*Setting News data*/
                };
                
                /*Setting News data*/
index d2c72fb..52d7382 100644 (file)
                                         <skip>true</skip>
                                 </configuration>
                         </plugin>
                                         <skip>true</skip>
                                 </configuration>
                         </plugin>
+
+                               <plugin>
+                                               <groupId>org.jacoco</groupId>
+                                               <artifactId>jacoco-maven-plugin</artifactId>
+                                               <version>0.7.6.201602180812</version>
+                                               <configuration>
+                                                       <skip>true</skip>
+                                               </configuration>
+                                               <inherited>True</inherited>
+                                               <executions>
+                                                       <!-- Unit-Tests -->
+                                                       <execution>
+                                                               <id>prepare-agent</id>
+                                                               <goals>
+                                                                       <goal>prepare-agent</goal>
+                                                               </goals>
+                                                               <phase>test</phase>
+                                                               <configuration>
+                                                                       <destFile>${sonar.jacoco.reportPath}</destFile>
+                                                               </configuration>
+                                                       </execution>
+                                                       <execution>
+                                                               <id>report</id>
+                                                               <goals>
+                                                                       <goal>report</goal>
+                                                               </goals>
+                                                               <phase>test</phase>
+                                                               <configuration>
+                                                                       <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                                                                       <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
                 </plugins>
         </build>
 
                 </plugins>
         </build>
 
index b421ebd..45da5d5 100644 (file)
                                        <skip>true</skip>
                                </configuration>
                        </plugin>
                                        <skip>true</skip>
                                </configuration>
                        </plugin>
+                       
+                       <plugin>
+                               <groupId>org.jacoco</groupId>
+                               <artifactId>jacoco-maven-plugin</artifactId>
+                               <version>0.7.6.201602180812</version>
+                               <configuration>
+                                       <skip>true</skip>
+                               </configuration>
+                               <inherited>True</inherited>
+                               <executions>
+                                       <!-- Unit-Tests -->
+                                       <execution>
+                                               <id>prepare-agent</id>
+                                               <goals>
+                                                       <goal>prepare-agent</goal>
+                                               </goals>
+                                               <phase>test</phase>
+                                               <configuration>
+                                                       <destFile>${sonar.jacoco.reportPath}</destFile>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>report</id>
+                                               <goals>
+                                                       <goal>report</goal>
+                                               </goals>
+                                               <phase>test</phase>
+                                               <configuration>
+                                                       <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                                                       <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
 
                </plugins>
 
 
                </plugins>
 
index 45350d9..42e8c13 100644 (file)
@@ -1,21 +1,24 @@
-var ARUGMENT1 = (function(window, undefined) {                                                                                      
+var ARGUMENT1 = (function(window, undefined) {                                                                                      
                                                                                                                                     
                                                                                                                                     
-       var ARUGMENT1 = ARUGMENT1 || {};                                                                                                
+       var ARGUMENT1 = ARGUMENT1 || {};                                                                                                
        function extractHostPortApp(src) {                                                                                                  
        function extractHostPortApp(src) {                                                                                                  
-               ARUGMENT1.microserviceId = MICROSERVICE_ID;                                                                                 
-               ARUGMENT1.pathArray = src.split( '/' );                                                                                     
-               ARUGMENT1.widgetName = ARUGMENT1.pathArray[ARUGMENT1.pathArray.length - 2];                                                 
-               ARUGMENT1.serviceSeperator = ARUGMENT1.pathArray[ARUGMENT1.pathArray.length - 4];                                           
-               ARUGMENT1.commonUrl = src.substring(0, src.lastIndexOf("/" + ARUGMENT1.widgetName));                                      
-               ARUGMENT1.recipientDivDataAttrib = 'data-' + ARUGMENT1.widgetName;                                                          
-               ARUGMENT1.controllerName = 'ARUGMENT2';                                                                                     
-               ARUGMENT1.readyCssFlag = 'ARUGMENT3';                                                                                       
-               ARUGMENT1.readyCssFlagExpectedValue = '#bada55';                                                                            
-               ARUGMENT1.serviceURL = src.substring(0, src.lastIndexOf("/" + ARUGMENT1.serviceSeperator)) + '/portalApi/microservice/proxy/parameter/' + WIDGET_ID;  
-       }                                                                                                                              
-                                                                                                                                      
-       extractHostPortApp(document.currentScript.src);                                                                                
-                                                                                                                                      
+               
+               ARGUMENT1.microserviceId = MICROSERVICE_ID;                                                                                 
+               ARGUMENT1.pathArray = src.split( '/' );                                                                                     
+                       
+               ARGUMENT1.widgetName = WIDGET_ID;
+               ARGUMENT1.serviceSeperator = ARGUMENT1.pathArray[ARGUMENT1.pathArray.length - 4];                                           
+               ARGUMENT1.commonUrl = src.substring(0, src.lastIndexOf("/" + ARGUMENT1.pathArray[ARGUMENT1.pathArray.length - 2]));       
+               
+               ARGUMENT1.recipientDivDataAttrib = 'data-' + ARGUMENT1.widgetName;                                                          
+               ARGUMENT1.controllerName = 'ARGUMENT2';                                                                                     
+               ARGUMENT1.readyCssFlag = 'ARGUMENT3';                                                                                       
+               ARGUMENT1.readyCssFlagExpectedValue = '#bada55';                                                                            
+               ARGUMENT1.serviceURL = src.substring(0, src.lastIndexOf("/" + ARGUMENT1.serviceSeperator)) + '/portalApi/microservice/proxy/parameter/' + WIDGET_ID;  
+       }                                  
+       
+       extractHostPortApp(document.getElementsByTagName('script')[0].src);
+       
        function loadStylesheet(url) {                                                                                                 
                var link = document.createElement('link');                                                                                 
                link.rel = 'stylesheet';                                                                                                   
        function loadStylesheet(url) {                                                                                                 
                var link = document.createElement('link');                                                                                 
                link.rel = 'stylesheet';                                                                                                   
@@ -27,7 +30,7 @@ var ARUGMENT1 = (function(window, undefined) {
                                                                                                                                    
        function isCssReady(callback) {                                                                                                
                var testElem = document.createElement('span');                                                                             
                                                                                                                                    
        function isCssReady(callback) {                                                                                                
                var testElem = document.createElement('span');                                                                             
-               testElem.id = ARUGMENT1.readyCssFlag;                                                                                      
+               testElem.id = ARGUMENT1.readyCssFlag;                                                                                      
                testElem.style = 'CSS_ARG1';                                                                       
                var entry = document.getElementsByTagName('script')[0];                                                                    
                entry.parentNode.insertBefore(testElem, entry);                                                                            
                testElem.style = 'CSS_ARG1';                                                                       
                var entry = document.getElementsByTagName('script')[0];                                                                    
                entry.parentNode.insertBefore(testElem, entry);                                                                            
@@ -42,7 +45,7 @@ var ARUGMENT1 = (function(window, undefined) {
                        else if (node.currentStyle) {                                                                                          
                                value = node.currentStyle.color;                                                                                   
                        }                                                                                                                      
                        else if (node.currentStyle) {                                                                                          
                                value = node.currentStyle.color;                                                                                   
                        }                                                                                                                      
-                       if (value && value === 'rgb(186, 218, 85)' || value.toLowerCase() === ARUGMENT1.readyCssFlagExpectedValue) {           
+                       if (value && value === 'rgb(186, 218, 85)' || value.toLowerCase() === ARGUMENT1.readyCssFlagExpectedValue) {           
                                callback();                                                                                                        
                        } else {                                                                                                               
                                setTimeout(poll, 500);                                                                                             
                                callback();                                                                                                        
                        } else {                                                                                                               
                                setTimeout(poll, 500);                                                                                             
@@ -67,9 +70,11 @@ var ARUGMENT1 = (function(window, undefined) {
        function loadScript(url, callback) {                                                                                           
                var script = document.createElement('script');                                                                             
                script.src = url;                                                                                                          
        function loadScript(url, callback) {                                                                                           
                var script = document.createElement('script');                                                                             
                script.src = url;                                                                                                          
+               
                var entry = document.getElementsByTagName('script')[0];                                                                    
                entry.parentNode.insertBefore(script, entry);                                                                              
                var entry = document.getElementsByTagName('script')[0];                                                                    
                entry.parentNode.insertBefore(script, entry);                                                                              
-               script.onload = script.onreadystatechange = function() {                                                                   
+               
+               script.onload = script.onreadystatechange = function() {   
                        var rdyState = script.readyState;                                                                                      
                        if (!rdyState || /complete|loaded/.test(script.readyState)) {                                                          
                                callback();                                                                                                        
                        var rdyState = script.readyState;                                                                                      
                        if (!rdyState || /complete|loaded/.test(script.readyState)) {                                                          
                                callback();                                                                                                        
@@ -111,30 +116,41 @@ var ARUGMENT1 = (function(window, undefined) {
        }                                                                                                                                                                                                                  
                                                                                                                                                                                           
        }                                                                                                   
        }                                                                                                                                                                                                                  
                                                                                                                                                                                           
        }                                                                                                   
-                                                                                                                                      
-       function getMarkupContent(markupLocation, target){                                                                             
+       
+       function getMarkupContent(markupLocation, callback){                                                                             
                                                                                                                                           
                                                                                                                                           
-               jQuery.ajax({                                                                                                              
-               url: markupLocation,                                                                                                   
-               success: function (result) {                                                                                           
-                   if (result.isOk == false){                                                                                         
-                                                                                                                                      
-                   }else{                                                                                                             
-                       target.innerHTML = result;                                                                                     
-                               }                                                                                                                  
-               },                                                                                                                     
-               async: false                                                                                                           
-           });                                                                                                                        
+               try{
+                       jQuery.ajax({                                                                                                              
+                       url: markupLocation,
+                       method: "GET",   
+                       xhrFields: {                                                                                                                                                                                                       
+                                       withCredentials: true                                                                                                                                                                              
+                               },   
+                               crossDomain: true,              
+                       success: function (result) {                                                                                           
+                           if (result.isOk == false){                                                                                         
+                                                                                                                                              
+                           }else{                                                                                                             
+                               callback(result);                                                                                   
+                                       }                                                                                                                  
+                       }                                                                                                        
+                       });       
+               }
+               catch(e){
+                       
+               }
        }                                                                                                                              
                                                                                                                                       
        function renderWidget(data, location, $controllerProvider) {                                                                   
                var div = document.createElement('div');                                                                                   
        }                                                                                                                              
                                                                                                                                       
        function renderWidget(data, location, $controllerProvider) {                                                                   
                var div = document.createElement('div');                                                                                   
-               getMarkupContent(ARUGMENT1.commonUrl + "/markup/" + ARUGMENT1.widgetName, div);                                          
-               location.append(div);                                                                                                      
-                ARUGMENT1.widgetData = data;                                                                                              
-               app.controllerProvider.register(ARUGMENT1.controllerName, ARUGMENT1.controller);                                           
-               var mController = angular.element(document.getElementById("widgets"));                                                   
-               mController.scope().activateThis(location);                                                                                
+               getMarkupContent(ARGUMENT1.commonUrl + "/markup/" + ARGUMENT1.widgetName, function(div){
+                       location.append(div);                                                                                                      
+                       ARGUMENT1.widgetData = data;
+                       app.controllerProvider.register(ARGUMENT1.controllerName, ARGUMENT1.controller);                                           
+                       var mController = angular.element(document.getElementById("widgets"));                                                   
+                       mController.scope().activateThis(location);   
+               });
+               
        }                                                                                                                              
                                                                                                                                       
        function printAllArtifacts(moduleName, controllerName) {                                                                       
        }                                                                                                                              
                                                                                                                                       
        function printAllArtifacts(moduleName, controllerName) {                                                                       
@@ -151,14 +167,14 @@ var ARUGMENT1 = (function(window, undefined) {
        }                                                                                                                              
                                                                                                                                    
        loadSupportingFiles(function() {                                                                                               
        }                                                                                                                              
                                                                                                                                    
        loadSupportingFiles(function() {                                                                                               
-               loadStylesheet(ARUGMENT1.commonUrl + '/' + ARUGMENT1.widgetName + '/style.css');                                           
-               loadScript(ARUGMENT1.commonUrl + '/' + ARUGMENT1.widgetName + '/controller.js',                                            
+               loadStylesheet(ARGUMENT1.commonUrl + '/' + ARGUMENT1.widgetName + '/style.css');                                           
+               loadScript(ARGUMENT1.commonUrl + '/' + ARGUMENT1.widgetName + '/controller.js',                                            
                        function() {                                                                                                           
                        function() {                                                                                                           
-                               $('['+ ARUGMENT1.recipientDivDataAttrib + ']').each(function() {                                                   
+                               $('['+ ARGUMENT1.recipientDivDataAttrib + ']').each(function() {                                                   
                                        var location = jQuery(this);                                                                                   
                                        var location = jQuery(this);                                                                                   
-                                       location.removeAttr(ARUGMENT1.recipientDivDataAttrib);                                                         
-                                       var id = location.attr(ARUGMENT1.recipientDivDataAttrib);                                                      
-                                       getWidgetData(ARUGMENT1.serviceURL, function(data) {                                                           
+                                       location.removeAttr(ARGUMENT1.recipientDivDataAttrib);                                                         
+                                       var id = location.attr(ARGUMENT1.recipientDivDataAttrib);                                                      
+                                       getWidgetData(ARGUMENT1.serviceURL, function(data) { 
                                                isCssReady(function(){                                                                                     
                                                        renderWidget(data, location);                                                                          
                                                });                                                                                                                                        
                                                isCssReady(function(){                                                                                     
                                                        renderWidget(data, location);                                                                          
                                                });                                                                                                                                        
@@ -168,6 +184,6 @@ var ARUGMENT1 = (function(window, undefined) {
                );                                                                                                                         
        });                                                                                                                            
                                                                                                                                       
                );                                                                                                                         
        });                                                                                                                            
                                                                                                                                       
-       return ARUGMENT1;                                                                                                                  
+       return ARGUMENT1;                                                                                                                  
 })(window);                                                                                                                        
                                
\ No newline at end of file
 })(window);                                                                                                                        
                                
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 06af5a4..02fcc8c 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,22 @@
        <artifactId>ecompportal-parent-project</artifactId>
        <version>0</version>
        <packaging>pom</packaging>
        <artifactId>ecompportal-parent-project</artifactId>
        <version>0</version>
        <packaging>pom</packaging>
-        <name>portal</name>
+       <name>portal</name>
+       <properties>
+       <sonar.language>java</sonar.language>
+       <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
+       <sonar.skipDesign>true</sonar.skipDesign>
+       <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
+       <sonar.jacoco.reportPath>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPath>
+       <sonar.jacoco.itReportPath>${project.basedir}/target/it-jacoco.exec</sonar.jacoco.itReportPath>
+       <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
+       <sonar.projectVersion>${project.version}</sonar.projectVersion>
+    <sonar.skipDesign>true</sonar.skipDesign>
+    <sonar.projectBaseDir>${project.basedir}</sonar.projectBaseDir>
+    <sonar.exclusions>**/scripts/**/*,**.js</sonar.exclusions>
+    <sonar.test.exclusions>**/test/**/*,**/tests/**/*</sonar.test.exclusions>
+        <sonar.java.binaries>.</sonar.java.binaries>   
+       </properties>
        
        <modules>
                <!-- Child modules do NOT name this parent. -->
        
        <modules>
                <!-- Child modules do NOT name this parent. -->
                <!-- This POM names only ONAP projects -->      
                <module>ecomp-portal-BE-common</module>
                <module>ecomp-portal-BE-os</module>     
                <!-- This POM names only ONAP projects -->      
                <module>ecomp-portal-BE-common</module>
                <module>ecomp-portal-BE-os</module>     
-               <module>ecomp-portal-BE-common-test</module>
+<!--           <module>ecomp-portal-BE-common-test</module> -->
                <module>ecomp-portal-FE-os</module>
                <module>ecomp-portal-widget-ms</module>
        </modules>
 
        <build>
                <module>ecomp-portal-FE-os</module>
                <module>ecomp-portal-widget-ms</module>
        </modules>
 
        <build>
+               <pluginManagement>
+                   <plugins>
+                       <plugin>
+                           <artifactId>maven-compiler-plugin</artifactId>
+                           <version>3.1</version>
+                           <configuration>
+                               <source>1.8</source>
+                               <target>1.8</target>
+                           </configuration>
+                       </plugin>
+                       <plugin>
+                           <groupId>org.sonarsource.scanner.maven</groupId>
+                           <artifactId>sonar-maven-plugin</artifactId>
+                           <version>3.0.2</version>
+                       </plugin>
+                   </plugins>
+               </pluginManagement>
                <plugins>
                <plugins>
-                       <!-- No deployment step for this project -->
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-deploy-plugin</artifactId>
-                               <version>2.8</version>
-                               <configuration>
-                                       <skip>true</skip>
-                               </configuration>
-                       </plugin>
-               </plugins>
-       </build>
-</project>
+       <!-- No deployment step for this project -->
+               <plugin>
+                       <groupId>org.apache.maven.plugins</groupId>
+                       <artifactId>maven-deploy-plugin</artifactId>
+                       <version>2.8</version>
+                       <configuration>
+                               <skip>true</skip>
+                       </configuration>
+               </plugin>
+               <plugin>
+           <groupId>org.jacoco</groupId>
+           <artifactId>jacoco-maven-plugin</artifactId>
+           <version>0.7.6.201602180812</version>
+           <inherited>True</inherited>
+           <executions>
+               <!-- Unit-Tests -->
+               <execution>
+                   <id>prepare-agent</id>
+                   <goals>
+                       <goal>prepare-agent</goal>
+                   </goals>
+                   <configuration>
+                       <destFile>${sonar.jacoco.reportPath}</destFile>
+                   </configuration>
+               </execution>
+               <execution>
+                   <id>report</id>
+                   <goals>
+                       <goal>report</goal>
+                   </goals>
+                   <configuration>
+                       <dataFile>${sonar.jacoco.reportPath}</dataFile>
+                       <outputDirectory>${project.basedir}/target/site/jacoco</outputDirectory>
+                   </configuration>
+               </execution>
+               <!-- Integration Tests (Only report goal) -->
+               <execution>
+                   <id>report-integration</id>
+                   <goals>
+                       <goal>report-integration</goal>
+                   </goals>
+                   <configuration>
+                       <dataFile>${sonar.jacoco.itReportPath}</dataFile>
+                       <outputDirectory>${project.basedir}/target/site/it-jacoco</outputDirectory>
+                   </configuration>
+               </execution>
+               <execution>
+                   <id>default-instrument</id>
+                   <goals>
+                       <goal>instrument</goal>
+                   </goals>
+                   <configuration>
+                       <skip>${skipTests}</skip>
+                   </configuration>
+               </execution>
+               <execution>
+                   <id>default-restore-instrumented-classes</id>
+                   <goals>
+                       <goal>restore-instrumented-classes</goal>
+                   </goals>
+                   <configuration>
+                       <skip>${skipTests}</skip>
+                   </configuration>
+               </execution>
+           </executions>
+       </plugin>
+   </plugins>
+</build>
+       <dependencies>
+               <dependency>
+                       <groupId>org.jacoco</groupId>
+                       <artifactId>jacoco-maven-plugin</artifactId>
+                       <version>0.7.6.201602180812</version>
+           </dependency>
+       </dependencies>
+</project>
\ No newline at end of file