From bea406a8d90366c9fa72a4e643e3c63bef9b4c1b Mon Sep 17 00:00:00 2001 From: Florian Kotthoff <74312290+FlorianK13@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:16:39 +0200 Subject: [PATCH 1/5] Add badges to readme #304 --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index c228e360..fb9b88d8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +[![Website](https://img.shields.io/website?url=https%3A%2F%2Fwww.openpv.de%2F)](https://www.openpv.de/) + + # The OpenPV website This is the base repository for the website [openpv.de](https://www.openpv.de). The website is built using * [React](https://react.dev/) @@ -27,6 +30,8 @@ If you want to deploy this website locally, you need to follow these steps: ``` and visit [localhost:5173](http://localhost:5173). +## How does this work? +We have a detailed description in german and english on our [About Page](https://www.openpv.de/about). ## Funding We thank our sponsors. From be7aa1df49f881675a404c73fcd00789bd294cf2 Mon Sep 17 00:00:00 2001 From: Florian Kotthoff <74312290+FlorianK13@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:29:22 +0200 Subject: [PATCH 2/5] Add new description of landing page #303 --- public/locales/de/translation.json | 1 + public/locales/en/translation.json | 1 + src/pages/Map.jsx | 6 +++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 563c5cfa..c953573d 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -1,4 +1,5 @@ { + "mainDescription": "Ermitteln Sie das Potential ihres Gebäudes für eine Solaranlage - mit offen verfügbaren 3D-Daten direkt im Browser.", "sidebar": { "header": "Ziel des Tools", "mainText": "Das Tool berechnet dann das Potential für eine Solaranlage auf deiner Dach- und Fassadenfläche.", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index bd22bb15..5c379d1f 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,4 +1,5 @@ { + "mainDescription": "Determine the potential of your building for a solar installation by using openly available 3D data - directly in the browser.", "sidebar": { "header": "Goal of this website", "mainText": "The tool will then calculate the potential for a solar system on your roof and facade area.", diff --git a/src/pages/Map.jsx b/src/pages/Map.jsx index 227c208d..3b809b49 100644 --- a/src/pages/Map.jsx +++ b/src/pages/Map.jsx @@ -39,10 +39,10 @@ function Index() { // maxzoom: 22, } - const boundingBox = [5.98, 47.3, 15.1, 55.0]; + const boundingBox = [5.98, 47.3, 15.1, 55.0] const [viewState, setViewState] = useState({ - bounds: boundingBox + bounds: boundingBox, }) const [mapMarkers, setMapMarkers] = useState([]) @@ -99,7 +99,7 @@ function Index() { }) return ( -
+
From a46b7f2436d2fae079e448b8a4c07d28dafafa56 Mon Sep 17 00:00:00 2001 From: Florian Kotthoff <74312290+FlorianK13@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:40:18 +0200 Subject: [PATCH 3/5] Add keywords to start message #303 --- public/locales/de/translation.json | 2 +- public/locales/en/translation.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index c953573d..3f2cbfb1 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -58,7 +58,7 @@ }, "WelcomeMessage": { "title": "Willkommen bei OpenPV", - "firstPage": "Lohnt sich eine Solaranlage auf meinem Dach oder Balkon? Mit OpenPV können Sie das solare Potential ihres Gebäudes in wenigen Schritten bestimmen. Dafür geben Sie ihre Adresse im Suchfeld ein und klicken Sie auf 'Simulation starten'.", + "firstPage": "Lohnt sich eine Solaranlage auf meinem Dach oder Balkon? Mit OpenPV können Sie das solare Potential ihres Gebäudes in wenigen Schritten und mit Hilfe von offenen 3D-Gebäudedaten bestimmen. Dafür geben Sie ihre Adresse im Suchfeld ein und klicken Sie auf 'Simulation starten'.", "secondPage": "Auf der Karte können Sie das Ergebnis der Verschattungssimulation betrachten. Mit Doppelklick können Sie weitere Gebäude für die Simulation auswählen.", "thirdPage": "Über 'Neue PV-Anlage einzeichnen' können Sie eine Solaranlage erstellen und den Jahresbetrag errechnen.", "fourthPage": "Anschließend können Sie mit dem Button 'Wirtschaftlichkeit der Anlage berechnen' die jährlichen Einnahmen der Anlage abschätzen.", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 5c379d1f..4b92777a 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -39,7 +39,7 @@ }, "WelcomeMessage": { "title": "Welcome to OpenPV", - "firstPage": "Is a solar system worth it for my roof or balcony? With OpenPV, you can determine the solar potential of your building in just a few steps. Simply enter your address in the search field and click Start.", + "firstPage": "Is a solar system worth it for my roof or balcony? With OpenPV, you can determine the solar potential of your building in just a few steps with the help of openly available 3D building data. Simply enter your address in the search field and click Start.", "secondPage": "On the map, you can view the results of the shading simulation. You can select additional buildings for simulation by double-clicking.", "thirdPage": "In Options -> Draw PV System, you can create a solar system and calculate the annual yield.", "fourthPage": "The best thing about OpenPV: We are open-source, free, store no data, and use no cookies!" From 3707e1bdae202bd48632391327d5f2e943a84bd7 Mon Sep 17 00:00:00 2001 From: Konrad Heidler Date: Fri, 20 Sep 2024 16:06:52 +0200 Subject: [PATCH 4/5] Polygon triangulation with ear clipping --- .../ThreeViewer/Meshes/PVSystems.jsx | 143 +++++++++++++++--- 1 file changed, 119 insertions(+), 24 deletions(-) diff --git a/src/components/ThreeViewer/Meshes/PVSystems.jsx b/src/components/ThreeViewer/Meshes/PVSystems.jsx index 5ea49337..492c7a11 100644 --- a/src/components/ThreeViewer/Meshes/PVSystems.jsx +++ b/src/components/ThreeViewer/Meshes/PVSystems.jsx @@ -27,45 +27,30 @@ export function createPVSystem({ }) { const points = pvPoints.map((obj) => obj.point) if (pvPoints.length < 3) { - console.log("Not enough points to create a polygon") return } const geometry = new THREE.BufferGeometry() - const vertices = [] - points.forEach((point) => { - vertices.push(point.x, point.y, point.z) - }) - + const trianglesWithNormals = triangulate(pvPoints) const triangles = [] const bufferTriangles = [] const normalOffset = 0.1 // Adjust this value as needed - for (let i = 1; i < pvPoints.length - 1; i++) { - const v0 = pvPoints[0] - const v1 = pvPoints[i] - const v2 = pvPoints[i + 1] - + for(const {a, b, c} of trianglesWithNormals) { const shift = (element) => ({ x: element.point.x + element.normal.x * normalOffset, y: element.point.y + element.normal.y * normalOffset, z: element.point.z + element.normal.z * normalOffset, }) - const sv0 = shift(v0) - const sv1 = shift(v1) - const sv2 = shift(v2) + const sa = shift(a) + const sb = shift(b) + const sc = shift(c) - triangles.push({ a: v0.point, b: v1.point, c: v2.point }) + triangles.push({a: a.point, b: b.point, c: c.point }) bufferTriangles.push( - sv0.x, - sv0.y, - sv0.z, - sv1.x, - sv1.y, - sv1.z, - sv2.x, - sv2.y, - sv2.z + sa.x, sa.y, sa.z, + sb.x, sb.y, sb.z, + sc.x, sc.y, sc.z ) } @@ -466,3 +451,113 @@ function calculateTriangleIntensity(triangle) { (intensities[0] + intensities[1] + intensities[2]) / 3 return averageIntensity } + +// Takes a sequence of points [[x, y, z], ...] and +// returns a sequence of triangles [[x1, y1, z1, x2, ...], ...], +// making sure to generate a valid triangulation of the polygon +// Highly inefficient implementation, but we don't triangulate many polygons so it should be fine +export function triangulate(points) { + if(points.length == 3) { + return [{a: points[0], b: points[1], c: points[2]}] + } else if (points.length < 3) { + return [] + } + + // As the triangle is in 3d-space anyways, we can just assume that vertices are given in CCW order + const pt = (i) => points[(i + points.length) % points.length]; + + const ab = sub(pt(1).point, pt(0).point) + const ac = sub(pt(2).point, pt(0).point) + const normal = new THREE.Vector3().crossVectors(ab, ac) + + let countNegative = 0; + let countPositive = 0; + + // Taking inspiration from a polygon triangulation based on the two ears theorem + // However, in R3, things can get a bit more wonky... + // https://en.wikipedia.org/wiki/Two_ears_theorem#Relation_to_triangulations + const makeTriplet = (left, vertex, right) => { + const det = determinant( + sub(vertex.point, left.point), + sub(vertex.point, right.point), + normal + ) + + if(det > 0) { + countPositive += 1 + } else { + countNegative += 1 + } + + return {left: left, vertex: vertex, right: right, det} + } + + const triplets = points.map((cur, i) => makeTriplet(pt(i-1), cur, pt(i+1))) + + if(countPositive < countNegative) { + // negative det => convex vertex, so we flip all determinants + for(let t of triplets) { + t.det = -t.det + } + } + + const concaveVertices = triplets.filter(t => t.det < 0).map(t => t.vertex) + + let anyEar = false; + for(let t of triplets) { + // Idea: Define the 3d analogue of a polygon ear by looking at triples and projecting the + // remaining points onto the plane spanned by that particular triangle + // An ear is any triangle having no concave vertices lying inside it + const containedConcaveVertices = concaveVertices + .filter(v => v != t.left && v != t.vertex && v != t.right) + .filter(v => pointInsideTriangle(v.point, t.left.point, t.vertex.point, t.right.point)) + + t.isEar = (t.det > 0) && (containedConcaveVertices.length == 0) + if(t.isEar) { + anyEar = true + } + } + + // Prevent infinite loop + if(!anyEar) { + console.warn('No ear found in ear clipping!') + triplets[0].isEar = true + } + + for(let ear of triplets.filter(t => t.isEar)) { + const remainingPoints = triplets.filter(t => t != ear).map(t => t.vertex) + return [{a: ear.left, b: ear.vertex, c: ear.right}].concat(triangulate(remainingPoints)) + } +} + +function determinant(v1, v2, v3) { + const matrix = new THREE.Matrix3() + matrix.set( + v1.x, v2.x, v3.x, // First column + v1.y, v2.y, v3.y, // Second column + v1.z, v2.z, v3.z // Third column + ) + return matrix.determinant() +} + +function sub(v1, v2) { + return new THREE.Vector3().subVectors(v1, v2) +} + +function cross(v1, v2) { + return new THREE.Vector3().crossVectors(v1, v2) +} + +export function pointInsideTriangle(point, v1, v2, v3) { + const normal = cross(sub(v1, v2), sub(v2, v3)) + const n1 = cross(normal, sub(v1, v2)) + const n2 = cross(normal, sub(v2, v3)) + const n3 = cross(normal, sub(v3, v1)) + + const d1 = Math.sign(n1.dot(sub(v1, point))) + const d2 = Math.sign(n2.dot(sub(v2, point))) + const d3 = Math.sign(n3.dot(sub(v3, point))) + + // Inside if all 3 have the same sign + return (d1 == d2) && (d2 == d3) +} From 647df318d64276c8d475e5703456036f84e9bc6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 04:28:43 +0000 Subject: [PATCH 5/5] Bump rollup from 4.21.2 to 4.22.4 Bumps [rollup](https://github.com/rollup/rollup) from 4.21.2 to 4.22.4. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.21.2...v4.22.4) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5f28edf..48dfa385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2329,9 +2329,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -2342,9 +2342,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -2355,9 +2355,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -2368,9 +2368,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -2381,9 +2381,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -2394,9 +2394,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -2407,9 +2407,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -2420,9 +2420,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -2433,9 +2433,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -2446,9 +2446,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -2459,9 +2459,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -2472,9 +2472,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -2485,9 +2485,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -2498,9 +2498,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -2511,9 +2511,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -2524,9 +2524,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -5094,9 +5094,9 @@ } }, "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -5109,22 +5109,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } },