Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java (.../QaAppConstants.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java (.../QaAppConstants.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -158,7 +158,7 @@ public static final String MONITORING_REPORT_TITLE ="monitoringReportTitle"; public static final String REPORT_TITLE_LEARNER ="reportTitleLearner"; public static final String END_LEARNING_MESSAGE ="endLearningMessage"; - public static final String IS_TOOL_ACTIVITY_OFFLINE ="isToolActivityOnline"; + public static final String IS_TOOL_ACTIVITY_OFFLINE ="isToolActivityOffline"; public static final String IS_USERNAME_VISIBLE ="isUsernameVisible"; public static final String IS_ALL_SESSIONS_COMPLETED ="isAllSessionsCompleted"; public static final String CHECK_ALL_SESSIONS_COMPLETED ="checkAllSessionsCompleted"; Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaResources.properties =================================================================== diff -u -r861c3ee9fb6adda0f075e93533a2640c3041e9f9 -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaResources.properties (.../QaResources.properties) (revision 861c3ee9fb6adda0f075e93533a2640c3041e9f9) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaResources.properties (.../QaResources.properties) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -55,7 +55,7 @@ label.learning.attemptTime =Attempt Date/Time label.learning.timezone =Time-Zone label.learning.response =Response -label.learning.forceOfflineMessage =The activity Q/A is setup to be carried out offline. Plase see your instructor. +label.learning.forceOfflineMessage =This is setup to be carried out offline. Plase see your instructor for details. error.defineLater =Sorry, this activity's content is not ready yet.
Please wait for your teacher to make the content ready. error.toolSessionId.required =Tool Activity Error! Can't continue
URL is not complete. The Tool Activity requires a toolSession id. error.contentId.required =Tool Activity Error! Can't continue
URL is not complete. The Tool Activity requires a content id. Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaUtils.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaUtils.java (.../QaUtils.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaUtils.java (.../QaUtils.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -322,8 +322,10 @@ /** * get the service */ + logger.debug("existsSession"); IQaService qaService =QaUtils.getToolService(request); QaSession qaSession=qaService.retrieveQaSessionOrNullById(toolSessionId); + logger.debug("qaSession:" + qaSession); if (qaSession == null) return false; Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/LearningUtil.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/LearningUtil.java (.../LearningUtil.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/LearningUtil.java (.../LearningUtil.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -387,7 +387,7 @@ /** * find out the tool's mode. We produce different reports for learning and monitoring */ - String targetMode=(String )request.getSession().getAttribute(TARGET_MODE); + String targetMode=(String)request.getSession().getAttribute(TARGET_MODE); logger.debug("TARGET_MODE: " + targetMode); if (targetMode.equalsIgnoreCase(TARGET_MODE_MONITORING)) Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaLearningStarterAction.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaLearningStarterAction.java (.../QaLearningStarterAction.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaLearningStarterAction.java (.../QaLearningStarterAction.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -33,12 +33,19 @@ import org.lamsfoundation.lams.tool.qa.service.IQaService; import org.lamsfoundation.lams.tool.qa.service.QaServiceProxy; import org.lamsfoundation.lams.usermanagement.User; +/** + * TO DO: + * remove line: + * Long currentToolContentId= new Long(4321); + */ /** * * @author Ozgur Demirtas * - * Learner mode takes in the parameters USER_ID, TOOL_SESSION_ID and TOOL_CONTENT_ID + * /&userId=&toolSessionId=123&mode=teacher + * + * Since the toolSessionId is passed, we will derive toolContentId from the toolSessionId * * This class is used to load the default content and initialize the presentation Map for Learner mode * @@ -49,11 +56,47 @@ */ /** + * Tool Session: + * + * A tool session is the concept by which which the tool and the LAMS core manage a set of learners interacting with the tool. + * The tool session id (toolSessionId) is generated by the LAMS core and given to the tool. + * A tool session represents the use of a tool for a particulate activity for a group of learners. + * So if an activity is ungrouped, then one tool session exist for for a tool activity in a learning design. + * + * More details on the tool session id are covered under monitoring. + * When thinking about the tool content id and the tool session id, it might be helpful to think about the tool content id + * relating to the definition of an activity, whereas the tool session id relates to the runtime participation in the activity. * - * verifies that the content id passed to the tool is numeric and does refer to an existing content. + */ + +/** * + * Learner URL: + * The learner url display the screen(s) that the learner uses to participate in the activity. + * When the learner accessed this user, it will have a tool access mode ToolAccessMode.LEARNER. + * + * It is the responsibility of the tool to record the progress of the user. + * If the tool is a multistage tool, for example asking a series of questions, the tool must keep track of what the learner has already done. + * If the user logs out and comes back to the tool later, then the tool should resume from where the learner stopped. + * When the user is completed with tool, then the tool notifies the progress engine by calling + * org.lamsfoundation.lams.learning.service.completeToolSession(Long toolSessionId, User learner). + * + * If the tool's content DefineLater flag is set to true, then the learner should see a "Please wait for the teacher to define this part...." + * style message. + * If the tool's content RunOffline flag is set to true, then the learner should see a "This activity is not being done on the computer. + * Please see your instructor for details." + * + * ?? Would it be better to define a run offline message in the tool? We have instructions for the teacher but not the learner. ?? + * If the tool has a LockOnFinish flag, then the tool should lock learner's entries once they have completed the activity. + * If they return to the activity (e.g. via the progress bar) then the entries should be read only. + * */ +/** + * + * verifies that the content id passed to the tool is numeric and does refer to an existing content. + */ + public class QaLearningStarterAction extends Action implements QaAppConstants { static Logger logger = Logger.getLogger(QaLearningStarterAction.class.getName()); @@ -72,7 +115,7 @@ QaLearningForm qaQaLearningForm = (QaLearningForm) form; /** - * reset the question index to 1 + * reset the question index to 1. */ request.getSession().setAttribute(CURRENT_QUESTION_INDEX, "1"); logger.debug("CURRENT_QUESTION_INDEX: " + request.getSession().getAttribute(CURRENT_QUESTION_INDEX)); @@ -101,6 +144,11 @@ request.getSession().setAttribute(TARGET_MODE,TARGET_MODE_LEARNING); /** + * persist time zone information to session scope. + */ + persistTimeZone(request); + + /** * obtain and setup the current user's data */ String userId=request.getParameter(USER_ID); @@ -128,60 +176,8 @@ logger.debug("TOOL_USER is:" + request.getSession().getAttribute(TOOL_USER)); /** - * verify that userID does not already exist in the db + * process incoming tool session id and later derive toolContentId from it. */ - QaQueUsr qaQueUsr=qaService.loadQaQueUsr(new Long(userId)); - logger.debug("QaQueUsr:" + qaQueUsr); - if (qaQueUsr != null) - { - persistError(request,"error.userId.existing"); - request.setAttribute(USER_EXCEPTION_USERID_EXISTING, new Boolean(true)); - logger.debug("forwarding to: " + LOAD); - return (mapping.findForward(LOAD)); - } - - /** - * process incoming tool content id - */ - String strToolContentId=request.getParameter(TOOL_CONTENT_ID); - long toolContentId=0; - if ((strToolContentId == null) || (strToolContentId.length() == 0)) - { - persistError(request, "error.contentId.required"); - request.setAttribute(USER_EXCEPTION_CONTENTID_REQUIRED, new Boolean(true)); - logger.debug("forwarding to: " + LOAD); - return (mapping.findForward(LOAD)); - } - else - { - try - { - toolContentId=new Long(strToolContentId).longValue(); - logger.debug("passed TOOL_CONTENT_ID : " + new Long(toolContentId)); - request.getSession().setAttribute(TOOL_CONTENT_ID,new Long(toolContentId)); - } - catch(NumberFormatException e) - { - persistError(request, "error.contentId.numberFormatException"); - request.setAttribute(USER_EXCEPTION_NUMBERFORMAT, new Boolean(true)); - logger.debug("forwarding to: " + LOAD); - return (mapping.findForward(LOAD)); - } - } - - if (!QaUtils.existsContent(toolContentId, request)) - { - persistError(request, "error.content.doesNotExist"); - request.setAttribute(USER_EXCEPTION_CONTENT_DOESNOTEXIST, new Boolean(true)); - logger.debug("forwarding to: " + LOAD); - return (mapping.findForward(LOAD)); - } - - QaContent qaContent=qaService.loadQa(toolContentId); - /** - * process incoming tool session id - * A toolSessionId must be passed to the tool from the container. - */ String strToolSessionId=request.getParameter(TOOL_SESSION_ID); long toolSessionId=0; if ((strToolSessionId == null) || (strToolSessionId.length() == 0)) @@ -208,23 +204,21 @@ return (mapping.findForward(LOAD)); } } - - TimeZone timeZone=TimeZone.getDefault(); - logger.debug("current timezone: " + timeZone.getDisplayName()); - request.getSession().setAttribute(TIMEZONE, timeZone.getDisplayName()); - logger.debug("current timezone id: " + timeZone.getID()); - request.getSession().setAttribute(TIMEZONE_ID, timeZone.getID()); - - + /** * By now, the passed tool session id MUST exist in the db through the calling of: * public void createToolSession(Long toolSessionId, Long toolContentId) by the container. * * make sure this session exists in tool's session table by now. */ - if (!QaUtils.existsSession(toolSessionId, request)) + + if (!QaUtils.existsSession(toolSessionId, request)) { - Long currentToolContentId=(Long)request.getSession().getAttribute(TOOL_CONTENT_ID); + logger.debug("tool session does not exist" + toolSessionId); + /* + *for testing only, remove this line in development + */ + Long currentToolContentId= new Long(4321); logger.debug("simulating container behaviour: calling createToolSession with toolSessionId : " + new Long(toolSessionId) + " and toolContentId: " + currentToolContentId); qaService.createToolSession(new Long(toolSessionId), currentToolContentId); @@ -236,6 +230,7 @@ * Make sure we can retrieve it and relavent content */ + QaSession qaSession=qaService.retrieveQaSessionOrNullById(toolSessionId); logger.debug("retrieving qaSession: " + qaSession); /** @@ -246,8 +241,11 @@ /** * Each passed tool session id points to a particular content. Many to one mapping. */ - qaContent=qaSession.getQaContent(); + QaContent qaContent=qaSession.getQaContent(); logger.debug("using qaContent: " + qaContent); + request.getSession().setAttribute(TOOL_CONTENT_ID, qaContent.getQaContentId()); + logger.debug("using TOOL_CONTENT_ID: " + qaContent.getQaContentId()); + /** * The content we retrieved above must have been created before in Authoring time. @@ -259,13 +257,17 @@ request.getSession().setAttribute(END_LEARNING_MESSAGE,qaContent.getEndLearningMessage()); logger.debug("END_LEARNING_MESSAGE: " + qaContent.getEndLearningMessage()); - + /** + * Is the tool activity been checked as Run Offline in the property inspector? + */ logger.debug("IS_TOOL_ACTIVITY_OFFLINE: " + qaContent.isRunOffline()); request.getSession().setAttribute(IS_TOOL_ACTIVITY_OFFLINE, new Boolean(qaContent.isRunOffline()).toString()); logger.debug("IS_USERNAME_VISIBLE: " + qaContent.isUsernameVisible()); request.getSession().setAttribute(IS_USERNAME_VISIBLE, new Boolean(qaContent.isUsernameVisible())); - + /** + * Is the tool activity been checked as Define Later in the property inspector? + */ logger.debug("IS_DEFINE_LATER: " + qaContent.isDefineLater()); request.getSession().setAttribute(IS_DEFINE_LATER, new Boolean(qaContent.isDefineLater())); @@ -316,8 +318,29 @@ String userFeedback= feedBackType + request.getSession().getAttribute(TOTAL_QUESTION_COUNT) + QUESTIONS; request.getSession().setAttribute(USER_FEEDBACK, userFeedback); + + /** + * Verify that userId does not already exist in the db. + * If it does exist, that means, that user already responded to the content and + * his answers must be displayed read-only + * + */ + QaQueUsr qaQueUsr=qaService.loadQaQueUsr(new Long(userId)); + logger.debug("QaQueUsr:" + qaQueUsr); + if (qaQueUsr != null) + { + logger.debug("the learner has already responsed to this content, just generate a read-only report."); + LearningUtil learningUtil= new LearningUtil(); + learningUtil.buidLearnerReport(request,1); + logger.debug("buidLearnerReport called successfully, forwarding to: " + LEARNER_REPORT); + return (mapping.findForward(LEARNER_REPORT)); + } + /** + * present user with the questions. + */ logger.debug("forwarding to: " + LOAD); - return (mapping.findForward(LOAD)); + return (mapping.findForward(LOAD)); + } /** @@ -332,4 +355,14 @@ logger.debug("add " + message +" to ActionMessages:"); saveErrors(request,errors); } + + public void persistTimeZone(HttpServletRequest request) + { + TimeZone timeZone=TimeZone.getDefault(); + logger.debug("current timezone: " + timeZone.getDisplayName()); + request.getSession().setAttribute(TIMEZONE, timeZone.getDisplayName()); + logger.debug("current timezone id: " + timeZone.getID()); + request.getSession().setAttribute(TIMEZONE_ID, timeZone.getID()); + } + } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaMonitoringStarterAction.java (.../QaMonitoringStarterAction.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -270,20 +270,11 @@ */ strFromToolContentId=request.getParameter(FROM_TOOL_CONTENT_ID); logger.debug("FROM_TOOL_CONTENT_ID: " + strFromToolContentId); - if (strFromToolContentId == null) - { - throw new QaApplicationException("Exception occured: " + - "Tool expects a legitimate FROM_TOOL_CONTENT_ID from the container. Can't continue!"); - } - strToToolContentId=request.getParameter(TO_TOOL_CONTENT_ID); + strToToolContentId=request.getParameter(TO_TOOL_CONTENT_ID); logger.debug("TO_TOOL_CONTENT_ID: " + strToToolContentId); - if (strToToolContentId == null) - { - throw new QaApplicationException("Exception occured: " + - "Tool expects a legitimate TO_TOOL_CONTENT_ID from the container. Can't continue!"); - } qaService.copyToolContent(new Long(strFromToolContentId), new Long(strToToolContentId)); + logger.debug("test successfull: copyToolContent."); /** calls to these two methods will be made from Monitoring Service bean optionally depending on * the the tool is setup for DefineLater and (or) RunOffline Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaStarterAction.java =================================================================== diff -u -r5ba75a338c76b23778bf80ab835209d38e2316cb -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaStarterAction.java (.../QaStarterAction.java) (revision 5ba75a338c76b23778bf80ab835209d38e2316cb) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/QaStarterAction.java (.../QaStarterAction.java) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -1,11 +1,66 @@ /** * @author Ozgur Demirtas * - * * Created on 8/03/2005 + * * initializes the tool's authoring mode */ +/** + * Tool path The URL path for the tool should be /tool/$TOOL_SIG. + * + * CONTENT_LOCKED refers to content being in use or not: Any students answered that content? + * For future CONTENT_LOCKED ->CONTENT_IN_USE + * + * QaStarterAction loads the default content and initializes the presentation Map + * Requests can come either from authoring envuironment or from the monitoring environment for Edit Activity screen + * + * Check QaUtils.createAuthoringUser again User Management Service is ready + * + * */ + +/** + * + * Tool Content: + * + * While tool's manage their own content, the LAMS core and the tools work together to create and use the content. + * The tool content id (toolContentId) is the key by which the tool and the LAMS core discuss data - + * it is generated by the LAMS core and supplied to the tool whenever content needs to be stored. + * The LAMS core will refer to the tool content id whenever the content needs to be used. + * Tool content will be covered in more detail in following sections. + * + * Each tool will have one piece of content that is the default content. + * The tool content id for this content is created as part of the installation process. + * Whenever a tool is asked for some tool content that does not exist, it should supply the default tool content. + * This will allow the system to render the normal screen, albeit with useless information, rather than crashing. +*/ + +/** +* +* Authoring URL: +* +* The tool must supply an authoring module, which will be called to create new content or edit existing content. It will be called by an authoring URL using the following format: ????? +* The initial data displayed on the authoring screen for a new tool content id may be the default tool content. +* +* Authoring UI data consists of general Activity data fields and the Tool specific data fields. +* The authoring interface will have three tabs. The mandatory (and suggested) fields are given. Each tool will have its own fields which it will add on any of the three tabs, as appropriate to the tabs' function. +* +* Basic: Displays the basic set of fields that are needed for the tool, and it could be expected that a new LAMS user would use. Mandatory fields: Title, Instructions. +* Advanced: Displays the extra fields that would be used by experienced LAMS users. Optional fields: Lock On Finish, Make Responses Anonymous +* Instructions: Displays the "instructions" fields for teachers. Mandatory fields: Online instructions, Offline instructions, Document upload. +* The "Define Later" and "Run Offline" options are set on the Flash authoring part, and not on the tool's authoring screens. +* +* Preview The tool must be able to show the specified content as if it was running in a lesson. It will be the learner url with tool access mode set to ToolAccessMode.AUTHOR. +* Export The tool must be able to export its tool content for part of the overall learning design export. +* +* The format of the serialization for export is XML. Tool will define extra namespace inside the element to add a new data element (type). Inside the data element, it can further define more structures and types as it seems fit. +* The data elements must be "version" aware. The data elements must be "type" aware if they are to be shared between Tools. +* +* LAMS Xpress (Ernie, could you put something in here. You explain it better than I do!) +* Data Exchange At present, there is no data exchange format between tools. Therefore if a tool needs to work with another tool, they will need to be combined in a new tool. We plan to have a data exchange method in a future version of LAMS. +* +*/ + package org.lamsfoundation.lams.tool.qa.web; import java.io.IOException; import java.util.Iterator; @@ -34,17 +89,6 @@ import org.lamsfoundation.lams.tool.qa.service.QaServiceProxy; import org.lamsfoundation.lams.usermanagement.User; -/** - * TODO: change DEVELOPMENT_FLAG to false once the container creates and passes users to the tool - * Assumption: Session attribute ATTR_USERDATA will be passed to the tool to hold User object - * - * CONTENT_LOCKED refers to content being in use or not: Any students answered that content? - * For future CONTENT_LOCKED ->CONTENT_IN_USE - * - * QaStarterAction loads the default content and initializes the presentation Map - * Requests can come either from authoring envuironment or from the monitoring environment for Edit Activity screen - * - * */ public class QaStarterAction extends Action implements QaAppConstants { static Logger logger = Logger.getLogger(QaStarterAction.class.getName()); @@ -156,7 +200,8 @@ userId=request.getParameter(USER_ID); try { - User user=QaUtils.createAuthoringUser(new Integer(userId)); + /* Check QaUtils.createAuthoringUser again User Management Service is ready */ + User user=QaUtils.createAuthoringUser(new Integer(userId)); request.getSession().setAttribute(TOOL_USER, user); } catch(NumberFormatException e) Index: lams_tool_laqa/web/WEB-INF/struts-config.xml =================================================================== diff -u -r16e844de3f7c34b44baee1b28e67e708f42d00bf -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 16e844de3f7c34b44baee1b28e67e708f42d00bf) +++ lams_tool_laqa/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -63,11 +63,18 @@ - + + + + - + - + Index: lams_tool_laqa/web/monitoringIndex.jsp =================================================================== diff -u -r16e844de3f7c34b44baee1b28e67e708f42d00bf -re7b376ab647cc34726cd1dc3c572d3fd82e967c9 --- lams_tool_laqa/web/monitoringIndex.jsp (.../monitoringIndex.jsp) (revision 16e844de3f7c34b44baee1b28e67e708f42d00bf) +++ lams_tool_laqa/web/monitoringIndex.jsp (.../monitoringIndex.jsp) (revision e7b376ab647cc34726cd1dc3c572d3fd82e967c9) @@ -9,26 +9,17 @@ <% - String fromToolContentId="6666666"; - String toToolContentId="4071202367667828685"; - String toolSessionId="11237955877394927"; - String userId="1068924863"; + String fromToolContentId="1234"; + String toToolContentId="4321"; + String toolSessionId="999888"; + String userId="123123"; String toolUrl="/monitoringStarter?toolSessionId=" + toolSessionId + "&fromToolContentId=" + fromToolContentId + "&toToolContentId=" + toToolContentId + "&userId=" + userId; - userId="222"; - String toolContentId="6666"; - String toolSessionId1="1234567"; - String toolSessionId2=""; - String toolSessionId3=""; - String multipleSessionstoolUrl="/monitoringStarter?userId=" + userId+ "&toolContentId=" + toolContentId + "&toolSessionId1=" + toolSessionId1 + - "&toolSessionId2=" + toolSessionId2 + - "&toolSessionId3=" + toolSessionId3; - %> @@ -52,21 +43,8 @@
- - - - - - -
- - - -
-
-