diff --git a/CourseEditorOperations.php b/CourseEditorOperations.php index 141c078..94c0780 100644 --- a/CourseEditorOperations.php +++ b/CourseEditorOperations.php @@ -1,313 +1,325 @@ type) { case 'fromTopic': $result = self::createNewCourseFromTopic($operation); CourseEditorUtils::setComposedOperationSuccess($operation, $result); break; case 'fromDepartment': $result = self::createNewCourseFromDepartment($operation); CourseEditorUtils::setComposedOperationSuccess($operation, $result); break; } return json_encode($operation); } public static function manageCourseMetadataOp($operationRequested){ $operation = json_decode($operationRequested); $params = $operation->params; $title = $params[0]; $topic = $params[1]; $description = $params[2]; - $externalReferences = $params[3]; - $isImported = $params[4]; - $originalAuthors = $params[5]; - $isReviewed = $params[6]; - $reviewedOn = $params[7]; + $bibliography = $params[3]; + $exercises = $params[4]; + $books = $params[5]; + $externalReferences = $params[6]; + $isImported = $params[7]; + $originalAuthors = $params[8]; + $isReviewed = $params[9]; + $reviewedOn = $params[10]; $pageTitle = MWNamespace::getCanonicalName(NS_COURSEMETADATA) . ':' . $title; $metadata = "
" . $topic . "
\r\n"; if($description !== '' && $description !== null){ $metadata .= "
" . $description . "
\r\n"; } + if($bibliography !== '' && $bibliography !== null){ + $metadata .= "
" . $bibliography . "
\r\n"; + } + if($exercises !== '' && $exercises !== null){ + $metadata .= "
" . $exercises . "
\r\n"; + } + if($books !== '' && $books !== null){ + $metadata .= "
" . $books . "
\r\n"; + } if($externalReferences !== '' && $externalReferences !== null){ $metadata .= "
" . $externalReferences . "
\r\n"; } if($isImported !== false || $isReviewed !== false){ $metadata .= "
" . true . "
\r\n"; if($isImported !== false){ $metadata .= "
" . $isImported . "
\r\n"; $metadata .= "
" . $originalAuthors . "
\r\n"; } if($isReviewed !== false){ $metadata .= "
" . $isReviewed . "
\r\n"; $metadata .= "
" . $reviewedOn . "
\r\n"; } } $resultCreateMetadataPage = CourseEditorUtils::editWrapper($pageTitle, $metadata , null, null); CourseEditorUtils::setSingleOperationSuccess($operation, $resultCreateMetadataPage); return json_encode($operation); } private function createBasicCourseMetadata($topic, $title, $description){ $topic = ($topic === null ? $title : $topic); $pageTitle = MWNamespace::getCanonicalName(NS_COURSEMETADATA) . ':' . $title; $metadata = "
" . $topic . "
\r\n"; if($description !== '' && $description !== null){ $metadata .= "
" . $description . "
\r\n"; } $apiResult = CourseEditorUtils::editWrapper($pageTitle, $metadata , null, null); return $apiResult; } private function createNewCourseFromDepartment(&$operation){ $params = $operation->params; $department = $params[0]; $title = $params[1]; $description = $params[2]; $namespace = $params[3]; if($department != null && $title != null && $namespace != null){ $compareResult = strcmp($namespace, 'NS_COURSE'); $namespaceCostant = ($compareResult == 0 ? NS_COURSE : NS_USER); $pageTitle = MWNamespace::getCanonicalName($namespaceCostant) . ':'; if($namespaceCostant == NS_USER){ $result = self::createPrivateCourse($pageTitle, $topic, $title, $description); $user = CourseEditorUtils::getRequestContext()->getUser(); $userPage = $pageTitle . $user->getName(); $operation->courseTitle = $userPage . '/' . $title; }else{ $result = self::createPublicCourseFromDepartment($pageTitle, $department, $title, $description); $operation->courseTitle = $pageTitle . $title; } } return $result; } private function createNewCourseFromTopic(&$operation){ $params = $operation->params; $topic = $params[0]; $title = $params[1]; $description = $params[2]; $namespace = $params[3]; if($topic != null && $title != null && $namespace != null){ $compareResult = strcmp($namespace, 'NS_COURSE'); $namespaceCostant = ($compareResult === 0 ? NS_COURSE : NS_USER); $pageTitle = MWNamespace::getCanonicalName($namespaceCostant) . ':'; if($namespaceCostant == NS_USER){ $result = self::createPrivateCourse($pageTitle, $topic, $title, $description); $user = CourseEditorUtils::getRequestContext()->getUser(); $userPage = $pageTitle . $user->getName(); $operation->courseTitle = $userPage . '/' . $title; }else{ $result = self::createPublicCourseFromTopic($pageTitle, $topic, $title, $description); $operation->courseTitle = $pageTitle . $title; } } return $result; } private function createPrivateCourse($pageTitle, $topic, $title, $description){ $context = CourseEditorUtils::getRequestContext(); $user = $context->getUser(); $userPage = $pageTitle . $user->getName(); $titleWithUser = $user->getName() . '/' . $title; $pageTitle = $userPage . "/" . $title; $resultCreateCourse = CourseEditorUtils::editWrapper($pageTitle, "{{CCourse|}}", null, null); $resultCreateMetadataPage = self::createBasicCourseMetadata($topic, $titleWithUser, $description); $textToPrepend = "{{Course|" . $title . "|" . $user->getName() . "}}"; $resultPrependToUserPage = CourseEditorUtils::editWrapper($userPage, null, $textToPrepend, null); return array($resultCreateCourse, $resultCreateMetadataPage, $resultPrependToUserPage); } private function createPublicCourseFromTopic($pageTitle, $topic, $title, $description){ $pageTitle .= $title; $resultCreateCourse = CourseEditorUtils::editWrapper($pageTitle, "{{CCourse|}}", null, null); $topicCourses = CourseEditorUtils::getTopicCourses($topic); $text = $topicCourses . "{{Course|" . $title . "}}}}"; $resultCreateMetadataPage = self::createBasicCourseMetadata($topic, $title, $description); $resultAppendToTopic = CourseEditorUtils::editWrapper($topic, $text, null, null); return array($resultCreateCourse, $resultCreateMetadataPage, $resultAppendToTopic); } private function createPublicCourseFromDepartment($pageTitle, $department, $title, $description){ $pageTitle .= $title; $resultCreateCourse = CourseEditorUtils::editWrapper($pageTitle, "{{CCourse|}}", null, null); $text = "{{Topic|" . "{{Course|" . $title . "}}}}"; $listElementText = "\r\n* [[" . $title . "]]"; $resultCreateMetadataPage = self::createBasicCourseMetadata(null, $title, $description); $resultAppendToTopic = CourseEditorUtils::editWrapper($title, $text, null, null); $resultAppendToDepartment = CourseEditorUtils::editWrapper($department, null, null, $listElementText); return array($resultCreateCourse, $resultCreateMetadataPage, $resultAppendToTopic, $resultAppendToDepartment); } public static function applyCourseOp($courseName, $operation){ $value = json_decode($operation); switch ($value->action) { case 'rename-move-task': $sectionName = $value->elementName; $newSectionName = $value->newElementName; $pageTitle = $courseName . "/" . $sectionName; $newPageTitle = $courseName . '/' . $newSectionName; $apiResult = CourseEditorUtils::moveWrapper($pageTitle, $newPageTitle); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'rename-update-task': $sectionName = $value->elementName; $newSectionName = $value->newElementName; $chapters = CourseEditorUtils::getChapters($courseName . '/' .$newSectionName); $newSectionText = ""; foreach ($chapters as $chapter) { $newSectionText .= "* [[" . $courseName . "/" . $newSectionName . "/" . $chapter ."|". $chapter ."]]\r\n"; } $newPageTitle = $courseName . '/' . $newSectionName; $apiResult = CourseEditorUtils::editWrapper($newPageTitle, $newSectionText, null, null); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'delete-chapters-task': $user = CourseEditorUtils::getRequestContext()->getUser(); $sectionName = $value->elementName; $chapters = CourseEditorUtils::getChapters($courseName . '/' . $sectionName); $title = Title::newFromText( $courseName . '/' . $sectionName, $defaultNamespace=NS_MAIN ); $pageTitle = $courseName . '/' . $sectionName; if(!$title->userCan('delete', $user, 'secure')){ $prependText = "\r\n{{DeleteMe}}"; foreach ($chapters as $chapter) { $pageTitle = $courseName . '/' . $sectionName . '/' . $chapter; $prependText = "\r\n{{DeleteMe}}"; $apiResult = CourseEditorUtils::editWrapper($pageTitle, null, $prependText, null); } }else { foreach ($chapters as $chapter) { $pageTitle = $courseName . '/' . $sectionName . '/' . $chapter; $apiResult = CourseEditorUtils::deleteWrapper($pageTitle); } } CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'delete-section-task': $user = CourseEditorUtils::getRequestContext()->getUser(); $sectionName = $value->elementName; $title = Title::newFromText( $courseName . '/' . $sectionName, $defaultNamespace=NS_MAIN ); $pageTitle = $courseName . '/' . $sectionName; if(!$title->userCan('delete', $user, 'secure')){ $prependText = "\r\n{{DeleteMe}}"; $apiResult = CourseEditorUtils::editWrapper($pageTitle, null, $prependText, null); }else { $apiResult = CourseEditorUtils::deleteWrapper($pageTitle); } CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'add': $sectionName = $value->elementName; $pageTitle = $courseName . '/' . $sectionName; $text = ""; $apiResult = CourseEditorUtils::editWrapper($pageTitle, $text, null, null); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'update': $newCourseText = "{{CCourse|\r\n"; $newSectionsArray = json_decode($value->elementsList); foreach ($newSectionsArray as $section) { $newCourseText .= "{{SSection|" . $section ."}}\r\n"; } $newCourseText .= "}}"; $categories = CourseEditorUtils::getCategories($courseName); if(sizeof($categories) > 0){ foreach ($categories as $category) { $newCourseText .= "\r\n[[" . $category['title'] . "]]"; } } $apiResult = CourseEditorUtils::editWrapper($courseName, $newCourseText, null, null); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'update-collection': $apiResult = CourseEditorUtils::updateCollection($courseName); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; /*case 'fix-link': $targetPage = $value->elementName; $linkToReplace = $value->linkToReplace; list($course, $section, $chapter) = explode('/', $linkToReplace); $replacement = $course . '/' . $value->replacement . '/' . $chapter; $title = Title::newFromText($targetPage); $page = WikiPage::factory( $title ); $content = $page->getContent( Revision::RAW ); $text = ContentHandler::getContentText( $content ); $newText = str_replace(str_replace(' ', '_', $linkToReplace), $replacement, $text); $apiResult = CourseEditorUtils::editWrapper($targetPage, $newText, null, null); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); $value->text = $newText; break;*/ } return json_encode($value); } public static function applySectionOp($sectionName, $operation){ $context = CourseEditorUtils::getRequestContext(); $value = json_decode($operation); switch ($value->action) { case 'rename': $chapterName = $value->elementName; $newChapterName = $value->newElementName; $from = $sectionName . '/' . $chapterName; $to = $sectionName . '/' . $newChapterName; $apiResult = CourseEditorUtils::moveWrapper($from, $to); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'delete': $user = $context->getUser(); $chapterName = $value->elementName; $title = Title::newFromText($sectionName . '/' . $chapterName, $defaultNamespace=NS_MAIN); if(!$title->userCan('delete', $user, 'secure')){ $pageTitle = $sectionName . '/' . $chapterName; $prependText = "\r\n{{DeleteMe}}"; $apiResult = CourseEditorUtils::editWrapper($pageTitle, null, $prependText, null); }else { $pageTitle = $sectionName . '/' . $chapterName; $apiResult = CourseEditorUtils::deleteWrapper($pageTitle); } CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'add': $chapterName = $value->elementName; $pageTitle = $sectionName . '/' . $chapterName; $text = ""; $apiResult = CourseEditorUtils::editWrapper($pageTitle, $text, null, null); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'update': $newSectionText = ""; $newChaptersArray = json_decode($value->elementsList); foreach ($newChaptersArray as $chapter) { $newSectionText .= "* [[" . $sectionName . "/" . $chapter ."|". $chapter ."]]\r\n"; } $apiResult = CourseEditorUtils::editWrapper($sectionName, $newSectionText); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'purge': $explodedString = explode("/", $sectionName); $pageToBePurged = (sizeof($explodedString) > 2 ? $explodedString[0] . "/" . $explodedString[1] : $explodedString[0]); $apiResult = CourseEditorUtils::purgeWrapper($pageToBePurged); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; case 'update-collection': $explodedString = explode("/", $sectionName); $courseName = (sizeof($explodedString) > 2 ? $explodedString[0] . "/" . $explodedString[1] : $explodedString[0]); $apiResult = CourseEditorUtils::updateCollection($courseName); CourseEditorUtils::setSingleOperationSuccess($value, $apiResult); break; } return json_encode($value); } } diff --git a/CourseEditorTemplates.php b/CourseEditorTemplates.php index f1edc7a..074005b 100644 --- a/CourseEditorTemplates.php +++ b/CourseEditorTemplates.php @@ -1,220 +1,234 @@ data['section']; ?>

  




data['course']; ?>

  




data['topic']){ $topic = $this->data['topic']; ?>
data['department']){ $department = $this->data['department']; ?>


data['course']; if($this->data['metadataResult']){ $metadataResult = $this->data['metadataResult']; } ?> +

+
+
+ + +
+
+ + +
+
+ + +


You can use the wiki syntax (wikitext) within textarea to add links, bullet lists etc...", "courseeditor-credits-info": "CourseEditor is an extension to create and manage courses.", "courseeditor-add-new-section" : "Add a new section", "courseeditor-save-course": "Save course", "courseeditor-add-new-chapter" : "Add New Chapter", "courseeditor-save-section" : "Save Section", "courseeditor-cancel" : "Cancel", "courseeditor-edit-dialog" : "Edit", "courseeditor-rename" : "Rename", "courseeditor-organize-chapters" : "You can organize, add and delete chapters", "courseeditor-organize-sections" : "You can organize, add and delete sections", "courseeditor-input-department-label" : "Department:", "courseeditor-input-topic-label" : "Topic:", "courseeditor-input-course-label" : "Title:", "courseeditor-input-course-placeholder" : "Insert the title of the course", "courseeditor-input-description-label" : "Description:", "courseeditor-input-description-placeholder" : "Insert a description", + "courseeditor-input-bibliography-label" : "Bibliografia:", + "courseeditor-input-bibliography-placeholder" : "Insersci la bibliografia", + "courseeditor-input-exercises-label" : "Descrizione:", + "courseeditor-input-exercises-placeholder" : "Insersci gli esercizi", + "courseeditor-input-books-label" : "Libri:", + "courseeditor-input-books-placeholder" : "Insersci i libri", "courseeditor-input-externalreferences-label" : "External references:", "courseeditor-input-externalreferences-placeholder" : "Insert external references", "courseeditor-input-reviewed-label" : "Reviewed", "courseeditor-input-imported-label" : "Imported", "courseeditor-input-originalauthors-label" : "Original authors:", "courseeditor-input-originalauthors-placeholder" : "Insert the original authors", "courseeditor-input-reviewedon-label" : "Reviewed on:", "courseeditor-input-reviewedon-placeholder" : "Insert the date (dd/mm/yyyy)", "courseeditor-save-button" : "Save", "courseeditor-create-button" : "Create!", "courseeditor-alert-message" : "Hey, there is a course with the same title yet!
Choose another title or start to contribute immediately to the existing course.", "courseeditor-validate-form" : "Please, insert a topic and a name", "courseeditor-radiobutton-namespace" : "Do you want to creatre a private course in your personal page or a public one?", "courseeditor-radiobutton-namespace-private" : "Private", "courseeditor-radiobutton-namespace-public" : "Public", "courseeditor-message-dialog-title" : "Oops...", "courseeditor-message-dialog-message" : "There's an element in the recycle bin with the same name, what do you want to do?", "courseeditor-message-dialog-cancel" : "Cancel", "courseeditor-message-dialog-restore" : "Restore", "courseeditor-message-dialog-create-new" : "Create new", "courseeditor-alert-message-existing-element" : "There is already an element with the same name. Please, enter a different one.", "courseeditor-recycle-bin" : "Recycle bin", "courseeditor-error-operation" : "Sorry, something went wrong! :(
", "courseeditor-operation-action-add" : "Add", "courseeditor-operation-action-rename-move-task" : "Rename", "courseeditor-operation-action-rename-update-task" : "Update links", "courseeditor-operation-action-delete-chapters-task" : "Delete chapters of", "courseeditor-operation-action-delete-section-task" : "Delete ", "courseeditor-operation-action-purge" : "Purge", "courseeditor-operation-action-update" : "Update", "courseeditor-operation-action-update-collection" : "Update book", "courseeditor-error-operation-fail" : " fails!", "courseeditor-collection-book-category": "Books", "courseeditor-collection-savedbook-template": "saved_book" } diff --git a/i18n/it.json b/i18n/it.json index b0b324d..873d64b 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -1,54 +1,61 @@ { "courseeditor" : "Editor di corsi", "courseeditor-managemetata-pagetitle": "Gestione metadati", + "courseeditor-managemetata-description": "Grazie a questa pagina puoi gestire i metadati del corso.
Puoi usare la sintassi wiki (wikitesto) all'interno delle textarea per aggiungere links, elenchi puntati ecc...", "courseeditor-credits-info": "CourseEditor è una estensione per creare ed organizzare corsi.", "courseeditor-add-new-section" : "Aggiungi una nuova sezione", "courseeditor-save-course": "Salva corso", "courseeditor-add-new-chapter" : "Aggiungi un nuovo capitolo", "courseeditor-save-section" : "Salva sezione", "courseeditor-cancel" : "Cancella", "courseeditor-edit-dialog" : "Modifica", "courseeditor-rename" : "Rinomina", "courseeditor-organize-chapters" : "Qui puoi organizzare, aggiungere e rimuovere capitoli", "courseeditor-organize-sections" : "Qui puoi organizzare, aggiungere e rimuovere sezioni", "courseeditor-input-department-label" : "Dipartmento:", "courseeditor-input-topic-label" : "Argomento:", "courseeditor-input-course-label" : "Titolo:", "courseeditor-input-course-placeholder" : "Inserisci il titolo del corso", "courseeditor-input-description-label" : "Descrizione:", "courseeditor-input-description-placeholder" : "Insersci la descrizione", + "courseeditor-input-bibliography-label" : "Bibliografia:", + "courseeditor-input-bibliography-placeholder" : "Insersci la bibliografia", + "courseeditor-input-exercises-label" : "Descrizione:", + "courseeditor-input-exercises-placeholder" : "Insersci gli esercizi", + "courseeditor-input-books-label" : "Libri:", + "courseeditor-input-books-placeholder" : "Insersci i libri", "courseeditor-input-externalreferences-label" : "Riferimenti esterni:", "courseeditor-input-externalreferences-placeholder" : "Inserisci i riferimenti esterni", "courseeditor-input-reviewed-label" : "Revisionato", "courseeditor-input-imported-label" : "Importato", "courseeditor-input-originalauthors-label" : "Autori originali:", "courseeditor-input-originalauthors-placeholder" : "Inserisci gli autori originali", "courseeditor-input-reviewedon-label" : "Revisionato il:", "courseeditor-input-reviewedon-placeholder" : "Inserisci la data (gg/mm/aaaa)", "courseeditor-save-button" : "Salva", "courseeditor-create-button" : "Crea!", "courseeditor-alert-message" : "Ehi, c'è un corso con lo stesso titolo!
Scegli un altro titolo o inizia a contribuire subito al corso esitente.
", "courseeditor-validate-form" : "Inserisci l'argomento e il corso!", "courseeditor-radiobutton-namespace" : "Vuoi creare un corso privato nella tua pagina personale o uno pubblico?", "courseeditor-radiobutton-namespace-private" : "Privato", "courseeditor-radiobutton-namespace-public" : "Pubblico", "courseeditor-message-dialog-title" : "Ops...", "courseeditor-message-dialog-message" : "C'è un elemento nel cestino con lo stesso nome, cosa vuoi fare?", "courseeditor-message-dialog-cancel" : "Indietro", "courseeditor-message-dialog-restore" : "Ripristina", "courseeditor-message-dialog-create-new" : "Crea nuovo", "courseeditor-alert-message-existing-element" : "È già presente un elemento con lo stesso nome. Per favore, inserire un nome diverso.", "courseeditor-recycle-bin" : "Cestino", "courseeditor-error-operation" : "Scusa, qualcosa è andato storto! :(
", "courseeditor-operation-action-add" : "Aggiungi", "courseeditor-operation-action-rename-move-task" : "Rinomina ", "courseeditor-operation-action-rename-update-task" : "Aggiorna links", "courseeditor-operation-action-delete-chapters-task" : "Elimina capitoli di", "courseeditor-operation-action-delete-section-task" : "Elimina", "courseeditor-operation-action-purge" : "Purga", "courseeditor-operation-action-update" : "Aggiorna", "courseeditor-operation-action-update-collection" : "Aggiorna libro", "courseeditor-error-operation-fail" : " fallito!", "courseeditor-collection-book-category": "Libri", "courseeditor-collection-savedbook-template": "libro_salvato" } diff --git a/modules/manageMetadata.js b/modules/manageMetadata.js index 846f285..2777de9 100644 --- a/modules/manageMetadata.js +++ b/modules/manageMetadata.js @@ -1,70 +1,82 @@ $(function () { if($('#isImported:checked').length > 0){ $('#courseOriginalAuthorsDiv').show(); } if($('#isReviewed:checked').length > 0){ $('#courseReviewedOnDiv').show(); } $('#isImported').click(function() { $('#courseOriginalAuthorsDiv').toggle(); }); $('#isReviewed').click(function() { $('#courseReviewedOnDiv').toggle(); }); $('#manageMetadataButton').click(function(e){ e.preventDefault(); $('#alert').hide(); var courseName = $('#courseName').val().trim(); - var courseTopic, courseDescription, courseExternalReferences, + var courseTopic, courseDescription, courseBibliography, courseExercises, courseBooks, courseExternalReferences, isImported = false, originalAuthors = "", isReviewed = false, reviewedOn = ""; if($('#courseTopic').val().trim().length !== 0){ courseTopic = $('#courseTopic').val().trim(); } if($('#courseDescription').val().trim().length !== 0){ courseDescription = $('#courseDescription').val().trim(); } + if($('#courseBibliography').val().trim().length !== 0){ + courseBibliography = $('#courseBibliography').val().trim(); + } + if($('#courseExercises').val().trim().length !== 0){ + courseExercises = $('#courseExercises').val().trim(); + } + if($('#courseBooks').val().trim().length !== 0){ + courseBooks = $('#courseBooks').val().trim(); + } if($('#courseExternalReferences').val().trim().length !== 0){ courseExternalReferences = $('#courseExternalReferences').val().trim(); } if($('#isImported:checked').length > 0){ isImported = true; originalAuthors = $('#courseOriginalAuthors').val().trim(); } if($('#isReviewed:checked').length > 0){ isReviewed = true; reviewedOn = $('#courseReviewedOn').val().trim(); } operationRequested = { type : 'saveMetadata', params : [ courseName, courseTopic, courseDescription, + courseBibliography, + courseExercises, + courseBooks, courseExternalReferences, isImported, originalAuthors, isReviewed, reviewedOn ] }; $.post( mw.util.wikiScript(), { action: 'ajax', rs: 'CourseEditorOperations::manageCourseMetadataOp', rsargs: [JSON.stringify(operationRequested)] }, function ( data ) { var dataObj = JSON.parse(data); if(dataObj.success !== true){ $('#alert').show(); }else { /*FIXME: courseTopic is valid only if the course is public, otherwise user should * be redirected to userpage */ window.location.assign('/' + courseTopic); } }); }); })