diff --git a/build.gradle b/build.gradle index 2155106c1695..46eace3d037a 100644 --- a/build.gradle +++ b/build.gradle @@ -249,6 +249,7 @@ dependencies { implementation "de.jplag:c:${jplag_version}" implementation "de.jplag:cpp:${jplag_version}" + implementation "de.jplag:csharp:${jplag_version}" implementation "de.jplag:java:${jplag_version}" implementation "de.jplag:javascript:${jplag_version}" implementation "de.jplag:kotlin:${jplag_version}" @@ -313,7 +314,7 @@ dependencies { implementation "ch.qos.logback:logback-classic:${logback_version}" implementation "ch.qos.logback:logback-core:${logback_version}" // required by eureka client - implementation "com.thoughtworks.xstream:xstream:1.4.20" + implementation "com.thoughtworks.xstream:xstream:1.4.21" // required by JPlag implementation "xerces:xercesImpl:2.12.2" // required by JPlag @@ -321,7 +322,7 @@ dependencies { // required by JPlag implementation "xalan:serializer:2.7.3" // required by Saml2 - implementation "org.apache.santuario:xmlsec:4.0.2" + implementation "org.apache.santuario:xmlsec:4.0.3" implementation "org.jsoup:jsoup:1.18.1" implementation "commons-codec:commons-codec:1.17.1" // needed for spring security saml2 @@ -373,7 +374,7 @@ dependencies { implementation "javax.cache:cache-api:1.1.1" implementation "org.hibernate.orm:hibernate-core:${hibernate_version}" - implementation "com.zaxxer:HikariCP:6.0.0" + implementation "com.zaxxer:HikariCP:6.1.0" implementation "org.apache.commons:commons-text:1.12.0" implementation "org.apache.commons:commons-math3:3.6.1" @@ -421,7 +422,7 @@ dependencies { implementation "org.springframework.security:spring-security-oauth2-core:${spring_security_version}" implementation "org.springframework.security:spring-security-oauth2-client:${spring_security_version}" // use newest version of nimbus-jose-jwt to avoid security issues through outdated dependencies - implementation "com.nimbusds:nimbus-jose-jwt:9.45" + implementation "com.nimbusds:nimbus-jose-jwt:9.46" implementation "org.springframework.security:spring-security-oauth2-jose:${spring_security_version}" implementation "org.springframework.security:spring-security-crypto:${spring_security_version}" diff --git a/docs/user/adaptive-learning/adaptive-learning-instructor.rst b/docs/user/adaptive-learning/adaptive-learning-instructor.rst index 955d00e18d6b..0f78a71e920d 100644 --- a/docs/user/adaptive-learning/adaptive-learning-instructor.rst +++ b/docs/user/adaptive-learning/adaptive-learning-instructor.rst @@ -51,11 +51,10 @@ Create/Edit Competencies Besides a title and description, they can set a `taxonomy `_. | The mastery threshold describes the minimum mastery required for a student to consider the competency as mastered. The current average mastery shown on this page can be used as a basis for defining a reasonable threshold value. -| Instructors can link competencies to lecture units on this page by first choosing a lecture and then selecting desired lecture units. |instructor-competency-edit| -Alternatively, instructors can also link competencies to an exercise or lecture unit on the respective management page using the selection box shown below. +Instructors can link competencies to an exercise or lecture unit on the respective management page using the selection box shown below. |instructor-competency-link| diff --git a/docs/user/adaptive-learning/instructor/competency-edit.png b/docs/user/adaptive-learning/instructor/competency-edit.png index 543a2c470114..49ea264e1a39 100644 Binary files a/docs/user/adaptive-learning/instructor/competency-edit.png and b/docs/user/adaptive-learning/instructor/competency-edit.png differ diff --git a/docs/user/adaptive-learning/instructor/competency-recommendation.png b/docs/user/adaptive-learning/instructor/competency-recommendation.png index 0d97106d8ae4..525b5f34445e 100644 Binary files a/docs/user/adaptive-learning/instructor/competency-recommendation.png and b/docs/user/adaptive-learning/instructor/competency-recommendation.png differ diff --git a/docs/user/exams/instructor/programming_assessment.png b/docs/user/exams/instructor/programming_assessment.png index cbdb29fc4939..350edceffd64 100644 Binary files a/docs/user/exams/instructor/programming_assessment.png and b/docs/user/exams/instructor/programming_assessment.png differ diff --git a/docs/user/exercises/modeling/create-modeling-exercise-form-3.png b/docs/user/exercises/modeling/create-modeling-exercise-form-3.png index f5084aec8638..85d8f060a457 100644 Binary files a/docs/user/exercises/modeling/create-modeling-exercise-form-3.png and b/docs/user/exercises/modeling/create-modeling-exercise-form-3.png differ diff --git a/docs/user/exercises/programming-exercise-features.inc b/docs/user/exercises/programming-exercise-features.inc index 19eb1e02a680..edf413fd5d99 100644 --- a/docs/user/exercises/programming-exercise-features.inc +++ b/docs/user/exercises/programming-exercise-features.inc @@ -43,6 +43,8 @@ Instructors can still use those templates to generate programming exercises and +----------------------+----------+---------+ | TypeScript | yes | yes | +----------------------+----------+---------+ + | C# | yes | yes | + +----------------------+----------+---------+ - Not all ``templates`` support the same feature set and supported features can also change depending on the continuous integration system setup. Depending on the feature set, some options might not be available during the creation of the programming exercise. @@ -83,6 +85,8 @@ Instructors can still use those templates to generate programming exercises and +----------------------+----------------------+----------------------+---------------------+--------------+------------------------------------------+------------------------------+----------------------------+------------------------+ | TypeScript | no | no | yes | no | n/a | no | no | L: yes, J: no | +----------------------+----------------------+----------------------+---------------------+--------------+------------------------------------------+------------------------------+----------------------------+------------------------+ + | C# | no | no | yes | no | n/a | no | no | L: yes, J: no | + +----------------------+----------------------+----------------------+---------------------+--------------+------------------------------------------+------------------------------+----------------------------+------------------------+ - *Sequential Test Runs*: ``Artemis`` can generate a build plan which first executes structural and then behavioral tests. This feature can help students to better concentrate on the immediate challenge at hand. - *Static Code Analysis*: ``Artemis`` can generate a build plan which additionally executes static code analysis tools. diff --git a/docs/user/exercises/programming/CodeEditor.png b/docs/user/exercises/programming/CodeEditor.png index 5177419d776a..1d9bf271f58f 100644 Binary files a/docs/user/exercises/programming/CodeEditor.png and b/docs/user/exercises/programming/CodeEditor.png differ diff --git a/docs/user/exercises/programming/course-management-template-solution-diff-example.png b/docs/user/exercises/programming/course-management-template-solution-diff-example.png index bdaa4b04504f..74369c8a876c 100644 Binary files a/docs/user/exercises/programming/course-management-template-solution-diff-example.png and b/docs/user/exercises/programming/course-management-template-solution-diff-example.png differ diff --git a/docs/user/exercises/programming/instructor-editor.png b/docs/user/exercises/programming/instructor-editor.png index b042314285a6..c2c209d0eb76 100644 Binary files a/docs/user/exercises/programming/instructor-editor.png and b/docs/user/exercises/programming/instructor-editor.png differ diff --git a/docs/user/exercises/programming/online-editor-assessment.png b/docs/user/exercises/programming/online-editor-assessment.png index 0ca7f2745c84..a5b851520191 100644 Binary files a/docs/user/exercises/programming/online-editor-assessment.png and b/docs/user/exercises/programming/online-editor-assessment.png differ diff --git a/docs/user/exercises/programming/online-editor-feedback.png b/docs/user/exercises/programming/online-editor-feedback.png index 983b6657c063..bb1518fdbab1 100644 Binary files a/docs/user/exercises/programming/online-editor-feedback.png and b/docs/user/exercises/programming/online-editor-feedback.png differ diff --git a/docs/user/exercises/programming/programming-edit-status.png b/docs/user/exercises/programming/programming-edit-status.png index 037869936789..e5befce7e9a4 100644 Binary files a/docs/user/exercises/programming/programming-edit-status.png and b/docs/user/exercises/programming/programming-edit-status.png differ diff --git a/docs/user/exercises/programming/programming-options-problem-statement.png b/docs/user/exercises/programming/programming-options-problem-statement.png index edc3c86d5f06..30e8b73112bb 100644 Binary files a/docs/user/exercises/programming/programming-options-problem-statement.png and b/docs/user/exercises/programming/programming-options-problem-statement.png differ diff --git a/docs/user/exercises/quiz/drag-and-drop-question.png b/docs/user/exercises/quiz/drag-and-drop-question.png index 7581886327df..68615db9be51 100644 Binary files a/docs/user/exercises/quiz/drag-and-drop-question.png and b/docs/user/exercises/quiz/drag-and-drop-question.png differ diff --git a/docs/user/exercises/quiz/multiple-choice-question.png b/docs/user/exercises/quiz/multiple-choice-question.png index 32f3544a36dd..cd0d76904511 100644 Binary files a/docs/user/exercises/quiz/multiple-choice-question.png and b/docs/user/exercises/quiz/multiple-choice-question.png differ diff --git a/docs/user/exercises/quiz/short-answer-question.png b/docs/user/exercises/quiz/short-answer-question.png index a119a4f13653..bd2620a39a53 100644 Binary files a/docs/user/exercises/quiz/short-answer-question.png and b/docs/user/exercises/quiz/short-answer-question.png differ diff --git a/docs/user/exercises/text/create-text-exercise-form-2.png b/docs/user/exercises/text/create-text-exercise-form-2.png index ec2e83b1ec83..bd1d289429b1 100644 Binary files a/docs/user/exercises/text/create-text-exercise-form-2.png and b/docs/user/exercises/text/create-text-exercise-form-2.png differ diff --git a/docs/user/icl/local-vc/commit-diff-view.png b/docs/user/icl/local-vc/commit-diff-view.png index 19ebb58be3ab..95b04c08001c 100644 Binary files a/docs/user/icl/local-vc/commit-diff-view.png and b/docs/user/icl/local-vc/commit-diff-view.png differ diff --git a/docs/user/icl/local-vc/current-repository-content-view.png b/docs/user/icl/local-vc/current-repository-content-view.png index 961e9f17889b..b3f63052f3a6 100644 Binary files a/docs/user/icl/local-vc/current-repository-content-view.png and b/docs/user/icl/local-vc/current-repository-content-view.png differ diff --git a/docs/user/lectures.rst b/docs/user/lectures.rst index ea5cbf82ba92..2919d50ec62f 100644 --- a/docs/user/lectures.rst +++ b/docs/user/lectures.rst @@ -154,44 +154,44 @@ See :ref:`Adaptive Learning ` for more information. .. |lectures-overview| image:: lectures/lectures-overview.png - :width: 800 + :width: 1000 .. |lecture-details| image:: lectures/lecture-details.png - :width: 800 + :width: 1000 .. |lectures-management| image:: lectures/lectures-management.png - :width: 800 + :width: 1000 .. |lectures-management-btn| image:: lectures/lectures-management-button.png :width: 80 .. |create-lecture| image:: lectures/create-lecture.png - :width: 800 + :width: 1000 .. |create-lecture-btn| image:: lectures/create-lecture-button.png :width: 120 .. |switch-to-guided-mode-btn| image:: lectures/switch-to-guided-mode-button.png :width: 160 .. |create-attachment| image:: lectures/create-attachment.png - :width: 800 + :width: 1000 .. |import-lecture| image:: lectures/import-lecture.png - :width: 800 + :width: 1000 .. |import-lecture-btn| image:: lectures/import-lecture-button.png :width: 120 .. |units-management-empty| image:: lectures/units-management-empty.png - :width: 800 + :width: 1000 .. |units-management| image:: lectures/units-management.png - :width: 800 + :width: 1000 .. |create-online-unit| image:: lectures/create-online-unit.png - :width: 800 + :width: 1000 .. |create-text-unit| image:: lectures/create-text-unit.png - :width: 800 + :width: 1000 .. |create-video-unit| image:: lectures/create-video-unit.png - :width: 800 + :width: 1000 .. |create-attachment-unit| image:: lectures/create-attachment-unit.png - :width: 800 + :width: 1000 .. |create-exercise-unit| image:: lectures/create-exercise-unit.png - :width: 800 + :width: 1000 .. |process-units-checkbox| image:: lectures/process-units-checkbox.png :width: 120 .. |process-units-btn| image:: lectures/process-units-btn.png :width: 120 .. |processed-lecture-units| image:: lectures/processed-lecture-units.png - :width: 800 + :width: 1000 .. |automatic-unit-processing| image:: lectures/automatic-unit-processing.png - :width: 800 + :width: 1000 diff --git a/docs/user/lectures/automatic-unit-processing.png b/docs/user/lectures/automatic-unit-processing.png index 37ec94873b1c..414dffa30281 100644 Binary files a/docs/user/lectures/automatic-unit-processing.png and b/docs/user/lectures/automatic-unit-processing.png differ diff --git a/docs/user/lectures/create-attachment-unit.png b/docs/user/lectures/create-attachment-unit.png index 63429545c808..0e83e9c0fb93 100644 Binary files a/docs/user/lectures/create-attachment-unit.png and b/docs/user/lectures/create-attachment-unit.png differ diff --git a/docs/user/lectures/create-exercise-unit.png b/docs/user/lectures/create-exercise-unit.png index 34c4cb1565d3..5b79e00249ae 100644 Binary files a/docs/user/lectures/create-exercise-unit.png and b/docs/user/lectures/create-exercise-unit.png differ diff --git a/docs/user/lectures/create-lecture.png b/docs/user/lectures/create-lecture.png index 471851274df7..a916e93cca91 100644 Binary files a/docs/user/lectures/create-lecture.png and b/docs/user/lectures/create-lecture.png differ diff --git a/docs/user/lectures/create-online-unit.png b/docs/user/lectures/create-online-unit.png index f78d56543d2b..e6cd139680f8 100644 Binary files a/docs/user/lectures/create-online-unit.png and b/docs/user/lectures/create-online-unit.png differ diff --git a/docs/user/lectures/create-text-unit.png b/docs/user/lectures/create-text-unit.png index 08df6282b4f0..5060c00552b9 100644 Binary files a/docs/user/lectures/create-text-unit.png and b/docs/user/lectures/create-text-unit.png differ diff --git a/docs/user/lectures/create-video-unit.png b/docs/user/lectures/create-video-unit.png index e564a18e2519..52968dbee445 100644 Binary files a/docs/user/lectures/create-video-unit.png and b/docs/user/lectures/create-video-unit.png differ diff --git a/docs/user/markdown-support/markdown-lecture-example.png b/docs/user/markdown-support/markdown-lecture-example.png index 482672d66510..faecc0432e21 100644 Binary files a/docs/user/markdown-support/markdown-lecture-example.png and b/docs/user/markdown-support/markdown-lecture-example.png differ diff --git a/docs/user/markdown-support/markdown-lecture-preview.png b/docs/user/markdown-support/markdown-lecture-preview.png index 2de816af804e..5387e1c2decf 100644 Binary files a/docs/user/markdown-support/markdown-lecture-preview.png and b/docs/user/markdown-support/markdown-lecture-preview.png differ diff --git a/docs/user/markdown-support/markdown-post-extensions-preview.png b/docs/user/markdown-support/markdown-post-extensions-preview.png index 1d98843c16cc..74ba47bef43e 100644 Binary files a/docs/user/markdown-support/markdown-post-extensions-preview.png and b/docs/user/markdown-support/markdown-post-extensions-preview.png differ diff --git a/docs/user/markdown-support/markdown-post-extensions.png b/docs/user/markdown-support/markdown-post-extensions.png index 4e613d0f7e1c..c8af63aab04f 100644 Binary files a/docs/user/markdown-support/markdown-post-extensions.png and b/docs/user/markdown-support/markdown-post-extensions.png differ diff --git a/docs/user/plagiarism-check/instructor/student-notification.png b/docs/user/plagiarism-check/instructor/student-notification.png index 179b328be336..3b2a7194487b 100644 Binary files a/docs/user/plagiarism-check/instructor/student-notification.png and b/docs/user/plagiarism-check/instructor/student-notification.png differ diff --git a/docs/user/tutorialgroups/instructors-tutorial-group-form.png b/docs/user/tutorialgroups/instructors-tutorial-group-form.png index e6a5363c62bb..f933ac3450e7 100644 Binary files a/docs/user/tutorialgroups/instructors-tutorial-group-form.png and b/docs/user/tutorialgroups/instructors-tutorial-group-form.png differ diff --git a/gradle.properties b/gradle.properties index 552db125152e..8e95ead2b4ff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,18 +19,18 @@ hazelcast_version=5.5.0 fasterxml_version=2.18.1 jgit_version=7.0.0.202409031743-r sshd_version=2.14.0 -checkstyle_version=10.20.0 +checkstyle_version=10.20.1 jplag_version=5.1.0 # not really used in Artemis, nor Jplag, nor the used version of Stanford CoreNLP, but we use the latest to avoid security vulnerabilities # NOTE: we do not need to use the latest version 9.x here as long as Stanford CoreNLP does not reference it lucene_version=8.11.4 slf4j_version=2.0.16 sentry_version=7.16.0 -liquibase_version=4.29.2 +liquibase_version=4.30.0 docker_java_version=3.4.0 logback_version=1.5.12 java_parser_version=3.26.2 -byte_buddy_version=1.15.9 +byte_buddy_version=1.15.10 # testing # make sure both versions are compatible @@ -43,7 +43,7 @@ mockito_version=5.14.2 gradle_node_plugin_version=7.1.0 apt_plugin_version=0.21 liquibase_plugin_version=2.1.1 -modernizer_plugin_version=1.9.3 +modernizer_plugin_version=1.10.0 org.gradle.jvmargs=-Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en \ --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ diff --git a/jest.config.js b/jest.config.js index d9b115cd770f..8fbf56f12e91 100644 --- a/jest.config.js +++ b/jest.config.js @@ -27,12 +27,15 @@ const esModules = [ 'd3-array', 'd3-brush', 'd3-color', + 'd3-dispatch', 'd3-drag', 'd3-ease', + 'd3-force', 'd3-format', 'd3-hierarchy', 'd3-interpolate', 'd3-path', + 'd3-quadtree', 'd3-scale', 'd3-selection', 'd3-shape', @@ -102,10 +105,10 @@ module.exports = { coverageThreshold: { global: { // TODO: in the future, the following values should increase to at least 90% - statements: 87.53, - branches: 73.62, - functions: 82.09, - lines: 87.59, + statements: 87.55, + branches: 73.68, + functions: 82.12, + lines: 87.61, }, }, coverageReporters: ['clover', 'json', 'lcov', 'text-summary'], diff --git a/package-lock.json b/package-lock.json index 375b835ba7bc..017c505d0dbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,18 +10,18 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@angular/animations": "18.2.10", - "@angular/cdk": "18.2.11", - "@angular/common": "18.2.10", - "@angular/compiler": "18.2.10", - "@angular/core": "18.2.10", - "@angular/forms": "18.2.10", - "@angular/localize": "18.2.10", - "@angular/material": "18.2.11", - "@angular/platform-browser": "18.2.10", - "@angular/platform-browser-dynamic": "18.2.10", - "@angular/router": "18.2.10", - "@angular/service-worker": "18.2.10", + "@angular/animations": "18.2.11", + "@angular/cdk": "18.2.12", + "@angular/common": "18.2.11", + "@angular/compiler": "18.2.11", + "@angular/core": "18.2.11", + "@angular/forms": "18.2.11", + "@angular/localize": "18.2.11", + "@angular/material": "18.2.12", + "@angular/platform-browser": "18.2.11", + "@angular/platform-browser-dynamic": "18.2.11", + "@angular/router": "18.2.11", + "@angular/service-worker": "18.2.11", "@ctrl/ngx-emoji-mart": "9.2.0", "@danielmoncada/angular-datetime-picker": "18.1.0", "@fingerprintjs/fingerprintjs": "4.5.1", @@ -33,7 +33,7 @@ "@ng-bootstrap/ng-bootstrap": "17.0.1", "@ngx-translate/core": "16.0.3", "@ngx-translate/http-loader": "16.0.0", - "@sentry/angular": "8.36.0", + "@sentry/angular": "8.37.1", "@siemens/ngx-datatable": "22.4.1", "@swimlane/ngx-charts": "20.5.0", "@swimlane/ngx-graph": "8.4.0", @@ -65,7 +65,7 @@ "ngx-webstorage": "18.0.0", "papaparse": "5.4.1", "pdfjs-dist": "4.8.69", - "posthog-js": "1.180.1", + "posthog-js": "1.181.0", "rxjs": "7.8.1", "simple-statistics": "7.8.7", "smoothscroll-polyfill": "0.4.4", @@ -88,9 +88,9 @@ "@angular-eslint/schematics": "18.4.0", "@angular-eslint/template-parser": "18.4.0", "@angular/cli": "18.2.11", - "@angular/compiler-cli": "18.2.10", - "@angular/language-service": "18.2.10", - "@sentry/types": "8.36.0", + "@angular/compiler-cli": "18.2.11", + "@angular/language-service": "18.2.11", + "@sentry/types": "8.37.1", "@types/crypto-js": "4.2.2", "@types/d3-shape": "3.1.6", "@types/dompurify": "3.0.5", @@ -98,18 +98,18 @@ "@types/jest": "29.5.14", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/node": "22.8.7", + "@types/node": "22.9.0", "@types/papaparse": "5.3.15", "@types/smoothscroll-polyfill": "0.3.4", "@types/sockjs-client": "1.5.4", "@types/turndown": "5.0.5", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.12.2", - "@typescript-eslint/parser": "8.12.2", + "@typescript-eslint/eslint-plugin": "8.13.0", + "@typescript-eslint/parser": "8.13.0", "eslint": "9.14.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-deprecation": "3.0.0", - "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jest": "28.9.0", "eslint-plugin-jest-extended": "2.4.0", "eslint-plugin-prettier": "5.2.1", "folder-hash": "4.0.4", @@ -555,9 +555,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.10.tgz", - "integrity": "sha512-LT5+CocFZJ4t5jXsXLx5w/sBuWSxOEjmNTYga13usRcLOblrAB902pjUdFCHEZyrCUgm4MH8vov9fMS+Ks2GCw==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.11.tgz", + "integrity": "sha512-ghgXa2VhtyJJnTMuH2NYxCMsveQbZno44AZGygPqrcW8UQMQe9GulFaTXCH5s6/so2CLy2ZviIwSZQRgK0ZlDw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -566,7 +566,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.10" + "@angular/core": "18.2.11" } }, "node_modules/@angular/build": { @@ -657,9 +657,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.2.11", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.11.tgz", - "integrity": "sha512-FuvfhrSz2ch0gyOVHrkWq2C/I2PnOzKYSXlG/VEG+ize/WNrvlYy//5WVrTh/hv+HD9sdoWPr9ULXsfFfgbo7w==", + "version": "18.2.12", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.12.tgz", + "integrity": "sha512-FOklA6KatPtb0yO0doRhBI/UVY23A8ZhOSws5VuZTQl/6r/jXEXGV9n5JQj4rm8t/6IrReO55hdyw9XfHfZFjQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -708,9 +708,9 @@ } }, "node_modules/@angular/common": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.10.tgz", - "integrity": "sha512-YzTCmuqLiOuT+Yv07vuKymDWiebOVZ8BuXakJiz4EM7FMoOw5gICHJ04jepZSjDNWpA16e7kJSdt5ucnmvCFDQ==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.11.tgz", + "integrity": "sha512-bamJeISl2zUlvjPYebQWazUjhjXU9nrot42cQJng94SkvNENT9LTWfPYgc+Bd972Kg+31jG4H41rgFNs7zySmw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -719,14 +719,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.10", + "@angular/core": "18.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.10.tgz", - "integrity": "sha512-cu+Uq1nnyl00Glg0+2uvm+Xpaq5b4YvWpaLGGtit7uGETAJ4L/frlBVeaTRhEoaIAGBI+RRlyuFLae+etQDA0w==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.11.tgz", + "integrity": "sha512-PSVL1YXUhTzkgJNYXiWk9eAZxNV6laQJRGdj9++C1q9m2S9/GlehZGzkt5GtC5rlUweJucCNvBC1+2D5FAt9vA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -735,7 +735,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.10" + "@angular/core": "18.2.11" }, "peerDependenciesMeta": { "@angular/core": { @@ -744,9 +744,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.10.tgz", - "integrity": "sha512-CNFStKWMB89MFKAZZFUOhoQi+fHqRLgNOOrI73LjizXixvngEh3BDZJRtK9hbSGG+giujBrummEA60CWAw69MA==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.11.tgz", + "integrity": "sha512-YJlAOiXZUYP6/RK9isu5AOucmNZhFB9lpY/beMzkkWgDku+va8szm4BZbLJFz176IUteyLWF3IP4aE7P9OBlXw==", "license": "MIT", "dependencies": { "@babel/core": "7.25.2", @@ -767,7 +767,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.10", + "@angular/compiler": "18.2.11", "typescript": ">=5.4 <5.6" } }, @@ -800,9 +800,9 @@ } }, "node_modules/@angular/core": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.10.tgz", - "integrity": "sha512-EfxVz0pLaxnOppOYkdhnaUkk8HZT+uxaAGpJD3ppAa7YAWTE9xIGoNJmtS33cZNNOnvriMkdv7yn6pDtV4ct+Q==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.11.tgz", + "integrity": "sha512-/AGAFyZN8KR+kW5FUFCCBCj3qHyDDum7G0lJe5otrT9AqF6+g7PjF8yLha/6wPkJG7ri5xGLhini1sEivVeq/g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -816,9 +816,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.10.tgz", - "integrity": "sha512-2VprGB+enJIeqfz2oALmP/G/UiFzpZW6PHgyZXhk/0J/UMsa26JoYxwDFvfdm/WGTrB+VaQEG7in5xwiFPAFtQ==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.11.tgz", + "integrity": "sha512-QjxayOxDTqsTJGBzfWd3nms1LZIXj2f1+wIPxxUNXyNS5ZaM7hBWkz2BTFYeewlD/HdNj0alNVCYK3M8ElLWYw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -827,16 +827,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.10", - "@angular/core": "18.2.10", - "@angular/platform-browser": "18.2.10", + "@angular/common": "18.2.11", + "@angular/core": "18.2.11", + "@angular/platform-browser": "18.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.10.tgz", - "integrity": "sha512-V5yslbkFrBhGr70yK7Bauk8186Di9W8OQtR41fEvPEHecQ5IWjnXzPabl0rjOPtpcAARAYnbIq3sqjQygiX6fw==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.11.tgz", + "integrity": "sha512-kI36Wfvw3E01Xox/H535/rrSTiDfzQeXATFR5i5vqc94XWUdQG67e4X6ybnqFUrezXoLPTULHp+5Di896YFPzw==", "dev": true, "license": "MIT", "engines": { @@ -844,9 +844,9 @@ } }, "node_modules/@angular/localize": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-18.2.10.tgz", - "integrity": "sha512-AOdQn4B/yqei/k0qpd4fVX/WXOzYfLWnp0KtG5q3hyWwMy2MfJ5rfCX0WiwNICzzIRBCjLsYmm8/qxNizK6ORg==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-18.2.11.tgz", + "integrity": "sha512-ZGemNURZmhZcZhc0i4SzAjyckkvf6Xv24U7DDJ/TpgHQWP9/pu5QExFa2OuGoJJcZRqUrzEmPrbu+4a/xggaQw==", "license": "MIT", "dependencies": { "@babel/core": "7.25.2", @@ -863,21 +863,21 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.10", - "@angular/compiler-cli": "18.2.10" + "@angular/compiler": "18.2.11", + "@angular/compiler-cli": "18.2.11" } }, "node_modules/@angular/material": { - "version": "18.2.11", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.11.tgz", - "integrity": "sha512-VPfnpwmg6p5DsH1UMfOXjKA+qAbUx6nyinGWpx4+ntr/T1oEhRk5CnoOtVS0Xk0rnRSbEF6ayjDBH2YPR9ol3A==", + "version": "18.2.12", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.12.tgz", + "integrity": "sha512-5q8Os6i3D1e3qN+RqP95UgIR+Kx3goncSSYDeT6yPNrdrcqcWdyDPXGK6UsZqTTx/CJee/I7ZxgVVK1YDoVASQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.2.11", + "@angular/cdk": "18.2.12", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -886,9 +886,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.10.tgz", - "integrity": "sha512-zKyRKFr3AaEA4SE/DEeb5FWHJutT26avHZog6ZGDkMeMN12zMtSqjPuTSgmDXCWleoOkzbb+nhAQ+fK/EyGyPA==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.11.tgz", + "integrity": "sha512-bzcP0QdPT/ncTxOx0t7901z5m0wDmkraTo/es4g8reV6VK9Ptv0QDuD8aDvrHh7sLCX5VgwDF9ohc6S2TpYUCA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -897,9 +897,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.10", - "@angular/common": "18.2.10", - "@angular/core": "18.2.10" + "@angular/animations": "18.2.11", + "@angular/common": "18.2.11", + "@angular/core": "18.2.11" }, "peerDependenciesMeta": { "@angular/animations": { @@ -908,9 +908,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.10.tgz", - "integrity": "sha512-syKyOTgfQnMxfpDRP1khTSPZ5dsMgA8YQwNF6KsB3eZQl15CKSka7bzjMOUWeZ8M3WShOp1AzTf0MfwNeh0UBA==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.11.tgz", + "integrity": "sha512-a30U4ZdTZSvL17xWwOq6xh9ToCDP2K7/j1HTJFREObbuAtZTa/6IVgBUM6oOMNQ43kHkT6Mr9Emkgf9iGtWwfw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -919,16 +919,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.10", - "@angular/compiler": "18.2.10", - "@angular/core": "18.2.10", - "@angular/platform-browser": "18.2.10" + "@angular/common": "18.2.11", + "@angular/compiler": "18.2.11", + "@angular/core": "18.2.11", + "@angular/platform-browser": "18.2.11" } }, "node_modules/@angular/router": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.10.tgz", - "integrity": "sha512-ZqJgOGOfvW0epsc7pIo7DffZqYHo3O9aUCVepZAhOxqtjF/sfhX2fy+A0xopTIiR0eM3LrT823V+2hjlBHj+CA==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.11.tgz", + "integrity": "sha512-xh4+t4pNBWxeH1a6GIoEGVSRZO4NDKK8q6b+AzB5GBgKsYgOz2lc74RXIPA//pK3aHrS9qD4sJLlodwgE/1+bA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -937,16 +937,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.10", - "@angular/core": "18.2.10", - "@angular/platform-browser": "18.2.10", + "@angular/common": "18.2.11", + "@angular/core": "18.2.11", + "@angular/platform-browser": "18.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.10.tgz", - "integrity": "sha512-hfZ5XqsmtZg5HdHoPFORAzGV0uX1DcZ894op79i4lp6HOoIgYMQ+ajB6Fa7HVUdXS3esFUc2iw4nBgSR0ZssCg==", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.11.tgz", + "integrity": "sha512-FZ1yHCAmmbg+NYNFtvrZE8RzgsSnWgsL2ef+mvlfC/fxyu4pyoZT4+ZshwN7k55L++6M/RgdV7cZevPN4qGNrA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -958,8 +958,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.10", - "@angular/core": "18.2.10" + "@angular/common": "18.2.11", + "@angular/core": "18.2.11" } }, "node_modules/@babel/code-frame": { @@ -3698,9 +3698,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz", - "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5352,9 +5352,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.0.7.tgz", - "integrity": "sha512-h+B5S+tkHObtKj2pQYUkbiaiYdcim95iS27CaZgasq7FiIXQOoupQ6jrIKduQJKx+GfYbuCCd60zrAYbkyvxiA==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.0.12.tgz", + "integrity": "sha512-HsaDoAmzLPE2vHal2eNYvH7x6NCfHjUblm8WDD12Q/uCdTBvDTZqd7P+bukEH+2FhY89Dn/1fy59vKkA+rcB/g==", "dev": true, "license": "MIT", "dependencies": { @@ -5398,9 +5398,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.0.7.tgz", - "integrity": "sha512-QLD0DlyT343okCMHNg4EyM1s9HWU55RGiD36OxopaAmDcJ45j4p7IgmYlwbWCC5TyjIXSnLnZyIAs5DrqaKwrg==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.0.12.tgz", + "integrity": "sha512-iwEDUTKx0n2S6Nz9gc9ShrfBw0MG87U0YIu2x/09tKOSkcsw90QKy54qN/6WNoFIE41Kt3U+dYtWi+NdLRE9kw==", "cpu": [ "arm64" ], @@ -5415,9 +5415,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.0.7.tgz", - "integrity": "sha512-Sc2h+eAunGKiqpumvjVrrt0LRtk/l6Fev/633WP55svSNuY9muB/MPcP9v/oLyAD1flDnzvIWeUT6eEw6oqvZw==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.0.12.tgz", + "integrity": "sha512-JYFNf0yPReejaooQAAIMsjWDGENT777wDXj45e7JQUMM4t6NOMpGBj4qUFyc6a/jXT+/bCGEj4N7VDZDZiogGA==", "cpu": [ "x64" ], @@ -5432,9 +5432,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.0.7.tgz", - "integrity": "sha512-Sp0pMVGj4LuPaO6oL9R5gsIPjIm8Xt3IyP9f+5uwtqjipiPriw0IdD2uV9bDjPPs0QQc15ncz+eSk30p836qpA==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.0.12.tgz", + "integrity": "sha512-892n8o7vxdmE7pol3ggV78YHlP25p6Y/Z2x69nnC3BBTpWmesyd6lbEmamANofD5KcKCmT1HquC3m6rCT7akHw==", "cpu": [ "x64" ], @@ -5449,9 +5449,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.0.7.tgz", - "integrity": "sha512-hs15RudLvFkfBtUL20M9Hr0wn8FLije3EGn1j9iPmo8EiZBZn4mDAywwPZXmDiAuxKTU8LKBLT/xJczNe8gzbQ==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.0.12.tgz", + "integrity": "sha512-ZPcdYIVAc5JMtmvroJOloI9CJgtwBOGr7E7mO1eT44zs5av0j/QMIj6GSDdvJ7fx+I7TmT4mDiu3s6rLO+/JjA==", "cpu": [ "arm" ], @@ -5466,9 +5466,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.0.7.tgz", - "integrity": "sha512-t1NSxBvWpyjb9VnbxAN2Oka3JXEKtbQv//aLOer8++8Y+e6INDOHmRADyyp5BcLwBpsaP/lWLKcDa6vlsMzXTg==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.0.12.tgz", + "integrity": "sha512-TadGwwUKS5WQg2YOMb2WuuVG1k14miSdB9qJOcAX5MGdOiQ1fpV00ph+kMWZSsCCo6N7sKxmvXXXdsUUFSDGjg==", "cpu": [ "arm64" ], @@ -5483,9 +5483,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.0.7.tgz", - "integrity": "sha512-lLAzyxQeeALMKM2uBA9728gZ0bihy6rfhMe+fracV1xjGLfcHEa/hNmhXNMp9Vf80sZJ50EUeW6mUPluLROBNQ==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.0.12.tgz", + "integrity": "sha512-EE2HQjgY87/s9+PQ27vbYyDEXFZ4Qot+O8ThVDVuMI/2dosmWs6C4+YEm3VYG+CT31MVwe/vHKXbDlZgkROMuA==", "cpu": [ "arm64" ], @@ -5500,9 +5500,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.0.7.tgz", - "integrity": "sha512-H9LfEoHEa0ZHnfifseY24RPErtGaXSoWTuW9JAPylUXeYOy66i/FwxwbjsG5BMFJCnL1LGXPN9Oirh442lcsbQ==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.0.12.tgz", + "integrity": "sha512-gITJ2g6dH2qvGrI2CHHRyd3soVrJyQQGkqtJnWq04ge+YDy/KniXR2ThQ93LI/QLAxKrKOe3qmIIaNdcdDYnjA==", "cpu": [ "x64" ], @@ -5517,9 +5517,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.0.7.tgz", - "integrity": "sha512-2VsTSLZZVGHmN2BkSaLoOp/Byj9j20so/Ne/TZg4Lo/HBp0iDSOmUtbPAnkJOS6UiAPvQtb9zqzRKPphhDhnzg==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.0.12.tgz", + "integrity": "sha512-vOoCrjL44nFZ5N8a4UAIYELnf/tq1dRaLEhSV+P0hKTEtwONj4k8crfU/2HifG1iU7p3AWJLEyaddMoINhB/2g==", "cpu": [ "x64" ], @@ -5534,9 +5534,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.0.7.tgz", - "integrity": "sha512-lmH7xTPHJe2q/P2tnHEjOTdwzNxnFV08Kp2z6sUU0lAfJ79mye2nydGBDtFq9CeFF1Q6vfCSDTRu5fbxAZ9/Xg==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.0.12.tgz", + "integrity": "sha512-gKdaul23bdRnh493iAd6pSLPSW54VBuEv2zPL86cgprLOcEZiGM5BLJWQguKHCib6dYKaIP4CUIs7i7vhEID+A==", "cpu": [ "arm64" ], @@ -5551,9 +5551,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.0.7.tgz", - "integrity": "sha512-U8LY1O3XA1yD8FoCM0ozT0DpFJdei2NNSrp/5lBXn5KHb2nkZ8DQ1zh7RKvMhEMwDNfNGbM7JsaBTr+fP6eYJg==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.0.12.tgz", + "integrity": "sha512-R1pz4kAG0Ok0EDxXhHwKM3ZZcK2nLycuR9SDrq2Ldp2knvbFf4quSjWyAQaiofJXo179+noa7o5tZDZbNjBYMw==", "cpu": [ "x64" ], @@ -5568,10 +5568,11 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "dependencies": { @@ -5588,24 +5589,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", "cpu": [ "arm64" ], @@ -5624,9 +5626,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", "cpu": [ "arm64" ], @@ -5645,9 +5647,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", "cpu": [ "x64" ], @@ -5666,9 +5668,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", "cpu": [ "x64" ], @@ -5687,9 +5689,30 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", "cpu": [ "arm" ], @@ -5708,9 +5731,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", "cpu": [ "arm64" ], @@ -5729,9 +5752,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", "cpu": [ "arm64" ], @@ -5750,9 +5773,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", "cpu": [ "x64" ], @@ -5771,9 +5794,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", "cpu": [ "x64" ], @@ -5792,9 +5815,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", "cpu": [ "arm64" ], @@ -5813,9 +5836,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", "cpu": [ "ia32" ], @@ -5834,9 +5857,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", "cpu": [ "x64" ], @@ -6209,73 +6232,73 @@ } }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.36.0.tgz", - "integrity": "sha512-AVJ9GmQW7jYxaal6hjQnnktsDNype01ajVC4q1RyOn1SfzSnXg6mXwj4xm4ovuJV+aBI7fAZJ55vEX5ASuP0ZA==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.37.1.tgz", + "integrity": "sha512-OSR/V5GCsSCG7iapWtXCT/y22uo3HlawdEgfM1NIKk1mkP15UyGQtGEzZDdih2H+SNuX1mp9jQLTjr5FFp1A5w==", "license": "MIT", "dependencies": { - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.36.0.tgz", - "integrity": "sha512-aAMTm3uDBj8Ta7FwoohpLmJOpWzpWXvvtTbtmSgkeCtPJLUS8DZDCTZ9uCILUkpuYrv2savRUHsdPkxNjgL8FA==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.37.1.tgz", + "integrity": "sha512-Se25NXbSapgS2S+JssR5YZ48b3OY4UGmAuBOafgnMW91LXMxRNWRbehZuNUmjjHwuywABMxjgu+Yp5uJDATX+g==", "license": "MIT", "dependencies": { - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.36.0.tgz", - "integrity": "sha512-lbic98GsSkDeinQDix54tBFEgHUlmBtO+HjXECk9jIE0vOzR4As20/s5ta46t1rKMLlnxOtJuT5jKXeUYogBUw==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.37.1.tgz", + "integrity": "sha512-E/Plhisk/pXJjOdOU12sg8m/APTXTA21iEniidP6jW3/+O0tD/H/UovEqa4odNTqxPMa798xHQSQNt5loYiaLA==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.36.0", - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry-internal/browser-utils": "8.37.1", + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.36.0.tgz", - "integrity": "sha512-KJPLf+qYdrQdmouoAqIPZ2KeapIBlHWbzNdQqNxJFWLHFFjpLUtt0b+87ruvbA/q3NYy2fDwD7EB0tGS1RHBaA==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.37.1.tgz", + "integrity": "sha512-1JLAaPtn1VL5vblB0BMELFV0D+KUm/iMGsrl4/JpRm0Ws5ESzQl33DhXVv1IX/ZAbx9i14EjR7MG9+Hj70tieQ==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.36.0", - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry-internal/replay": "8.37.1", + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/angular": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-8.36.0.tgz", - "integrity": "sha512-9RfJOlhvqzRq4X/aOgZPzDANp+Gy8u+JFKnuWZ/S2R5qZ2kGrzfvxPCULhHuPHZYwwbi8IOt5DkYAorY+glrew==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-8.37.1.tgz", + "integrity": "sha512-N6IdxEUwVlB5qqd7UR0fiEvWoJrNA4rcdKot0W9uN3G9lqmff5EB3EUIvw9xFZJgZ695WNVZ1f+irvqXt+rYJA==", "license": "MIT", "dependencies": { - "@sentry/browser": "8.36.0", - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0", + "@sentry/browser": "8.37.1", + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1", "tslib": "^2.4.1" }, "engines": { @@ -6289,52 +6312,52 @@ } }, "node_modules/@sentry/browser": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.36.0.tgz", - "integrity": "sha512-bLrQNe+wD4DkCfB8OD5TF3Rr8KA2+aTo5wF3t3Bf6KVn8//iX1ia1hhtptYiRnbRkG/0AEPxlqL6XfPZYVPQ5A==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.37.1.tgz", + "integrity": "sha512-5ym+iGiIpjIKKpMWi9S3/tXh9xneS+jqxwRTJqed3cb8i4ydfMAAP8sM3U8xMCWWABpWyIUW+fpewC0tkhE1aQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.36.0", - "@sentry-internal/feedback": "8.36.0", - "@sentry-internal/replay": "8.36.0", - "@sentry-internal/replay-canvas": "8.36.0", - "@sentry/core": "8.36.0", - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry-internal/browser-utils": "8.37.1", + "@sentry-internal/feedback": "8.37.1", + "@sentry-internal/replay": "8.37.1", + "@sentry-internal/replay-canvas": "8.37.1", + "@sentry/core": "8.37.1", + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.36.0.tgz", - "integrity": "sha512-cbq1WQyRqc/+YpPhjwQxfniUM3ZxmO3Pm1oisTB8dw6mlbgQfGD6aznEIjXWWJY6k6acewJlMUx09N7DnprtBw==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.37.1.tgz", + "integrity": "sha512-82csXby589iDupM3VgCHJeWZagUyEEaDnbFcoZ/Z91QX2Sjq8FcF5OsforoXjw09i0XTFqlkFAnQVpDBmMXcpQ==", "license": "MIT", "dependencies": { - "@sentry/types": "8.36.0", - "@sentry/utils": "8.36.0" + "@sentry/types": "8.37.1", + "@sentry/utils": "8.37.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/types": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.36.0.tgz", - "integrity": "sha512-K1pVFfdGHw115RzGHpwSOqoEPeayn4N1F9IfM0kxrYpQSbFT1X29eak88GBfC8gPiLEF0iFGlSaQ4ERmF7oRcA==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.37.1.tgz", + "integrity": "sha512-ryMOTROLSLINKFEbHWvi7GigNrsQhsaScw2NddybJGztJQ5UhxIGESnxGxWCufBmWFDwd7+5u0jDPCVUJybp7w==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.36.0.tgz", - "integrity": "sha512-oJ3EDPj0I00z+AwC3EWBpSidXYUoKW0Id8MfMQP5Hflniz3gif7UEReblT+FJgPEVo6+6uNzAncY0MuNMxmDKQ==", + "version": "8.37.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.37.1.tgz", + "integrity": "sha512-Qtn2IfpII12K17txG/ZtTci35XYjYi4CxbQ3j7nXY7toGv/+MqPXwV5q2i9g94XaSXlE5Wy9/hoCZoZpZs/djA==", "license": "MIT", "dependencies": { - "@sentry/types": "8.36.0" + "@sentry/types": "8.37.1" }, "engines": { "node": ">=14.18" @@ -6544,6 +6567,12 @@ "internmap": "^1.0.0" } }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, "node_modules/@swimlane/ngx-graph/node_modules/d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", @@ -6593,6 +6622,12 @@ "d3-array": "2" } }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, "node_modules/@swimlane/ngx-graph/node_modules/internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", @@ -7014,9 +7049,9 @@ } }, "node_modules/@types/node": { - "version": "22.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", - "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7050,9 +7085,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", "dev": true, "license": "MIT" }, @@ -7220,17 +7255,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", - "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", + "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/type-utils": "8.12.2", - "@typescript-eslint/utils": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/type-utils": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -7254,16 +7289,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz", - "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", + "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/typescript-estree": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", "debug": "^4.3.4" }, "engines": { @@ -7283,14 +7318,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", - "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2" + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7301,14 +7336,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz", - "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", + "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.12.2", - "@typescript-eslint/utils": "8.12.2", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/utils": "8.13.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -7326,9 +7361,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", - "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", "dev": true, "license": "MIT", "engines": { @@ -7340,14 +7375,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", - "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -7369,16 +7404,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", - "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", + "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/typescript-estree": "8.12.2" + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7392,13 +7427,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", - "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/types": "8.13.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -7438,73 +7473,73 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { @@ -7512,9 +7547,9 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7522,79 +7557,79 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -7620,9 +7655,9 @@ "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -7630,7 +7665,7 @@ "tslib": "^2.4.0" }, "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" } }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { @@ -8763,9 +8798,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001677", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", - "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", + "version": "1.0.30001679", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001679.tgz", + "integrity": "sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==", "funding": [ { "type": "opencollective", @@ -9478,9 +9513,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, "license": "MIT", "dependencies": { @@ -9667,10 +9702,13 @@ } }, "node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", - "license": "BSD-3-Clause" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/d3-drag": { "version": "3.0.0", @@ -9706,6 +9744,18 @@ "d3-timer": "1" } }, + "node_modules/d3-force/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-force/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, "node_modules/d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", @@ -9874,10 +9924,13 @@ "license": "ISC" }, "node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", - "license": "BSD-3-Clause" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/d3-transition": { "version": "3.0.1", @@ -10335,9 +10388,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", - "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==", + "version": "1.5.55", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz", + "integrity": "sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==", "license": "ISC" }, "node_modules/emittery": { @@ -10859,9 +10912,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "28.8.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", - "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", + "version": "28.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.9.0.tgz", + "integrity": "sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16277,16 +16330,16 @@ "license": "MIT" }, "node_modules/nx": { - "version": "20.0.7", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.0.7.tgz", - "integrity": "sha512-Un7eMAqTx+gRB4j6hRWafMvOso4pmFg3Ff+BmfFOgqD8XdE+xV/+Ke9mPTfi4qYD5eQiY1lO15l3dRuBH7+AJw==", + "version": "20.0.12", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.0.12.tgz", + "integrity": "sha512-pQ7Rwb2Qlhr+fEamd0qc4VsL/aKjVJ0MXPsosuhdZobLJQOKHefe+nXSSZ1Jy19VM3RRpxUKFneD/V2jvs3qDA==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", + "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", "axios": "^1.7.4", "chalk": "^4.1.0", @@ -16322,16 +16375,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.0.7", - "@nx/nx-darwin-x64": "20.0.7", - "@nx/nx-freebsd-x64": "20.0.7", - "@nx/nx-linux-arm-gnueabihf": "20.0.7", - "@nx/nx-linux-arm64-gnu": "20.0.7", - "@nx/nx-linux-arm64-musl": "20.0.7", - "@nx/nx-linux-x64-gnu": "20.0.7", - "@nx/nx-linux-x64-musl": "20.0.7", - "@nx/nx-win32-arm64-msvc": "20.0.7", - "@nx/nx-win32-x64-msvc": "20.0.7" + "@nx/nx-darwin-arm64": "20.0.12", + "@nx/nx-darwin-x64": "20.0.12", + "@nx/nx-freebsd-x64": "20.0.12", + "@nx/nx-linux-arm-gnueabihf": "20.0.12", + "@nx/nx-linux-arm64-gnu": "20.0.12", + "@nx/nx-linux-arm64-musl": "20.0.12", + "@nx/nx-linux-x64-gnu": "20.0.12", + "@nx/nx-linux-x64-musl": "20.0.12", + "@nx/nx-win32-arm64-msvc": "20.0.12", + "@nx/nx-win32-x64-msvc": "20.0.12" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -16535,9 +16588,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, "license": "MIT", "engines": { @@ -17051,9 +17104,9 @@ } }, "node_modules/path2d": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.1.tgz", - "integrity": "sha512-Fl2z/BHvkTNvkuBzYTpTuirHZg6wW9z8+4SND/3mDTEcYbbNKWAy21dz9D3ePNNwrrK8pqZO5vLPZ1hLF6T7XA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.2.tgz", + "integrity": "sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==", "license": "MIT", "optional": true, "engines": { @@ -17421,9 +17474,9 @@ "license": "MIT" }, "node_modules/posthog-js": { - "version": "1.180.1", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.180.1.tgz", - "integrity": "sha512-LV65maVrpqkAh0wu32YvU7FpCSEjg6o+sZFYCs1+6tnEa9VvXuz8J6ReLiyRpJABI4j1qX/PB2jaVY5tDbLalQ==", + "version": "1.181.0", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.181.0.tgz", + "integrity": "sha512-bI+J+f4E8x4JwbGtG6LReQv1Xvss01F6cs7UDlvffHySpVhNq4ptkNjV88B92IVEsrCtNYhy/TjFnGxk6RN0Qw==", "license": "MIT", "dependencies": { "core-js": "^3.38.1", @@ -20097,22 +20150,22 @@ "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.58.tgz", - "integrity": "sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==", + "version": "6.1.59", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.59.tgz", + "integrity": "sha512-472ilPxsRuqBBpn+KuRBHJvZhk6tTo4yTVsmODrLBNLwRYJPkDfMEHivgNwp5iEl+cbrZzzRtLKRxZs7+QKkRg==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.58" + "tldts-core": "^6.1.59" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.58.tgz", - "integrity": "sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==", + "version": "6.1.59", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.59.tgz", + "integrity": "sha512-EiYgNf275AQyVORl8HQYYe7rTVnmLb4hkWK7wAk/12Ksy5EiHpmUmTICa4GojookBPC8qkLMBKKwCmzNA47ZPQ==", "dev": true, "license": "MIT" }, @@ -21412,6 +21465,12 @@ "d3-timer": "^1.0.5" } }, + "node_modules/webcola/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, "node_modules/webcola/node_modules/d3-drag": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", @@ -21437,6 +21496,12 @@ "d3-path": "1" } }, + "node_modules/webcola/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 2b3b73c8e016..6ffc53b8f45f 100644 --- a/package.json +++ b/package.json @@ -13,18 +13,18 @@ "node_modules" ], "dependencies": { - "@angular/animations": "18.2.10", - "@angular/cdk": "18.2.11", - "@angular/common": "18.2.10", - "@angular/compiler": "18.2.10", - "@angular/core": "18.2.10", - "@angular/forms": "18.2.10", - "@angular/localize": "18.2.10", - "@angular/material": "18.2.11", - "@angular/platform-browser": "18.2.10", - "@angular/platform-browser-dynamic": "18.2.10", - "@angular/router": "18.2.10", - "@angular/service-worker": "18.2.10", + "@angular/animations": "18.2.11", + "@angular/cdk": "18.2.12", + "@angular/common": "18.2.11", + "@angular/compiler": "18.2.11", + "@angular/core": "18.2.11", + "@angular/forms": "18.2.11", + "@angular/localize": "18.2.11", + "@angular/material": "18.2.12", + "@angular/platform-browser": "18.2.11", + "@angular/platform-browser-dynamic": "18.2.11", + "@angular/router": "18.2.11", + "@angular/service-worker": "18.2.11", "@ctrl/ngx-emoji-mart": "9.2.0", "@danielmoncada/angular-datetime-picker": "18.1.0", "@fingerprintjs/fingerprintjs": "4.5.1", @@ -36,7 +36,7 @@ "@ng-bootstrap/ng-bootstrap": "17.0.1", "@ngx-translate/core": "16.0.3", "@ngx-translate/http-loader": "16.0.0", - "@sentry/angular": "8.36.0", + "@sentry/angular": "8.37.1", "@siemens/ngx-datatable": "22.4.1", "@swimlane/ngx-charts": "20.5.0", "@swimlane/ngx-graph": "8.4.0", @@ -68,7 +68,7 @@ "ngx-webstorage": "18.0.0", "papaparse": "5.4.1", "pdfjs-dist": "4.8.69", - "posthog-js": "1.180.1", + "posthog-js": "1.181.0", "rxjs": "7.8.1", "simple-statistics": "7.8.7", "smoothscroll-polyfill": "0.4.4", @@ -100,9 +100,6 @@ "eslint-plugin-deprecation": { "eslint": "^9.14.0" }, - "eslint-plugin-jest": { - "@typescript-eslint/eslint-plugin": "^8.12.0" - }, "express": "5.0.1", "jsdom": "25.0.1", "postcss": "8.4.47", @@ -125,9 +122,9 @@ "@angular-eslint/schematics": "18.4.0", "@angular-eslint/template-parser": "18.4.0", "@angular/cli": "18.2.11", - "@angular/compiler-cli": "18.2.10", - "@angular/language-service": "18.2.10", - "@sentry/types": "8.36.0", + "@angular/compiler-cli": "18.2.11", + "@angular/language-service": "18.2.11", + "@sentry/types": "8.37.1", "@types/crypto-js": "4.2.2", "@types/d3-shape": "3.1.6", "@types/dompurify": "3.0.5", @@ -135,18 +132,18 @@ "@types/jest": "29.5.14", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/node": "22.8.7", + "@types/node": "22.9.0", "@types/papaparse": "5.3.15", "@types/smoothscroll-polyfill": "0.3.4", "@types/sockjs-client": "1.5.4", "@types/turndown": "5.0.5", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.12.2", - "@typescript-eslint/parser": "8.12.2", + "@typescript-eslint/eslint-plugin": "8.13.0", + "@typescript-eslint/parser": "8.13.0", "eslint": "9.14.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-deprecation": "3.0.0", - "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jest": "28.9.0", "eslint-plugin-jest-extended": "2.4.0", "eslint-plugin-prettier": "5.2.1", "folder-hash": "4.0.4", diff --git a/src/main/java/de/tum/cit/aet/artemis/plagiarism/service/ProgrammingPlagiarismDetectionService.java b/src/main/java/de/tum/cit/aet/artemis/plagiarism/service/ProgrammingPlagiarismDetectionService.java index e0707ca62144..6760538078c7 100644 --- a/src/main/java/de/tum/cit/aet/artemis/plagiarism/service/ProgrammingPlagiarismDetectionService.java +++ b/src/main/java/de/tum/cit/aet/artemis/plagiarism/service/ProgrammingPlagiarismDetectionService.java @@ -31,6 +31,7 @@ import de.jplag.c.CLanguage; import de.jplag.clustering.ClusteringOptions; import de.jplag.cpp.CPPLanguage; +import de.jplag.csharp.CSharpLanguage; import de.jplag.exceptions.ExitException; import de.jplag.java.JavaLanguage; import de.jplag.javascript.JavaScriptLanguage; @@ -315,6 +316,7 @@ private Language getJPlagProgrammingLanguage(ProgrammingExercise programmingExer return switch (programmingExercise.getProgrammingLanguage()) { case C -> new CLanguage(); case C_PLUS_PLUS -> new CPPLanguage(); + case C_SHARP -> new CSharpLanguage(); case JAVA -> new JavaLanguage(); case JAVASCRIPT -> new JavaScriptLanguage(); case KOTLIN -> new KotlinLanguage(); @@ -323,7 +325,7 @@ private Language getJPlagProgrammingLanguage(ProgrammingExercise programmingExer case RUST -> new RustLanguage(); case SWIFT -> new SwiftLanguage(); case TYPESCRIPT -> new TypeScriptLanguage(); - case EMPTY, PHP, DART, HASKELL, ASSEMBLER, OCAML, C_SHARP, SQL, GO, MATLAB, BASH, VHDL, RUBY, POWERSHELL, ADA -> throw new BadRequestAlertException( + case EMPTY, PHP, DART, HASKELL, ASSEMBLER, OCAML, SQL, GO, MATLAB, BASH, VHDL, RUBY, POWERSHELL, ADA -> throw new BadRequestAlertException( "Programming language " + programmingExercise.getProgrammingLanguage() + " not supported for plagiarism check.", "ProgrammingExercise", "notSupported"); }; } diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/domain/ProgrammingLanguage.java b/src/main/java/de/tum/cit/aet/artemis/programming/domain/ProgrammingLanguage.java index 71f00210c2df..a2a11cfc36d8 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/domain/ProgrammingLanguage.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/domain/ProgrammingLanguage.java @@ -41,6 +41,7 @@ public enum ProgrammingLanguage { ASSEMBLER, C, C_PLUS_PLUS, + C_SHARP, HASKELL, JAVA, JAVASCRIPT, diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/TemplateUpgradePolicyService.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/TemplateUpgradePolicyService.java index 07dc44fada0e..2ec466bb943c 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/TemplateUpgradePolicyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/TemplateUpgradePolicyService.java @@ -32,9 +32,8 @@ public TemplateUpgradePolicyService(JavaTemplateUpgradeService javaRepositoryUpg public TemplateUpgradeService getUpgradeService(ProgrammingLanguage programmingLanguage) { return switch (programmingLanguage) { case JAVA -> javaRepositoryUpgradeService; - case KOTLIN, PYTHON, C, HASKELL, VHDL, ASSEMBLER, SWIFT, OCAML, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT -> defaultRepositoryUpgradeService; - case C_SHARP, SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> - throw new UnsupportedOperationException("Unsupported programming language: " + programmingLanguage); + case KOTLIN, PYTHON, C, HASKELL, VHDL, ASSEMBLER, SWIFT, OCAML, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT, C_SHARP -> defaultRepositoryUpgradeService; + case SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> throw new UnsupportedOperationException("Unsupported programming language: " + programmingLanguage); }; } } diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/ci/ContinuousIntegrationService.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/ci/ContinuousIntegrationService.java index ec8e2165c46a..6aaeb9602110 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/ci/ContinuousIntegrationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/ci/ContinuousIntegrationService.java @@ -219,9 +219,8 @@ enum RepositoryCheckoutPath implements CustomizableCheckoutPath { @Override public String forProgrammingLanguage(ProgrammingLanguage language) { return switch (language) { - case JAVA, PYTHON, C, HASKELL, KOTLIN, VHDL, ASSEMBLER, SWIFT, OCAML, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT -> "assignment"; - case C_SHARP, SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> - throw new UnsupportedOperationException("Unsupported programming language: " + language); + case JAVA, PYTHON, C, HASKELL, KOTLIN, VHDL, ASSEMBLER, SWIFT, OCAML, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT, C_SHARP -> "assignment"; + case SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> throw new UnsupportedOperationException("Unsupported programming language: " + language); }; } }, @@ -231,9 +230,8 @@ public String forProgrammingLanguage(ProgrammingLanguage language) { public String forProgrammingLanguage(ProgrammingLanguage language) { return switch (language) { case JAVA, PYTHON, HASKELL, KOTLIN, SWIFT, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT -> ""; - case C, VHDL, ASSEMBLER, OCAML -> "tests"; - case C_SHARP, SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> - throw new UnsupportedOperationException("Unsupported programming language: " + language); + case C, VHDL, ASSEMBLER, OCAML, C_SHARP -> "tests"; + case SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> throw new UnsupportedOperationException("Unsupported programming language: " + language); }; } }, diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/JenkinsProgrammingLanguageFeatureService.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/JenkinsProgrammingLanguageFeatureService.java index 9c318267953e..0a35810528af 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/JenkinsProgrammingLanguageFeatureService.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/JenkinsProgrammingLanguageFeatureService.java @@ -2,6 +2,7 @@ import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C_PLUS_PLUS; +import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C_SHARP; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.EMPTY; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.HASKELL; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.JAVA; @@ -38,6 +39,7 @@ public JenkinsProgrammingLanguageFeatureService() { programmingLanguageFeatures.put(EMPTY, new ProgrammingLanguageFeature(EMPTY, false, false, false, false, false, List.of(), false, false)); programmingLanguageFeatures.put(C, new ProgrammingLanguageFeature(C, false, false, true, false, false, List.of(FACT, GCC), false, false)); programmingLanguageFeatures.put(C_PLUS_PLUS, new ProgrammingLanguageFeature(C_PLUS_PLUS, false, false, true, false, false, List.of(), false, false)); + programmingLanguageFeatures.put(C_SHARP, new ProgrammingLanguageFeature(C_SHARP, false, false, true, false, false, List.of(), false, false)); programmingLanguageFeatures.put(HASKELL, new ProgrammingLanguageFeature(HASKELL, false, false, false, false, true, List.of(), false, false)); programmingLanguageFeatures.put(JAVA, new ProgrammingLanguageFeature(JAVA, true, true, true, true, false, List.of(PLAIN_GRADLE, GRADLE_GRADLE, PLAIN_MAVEN, MAVEN_MAVEN, MAVEN_BLACKBOX), true, false)); diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/build_plan/JenkinsBuildPlanService.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/build_plan/JenkinsBuildPlanService.java index 6dc40e173e4e..3a1440d72e7f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/build_plan/JenkinsBuildPlanService.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/jenkins/build_plan/JenkinsBuildPlanService.java @@ -184,8 +184,8 @@ private JenkinsXmlConfigBuilder builderFor(ProgrammingLanguage programmingLangua throw new UnsupportedOperationException("Xcode templates are not available for Jenkins."); } return switch (programmingLanguage) { - case JAVA, KOTLIN, PYTHON, C, HASKELL, SWIFT, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT -> jenkinsBuildPlanCreator; - case VHDL, ASSEMBLER, OCAML, C_SHARP, SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> + case JAVA, KOTLIN, PYTHON, C, HASKELL, SWIFT, EMPTY, RUST, JAVASCRIPT, R, C_PLUS_PLUS, TYPESCRIPT, C_SHARP -> jenkinsBuildPlanCreator; + case VHDL, ASSEMBLER, OCAML, SQL, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP -> throw new UnsupportedOperationException(programmingLanguage + " templates are not available for Jenkins."); }; } diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/LocalCIProgrammingLanguageFeatureService.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/LocalCIProgrammingLanguageFeatureService.java index d86199310720..e0486750422f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/LocalCIProgrammingLanguageFeatureService.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/LocalCIProgrammingLanguageFeatureService.java @@ -4,6 +4,7 @@ import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.ASSEMBLER; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C_PLUS_PLUS; +import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.C_SHARP; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.EMPTY; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.HASKELL; import static de.tum.cit.aet.artemis.programming.domain.ProgrammingLanguage.JAVA; @@ -45,6 +46,7 @@ public LocalCIProgrammingLanguageFeatureService() { programmingLanguageFeatures.put(ASSEMBLER, new ProgrammingLanguageFeature(ASSEMBLER, false, false, false, false, false, List.of(), false, true)); programmingLanguageFeatures.put(C, new ProgrammingLanguageFeature(C, false, true, true, false, false, List.of(FACT, GCC), false, true)); programmingLanguageFeatures.put(C_PLUS_PLUS, new ProgrammingLanguageFeature(C_PLUS_PLUS, false, false, true, false, false, List.of(), false, true)); + programmingLanguageFeatures.put(C_SHARP, new ProgrammingLanguageFeature(C_SHARP, false, false, true, false, false, List.of(), false, true)); programmingLanguageFeatures.put(HASKELL, new ProgrammingLanguageFeature(HASKELL, true, false, false, false, true, List.of(), false, true)); programmingLanguageFeatures.put(JAVA, new ProgrammingLanguageFeature(JAVA, true, true, true, true, false, List.of(PLAIN_GRADLE, GRADLE_GRADLE, PLAIN_MAVEN, MAVEN_MAVEN), false, true)); diff --git a/src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizExerciseImportService.java b/src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizExerciseImportService.java index ffe7989c1e91..1b26865c641b 100644 --- a/src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizExerciseImportService.java +++ b/src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizExerciseImportService.java @@ -114,7 +114,8 @@ private QuizExercise copyQuizExerciseBasis(QuizExercise importedExercise) { newExercise.setRandomizeQuestionOrder(importedExercise.isRandomizeQuestionOrder()); newExercise.setAllowedNumberOfAttempts(importedExercise.getAllowedNumberOfAttempts()); newExercise.setRemainingNumberOfAttempts(importedExercise.getRemainingNumberOfAttempts()); - newExercise.setIsOpenForPractice(importedExercise.isIsOpenForPractice()); + // The new exercise should not immediately be open for practice + newExercise.setIsOpenForPractice(false); newExercise.setQuizMode(importedExercise.getQuizMode()); newExercise.setDuration(importedExercise.getDuration()); return newExercise; diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index e51e9f84e749..f2a2506dc1f5 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -77,7 +77,7 @@ artemis: default: "ls1tum/artemis-c-docker:latest" fact: "sharingcodeability/fact:latest" haskell: - default: "ghcr.io/uni-passau-artemis/artemis-haskell:v19.33.0" + default: "ghcr.io/uni-passau-artemis/artemis-haskell:v22.37.0" vhdl: default: "tizianleonhardt/era-artemis-vhdl:latest" assembler: @@ -95,6 +95,8 @@ artemis: default: "ghcr.io/ls1intum/artemis-r-docker:v1.0.0" c_plus_plus: default: "ghcr.io/ls1intum/artemis-cpp-docker:v1.0.0" + c_sharp: + default: "ghcr.io/ls1intum/artemis-csharp-docker:v1.0.0" typescript: default: "ghcr.io/ls1intum/artemis-javascript-docker:v1.0.0" diff --git a/src/main/resources/templates/aeolus/c_sharp/default.sh b/src/main/resources/templates/aeolus/c_sharp/default.sh new file mode 100644 index 000000000000..0653099f4b2a --- /dev/null +++ b/src/main/resources/templates/aeolus/c_sharp/default.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -e +export AEOLUS_INITIAL_DIRECTORY=${PWD} +build () { + echo '⚙️ executing build' + dotnet build "${testWorkingDirectory}" +} + +test () { + echo '⚙️ executing test' + dotnet test --logger=junit "${testWorkingDirectory}" +} + +main () { + if [[ "${1}" == "aeolus_sourcing" ]]; then + return 0 # just source to use the methods in the subshell, no execution + fi + local _script_name + _script_name=${BASH_SOURCE[0]:-$0} + cd "${AEOLUS_INITIAL_DIRECTORY}" + bash -c "source ${_script_name} aeolus_sourcing; build" + cd "${AEOLUS_INITIAL_DIRECTORY}" + bash -c "source ${_script_name} aeolus_sourcing; test" +} + +main "${@}" diff --git a/src/main/resources/templates/aeolus/c_sharp/default.yaml b/src/main/resources/templates/aeolus/c_sharp/default.yaml new file mode 100644 index 000000000000..344ec3ee04e8 --- /dev/null +++ b/src/main/resources/templates/aeolus/c_sharp/default.yaml @@ -0,0 +1,13 @@ +api: v0.0.1 +metadata: + name: "C#" + id: c_sharp +actions: + - name: build + script: dotnet build "${testWorkingDirectory}" + - name: test + script: dotnet test --logger=junit "${testWorkingDirectory}" + results: + - name: NUnit Test Results + path: "${testWorkingDirectory}/TestResults/TestResults.xml" + type: junit diff --git a/src/main/resources/templates/c_sharp/exercise/.gitignore b/src/main/resources/templates/c_sharp/exercise/.gitignore new file mode 100644 index 000000000000..104b54414e4d --- /dev/null +++ b/src/main/resources/templates/c_sharp/exercise/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/src/main/resources/templates/c_sharp/exercise/BubbleSort.cs b/src/main/resources/templates/c_sharp/exercise/BubbleSort.cs new file mode 100644 index 000000000000..3813e63ea4d4 --- /dev/null +++ b/src/main/resources/templates/c_sharp/exercise/BubbleSort.cs @@ -0,0 +1,13 @@ +namespace assignment; + +public class BubbleSort +{ + /// + /// Sorts dates with BubbleSort. + /// + /// the List of Dates to be sorted + public void PerformSort(List dates) + { + //TODO: implement + } +} \ No newline at end of file diff --git a/src/main/resources/templates/c_sharp/exercise/Client.cs b/src/main/resources/templates/c_sharp/exercise/Client.cs new file mode 100644 index 000000000000..78002ed11a6b --- /dev/null +++ b/src/main/resources/templates/c_sharp/exercise/Client.cs @@ -0,0 +1,90 @@ +namespace assignment; + +public static class Client +{ + // TODO: Implement BubbleSort + // TODO: Implement MergeSort + + // TODO: Create a ISortStrategy interface according to the UML class diagram + // TODO: Make the sorting algorithms implement this interface. + + // TODO: Create and implement a Context class according to the UML class diagram + // TODO: Create and implement a Policy class as described in the problem statement + + private const int ITERATIONS = 10; + + private const int RANDOM_FLOOR = 5; + + private const int RANDOM_CEILING = 15; + + private static readonly Random random = new(); + + /// + /// Main method. + /// Add code to demonstrate your implementation here. + /// + public static void Main() + { + // TODO: Init Context and Policy + + // Run multiple times to simulate different sorting strategies + for (int i = 0; i < ITERATIONS; i++) + { + List dates = CreateRandomDatesList(); + + // TODO: Configure context + + Console.Write("Unsorted Array of course dates = "); + PrintDateList(dates); + + // TODO: Sort dates + + Console.Write("Sorted Array of course dates = "); + PrintDateList(dates); + } + } + + /// + /// Generates a List of random Date objects with random List size between + /// RANDOM_FLOOR and RANDOM_CEILING. + /// + /// A List of random Date objects. + private static List CreateRandomDatesList() + { + int listLength = random.Next(RANDOM_FLOOR, RANDOM_CEILING); + List list = []; + + DateTime lowestDate = new(2024, 09, 15); + DateTime highestDate = new(2025, 01, 15); + + for (int i = 0; i < listLength; i++) + { + DateTime randomDate = RandomDateWithin(lowestDate, highestDate); + list.Add(randomDate); + } + return list; + } + + /// + /// Creates a random Date within the given range. + /// + /// the lower bound + /// the upper bound + /// A random DateTime within the given range. + private static DateTime RandomDateWithin(DateTime low, DateTime high) + { + long randomTick = random.NextInt64(low.Ticks, high.Ticks); + return new DateTime(randomTick); + } + + /// + /// Prints out the given Array of Date objects. + /// + /// list of the dates to print + private static void PrintDateList(List list) + { + var formattedDates = from date in list select date.ToString("O"); + var joinedDates = string.Join(", ", formattedDates); + Console.WriteLine($"[{joinedDates}]"); + } +} diff --git a/src/main/resources/templates/c_sharp/exercise/MergeSort.cs b/src/main/resources/templates/c_sharp/exercise/MergeSort.cs new file mode 100644 index 000000000000..c15e070fc2a5 --- /dev/null +++ b/src/main/resources/templates/c_sharp/exercise/MergeSort.cs @@ -0,0 +1,13 @@ +namespace assignment; + +public class MergeSort +{ + /// + /// Sorts dates with MergeSort. + /// + /// the List of Dates to be sorted + public void PerformSort(List input) + { + // TODO: implement + } +} diff --git a/src/main/resources/templates/c_sharp/exercise/assignment.csproj b/src/main/resources/templates/c_sharp/exercise/assignment.csproj new file mode 100644 index 000000000000..2150e3797ba5 --- /dev/null +++ b/src/main/resources/templates/c_sharp/exercise/assignment.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/src/main/resources/templates/c_sharp/readme b/src/main/resources/templates/c_sharp/readme new file mode 100644 index 000000000000..cbcc1db2c31e --- /dev/null +++ b/src/main/resources/templates/c_sharp/readme @@ -0,0 +1,91 @@ +# Sorting with the Strategy Pattern + +In this exercise, we want to implement sorting algorithms and choose them based on runtime specific variables. + +### Part 1: Sorting + +First, we need to implement two sorting algorithms, in this case `MergeSort` and `BubbleSort`. + +**You have the following tasks:** + +1. [task][Implement Bubble Sort](TestBubbleSort) +Implement the method `PerformSort(List)` in the class `BubbleSort`. Make sure to follow the Bubble Sort algorithm exactly. + +2. [task][Implement Merge Sort](TestMergeSort) +Implement the method `PerformSort(List)` in the class `MergeSort`. Make sure to follow the Merge Sort algorithm exactly. + +### Part 2: Strategy Pattern + +We want the application to apply different algorithms for sorting a `List` of `DateTime` objects. +Use the strategy pattern to select the right sorting algorithm at runtime. +Implement public readable and writable C# properties for the UML attributes and associations. + +**You have the following tasks:** + +1. [task][ISortStrategy Interface](TestISortStrategyType,TestISortStrategyMethods,TestMergeSortInterface,TestBubbleSortInterface) +Create a `ISortStrategy` interface and adjust the sorting algorithms so that they implement this interface. + +2. [task][Context Class](TestContextType,TestContextPropertyDates,TestContextPropertySortAlgorithm,TestContextMethods) +Create and implement a `Context` class following the below class diagram + +3. [task][Context Policy](TestPolicyType,TestPolicyConstructor,TestPolicyPropertyContext,TestPolicyMethods) +Create and implement a `Policy` class following the below class diagram with a simple configuration mechanism: + + 1. [task][Select MergeSort](TestUseMergeSortForBigList) + Select `MergeSort` when the List has more than 10 dates. + + 2. [task][Select BubbleSort](TestUseBubbleSortForSmallList) + Select `BubbleSort` when the List has less or equal 10 dates. + +4. Complete the `Client` class which demonstrates switching between two strategies at runtime. + +@startuml + +class Client { +} + +class Policy ##testsColor(TestPolicyType) { ++Policy() <> ++Configure() +} + +class Context ##testsColor(TestContextType) { +-dates: List ++Sort() +} + +interface ISortStrategy ##testsColor(TestISortStrategyType) { ++PerformSort(List) +} + +class BubbleSort { ++PerformSort(List) +} + +class MergeSort { ++PerformSort(List) +} + +MergeSort -up-|> ISortStrategy #testsColor(TestMergeSortInterface) +BubbleSort -up-|> ISortStrategy #testsColor(TestBubbleSortInterface) +Policy -right-> Context #testsColor(TestPolicyPropertyContext): context +Context -right-> ISortStrategy #testsColor(TestContextPropertySortAlgorithm): sortAlgorithm +Client .down.> Policy +Client .down.> Context + +hide empty fields +hide empty methods + +@enduml + + +### Part 3: Optional Challenges + +(These are not tested) + +1. Create a new class `QuickSort` that implements `SortStrategy` and implement the Quick Sort algorithm. + +2. Make the method `PerformSort(List)` generic, so that other objects can also be sorted by the same method. +**Hint:** Have a look at C# Generics and the interface `IComparable`. + +3. Think about a useful decision in `Policy` when to use the new `QuickSort` algorithm. diff --git a/src/main/resources/templates/c_sharp/solution/.gitignore b/src/main/resources/templates/c_sharp/solution/.gitignore new file mode 100644 index 000000000000..104b54414e4d --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/src/main/resources/templates/c_sharp/solution/BubbleSort.cs b/src/main/resources/templates/c_sharp/solution/BubbleSort.cs new file mode 100644 index 000000000000..dbd6eea52da4 --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/BubbleSort.cs @@ -0,0 +1,22 @@ +namespace assignment; + +public class BubbleSort : ISortStrategy +{ + /// + /// Sorts dates with BubbleSort. + /// + /// the List of Dates to be sorted + public void PerformSort(List dates) + { + for (int i = dates.Count - 1; i >= 0; i--) + { + for (int j = 0; j < i; j++) + { + if (dates[j] > dates[j + 1]) + { + (dates[j + 1], dates[j]) = (dates[j], dates[j + 1]); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/templates/c_sharp/solution/Client.cs b/src/main/resources/templates/c_sharp/solution/Client.cs new file mode 100644 index 000000000000..06f35877205b --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/Client.cs @@ -0,0 +1,85 @@ +namespace assignment; + +public static class Client +{ + + private const int ITERATIONS = 10; + + private const int RANDOM_FLOOR = 5; + + private const int RANDOM_CEILING = 15; + + private static readonly Random random = new(); + + /// + /// Main method. + /// Add code to demonstrate your implementation here. + /// + public static void Main() + { + // Init Context and Policy + Context sortingContext = new(); + Policy policy = new(sortingContext); + + // Run multiple times to simulate different sorting strategies + for (int i = 0; i < ITERATIONS; i++) + { + List dates = CreateRandomDatesList(); + + sortingContext.Dates = dates; + policy.Configure(); + + Console.Write("Unsorted Array of course dates = "); + PrintDateList(dates); + + sortingContext.Sort(); + + Console.Write("Sorted Array of course dates = "); + PrintDateList(dates); + } + } + + /// + /// Generates a List of random Date objects with random List size between + /// RANDOM_FLOOR and RANDOM_CEILING. + /// + /// A List of random Date objects. + private static List CreateRandomDatesList() + { + int listLength = random.Next(RANDOM_FLOOR, RANDOM_CEILING); + List list = []; + + DateTime lowestDate = new(2024, 09, 15); + DateTime highestDate = new(2025, 01, 15); + + for (int i = 0; i < listLength; i++) + { + DateTime randomDate = RandomDateWithin(lowestDate, highestDate); + list.Add(randomDate); + } + return list; + } + + /// + /// Creates a random Date within the given range. + /// + /// the lower bound + /// the upper bound + /// A random DateTime within the given range. + private static DateTime RandomDateWithin(DateTime low, DateTime high) + { + long randomTick = random.NextInt64(low.Ticks, high.Ticks); + return new DateTime(randomTick); + } + + /// + /// Prints out the given Array of Date objects. + /// + /// list of the dates to print + private static void PrintDateList(List list) + { + var formattedDates = from date in list select date.ToString("O"); + var joinedDates = string.Join(", ", formattedDates); + Console.WriteLine($"[{joinedDates}]"); + } +} diff --git a/src/main/resources/templates/c_sharp/solution/Context.cs b/src/main/resources/templates/c_sharp/solution/Context.cs new file mode 100644 index 000000000000..2b00b3795283 --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/Context.cs @@ -0,0 +1,23 @@ +namespace assignment; + +public class Context +{ + private ISortStrategy? sortAlgorithm; + private List? dates; + + public ISortStrategy? SortAlgorithm { get => sortAlgorithm; set => sortAlgorithm = value; } + public List? Dates { get => dates; set => dates = value; } + + /// + /// Runs the configured sort algorithm. + /// + public void Sort() + { + if (sortAlgorithm == null || dates == null) + { + throw new InvalidOperationException("SortAlgorithm and Dates have to be set before Sort() can be called"); + } + + sortAlgorithm.PerformSort(dates); + } +} diff --git a/src/main/resources/templates/c_sharp/solution/ISortStrategy.cs b/src/main/resources/templates/c_sharp/solution/ISortStrategy.cs new file mode 100644 index 000000000000..14853eb114c2 --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/ISortStrategy.cs @@ -0,0 +1,10 @@ +namespace assignment; + +public interface ISortStrategy +{ + /// + /// Sorts a list of Dates. + /// + /// the List of Dates to be sorted + void PerformSort(List dates); +} \ No newline at end of file diff --git a/src/main/resources/templates/c_sharp/solution/MergeSort.cs b/src/main/resources/templates/c_sharp/solution/MergeSort.cs new file mode 100644 index 000000000000..b145cdb6c1ea --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/MergeSort.cs @@ -0,0 +1,70 @@ +namespace assignment; + +public class MergeSort : ISortStrategy +{ + + /// + /// Wrapper method for the real MergeSort algorithm. + /// + /// the List of Dates to be sorted + public void PerformSort(List input) + { + Mergesort(input, 0, input.Count - 1); + } + + /// + /// Recursive merge sort method + /// + private void Mergesort(List input, int low, int high) + { + if (high - low < 1) + { + return; + } + + int mid = (low + high) / 2; + + Mergesort(input, low, mid); + Mergesort(input, mid + 1, high); + Merge(input, low, mid, high); + } + + /// + /// Merge method + /// + private void Merge(List input, int low, int middle, int high) + { + DateTime[] temp = new DateTime[high - low + 1]; + + int leftIndex = low; + int rightIndex = middle + 1; + int wholeIndex = 0; + + while (leftIndex <= middle && rightIndex <= high) + { + if (input[leftIndex] <= input[rightIndex]) + { + temp[wholeIndex] = input[leftIndex++]; + } + else + { + temp[wholeIndex] = input[rightIndex++]; + } + wholeIndex++; + } + + while (leftIndex <= middle) + { + temp[wholeIndex++] = input[leftIndex++]; + } + while (rightIndex <= high) + { + temp[wholeIndex++] = input[rightIndex++]; + } + + for (wholeIndex = 0; wholeIndex < temp.Length; wholeIndex++) + { + input[wholeIndex + low] = temp[wholeIndex]; + } + } +} diff --git a/src/main/resources/templates/c_sharp/solution/Policy.cs b/src/main/resources/templates/c_sharp/solution/Policy.cs new file mode 100644 index 000000000000..b166d74de599 --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/Policy.cs @@ -0,0 +1,35 @@ +namespace assignment; + +public class Policy +{ + private const int DATES_SIZE_THRESHOLD = 10; + + private Context context; + + public Policy(Context context) + { + this.context = context; + } + + public Context Context { get => context; set => context = value; } + + /// + /// Chooses a strategy depending on the number of date objects. + /// + public void Configure() + { + if (this.context.Dates == null) + { + throw new InvalidOperationException("Dates of Context has to be set before Configure() can be called"); + } + + if (this.context.Dates.Count > DATES_SIZE_THRESHOLD) + { + this.context.SortAlgorithm = new MergeSort(); + } + else + { + this.context.SortAlgorithm = new BubbleSort(); + } + } +} diff --git a/src/main/resources/templates/c_sharp/solution/assignment.csproj b/src/main/resources/templates/c_sharp/solution/assignment.csproj new file mode 100644 index 000000000000..2150e3797ba5 --- /dev/null +++ b/src/main/resources/templates/c_sharp/solution/assignment.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/src/main/resources/templates/c_sharp/test/.gitignore b/src/main/resources/templates/c_sharp/test/.gitignore new file mode 100644 index 000000000000..104b54414e4d --- /dev/null +++ b/src/main/resources/templates/c_sharp/test/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/src/main/resources/templates/c_sharp/test/BehaviorTest.cs b/src/main/resources/templates/c_sharp/test/BehaviorTest.cs new file mode 100644 index 000000000000..6fa934c2c807 --- /dev/null +++ b/src/main/resources/templates/c_sharp/test/BehaviorTest.cs @@ -0,0 +1,102 @@ +using System.Reflection; + +namespace test; + +public class BehaviorTest +{ + private readonly Assembly assignment = Assembly.Load("assignment"); + private readonly List unorderedDates = [ + new(2018, 11, 08), + new(2017, 04, 15), + new(2016, 02, 15), + new(2017, 09, 15), + ]; + private List dates; + + + [SetUp] + public void Setup() + { + dates = new List(unorderedDates); + } + + [Test, Timeout(1000)] + public void TestBubbleSort() + { + BubbleSort bubbleSort = new(); + + bubbleSort.PerformSort(dates); + + Assert.Multiple(() => + { + Assert.That(dates, Is.Ordered); + Assert.That(dates, Is.EquivalentTo(unorderedDates)); + }); + } + + [Test, Timeout(1000)] + public void TestMergeSort() + { + MergeSort mergeSort = new(); + + mergeSort.PerformSort(dates); + + Assert.Multiple(() => + { + Assert.That(dates, Is.Ordered); + Assert.That(dates, Is.EquivalentTo(unorderedDates)); + }); + } + + [Test, Timeout(1000)] + public void TestUseMergeSortForBigList() + { + List bigList = Enumerable.Repeat(new DateTime(), 11).ToList(); + + object? sortStrategy = ConfigurePolicyAndContext(bigList); + + Assert.That(sortStrategy, Is.InstanceOf()); + } + + [Test, Timeout(1000)] + public void TestUseBubbleSortForSmallList() + { + List smallList = Enumerable.Repeat(new DateTime(), 3).ToList(); + + object? sortStrategy = ConfigurePolicyAndContext(smallList); + + Assert.That(sortStrategy, Is.InstanceOf()); + } + + /// + /// Configures the sorting policy and context using reflection. + /// + /// The list of dates to be sorted + /// The configured sorting algorithm instance + private object? ConfigurePolicyAndContext(List dates) + { + Type? contextType = assignment.GetType("assignment.Context"); + Assert.That(contextType, Is.Not.Null); + object? contextInstance = Activator.CreateInstance(contextType); + Assert.That(contextInstance, Is.Not.Null); + + PropertyInfo? datesProperty = contextType.GetProperty("Dates"); + Assert.That(datesProperty, Is.Not.Null); + datesProperty.SetValue(contextInstance, dates); + + Type? policyType = assignment.GetType("assignment.Policy"); + Assert.That(policyType, Is.Not.Null); + object? policyInstance = Activator.CreateInstance(policyType, contextInstance); + Assert.That(policyInstance, Is.Not.Null); + + MethodInfo? configureMethod = policyType.GetMethod("Configure"); + Assert.That(configureMethod, Is.Not.Null); + configureMethod.Invoke(policyInstance, []); + + PropertyInfo? sortAlgorithmProperty = contextType.GetProperty("SortAlgorithm"); + Assert.That(sortAlgorithmProperty, Is.Not.Null); + object? sortAlgorithm = sortAlgorithmProperty.GetValue(contextInstance); + + return sortAlgorithm; + } +} \ No newline at end of file diff --git a/src/main/resources/templates/c_sharp/test/GlobalUsings.cs b/src/main/resources/templates/c_sharp/test/GlobalUsings.cs new file mode 100644 index 000000000000..469dcd6d648d --- /dev/null +++ b/src/main/resources/templates/c_sharp/test/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using NUnit.Framework; +global using assignment; diff --git a/src/main/resources/templates/c_sharp/test/StructuralTest.cs b/src/main/resources/templates/c_sharp/test/StructuralTest.cs new file mode 100644 index 000000000000..f6aa3bf0e8d3 --- /dev/null +++ b/src/main/resources/templates/c_sharp/test/StructuralTest.cs @@ -0,0 +1,149 @@ +using System.Reflection; + +namespace test; + +public class StructuralTest +{ + private readonly Assembly assignment = Assembly.Load("assignment"); + + [Test] + public void TestISortStrategyType() + { + Type? type = assignment.GetType("assignment.ISortStrategy"); + + Assert.That(type, Is.Not.Null); + Assert.That(type.IsInterface, Is.True); + } + + [Test] + public void TestISortStrategyMethods() + { + Type? type = assignment.GetType("assignment.ISortStrategy"); + MethodInfo? method = type?.GetMethod("PerformSort", BindingFlags.Instance | BindingFlags.Public, [typeof(List)]); + + Assert.That(method, Is.Not.Null); + Assert.That(method.ReturnType, Is.EqualTo(typeof(void))); + } + + [Test] + public void TestMergeSortInterface() + { + Type? type = assignment.GetType("assignment.MergeSort"); + Type? iface = type?.GetInterface("assignment.ISortStrategy"); + + Assert.That(iface, Is.Not.Null); + } + + [Test] + public void TestBubbleSortInterface() + { + Type? type = assignment.GetType("assignment.BubbleSort"); + Type? iface = type?.GetInterface("assignment.ISortStrategy"); + + Assert.That(iface, Is.Not.Null); + } + + [Test] + public void TestContextType() + { + Type? type = assignment.GetType("assignment.Context"); + + Assert.That(type, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(type.IsClass, Is.True); + Assert.That(type.IsAbstract, Is.False); + }); + } + + [Test] + public void TestContextPropertyDates() + { + Type? type = assignment.GetType("assignment.Context"); + PropertyInfo? datesProperty = type?.GetProperty("Dates", BindingFlags.Instance | BindingFlags.Public); + + Assert.That(datesProperty, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(datesProperty.PropertyType, Is.EqualTo(typeof(List))); + Assert.That(datesProperty.CanRead, Is.True); + Assert.That(datesProperty.CanWrite, Is.True); + }); + } + + [Test] + public void TestContextPropertySortAlgorithm() + { + Type? type = assignment.GetType("assignment.Context"); + Type? sortStrategyType = assignment.GetType("assignment.ISortStrategy"); + PropertyInfo? sortAlgorithmProperty = type?.GetProperty("SortAlgorithm", BindingFlags.Instance | BindingFlags.Public); + + Assert.That(sortAlgorithmProperty, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(sortAlgorithmProperty.PropertyType, Is.EqualTo(sortStrategyType)); + Assert.That(sortAlgorithmProperty.CanRead, Is.True); + Assert.That(sortAlgorithmProperty.CanWrite, Is.True); + }); + } + + [Test] + public void TestContextMethods() + { + Type? type = assignment.GetType("assignment.Context"); + MethodInfo? method = type?.GetMethod("Sort", BindingFlags.Instance | BindingFlags.Public, []); + + Assert.That(method, Is.Not.Null); + Assert.That(method.ReturnType, Is.EqualTo(typeof(void))); + } + + [Test] + public void TestPolicyType() + { + Type? type = assignment.GetType("assignment.Policy"); + + Assert.That(type, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(type.IsClass, Is.True); + Assert.That(type.IsAbstract, Is.False); + }); + } + + [Test] + public void TestPolicyPropertyContext() + { + Type? type = assignment.GetType("assignment.Policy"); + Type? contextType = assignment.GetType("assignment.Context"); + PropertyInfo? contextProperty = type?.GetProperty("Context", BindingFlags.Instance | BindingFlags.Public); + + Assert.That(contextProperty, Is.Not.Null); + Assert.Multiple(() => + { + Assert.That(contextProperty.PropertyType, Is.EqualTo(contextType)); + Assert.That(contextProperty.CanRead, Is.True); + Assert.That(contextProperty.CanWrite, Is.True); + }); + } + + [Test] + public void TestPolicyMethods() + { + Type? type = assignment.GetType("assignment.Policy"); + MethodInfo? method = type?.GetMethod("Configure", BindingFlags.Instance | BindingFlags.Public, []); + + Assert.That(method, Is.Not.Null); + Assert.That(method.ReturnType, Is.EqualTo(typeof(void))); + } + + [Test] + public void TestPolicyConstructor() + { + Type? type = assignment.GetType("assignment.Policy"); + Type? contextType = assignment.GetType("assignment.Context"); + Assert.That(contextType, Is.Not.Null); + + ConstructorInfo? constructor = type?.GetConstructor(BindingFlags.Instance | BindingFlags.Public, [contextType]); + Assert.That(constructor, Is.Not.Null); + } +} diff --git a/src/main/resources/templates/c_sharp/test/test.csproj b/src/main/resources/templates/c_sharp/test/test.csproj new file mode 100644 index 000000000000..6de379a65d1a --- /dev/null +++ b/src/main/resources/templates/c_sharp/test/test.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/haskell/exercise/stack.yaml b/src/main/resources/templates/haskell/exercise/stack.yaml index 70c125f18956..52ad39622f74 100644 --- a/src/main/resources/templates/haskell/exercise/stack.yaml +++ b/src/main/resources/templates/haskell/exercise/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-19.33 +resolver: lts-22.37 packages: - . diff --git a/src/main/resources/templates/haskell/solution/stack.yaml b/src/main/resources/templates/haskell/solution/stack.yaml index 70c125f18956..52ad39622f74 100644 --- a/src/main/resources/templates/haskell/solution/stack.yaml +++ b/src/main/resources/templates/haskell/solution/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-19.33 +resolver: lts-22.37 packages: - . diff --git a/src/main/resources/templates/haskell/test/stack.yaml b/src/main/resources/templates/haskell/test/stack.yaml index 70c125f18956..52ad39622f74 100644 --- a/src/main/resources/templates/haskell/test/stack.yaml +++ b/src/main/resources/templates/haskell/test/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-19.33 +resolver: lts-22.37 packages: - . diff --git a/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy new file mode 100644 index 000000000000..b8a48c3a6393 --- /dev/null +++ b/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy @@ -0,0 +1,59 @@ +/* + * This file configures the actual build steps for the automatic grading. + * + * !!! + * For regular exercises, there is no need to make changes to this file. + * Only this base configuration is actively supported by the Artemis maintainers + * and/or your Artemis instance administrators. + * !!! + */ + +dockerImage = '#dockerImage' +dockerFlags = '#dockerArgs' + +/** + * Main function called by Jenkins. + */ +void testRunner() { + docker.image(dockerImage).inside(dockerFlags) { c -> + runTestSteps() + } +} + +private void runTestSteps() { + test() +} + +/** + * Run unit tests + */ +private void test() { + stage('Build') { + sh 'dotnet build "./tests"' + } + stage('Test') { + sh 'dotnet test --logger=junit "./tests"' + } +} + +/** + * Script of the post build tasks aggregating all JUnit files in $WORKSPACE/results. + * + * Called by Jenkins. + */ +void postBuildTasks() { + sh ''' + rm -rf results + mkdir results + if [ -e tests/TestResults/TestResults.xml ] + then + sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' tests/TestResults/TestResults.xml + fi + cp tests/TestResults/TestResults.xml $WORKSPACE/results/ || true + sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true + ''' +} + +// very important, do not remove +// required so that Jenkins finds the methods defined in this script +return this diff --git a/src/main/webapp/app/entities/metis/answer-post.model.ts b/src/main/webapp/app/entities/metis/answer-post.model.ts index 000b7d59837b..c76399075551 100644 --- a/src/main/webapp/app/entities/metis/answer-post.model.ts +++ b/src/main/webapp/app/entities/metis/answer-post.model.ts @@ -4,6 +4,7 @@ import { Posting } from 'app/entities/metis/posting.model'; export class AnswerPost extends Posting { public resolvesPost?: boolean; public post?: Post; + public isConsecutive?: boolean = false; constructor() { super(); diff --git a/src/main/webapp/app/entities/metis/post.model.ts b/src/main/webapp/app/entities/metis/post.model.ts index 593d9535dab2..60adfe3c64c0 100644 --- a/src/main/webapp/app/entities/metis/post.model.ts +++ b/src/main/webapp/app/entities/metis/post.model.ts @@ -13,6 +13,7 @@ export class Post extends Posting { public conversation?: Conversation; public displayPriority?: DisplayPriority; public resolved?: boolean; + public isConsecutive?: boolean = false; constructor() { super(); diff --git a/src/main/webapp/app/entities/programming/programming-exercise.model.ts b/src/main/webapp/app/entities/programming/programming-exercise.model.ts index f00dc636caca..543d7f138bab 100644 --- a/src/main/webapp/app/entities/programming/programming-exercise.model.ts +++ b/src/main/webapp/app/entities/programming/programming-exercise.model.ts @@ -17,6 +17,7 @@ export enum ProgrammingLanguage { ASSEMBLER = 'ASSEMBLER', C = 'C', C_PLUS_PLUS = 'C_PLUS_PLUS', + C_SHARP = 'C_SHARP', HASKELL = 'HASKELL', JAVA = 'JAVA', JAVASCRIPT = 'JAVASCRIPT', diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 78158c26e1ce..6893eef163cf 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -161,7 +161,7 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O const areAuxiliaryRepositoriesValid = this.areAuxiliaryRepositoriesValid(); const areCheckoutPathsValid = this.areCheckoutPathsValid(); this.formValid = Boolean( - this.exerciseTitleChannelComponent()?.titleChannelNameComponent?.formValidSignal() && + this.exerciseTitleChannelComponent()?.titleChannelNameComponent?.isFormValidSignal() && this.getIsShortNameFieldValid() && isCheckoutSolutionRepositoryValid && isRecreateBuildPlansValid && diff --git a/src/main/webapp/app/exercises/quiz/manage/short-answer-question/short-answer-question-edit.component.ts b/src/main/webapp/app/exercises/quiz/manage/short-answer-question/short-answer-question-edit.component.ts index 6e7ac7627281..896a6c743bbe 100644 --- a/src/main/webapp/app/exercises/quiz/manage/short-answer-question/short-answer-question-edit.component.ts +++ b/src/main/webapp/app/exercises/quiz/manage/short-answer-question/short-answer-question-edit.component.ts @@ -31,8 +31,9 @@ import { ItalicAction } from 'app/shared/monaco-editor/model/actions/italic.acti import { UnderlineAction } from 'app/shared/monaco-editor/model/actions/underline.action'; import { CodeAction } from 'app/shared/monaco-editor/model/actions/code.action'; import { UrlAction } from 'app/shared/monaco-editor/model/actions/url.action'; -import { UnorderedListAction } from 'app/shared/monaco-editor/model/actions/unordered-list.action'; import { OrderedListAction } from 'app/shared/monaco-editor/model/actions/ordered-list.action'; +import { BulletedListAction } from 'app/shared/monaco-editor/model/actions/bulleted-list.action'; +import { StrikethroughAction } from 'app/shared/monaco-editor/model/actions/strikethrough.action'; import { InsertShortAnswerSpotAction } from 'app/shared/monaco-editor/model/actions/quiz/insert-short-answer-spot.action'; import { TextEditorAction } from 'app/shared/monaco-editor/model/actions/text-editor-action.model'; import { InsertShortAnswerOptionAction } from 'app/shared/monaco-editor/model/actions/quiz/insert-short-answer-option.action'; @@ -122,9 +123,10 @@ export class ShortAnswerQuestionEditComponent implements OnInit, OnChanges, Afte new BoldAction(), new ItalicAction(), new UnderlineAction(), + new StrikethroughAction(), new CodeAction(), new UrlAction(), - new UnorderedListAction(), + new BulletedListAction(), new OrderedListAction(), this.insertShortAnswerSpotAction, this.insertShortAnswerOptionAction, diff --git a/src/main/webapp/app/lecture/lecture-attachments.component.ts b/src/main/webapp/app/lecture/lecture-attachments.component.ts index 5b12fa24b510..6d89f669946a 100644 --- a/src/main/webapp/app/lecture/lecture-attachments.component.ts +++ b/src/main/webapp/app/lecture/lecture-attachments.component.ts @@ -1,15 +1,14 @@ import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http'; +import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Lecture } from 'app/entities/lecture.model'; -import { FileUploaderService } from 'app/shared/http/file-uploader.service'; import dayjs from 'dayjs/esm'; import { Subject } from 'rxjs'; import { FileService } from 'app/shared/http/file.service'; import { Attachment, AttachmentType } from 'app/entities/attachment.model'; import { AttachmentService } from 'app/lecture/attachment.service'; import { faEye, faPaperclip, faPencilAlt, faQuestionCircle, faSpinner, faTimes, faTrash } from '@fortawesome/free-solid-svg-icons'; -import { UPLOAD_FILE_EXTENSIONS } from 'app/shared/constants/file-extensions.constants'; +import { ACCEPTED_FILE_EXTENSIONS_FILE_BROWSER, ALLOWED_FILE_EXTENSIONS_HUMAN_READABLE } from 'app/shared/constants/file-extensions.constants'; import { LectureService } from 'app/lecture/lecture.service'; @Component({ @@ -18,6 +17,17 @@ import { LectureService } from 'app/lecture/lecture.service'; styleUrls: ['./lecture-attachments.component.scss'], }) export class LectureAttachmentsComponent implements OnInit, OnDestroy { + protected readonly faSpinner = faSpinner; + protected readonly faTimes = faTimes; + protected readonly faTrash = faTrash; + protected readonly faPencilAlt = faPencilAlt; + protected readonly faPaperclip = faPaperclip; + protected readonly faQuestionCircle = faQuestionCircle; + protected readonly faEye = faEye; + + protected readonly allowedFileExtensions = ALLOWED_FILE_EXTENSIONS_HUMAN_READABLE; + protected readonly acceptedFileExtensionsFileBrowser = ACCEPTED_FILE_EXTENSIONS_FILE_BROWSER; + @ViewChild('fileInput', { static: false }) fileInput: ElementRef; @Input() lectureId: number | undefined; @Input() showHeader = true; @@ -33,29 +43,13 @@ export class LectureAttachmentsComponent implements OnInit, OnDestroy { errorMessage?: string; viewButtonAvailable: Record = {}; - // A human-readable list of allowed file extensions - readonly allowedFileExtensions = UPLOAD_FILE_EXTENSIONS.join(', '); - // The list of file extensions for the "accept" attribute of the file input field - readonly acceptedFileExtensionsFileBrowser = UPLOAD_FILE_EXTENSIONS.map((ext) => '.' + ext).join(','); - private dialogErrorSource = new Subject(); dialogError$ = this.dialogErrorSource.asObservable(); - // Icons - faSpinner = faSpinner; - faTimes = faTimes; - faTrash = faTrash; - faPencilAlt = faPencilAlt; - faPaperclip = faPaperclip; - faQuestionCircle = faQuestionCircle; - faEye = faEye; - constructor( protected activatedRoute: ActivatedRoute, private attachmentService: AttachmentService, private lectureService: LectureService, - private httpClient: HttpClient, - private fileUploaderService: FileUploaderService, private fileService: FileService, ) {} diff --git a/src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.html b/src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.html index c7d9568fb7c2..7c8434dc9023 100644 --- a/src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.html +++ b/src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.html @@ -60,13 +60,13 @@ /> - @if (isFileTooBig) { + @if (isFileTooBig()) {
{{ 'artemisApp.attachmentUnit.createAttachmentUnit.fileTooBig' | artemisTranslate }} {{ 'artemisApp.attachmentUnit.createAttachmentUnit.fileLimitation' | artemisTranslate }}
} - @if (!fileName && fileInputTouched) { + @if (!fileName() && fileInputTouched) {
} @@ -81,7 +81,7 @@ formControlName="competencyLinks" /> -
+