From 80b32800f928840b9cae6cce3103d54f22460115 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 12 May 2026 23:19:26 -0600 Subject: [PATCH 01/23] ui_migration feature(unitesting) Add unitesting configuration and dependencies --- webapp/package-lock.json | 887 ++++++++++++++++++++++++++++++++++++++- webapp/package.json | 5 +- webapp/vitest.config.js | 23 + 3 files changed, 905 insertions(+), 10 deletions(-) create mode 100644 webapp/vitest.config.js diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 27fc26b8..1713f46a 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -22,6 +22,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.28.5", + "@pinia/testing": "^1.0.3", "@vitejs/plugin-vue": "^6.0.6", "@vue/eslint-config-prettier": "9.0.0", "autoprefixer": "^10.4.24", @@ -31,6 +32,7 @@ "eslint-plugin-pinia": "^0.4.2", "eslint-plugin-prettier": "^5.1.0", "eslint-plugin-vue": "^9.20.0", + "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", "postcss-html": "^1.8.1", @@ -40,12 +42,64 @@ "stylelint-config-standard": "^40.0.0", "stylelint-config-standard-less": "^4.1.0", "typescript-eslint": "^8.59.0", - "vite": "^7.3.1" + "vite": "^7.3.1", + "vitest": "^4.1.6" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -312,6 +366,19 @@ "node": ">=6.9.0" } }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, "node_modules/@cacheable/memory": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", @@ -373,6 +440,26 @@ "@keyv/serialize": "^1.1.1" } }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/@csstools/css-calc": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", @@ -397,6 +484,34 @@ "@csstools/css-tokenizer": "^4.0.0" } }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", @@ -657,6 +772,24 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -831,6 +964,19 @@ "node": ">= 8" } }, + "node_modules/@pinia/testing": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@pinia/testing/-/testing-1.0.3.tgz", + "integrity": "sha512-g+qR49GNdI1Z8rZxKrQC3GN+LfnGTNf5Kk8Nz5Cz6mIGva5WRS+ffPXQfzhA0nu6TveWzPNYTjGl4nJqd3Cu9Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "pinia": ">=3.0.4" + } + }, "node_modules/@pkgr/core": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", @@ -892,6 +1038,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/css-tree": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/@types/css-tree/-/css-tree-2.3.11.tgz", @@ -899,6 +1063,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1231,19 +1402,154 @@ "vue": "^3.2.25" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", + "node_modules/@vitest/expect": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", + "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.6", + "@vitest/utils": "4.1.6", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", + "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.6", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", + "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", + "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.6", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", + "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.6", + "@vitest/utils": "4.1.6", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", + "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", + "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.6", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", + "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.34", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@vue/compiler-dom": { "version": "3.5.33", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", @@ -1493,6 +1799,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1577,6 +1893,16 @@ "node": ">=6.0.0" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/birpc": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", @@ -1719,6 +2045,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1787,8 +2123,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/copy-anything": { "version": "3.0.5", @@ -1921,6 +2256,20 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1939,6 +2288,13 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2125,6 +2481,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -2559,6 +2922,16 @@ "node": ">=0.10.0" } }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3056,6 +3429,19 @@ "dev": true, "license": "MIT" }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/html-tags": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", @@ -3258,6 +3644,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", @@ -3298,6 +3691,67 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3734,6 +4188,17 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/openseadragon": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/openseadragon/-/openseadragon-5.0.1.tgz", @@ -3835,6 +4300,32 @@ "node": ">= 0.10" } }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3855,6 +4346,13 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/perfect-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", @@ -4271,6 +4769,19 @@ "node": ">=11.0.0" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4304,6 +4815,13 @@ "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4377,6 +4895,20 @@ "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", @@ -4809,6 +5341,13 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/synckit": { "version": "0.11.12", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", @@ -4904,6 +5443,23 @@ "node": ">=8" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -4921,6 +5477,67 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.30.tgz", + "integrity": "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.30" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.30.tgz", + "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4934,6 +5551,32 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -5018,6 +5661,16 @@ "integrity": "sha512-zTpbaNMWTTsWZOiFJkFHa+zia1pRgY3FA6hEAckVgk4aJ19+qie7M/qH9GJgI1nlxP97xMcGH/MXw0qWaKURfQ==", "license": "MIT" }, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/unicorn-magic": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", @@ -5154,6 +5807,140 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz", + "integrity": "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.6", + "@vitest/mocker": "4.1.6", + "@vitest/pretty-format": "4.1.6", + "@vitest/runner": "4.1.6", + "@vitest/snapshot": "4.1.6", + "@vitest/spy": "4.1.6", + "@vitest/utils": "4.1.6", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.6", + "@vitest/browser-preview": "4.1.6", + "@vitest/browser-webdriverio": "4.1.6", + "@vitest/coverage-istanbul": "4.1.6", + "@vitest/coverage-v8": "4.1.6", + "@vitest/ui": "4.1.6", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vue": { "version": "3.5.33", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", @@ -5271,6 +6058,64 @@ "node": ">=10" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5287,6 +6132,23 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -5320,6 +6182,13 @@ "node": ">=12" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/webapp/package.json b/webapp/package.json index 97ff8f8e..f142bc10 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -31,6 +31,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.28.5", + "@pinia/testing": "^1.0.3", "@vitejs/plugin-vue": "^6.0.6", "@vue/eslint-config-prettier": "9.0.0", "autoprefixer": "^10.4.24", @@ -40,6 +41,7 @@ "eslint-plugin-pinia": "^0.4.2", "eslint-plugin-prettier": "^5.1.0", "eslint-plugin-vue": "^9.20.0", + "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", "postcss-html": "^1.8.1", @@ -49,7 +51,8 @@ "stylelint-config-standard": "^40.0.0", "stylelint-config-standard-less": "^4.1.0", "typescript-eslint": "^8.59.0", - "vite": "^7.3.1" + "vite": "^7.3.1", + "vitest": "^4.1.6" }, "postcss": { "plugins": { diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js new file mode 100644 index 00000000..99b2e94e --- /dev/null +++ b/webapp/vitest.config.js @@ -0,0 +1,23 @@ + +// File: vitest.config.js +// Generic configuration for vitest + +import { defineConfig } from 'vitest/config'; +import vue from '@vitejs/plugin-vue'; +import path from 'path'; + +export default defineConfig({ + plugins: [vue()], + + test: { + environment: 'jsdom', + + globals: true, + }, + + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, +}); \ No newline at end of file From 13b5e862696e9b4b8230d863369b54a616a02232 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 12 May 2026 23:20:16 -0600 Subject: [PATCH 02/23] ui_migration feature(unitesting) Add loggingContent test file ui_migration feature(unitesting) Fix test spec baseUri --- webapp/src/tests/unit/LoggingContent.spec.js | 90 ++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 webapp/src/tests/unit/LoggingContent.spec.js diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js new file mode 100644 index 00000000..55ac5027 --- /dev/null +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -0,0 +1,90 @@ +// File: LoggingContent.spec.js +// Component: loggingContent.vue +// This file mocks AXIOS for simulated requests and VUEUSE as its not standard JSDOM. + +import { mount } from '@vue/test-utils'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { createTestingPinia } from '@pinia/testing'; +import axios from 'axios'; +import LoggingContent from '../../components/tabContentComponents/loggingContent.vue'; + +// Mock Axios +vi.mock('axios'); + +// Mock VueUse to prevent IntersectionObserver crashes in JSDOM +vi.mock('@vueuse/core', () => ({ + useIntersectionObserver: vi.fn(), +})); + +describe('LoggingContent.vue', () => { + let wrapper; + + // A sample log string matching backend's format + const mockLogData = `[2023-10-27T10:00:00.000Z] [INFO] System started successfully +[2023-10-27T10:01:00.000Z] [WARNING] Temperature is rising +[2023-10-27T10:02:00.000Z] [ERROR] Traceback (most recent call last): + File "main.py", line 10, in + connect()`; + + beforeEach(() => { + // Reset mocks before each test + vi.clearAllMocks(); + + // Set axios to return our fake logs + axios.get.mockResolvedValue({ data: mockLogData }); + + // Mount the component with a fake Pinia store + wrapper = mount(LoggingContent, { + global: { + plugins: [ + createTestingPinia({ + createSpy: vi.fn, + initialState: { + settings: { baseUri: 'http://localhost:3000/api/v3' } + }, + }), + ], + // Simplify child components + stubs: ['PaginateLinks', 'EndpointButton'] + }, + }); + }); + + // Render check + it('renders the component correctly', () => { + expect(wrapper.exists()).toBe(true); + expect(wrapper.find('.logging-navbar').exists()).toBe(true); + }); + + it('fetches logs and parses them correctly when updateLogs is called', async () => { + // Trigger the method + await wrapper.vm.updateLogs(); + + // Verify Axios was called with the correct URI from the Pinia store + expect(axios.get).toHaveBeenCalledWith('http://localhost:3000/api/v3/log/'); + + // Verify the logs array was populated and reversed (newest first) + expect(wrapper.vm.logs.length).toBe(3); + + // Check if the most recent log (ERROR) is first due to .reverse() + expect(wrapper.vm.logs[0].level).toBe('ERROR'); + + // Check if the multi-line traceback was appended correctly to the ERROR log + expect(wrapper.vm.logs[0].message).toContain('Traceback'); + expect(wrapper.vm.logs[0].summary).toContain('connect()'); + }); + + it('filters logs based on the selected level', async () => { + await wrapper.vm.updateLogs(); + + // Set filter to ERROR (should only show ERROR and CRITICAL) + wrapper.vm.filterLevel = 'ERROR'; + + // wait for Vue reactivity to update computed properties + await wrapper.vm.$nextTick(); + + // Only the 1 ERROR log should remain in filteredItems + expect(wrapper.vm.filteredItems.length).toBe(1); + expect(wrapper.vm.filteredItems[0].level).toBe('ERROR'); + }); +}); \ No newline at end of file From 8afc7a61f33bc55ccee6c0a66f8dfb3404586f1e Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 12 May 2026 23:22:43 -0600 Subject: [PATCH 03/23] ui_migration bugfix(component) Fix innerText tag error from test --- .../tabContentComponents/loggingContent.vue | 2 +- webapp/src/tests/unit/LoggingContent.spec.js | 60 +++++++++---------- webapp/vitest.config.js | 13 ++-- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/webapp/src/components/tabContentComponents/loggingContent.vue b/webapp/src/components/tabContentComponents/loggingContent.vue index c66eb3f2..1802aa8d 100644 --- a/webapp/src/components/tabContentComponents/loggingContent.vue +++ b/webapp/src/components/tabContentComponents/loggingContent.vue @@ -225,7 +225,7 @@ export default { }, escapeText: function (unsafeText) { let div = document.createElement("div"); - div.innerText = unsafeText; + div.textContent = unsafeText; return div.innerHTML; }, }, diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 55ac5027..9faa434d 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -1,22 +1,18 @@ -// File: LoggingContent.spec.js -// Component: loggingContent.vue -// This file mocks AXIOS for simulated requests and VUEUSE as its not standard JSDOM. - -import { mount } from '@vue/test-utils'; -import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { createTestingPinia } from '@pinia/testing'; -import axios from 'axios'; -import LoggingContent from '../../components/tabContentComponents/loggingContent.vue'; +import { mount } from "@vue/test-utils"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { createTestingPinia } from "@pinia/testing"; +import axios from "axios"; +import LoggingContent from "../../components/tabContentComponents/loggingContent.vue"; // Mock Axios -vi.mock('axios'); +vi.mock("axios"); // Mock VueUse to prevent IntersectionObserver crashes in JSDOM -vi.mock('@vueuse/core', () => ({ +vi.mock("@vueuse/core", () => ({ useIntersectionObserver: vi.fn(), })); -describe('LoggingContent.vue', () => { +describe("LoggingContent.vue", () => { let wrapper; // A sample log string matching backend's format @@ -29,7 +25,7 @@ describe('LoggingContent.vue', () => { beforeEach(() => { // Reset mocks before each test vi.clearAllMocks(); - + // Set axios to return our fake logs axios.get.mockResolvedValue({ data: mockLogData }); @@ -40,51 +36,51 @@ describe('LoggingContent.vue', () => { createTestingPinia({ createSpy: vi.fn, initialState: { - settings: { baseUri: 'http://localhost:3000/api/v3' } + settings: { baseUri: "http://localhost:3000/api/v3" }, }, }), ], // Simplify child components - stubs: ['PaginateLinks', 'EndpointButton'] + stubs: ["PaginateLinks", "EndpointButton"], }, }); }); // Render check - it('renders the component correctly', () => { + it("renders the component correctly", () => { expect(wrapper.exists()).toBe(true); - expect(wrapper.find('.logging-navbar').exists()).toBe(true); + expect(wrapper.find(".logging-navbar").exists()).toBe(true); }); - it('fetches logs and parses them correctly when updateLogs is called', async () => { + it("fetches logs and parses them correctly when updateLogs is called", async () => { // Trigger the method await wrapper.vm.updateLogs(); // Verify Axios was called with the correct URI from the Pinia store - expect(axios.get).toHaveBeenCalledWith('http://localhost:3000/api/v3/log/'); + expect(axios.get).toHaveBeenCalledWith("http://localhost:3000/api/v3/log/"); // Verify the logs array was populated and reversed (newest first) expect(wrapper.vm.logs.length).toBe(3); - + // Check if the most recent log (ERROR) is first due to .reverse() - expect(wrapper.vm.logs[0].level).toBe('ERROR'); - + expect(wrapper.vm.logs[0].level).toBe("ERROR"); + // Check if the multi-line traceback was appended correctly to the ERROR log - expect(wrapper.vm.logs[0].message).toContain('Traceback'); - expect(wrapper.vm.logs[0].summary).toContain('connect()'); + expect(wrapper.vm.logs[0].message).toContain("Traceback"); + expect(wrapper.vm.logs[0].summary).toContain("connect()"); }); - it('filters logs based on the selected level', async () => { + it("filters logs based on the selected level", async () => { await wrapper.vm.updateLogs(); - + // Set filter to ERROR (should only show ERROR and CRITICAL) - wrapper.vm.filterLevel = 'ERROR'; - + wrapper.vm.filterLevel = "ERROR"; + // wait for Vue reactivity to update computed properties - await wrapper.vm.$nextTick(); - + await wrapper.vm.$nextTick(); + // Only the 1 ERROR log should remain in filteredItems expect(wrapper.vm.filteredItems.length).toBe(1); - expect(wrapper.vm.filteredItems[0].level).toBe('ERROR'); + expect(wrapper.vm.filteredItems[0].level).toBe("ERROR"); }); -}); \ No newline at end of file +}); diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index 99b2e94e..255ea48f 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -1,23 +1,22 @@ - // File: vitest.config.js // Generic configuration for vitest -import { defineConfig } from 'vitest/config'; -import vue from '@vitejs/plugin-vue'; -import path from 'path'; +import { defineConfig } from "vitest/config"; +import vue from "@vitejs/plugin-vue"; +import path from "path"; export default defineConfig({ plugins: [vue()], test: { - environment: 'jsdom', + environment: "jsdom", globals: true, }, resolve: { alias: { - '@': path.resolve(__dirname, './src'), + "@": path.resolve(__dirname, "./src"), }, }, -}); \ No newline at end of file +}); From 3e2dd2543827e3e839a5750439eb9a4575125b29 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 14:10:08 -0600 Subject: [PATCH 04/23] ui_migration feature(unitesting) Use origin state for api url --- webapp/src/tests/unit/LoggingContent.spec.js | 22 ++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 9faa434d..5d5e79fc 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -16,11 +16,7 @@ describe("LoggingContent.vue", () => { let wrapper; // A sample log string matching backend's format - const mockLogData = `[2023-10-27T10:00:00.000Z] [INFO] System started successfully -[2023-10-27T10:01:00.000Z] [WARNING] Temperature is rising -[2023-10-27T10:02:00.000Z] [ERROR] Traceback (most recent call last): - File "main.py", line 10, in - connect()`; + const mockLogData = `[2026-05-14 08:46:12,808] [INFO] OFM server root logger has been set up at INFO level`; beforeEach(() => { // Reset mocks before each test @@ -36,7 +32,7 @@ describe("LoggingContent.vue", () => { createTestingPinia({ createSpy: vi.fn, initialState: { - settings: { baseUri: "http://localhost:3000/api/v3" }, + settings: { origin: "http://microscope.local:5000/api/v3" }, }, }), ], @@ -57,30 +53,30 @@ describe("LoggingContent.vue", () => { await wrapper.vm.updateLogs(); // Verify Axios was called with the correct URI from the Pinia store - expect(axios.get).toHaveBeenCalledWith("http://localhost:3000/api/v3/log/"); + expect(axios.get).toHaveBeenCalledWith("http://microscope.local:5000/api/v3/log/"); // Verify the logs array was populated and reversed (newest first) - expect(wrapper.vm.logs.length).toBe(3); + expect(wrapper.vm.logs.length).toBe(1); // Check if the most recent log (ERROR) is first due to .reverse() - expect(wrapper.vm.logs[0].level).toBe("ERROR"); + expect(wrapper.vm.logs[0].level).toBe("INFO"); // Check if the multi-line traceback was appended correctly to the ERROR log - expect(wrapper.vm.logs[0].message).toContain("Traceback"); - expect(wrapper.vm.logs[0].summary).toContain("connect()"); + expect(wrapper.vm.logs[0].message).toContain("OFM"); + expect(wrapper.vm.logs[0].summary).toContain("server"); }); it("filters logs based on the selected level", async () => { await wrapper.vm.updateLogs(); // Set filter to ERROR (should only show ERROR and CRITICAL) - wrapper.vm.filterLevel = "ERROR"; + wrapper.vm.filterLevel = "INFO"; // wait for Vue reactivity to update computed properties await wrapper.vm.$nextTick(); // Only the 1 ERROR log should remain in filteredItems expect(wrapper.vm.filteredItems.length).toBe(1); - expect(wrapper.vm.filteredItems[0].level).toBe("ERROR"); + expect(wrapper.vm.filteredItems[0].level).toBe("INFO"); }); }); From c7d16fa43f0349b4cb5f17b52478debcab6d97da Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 16:54:06 -0600 Subject: [PATCH 05/23] ui_migration feature(unitesting) modifying vitest config and spec, add fixture real logging file --- webapp/src/tests/fixtures/realLog.txt | 5618 ++++++++++++++++++ webapp/src/tests/unit/LoggingContent.spec.js | 20 +- webapp/vitest.config.js | 17 +- 3 files changed, 5649 insertions(+), 6 deletions(-) create mode 100644 webapp/src/tests/fixtures/realLog.txt diff --git a/webapp/src/tests/fixtures/realLog.txt b/webapp/src/tests/fixtures/realLog.txt new file mode 100644 index 00000000..4e6d447d --- /dev/null +++ b/webapp/src/tests/fixtures/realLog.txt @@ -0,0 +1,5618 @@ +[2026-04-23 18:43:21,236] [INFO] Starting picamera MJPEG stream... +[2026-04-23 18:43:21,280] [INFO] Camera started +[2026-04-23 18:46:40,604] [INFO] Camera stopped +[2026-04-23 18:46:41,028] [INFO] Stopped MJPEG stream. +[2026-04-23 18:46:41,233] [INFO] Camera configuration has been adjusted! +[2026-04-23 18:46:41,244] [INFO] Configuration successful! +[2026-04-23 18:46:41,295] [INFO] Camera started +[2026-04-23 18:46:42,257] [INFO] Camera stopped +[2026-04-23 18:46:42,263] [INFO] Camera configuration has been adjusted! +[2026-04-23 18:46:42,274] [INFO] Configuration successful! +[2026-04-23 18:46:42,312] [INFO] Starting picamera MJPEG stream... +[2026-04-23 18:46:42,355] [INFO] Camera started +[2026-04-23 18:47:39,154] [INFO] Camera stopped +[2026-04-23 18:47:39,579] [INFO] Stopped MJPEG stream. +[2026-04-23 18:47:39,786] [INFO] Camera configuration has been adjusted! +[2026-04-23 18:47:39,797] [INFO] Configuration successful! +[2026-04-23 18:47:39,847] [INFO] Camera started +[2026-04-23 18:47:40,808] [INFO] Camera stopped +[2026-04-23 18:47:40,813] [INFO] Camera configuration has been adjusted! +[2026-04-23 18:47:40,824] [INFO] Configuration successful! +[2026-04-23 18:47:40,863] [INFO] Starting picamera MJPEG stream... +[2026-04-23 18:47:40,904] [INFO] Camera started +[2026-04-23 19:41:03,249] [INFO] Camera stopped +[2026-04-23 19:41:03,627] [INFO] Stopped MJPEG stream. +[2026-04-23 19:41:03,832] [INFO] Camera configuration has been adjusted! +[2026-04-23 19:41:03,842] [INFO] Configuration successful! +[2026-04-23 19:41:03,891] [INFO] Camera started +[2026-04-23 19:41:04,850] [INFO] Camera stopped +[2026-04-23 19:41:04,855] [INFO] Camera configuration has been adjusted! +[2026-04-23 19:41:04,865] [INFO] Configuration successful! +[2026-04-23 19:41:04,900] [INFO] Starting picamera MJPEG stream... +[2026-04-23 19:41:04,939] [INFO] Camera started +[2026-04-23 19:43:16,398] [INFO] Camera stopped +[2026-04-23 19:43:16,834] [INFO] Stopped MJPEG stream. +[2026-04-23 19:43:17,044] [INFO] Camera configuration has been adjusted! +[2026-04-23 19:43:17,061] [INFO] Configuration successful! +[2026-04-23 19:43:17,136] [INFO] Camera started +[2026-04-23 19:43:18,178] [INFO] Camera stopped +[2026-04-23 19:43:18,183] [INFO] Camera configuration has been adjusted! +[2026-04-23 19:43:18,193] [INFO] Configuration successful! +[2026-04-23 19:43:18,227] [INFO] Starting picamera MJPEG stream... +[2026-04-23 19:43:18,267] [INFO] Camera started +[2026-04-23 20:03:03,144] [INFO] Camera stopped +[2026-04-23 20:03:03,573] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:03:03,590] [INFO] Configuration successful! +[2026-04-23 20:03:03,898] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:03:03,961] [INFO] Camera started +[2026-04-23 20:03:15,581] [INFO] Moving to (12505, 4175) +[2026-04-23 20:03:26,399] [INFO] Moving to (16959, 4175) +[2026-04-23 20:03:56,129] [INFO] Moving to (21413, 4175) +[2026-04-23 20:04:20,523] [INFO] Moving to (12505, 837) +[2026-04-23 20:04:43,210] [INFO] Moving to (16959, 837) +[2026-04-23 20:05:17,604] [INFO] Moving to (21413, 837) +[2026-04-23 20:05:44,490] [INFO] Camera stopped +[2026-04-23 20:05:45,496] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:05:45,570] [INFO] Configuration successful! +[2026-04-23 20:05:45,687] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:05:45,824] [INFO] Camera started +[2026-04-23 20:05:45,857] [INFO] Returning to starting position. +[2026-04-23 20:05:54,796] [INFO] Waiting for background processes to finish... +[2026-04-23 20:10:02,630] [INFO] Camera stopped +[2026-04-23 20:10:03,105] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:03,789] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:03,790] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:04,275] [INFO] Camera closed successfully. +[2026-04-23 20:10:04,277] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:10,801] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:12,464] [INFO] Initialization successful. +[2026-04-23 20:10:12,471] [INFO] Camera now open. +[2026-04-23 20:10:12,496] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:12,502] [INFO] Configuration successful! +[2026-04-23 20:10:12,554] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:12,606] [INFO] Camera started +[2026-04-23 20:10:12,676] [INFO] Camera stopped +[2026-04-23 20:10:13,042] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:13,264] [INFO] Configuration successful! +[2026-04-23 20:10:13,355] [INFO] Camera started +[2026-04-23 20:10:15,436] [INFO] {'level': 132, 'exposure_time': 75, 'analog_gain': 1.0} +[2026-04-23 20:10:16,446] [INFO] {'level': 254, 'exposure_time': 226, 'analog_gain': 1.0} +[2026-04-23 20:10:17,435] [INFO] {'level': 347, 'exposure_time': 340, 'analog_gain': 1.0} +[2026-04-23 20:10:18,339] [INFO] {'level': 377, 'exposure_time': 378, 'analog_gain': 1.0} +[2026-04-23 20:10:19,234] [INFO] {'level': 393, 'exposure_time': 396, 'analog_gain': 1.0} +[2026-04-23 20:10:19,598] [INFO] {'level': 392, 'exposure_time': 396, 'analog_gain': 1.0} +[2026-04-23 20:10:19,599] [INFO] Brightness has converged to within 5%. +[2026-04-23 20:10:20,125] [INFO] Camera stopped +[2026-04-23 20:10:20,131] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:20,141] [INFO] Configuration successful! +[2026-04-23 20:10:20,177] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:20,216] [INFO] Camera started +[2026-04-23 20:10:20,272] [INFO] Camera stopped +[2026-04-23 20:10:20,645] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:20,871] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:20,871] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:21,087] [INFO] Camera closed successfully. +[2026-04-23 20:10:21,088] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:21,436] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:21,501] [INFO] Initialization successful. +[2026-04-23 20:10:21,502] [INFO] Camera now open. +[2026-04-23 20:10:21,514] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:21,519] [INFO] Configuration successful! +[2026-04-23 20:10:21,557] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:21,598] [INFO] Camera started +[2026-04-23 20:10:21,659] [INFO] Camera stopped +[2026-04-23 20:10:22,387] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:22,647] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:22,648] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:22,883] [INFO] Camera closed successfully. +[2026-04-23 20:10:22,885] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:23,380] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:23,518] [INFO] Initialization successful. +[2026-04-23 20:10:23,520] [INFO] Camera now open. +[2026-04-23 20:10:23,544] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:23,553] [INFO] Configuration successful! +[2026-04-23 20:10:23,603] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:23,665] [INFO] Camera started +[2026-04-23 20:10:23,743] [INFO] Camera stopped +[2026-04-23 20:10:24,449] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:24,661] [INFO] Configuration successful! +[2026-04-23 20:10:24,712] [INFO] Camera started +[2026-04-23 20:10:24,938] [INFO] Camera stopped +[2026-04-23 20:10:25,272] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:25,273] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:25,551] [INFO] Camera closed successfully. +[2026-04-23 20:10:25,552] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:25,880] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:25,945] [INFO] Initialization successful. +[2026-04-23 20:10:25,946] [INFO] Camera now open. +[2026-04-23 20:10:25,958] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:25,965] [INFO] Configuration successful! +[2026-04-23 20:10:25,995] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:26,035] [INFO] Camera started +[2026-04-23 20:10:47,216] [INFO] Camera stopped +[2026-04-23 20:10:47,648] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:47,875] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:47,875] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:48,223] [INFO] Camera closed successfully. +[2026-04-23 20:10:48,223] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:48,555] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:48,623] [INFO] Initialization successful. +[2026-04-23 20:10:48,624] [INFO] Camera now open. +[2026-04-23 20:10:48,636] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:48,641] [INFO] Configuration successful! +[2026-04-23 20:10:48,671] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:48,712] [INFO] Camera started +[2026-04-23 20:10:48,769] [INFO] Camera stopped +[2026-04-23 20:10:49,145] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:49,366] [INFO] Configuration successful! +[2026-04-23 20:10:49,447] [INFO] Camera started +[2026-04-23 20:10:50,876] [INFO] {'level': 131, 'exposure_time': 75, 'analog_gain': 1.0} +[2026-04-23 20:10:51,856] [INFO] {'level': 254, 'exposure_time': 226, 'analog_gain': 1.0} +[2026-04-23 20:10:53,007] [INFO] {'level': 346, 'exposure_time': 340, 'analog_gain': 1.0} +[2026-04-23 20:10:54,225] [INFO] {'level': 375, 'exposure_time': 378, 'analog_gain': 1.0} +[2026-04-23 20:10:55,179] [INFO] {'level': 393, 'exposure_time': 396, 'analog_gain': 1.0} +[2026-04-23 20:10:55,529] [INFO] {'level': 389, 'exposure_time': 396, 'analog_gain': 1.0} +[2026-04-23 20:10:55,530] [INFO] Brightness has converged to within 5%. +[2026-04-23 20:10:56,061] [INFO] Camera stopped +[2026-04-23 20:10:56,067] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:56,077] [INFO] Configuration successful! +[2026-04-23 20:10:56,113] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:56,154] [INFO] Camera started +[2026-04-23 20:10:56,211] [INFO] Camera stopped +[2026-04-23 20:10:56,584] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:56,837] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:56,847] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:57,235] [INFO] Camera closed successfully. +[2026-04-23 20:10:57,237] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:57,751] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:57,896] [INFO] Initialization successful. +[2026-04-23 20:10:57,898] [INFO] Camera now open. +[2026-04-23 20:10:57,923] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:57,930] [INFO] Configuration successful! +[2026-04-23 20:10:57,981] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:58,046] [INFO] Camera started +[2026-04-23 20:10:58,126] [INFO] Camera stopped +[2026-04-23 20:10:58,493] [INFO] Stopped MJPEG stream. +[2026-04-23 20:10:58,741] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:10:58,743] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:10:59,156] [INFO] Camera closed successfully. +[2026-04-23 20:10:59,157] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:10:59,653] [INFO] Creating new Picamera2 object +[2026-04-23 20:10:59,791] [INFO] Initialization successful. +[2026-04-23 20:10:59,793] [INFO] Camera now open. +[2026-04-23 20:10:59,817] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:10:59,825] [INFO] Configuration successful! +[2026-04-23 20:10:59,875] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:10:59,938] [INFO] Camera started +[2026-04-23 20:11:00,017] [INFO] Camera stopped +[2026-04-23 20:11:00,719] [INFO] Stopped MJPEG stream. +[2026-04-23 20:11:00,931] [INFO] Configuration successful! +[2026-04-23 20:11:00,982] [INFO] Camera started +[2026-04-23 20:11:01,233] [INFO] Camera stopped +[2026-04-23 20:11:01,552] [INFO] Closing picamera object for reinitialisation +[2026-04-23 20:11:01,552] [INFO] Camera object already exists, closing for reinitialisation +[2026-04-23 20:11:01,846] [INFO] Camera closed successfully. +[2026-04-23 20:11:01,847] [INFO] Picamera closed, deleting picamera +[2026-04-23 20:11:02,173] [INFO] Creating new Picamera2 object +[2026-04-23 20:11:02,238] [INFO] Initialization successful. +[2026-04-23 20:11:02,239] [INFO] Camera now open. +[2026-04-23 20:11:02,252] [INFO] Camera configuration has been adjusted! +[2026-04-23 20:11:02,257] [INFO] Configuration successful! +[2026-04-23 20:11:02,287] [INFO] Starting picamera MJPEG stream... +[2026-04-23 20:11:02,332] [INFO] Camera started +[2026-04-23 20:14:15,849] [INFO] Calibrating Y axis: +[2026-04-23 20:14:17,729] [INFO] Moving the stage until we see motion... +[2026-04-23 20:14:32,772] [INFO] Moving the stage to the edge of the field of view... +[2026-04-23 20:14:35,598] [INFO] Moving the stage backwards to measure backlash (1/2) +[2026-04-23 20:14:50,104] [INFO] Moving the stage forwards to measure backlash (2/2) +[2026-04-23 20:15:08,453] [INFO] Moving back to the start, correcting for backlash... +[2026-04-23 20:15:19,980] [INFO] Estimated backlash 95 steps +[2026-04-23 20:15:19,983] [INFO] Stage-to-image ratio 0.050 pixels/step +[2026-04-23 20:15:19,984] [INFO] Residuals were about 0.03 times the step size +[2026-04-23 20:15:20,288] [INFO] Calibrating X axis: +[2026-04-23 20:15:21,668] [INFO] Moving the stage until we see motion... +[2026-04-23 20:15:35,860] [INFO] Moving the stage to the edge of the field of view... +[2026-04-23 20:15:41,098] [INFO] Moving the stage backwards to measure backlash (1/2) +[2026-04-23 20:15:58,893] [INFO] Moving the stage forwards to measure backlash (2/2) +[2026-04-23 20:16:17,078] [INFO] Moving back to the start, correcting for backlash... +[2026-04-23 20:16:25,507] [INFO] Estimated backlash 40 steps +[2026-04-23 20:16:25,510] [INFO] Stage-to-image ratio 0.050 pixels/step +[2026-04-23 20:16:25,511] [INFO] Residuals were about 0.01 times the step size +[2026-04-23 20:16:25,814] [INFO] Calibration complete, updating metadata. +[2026-04-23 20:16:25,816] [INFO] CSM matrix is [0.07, -9.93,],[10.05, 0.02]. +[2026-04-23 23:42:26,623] [INFO] OFM server root logger has been set up at INFO level +[2026-04-23 23:42:27,492] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-23 23:42:27,494] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-23 23:42:27,494] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-23 23:42:28,987] [INFO] Started server process [514] +[2026-04-23 23:42:28,988] [INFO] Waiting for application startup. +[2026-04-23 23:42:29,031] [INFO] Creating new Picamera2 object +[2026-04-23 23:42:29,172] [INFO] Initialization successful. +[2026-04-23 23:42:29,173] [INFO] Camera now open. +[2026-04-23 23:42:29,187] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,192] [INFO] Configuration successful! +[2026-04-23 23:42:29,216] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,219] [INFO] Configuration successful! +[2026-04-23 23:42:29,244] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,247] [INFO] Configuration successful! +[2026-04-23 23:42:29,272] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,275] [INFO] Configuration successful! +[2026-04-23 23:42:29,319] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,322] [INFO] Configuration successful! +[2026-04-23 23:42:29,345] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,348] [INFO] Configuration successful! +[2026-04-23 23:42:29,371] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,374] [INFO] Configuration successful! +[2026-04-23 23:42:29,397] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,401] [INFO] Configuration successful! +[2026-04-23 23:42:29,440] [INFO] Camera configuration has been adjusted! +[2026-04-23 23:42:29,444] [INFO] Configuration successful! +[2026-04-23 23:42:29,480] [INFO] Starting picamera MJPEG stream... +[2026-04-23 23:42:29,531] [INFO] Camera started +[2026-04-23 23:42:29,564] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-23 23:42:29,565] [INFO] Updating ESI port settings +[2026-04-23 23:42:29,566] [INFO] Opening ESI connection to port None +[2026-04-23 23:42:29,582] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-23 23:42:29,583] [INFO] Creating serial.Serial instance... +[2026-04-23 23:42:29,584] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-23 23:42:29,585] [INFO] Testing communication to SangaBoard +[2026-04-23 23:42:29,585] [INFO] Running firmware checks... +[2026-04-23 23:42:29,590] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-23 23:42:29,593] [INFO] Success! +[2026-04-23 23:42:29,594] [INFO] Creating serial.Serial instance... +[2026-04-23 23:42:29,595] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-23 23:42:29,596] [INFO] Testing communication to SangaBoard +[2026-04-23 23:42:29,596] [INFO] Running firmware checks... +[2026-04-23 23:42:29,602] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-23 23:42:29,603] [INFO] Opened ESI connection to port None +[2026-04-23 23:42:29,603] [INFO] Checking valid firmware... +[2026-04-23 23:42:29,604] [INFO] Running firmware checks... +[2026-04-23 23:42:29,609] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-23 23:42:29,610] [INFO] Loading modules... +[2026-04-23 23:42:29,631] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-23 23:42:29,647] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-23 23:42:29,660] [INFO] Application startup complete. +[2026-04-23 23:42:29,695] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-24 01:05:02,469] [INFO] OFM server root logger has been set up at INFO level +[2026-04-24 01:05:03,340] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 01:05:03,341] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 01:05:03,341] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 01:05:04,838] [INFO] Started server process [516] +[2026-04-24 01:05:04,839] [INFO] Waiting for application startup. +[2026-04-24 01:05:04,883] [INFO] Creating new Picamera2 object +[2026-04-24 01:05:05,024] [INFO] Initialization successful. +[2026-04-24 01:05:05,026] [INFO] Camera now open. +[2026-04-24 01:05:05,039] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,044] [INFO] Configuration successful! +[2026-04-24 01:05:05,069] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,073] [INFO] Configuration successful! +[2026-04-24 01:05:05,097] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,100] [INFO] Configuration successful! +[2026-04-24 01:05:05,125] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,128] [INFO] Configuration successful! +[2026-04-24 01:05:05,172] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,175] [INFO] Configuration successful! +[2026-04-24 01:05:05,198] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,201] [INFO] Configuration successful! +[2026-04-24 01:05:05,223] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,226] [INFO] Configuration successful! +[2026-04-24 01:05:05,249] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,253] [INFO] Configuration successful! +[2026-04-24 01:05:05,292] [INFO] Camera configuration has been adjusted! +[2026-04-24 01:05:05,295] [INFO] Configuration successful! +[2026-04-24 01:05:05,333] [INFO] Starting picamera MJPEG stream... +[2026-04-24 01:05:05,385] [INFO] Camera started +[2026-04-24 01:05:05,419] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-24 01:05:05,419] [INFO] Updating ESI port settings +[2026-04-24 01:05:05,420] [INFO] Opening ESI connection to port None +[2026-04-24 01:05:05,436] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-24 01:05:05,436] [INFO] Creating serial.Serial instance... +[2026-04-24 01:05:05,438] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 01:05:05,438] [INFO] Testing communication to SangaBoard +[2026-04-24 01:05:05,439] [INFO] Running firmware checks... +[2026-04-24 01:05:05,444] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 01:05:05,447] [INFO] Success! +[2026-04-24 01:05:05,448] [INFO] Creating serial.Serial instance... +[2026-04-24 01:05:05,449] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 01:05:05,450] [INFO] Testing communication to SangaBoard +[2026-04-24 01:05:05,450] [INFO] Running firmware checks... +[2026-04-24 01:05:05,456] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 01:05:05,456] [INFO] Opened ESI connection to port None +[2026-04-24 01:05:05,457] [INFO] Checking valid firmware... +[2026-04-24 01:05:05,457] [INFO] Running firmware checks... +[2026-04-24 01:05:05,463] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 01:05:05,464] [INFO] Loading modules... +[2026-04-24 01:05:05,487] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-24 01:05:05,504] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-24 01:05:05,519] [INFO] Application startup complete. +[2026-04-24 01:05:05,550] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-24 02:33:31,979] [INFO] OFM server root logger has been set up at INFO level +[2026-04-24 02:33:32,845] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 02:33:32,846] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 02:33:32,846] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 02:33:34,332] [INFO] Started server process [513] +[2026-04-24 02:33:34,334] [INFO] Waiting for application startup. +[2026-04-24 02:33:34,377] [INFO] Creating new Picamera2 object +[2026-04-24 02:33:34,518] [INFO] Initialization successful. +[2026-04-24 02:33:34,519] [INFO] Camera now open. +[2026-04-24 02:33:34,532] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,537] [INFO] Configuration successful! +[2026-04-24 02:33:34,561] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,565] [INFO] Configuration successful! +[2026-04-24 02:33:34,590] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,593] [INFO] Configuration successful! +[2026-04-24 02:33:34,618] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,621] [INFO] Configuration successful! +[2026-04-24 02:33:34,665] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,668] [INFO] Configuration successful! +[2026-04-24 02:33:34,691] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,694] [INFO] Configuration successful! +[2026-04-24 02:33:34,716] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,719] [INFO] Configuration successful! +[2026-04-24 02:33:34,742] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,745] [INFO] Configuration successful! +[2026-04-24 02:33:34,785] [INFO] Camera configuration has been adjusted! +[2026-04-24 02:33:34,791] [INFO] Configuration successful! +[2026-04-24 02:33:34,827] [INFO] Starting picamera MJPEG stream... +[2026-04-24 02:33:34,877] [INFO] Camera started +[2026-04-24 02:33:34,911] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-24 02:33:34,912] [INFO] Updating ESI port settings +[2026-04-24 02:33:34,912] [INFO] Opening ESI connection to port None +[2026-04-24 02:33:34,928] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-24 02:33:34,928] [INFO] Creating serial.Serial instance... +[2026-04-24 02:33:34,930] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 02:33:34,930] [INFO] Testing communication to SangaBoard +[2026-04-24 02:33:34,931] [INFO] Running firmware checks... +[2026-04-24 02:33:34,936] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 02:33:34,939] [INFO] Success! +[2026-04-24 02:33:34,940] [INFO] Creating serial.Serial instance... +[2026-04-24 02:33:34,941] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 02:33:34,942] [INFO] Testing communication to SangaBoard +[2026-04-24 02:33:34,942] [INFO] Running firmware checks... +[2026-04-24 02:33:34,948] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 02:33:34,949] [INFO] Opened ESI connection to port None +[2026-04-24 02:33:34,949] [INFO] Checking valid firmware... +[2026-04-24 02:33:34,950] [INFO] Running firmware checks... +[2026-04-24 02:33:34,955] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 02:33:34,956] [INFO] Loading modules... +[2026-04-24 02:33:34,979] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-24 02:33:34,995] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-24 02:33:35,009] [INFO] Application startup complete. +[2026-04-24 02:33:35,050] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-24 02:33:46,536] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:46,673] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:49,135] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:49,181] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:49,990] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:50,037] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:51,176] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:51,276] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:52,137] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:52,161] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:57,052] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:57,087] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:57,647] [WARNING] Invalid HTTP request received. +[2026-04-24 02:33:57,683] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:02,823] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:02,888] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:04,678] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:04,688] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:05,198] [WARNING] Invalid HTTP request received. +[2026-04-24 02:34:05,239] [WARNING] Invalid HTTP request received. +[2026-04-24 17:28:01,555] [INFO] OFM server root logger has been set up at INFO level +[2026-04-24 17:28:02,425] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 17:28:02,426] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 17:28:02,426] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 17:28:03,921] [INFO] Started server process [514] +[2026-04-24 17:28:03,922] [INFO] Waiting for application startup. +[2026-04-24 17:28:03,967] [INFO] Creating new Picamera2 object +[2026-04-24 17:28:04,108] [INFO] Initialization successful. +[2026-04-24 17:28:04,109] [INFO] Camera now open. +[2026-04-24 17:28:04,122] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,127] [INFO] Configuration successful! +[2026-04-24 17:28:04,153] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,157] [INFO] Configuration successful! +[2026-04-24 17:28:04,182] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,185] [INFO] Configuration successful! +[2026-04-24 17:28:04,210] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,213] [INFO] Configuration successful! +[2026-04-24 17:28:04,257] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,261] [INFO] Configuration successful! +[2026-04-24 17:28:04,283] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,287] [INFO] Configuration successful! +[2026-04-24 17:28:04,309] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,312] [INFO] Configuration successful! +[2026-04-24 17:28:04,335] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,338] [INFO] Configuration successful! +[2026-04-24 17:28:04,377] [INFO] Camera configuration has been adjusted! +[2026-04-24 17:28:04,381] [INFO] Configuration successful! +[2026-04-24 17:28:04,417] [INFO] Starting picamera MJPEG stream... +[2026-04-24 17:28:04,468] [INFO] Camera started +[2026-04-24 17:28:04,502] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-24 17:28:04,503] [INFO] Updating ESI port settings +[2026-04-24 17:28:04,503] [INFO] Opening ESI connection to port None +[2026-04-24 17:28:04,519] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-24 17:28:04,520] [INFO] Creating serial.Serial instance... +[2026-04-24 17:28:04,521] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 17:28:04,522] [INFO] Testing communication to SangaBoard +[2026-04-24 17:28:04,522] [INFO] Running firmware checks... +[2026-04-24 17:28:04,528] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 17:28:04,530] [INFO] Success! +[2026-04-24 17:28:04,531] [INFO] Creating serial.Serial instance... +[2026-04-24 17:28:04,532] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 17:28:04,533] [INFO] Testing communication to SangaBoard +[2026-04-24 17:28:04,534] [INFO] Running firmware checks... +[2026-04-24 17:28:04,539] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 17:28:04,540] [INFO] Opened ESI connection to port None +[2026-04-24 17:28:04,540] [INFO] Checking valid firmware... +[2026-04-24 17:28:04,541] [INFO] Running firmware checks... +[2026-04-24 17:28:04,546] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 17:28:04,547] [INFO] Loading modules... +[2026-04-24 17:28:04,570] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-24 17:28:04,586] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-24 17:28:04,599] [INFO] Application startup complete. +[2026-04-24 17:28:04,634] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-24 20:07:00,020] [INFO] OFM server root logger has been set up at INFO level +[2026-04-24 20:07:00,891] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 20:07:00,892] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 20:07:00,893] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-24 20:07:02,384] [INFO] Started server process [515] +[2026-04-24 20:07:02,385] [INFO] Waiting for application startup. +[2026-04-24 20:07:02,429] [INFO] Creating new Picamera2 object +[2026-04-24 20:07:02,570] [INFO] Initialization successful. +[2026-04-24 20:07:02,571] [INFO] Camera now open. +[2026-04-24 20:07:02,584] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,589] [INFO] Configuration successful! +[2026-04-24 20:07:02,612] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,616] [INFO] Configuration successful! +[2026-04-24 20:07:02,640] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,643] [INFO] Configuration successful! +[2026-04-24 20:07:02,668] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,671] [INFO] Configuration successful! +[2026-04-24 20:07:02,714] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,718] [INFO] Configuration successful! +[2026-04-24 20:07:02,740] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,743] [INFO] Configuration successful! +[2026-04-24 20:07:02,765] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,768] [INFO] Configuration successful! +[2026-04-24 20:07:02,791] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,794] [INFO] Configuration successful! +[2026-04-24 20:07:02,833] [INFO] Camera configuration has been adjusted! +[2026-04-24 20:07:02,837] [INFO] Configuration successful! +[2026-04-24 20:07:02,872] [INFO] Starting picamera MJPEG stream... +[2026-04-24 20:07:02,921] [INFO] Camera started +[2026-04-24 20:07:02,956] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-24 20:07:02,957] [INFO] Updating ESI port settings +[2026-04-24 20:07:02,957] [INFO] Opening ESI connection to port None +[2026-04-24 20:07:02,973] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-24 20:07:02,974] [INFO] Creating serial.Serial instance... +[2026-04-24 20:07:02,975] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 20:07:02,975] [INFO] Testing communication to SangaBoard +[2026-04-24 20:07:02,976] [INFO] Running firmware checks... +[2026-04-24 20:07:02,982] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 20:07:02,984] [INFO] Success! +[2026-04-24 20:07:02,985] [INFO] Creating serial.Serial instance... +[2026-04-24 20:07:02,987] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-24 20:07:02,987] [INFO] Testing communication to SangaBoard +[2026-04-24 20:07:02,988] [INFO] Running firmware checks... +[2026-04-24 20:07:02,993] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 20:07:02,994] [INFO] Opened ESI connection to port None +[2026-04-24 20:07:02,995] [INFO] Checking valid firmware... +[2026-04-24 20:07:02,995] [INFO] Running firmware checks... +[2026-04-24 20:07:03,000] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-24 20:07:03,001] [INFO] Loading modules... +[2026-04-24 20:07:03,024] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-24 20:07:03,044] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-24 20:07:03,055] [INFO] Application startup complete. +[2026-04-24 20:07:03,091] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-25 00:38:15,909] [INFO] OFM server root logger has been set up at INFO level +[2026-04-25 00:38:16,775] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-25 00:38:16,776] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-25 00:38:16,776] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-25 00:38:18,261] [INFO] Started server process [513] +[2026-04-25 00:38:18,263] [INFO] Waiting for application startup. +[2026-04-25 00:38:18,306] [INFO] Creating new Picamera2 object +[2026-04-25 00:38:18,447] [INFO] Initialization successful. +[2026-04-25 00:38:18,448] [INFO] Camera now open. +[2026-04-25 00:38:18,461] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,467] [INFO] Configuration successful! +[2026-04-25 00:38:18,491] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,495] [INFO] Configuration successful! +[2026-04-25 00:38:18,519] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,522] [INFO] Configuration successful! +[2026-04-25 00:38:18,548] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,551] [INFO] Configuration successful! +[2026-04-25 00:38:18,598] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,601] [INFO] Configuration successful! +[2026-04-25 00:38:18,624] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,627] [INFO] Configuration successful! +[2026-04-25 00:38:18,649] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,653] [INFO] Configuration successful! +[2026-04-25 00:38:18,676] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,679] [INFO] Configuration successful! +[2026-04-25 00:38:18,718] [INFO] Camera configuration has been adjusted! +[2026-04-25 00:38:18,722] [INFO] Configuration successful! +[2026-04-25 00:38:18,758] [INFO] Starting picamera MJPEG stream... +[2026-04-25 00:38:18,808] [INFO] Camera started +[2026-04-25 00:38:18,841] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-25 00:38:18,842] [INFO] Updating ESI port settings +[2026-04-25 00:38:18,843] [INFO] Opening ESI connection to port None +[2026-04-25 00:38:18,859] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-25 00:38:18,860] [INFO] Creating serial.Serial instance... +[2026-04-25 00:38:18,862] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-25 00:38:18,863] [INFO] Testing communication to SangaBoard +[2026-04-25 00:38:18,863] [INFO] Running firmware checks... +[2026-04-25 00:38:18,868] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-25 00:38:18,871] [INFO] Success! +[2026-04-25 00:38:18,872] [INFO] Creating serial.Serial instance... +[2026-04-25 00:38:18,874] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-25 00:38:18,875] [INFO] Testing communication to SangaBoard +[2026-04-25 00:38:18,875] [INFO] Running firmware checks... +[2026-04-25 00:38:18,880] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-25 00:38:18,881] [INFO] Opened ESI connection to port None +[2026-04-25 00:38:18,882] [INFO] Checking valid firmware... +[2026-04-25 00:38:18,882] [INFO] Running firmware checks... +[2026-04-25 00:38:18,888] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-25 00:38:18,889] [INFO] Loading modules... +[2026-04-25 00:38:18,911] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-25 00:38:18,928] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-25 00:38:18,939] [INFO] Application startup complete. +[2026-04-25 00:38:18,971] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-28 11:33:35,026] [INFO] OFM server root logger has been set up at INFO level +[2026-04-28 11:33:35,899] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-28 11:33:35,900] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-28 11:33:35,900] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-28 11:33:37,417] [INFO] Started server process [514] +[2026-04-28 11:33:37,419] [INFO] Waiting for application startup. +[2026-04-28 11:33:37,462] [INFO] Creating new Picamera2 object +[2026-04-28 11:33:37,603] [INFO] Initialization successful. +[2026-04-28 11:33:37,604] [INFO] Camera now open. +[2026-04-28 11:33:37,617] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,622] [INFO] Configuration successful! +[2026-04-28 11:33:37,647] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,651] [INFO] Configuration successful! +[2026-04-28 11:33:37,675] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,678] [INFO] Configuration successful! +[2026-04-28 11:33:37,704] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,707] [INFO] Configuration successful! +[2026-04-28 11:33:37,751] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,754] [INFO] Configuration successful! +[2026-04-28 11:33:37,777] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,781] [INFO] Configuration successful! +[2026-04-28 11:33:37,803] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,806] [INFO] Configuration successful! +[2026-04-28 11:33:37,830] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,833] [INFO] Configuration successful! +[2026-04-28 11:33:37,873] [INFO] Camera configuration has been adjusted! +[2026-04-28 11:33:37,876] [INFO] Configuration successful! +[2026-04-28 11:33:37,913] [INFO] Starting picamera MJPEG stream... +[2026-04-28 11:33:37,964] [INFO] Camera started +[2026-04-28 11:33:37,997] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-28 11:33:37,998] [INFO] Updating ESI port settings +[2026-04-28 11:33:37,999] [INFO] Opening ESI connection to port None +[2026-04-28 11:33:38,014] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-28 11:33:38,015] [INFO] Creating serial.Serial instance... +[2026-04-28 11:33:38,016] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-28 11:33:38,017] [INFO] Testing communication to SangaBoard +[2026-04-28 11:33:38,017] [INFO] Running firmware checks... +[2026-04-28 11:33:38,023] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-28 11:33:38,025] [INFO] Success! +[2026-04-28 11:33:38,026] [INFO] Creating serial.Serial instance... +[2026-04-28 11:33:38,028] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-28 11:33:38,028] [INFO] Testing communication to SangaBoard +[2026-04-28 11:33:38,029] [INFO] Running firmware checks... +[2026-04-28 11:33:38,034] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-28 11:33:38,035] [INFO] Opened ESI connection to port None +[2026-04-28 11:33:38,036] [INFO] Checking valid firmware... +[2026-04-28 11:33:38,036] [INFO] Running firmware checks... +[2026-04-28 11:33:38,042] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-28 11:33:38,042] [INFO] Loading modules... +[2026-04-28 11:33:38,063] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-28 11:33:38,078] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-28 11:33:38,091] [INFO] Application startup complete. +[2026-04-28 11:33:38,136] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-29 11:54:23,013] [INFO] Shutting down +[2026-04-29 11:54:23,114] [INFO] Waiting for application shutdown. +[2026-04-29 11:54:23,134] [INFO] Camera stopped +[2026-04-29 11:54:23,510] [INFO] Stopped MJPEG stream. +[2026-04-29 11:54:23,943] [INFO] Camera closed successfully. +[2026-04-29 11:54:23,945] [INFO] Application shutdown complete. +[2026-04-29 11:54:23,945] [INFO] Finished server process [514] +[2026-04-29 11:54:36,398] [INFO] OFM server root logger has been set up at INFO level +[2026-04-29 11:54:37,247] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 11:54:37,248] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 11:54:37,249] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 11:54:38,509] [INFO] Started server process [1062] +[2026-04-29 11:54:38,511] [INFO] Waiting for application startup. +[2026-04-29 11:54:38,544] [INFO] Creating new Picamera2 object +[2026-04-29 11:54:38,612] [INFO] Initialization successful. +[2026-04-29 11:54:38,613] [INFO] Camera now open. +[2026-04-29 11:54:38,626] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,630] [INFO] Configuration successful! +[2026-04-29 11:54:38,650] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,653] [INFO] Configuration successful! +[2026-04-29 11:54:38,677] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,681] [INFO] Configuration successful! +[2026-04-29 11:54:38,706] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,709] [INFO] Configuration successful! +[2026-04-29 11:54:38,757] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,760] [INFO] Configuration successful! +[2026-04-29 11:54:38,783] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,786] [INFO] Configuration successful! +[2026-04-29 11:54:38,808] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,811] [INFO] Configuration successful! +[2026-04-29 11:54:38,835] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,838] [INFO] Configuration successful! +[2026-04-29 11:54:38,877] [INFO] Camera configuration has been adjusted! +[2026-04-29 11:54:38,881] [INFO] Configuration successful! +[2026-04-29 11:54:38,917] [INFO] Starting picamera MJPEG stream... +[2026-04-29 11:54:38,968] [INFO] Camera started +[2026-04-29 11:54:38,999] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-29 11:54:39,000] [INFO] Updating ESI port settings +[2026-04-29 11:54:39,000] [INFO] Opening ESI connection to port None +[2026-04-29 11:54:39,017] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-29 11:54:39,017] [INFO] Creating serial.Serial instance... +[2026-04-29 11:54:39,018] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 11:54:39,019] [INFO] Testing communication to SangaBoard +[2026-04-29 11:54:39,019] [INFO] Running firmware checks... +[2026-04-29 11:54:39,025] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 11:54:39,027] [INFO] Success! +[2026-04-29 11:54:39,028] [INFO] Creating serial.Serial instance... +[2026-04-29 11:54:39,029] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 11:54:39,030] [INFO] Testing communication to SangaBoard +[2026-04-29 11:54:39,030] [INFO] Running firmware checks... +[2026-04-29 11:54:39,036] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 11:54:39,037] [INFO] Opened ESI connection to port None +[2026-04-29 11:54:39,037] [INFO] Checking valid firmware... +[2026-04-29 11:54:39,038] [INFO] Running firmware checks... +[2026-04-29 11:54:39,043] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 11:54:39,044] [INFO] Loading modules... +[2026-04-29 11:54:39,066] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-29 11:54:39,082] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-29 11:54:39,092] [INFO] Application startup complete. +[2026-04-29 11:54:39,125] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-29 12:31:14,570] [WARNING] Invalid HTTP request received. +[2026-04-29 12:31:14,633] [WARNING] Invalid HTTP request received. +[2026-04-29 12:31:18,978] [WARNING] Invalid HTTP request received. +[2026-04-29 12:31:19,004] [WARNING] Invalid HTTP request received. +[2026-04-29 12:31:26,694] [WARNING] Invalid HTTP request received. +[2026-04-29 12:31:26,715] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:21,447] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:21,469] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:24,188] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:24,200] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:30,497] [WARNING] Invalid HTTP request received. +[2026-04-29 12:32:30,510] [WARNING] Invalid HTTP request received. +[2026-04-29 12:42:02,064] [WARNING] Invalid HTTP request received. +[2026-04-29 12:42:02,256] [WARNING] Invalid HTTP request received. +[2026-04-29 13:53:39,556] [INFO] OFM server root logger has been set up at INFO level +[2026-04-29 13:53:40,430] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 13:53:40,431] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 13:53:40,432] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 13:53:41,933] [INFO] Started server process [517] +[2026-04-29 13:53:41,934] [INFO] Waiting for application startup. +[2026-04-29 13:53:41,978] [INFO] Creating new Picamera2 object +[2026-04-29 13:53:42,119] [INFO] Initialization successful. +[2026-04-29 13:53:42,120] [INFO] Camera now open. +[2026-04-29 13:53:42,133] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,139] [INFO] Configuration successful! +[2026-04-29 13:53:42,163] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,166] [INFO] Configuration successful! +[2026-04-29 13:53:42,191] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,194] [INFO] Configuration successful! +[2026-04-29 13:53:42,220] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,223] [INFO] Configuration successful! +[2026-04-29 13:53:42,266] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,270] [INFO] Configuration successful! +[2026-04-29 13:53:42,293] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,297] [INFO] Configuration successful! +[2026-04-29 13:53:42,319] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,322] [INFO] Configuration successful! +[2026-04-29 13:53:42,345] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,348] [INFO] Configuration successful! +[2026-04-29 13:53:42,387] [INFO] Camera configuration has been adjusted! +[2026-04-29 13:53:42,391] [INFO] Configuration successful! +[2026-04-29 13:53:42,426] [INFO] Starting picamera MJPEG stream... +[2026-04-29 13:53:42,477] [INFO] Camera started +[2026-04-29 13:53:42,511] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-29 13:53:42,511] [INFO] Updating ESI port settings +[2026-04-29 13:53:42,512] [INFO] Opening ESI connection to port None +[2026-04-29 13:53:42,528] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-29 13:53:42,528] [INFO] Creating serial.Serial instance... +[2026-04-29 13:53:42,530] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 13:53:42,530] [INFO] Testing communication to SangaBoard +[2026-04-29 13:53:42,531] [INFO] Running firmware checks... +[2026-04-29 13:53:42,536] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 13:53:42,539] [INFO] Success! +[2026-04-29 13:53:42,540] [INFO] Creating serial.Serial instance... +[2026-04-29 13:53:42,541] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 13:53:42,542] [INFO] Testing communication to SangaBoard +[2026-04-29 13:53:42,542] [INFO] Running firmware checks... +[2026-04-29 13:53:42,548] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 13:53:42,549] [INFO] Opened ESI connection to port None +[2026-04-29 13:53:42,549] [INFO] Checking valid firmware... +[2026-04-29 13:53:42,550] [INFO] Running firmware checks... +[2026-04-29 13:53:42,555] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 13:53:42,556] [INFO] Loading modules... +[2026-04-29 13:53:42,579] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-29 13:53:42,596] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-29 13:53:42,610] [INFO] Application startup complete. +[2026-04-29 13:53:42,644] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-29 14:06:08,572] [WARNING] Invalid HTTP request received. +[2026-04-29 14:06:08,797] [WARNING] Invalid HTTP request received. +[2026-04-29 14:06:09,540] [WARNING] Invalid HTTP request received. +[2026-04-29 14:06:09,545] [WARNING] Invalid HTTP request received. +[2026-04-29 14:38:40,424] [INFO] OFM server root logger has been set up at INFO level +[2026-04-29 14:38:41,292] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 14:38:41,293] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 14:38:41,294] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-29 14:38:42,787] [INFO] Started server process [514] +[2026-04-29 14:38:42,788] [INFO] Waiting for application startup. +[2026-04-29 14:38:42,832] [INFO] Creating new Picamera2 object +[2026-04-29 14:38:42,973] [INFO] Initialization successful. +[2026-04-29 14:38:42,974] [INFO] Camera now open. +[2026-04-29 14:38:42,987] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:42,993] [INFO] Configuration successful! +[2026-04-29 14:38:43,017] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,021] [INFO] Configuration successful! +[2026-04-29 14:38:43,046] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,049] [INFO] Configuration successful! +[2026-04-29 14:38:43,074] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,078] [INFO] Configuration successful! +[2026-04-29 14:38:43,121] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,125] [INFO] Configuration successful! +[2026-04-29 14:38:43,148] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,151] [INFO] Configuration successful! +[2026-04-29 14:38:43,173] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,176] [INFO] Configuration successful! +[2026-04-29 14:38:43,200] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,203] [INFO] Configuration successful! +[2026-04-29 14:38:43,242] [INFO] Camera configuration has been adjusted! +[2026-04-29 14:38:43,246] [INFO] Configuration successful! +[2026-04-29 14:38:43,282] [INFO] Starting picamera MJPEG stream... +[2026-04-29 14:38:43,332] [INFO] Camera started +[2026-04-29 14:38:43,365] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-29 14:38:43,366] [INFO] Updating ESI port settings +[2026-04-29 14:38:43,366] [INFO] Opening ESI connection to port None +[2026-04-29 14:38:43,382] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-29 14:38:43,383] [INFO] Creating serial.Serial instance... +[2026-04-29 14:38:43,384] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 14:38:43,385] [INFO] Testing communication to SangaBoard +[2026-04-29 14:38:43,385] [INFO] Running firmware checks... +[2026-04-29 14:38:43,391] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 14:38:43,393] [INFO] Success! +[2026-04-29 14:38:43,394] [INFO] Creating serial.Serial instance... +[2026-04-29 14:38:43,395] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-29 14:38:43,396] [INFO] Testing communication to SangaBoard +[2026-04-29 14:38:43,397] [INFO] Running firmware checks... +[2026-04-29 14:38:43,402] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 14:38:43,403] [INFO] Opened ESI connection to port None +[2026-04-29 14:38:43,404] [INFO] Checking valid firmware... +[2026-04-29 14:38:43,404] [INFO] Running firmware checks... +[2026-04-29 14:38:43,409] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-29 14:38:43,410] [INFO] Loading modules... +[2026-04-29 14:38:43,431] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-29 14:38:43,447] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-29 14:38:43,461] [INFO] Application startup complete. +[2026-04-29 14:38:43,490] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-29 16:45:02,217] [WARNING] Invalid HTTP request received. +[2026-04-29 16:45:02,577] [WARNING] Invalid HTTP request received. +[2026-04-29 16:45:03,300] [WARNING] Invalid HTTP request received. +[2026-04-29 16:45:32,157] [WARNING] Invalid HTTP request received. +[2026-04-29 16:45:32,264] [WARNING] Invalid HTTP request received. +[2026-04-30 03:21:54,429] [INFO] OFM server root logger has been set up at INFO level +[2026-04-30 03:21:55,300] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 03:21:55,300] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 03:21:55,301] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 03:21:56,790] [INFO] Started server process [516] +[2026-04-30 03:21:56,792] [INFO] Waiting for application startup. +[2026-04-30 03:21:56,851] [INFO] Creating new Picamera2 object +[2026-04-30 03:21:56,991] [INFO] Initialization successful. +[2026-04-30 03:21:56,992] [INFO] Camera now open. +[2026-04-30 03:21:57,005] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,010] [INFO] Configuration successful! +[2026-04-30 03:21:57,034] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,038] [INFO] Configuration successful! +[2026-04-30 03:21:57,062] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,066] [INFO] Configuration successful! +[2026-04-30 03:21:57,091] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,094] [INFO] Configuration successful! +[2026-04-30 03:21:57,138] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,141] [INFO] Configuration successful! +[2026-04-30 03:21:57,164] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,167] [INFO] Configuration successful! +[2026-04-30 03:21:57,189] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,193] [INFO] Configuration successful! +[2026-04-30 03:21:57,216] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,220] [INFO] Configuration successful! +[2026-04-30 03:21:57,259] [INFO] Camera configuration has been adjusted! +[2026-04-30 03:21:57,263] [INFO] Configuration successful! +[2026-04-30 03:21:57,300] [INFO] Starting picamera MJPEG stream... +[2026-04-30 03:21:57,351] [INFO] Camera started +[2026-04-30 03:21:57,383] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-30 03:21:57,384] [INFO] Updating ESI port settings +[2026-04-30 03:21:57,385] [INFO] Opening ESI connection to port None +[2026-04-30 03:21:57,400] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-30 03:21:57,401] [INFO] Creating serial.Serial instance... +[2026-04-30 03:21:57,402] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 03:21:57,403] [INFO] Testing communication to SangaBoard +[2026-04-30 03:21:57,403] [INFO] Running firmware checks... +[2026-04-30 03:21:57,409] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 03:21:57,411] [INFO] Success! +[2026-04-30 03:21:57,412] [INFO] Creating serial.Serial instance... +[2026-04-30 03:21:57,414] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 03:21:57,415] [INFO] Testing communication to SangaBoard +[2026-04-30 03:21:57,415] [INFO] Running firmware checks... +[2026-04-30 03:21:57,421] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 03:21:57,421] [INFO] Opened ESI connection to port None +[2026-04-30 03:21:57,422] [INFO] Checking valid firmware... +[2026-04-30 03:21:57,422] [INFO] Running firmware checks... +[2026-04-30 03:21:57,428] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 03:21:57,428] [INFO] Loading modules... +[2026-04-30 03:21:57,449] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-30 03:21:57,465] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-30 03:21:57,479] [INFO] Application startup complete. +[2026-04-30 03:21:57,515] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-30 14:54:59,165] [INFO] OFM server root logger has been set up at INFO level +[2026-04-30 14:55:00,038] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 14:55:00,039] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 14:55:00,040] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 14:55:01,532] [INFO] Started server process [514] +[2026-04-30 14:55:01,534] [INFO] Waiting for application startup. +[2026-04-30 14:55:01,577] [INFO] Creating new Picamera2 object +[2026-04-30 14:55:01,718] [INFO] Initialization successful. +[2026-04-30 14:55:01,719] [INFO] Camera now open. +[2026-04-30 14:55:01,732] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,737] [INFO] Configuration successful! +[2026-04-30 14:55:01,762] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,766] [INFO] Configuration successful! +[2026-04-30 14:55:01,790] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,793] [INFO] Configuration successful! +[2026-04-30 14:55:01,818] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,821] [INFO] Configuration successful! +[2026-04-30 14:55:01,864] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,868] [INFO] Configuration successful! +[2026-04-30 14:55:01,890] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,894] [INFO] Configuration successful! +[2026-04-30 14:55:01,915] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,919] [INFO] Configuration successful! +[2026-04-30 14:55:01,941] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,945] [INFO] Configuration successful! +[2026-04-30 14:55:01,984] [INFO] Camera configuration has been adjusted! +[2026-04-30 14:55:01,987] [INFO] Configuration successful! +[2026-04-30 14:55:02,022] [INFO] Starting picamera MJPEG stream... +[2026-04-30 14:55:02,074] [INFO] Camera started +[2026-04-30 14:55:02,107] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-30 14:55:02,108] [INFO] Updating ESI port settings +[2026-04-30 14:55:02,108] [INFO] Opening ESI connection to port None +[2026-04-30 14:55:02,124] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-30 14:55:02,125] [INFO] Creating serial.Serial instance... +[2026-04-30 14:55:02,126] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 14:55:02,127] [INFO] Testing communication to SangaBoard +[2026-04-30 14:55:02,127] [INFO] Running firmware checks... +[2026-04-30 14:55:02,132] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 14:55:02,135] [INFO] Success! +[2026-04-30 14:55:02,136] [INFO] Creating serial.Serial instance... +[2026-04-30 14:55:02,137] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 14:55:02,137] [INFO] Testing communication to SangaBoard +[2026-04-30 14:55:02,138] [INFO] Running firmware checks... +[2026-04-30 14:55:02,144] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 14:55:02,145] [INFO] Opened ESI connection to port None +[2026-04-30 14:55:02,145] [INFO] Checking valid firmware... +[2026-04-30 14:55:02,145] [INFO] Running firmware checks... +[2026-04-30 14:55:02,151] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 14:55:02,152] [INFO] Loading modules... +[2026-04-30 14:55:02,175] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-30 14:55:02,191] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-30 14:55:02,204] [INFO] Application startup complete. +[2026-04-30 14:55:02,238] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-04-30 15:05:17,363] [WARNING] Invalid HTTP request received. +[2026-04-30 15:05:17,372] [WARNING] Invalid HTTP request received. +[2026-04-30 15:09:44,387] [INFO] OFM server root logger has been set up at INFO level +[2026-04-30 15:09:45,256] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 15:09:45,257] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 15:09:45,258] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-04-30 15:09:46,745] [INFO] Started server process [512] +[2026-04-30 15:09:46,747] [INFO] Waiting for application startup. +[2026-04-30 15:09:46,790] [INFO] Creating new Picamera2 object +[2026-04-30 15:09:46,931] [INFO] Initialization successful. +[2026-04-30 15:09:46,933] [INFO] Camera now open. +[2026-04-30 15:09:46,946] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:46,951] [INFO] Configuration successful! +[2026-04-30 15:09:46,975] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:46,978] [INFO] Configuration successful! +[2026-04-30 15:09:47,002] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,006] [INFO] Configuration successful! +[2026-04-30 15:09:47,031] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,034] [INFO] Configuration successful! +[2026-04-30 15:09:47,078] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,081] [INFO] Configuration successful! +[2026-04-30 15:09:47,104] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,107] [INFO] Configuration successful! +[2026-04-30 15:09:47,129] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,132] [INFO] Configuration successful! +[2026-04-30 15:09:47,155] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,159] [INFO] Configuration successful! +[2026-04-30 15:09:47,198] [INFO] Camera configuration has been adjusted! +[2026-04-30 15:09:47,201] [INFO] Configuration successful! +[2026-04-30 15:09:47,237] [INFO] Starting picamera MJPEG stream... +[2026-04-30 15:09:47,291] [INFO] Camera started +[2026-04-30 15:09:47,322] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-04-30 15:09:47,322] [INFO] Updating ESI port settings +[2026-04-30 15:09:47,323] [INFO] Opening ESI connection to port None +[2026-04-30 15:09:47,339] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-04-30 15:09:47,339] [INFO] Creating serial.Serial instance... +[2026-04-30 15:09:47,340] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 15:09:47,341] [INFO] Testing communication to SangaBoard +[2026-04-30 15:09:47,341] [INFO] Running firmware checks... +[2026-04-30 15:09:47,347] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 15:09:47,350] [INFO] Success! +[2026-04-30 15:09:47,350] [INFO] Creating serial.Serial instance... +[2026-04-30 15:09:47,352] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-04-30 15:09:47,352] [INFO] Testing communication to SangaBoard +[2026-04-30 15:09:47,353] [INFO] Running firmware checks... +[2026-04-30 15:09:47,358] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 15:09:47,359] [INFO] Opened ESI connection to port None +[2026-04-30 15:09:47,359] [INFO] Checking valid firmware... +[2026-04-30 15:09:47,360] [INFO] Running firmware checks... +[2026-04-30 15:09:47,365] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-04-30 15:09:47,366] [INFO] Loading modules... +[2026-04-30 15:09:47,389] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-04-30 15:09:47,405] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-04-30 15:09:47,418] [INFO] Application startup complete. +[2026-04-30 15:09:47,446] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-01 04:57:35,148] [WARNING] Invalid HTTP request received. +[2026-05-01 04:57:35,177] [WARNING] Invalid HTTP request received. +[2026-05-01 07:36:47,365] [WARNING] Invalid HTTP request received. +[2026-05-01 07:36:47,492] [WARNING] Invalid HTTP request received. +[2026-05-01 07:53:20,450] [INFO] Finding a list of all overlapping images +[2026-05-01 07:53:20,655] [INFO] Starting correlation of overlapping image pairs. +[2026-05-01 07:53:38,594] [INFO] Correlation complete. Pairs loaded from cache: 3, pairs calculated: 4 +[2026-05-01 07:53:38,606] [INFO] Getting all the image info ready to stitch +[2026-05-01 07:53:38,613] [INFO] Plotting the inputs to stitching +[2026-05-01 07:53:43,479] [INFO] Finding the optimal threshold +[2026-05-01 07:53:43,486] [INFO] Starting with 7 possible peak quality thresholds and 7 possible stage discrepancy thresholds +[2026-05-01 07:53:43,487] [INFO] After filtering and resampling 7 peak quality thresholds and 7 stage discrepancy thresholds will be trialed for fit quality. +[2026-05-01 07:53:49,353] [INFO] Using 6 of the 7 pairs for final optimisation +[2026-05-01 07:53:49,354] [INFO] Starting csm is [[ 0.033 , -4.9262], [ 4.938 , 0.0053]] +[2026-05-01 07:53:49,356] [INFO] A better starting estimate of the csm is [[ 0.0329, -5.0151], [ 5.0115, -0.0088]]. +[2026-05-01 07:53:51,404] [INFO] Final image will be exported with size (1901, 3431) pixels +[2026-05-01 07:53:51,421] [INFO] Exporting stitched image. Depending on the size of your scan, this may take a while. +[2026-05-01 07:54:02,608] [INFO] Stitching complete +[2026-05-01 17:47:45,443] [INFO] OFM server root logger has been set up at INFO level +[2026-05-01 17:47:46,354] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 17:47:46,355] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 17:47:46,356] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 17:47:47,904] [INFO] Started server process [512] +[2026-05-01 17:47:47,905] [INFO] Waiting for application startup. +[2026-05-01 17:47:47,950] [INFO] Creating new Picamera2 object +[2026-05-01 17:47:48,094] [INFO] Initialization successful. +[2026-05-01 17:47:48,095] [INFO] Camera now open. +[2026-05-01 17:47:48,109] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,114] [INFO] Configuration successful! +[2026-05-01 17:47:48,139] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,143] [INFO] Configuration successful! +[2026-05-01 17:47:48,167] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,171] [INFO] Configuration successful! +[2026-05-01 17:47:48,197] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,200] [INFO] Configuration successful! +[2026-05-01 17:47:48,244] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,248] [INFO] Configuration successful! +[2026-05-01 17:47:48,271] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,275] [INFO] Configuration successful! +[2026-05-01 17:47:48,297] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,301] [INFO] Configuration successful! +[2026-05-01 17:47:48,324] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,328] [INFO] Configuration successful! +[2026-05-01 17:47:48,367] [INFO] Camera configuration has been adjusted! +[2026-05-01 17:47:48,371] [INFO] Configuration successful! +[2026-05-01 17:47:48,408] [INFO] Starting picamera MJPEG stream... +[2026-05-01 17:47:48,460] [INFO] Camera started +[2026-05-01 17:47:48,494] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-01 17:47:48,495] [INFO] Updating ESI port settings +[2026-05-01 17:47:48,496] [INFO] Opening ESI connection to port None +[2026-05-01 17:47:48,511] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-01 17:47:48,512] [INFO] Creating serial.Serial instance... +[2026-05-01 17:47:48,513] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 17:47:48,514] [INFO] Testing communication to SangaBoard +[2026-05-01 17:47:48,514] [INFO] Running firmware checks... +[2026-05-01 17:47:48,519] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 17:47:48,522] [INFO] Success! +[2026-05-01 17:47:48,523] [INFO] Creating serial.Serial instance... +[2026-05-01 17:47:48,524] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 17:47:48,525] [INFO] Testing communication to SangaBoard +[2026-05-01 17:47:48,526] [INFO] Running firmware checks... +[2026-05-01 17:47:48,531] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 17:47:48,532] [INFO] Opened ESI connection to port None +[2026-05-01 17:47:48,532] [INFO] Checking valid firmware... +[2026-05-01 17:47:48,533] [INFO] Running firmware checks... +[2026-05-01 17:47:48,538] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 17:47:48,539] [INFO] Loading modules... +[2026-05-01 17:47:48,559] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-01 17:47:48,575] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-01 17:47:48,587] [INFO] Application startup complete. +[2026-05-01 17:47:48,629] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-01 18:43:05,934] [INFO] OFM server root logger has been set up at INFO level +[2026-05-01 18:43:06,817] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 18:43:06,818] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 18:43:06,818] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 18:43:08,323] [INFO] Started server process [512] +[2026-05-01 18:43:08,324] [INFO] Waiting for application startup. +[2026-05-01 18:43:08,368] [INFO] Creating new Picamera2 object +[2026-05-01 18:43:08,511] [INFO] Initialization successful. +[2026-05-01 18:43:08,512] [INFO] Camera now open. +[2026-05-01 18:43:08,525] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,531] [INFO] Configuration successful! +[2026-05-01 18:43:08,555] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,559] [INFO] Configuration successful! +[2026-05-01 18:43:08,583] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,588] [INFO] Configuration successful! +[2026-05-01 18:43:08,613] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,616] [INFO] Configuration successful! +[2026-05-01 18:43:08,659] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,663] [INFO] Configuration successful! +[2026-05-01 18:43:08,685] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,690] [INFO] Configuration successful! +[2026-05-01 18:43:08,712] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,716] [INFO] Configuration successful! +[2026-05-01 18:43:08,739] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,743] [INFO] Configuration successful! +[2026-05-01 18:43:08,786] [INFO] Camera configuration has been adjusted! +[2026-05-01 18:43:08,790] [INFO] Configuration successful! +[2026-05-01 18:43:08,827] [INFO] Starting picamera MJPEG stream... +[2026-05-01 18:43:08,877] [INFO] Camera started +[2026-05-01 18:43:08,911] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-01 18:43:08,911] [INFO] Updating ESI port settings +[2026-05-01 18:43:08,912] [INFO] Opening ESI connection to port None +[2026-05-01 18:43:08,929] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-01 18:43:08,929] [INFO] Creating serial.Serial instance... +[2026-05-01 18:43:08,930] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 18:43:08,931] [INFO] Testing communication to SangaBoard +[2026-05-01 18:43:08,931] [INFO] Running firmware checks... +[2026-05-01 18:43:08,937] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 18:43:08,940] [INFO] Success! +[2026-05-01 18:43:08,941] [INFO] Creating serial.Serial instance... +[2026-05-01 18:43:08,942] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 18:43:08,943] [INFO] Testing communication to SangaBoard +[2026-05-01 18:43:08,943] [INFO] Running firmware checks... +[2026-05-01 18:43:08,949] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 18:43:08,950] [INFO] Opened ESI connection to port None +[2026-05-01 18:43:08,950] [INFO] Checking valid firmware... +[2026-05-01 18:43:08,951] [INFO] Running firmware checks... +[2026-05-01 18:43:08,956] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 18:43:08,957] [INFO] Loading modules... +[2026-05-01 18:43:08,980] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-01 18:43:08,999] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-01 18:43:09,009] [INFO] Application startup complete. +[2026-05-01 18:43:09,041] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-01 19:06:55,664] [INFO] OFM server root logger has been set up at INFO level +[2026-05-01 19:06:56,540] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 19:06:56,541] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 19:06:56,541] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-01 19:06:58,036] [INFO] Started server process [515] +[2026-05-01 19:06:58,038] [INFO] Waiting for application startup. +[2026-05-01 19:06:58,121] [INFO] Creating new Picamera2 object +[2026-05-01 19:06:58,262] [INFO] Initialization successful. +[2026-05-01 19:06:58,263] [INFO] Camera now open. +[2026-05-01 19:06:58,276] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,281] [INFO] Configuration successful! +[2026-05-01 19:06:58,305] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,308] [INFO] Configuration successful! +[2026-05-01 19:06:58,332] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,335] [INFO] Configuration successful! +[2026-05-01 19:06:58,360] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,364] [INFO] Configuration successful! +[2026-05-01 19:06:58,407] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,410] [INFO] Configuration successful! +[2026-05-01 19:06:58,433] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,436] [INFO] Configuration successful! +[2026-05-01 19:06:58,458] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,462] [INFO] Configuration successful! +[2026-05-01 19:06:58,485] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,488] [INFO] Configuration successful! +[2026-05-01 19:06:58,527] [INFO] Camera configuration has been adjusted! +[2026-05-01 19:06:58,531] [INFO] Configuration successful! +[2026-05-01 19:06:58,567] [INFO] Starting picamera MJPEG stream... +[2026-05-01 19:06:58,618] [INFO] Camera started +[2026-05-01 19:06:58,652] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-01 19:06:58,653] [INFO] Updating ESI port settings +[2026-05-01 19:06:58,653] [INFO] Opening ESI connection to port None +[2026-05-01 19:06:58,669] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-01 19:06:58,670] [INFO] Creating serial.Serial instance... +[2026-05-01 19:06:58,671] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 19:06:58,672] [INFO] Testing communication to SangaBoard +[2026-05-01 19:06:58,672] [INFO] Running firmware checks... +[2026-05-01 19:06:58,678] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 19:06:58,680] [INFO] Success! +[2026-05-01 19:06:58,681] [INFO] Creating serial.Serial instance... +[2026-05-01 19:06:58,683] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-01 19:06:58,684] [INFO] Testing communication to SangaBoard +[2026-05-01 19:06:58,684] [INFO] Running firmware checks... +[2026-05-01 19:06:58,690] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 19:06:58,691] [INFO] Opened ESI connection to port None +[2026-05-01 19:06:58,691] [INFO] Checking valid firmware... +[2026-05-01 19:06:58,691] [INFO] Running firmware checks... +[2026-05-01 19:06:58,697] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-01 19:06:58,698] [INFO] Loading modules... +[2026-05-01 19:06:58,720] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-01 19:06:58,741] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-01 19:06:58,751] [INFO] Application startup complete. +[2026-05-01 19:06:58,781] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:01:49,243] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:01:50,154] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:01:50,155] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:01:50,156] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:01:51,690] [INFO] Started server process [513] +[2026-05-02 14:01:51,691] [INFO] Waiting for application startup. +[2026-05-02 14:01:51,735] [INFO] Creating new Picamera2 object +[2026-05-02 14:01:51,878] [INFO] Initialization successful. +[2026-05-02 14:01:51,879] [INFO] Camera now open. +[2026-05-02 14:01:51,893] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:51,898] [INFO] Configuration successful! +[2026-05-02 14:01:51,923] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:51,927] [INFO] Configuration successful! +[2026-05-02 14:01:51,952] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:51,955] [INFO] Configuration successful! +[2026-05-02 14:01:51,981] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:51,984] [INFO] Configuration successful! +[2026-05-02 14:01:52,028] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:52,032] [INFO] Configuration successful! +[2026-05-02 14:01:52,055] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:52,059] [INFO] Configuration successful! +[2026-05-02 14:01:52,081] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:52,084] [INFO] Configuration successful! +[2026-05-02 14:01:52,108] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:52,111] [INFO] Configuration successful! +[2026-05-02 14:01:52,151] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:01:52,155] [INFO] Configuration successful! +[2026-05-02 14:01:52,191] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:01:52,243] [INFO] Camera started +[2026-05-02 14:01:52,277] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:01:52,278] [INFO] Updating ESI port settings +[2026-05-02 14:01:52,278] [INFO] Opening ESI connection to port None +[2026-05-02 14:01:52,296] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:01:52,296] [INFO] Creating serial.Serial instance... +[2026-05-02 14:01:52,298] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:01:52,299] [INFO] Testing communication to SangaBoard +[2026-05-02 14:01:52,299] [INFO] Running firmware checks... +[2026-05-02 14:01:52,305] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:01:52,308] [INFO] Success! +[2026-05-02 14:01:52,309] [INFO] Creating serial.Serial instance... +[2026-05-02 14:01:52,310] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:01:52,311] [INFO] Testing communication to SangaBoard +[2026-05-02 14:01:52,311] [INFO] Running firmware checks... +[2026-05-02 14:01:52,317] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:01:52,318] [INFO] Opened ESI connection to port None +[2026-05-02 14:01:52,318] [INFO] Checking valid firmware... +[2026-05-02 14:01:52,319] [INFO] Running firmware checks... +[2026-05-02 14:01:52,324] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:01:52,325] [INFO] Loading modules... +[2026-05-02 14:01:52,347] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:01:52,363] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:01:52,374] [INFO] Application startup complete. +[2026-05-02 14:01:52,403] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:07:42,931] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:07:43,806] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:07:43,807] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:07:43,808] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:07:45,301] [INFO] Started server process [514] +[2026-05-02 14:07:45,303] [INFO] Waiting for application startup. +[2026-05-02 14:07:45,346] [INFO] Creating new Picamera2 object +[2026-05-02 14:07:45,487] [INFO] Initialization successful. +[2026-05-02 14:07:45,488] [INFO] Camera now open. +[2026-05-02 14:07:45,502] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,507] [INFO] Configuration successful! +[2026-05-02 14:07:45,533] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,537] [INFO] Configuration successful! +[2026-05-02 14:07:45,561] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,565] [INFO] Configuration successful! +[2026-05-02 14:07:45,590] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,593] [INFO] Configuration successful! +[2026-05-02 14:07:45,636] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,640] [INFO] Configuration successful! +[2026-05-02 14:07:45,662] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,665] [INFO] Configuration successful! +[2026-05-02 14:07:45,687] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,690] [INFO] Configuration successful! +[2026-05-02 14:07:45,713] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,716] [INFO] Configuration successful! +[2026-05-02 14:07:45,755] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:07:45,759] [INFO] Configuration successful! +[2026-05-02 14:07:45,793] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:07:45,843] [INFO] Camera started +[2026-05-02 14:07:45,878] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:07:45,879] [INFO] Updating ESI port settings +[2026-05-02 14:07:45,879] [INFO] Opening ESI connection to port None +[2026-05-02 14:07:45,895] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:07:45,895] [INFO] Creating serial.Serial instance... +[2026-05-02 14:07:45,897] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:07:45,897] [INFO] Testing communication to SangaBoard +[2026-05-02 14:07:45,898] [INFO] Running firmware checks... +[2026-05-02 14:07:45,903] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:07:45,906] [INFO] Success! +[2026-05-02 14:07:45,907] [INFO] Creating serial.Serial instance... +[2026-05-02 14:07:45,908] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:07:45,909] [INFO] Testing communication to SangaBoard +[2026-05-02 14:07:45,910] [INFO] Running firmware checks... +[2026-05-02 14:07:45,915] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:07:45,916] [INFO] Opened ESI connection to port None +[2026-05-02 14:07:45,916] [INFO] Checking valid firmware... +[2026-05-02 14:07:45,917] [INFO] Running firmware checks... +[2026-05-02 14:07:45,922] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:07:45,924] [INFO] Loading modules... +[2026-05-02 14:07:45,946] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:07:45,963] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:07:45,975] [INFO] Application startup complete. +[2026-05-02 14:07:46,009] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:17:29,495] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:17:30,371] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:17:30,372] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:17:30,373] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:17:31,864] [INFO] Started server process [512] +[2026-05-02 14:17:31,867] [INFO] Waiting for application startup. +[2026-05-02 14:17:31,911] [INFO] Creating new Picamera2 object +[2026-05-02 14:17:32,052] [INFO] Initialization successful. +[2026-05-02 14:17:32,053] [INFO] Camera now open. +[2026-05-02 14:17:32,066] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,071] [INFO] Configuration successful! +[2026-05-02 14:17:32,095] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,099] [INFO] Configuration successful! +[2026-05-02 14:17:32,123] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,127] [INFO] Configuration successful! +[2026-05-02 14:17:32,152] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,155] [INFO] Configuration successful! +[2026-05-02 14:17:32,199] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,202] [INFO] Configuration successful! +[2026-05-02 14:17:32,225] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,228] [INFO] Configuration successful! +[2026-05-02 14:17:32,255] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,259] [INFO] Configuration successful! +[2026-05-02 14:17:32,283] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,287] [INFO] Configuration successful! +[2026-05-02 14:17:32,326] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:17:32,330] [INFO] Configuration successful! +[2026-05-02 14:17:32,366] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:17:32,417] [INFO] Camera started +[2026-05-02 14:17:32,452] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:17:32,453] [INFO] Updating ESI port settings +[2026-05-02 14:17:32,453] [INFO] Opening ESI connection to port None +[2026-05-02 14:17:32,470] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:17:32,470] [INFO] Creating serial.Serial instance... +[2026-05-02 14:17:32,472] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:17:32,472] [INFO] Testing communication to SangaBoard +[2026-05-02 14:17:32,473] [INFO] Running firmware checks... +[2026-05-02 14:17:32,478] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:17:32,480] [INFO] Success! +[2026-05-02 14:17:32,481] [INFO] Creating serial.Serial instance... +[2026-05-02 14:17:32,483] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:17:32,484] [INFO] Testing communication to SangaBoard +[2026-05-02 14:17:32,484] [INFO] Running firmware checks... +[2026-05-02 14:17:32,490] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:17:32,491] [INFO] Opened ESI connection to port None +[2026-05-02 14:17:32,491] [INFO] Checking valid firmware... +[2026-05-02 14:17:32,492] [INFO] Running firmware checks... +[2026-05-02 14:17:32,497] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:17:32,499] [INFO] Loading modules... +[2026-05-02 14:17:32,521] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:17:32,537] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:17:32,549] [INFO] Application startup complete. +[2026-05-02 14:17:32,583] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:38:50,000] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:38:50,898] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:38:50,899] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:38:50,899] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:38:52,393] [INFO] Started server process [515] +[2026-05-02 14:38:52,394] [INFO] Waiting for application startup. +[2026-05-02 14:38:52,438] [INFO] Creating new Picamera2 object +[2026-05-02 14:38:52,579] [INFO] Initialization successful. +[2026-05-02 14:38:52,580] [INFO] Camera now open. +[2026-05-02 14:38:52,593] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,598] [INFO] Configuration successful! +[2026-05-02 14:38:52,622] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,626] [INFO] Configuration successful! +[2026-05-02 14:38:52,650] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,653] [INFO] Configuration successful! +[2026-05-02 14:38:52,678] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,682] [INFO] Configuration successful! +[2026-05-02 14:38:52,725] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,728] [INFO] Configuration successful! +[2026-05-02 14:38:52,751] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,754] [INFO] Configuration successful! +[2026-05-02 14:38:52,776] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,779] [INFO] Configuration successful! +[2026-05-02 14:38:52,802] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,805] [INFO] Configuration successful! +[2026-05-02 14:38:52,845] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:38:52,848] [INFO] Configuration successful! +[2026-05-02 14:38:52,886] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:38:52,939] [INFO] Camera started +[2026-05-02 14:38:52,972] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:38:52,973] [INFO] Updating ESI port settings +[2026-05-02 14:38:52,973] [INFO] Opening ESI connection to port None +[2026-05-02 14:38:52,989] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:38:52,990] [INFO] Creating serial.Serial instance... +[2026-05-02 14:38:52,991] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:38:52,992] [INFO] Testing communication to SangaBoard +[2026-05-02 14:38:52,992] [INFO] Running firmware checks... +[2026-05-02 14:38:52,998] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:38:53,000] [INFO] Success! +[2026-05-02 14:38:53,001] [INFO] Creating serial.Serial instance... +[2026-05-02 14:38:53,003] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:38:53,003] [INFO] Testing communication to SangaBoard +[2026-05-02 14:38:53,004] [INFO] Running firmware checks... +[2026-05-02 14:38:53,009] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:38:53,010] [INFO] Opened ESI connection to port None +[2026-05-02 14:38:53,011] [INFO] Checking valid firmware... +[2026-05-02 14:38:53,011] [INFO] Running firmware checks... +[2026-05-02 14:38:53,017] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:38:53,018] [INFO] Loading modules... +[2026-05-02 14:38:53,038] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:38:53,054] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:38:53,067] [INFO] Application startup complete. +[2026-05-02 14:38:53,096] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:46:26,565] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:46:27,440] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:46:27,441] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:46:27,442] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:46:28,937] [INFO] Started server process [513] +[2026-05-02 14:46:28,938] [INFO] Waiting for application startup. +[2026-05-02 14:46:28,981] [INFO] Creating new Picamera2 object +[2026-05-02 14:46:29,123] [INFO] Initialization successful. +[2026-05-02 14:46:29,124] [INFO] Camera now open. +[2026-05-02 14:46:29,137] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,143] [INFO] Configuration successful! +[2026-05-02 14:46:29,167] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,170] [INFO] Configuration successful! +[2026-05-02 14:46:29,194] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,198] [INFO] Configuration successful! +[2026-05-02 14:46:29,223] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,226] [INFO] Configuration successful! +[2026-05-02 14:46:29,270] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,273] [INFO] Configuration successful! +[2026-05-02 14:46:29,296] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,299] [INFO] Configuration successful! +[2026-05-02 14:46:29,322] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,325] [INFO] Configuration successful! +[2026-05-02 14:46:29,348] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,351] [INFO] Configuration successful! +[2026-05-02 14:46:29,391] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:46:29,394] [INFO] Configuration successful! +[2026-05-02 14:46:29,432] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:46:29,484] [INFO] Camera started +[2026-05-02 14:46:29,519] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:46:29,520] [INFO] Updating ESI port settings +[2026-05-02 14:46:29,520] [INFO] Opening ESI connection to port None +[2026-05-02 14:46:29,536] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:46:29,536] [INFO] Creating serial.Serial instance... +[2026-05-02 14:46:29,538] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:46:29,538] [INFO] Testing communication to SangaBoard +[2026-05-02 14:46:29,538] [INFO] Running firmware checks... +[2026-05-02 14:46:29,544] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:46:29,546] [INFO] Success! +[2026-05-02 14:46:29,547] [INFO] Creating serial.Serial instance... +[2026-05-02 14:46:29,549] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:46:29,550] [INFO] Testing communication to SangaBoard +[2026-05-02 14:46:29,550] [INFO] Running firmware checks... +[2026-05-02 14:46:29,556] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:46:29,557] [INFO] Opened ESI connection to port None +[2026-05-02 14:46:29,557] [INFO] Checking valid firmware... +[2026-05-02 14:46:29,557] [INFO] Running firmware checks... +[2026-05-02 14:46:29,563] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:46:29,564] [INFO] Loading modules... +[2026-05-02 14:46:29,586] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:46:29,603] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:46:29,614] [INFO] Application startup complete. +[2026-05-02 14:46:29,666] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 14:51:24,942] [INFO] OFM server root logger has been set up at INFO level +[2026-05-02 14:51:25,819] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:51:25,820] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:51:25,820] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-02 14:51:27,320] [INFO] Started server process [513] +[2026-05-02 14:51:27,321] [INFO] Waiting for application startup. +[2026-05-02 14:51:27,364] [INFO] Creating new Picamera2 object +[2026-05-02 14:51:27,505] [INFO] Initialization successful. +[2026-05-02 14:51:27,507] [INFO] Camera now open. +[2026-05-02 14:51:27,520] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,526] [INFO] Configuration successful! +[2026-05-02 14:51:27,550] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,553] [INFO] Configuration successful! +[2026-05-02 14:51:27,577] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,581] [INFO] Configuration successful! +[2026-05-02 14:51:27,606] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,609] [INFO] Configuration successful! +[2026-05-02 14:51:27,652] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,656] [INFO] Configuration successful! +[2026-05-02 14:51:27,678] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,682] [INFO] Configuration successful! +[2026-05-02 14:51:27,704] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,707] [INFO] Configuration successful! +[2026-05-02 14:51:27,730] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,733] [INFO] Configuration successful! +[2026-05-02 14:51:27,772] [INFO] Camera configuration has been adjusted! +[2026-05-02 14:51:27,776] [INFO] Configuration successful! +[2026-05-02 14:51:27,811] [INFO] Starting picamera MJPEG stream... +[2026-05-02 14:51:27,861] [INFO] Camera started +[2026-05-02 14:51:27,895] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-02 14:51:27,896] [INFO] Updating ESI port settings +[2026-05-02 14:51:27,896] [INFO] Opening ESI connection to port None +[2026-05-02 14:51:27,913] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-02 14:51:27,913] [INFO] Creating serial.Serial instance... +[2026-05-02 14:51:27,915] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:51:27,915] [INFO] Testing communication to SangaBoard +[2026-05-02 14:51:27,916] [INFO] Running firmware checks... +[2026-05-02 14:51:27,921] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:51:27,924] [INFO] Success! +[2026-05-02 14:51:27,925] [INFO] Creating serial.Serial instance... +[2026-05-02 14:51:27,926] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-02 14:51:27,927] [INFO] Testing communication to SangaBoard +[2026-05-02 14:51:27,928] [INFO] Running firmware checks... +[2026-05-02 14:51:27,933] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:51:27,935] [INFO] Opened ESI connection to port None +[2026-05-02 14:51:27,936] [INFO] Checking valid firmware... +[2026-05-02 14:51:27,936] [INFO] Running firmware checks... +[2026-05-02 14:51:27,943] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-02 14:51:27,944] [INFO] Loading modules... +[2026-05-02 14:51:27,965] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-02 14:51:27,981] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-02 14:51:27,993] [INFO] Application startup complete. +[2026-05-02 14:51:28,027] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-02 19:23:05,905] [WARNING] Invalid HTTP request received. +[2026-05-02 19:23:05,932] [WARNING] Invalid HTTP request received. +[2026-05-03 16:56:11,385] [INFO] OFM server root logger has been set up at INFO level +[2026-05-03 16:56:12,269] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 16:56:12,270] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 16:56:12,270] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 16:56:13,772] [INFO] Started server process [514] +[2026-05-03 16:56:13,773] [INFO] Waiting for application startup. +[2026-05-03 16:56:13,817] [INFO] Creating new Picamera2 object +[2026-05-03 16:56:13,958] [INFO] Initialization successful. +[2026-05-03 16:56:13,959] [INFO] Camera now open. +[2026-05-03 16:56:13,972] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:13,977] [INFO] Configuration successful! +[2026-05-03 16:56:14,002] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,006] [INFO] Configuration successful! +[2026-05-03 16:56:14,031] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,034] [INFO] Configuration successful! +[2026-05-03 16:56:14,059] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,063] [INFO] Configuration successful! +[2026-05-03 16:56:14,106] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,109] [INFO] Configuration successful! +[2026-05-03 16:56:14,132] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,136] [INFO] Configuration successful! +[2026-05-03 16:56:14,158] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,161] [INFO] Configuration successful! +[2026-05-03 16:56:14,184] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,187] [INFO] Configuration successful! +[2026-05-03 16:56:14,228] [INFO] Camera configuration has been adjusted! +[2026-05-03 16:56:14,231] [INFO] Configuration successful! +[2026-05-03 16:56:14,267] [INFO] Starting picamera MJPEG stream... +[2026-05-03 16:56:14,318] [INFO] Camera started +[2026-05-03 16:56:14,353] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-03 16:56:14,354] [INFO] Updating ESI port settings +[2026-05-03 16:56:14,354] [INFO] Opening ESI connection to port None +[2026-05-03 16:56:14,370] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-03 16:56:14,371] [INFO] Creating serial.Serial instance... +[2026-05-03 16:56:14,373] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 16:56:14,373] [INFO] Testing communication to SangaBoard +[2026-05-03 16:56:14,374] [INFO] Running firmware checks... +[2026-05-03 16:56:14,380] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 16:56:14,383] [INFO] Success! +[2026-05-03 16:56:14,384] [INFO] Creating serial.Serial instance... +[2026-05-03 16:56:14,386] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 16:56:14,386] [INFO] Testing communication to SangaBoard +[2026-05-03 16:56:14,387] [INFO] Running firmware checks... +[2026-05-03 16:56:14,392] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 16:56:14,393] [INFO] Opened ESI connection to port None +[2026-05-03 16:56:14,393] [INFO] Checking valid firmware... +[2026-05-03 16:56:14,394] [INFO] Running firmware checks... +[2026-05-03 16:56:14,400] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 16:56:14,401] [INFO] Loading modules... +[2026-05-03 16:56:14,422] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-03 16:56:14,439] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-03 16:56:14,452] [INFO] Application startup complete. +[2026-05-03 16:56:14,481] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-03 17:00:05,603] [INFO] OFM server root logger has been set up at INFO level +[2026-05-03 17:00:06,480] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:00:06,481] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:00:06,482] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:00:07,976] [INFO] Started server process [515] +[2026-05-03 17:00:07,978] [INFO] Waiting for application startup. +[2026-05-03 17:00:08,021] [INFO] Creating new Picamera2 object +[2026-05-03 17:00:08,183] [INFO] Initialization successful. +[2026-05-03 17:00:08,184] [INFO] Camera now open. +[2026-05-03 17:00:08,198] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,202] [INFO] Configuration successful! +[2026-05-03 17:00:08,226] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,230] [INFO] Configuration successful! +[2026-05-03 17:00:08,254] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,257] [INFO] Configuration successful! +[2026-05-03 17:00:08,282] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,286] [INFO] Configuration successful! +[2026-05-03 17:00:08,329] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,333] [INFO] Configuration successful! +[2026-05-03 17:00:08,355] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,359] [INFO] Configuration successful! +[2026-05-03 17:00:08,381] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,384] [INFO] Configuration successful! +[2026-05-03 17:00:08,407] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,410] [INFO] Configuration successful! +[2026-05-03 17:00:08,449] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:00:08,453] [INFO] Configuration successful! +[2026-05-03 17:00:08,490] [INFO] Starting picamera MJPEG stream... +[2026-05-03 17:00:08,541] [INFO] Camera started +[2026-05-03 17:00:08,577] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-03 17:00:08,578] [INFO] Updating ESI port settings +[2026-05-03 17:00:08,579] [INFO] Opening ESI connection to port None +[2026-05-03 17:00:08,594] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-03 17:00:08,595] [INFO] Creating serial.Serial instance... +[2026-05-03 17:00:08,596] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 17:00:08,597] [INFO] Testing communication to SangaBoard +[2026-05-03 17:00:08,597] [INFO] Running firmware checks... +[2026-05-03 17:00:08,603] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:00:08,605] [INFO] Success! +[2026-05-03 17:00:08,606] [INFO] Creating serial.Serial instance... +[2026-05-03 17:00:08,608] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 17:00:08,608] [INFO] Testing communication to SangaBoard +[2026-05-03 17:00:08,609] [INFO] Running firmware checks... +[2026-05-03 17:00:08,614] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:00:08,615] [INFO] Opened ESI connection to port None +[2026-05-03 17:00:08,616] [INFO] Checking valid firmware... +[2026-05-03 17:00:08,616] [INFO] Running firmware checks... +[2026-05-03 17:00:08,622] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:00:08,624] [INFO] Loading modules... +[2026-05-03 17:00:08,645] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-03 17:00:08,662] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-03 17:00:08,672] [INFO] Application startup complete. +[2026-05-03 17:00:08,715] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-03 17:59:19,334] [INFO] OFM server root logger has been set up at INFO level +[2026-05-03 17:59:20,212] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:59:20,213] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:59:20,214] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-03 17:59:21,709] [INFO] Started server process [513] +[2026-05-03 17:59:21,711] [INFO] Waiting for application startup. +[2026-05-03 17:59:21,754] [INFO] Creating new Picamera2 object +[2026-05-03 17:59:21,895] [INFO] Initialization successful. +[2026-05-03 17:59:21,896] [INFO] Camera now open. +[2026-05-03 17:59:21,909] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:21,914] [INFO] Configuration successful! +[2026-05-03 17:59:21,939] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:21,943] [INFO] Configuration successful! +[2026-05-03 17:59:21,967] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:21,970] [INFO] Configuration successful! +[2026-05-03 17:59:21,996] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:21,999] [INFO] Configuration successful! +[2026-05-03 17:59:22,043] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:22,046] [INFO] Configuration successful! +[2026-05-03 17:59:22,069] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:22,073] [INFO] Configuration successful! +[2026-05-03 17:59:22,095] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:22,098] [INFO] Configuration successful! +[2026-05-03 17:59:22,122] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:22,125] [INFO] Configuration successful! +[2026-05-03 17:59:22,165] [INFO] Camera configuration has been adjusted! +[2026-05-03 17:59:22,168] [INFO] Configuration successful! +[2026-05-03 17:59:22,206] [INFO] Starting picamera MJPEG stream... +[2026-05-03 17:59:22,257] [INFO] Camera started +[2026-05-03 17:59:22,291] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-03 17:59:22,292] [INFO] Updating ESI port settings +[2026-05-03 17:59:22,292] [INFO] Opening ESI connection to port None +[2026-05-03 17:59:22,309] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-03 17:59:22,309] [INFO] Creating serial.Serial instance... +[2026-05-03 17:59:22,311] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 17:59:22,311] [INFO] Testing communication to SangaBoard +[2026-05-03 17:59:22,311] [INFO] Running firmware checks... +[2026-05-03 17:59:22,317] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:59:22,319] [INFO] Success! +[2026-05-03 17:59:22,320] [INFO] Creating serial.Serial instance... +[2026-05-03 17:59:22,322] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-03 17:59:22,323] [INFO] Testing communication to SangaBoard +[2026-05-03 17:59:22,323] [INFO] Running firmware checks... +[2026-05-03 17:59:22,329] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:59:22,330] [INFO] Opened ESI connection to port None +[2026-05-03 17:59:22,330] [INFO] Checking valid firmware... +[2026-05-03 17:59:22,331] [INFO] Running firmware checks... +[2026-05-03 17:59:22,336] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-03 17:59:22,338] [INFO] Loading modules... +[2026-05-03 17:59:22,359] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-03 17:59:22,375] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-03 17:59:22,386] [INFO] Application startup complete. +[2026-05-03 17:59:22,414] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-04 02:10:51,707] [INFO] OFM server root logger has been set up at INFO level +[2026-05-04 02:10:52,586] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 02:10:52,587] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 02:10:52,587] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 02:10:54,099] [INFO] Started server process [516] +[2026-05-04 02:10:54,100] [INFO] Waiting for application startup. +[2026-05-04 02:10:54,144] [INFO] Creating new Picamera2 object +[2026-05-04 02:10:54,285] [INFO] Initialization successful. +[2026-05-04 02:10:54,286] [INFO] Camera now open. +[2026-05-04 02:10:54,299] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,303] [INFO] Configuration successful! +[2026-05-04 02:10:54,329] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,333] [INFO] Configuration successful! +[2026-05-04 02:10:54,357] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,360] [INFO] Configuration successful! +[2026-05-04 02:10:54,385] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,389] [INFO] Configuration successful! +[2026-05-04 02:10:54,432] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,435] [INFO] Configuration successful! +[2026-05-04 02:10:54,458] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,461] [INFO] Configuration successful! +[2026-05-04 02:10:54,482] [INFO] Camera configuration has been adjusted! +[2026-05-04 02:10:54,486] [INFO] Configuration successful! +[2026-05-04 08:14:07,765] [INFO] Camera configuration has been adjusted! +[2026-05-04 08:14:07,769] [INFO] Configuration successful! +[2026-05-04 08:14:07,808] [INFO] Camera configuration has been adjusted! +[2026-05-04 08:14:07,811] [INFO] Configuration successful! +[2026-05-04 08:14:07,848] [INFO] Starting picamera MJPEG stream... +[2026-05-04 08:14:07,897] [INFO] Camera started +[2026-05-04 08:14:07,935] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-04 08:14:07,936] [INFO] Updating ESI port settings +[2026-05-04 08:14:07,936] [INFO] Opening ESI connection to port None +[2026-05-04 08:14:07,951] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-04 08:14:07,952] [INFO] Creating serial.Serial instance... +[2026-05-04 08:14:07,953] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-04 08:14:07,954] [INFO] Testing communication to SangaBoard +[2026-05-04 08:14:07,954] [INFO] Running firmware checks... +[2026-05-04 08:14:07,960] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 08:14:07,963] [INFO] Success! +[2026-05-04 08:14:07,964] [INFO] Creating serial.Serial instance... +[2026-05-04 08:14:07,966] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-04 08:14:07,966] [INFO] Testing communication to SangaBoard +[2026-05-04 08:14:07,967] [INFO] Running firmware checks... +[2026-05-04 08:14:07,972] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 08:14:07,973] [INFO] Opened ESI connection to port None +[2026-05-04 08:14:07,973] [INFO] Checking valid firmware... +[2026-05-04 08:14:07,974] [INFO] Running firmware checks... +[2026-05-04 08:14:07,979] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 08:14:07,980] [INFO] Loading modules... +[2026-05-04 08:14:08,001] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-04 08:14:08,019] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-04 08:14:08,030] [INFO] Application startup complete. +[2026-05-04 08:14:08,059] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-04 09:04:44,618] [INFO] OFM server root logger has been set up at INFO level +[2026-05-04 09:04:45,490] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 09:04:45,491] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 09:04:45,492] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-04 09:04:46,980] [INFO] Started server process [517] +[2026-05-04 09:04:46,982] [INFO] Waiting for application startup. +[2026-05-04 09:04:47,025] [INFO] Creating new Picamera2 object +[2026-05-04 09:04:47,166] [INFO] Initialization successful. +[2026-05-04 09:04:47,167] [INFO] Camera now open. +[2026-05-04 09:04:47,180] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,185] [INFO] Configuration successful! +[2026-05-04 09:04:47,210] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,214] [INFO] Configuration successful! +[2026-05-04 09:04:47,238] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,242] [INFO] Configuration successful! +[2026-05-04 09:04:47,267] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,270] [INFO] Configuration successful! +[2026-05-04 09:04:47,314] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,317] [INFO] Configuration successful! +[2026-05-04 09:04:47,340] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,343] [INFO] Configuration successful! +[2026-05-04 09:04:47,365] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,369] [INFO] Configuration successful! +[2026-05-04 09:04:47,392] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,395] [INFO] Configuration successful! +[2026-05-04 09:04:47,434] [INFO] Camera configuration has been adjusted! +[2026-05-04 09:04:47,438] [INFO] Configuration successful! +[2026-05-04 09:04:47,473] [INFO] Starting picamera MJPEG stream... +[2026-05-04 09:04:47,521] [INFO] Camera started +[2026-05-04 09:04:47,554] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-04 09:04:47,555] [INFO] Updating ESI port settings +[2026-05-04 09:04:47,556] [INFO] Opening ESI connection to port None +[2026-05-04 09:04:47,571] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-04 09:04:47,572] [INFO] Creating serial.Serial instance... +[2026-05-04 09:04:47,573] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-04 09:04:47,574] [INFO] Testing communication to SangaBoard +[2026-05-04 09:04:47,574] [INFO] Running firmware checks... +[2026-05-04 09:04:47,580] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 09:04:47,582] [INFO] Success! +[2026-05-04 09:04:47,583] [INFO] Creating serial.Serial instance... +[2026-05-04 09:04:47,586] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-04 09:04:47,586] [INFO] Testing communication to SangaBoard +[2026-05-04 09:04:47,587] [INFO] Running firmware checks... +[2026-05-04 09:04:47,592] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 09:04:47,593] [INFO] Opened ESI connection to port None +[2026-05-04 09:04:47,594] [INFO] Checking valid firmware... +[2026-05-04 09:04:47,594] [INFO] Running firmware checks... +[2026-05-04 09:04:47,600] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-04 09:04:47,601] [INFO] Loading modules... +[2026-05-04 09:04:47,628] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-04 09:04:47,645] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-04 09:04:47,655] [INFO] Application startup complete. +[2026-05-04 09:04:47,685] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 01:36:39,016] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 01:36:39,893] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 01:36:39,894] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 01:36:39,894] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 01:36:41,420] [INFO] Started server process [515] +[2026-05-05 01:36:41,421] [INFO] Waiting for application startup. +[2026-05-05 01:36:41,465] [INFO] Creating new Picamera2 object +[2026-05-05 01:36:41,606] [INFO] Initialization successful. +[2026-05-05 01:36:41,607] [INFO] Camera now open. +[2026-05-05 01:36:41,620] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,625] [INFO] Configuration successful! +[2026-05-05 01:36:41,649] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,653] [INFO] Configuration successful! +[2026-05-05 01:36:41,677] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,680] [INFO] Configuration successful! +[2026-05-05 01:36:41,705] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,708] [INFO] Configuration successful! +[2026-05-05 01:36:41,752] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,755] [INFO] Configuration successful! +[2026-05-05 01:36:41,777] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,781] [INFO] Configuration successful! +[2026-05-05 01:36:41,803] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,806] [INFO] Configuration successful! +[2026-05-05 01:36:41,829] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,832] [INFO] Configuration successful! +[2026-05-05 01:36:41,872] [INFO] Camera configuration has been adjusted! +[2026-05-05 01:36:41,875] [INFO] Configuration successful! +[2026-05-05 01:36:41,912] [INFO] Starting picamera MJPEG stream... +[2026-05-05 01:36:41,963] [INFO] Camera started +[2026-05-05 01:36:41,996] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 01:36:41,997] [INFO] Updating ESI port settings +[2026-05-05 01:36:41,998] [INFO] Opening ESI connection to port None +[2026-05-05 01:36:42,013] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 01:36:42,014] [INFO] Creating serial.Serial instance... +[2026-05-05 01:36:42,015] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 01:36:42,016] [INFO] Testing communication to SangaBoard +[2026-05-05 01:36:42,016] [INFO] Running firmware checks... +[2026-05-05 01:36:42,022] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 01:36:42,024] [INFO] Success! +[2026-05-05 01:36:42,025] [INFO] Creating serial.Serial instance... +[2026-05-05 01:36:42,026] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 01:36:42,027] [INFO] Testing communication to SangaBoard +[2026-05-05 01:36:42,028] [INFO] Running firmware checks... +[2026-05-05 01:36:42,033] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 01:36:42,034] [INFO] Opened ESI connection to port None +[2026-05-05 01:36:42,035] [INFO] Checking valid firmware... +[2026-05-05 01:36:42,035] [INFO] Running firmware checks... +[2026-05-05 01:36:42,040] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 01:36:42,041] [INFO] Loading modules... +[2026-05-05 01:36:42,063] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 01:36:42,079] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 01:36:42,092] [INFO] Application startup complete. +[2026-05-05 01:36:42,131] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 02:04:59,008] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 02:04:59,886] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 02:04:59,887] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 02:04:59,888] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 02:05:01,386] [INFO] Started server process [517] +[2026-05-05 02:05:01,388] [INFO] Waiting for application startup. +[2026-05-05 02:05:01,431] [INFO] Creating new Picamera2 object +[2026-05-05 02:05:01,572] [INFO] Initialization successful. +[2026-05-05 02:05:01,573] [INFO] Camera now open. +[2026-05-05 02:05:01,586] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,591] [INFO] Configuration successful! +[2026-05-05 02:05:01,615] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,619] [INFO] Configuration successful! +[2026-05-05 02:05:01,644] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,647] [INFO] Configuration successful! +[2026-05-05 02:05:01,673] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,676] [INFO] Configuration successful! +[2026-05-05 02:05:01,720] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,724] [INFO] Configuration successful! +[2026-05-05 02:05:01,746] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,750] [INFO] Configuration successful! +[2026-05-05 02:05:01,772] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,776] [INFO] Configuration successful! +[2026-05-05 02:05:01,799] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,802] [INFO] Configuration successful! +[2026-05-05 02:05:01,841] [INFO] Camera configuration has been adjusted! +[2026-05-05 02:05:01,845] [INFO] Configuration successful! +[2026-05-05 02:05:01,882] [INFO] Starting picamera MJPEG stream... +[2026-05-05 02:05:01,933] [INFO] Camera started +[2026-05-05 02:05:01,967] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 02:05:01,968] [INFO] Updating ESI port settings +[2026-05-05 02:05:01,968] [INFO] Opening ESI connection to port None +[2026-05-05 02:05:01,984] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 02:05:01,985] [INFO] Creating serial.Serial instance... +[2026-05-05 02:05:01,986] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 02:05:01,987] [INFO] Testing communication to SangaBoard +[2026-05-05 02:05:01,987] [INFO] Running firmware checks... +[2026-05-05 02:05:01,993] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 02:05:01,996] [INFO] Success! +[2026-05-05 02:05:01,997] [INFO] Creating serial.Serial instance... +[2026-05-05 02:05:01,998] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 02:05:01,999] [INFO] Testing communication to SangaBoard +[2026-05-05 02:05:02,000] [INFO] Running firmware checks... +[2026-05-05 02:05:02,005] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 02:05:02,006] [INFO] Opened ESI connection to port None +[2026-05-05 02:05:02,007] [INFO] Checking valid firmware... +[2026-05-05 02:05:02,007] [INFO] Running firmware checks... +[2026-05-05 02:05:02,012] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 02:05:02,013] [INFO] Loading modules... +[2026-05-05 02:05:02,036] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 02:05:02,052] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 02:05:02,063] [INFO] Application startup complete. +[2026-05-05 02:05:02,095] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 06:39:57,536] [WARNING] Invalid HTTP request received. +[2026-05-05 06:39:57,693] [WARNING] Invalid HTTP request received. +[2026-05-05 06:40:24,689] [WARNING] Invalid HTTP request received. +[2026-05-05 06:40:24,709] [WARNING] Invalid HTTP request received. +[2026-05-05 06:40:33,139] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 06:40:34,013] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 06:40:34,014] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 06:40:34,015] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 06:40:35,509] [INFO] Started server process [513] +[2026-05-05 06:40:35,510] [INFO] Waiting for application startup. +[2026-05-05 06:40:35,553] [INFO] Creating new Picamera2 object +[2026-05-05 06:40:35,695] [INFO] Initialization successful. +[2026-05-05 06:40:35,696] [INFO] Camera now open. +[2026-05-05 06:40:35,709] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,715] [INFO] Configuration successful! +[2026-05-05 06:40:35,739] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,742] [INFO] Configuration successful! +[2026-05-05 06:40:35,767] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,771] [INFO] Configuration successful! +[2026-05-05 06:40:35,797] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,800] [INFO] Configuration successful! +[2026-05-05 06:40:35,843] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,847] [INFO] Configuration successful! +[2026-05-05 06:40:35,869] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,873] [INFO] Configuration successful! +[2026-05-05 06:40:35,895] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,898] [INFO] Configuration successful! +[2026-05-05 06:40:35,921] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,925] [INFO] Configuration successful! +[2026-05-05 06:40:35,964] [INFO] Camera configuration has been adjusted! +[2026-05-05 06:40:35,967] [INFO] Configuration successful! +[2026-05-05 06:40:36,003] [INFO] Starting picamera MJPEG stream... +[2026-05-05 06:40:36,056] [INFO] Camera started +[2026-05-05 06:40:36,091] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 06:40:36,091] [INFO] Updating ESI port settings +[2026-05-05 06:40:36,092] [INFO] Opening ESI connection to port None +[2026-05-05 06:40:36,107] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 06:40:36,108] [INFO] Creating serial.Serial instance... +[2026-05-05 06:40:36,109] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 06:40:36,110] [INFO] Testing communication to SangaBoard +[2026-05-05 06:40:36,110] [INFO] Running firmware checks... +[2026-05-05 06:40:36,116] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 06:40:36,119] [INFO] Success! +[2026-05-05 06:40:36,119] [INFO] Creating serial.Serial instance... +[2026-05-05 06:40:36,121] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 06:40:36,122] [INFO] Testing communication to SangaBoard +[2026-05-05 06:40:36,122] [INFO] Running firmware checks... +[2026-05-05 06:40:36,128] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 06:40:36,129] [INFO] Opened ESI connection to port None +[2026-05-05 06:40:36,129] [INFO] Checking valid firmware... +[2026-05-05 06:40:36,130] [INFO] Running firmware checks... +[2026-05-05 06:40:36,135] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 06:40:36,136] [INFO] Loading modules... +[2026-05-05 06:40:36,156] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 06:40:36,173] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 06:40:36,186] [INFO] Application startup complete. +[2026-05-05 06:40:36,214] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 08:06:26,456] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 08:06:27,333] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:06:27,334] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:06:27,335] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:06:28,835] [INFO] Started server process [516] +[2026-05-05 08:06:28,836] [INFO] Waiting for application startup. +[2026-05-05 08:06:28,880] [INFO] Creating new Picamera2 object +[2026-05-05 08:06:29,021] [INFO] Initialization successful. +[2026-05-05 08:06:29,022] [INFO] Camera now open. +[2026-05-05 08:06:29,035] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,041] [INFO] Configuration successful! +[2026-05-05 08:06:29,065] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,068] [INFO] Configuration successful! +[2026-05-05 08:06:29,092] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,096] [INFO] Configuration successful! +[2026-05-05 08:06:29,121] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,124] [INFO] Configuration successful! +[2026-05-05 08:06:29,168] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,171] [INFO] Configuration successful! +[2026-05-05 08:06:29,194] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,197] [INFO] Configuration successful! +[2026-05-05 08:06:29,219] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,222] [INFO] Configuration successful! +[2026-05-05 08:06:29,245] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,249] [INFO] Configuration successful! +[2026-05-05 08:06:29,288] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:06:29,291] [INFO] Configuration successful! +[2026-05-05 08:06:29,328] [INFO] Starting picamera MJPEG stream... +[2026-05-05 08:06:29,377] [INFO] Camera started +[2026-05-05 08:06:29,412] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 08:06:29,413] [INFO] Updating ESI port settings +[2026-05-05 08:06:29,413] [INFO] Opening ESI connection to port None +[2026-05-05 08:06:29,430] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 08:06:29,431] [INFO] Creating serial.Serial instance... +[2026-05-05 08:06:29,432] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:06:29,433] [INFO] Testing communication to SangaBoard +[2026-05-05 08:06:29,433] [INFO] Running firmware checks... +[2026-05-05 08:06:29,438] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:06:29,441] [INFO] Success! +[2026-05-05 08:06:29,442] [INFO] Creating serial.Serial instance... +[2026-05-05 08:06:29,444] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:06:29,444] [INFO] Testing communication to SangaBoard +[2026-05-05 08:06:29,445] [INFO] Running firmware checks... +[2026-05-05 08:06:29,450] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:06:29,451] [INFO] Opened ESI connection to port None +[2026-05-05 08:06:29,451] [INFO] Checking valid firmware... +[2026-05-05 08:06:29,452] [INFO] Running firmware checks... +[2026-05-05 08:06:29,458] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:06:29,459] [INFO] Loading modules... +[2026-05-05 08:06:29,480] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 08:06:29,496] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 08:06:29,507] [INFO] Application startup complete. +[2026-05-05 08:06:29,536] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 08:20:53,712] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 08:20:54,586] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:20:54,587] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:20:54,588] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:20:56,079] [INFO] Started server process [518] +[2026-05-05 08:20:56,081] [INFO] Waiting for application startup. +[2026-05-05 08:20:56,125] [INFO] Creating new Picamera2 object +[2026-05-05 08:20:56,266] [INFO] Initialization successful. +[2026-05-05 08:20:56,267] [INFO] Camera now open. +[2026-05-05 08:20:56,280] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,285] [INFO] Configuration successful! +[2026-05-05 08:20:56,310] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,313] [INFO] Configuration successful! +[2026-05-05 08:20:56,338] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,341] [INFO] Configuration successful! +[2026-05-05 08:20:56,366] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,369] [INFO] Configuration successful! +[2026-05-05 08:20:56,413] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,416] [INFO] Configuration successful! +[2026-05-05 08:20:56,439] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,442] [INFO] Configuration successful! +[2026-05-05 08:20:56,464] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,468] [INFO] Configuration successful! +[2026-05-05 08:20:56,491] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,494] [INFO] Configuration successful! +[2026-05-05 08:20:56,534] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:20:56,537] [INFO] Configuration successful! +[2026-05-05 08:20:56,574] [INFO] Starting picamera MJPEG stream... +[2026-05-05 08:20:56,624] [INFO] Camera started +[2026-05-05 08:20:56,657] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 08:20:56,657] [INFO] Updating ESI port settings +[2026-05-05 08:20:56,658] [INFO] Opening ESI connection to port None +[2026-05-05 08:20:56,674] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 08:20:56,674] [INFO] Creating serial.Serial instance... +[2026-05-05 08:20:56,676] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:20:56,676] [INFO] Testing communication to SangaBoard +[2026-05-05 08:20:56,677] [INFO] Running firmware checks... +[2026-05-05 08:20:56,682] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:20:56,685] [INFO] Success! +[2026-05-05 08:20:56,685] [INFO] Creating serial.Serial instance... +[2026-05-05 08:20:56,687] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:20:56,687] [INFO] Testing communication to SangaBoard +[2026-05-05 08:20:56,688] [INFO] Running firmware checks... +[2026-05-05 08:20:56,693] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:20:56,694] [INFO] Opened ESI connection to port None +[2026-05-05 08:20:56,695] [INFO] Checking valid firmware... +[2026-05-05 08:20:56,695] [INFO] Running firmware checks... +[2026-05-05 08:20:56,700] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:20:56,701] [INFO] Loading modules... +[2026-05-05 08:20:56,722] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 08:20:56,738] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 08:20:56,751] [INFO] Application startup complete. +[2026-05-05 08:20:56,791] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 08:31:25,062] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 08:31:25,939] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:31:25,940] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:31:25,941] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 08:31:27,431] [INFO] Started server process [513] +[2026-05-05 08:31:27,433] [INFO] Waiting for application startup. +[2026-05-05 08:31:27,476] [INFO] Creating new Picamera2 object +[2026-05-05 08:31:27,620] [INFO] Initialization successful. +[2026-05-05 08:31:27,622] [INFO] Camera now open. +[2026-05-05 08:31:27,635] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,639] [INFO] Configuration successful! +[2026-05-05 08:31:27,664] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,667] [INFO] Configuration successful! +[2026-05-05 08:31:27,691] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,694] [INFO] Configuration successful! +[2026-05-05 08:31:27,719] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,723] [INFO] Configuration successful! +[2026-05-05 08:31:27,766] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,769] [INFO] Configuration successful! +[2026-05-05 08:31:27,792] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,795] [INFO] Configuration successful! +[2026-05-05 08:31:27,818] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,821] [INFO] Configuration successful! +[2026-05-05 08:31:27,844] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,847] [INFO] Configuration successful! +[2026-05-05 08:31:27,886] [INFO] Camera configuration has been adjusted! +[2026-05-05 08:31:27,890] [INFO] Configuration successful! +[2026-05-05 08:31:27,927] [INFO] Starting picamera MJPEG stream... +[2026-05-05 08:31:27,978] [INFO] Camera started +[2026-05-05 08:31:28,013] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 08:31:28,014] [INFO] Updating ESI port settings +[2026-05-05 08:31:28,014] [INFO] Opening ESI connection to port None +[2026-05-05 08:31:28,029] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 08:31:28,030] [INFO] Creating serial.Serial instance... +[2026-05-05 08:31:28,031] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:31:28,032] [INFO] Testing communication to SangaBoard +[2026-05-05 08:31:28,032] [INFO] Running firmware checks... +[2026-05-05 08:31:28,038] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:31:28,041] [INFO] Success! +[2026-05-05 08:31:28,042] [INFO] Creating serial.Serial instance... +[2026-05-05 08:31:28,043] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 08:31:28,044] [INFO] Testing communication to SangaBoard +[2026-05-05 08:31:28,045] [INFO] Running firmware checks... +[2026-05-05 08:31:28,050] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:31:28,051] [INFO] Opened ESI connection to port None +[2026-05-05 08:31:28,051] [INFO] Checking valid firmware... +[2026-05-05 08:31:28,052] [INFO] Running firmware checks... +[2026-05-05 08:31:28,057] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 08:31:28,058] [INFO] Loading modules... +[2026-05-05 08:31:28,081] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 08:31:28,097] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 08:31:28,108] [INFO] Application startup complete. +[2026-05-05 08:31:28,139] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 14:39:14,420] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 14:39:15,299] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:39:15,300] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:39:15,301] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:39:16,796] [INFO] Started server process [515] +[2026-05-05 14:39:16,798] [INFO] Waiting for application startup. +[2026-05-05 14:39:16,841] [INFO] Creating new Picamera2 object +[2026-05-05 14:39:16,983] [INFO] Initialization successful. +[2026-05-05 14:39:16,984] [INFO] Camera now open. +[2026-05-05 14:39:16,997] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,002] [INFO] Configuration successful! +[2026-05-05 14:39:17,026] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,030] [INFO] Configuration successful! +[2026-05-05 14:39:17,054] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,057] [INFO] Configuration successful! +[2026-05-05 14:39:17,082] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,086] [INFO] Configuration successful! +[2026-05-05 14:39:17,129] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,132] [INFO] Configuration successful! +[2026-05-05 14:39:17,155] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,159] [INFO] Configuration successful! +[2026-05-05 14:39:17,181] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,184] [INFO] Configuration successful! +[2026-05-05 14:39:17,207] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,210] [INFO] Configuration successful! +[2026-05-05 14:39:17,249] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:39:17,253] [INFO] Configuration successful! +[2026-05-05 14:39:17,288] [INFO] Starting picamera MJPEG stream... +[2026-05-05 14:39:17,336] [INFO] Camera started +[2026-05-05 14:39:17,369] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 14:39:17,369] [INFO] Updating ESI port settings +[2026-05-05 14:39:17,370] [INFO] Opening ESI connection to port None +[2026-05-05 14:39:17,386] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 14:39:17,387] [INFO] Creating serial.Serial instance... +[2026-05-05 14:39:17,388] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 14:39:17,389] [INFO] Testing communication to SangaBoard +[2026-05-05 14:39:17,389] [INFO] Running firmware checks... +[2026-05-05 14:39:17,395] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:39:17,398] [INFO] Success! +[2026-05-05 14:39:17,398] [INFO] Creating serial.Serial instance... +[2026-05-05 14:39:17,400] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 14:39:17,401] [INFO] Testing communication to SangaBoard +[2026-05-05 14:39:17,401] [INFO] Running firmware checks... +[2026-05-05 14:39:17,407] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:39:17,408] [INFO] Opened ESI connection to port None +[2026-05-05 14:39:17,408] [INFO] Checking valid firmware... +[2026-05-05 14:39:17,408] [INFO] Running firmware checks... +[2026-05-05 14:39:17,414] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:39:17,415] [INFO] Loading modules... +[2026-05-05 14:39:17,435] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 14:39:17,453] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 14:39:17,465] [INFO] Application startup complete. +[2026-05-05 14:39:17,507] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-05 14:50:48,453] [INFO] OFM server root logger has been set up at INFO level +[2026-05-05 14:50:49,328] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:50:49,329] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:50:49,330] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-05 14:50:50,818] [INFO] Started server process [514] +[2026-05-05 14:50:50,820] [INFO] Waiting for application startup. +[2026-05-05 14:50:50,863] [INFO] Creating new Picamera2 object +[2026-05-05 14:50:51,004] [INFO] Initialization successful. +[2026-05-05 14:50:51,005] [INFO] Camera now open. +[2026-05-05 14:50:51,018] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,024] [INFO] Configuration successful! +[2026-05-05 14:50:51,048] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,052] [INFO] Configuration successful! +[2026-05-05 14:50:51,076] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,079] [INFO] Configuration successful! +[2026-05-05 14:50:51,104] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,108] [INFO] Configuration successful! +[2026-05-05 14:50:51,151] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,155] [INFO] Configuration successful! +[2026-05-05 14:50:51,178] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,181] [INFO] Configuration successful! +[2026-05-05 14:50:51,203] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,206] [INFO] Configuration successful! +[2026-05-05 14:50:51,229] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,233] [INFO] Configuration successful! +[2026-05-05 14:50:51,272] [INFO] Camera configuration has been adjusted! +[2026-05-05 14:50:51,275] [INFO] Configuration successful! +[2026-05-05 14:50:51,312] [INFO] Starting picamera MJPEG stream... +[2026-05-05 14:50:51,363] [INFO] Camera started +[2026-05-05 14:50:51,399] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-05 14:50:51,400] [INFO] Updating ESI port settings +[2026-05-05 14:50:51,400] [INFO] Opening ESI connection to port None +[2026-05-05 14:50:51,416] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-05 14:50:51,416] [INFO] Creating serial.Serial instance... +[2026-05-05 14:50:51,418] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 14:50:51,418] [INFO] Testing communication to SangaBoard +[2026-05-05 14:50:51,419] [INFO] Running firmware checks... +[2026-05-05 14:50:51,424] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:50:51,427] [INFO] Success! +[2026-05-05 14:50:51,428] [INFO] Creating serial.Serial instance... +[2026-05-05 14:50:51,429] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-05 14:50:51,430] [INFO] Testing communication to SangaBoard +[2026-05-05 14:50:51,430] [INFO] Running firmware checks... +[2026-05-05 14:50:51,437] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:50:51,438] [INFO] Opened ESI connection to port None +[2026-05-05 14:50:51,438] [INFO] Checking valid firmware... +[2026-05-05 14:50:51,439] [INFO] Running firmware checks... +[2026-05-05 14:50:51,445] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-05 14:50:51,447] [INFO] Loading modules... +[2026-05-05 14:50:51,467] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-05 14:50:51,484] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-05 14:50:51,496] [INFO] Application startup complete. +[2026-05-05 14:50:51,543] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 02:21:22,403] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 02:21:23,275] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:21:23,275] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:21:23,276] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:21:24,766] [INFO] Started server process [513] +[2026-05-06 02:21:24,767] [INFO] Waiting for application startup. +[2026-05-06 02:21:24,811] [INFO] Creating new Picamera2 object +[2026-05-06 02:21:24,952] [INFO] Initialization successful. +[2026-05-06 02:21:24,953] [INFO] Camera now open. +[2026-05-06 02:21:24,966] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:24,970] [INFO] Configuration successful! +[2026-05-06 02:21:24,994] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:24,998] [INFO] Configuration successful! +[2026-05-06 02:21:25,022] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,025] [INFO] Configuration successful! +[2026-05-06 02:21:25,051] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,054] [INFO] Configuration successful! +[2026-05-06 02:21:25,097] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,101] [INFO] Configuration successful! +[2026-05-06 02:21:25,123] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,127] [INFO] Configuration successful! +[2026-05-06 02:21:25,149] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,152] [INFO] Configuration successful! +[2026-05-06 02:21:25,175] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,178] [INFO] Configuration successful! +[2026-05-06 02:21:25,217] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:21:25,221] [INFO] Configuration successful! +[2026-05-06 02:21:25,259] [INFO] Starting picamera MJPEG stream... +[2026-05-06 02:21:25,315] [INFO] Camera started +[2026-05-06 02:21:25,347] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 02:21:25,348] [INFO] Updating ESI port settings +[2026-05-06 02:21:25,348] [INFO] Opening ESI connection to port None +[2026-05-06 02:21:25,364] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 02:21:25,365] [INFO] Creating serial.Serial instance... +[2026-05-06 02:21:25,366] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 02:21:25,367] [INFO] Testing communication to SangaBoard +[2026-05-06 02:21:25,367] [INFO] Running firmware checks... +[2026-05-06 02:21:25,373] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:21:25,375] [INFO] Success! +[2026-05-06 02:21:25,376] [INFO] Creating serial.Serial instance... +[2026-05-06 02:21:25,378] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 02:21:25,379] [INFO] Testing communication to SangaBoard +[2026-05-06 02:21:25,379] [INFO] Running firmware checks... +[2026-05-06 02:21:25,385] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:21:25,386] [INFO] Opened ESI connection to port None +[2026-05-06 02:21:25,386] [INFO] Checking valid firmware... +[2026-05-06 02:21:25,387] [INFO] Running firmware checks... +[2026-05-06 02:21:25,392] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:21:25,393] [INFO] Loading modules... +[2026-05-06 02:21:25,415] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 02:21:25,432] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 02:21:25,444] [INFO] Application startup complete. +[2026-05-06 02:21:25,479] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 02:43:04,293] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 02:43:05,170] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:43:05,171] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:43:05,172] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 02:43:06,667] [INFO] Started server process [512] +[2026-05-06 02:43:06,669] [INFO] Waiting for application startup. +[2026-05-06 02:43:06,712] [INFO] Creating new Picamera2 object +[2026-05-06 02:43:06,853] [INFO] Initialization successful. +[2026-05-06 02:43:06,854] [INFO] Camera now open. +[2026-05-06 02:43:06,867] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:06,872] [INFO] Configuration successful! +[2026-05-06 02:43:06,896] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:06,900] [INFO] Configuration successful! +[2026-05-06 02:43:06,924] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:06,927] [INFO] Configuration successful! +[2026-05-06 02:43:06,952] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:06,956] [INFO] Configuration successful! +[2026-05-06 02:43:06,999] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:07,002] [INFO] Configuration successful! +[2026-05-06 02:43:07,025] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:07,028] [INFO] Configuration successful! +[2026-05-06 02:43:07,050] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:07,053] [INFO] Configuration successful! +[2026-05-06 02:43:07,076] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:07,080] [INFO] Configuration successful! +[2026-05-06 02:43:07,118] [INFO] Camera configuration has been adjusted! +[2026-05-06 02:43:07,122] [INFO] Configuration successful! +[2026-05-06 02:43:07,156] [INFO] Starting picamera MJPEG stream... +[2026-05-06 02:43:07,209] [INFO] Camera started +[2026-05-06 02:43:07,242] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 02:43:07,243] [INFO] Updating ESI port settings +[2026-05-06 02:43:07,243] [INFO] Opening ESI connection to port None +[2026-05-06 02:43:07,259] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 02:43:07,260] [INFO] Creating serial.Serial instance... +[2026-05-06 02:43:07,261] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 02:43:07,262] [INFO] Testing communication to SangaBoard +[2026-05-06 02:43:07,262] [INFO] Running firmware checks... +[2026-05-06 02:43:07,268] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:43:07,270] [INFO] Success! +[2026-05-06 02:43:07,271] [INFO] Creating serial.Serial instance... +[2026-05-06 02:43:07,272] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 02:43:07,273] [INFO] Testing communication to SangaBoard +[2026-05-06 02:43:07,274] [INFO] Running firmware checks... +[2026-05-06 02:43:07,279] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:43:07,280] [INFO] Opened ESI connection to port None +[2026-05-06 02:43:07,281] [INFO] Checking valid firmware... +[2026-05-06 02:43:07,281] [INFO] Running firmware checks... +[2026-05-06 02:43:07,286] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 02:43:07,287] [INFO] Loading modules... +[2026-05-06 02:43:07,308] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 02:43:07,323] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 02:43:07,338] [INFO] Application startup complete. +[2026-05-06 02:43:07,378] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 06:59:10,143] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 06:59:11,019] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 06:59:11,020] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 06:59:11,021] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 06:59:12,519] [INFO] Started server process [516] +[2026-05-06 06:59:12,521] [INFO] Waiting for application startup. +[2026-05-06 06:59:12,564] [INFO] Creating new Picamera2 object +[2026-05-06 06:59:12,706] [INFO] Initialization successful. +[2026-05-06 06:59:12,707] [INFO] Camera now open. +[2026-05-06 06:59:12,720] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,725] [INFO] Configuration successful! +[2026-05-06 06:59:12,749] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,753] [INFO] Configuration successful! +[2026-05-06 06:59:12,777] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,780] [INFO] Configuration successful! +[2026-05-06 06:59:12,805] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,809] [INFO] Configuration successful! +[2026-05-06 06:59:12,852] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,856] [INFO] Configuration successful! +[2026-05-06 06:59:12,878] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,882] [INFO] Configuration successful! +[2026-05-06 06:59:12,904] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,907] [INFO] Configuration successful! +[2026-05-06 06:59:12,930] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,933] [INFO] Configuration successful! +[2026-05-06 06:59:12,972] [INFO] Camera configuration has been adjusted! +[2026-05-06 06:59:12,976] [INFO] Configuration successful! +[2026-05-06 06:59:13,012] [INFO] Starting picamera MJPEG stream... +[2026-05-06 06:59:13,062] [INFO] Camera started +[2026-05-06 06:59:13,095] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 06:59:13,095] [INFO] Updating ESI port settings +[2026-05-06 06:59:13,096] [INFO] Opening ESI connection to port None +[2026-05-06 06:59:13,112] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 06:59:13,113] [INFO] Creating serial.Serial instance... +[2026-05-06 06:59:13,114] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 06:59:13,115] [INFO] Testing communication to SangaBoard +[2026-05-06 06:59:13,115] [INFO] Running firmware checks... +[2026-05-06 06:59:13,121] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 06:59:13,124] [INFO] Success! +[2026-05-06 06:59:13,125] [INFO] Creating serial.Serial instance... +[2026-05-06 06:59:13,126] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 06:59:13,127] [INFO] Testing communication to SangaBoard +[2026-05-06 06:59:13,127] [INFO] Running firmware checks... +[2026-05-06 06:59:13,133] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 06:59:13,134] [INFO] Opened ESI connection to port None +[2026-05-06 06:59:13,134] [INFO] Checking valid firmware... +[2026-05-06 06:59:13,135] [INFO] Running firmware checks... +[2026-05-06 06:59:13,140] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 06:59:13,141] [INFO] Loading modules... +[2026-05-06 06:59:13,162] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 06:59:13,177] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 06:59:13,191] [INFO] Application startup complete. +[2026-05-06 06:59:13,221] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 09:47:37,228] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 09:47:38,101] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 09:47:38,102] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 09:47:38,102] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 09:47:39,594] [INFO] Started server process [513] +[2026-05-06 09:47:39,595] [INFO] Waiting for application startup. +[2026-05-06 09:47:39,639] [INFO] Creating new Picamera2 object +[2026-05-06 09:47:39,781] [INFO] Initialization successful. +[2026-05-06 09:47:39,782] [INFO] Camera now open. +[2026-05-06 09:47:39,795] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,800] [INFO] Configuration successful! +[2026-05-06 09:47:39,824] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,827] [INFO] Configuration successful! +[2026-05-06 09:47:39,851] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,855] [INFO] Configuration successful! +[2026-05-06 09:47:39,880] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,883] [INFO] Configuration successful! +[2026-05-06 09:47:39,927] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,930] [INFO] Configuration successful! +[2026-05-06 09:47:39,952] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,956] [INFO] Configuration successful! +[2026-05-06 09:47:39,978] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:39,981] [INFO] Configuration successful! +[2026-05-06 09:47:40,004] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:40,008] [INFO] Configuration successful! +[2026-05-06 09:47:40,047] [INFO] Camera configuration has been adjusted! +[2026-05-06 09:47:40,050] [INFO] Configuration successful! +[2026-05-06 09:47:40,086] [INFO] Starting picamera MJPEG stream... +[2026-05-06 09:47:40,135] [INFO] Camera started +[2026-05-06 09:47:40,167] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 09:47:40,168] [INFO] Updating ESI port settings +[2026-05-06 09:47:40,169] [INFO] Opening ESI connection to port None +[2026-05-06 09:47:40,185] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 09:47:40,186] [INFO] Creating serial.Serial instance... +[2026-05-06 09:47:40,187] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 09:47:40,187] [INFO] Testing communication to SangaBoard +[2026-05-06 09:47:40,188] [INFO] Running firmware checks... +[2026-05-06 09:47:40,193] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 09:47:40,196] [INFO] Success! +[2026-05-06 09:47:40,197] [INFO] Creating serial.Serial instance... +[2026-05-06 09:47:40,198] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 09:47:40,199] [INFO] Testing communication to SangaBoard +[2026-05-06 09:47:40,199] [INFO] Running firmware checks... +[2026-05-06 09:47:40,205] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 09:47:40,206] [INFO] Opened ESI connection to port None +[2026-05-06 09:47:40,206] [INFO] Checking valid firmware... +[2026-05-06 09:47:40,207] [INFO] Running firmware checks... +[2026-05-06 09:47:40,212] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 09:47:40,213] [INFO] Loading modules... +[2026-05-06 09:47:40,233] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 09:47:40,250] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 09:47:40,263] [INFO] Application startup complete. +[2026-05-06 09:47:40,303] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 23:44:32,672] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 23:44:33,547] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:44:33,548] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:44:33,549] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:44:35,045] [INFO] Started server process [513] +[2026-05-06 23:44:35,046] [INFO] Waiting for application startup. +[2026-05-06 23:44:35,089] [INFO] Creating new Picamera2 object +[2026-05-06 23:44:35,230] [INFO] Initialization successful. +[2026-05-06 23:44:35,231] [INFO] Camera now open. +[2026-05-06 23:44:35,244] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,249] [INFO] Configuration successful! +[2026-05-06 23:44:35,273] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,277] [INFO] Configuration successful! +[2026-05-06 23:44:35,300] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,304] [INFO] Configuration successful! +[2026-05-06 23:44:35,329] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,332] [INFO] Configuration successful! +[2026-05-06 23:44:35,375] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,379] [INFO] Configuration successful! +[2026-05-06 23:44:35,401] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,405] [INFO] Configuration successful! +[2026-05-06 23:44:35,427] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,430] [INFO] Configuration successful! +[2026-05-06 23:44:35,453] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,456] [INFO] Configuration successful! +[2026-05-06 23:44:35,495] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:44:35,499] [INFO] Configuration successful! +[2026-05-06 23:44:35,534] [INFO] Starting picamera MJPEG stream... +[2026-05-06 23:44:35,584] [INFO] Camera started +[2026-05-06 23:44:35,620] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 23:44:35,621] [INFO] Updating ESI port settings +[2026-05-06 23:44:35,621] [INFO] Opening ESI connection to port None +[2026-05-06 23:44:35,637] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 23:44:35,638] [INFO] Creating serial.Serial instance... +[2026-05-06 23:44:35,639] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 23:44:35,639] [INFO] Testing communication to SangaBoard +[2026-05-06 23:44:35,640] [INFO] Running firmware checks... +[2026-05-06 23:44:35,645] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:44:35,648] [INFO] Success! +[2026-05-06 23:44:35,649] [INFO] Creating serial.Serial instance... +[2026-05-06 23:44:35,650] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 23:44:35,651] [INFO] Testing communication to SangaBoard +[2026-05-06 23:44:35,651] [INFO] Running firmware checks... +[2026-05-06 23:44:35,657] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:44:35,658] [INFO] Opened ESI connection to port None +[2026-05-06 23:44:35,658] [INFO] Checking valid firmware... +[2026-05-06 23:44:35,658] [INFO] Running firmware checks... +[2026-05-06 23:44:35,665] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:44:35,666] [INFO] Loading modules... +[2026-05-06 23:44:35,687] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 23:44:35,703] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 23:44:35,715] [INFO] Application startup complete. +[2026-05-06 23:44:35,753] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-06 23:54:06,280] [INFO] OFM server root logger has been set up at INFO level +[2026-05-06 23:54:07,152] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:54:07,153] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:54:07,154] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-06 23:54:08,645] [INFO] Started server process [514] +[2026-05-06 23:54:08,646] [INFO] Waiting for application startup. +[2026-05-06 23:54:08,691] [INFO] Creating new Picamera2 object +[2026-05-06 23:54:08,832] [INFO] Initialization successful. +[2026-05-06 23:54:08,833] [INFO] Camera now open. +[2026-05-06 23:54:08,846] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:08,851] [INFO] Configuration successful! +[2026-05-06 23:54:08,875] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:08,879] [INFO] Configuration successful! +[2026-05-06 23:54:08,903] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:08,907] [INFO] Configuration successful! +[2026-05-06 23:54:08,932] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:08,935] [INFO] Configuration successful! +[2026-05-06 23:54:08,979] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:08,982] [INFO] Configuration successful! +[2026-05-06 23:54:09,005] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:09,008] [INFO] Configuration successful! +[2026-05-06 23:54:09,030] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:09,033] [INFO] Configuration successful! +[2026-05-06 23:54:09,056] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:09,060] [INFO] Configuration successful! +[2026-05-06 23:54:09,099] [INFO] Camera configuration has been adjusted! +[2026-05-06 23:54:09,102] [INFO] Configuration successful! +[2026-05-06 23:54:09,139] [INFO] Starting picamera MJPEG stream... +[2026-05-06 23:54:09,190] [INFO] Camera started +[2026-05-06 23:54:09,224] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-06 23:54:09,225] [INFO] Updating ESI port settings +[2026-05-06 23:54:09,225] [INFO] Opening ESI connection to port None +[2026-05-06 23:54:09,241] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-06 23:54:09,241] [INFO] Creating serial.Serial instance... +[2026-05-06 23:54:09,242] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 23:54:09,243] [INFO] Testing communication to SangaBoard +[2026-05-06 23:54:09,243] [INFO] Running firmware checks... +[2026-05-06 23:54:09,249] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:54:09,251] [INFO] Success! +[2026-05-06 23:54:09,252] [INFO] Creating serial.Serial instance... +[2026-05-06 23:54:09,254] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-06 23:54:09,255] [INFO] Testing communication to SangaBoard +[2026-05-06 23:54:09,255] [INFO] Running firmware checks... +[2026-05-06 23:54:09,261] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:54:09,262] [INFO] Opened ESI connection to port None +[2026-05-06 23:54:09,262] [INFO] Checking valid firmware... +[2026-05-06 23:54:09,263] [INFO] Running firmware checks... +[2026-05-06 23:54:09,268] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-06 23:54:09,269] [INFO] Loading modules... +[2026-05-06 23:54:09,289] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-06 23:54:09,304] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-06 23:54:09,319] [INFO] Application startup complete. +[2026-05-06 23:54:09,351] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-07 01:38:28,203] [INFO] OFM server root logger has been set up at INFO level +[2026-05-07 01:38:29,077] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 01:38:29,078] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 01:38:29,079] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 01:38:30,572] [INFO] Started server process [513] +[2026-05-07 01:38:30,573] [INFO] Waiting for application startup. +[2026-05-07 01:38:30,617] [INFO] Creating new Picamera2 object +[2026-05-07 01:38:30,758] [INFO] Initialization successful. +[2026-05-07 01:38:30,759] [INFO] Camera now open. +[2026-05-07 01:38:30,772] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,777] [INFO] Configuration successful! +[2026-05-07 01:38:30,801] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,804] [INFO] Configuration successful! +[2026-05-07 01:38:30,828] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,832] [INFO] Configuration successful! +[2026-05-07 01:38:30,856] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,860] [INFO] Configuration successful! +[2026-05-07 01:38:30,904] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,907] [INFO] Configuration successful! +[2026-05-07 01:38:30,929] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,932] [INFO] Configuration successful! +[2026-05-07 01:38:30,954] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,957] [INFO] Configuration successful! +[2026-05-07 01:38:30,980] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:30,983] [INFO] Configuration successful! +[2026-05-07 01:38:31,022] [INFO] Camera configuration has been adjusted! +[2026-05-07 01:38:31,025] [INFO] Configuration successful! +[2026-05-07 01:38:31,060] [INFO] Starting picamera MJPEG stream... +[2026-05-07 01:38:31,108] [INFO] Camera started +[2026-05-07 01:38:31,142] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-07 01:38:31,143] [INFO] Updating ESI port settings +[2026-05-07 01:38:31,143] [INFO] Opening ESI connection to port None +[2026-05-07 01:38:31,159] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-07 01:38:31,159] [INFO] Creating serial.Serial instance... +[2026-05-07 01:38:31,161] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 01:38:31,161] [INFO] Testing communication to SangaBoard +[2026-05-07 01:38:31,162] [INFO] Running firmware checks... +[2026-05-07 01:38:31,167] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 01:38:31,170] [INFO] Success! +[2026-05-07 01:38:31,171] [INFO] Creating serial.Serial instance... +[2026-05-07 01:38:31,172] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 01:38:31,173] [INFO] Testing communication to SangaBoard +[2026-05-07 01:38:31,173] [INFO] Running firmware checks... +[2026-05-07 01:38:31,179] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 01:38:31,180] [INFO] Opened ESI connection to port None +[2026-05-07 01:38:31,180] [INFO] Checking valid firmware... +[2026-05-07 01:38:31,181] [INFO] Running firmware checks... +[2026-05-07 01:38:31,186] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 01:38:31,187] [INFO] Loading modules... +[2026-05-07 01:38:31,209] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-07 01:38:31,225] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-07 01:38:31,238] [INFO] Application startup complete. +[2026-05-07 01:38:31,271] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-07 04:22:26,549] [INFO] OFM server root logger has been set up at INFO level +[2026-05-07 04:22:27,426] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 04:22:27,427] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 04:22:27,428] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 04:22:28,926] [INFO] Started server process [516] +[2026-05-07 04:22:28,928] [INFO] Waiting for application startup. +[2026-05-07 04:22:28,971] [INFO] Creating new Picamera2 object +[2026-05-07 04:22:29,112] [INFO] Initialization successful. +[2026-05-07 04:22:29,114] [INFO] Camera now open. +[2026-05-07 04:22:29,127] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,132] [INFO] Configuration successful! +[2026-05-07 04:22:29,157] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,161] [INFO] Configuration successful! +[2026-05-07 04:22:29,186] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,189] [INFO] Configuration successful! +[2026-05-07 04:22:29,214] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,217] [INFO] Configuration successful! +[2026-05-07 04:22:29,261] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,264] [INFO] Configuration successful! +[2026-05-07 04:22:29,287] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,290] [INFO] Configuration successful! +[2026-05-07 04:22:29,312] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,316] [INFO] Configuration successful! +[2026-05-07 04:22:29,339] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,342] [INFO] Configuration successful! +[2026-05-07 04:22:29,381] [INFO] Camera configuration has been adjusted! +[2026-05-07 04:22:29,385] [INFO] Configuration successful! +[2026-05-07 04:22:29,421] [INFO] Starting picamera MJPEG stream... +[2026-05-07 04:22:29,475] [INFO] Camera started +[2026-05-07 04:22:29,510] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-07 04:22:29,511] [INFO] Updating ESI port settings +[2026-05-07 04:22:29,511] [INFO] Opening ESI connection to port None +[2026-05-07 04:22:29,526] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-07 04:22:29,527] [INFO] Creating serial.Serial instance... +[2026-05-07 04:22:29,528] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 04:22:29,529] [INFO] Testing communication to SangaBoard +[2026-05-07 04:22:29,529] [INFO] Running firmware checks... +[2026-05-07 04:22:29,535] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 04:22:29,537] [INFO] Success! +[2026-05-07 04:22:29,539] [INFO] Creating serial.Serial instance... +[2026-05-07 04:22:29,540] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 04:22:29,541] [INFO] Testing communication to SangaBoard +[2026-05-07 04:22:29,541] [INFO] Running firmware checks... +[2026-05-07 04:22:29,547] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 04:22:29,547] [INFO] Opened ESI connection to port None +[2026-05-07 04:22:29,548] [INFO] Checking valid firmware... +[2026-05-07 04:22:29,548] [INFO] Running firmware checks... +[2026-05-07 04:22:29,554] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 04:22:29,555] [INFO] Loading modules... +[2026-05-07 04:22:29,576] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-07 04:22:29,593] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-07 04:22:29,604] [INFO] Application startup complete. +[2026-05-07 04:22:29,655] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-07 06:00:32,039] [INFO] Shutting down +[2026-05-07 06:00:32,144] [INFO] Waiting for connections to close. (CTRL+C to force quit) +[2026-05-07 06:00:34,144] [ERROR] Cancel 2 running task(s), timeout graceful shutdown exceeded +[2026-05-07 06:00:34,145] [INFO] Waiting for application shutdown. +[2026-05-07 06:00:34,152] [ERROR] Exception in ASGI application +Traceback (most recent call last): + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/fastapi/applications.py", line 1159, in __call__ + await super().__call__(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/applications.py", line 107, in __call__ + await self.middleware_stack(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 192, in __call__ + async with anyio.create_task_group() as task_group: + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__ + raise exc_val + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 194, in __call__ + await response(scope, wrapped_receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 238, in __call__ + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 161, in _send + await send(message) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 454, in send + await self.flow.drain() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/flow_control.py", line 19, in drain + await self._is_writable_event.wait() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.11/asyncio/locks.py", line 213, in wait + await fut +asyncio.exceptions.CancelledError: Task cancelled, timeout graceful shutdown exceeded +[2026-05-07 06:00:34,198] [ERROR] Exception in ASGI application +Traceback (most recent call last): + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/fastapi/applications.py", line 1159, in __call__ + await super().__call__(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/applications.py", line 107, in __call__ + await self.middleware_stack(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 192, in __call__ + async with anyio.create_task_group() as task_group: + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__ + raise exc_val + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 194, in __call__ + await response(scope, wrapped_receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 238, in __call__ + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 161, in _send + await send(message) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 454, in send + await self.flow.drain() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/flow_control.py", line 19, in drain + await self._is_writable_event.wait() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.11/asyncio/locks.py", line 213, in wait + await fut +asyncio.exceptions.CancelledError: Task cancelled, timeout graceful shutdown exceeded +[2026-05-07 06:00:34,245] [INFO] Camera stopped +[2026-05-07 06:00:34,654] [INFO] Stopped MJPEG stream. +[2026-05-07 06:00:35,252] [INFO] Camera closed successfully. +[2026-05-07 06:00:35,253] [INFO] Application shutdown complete. +[2026-05-07 06:00:35,254] [INFO] Finished server process [516] +[2026-05-07 06:00:49,528] [INFO] OFM server root logger has been set up at INFO level +[2026-05-07 06:00:50,505] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 06:00:50,506] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 06:00:50,510] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 06:00:51,964] [INFO] Started server process [1126] +[2026-05-07 06:00:51,965] [INFO] Waiting for application startup. +[2026-05-07 06:00:52,004] [INFO] Creating new Picamera2 object +[2026-05-07 06:00:52,083] [INFO] Initialization successful. +[2026-05-07 06:00:52,085] [INFO] Camera now open. +[2026-05-07 06:00:52,101] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,106] [INFO] Configuration successful! +[2026-05-07 06:00:52,126] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,130] [INFO] Configuration successful! +[2026-05-07 06:00:52,156] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,160] [INFO] Configuration successful! +[2026-05-07 06:00:52,189] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,193] [INFO] Configuration successful! +[2026-05-07 06:00:52,248] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,251] [INFO] Configuration successful! +[2026-05-07 06:00:52,277] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,281] [INFO] Configuration successful! +[2026-05-07 06:00:52,306] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,310] [INFO] Configuration successful! +[2026-05-07 06:00:52,336] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,339] [INFO] Configuration successful! +[2026-05-07 06:00:52,381] [INFO] Camera configuration has been adjusted! +[2026-05-07 06:00:52,385] [INFO] Configuration successful! +[2026-05-07 06:00:52,427] [INFO] Starting picamera MJPEG stream... +[2026-05-07 06:00:52,482] [INFO] Camera started +[2026-05-07 06:00:52,518] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-07 06:00:52,518] [INFO] Updating ESI port settings +[2026-05-07 06:00:52,519] [INFO] Opening ESI connection to port None +[2026-05-07 06:00:52,537] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-07 06:00:52,537] [INFO] Creating serial.Serial instance... +[2026-05-07 06:00:52,539] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 06:00:52,540] [INFO] Testing communication to SangaBoard +[2026-05-07 06:00:52,540] [INFO] Running firmware checks... +[2026-05-07 06:00:52,546] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 06:00:52,549] [INFO] Success! +[2026-05-07 06:00:52,550] [INFO] Creating serial.Serial instance... +[2026-05-07 06:00:52,552] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 06:00:52,552] [INFO] Testing communication to SangaBoard +[2026-05-07 06:00:52,553] [INFO] Running firmware checks... +[2026-05-07 06:00:52,559] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 06:00:52,560] [INFO] Opened ESI connection to port None +[2026-05-07 06:00:52,560] [INFO] Checking valid firmware... +[2026-05-07 06:00:52,561] [INFO] Running firmware checks... +[2026-05-07 06:00:52,568] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 06:00:52,570] [INFO] Loading modules... +[2026-05-07 06:00:52,593] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-07 06:00:52,612] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-07 06:00:52,622] [INFO] Application startup complete. +[2026-05-07 06:00:52,653] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-07 09:42:50,673] [INFO] OFM server root logger has been set up at INFO level +[2026-05-07 09:42:51,658] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 09:42:51,659] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 09:42:51,660] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 09:42:54,159] [INFO] Started server process [514] +[2026-05-07 09:42:54,161] [INFO] Waiting for application startup. +[2026-05-07 09:42:54,221] [INFO] Creating new Picamera2 object +[2026-05-07 09:42:54,630] [INFO] Initialization successful. +[2026-05-07 09:42:54,631] [INFO] Camera now open. +[2026-05-07 09:42:54,645] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,649] [INFO] Configuration successful! +[2026-05-07 09:42:54,678] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,682] [INFO] Configuration successful! +[2026-05-07 09:42:54,706] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,709] [INFO] Configuration successful! +[2026-05-07 09:42:54,735] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,738] [INFO] Configuration successful! +[2026-05-07 09:42:54,782] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,785] [INFO] Configuration successful! +[2026-05-07 09:42:54,809] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,812] [INFO] Configuration successful! +[2026-05-07 09:42:54,841] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,844] [INFO] Configuration successful! +[2026-05-07 09:42:54,873] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,877] [INFO] Configuration successful! +[2026-05-07 09:42:54,926] [INFO] Camera configuration has been adjusted! +[2026-05-07 09:42:54,930] [INFO] Configuration successful! +[2026-05-07 09:42:54,973] [INFO] Starting picamera MJPEG stream... +[2026-05-07 09:42:55,027] [INFO] Camera started +[2026-05-07 09:42:55,069] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-07 09:42:55,070] [INFO] Updating ESI port settings +[2026-05-07 09:42:55,071] [INFO] Opening ESI connection to port None +[2026-05-07 09:42:55,089] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-07 09:42:55,090] [INFO] Creating serial.Serial instance... +[2026-05-07 09:42:55,091] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 09:42:55,092] [INFO] Testing communication to SangaBoard +[2026-05-07 09:42:55,093] [INFO] Running firmware checks... +[2026-05-07 09:42:55,099] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 09:42:55,101] [INFO] Success! +[2026-05-07 09:42:55,102] [INFO] Creating serial.Serial instance... +[2026-05-07 09:42:55,104] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 09:42:55,104] [INFO] Testing communication to SangaBoard +[2026-05-07 09:42:55,105] [INFO] Running firmware checks... +[2026-05-07 09:42:55,111] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 09:42:55,113] [INFO] Opened ESI connection to port None +[2026-05-07 09:42:55,115] [INFO] Checking valid firmware... +[2026-05-07 09:42:55,116] [INFO] Running firmware checks... +[2026-05-07 09:42:55,125] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 09:42:55,126] [INFO] Loading modules... +[2026-05-07 09:42:55,146] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-07 09:42:55,166] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-07 09:42:55,177] [INFO] Application startup complete. +[2026-05-07 09:42:55,217] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-07 19:58:03,712] [WARNING] Invalid HTTP request received. +[2026-05-07 19:58:03,724] [WARNING] Invalid HTTP request received. +[2026-05-07 23:11:31,870] [INFO] OFM server root logger has been set up at INFO level +[2026-05-07 23:11:32,738] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 23:11:32,739] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 23:11:32,740] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-07 23:11:34,244] [INFO] Started server process [516] +[2026-05-07 23:11:34,247] [INFO] Waiting for application startup. +[2026-05-07 23:11:34,291] [INFO] Creating new Picamera2 object +[2026-05-07 23:11:34,433] [INFO] Initialization successful. +[2026-05-07 23:11:34,434] [INFO] Camera now open. +[2026-05-07 23:11:34,447] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,451] [INFO] Configuration successful! +[2026-05-07 23:11:34,475] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,479] [INFO] Configuration successful! +[2026-05-07 23:11:34,503] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,507] [INFO] Configuration successful! +[2026-05-07 23:11:34,531] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,535] [INFO] Configuration successful! +[2026-05-07 23:11:34,578] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,581] [INFO] Configuration successful! +[2026-05-07 23:11:34,604] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,607] [INFO] Configuration successful! +[2026-05-07 23:11:34,629] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,632] [INFO] Configuration successful! +[2026-05-07 23:11:34,655] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,658] [INFO] Configuration successful! +[2026-05-07 23:11:34,697] [INFO] Camera configuration has been adjusted! +[2026-05-07 23:11:34,700] [INFO] Configuration successful! +[2026-05-07 23:11:34,736] [INFO] Starting picamera MJPEG stream... +[2026-05-07 23:11:34,787] [INFO] Camera started +[2026-05-07 23:11:34,819] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-07 23:11:34,820] [INFO] Updating ESI port settings +[2026-05-07 23:11:34,820] [INFO] Opening ESI connection to port None +[2026-05-07 23:11:34,836] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-07 23:11:34,837] [INFO] Creating serial.Serial instance... +[2026-05-07 23:11:34,838] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 23:11:34,839] [INFO] Testing communication to SangaBoard +[2026-05-07 23:11:34,839] [INFO] Running firmware checks... +[2026-05-07 23:11:34,845] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 23:11:34,847] [INFO] Success! +[2026-05-07 23:11:34,848] [INFO] Creating serial.Serial instance... +[2026-05-07 23:11:34,849] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-07 23:11:34,850] [INFO] Testing communication to SangaBoard +[2026-05-07 23:11:34,850] [INFO] Running firmware checks... +[2026-05-07 23:11:34,856] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 23:11:34,857] [INFO] Opened ESI connection to port None +[2026-05-07 23:11:34,857] [INFO] Checking valid firmware... +[2026-05-07 23:11:34,858] [INFO] Running firmware checks... +[2026-05-07 23:11:34,863] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-07 23:11:34,864] [INFO] Loading modules... +[2026-05-07 23:11:34,884] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-07 23:11:34,900] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-07 23:11:34,916] [INFO] Application startup complete. +[2026-05-07 23:11:34,945] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-08 05:19:57,826] [INFO] OFM server root logger has been set up at INFO level +[2026-05-08 05:19:58,695] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 05:19:58,696] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 05:19:58,696] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 05:20:00,202] [INFO] Started server process [515] +[2026-05-08 05:20:00,203] [INFO] Waiting for application startup. +[2026-05-08 05:20:00,247] [INFO] Creating new Picamera2 object +[2026-05-08 05:20:00,389] [INFO] Initialization successful. +[2026-05-08 05:20:00,390] [INFO] Camera now open. +[2026-05-08 05:20:00,403] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,408] [INFO] Configuration successful! +[2026-05-08 05:20:00,433] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,437] [INFO] Configuration successful! +[2026-05-08 05:20:00,462] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,465] [INFO] Configuration successful! +[2026-05-08 05:20:00,490] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,493] [INFO] Configuration successful! +[2026-05-08 05:20:00,537] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,540] [INFO] Configuration successful! +[2026-05-08 05:20:00,562] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,566] [INFO] Configuration successful! +[2026-05-08 05:20:00,588] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,591] [INFO] Configuration successful! +[2026-05-08 05:20:00,614] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,617] [INFO] Configuration successful! +[2026-05-08 05:20:00,656] [INFO] Camera configuration has been adjusted! +[2026-05-08 05:20:00,660] [INFO] Configuration successful! +[2026-05-08 05:20:00,696] [INFO] Starting picamera MJPEG stream... +[2026-05-08 05:20:00,747] [INFO] Camera started +[2026-05-08 05:20:00,781] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-08 05:20:00,782] [INFO] Updating ESI port settings +[2026-05-08 05:20:00,783] [INFO] Opening ESI connection to port None +[2026-05-08 05:20:00,798] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-08 05:20:00,799] [INFO] Creating serial.Serial instance... +[2026-05-08 05:20:00,800] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 05:20:00,801] [INFO] Testing communication to SangaBoard +[2026-05-08 05:20:00,801] [INFO] Running firmware checks... +[2026-05-08 05:20:00,807] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 05:20:00,809] [INFO] Success! +[2026-05-08 05:20:00,810] [INFO] Creating serial.Serial instance... +[2026-05-08 05:20:00,812] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 05:20:00,813] [INFO] Testing communication to SangaBoard +[2026-05-08 05:20:00,813] [INFO] Running firmware checks... +[2026-05-08 05:20:00,819] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 05:20:00,820] [INFO] Opened ESI connection to port None +[2026-05-08 05:20:00,820] [INFO] Checking valid firmware... +[2026-05-08 05:20:00,821] [INFO] Running firmware checks... +[2026-05-08 05:20:00,826] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 05:20:00,827] [INFO] Loading modules... +[2026-05-08 05:20:00,848] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-08 05:20:00,865] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-08 05:20:00,880] [INFO] Application startup complete. +[2026-05-08 05:20:00,910] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-08 05:59:48,578] [INFO] Shutting down +[2026-05-08 05:59:48,853] [INFO] Waiting for connections to close. (CTRL+C to force quit) +[2026-05-08 05:59:49,079] [INFO] Waiting for application shutdown. +[2026-05-08 05:59:49,463] [INFO] Camera stopped +[2026-05-08 05:59:49,942] [INFO] Stopped MJPEG stream. +[2026-05-08 05:59:50,850] [INFO] Camera closed successfully. +[2026-05-08 05:59:50,869] [INFO] Application shutdown complete. +[2026-05-08 05:59:50,889] [INFO] Finished server process [515] +[2026-05-08 06:18:34,584] [INFO] OFM server root logger has been set up at INFO level +[2026-05-08 06:18:35,453] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 06:18:35,454] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 06:18:35,455] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 06:18:36,961] [INFO] Started server process [518] +[2026-05-08 06:18:36,963] [INFO] Waiting for application startup. +[2026-05-08 06:18:37,006] [INFO] Creating new Picamera2 object +[2026-05-08 06:18:37,148] [INFO] Initialization successful. +[2026-05-08 06:18:37,150] [INFO] Camera now open. +[2026-05-08 06:18:37,163] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,169] [INFO] Configuration successful! +[2026-05-08 06:18:37,193] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,197] [INFO] Configuration successful! +[2026-05-08 06:18:37,222] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,226] [INFO] Configuration successful! +[2026-05-08 06:18:37,252] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,255] [INFO] Configuration successful! +[2026-05-08 06:18:37,299] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,303] [INFO] Configuration successful! +[2026-05-08 06:18:37,326] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,329] [INFO] Configuration successful! +[2026-05-08 06:18:37,352] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,355] [INFO] Configuration successful! +[2026-05-08 06:18:37,378] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,382] [INFO] Configuration successful! +[2026-05-08 06:18:37,422] [INFO] Camera configuration has been adjusted! +[2026-05-08 06:18:37,425] [INFO] Configuration successful! +[2026-05-08 06:18:37,461] [INFO] Starting picamera MJPEG stream... +[2026-05-08 06:18:37,512] [INFO] Camera started +[2026-05-08 06:18:37,545] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-08 06:18:37,546] [INFO] Updating ESI port settings +[2026-05-08 06:18:37,546] [INFO] Opening ESI connection to port None +[2026-05-08 06:18:37,563] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-08 06:18:37,563] [INFO] Creating serial.Serial instance... +[2026-05-08 06:18:37,565] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 06:18:37,565] [INFO] Testing communication to SangaBoard +[2026-05-08 06:18:37,566] [INFO] Running firmware checks... +[2026-05-08 06:18:37,571] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 06:18:37,574] [INFO] Success! +[2026-05-08 06:18:37,574] [INFO] Creating serial.Serial instance... +[2026-05-08 06:18:37,576] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 06:18:37,577] [INFO] Testing communication to SangaBoard +[2026-05-08 06:18:37,577] [INFO] Running firmware checks... +[2026-05-08 06:18:37,583] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 06:18:37,583] [INFO] Opened ESI connection to port None +[2026-05-08 06:18:37,584] [INFO] Checking valid firmware... +[2026-05-08 06:18:37,584] [INFO] Running firmware checks... +[2026-05-08 06:18:37,590] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 06:18:37,591] [INFO] Loading modules... +[2026-05-08 06:18:37,613] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-08 06:18:37,629] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-08 06:18:37,644] [INFO] Application startup complete. +[2026-05-08 06:18:37,675] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-08 07:01:14,256] [WARNING] Invalid HTTP request received. +[2026-05-08 07:01:14,271] [WARNING] Invalid HTTP request received. +[2026-05-08 07:01:18,826] [WARNING] Invalid HTTP request received. +[2026-05-08 07:01:18,859] [WARNING] Invalid HTTP request received. +[2026-05-08 07:35:34,281] [INFO] OFM server root logger has been set up at INFO level +[2026-05-08 07:35:35,163] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 07:35:35,164] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 07:35:35,164] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 07:35:36,678] [INFO] Started server process [516] +[2026-05-08 07:35:36,680] [INFO] Waiting for application startup. +[2026-05-08 07:35:36,723] [INFO] Creating new Picamera2 object +[2026-05-08 07:35:36,865] [INFO] Initialization successful. +[2026-05-08 07:35:36,866] [INFO] Camera now open. +[2026-05-08 07:35:36,879] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:36,885] [INFO] Configuration successful! +[2026-05-08 07:35:36,910] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:36,913] [INFO] Configuration successful! +[2026-05-08 07:35:36,937] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:36,940] [INFO] Configuration successful! +[2026-05-08 07:35:36,965] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:36,968] [INFO] Configuration successful! +[2026-05-08 07:35:37,012] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:37,015] [INFO] Configuration successful! +[2026-05-08 07:35:37,038] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:37,041] [INFO] Configuration successful! +[2026-05-08 07:35:37,063] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:37,066] [INFO] Configuration successful! +[2026-05-08 07:35:37,089] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:37,092] [INFO] Configuration successful! +[2026-05-08 07:35:37,131] [INFO] Camera configuration has been adjusted! +[2026-05-08 07:35:37,134] [INFO] Configuration successful! +[2026-05-08 07:35:37,174] [INFO] Starting picamera MJPEG stream... +[2026-05-08 07:35:37,227] [INFO] Camera started +[2026-05-08 07:35:37,260] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-08 07:35:37,261] [INFO] Updating ESI port settings +[2026-05-08 07:35:37,262] [INFO] Opening ESI connection to port None +[2026-05-08 07:35:37,277] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-08 07:35:37,278] [INFO] Creating serial.Serial instance... +[2026-05-08 07:35:37,279] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 07:35:37,280] [INFO] Testing communication to SangaBoard +[2026-05-08 07:35:37,280] [INFO] Running firmware checks... +[2026-05-08 07:35:37,286] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 07:35:37,289] [INFO] Success! +[2026-05-08 07:35:37,290] [INFO] Creating serial.Serial instance... +[2026-05-08 07:35:37,291] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 07:35:37,292] [INFO] Testing communication to SangaBoard +[2026-05-08 07:35:37,292] [INFO] Running firmware checks... +[2026-05-08 07:35:37,298] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 07:35:37,299] [INFO] Opened ESI connection to port None +[2026-05-08 07:35:37,299] [INFO] Checking valid firmware... +[2026-05-08 07:35:37,299] [INFO] Running firmware checks... +[2026-05-08 07:35:37,305] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 07:35:37,306] [INFO] Loading modules... +[2026-05-08 07:35:37,327] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-08 07:35:37,343] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-08 07:35:37,357] [INFO] Application startup complete. +[2026-05-08 07:35:37,400] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-08 10:58:35,679] [INFO] OFM server root logger has been set up at INFO level +[2026-05-08 10:58:36,556] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 10:58:36,557] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 10:58:36,557] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-08 10:58:38,094] [INFO] Started server process [515] +[2026-05-08 10:58:38,096] [INFO] Waiting for application startup. +[2026-05-08 10:58:38,139] [INFO] Creating new Picamera2 object +[2026-05-08 10:58:38,281] [INFO] Initialization successful. +[2026-05-08 10:58:38,282] [INFO] Camera now open. +[2026-05-08 10:58:38,296] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,300] [INFO] Configuration successful! +[2026-05-08 10:58:38,324] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,327] [INFO] Configuration successful! +[2026-05-08 10:58:38,352] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,355] [INFO] Configuration successful! +[2026-05-08 10:58:38,380] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,383] [INFO] Configuration successful! +[2026-05-08 10:58:38,429] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,432] [INFO] Configuration successful! +[2026-05-08 10:58:38,455] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,458] [INFO] Configuration successful! +[2026-05-08 10:58:38,480] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,483] [INFO] Configuration successful! +[2026-05-08 10:58:38,507] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,510] [INFO] Configuration successful! +[2026-05-08 10:58:38,549] [INFO] Camera configuration has been adjusted! +[2026-05-08 10:58:38,552] [INFO] Configuration successful! +[2026-05-08 10:58:38,588] [INFO] Starting picamera MJPEG stream... +[2026-05-08 10:58:38,640] [INFO] Camera started +[2026-05-08 10:58:38,673] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-08 10:58:38,674] [INFO] Updating ESI port settings +[2026-05-08 10:58:38,674] [INFO] Opening ESI connection to port None +[2026-05-08 10:58:38,691] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-08 10:58:38,691] [INFO] Creating serial.Serial instance... +[2026-05-08 10:58:38,693] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 10:58:38,694] [INFO] Testing communication to SangaBoard +[2026-05-08 10:58:38,694] [INFO] Running firmware checks... +[2026-05-08 10:58:38,700] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 10:58:38,702] [INFO] Success! +[2026-05-08 10:58:38,703] [INFO] Creating serial.Serial instance... +[2026-05-08 10:58:38,704] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-08 10:58:38,705] [INFO] Testing communication to SangaBoard +[2026-05-08 10:58:38,706] [INFO] Running firmware checks... +[2026-05-08 10:58:38,711] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 10:58:38,712] [INFO] Opened ESI connection to port None +[2026-05-08 10:58:38,712] [INFO] Checking valid firmware... +[2026-05-08 10:58:38,713] [INFO] Running firmware checks... +[2026-05-08 10:58:38,718] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-08 10:58:38,719] [INFO] Loading modules... +[2026-05-08 10:58:38,739] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-08 10:58:38,755] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-08 10:58:38,770] [INFO] Application startup complete. +[2026-05-08 10:58:38,804] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 03:46:28,399] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 03:46:29,279] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 03:46:29,280] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 03:46:29,281] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 03:46:30,797] [INFO] Started server process [512] +[2026-05-09 03:46:30,800] [INFO] Waiting for application startup. +[2026-05-09 03:46:30,843] [INFO] Creating new Picamera2 object +[2026-05-09 03:46:30,985] [INFO] Initialization successful. +[2026-05-09 03:46:30,986] [INFO] Camera now open. +[2026-05-09 03:46:31,000] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,010] [INFO] Configuration successful! +[2026-05-09 03:46:31,034] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,038] [INFO] Configuration successful! +[2026-05-09 03:46:31,062] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,066] [INFO] Configuration successful! +[2026-05-09 03:46:31,091] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,095] [INFO] Configuration successful! +[2026-05-09 03:46:31,139] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,142] [INFO] Configuration successful! +[2026-05-09 03:46:31,165] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,169] [INFO] Configuration successful! +[2026-05-09 03:46:31,191] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,195] [INFO] Configuration successful! +[2026-05-09 03:46:31,218] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,222] [INFO] Configuration successful! +[2026-05-09 03:46:31,261] [INFO] Camera configuration has been adjusted! +[2026-05-09 03:46:31,265] [INFO] Configuration successful! +[2026-05-09 03:46:31,303] [INFO] Starting picamera MJPEG stream... +[2026-05-09 03:46:31,349] [INFO] Camera started +[2026-05-09 03:46:31,381] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 03:46:31,381] [INFO] Updating ESI port settings +[2026-05-09 03:46:31,382] [INFO] Opening ESI connection to port None +[2026-05-09 03:46:31,399] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 03:46:31,399] [INFO] Creating serial.Serial instance... +[2026-05-09 03:46:31,401] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 03:46:31,401] [INFO] Testing communication to SangaBoard +[2026-05-09 03:46:31,402] [INFO] Running firmware checks... +[2026-05-09 03:46:31,407] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 03:46:31,409] [INFO] Success! +[2026-05-09 03:46:31,410] [INFO] Creating serial.Serial instance... +[2026-05-09 03:46:31,412] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 03:46:31,412] [INFO] Testing communication to SangaBoard +[2026-05-09 03:46:31,413] [INFO] Running firmware checks... +[2026-05-09 03:46:31,418] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 03:46:31,419] [INFO] Opened ESI connection to port None +[2026-05-09 03:46:31,420] [INFO] Checking valid firmware... +[2026-05-09 03:46:31,420] [INFO] Running firmware checks... +[2026-05-09 03:46:31,425] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 03:46:31,426] [INFO] Loading modules... +[2026-05-09 03:46:31,449] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 03:46:31,466] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 03:46:31,480] [INFO] Application startup complete. +[2026-05-09 03:46:31,508] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 04:09:19,808] [INFO] Camera stopped +[2026-05-09 04:09:20,617] [INFO] Stopped MJPEG stream. +[2026-05-09 04:09:20,828] [INFO] Camera configuration has been adjusted! +[2026-05-09 04:09:20,844] [INFO] Configuration successful! +[2026-05-09 04:09:20,911] [INFO] Camera started +[2026-05-09 04:09:21,870] [INFO] Camera stopped +[2026-05-09 04:09:21,876] [INFO] Camera configuration has been adjusted! +[2026-05-09 04:09:21,885] [INFO] Configuration successful! +[2026-05-09 04:09:21,926] [INFO] Starting picamera MJPEG stream... +[2026-05-09 04:09:21,967] [INFO] Camera started +[2026-05-09 06:45:56,299] [INFO] Finding a list of all overlapping images +[2026-05-09 06:45:56,503] [INFO] Starting correlation of overlapping image pairs. +[2026-05-09 06:46:04,172] [INFO] Correlation complete. Pairs loaded from cache: 5, pairs calculated: 2 +[2026-05-09 06:46:04,179] [INFO] Getting all the image info ready to stitch +[2026-05-09 06:46:04,180] [INFO] Plotting the inputs to stitching +[2026-05-09 06:46:08,398] [INFO] Finding the optimal threshold +[2026-05-09 06:46:08,400] [INFO] Starting with 4 possible peak quality thresholds and 7 possible stage discrepancy thresholds +[2026-05-09 06:46:08,401] [INFO] After filtering and resampling 4 peak quality thresholds and 7 stage discrepancy thresholds will be trialed for fit quality. +[2026-05-09 06:46:12,829] [INFO] Using 6 of the 7 pairs for final optimisation +[2026-05-09 06:46:13,032] [INFO] Starting csm is [[ 0.033 , -4.9262], [ 4.938 , 0.0053]] +[2026-05-09 06:46:13,037] [INFO] A better starting estimate of the csm is [[ 0.0069, -5.0023], [ 5.0712, -0.0069]]. +[2026-05-09 06:46:14,647] [INFO] Final image will be exported with size (1902, 3422) pixels +[2026-05-09 06:46:14,649] [INFO] Exporting stitched image. Depending on the size of your scan, this may take a while. +[2026-05-09 06:46:24,733] [INFO] Stitching complete +[2026-05-09 09:42:51,147] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 09:42:52,029] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 09:42:52,030] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 09:42:52,030] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 09:42:53,547] [INFO] Started server process [515] +[2026-05-09 09:42:53,548] [INFO] Waiting for application startup. +[2026-05-09 09:42:53,592] [INFO] Creating new Picamera2 object +[2026-05-09 09:42:53,734] [INFO] Initialization successful. +[2026-05-09 09:42:53,735] [INFO] Camera now open. +[2026-05-09 09:42:53,748] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,753] [INFO] Configuration successful! +[2026-05-09 09:42:53,777] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,781] [INFO] Configuration successful! +[2026-05-09 09:42:53,807] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,811] [INFO] Configuration successful! +[2026-05-09 09:42:53,836] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,840] [INFO] Configuration successful! +[2026-05-09 09:42:53,883] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,887] [INFO] Configuration successful! +[2026-05-09 09:42:53,909] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,912] [INFO] Configuration successful! +[2026-05-09 09:42:53,934] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,938] [INFO] Configuration successful! +[2026-05-09 09:42:53,960] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:53,964] [INFO] Configuration successful! +[2026-05-09 09:42:54,004] [INFO] Camera configuration has been adjusted! +[2026-05-09 09:42:54,007] [INFO] Configuration successful! +[2026-05-09 09:42:54,044] [INFO] Starting picamera MJPEG stream... +[2026-05-09 09:42:54,094] [INFO] Camera started +[2026-05-09 09:42:54,127] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 09:42:54,128] [INFO] Updating ESI port settings +[2026-05-09 09:42:54,128] [INFO] Opening ESI connection to port None +[2026-05-09 09:42:54,144] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 09:42:54,144] [INFO] Creating serial.Serial instance... +[2026-05-09 09:42:54,146] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 09:42:54,146] [INFO] Testing communication to SangaBoard +[2026-05-09 09:42:54,147] [INFO] Running firmware checks... +[2026-05-09 09:42:54,152] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 09:42:54,155] [INFO] Success! +[2026-05-09 09:42:54,156] [INFO] Creating serial.Serial instance... +[2026-05-09 09:42:54,157] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 09:42:54,157] [INFO] Testing communication to SangaBoard +[2026-05-09 09:42:54,158] [INFO] Running firmware checks... +[2026-05-09 09:42:54,164] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 09:42:54,164] [INFO] Opened ESI connection to port None +[2026-05-09 09:42:54,165] [INFO] Checking valid firmware... +[2026-05-09 09:42:54,165] [INFO] Running firmware checks... +[2026-05-09 09:42:54,171] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 09:42:54,172] [INFO] Loading modules... +[2026-05-09 09:42:54,193] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 09:42:54,210] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 09:42:54,225] [INFO] Application startup complete. +[2026-05-09 09:42:54,266] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 10:11:37,650] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 10:11:38,527] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 10:11:38,528] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 10:11:38,529] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 10:11:40,050] [INFO] Started server process [513] +[2026-05-09 10:11:40,052] [INFO] Waiting for application startup. +[2026-05-09 10:11:40,096] [INFO] Creating new Picamera2 object +[2026-05-09 10:11:40,238] [INFO] Initialization successful. +[2026-05-09 10:11:40,239] [INFO] Camera now open. +[2026-05-09 10:11:40,252] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,257] [INFO] Configuration successful! +[2026-05-09 10:11:40,282] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,285] [INFO] Configuration successful! +[2026-05-09 10:11:40,309] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,313] [INFO] Configuration successful! +[2026-05-09 10:11:40,338] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,341] [INFO] Configuration successful! +[2026-05-09 10:11:40,384] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,388] [INFO] Configuration successful! +[2026-05-09 10:11:40,410] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,414] [INFO] Configuration successful! +[2026-05-09 10:11:40,436] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,439] [INFO] Configuration successful! +[2026-05-09 10:11:40,462] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,465] [INFO] Configuration successful! +[2026-05-09 10:11:40,505] [INFO] Camera configuration has been adjusted! +[2026-05-09 10:11:40,508] [INFO] Configuration successful! +[2026-05-09 10:11:40,544] [INFO] Starting picamera MJPEG stream... +[2026-05-09 10:11:40,595] [INFO] Camera started +[2026-05-09 10:11:40,629] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 10:11:40,630] [INFO] Updating ESI port settings +[2026-05-09 10:11:40,631] [INFO] Opening ESI connection to port None +[2026-05-09 10:11:40,647] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 10:11:40,648] [INFO] Creating serial.Serial instance... +[2026-05-09 10:11:40,649] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 10:11:40,650] [INFO] Testing communication to SangaBoard +[2026-05-09 10:11:40,650] [INFO] Running firmware checks... +[2026-05-09 10:11:40,656] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 10:11:40,658] [INFO] Success! +[2026-05-09 10:11:40,659] [INFO] Creating serial.Serial instance... +[2026-05-09 10:11:40,661] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 10:11:40,662] [INFO] Testing communication to SangaBoard +[2026-05-09 10:11:40,662] [INFO] Running firmware checks... +[2026-05-09 10:11:40,667] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 10:11:40,668] [INFO] Opened ESI connection to port None +[2026-05-09 10:11:40,669] [INFO] Checking valid firmware... +[2026-05-09 10:11:40,669] [INFO] Running firmware checks... +[2026-05-09 10:11:40,675] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 10:11:40,676] [INFO] Loading modules... +[2026-05-09 10:11:40,698] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 10:11:40,718] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 10:11:40,730] [INFO] Application startup complete. +[2026-05-09 10:11:40,762] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 10:29:14,345] [INFO] Finding a list of all overlapping images +[2026-05-09 10:29:14,553] [INFO] Starting correlation of overlapping image pairs. +[2026-05-09 10:29:32,179] [INFO] Correlation complete. Pairs loaded from cache: 3, pairs calculated: 4 +[2026-05-09 10:29:32,183] [INFO] Getting all the image info ready to stitch +[2026-05-09 10:29:32,184] [INFO] Plotting the inputs to stitching +[2026-05-09 10:29:37,037] [INFO] Finding the optimal threshold +[2026-05-09 10:29:37,039] [INFO] Starting with 6 possible peak quality thresholds and 7 possible stage discrepancy thresholds +[2026-05-09 10:29:37,048] [INFO] After filtering and resampling 6 peak quality thresholds and 7 stage discrepancy thresholds will be trialed for fit quality. +[2026-05-09 10:29:41,081] [INFO] Using 6 of the 7 pairs for final optimisation +[2026-05-09 10:29:41,083] [INFO] Starting csm is [[ 0.033 , -4.9262], [ 4.938 , 0.0053]] +[2026-05-09 10:29:41,086] [INFO] A better starting estimate of the csm is [[-0.0183, -4.9135], [ 5.0145, -0.0143]]. +[2026-05-09 10:29:43,720] [INFO] Final image will be exported with size (1926, 2544) pixels +[2026-05-09 10:29:43,723] [INFO] Exporting stitched image. Depending on the size of your scan, this may take a while. +[2026-05-09 10:29:56,278] [INFO] Stitching complete +[2026-05-09 14:19:54,893] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 14:19:55,771] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 14:19:55,772] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 14:19:55,773] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 14:19:57,289] [INFO] Started server process [513] +[2026-05-09 14:19:57,290] [INFO] Waiting for application startup. +[2026-05-09 14:19:57,334] [INFO] Creating new Picamera2 object +[2026-05-09 14:19:57,475] [INFO] Initialization successful. +[2026-05-09 14:19:57,476] [INFO] Camera now open. +[2026-05-09 14:19:57,490] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,494] [INFO] Configuration successful! +[2026-05-09 14:19:57,519] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,522] [INFO] Configuration successful! +[2026-05-09 14:19:57,546] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,550] [INFO] Configuration successful! +[2026-05-09 14:19:57,575] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,578] [INFO] Configuration successful! +[2026-05-09 14:19:57,622] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,625] [INFO] Configuration successful! +[2026-05-09 14:19:57,648] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,652] [INFO] Configuration successful! +[2026-05-09 14:19:57,674] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,677] [INFO] Configuration successful! +[2026-05-09 14:19:57,700] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,704] [INFO] Configuration successful! +[2026-05-09 14:19:57,743] [INFO] Camera configuration has been adjusted! +[2026-05-09 14:19:57,746] [INFO] Configuration successful! +[2026-05-09 14:19:57,785] [INFO] Starting picamera MJPEG stream... +[2026-05-09 14:19:57,834] [INFO] Camera started +[2026-05-09 14:19:57,868] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 14:19:57,869] [INFO] Updating ESI port settings +[2026-05-09 14:19:57,870] [INFO] Opening ESI connection to port None +[2026-05-09 14:19:57,886] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 14:19:57,887] [INFO] Creating serial.Serial instance... +[2026-05-09 14:19:57,888] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 14:19:57,889] [INFO] Testing communication to SangaBoard +[2026-05-09 14:19:57,889] [INFO] Running firmware checks... +[2026-05-09 14:19:57,895] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 14:19:57,897] [INFO] Success! +[2026-05-09 14:19:57,898] [INFO] Creating serial.Serial instance... +[2026-05-09 14:19:57,899] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 14:19:57,900] [INFO] Testing communication to SangaBoard +[2026-05-09 14:19:57,900] [INFO] Running firmware checks... +[2026-05-09 14:19:57,908] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 14:19:57,909] [INFO] Opened ESI connection to port None +[2026-05-09 14:19:57,910] [INFO] Checking valid firmware... +[2026-05-09 14:19:57,910] [INFO] Running firmware checks... +[2026-05-09 14:19:57,915] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 14:19:57,916] [INFO] Loading modules... +[2026-05-09 14:19:57,937] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 14:19:57,954] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 14:19:57,969] [INFO] Application startup complete. +[2026-05-09 14:19:58,000] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 16:33:43,737] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 16:33:44,614] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:33:44,615] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:33:44,615] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:33:46,127] [INFO] Started server process [513] +[2026-05-09 16:33:46,129] [INFO] Waiting for application startup. +[2026-05-09 16:33:46,172] [INFO] Creating new Picamera2 object +[2026-05-09 16:33:46,314] [INFO] Initialization successful. +[2026-05-09 16:33:46,315] [INFO] Camera now open. +[2026-05-09 16:33:46,328] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,333] [INFO] Configuration successful! +[2026-05-09 16:33:46,358] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,362] [INFO] Configuration successful! +[2026-05-09 16:33:46,386] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,390] [INFO] Configuration successful! +[2026-05-09 16:33:46,415] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,418] [INFO] Configuration successful! +[2026-05-09 16:33:46,462] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,465] [INFO] Configuration successful! +[2026-05-09 16:33:46,488] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,492] [INFO] Configuration successful! +[2026-05-09 16:33:46,514] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,517] [INFO] Configuration successful! +[2026-05-09 16:33:46,540] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,544] [INFO] Configuration successful! +[2026-05-09 16:33:46,583] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:33:46,587] [INFO] Configuration successful! +[2026-05-09 16:33:46,623] [INFO] Starting picamera MJPEG stream... +[2026-05-09 16:33:46,672] [INFO] Camera started +[2026-05-09 16:33:46,705] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 16:33:46,706] [INFO] Updating ESI port settings +[2026-05-09 16:33:46,706] [INFO] Opening ESI connection to port None +[2026-05-09 16:33:46,724] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 16:33:46,725] [INFO] Creating serial.Serial instance... +[2026-05-09 16:33:46,726] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:33:46,727] [INFO] Testing communication to SangaBoard +[2026-05-09 16:33:46,727] [INFO] Running firmware checks... +[2026-05-09 16:33:46,733] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:33:46,735] [INFO] Success! +[2026-05-09 16:33:46,736] [INFO] Creating serial.Serial instance... +[2026-05-09 16:33:46,738] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:33:46,739] [INFO] Testing communication to SangaBoard +[2026-05-09 16:33:46,739] [INFO] Running firmware checks... +[2026-05-09 16:33:46,745] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:33:46,746] [INFO] Opened ESI connection to port None +[2026-05-09 16:33:46,746] [INFO] Checking valid firmware... +[2026-05-09 16:33:46,746] [INFO] Running firmware checks... +[2026-05-09 16:33:46,752] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:33:46,754] [INFO] Loading modules... +[2026-05-09 16:33:46,774] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 16:33:46,791] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 16:33:46,805] [INFO] Application startup complete. +[2026-05-09 16:33:46,842] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 16:34:44,375] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 16:34:45,254] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:34:45,255] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:34:45,255] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:34:46,772] [INFO] Started server process [516] +[2026-05-09 16:34:46,773] [INFO] Waiting for application startup. +[2026-05-09 16:34:46,817] [INFO] Creating new Picamera2 object +[2026-05-09 16:34:46,959] [INFO] Initialization successful. +[2026-05-09 16:34:46,960] [INFO] Camera now open. +[2026-05-09 16:34:46,974] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:46,978] [INFO] Configuration successful! +[2026-05-09 16:34:47,003] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,006] [INFO] Configuration successful! +[2026-05-09 16:34:47,031] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,034] [INFO] Configuration successful! +[2026-05-09 16:34:47,059] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,062] [INFO] Configuration successful! +[2026-05-09 16:34:47,106] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,109] [INFO] Configuration successful! +[2026-05-09 16:34:47,132] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,135] [INFO] Configuration successful! +[2026-05-09 16:34:47,158] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,161] [INFO] Configuration successful! +[2026-05-09 16:34:47,184] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,187] [INFO] Configuration successful! +[2026-05-09 16:34:47,227] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:34:47,230] [INFO] Configuration successful! +[2026-05-09 16:34:47,266] [INFO] Starting picamera MJPEG stream... +[2026-05-09 16:34:47,319] [INFO] Camera started +[2026-05-09 16:34:47,354] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 16:34:47,355] [INFO] Updating ESI port settings +[2026-05-09 16:34:47,356] [INFO] Opening ESI connection to port None +[2026-05-09 16:34:47,374] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 16:34:47,375] [INFO] Creating serial.Serial instance... +[2026-05-09 16:34:47,376] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:34:47,377] [INFO] Testing communication to SangaBoard +[2026-05-09 16:34:47,377] [INFO] Running firmware checks... +[2026-05-09 16:34:47,382] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:34:47,385] [INFO] Success! +[2026-05-09 16:34:47,386] [INFO] Creating serial.Serial instance... +[2026-05-09 16:34:47,388] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:34:47,389] [INFO] Testing communication to SangaBoard +[2026-05-09 16:34:47,389] [INFO] Running firmware checks... +[2026-05-09 16:34:47,394] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:34:47,395] [INFO] Opened ESI connection to port None +[2026-05-09 16:34:47,396] [INFO] Checking valid firmware... +[2026-05-09 16:34:47,396] [INFO] Running firmware checks... +[2026-05-09 16:34:47,402] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:34:47,403] [INFO] Loading modules... +[2026-05-09 16:34:47,423] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 16:34:47,441] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 16:34:47,454] [INFO] Application startup complete. +[2026-05-09 16:34:47,505] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 16:45:06,003] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 16:45:06,923] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:45:06,924] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:45:06,925] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 16:45:08,438] [INFO] Started server process [515] +[2026-05-09 16:45:08,440] [INFO] Waiting for application startup. +[2026-05-09 16:45:08,483] [INFO] Creating new Picamera2 object +[2026-05-09 16:45:08,625] [INFO] Initialization successful. +[2026-05-09 16:45:08,626] [INFO] Camera now open. +[2026-05-09 16:45:08,639] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,644] [INFO] Configuration successful! +[2026-05-09 16:45:08,668] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,672] [INFO] Configuration successful! +[2026-05-09 16:45:08,696] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,699] [INFO] Configuration successful! +[2026-05-09 16:45:08,724] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,728] [INFO] Configuration successful! +[2026-05-09 16:45:08,773] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,776] [INFO] Configuration successful! +[2026-05-09 16:45:08,799] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,803] [INFO] Configuration successful! +[2026-05-09 16:45:08,825] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,828] [INFO] Configuration successful! +[2026-05-09 16:45:08,851] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,854] [INFO] Configuration successful! +[2026-05-09 16:45:08,894] [INFO] Camera configuration has been adjusted! +[2026-05-09 16:45:08,897] [INFO] Configuration successful! +[2026-05-09 16:45:08,933] [INFO] Starting picamera MJPEG stream... +[2026-05-09 16:45:08,984] [INFO] Camera started +[2026-05-09 16:45:09,015] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 16:45:09,017] [INFO] Updating ESI port settings +[2026-05-09 16:45:09,017] [INFO] Opening ESI connection to port None +[2026-05-09 16:45:09,033] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 16:45:09,034] [INFO] Creating serial.Serial instance... +[2026-05-09 16:45:09,036] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:45:09,037] [INFO] Testing communication to SangaBoard +[2026-05-09 16:45:09,037] [INFO] Running firmware checks... +[2026-05-09 16:45:09,043] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:45:09,045] [INFO] Success! +[2026-05-09 16:45:09,046] [INFO] Creating serial.Serial instance... +[2026-05-09 16:45:09,048] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 16:45:09,048] [INFO] Testing communication to SangaBoard +[2026-05-09 16:45:09,049] [INFO] Running firmware checks... +[2026-05-09 16:45:09,054] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:45:09,055] [INFO] Opened ESI connection to port None +[2026-05-09 16:45:09,056] [INFO] Checking valid firmware... +[2026-05-09 16:45:09,057] [INFO] Running firmware checks... +[2026-05-09 16:45:09,062] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 16:45:09,063] [INFO] Loading modules... +[2026-05-09 16:45:09,083] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 16:45:09,100] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 16:45:09,117] [INFO] Application startup complete. +[2026-05-09 16:45:09,143] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-09 17:34:38,368] [INFO] OFM server root logger has been set up at INFO level +[2026-05-09 17:34:39,249] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 17:34:39,250] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 17:34:39,251] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-09 17:34:40,776] [INFO] Started server process [516] +[2026-05-09 17:34:40,778] [INFO] Waiting for application startup. +[2026-05-09 17:34:40,821] [INFO] Creating new Picamera2 object +[2026-05-09 17:34:40,963] [INFO] Initialization successful. +[2026-05-09 17:34:40,964] [INFO] Camera now open. +[2026-05-09 17:34:40,978] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:40,984] [INFO] Configuration successful! +[2026-05-09 17:34:41,008] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,012] [INFO] Configuration successful! +[2026-05-09 17:34:41,036] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,039] [INFO] Configuration successful! +[2026-05-09 17:34:41,064] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,068] [INFO] Configuration successful! +[2026-05-09 17:34:41,111] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,115] [INFO] Configuration successful! +[2026-05-09 17:34:41,137] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,141] [INFO] Configuration successful! +[2026-05-09 17:34:41,163] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,166] [INFO] Configuration successful! +[2026-05-09 17:34:41,189] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,192] [INFO] Configuration successful! +[2026-05-09 17:34:41,231] [INFO] Camera configuration has been adjusted! +[2026-05-09 17:34:41,235] [INFO] Configuration successful! +[2026-05-09 17:34:41,271] [INFO] Starting picamera MJPEG stream... +[2026-05-09 17:34:41,328] [INFO] Camera started +[2026-05-09 17:34:41,362] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-09 17:34:41,363] [INFO] Updating ESI port settings +[2026-05-09 17:34:41,363] [INFO] Opening ESI connection to port None +[2026-05-09 17:34:41,379] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-09 17:34:41,380] [INFO] Creating serial.Serial instance... +[2026-05-09 17:34:41,381] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 17:34:41,382] [INFO] Testing communication to SangaBoard +[2026-05-09 17:34:41,382] [INFO] Running firmware checks... +[2026-05-09 17:34:41,388] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 17:34:41,390] [INFO] Success! +[2026-05-09 17:34:41,391] [INFO] Creating serial.Serial instance... +[2026-05-09 17:34:41,393] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-09 17:34:41,393] [INFO] Testing communication to SangaBoard +[2026-05-09 17:34:41,394] [INFO] Running firmware checks... +[2026-05-09 17:34:41,399] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 17:34:41,400] [INFO] Opened ESI connection to port None +[2026-05-09 17:34:41,401] [INFO] Checking valid firmware... +[2026-05-09 17:34:41,401] [INFO] Running firmware checks... +[2026-05-09 17:34:41,406] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-09 17:34:41,407] [INFO] Loading modules... +[2026-05-09 17:34:41,429] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-09 17:34:41,444] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-09 17:34:41,461] [INFO] Application startup complete. +[2026-05-09 17:34:41,494] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-10 05:55:24,719] [INFO] OFM server root logger has been set up at INFO level +[2026-05-10 05:55:25,596] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 05:55:25,597] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 05:55:25,597] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 05:55:27,117] [INFO] Started server process [514] +[2026-05-10 05:55:27,118] [INFO] Waiting for application startup. +[2026-05-10 05:55:27,162] [INFO] Creating new Picamera2 object +[2026-05-10 05:55:27,303] [INFO] Initialization successful. +[2026-05-10 05:55:27,305] [INFO] Camera now open. +[2026-05-10 05:55:27,318] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,323] [INFO] Configuration successful! +[2026-05-10 05:55:27,348] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,351] [INFO] Configuration successful! +[2026-05-10 05:55:27,375] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,379] [INFO] Configuration successful! +[2026-05-10 05:55:27,404] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,407] [INFO] Configuration successful! +[2026-05-10 05:55:27,451] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,454] [INFO] Configuration successful! +[2026-05-10 05:55:27,477] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,480] [INFO] Configuration successful! +[2026-05-10 05:55:27,502] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,506] [INFO] Configuration successful! +[2026-05-10 05:55:27,529] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,532] [INFO] Configuration successful! +[2026-05-10 05:55:27,571] [INFO] Camera configuration has been adjusted! +[2026-05-10 05:55:27,576] [INFO] Configuration successful! +[2026-05-10 05:55:27,611] [INFO] Starting picamera MJPEG stream... +[2026-05-10 05:55:27,661] [INFO] Camera started +[2026-05-10 05:55:27,692] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-10 05:55:27,694] [INFO] Updating ESI port settings +[2026-05-10 05:55:27,694] [INFO] Opening ESI connection to port None +[2026-05-10 05:55:27,711] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-10 05:55:27,711] [INFO] Creating serial.Serial instance... +[2026-05-10 05:55:27,712] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 05:55:27,713] [INFO] Testing communication to SangaBoard +[2026-05-10 05:55:27,713] [INFO] Running firmware checks... +[2026-05-10 05:55:27,719] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 05:55:27,721] [INFO] Success! +[2026-05-10 05:55:27,722] [INFO] Creating serial.Serial instance... +[2026-05-10 05:55:27,723] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 05:55:27,724] [INFO] Testing communication to SangaBoard +[2026-05-10 05:55:27,724] [INFO] Running firmware checks... +[2026-05-10 05:55:27,730] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 05:55:27,731] [INFO] Opened ESI connection to port None +[2026-05-10 05:55:27,731] [INFO] Checking valid firmware... +[2026-05-10 05:55:27,732] [INFO] Running firmware checks... +[2026-05-10 05:55:27,737] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 05:55:27,738] [INFO] Loading modules... +[2026-05-10 05:55:27,760] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-10 05:55:27,777] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-10 05:55:27,792] [INFO] Application startup complete. +[2026-05-10 05:55:27,823] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-10 06:22:58,462] [INFO] OFM server root logger has been set up at INFO level +[2026-05-10 06:22:59,343] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 06:22:59,344] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 06:22:59,344] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 06:23:00,866] [INFO] Started server process [516] +[2026-05-10 06:23:00,867] [INFO] Waiting for application startup. +[2026-05-10 06:23:00,911] [INFO] Creating new Picamera2 object +[2026-05-10 06:23:01,053] [INFO] Initialization successful. +[2026-05-10 06:23:01,054] [INFO] Camera now open. +[2026-05-10 06:23:01,067] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,072] [INFO] Configuration successful! +[2026-05-10 06:23:01,095] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,099] [INFO] Configuration successful! +[2026-05-10 06:23:01,122] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,126] [INFO] Configuration successful! +[2026-05-10 06:23:01,150] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,154] [INFO] Configuration successful! +[2026-05-10 06:23:01,197] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,200] [INFO] Configuration successful! +[2026-05-10 06:23:01,222] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,226] [INFO] Configuration successful! +[2026-05-10 06:23:01,247] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,250] [INFO] Configuration successful! +[2026-05-10 06:23:01,273] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,276] [INFO] Configuration successful! +[2026-05-10 06:23:01,315] [INFO] Camera configuration has been adjusted! +[2026-05-10 06:23:01,323] [INFO] Configuration successful! +[2026-05-10 06:23:01,358] [INFO] Starting picamera MJPEG stream... +[2026-05-10 06:23:01,408] [INFO] Camera started +[2026-05-10 06:23:01,442] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-10 06:23:01,443] [INFO] Updating ESI port settings +[2026-05-10 06:23:01,443] [INFO] Opening ESI connection to port None +[2026-05-10 06:23:01,459] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-10 06:23:01,460] [INFO] Creating serial.Serial instance... +[2026-05-10 06:23:01,461] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 06:23:01,462] [INFO] Testing communication to SangaBoard +[2026-05-10 06:23:01,462] [INFO] Running firmware checks... +[2026-05-10 06:23:01,468] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 06:23:01,470] [INFO] Success! +[2026-05-10 06:23:01,471] [INFO] Creating serial.Serial instance... +[2026-05-10 06:23:01,473] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 06:23:01,473] [INFO] Testing communication to SangaBoard +[2026-05-10 06:23:01,474] [INFO] Running firmware checks... +[2026-05-10 06:23:01,479] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 06:23:01,480] [INFO] Opened ESI connection to port None +[2026-05-10 06:23:01,481] [INFO] Checking valid firmware... +[2026-05-10 06:23:01,481] [INFO] Running firmware checks... +[2026-05-10 06:23:01,486] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 06:23:01,487] [INFO] Loading modules... +[2026-05-10 06:23:01,509] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-10 06:23:01,525] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-10 06:23:01,540] [INFO] Application startup complete. +[2026-05-10 06:23:01,572] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-10 09:41:22,805] [INFO] OFM server root logger has been set up at INFO level +[2026-05-10 09:41:23,683] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 09:41:23,684] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 09:41:23,684] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 09:41:25,250] [INFO] Started server process [513] +[2026-05-10 09:41:25,252] [INFO] Waiting for application startup. +[2026-05-10 09:41:25,295] [INFO] Creating new Picamera2 object +[2026-05-10 09:41:25,437] [INFO] Initialization successful. +[2026-05-10 09:41:25,439] [INFO] Camera now open. +[2026-05-10 09:41:25,452] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,457] [INFO] Configuration successful! +[2026-05-10 09:41:25,480] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,484] [INFO] Configuration successful! +[2026-05-10 09:41:25,508] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,511] [INFO] Configuration successful! +[2026-05-10 09:41:25,536] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,540] [INFO] Configuration successful! +[2026-05-10 09:41:25,583] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,586] [INFO] Configuration successful! +[2026-05-10 09:41:25,609] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,612] [INFO] Configuration successful! +[2026-05-10 09:41:25,635] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,638] [INFO] Configuration successful! +[2026-05-10 09:41:25,661] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,664] [INFO] Configuration successful! +[2026-05-10 09:41:25,704] [INFO] Camera configuration has been adjusted! +[2026-05-10 09:41:25,709] [INFO] Configuration successful! +[2026-05-10 09:41:25,746] [INFO] Starting picamera MJPEG stream... +[2026-05-10 09:41:25,798] [INFO] Camera started +[2026-05-10 09:41:25,834] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-10 09:41:25,834] [INFO] Updating ESI port settings +[2026-05-10 09:41:25,835] [INFO] Opening ESI connection to port None +[2026-05-10 09:41:25,850] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-10 09:41:25,851] [INFO] Creating serial.Serial instance... +[2026-05-10 09:41:25,852] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 09:41:25,853] [INFO] Testing communication to SangaBoard +[2026-05-10 09:41:25,853] [INFO] Running firmware checks... +[2026-05-10 09:41:25,859] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 09:41:25,861] [INFO] Success! +[2026-05-10 09:41:25,862] [INFO] Creating serial.Serial instance... +[2026-05-10 09:41:25,864] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 09:41:25,865] [INFO] Testing communication to SangaBoard +[2026-05-10 09:41:25,865] [INFO] Running firmware checks... +[2026-05-10 09:41:25,871] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 09:41:25,871] [INFO] Opened ESI connection to port None +[2026-05-10 09:41:25,872] [INFO] Checking valid firmware... +[2026-05-10 09:41:25,872] [INFO] Running firmware checks... +[2026-05-10 09:41:25,878] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 09:41:25,879] [INFO] Loading modules... +[2026-05-10 09:41:25,899] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-10 09:41:25,916] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-10 09:41:25,930] [INFO] Application startup complete. +[2026-05-10 09:41:25,962] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-10 19:04:51,989] [INFO] OFM server root logger has been set up at INFO level +[2026-05-10 19:04:52,867] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 19:04:52,868] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 19:04:52,868] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 19:04:54,389] [INFO] Started server process [513] +[2026-05-10 19:04:54,390] [INFO] Waiting for application startup. +[2026-05-10 19:04:54,435] [INFO] Creating new Picamera2 object +[2026-05-10 19:04:54,577] [INFO] Initialization successful. +[2026-05-10 19:04:54,578] [INFO] Camera now open. +[2026-05-10 19:04:54,591] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,596] [INFO] Configuration successful! +[2026-05-10 19:04:54,619] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,623] [INFO] Configuration successful! +[2026-05-10 19:04:54,647] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,650] [INFO] Configuration successful! +[2026-05-10 19:04:54,675] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,679] [INFO] Configuration successful! +[2026-05-10 19:04:54,722] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,725] [INFO] Configuration successful! +[2026-05-10 19:04:54,748] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,752] [INFO] Configuration successful! +[2026-05-10 19:04:54,774] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,777] [INFO] Configuration successful! +[2026-05-10 19:04:54,801] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,804] [INFO] Configuration successful! +[2026-05-10 19:04:54,843] [INFO] Camera configuration has been adjusted! +[2026-05-10 19:04:54,847] [INFO] Configuration successful! +[2026-05-10 19:04:54,883] [INFO] Starting picamera MJPEG stream... +[2026-05-10 19:04:54,933] [INFO] Camera started +[2026-05-10 19:04:54,966] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-10 19:04:54,967] [INFO] Updating ESI port settings +[2026-05-10 19:04:54,967] [INFO] Opening ESI connection to port None +[2026-05-10 19:04:54,983] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-10 19:04:54,984] [INFO] Creating serial.Serial instance... +[2026-05-10 19:04:54,985] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 19:04:54,986] [INFO] Testing communication to SangaBoard +[2026-05-10 19:04:54,986] [INFO] Running firmware checks... +[2026-05-10 19:04:54,992] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 19:04:54,994] [INFO] Success! +[2026-05-10 19:04:54,995] [INFO] Creating serial.Serial instance... +[2026-05-10 19:04:54,996] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 19:04:54,997] [INFO] Testing communication to SangaBoard +[2026-05-10 19:04:54,998] [INFO] Running firmware checks... +[2026-05-10 19:04:55,003] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 19:04:55,004] [INFO] Opened ESI connection to port None +[2026-05-10 19:04:55,005] [INFO] Checking valid firmware... +[2026-05-10 19:04:55,005] [INFO] Running firmware checks... +[2026-05-10 19:04:55,010] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 19:04:55,011] [INFO] Loading modules... +[2026-05-10 19:04:55,032] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-10 19:04:55,048] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-10 19:04:55,061] [INFO] Application startup complete. +[2026-05-10 19:04:55,091] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-10 20:36:48,802] [INFO] OFM server root logger has been set up at INFO level +[2026-05-10 20:36:49,681] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 20:36:49,682] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 20:36:49,683] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-10 20:36:51,199] [INFO] Started server process [517] +[2026-05-10 20:36:51,200] [INFO] Waiting for application startup. +[2026-05-10 20:36:51,244] [INFO] Creating new Picamera2 object +[2026-05-10 20:36:51,385] [INFO] Initialization successful. +[2026-05-10 20:36:51,386] [INFO] Camera now open. +[2026-05-10 20:36:51,400] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,404] [INFO] Configuration successful! +[2026-05-10 20:36:51,429] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,432] [INFO] Configuration successful! +[2026-05-10 20:36:51,457] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,461] [INFO] Configuration successful! +[2026-05-10 20:36:51,486] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,489] [INFO] Configuration successful! +[2026-05-10 20:36:51,533] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,536] [INFO] Configuration successful! +[2026-05-10 20:36:51,559] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,563] [INFO] Configuration successful! +[2026-05-10 20:36:51,585] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,588] [INFO] Configuration successful! +[2026-05-10 20:36:51,612] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,616] [INFO] Configuration successful! +[2026-05-10 20:36:51,656] [INFO] Camera configuration has been adjusted! +[2026-05-10 20:36:51,659] [INFO] Configuration successful! +[2026-05-10 20:36:51,696] [INFO] Starting picamera MJPEG stream... +[2026-05-10 20:36:51,753] [INFO] Camera started +[2026-05-10 20:36:51,786] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-10 20:36:51,787] [INFO] Updating ESI port settings +[2026-05-10 20:36:51,788] [INFO] Opening ESI connection to port None +[2026-05-10 20:36:51,803] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-10 20:36:51,804] [INFO] Creating serial.Serial instance... +[2026-05-10 20:36:51,805] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 20:36:51,806] [INFO] Testing communication to SangaBoard +[2026-05-10 20:36:51,806] [INFO] Running firmware checks... +[2026-05-10 20:36:51,812] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 20:36:51,814] [INFO] Success! +[2026-05-10 20:36:51,815] [INFO] Creating serial.Serial instance... +[2026-05-10 20:36:51,817] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-10 20:36:51,817] [INFO] Testing communication to SangaBoard +[2026-05-10 20:36:51,818] [INFO] Running firmware checks... +[2026-05-10 20:36:51,823] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 20:36:51,824] [INFO] Opened ESI connection to port None +[2026-05-10 20:36:51,825] [INFO] Checking valid firmware... +[2026-05-10 20:36:51,825] [INFO] Running firmware checks... +[2026-05-10 20:36:51,830] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-10 20:36:51,831] [INFO] Loading modules... +[2026-05-10 20:36:51,853] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-10 20:36:51,869] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-10 20:36:51,884] [INFO] Application startup complete. +[2026-05-10 20:36:51,914] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 +\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00[2026-05-11 11:51:47,189] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 11:51:48,064] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 11:51:48,065] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 11:51:48,065] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 11:51:49,582] [INFO] Started server process [516] +[2026-05-11 11:51:49,583] [INFO] Waiting for application startup. +[2026-05-11 11:51:49,627] [INFO] Creating new Picamera2 object +[2026-05-11 11:51:49,769] [INFO] Initialization successful. +[2026-05-11 11:51:49,770] [INFO] Camera now open. +[2026-05-11 11:51:49,783] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,788] [INFO] Configuration successful! +[2026-05-11 11:51:49,812] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,815] [INFO] Configuration successful! +[2026-05-11 11:51:49,839] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,842] [INFO] Configuration successful! +[2026-05-11 11:51:49,867] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,871] [INFO] Configuration successful! +[2026-05-11 11:51:49,914] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,917] [INFO] Configuration successful! +[2026-05-11 11:51:49,940] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,943] [INFO] Configuration successful! +[2026-05-11 11:51:49,965] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,968] [INFO] Configuration successful! +[2026-05-11 11:51:49,991] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:49,994] [INFO] Configuration successful! +[2026-05-11 11:51:50,033] [INFO] Camera configuration has been adjusted! +[2026-05-11 11:51:50,037] [INFO] Configuration successful! +[2026-05-11 11:51:50,071] [INFO] Starting picamera MJPEG stream... +[2026-05-11 11:51:50,121] [INFO] Camera started +[2026-05-11 11:51:50,154] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-11 11:51:50,155] [INFO] Updating ESI port settings +[2026-05-11 11:51:50,155] [INFO] Opening ESI connection to port None +[2026-05-11 11:51:50,171] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-11 11:51:50,172] [INFO] Creating serial.Serial instance... +[2026-05-11 11:51:50,173] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 11:51:50,174] [INFO] Testing communication to SangaBoard +[2026-05-11 11:51:50,174] [INFO] Running firmware checks... +[2026-05-11 11:51:50,180] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 11:51:50,182] [INFO] Success! +[2026-05-11 11:51:50,183] [INFO] Creating serial.Serial instance... +[2026-05-11 11:51:50,184] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 11:51:50,185] [INFO] Testing communication to SangaBoard +[2026-05-11 11:51:50,185] [INFO] Running firmware checks... +[2026-05-11 11:51:50,191] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 11:51:50,192] [INFO] Opened ESI connection to port None +[2026-05-11 11:51:50,192] [INFO] Checking valid firmware... +[2026-05-11 11:51:50,193] [INFO] Running firmware checks... +[2026-05-11 11:51:50,198] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 11:51:50,199] [INFO] Loading modules... +[2026-05-11 11:51:50,221] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-11 11:51:50,237] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-11 11:51:50,252] [INFO] Application startup complete. +[2026-05-11 11:51:50,281] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 12:34:52,169] [INFO] Shutting down +[2026-05-11 12:34:52,272] [INFO] Waiting for application shutdown. +[2026-05-11 12:34:52,291] [INFO] Camera stopped +[2026-05-11 12:34:53,069] [INFO] Stopped MJPEG stream. +[2026-05-11 12:34:53,501] [INFO] Camera closed successfully. +[2026-05-11 12:34:53,503] [INFO] Application shutdown complete. +[2026-05-11 12:34:53,504] [INFO] Finished server process [516] +[2026-05-11 12:36:06,454] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 12:36:07,304] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:36:07,305] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:36:07,306] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:36:08,621] [INFO] Started server process [927] +[2026-05-11 12:36:08,623] [INFO] Waiting for application startup. +[2026-05-11 12:36:08,625] [INFO] Application startup complete. +[2026-05-11 12:36:08,634] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 12:42:30,689] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 12:42:31,567] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:42:31,568] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:42:31,568] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 12:42:33,125] [INFO] Started server process [514] +[2026-05-11 12:42:33,127] [INFO] Waiting for application startup. +[2026-05-11 12:42:33,129] [INFO] Application startup complete. +[2026-05-11 12:42:33,141] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 14:56:29,541] [INFO] Shutting down +[2026-05-11 14:56:29,951] [INFO] Waiting for application shutdown. +[2026-05-11 14:56:30,079] [INFO] Application shutdown complete. +[2026-05-11 14:56:30,097] [INFO] Finished server process [514] +[2026-05-11 15:00:02,739] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 15:00:03,665] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:00:03,666] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:00:03,667] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:00:05,504] [INFO] Started server process [1144] +[2026-05-11 15:00:05,505] [INFO] Waiting for application startup. +[2026-05-11 15:00:05,552] [INFO] Creating new Picamera2 object +[2026-05-11 15:00:05,709] [INFO] Initialization successful. +[2026-05-11 15:00:05,710] [INFO] Camera now open. +[2026-05-11 15:00:05,723] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,729] [INFO] Configuration successful! +[2026-05-11 15:00:05,754] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,758] [INFO] Configuration successful! +[2026-05-11 15:00:05,782] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,785] [INFO] Configuration successful! +[2026-05-11 15:00:05,810] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,814] [INFO] Configuration successful! +[2026-05-11 15:00:05,867] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,872] [INFO] Configuration successful! +[2026-05-11 15:00:05,895] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,898] [INFO] Configuration successful! +[2026-05-11 15:00:05,921] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,924] [INFO] Configuration successful! +[2026-05-11 15:00:05,947] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,950] [INFO] Configuration successful! +[2026-05-11 15:00:05,990] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:00:05,994] [INFO] Configuration successful! +[2026-05-11 15:00:06,034] [INFO] Starting picamera MJPEG stream... +[2026-05-11 15:00:06,084] [INFO] Camera started +[2026-05-11 15:00:06,118] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-11 15:00:06,119] [INFO] Updating ESI port settings +[2026-05-11 15:00:06,119] [INFO] Opening ESI connection to port None +[2026-05-11 15:00:06,134] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-11 15:00:06,135] [INFO] Creating serial.Serial instance... +[2026-05-11 15:00:06,136] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:00:06,137] [INFO] Testing communication to SangaBoard +[2026-05-11 15:00:06,137] [INFO] Running firmware checks... +[2026-05-11 15:00:06,143] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:00:06,146] [INFO] Success! +[2026-05-11 15:00:06,147] [INFO] Creating serial.Serial instance... +[2026-05-11 15:00:06,149] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:00:06,150] [INFO] Testing communication to SangaBoard +[2026-05-11 15:00:06,150] [INFO] Running firmware checks... +[2026-05-11 15:00:06,155] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:00:06,156] [INFO] Opened ESI connection to port None +[2026-05-11 15:00:06,157] [INFO] Checking valid firmware... +[2026-05-11 15:00:06,157] [INFO] Running firmware checks... +[2026-05-11 15:00:06,163] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:00:06,164] [INFO] Loading modules... +[2026-05-11 15:00:06,185] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-11 15:00:06,202] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-11 15:00:06,216] [INFO] Application startup complete. +[2026-05-11 15:00:06,246] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 15:37:58,774] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,787] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,915] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,919] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,922] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,927] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,930] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,934] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,954] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,958] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,966] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,974] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,981] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:58,989] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,004] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,009] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,021] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,030] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,037] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,045] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,053] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,059] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,066] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,073] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,084] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,091] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,103] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,109] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,119] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,124] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,134] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,142] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,153] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,166] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,172] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,180] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,188] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,202] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,207] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,216] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,223] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,235] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,245] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,251] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,257] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,269] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,274] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,280] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,288] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,293] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,305] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,334] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,352] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,415] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,530] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,537] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,547] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,554] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,559] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,565] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,575] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,584] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,593] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,606] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,614] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,627] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,637] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,642] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,654] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,666] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,672] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,682] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,690] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,696] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,704] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,709] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,719] [WARNING] Invalid HTTP request received. +[2026-05-11 15:37:59,729] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,593] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,603] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,608] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,656] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,662] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:07,665] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:08,546] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:08,548] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:08,614] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:08,619] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,041] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,077] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,105] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,111] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,310] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,339] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,398] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,431] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,510] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,515] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,551] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:09,554] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,006] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,038] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,042] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,047] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,054] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,063] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,115] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,189] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,251] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,256] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,305] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,311] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,744] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,747] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,815] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,822] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,885] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,897] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:10,995] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:11,011] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,100] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,103] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,133] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,140] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,190] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,241] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,544] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,547] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,552] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,580] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,606] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:18,610] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,933] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,935] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,939] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,947] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,956] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:19,964] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,589] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,594] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,609] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,611] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,678] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:20,706] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,228] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,231] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,245] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,261] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,822] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,831] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,838] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,842] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,910] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:21,942] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,386] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,396] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,400] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,414] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,421] [WARNING] Invalid HTTP request received. +[2026-05-11 15:38:22,428] [WARNING] Invalid HTTP request received. +[2026-05-11 15:39:51,603] [INFO] Shutting down +[2026-05-11 15:39:51,712] [INFO] Waiting for application shutdown. +[2026-05-11 15:39:51,740] [INFO] Camera stopped +[2026-05-11 15:39:52,527] [INFO] Stopped MJPEG stream. +[2026-05-11 15:39:52,956] [INFO] Camera closed successfully. +[2026-05-11 15:39:52,959] [INFO] Application shutdown complete. +[2026-05-11 15:39:52,960] [INFO] Finished server process [1144] +[2026-05-11 15:40:13,086] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 15:40:14,007] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:40:14,008] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:40:14,008] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:40:15,706] [INFO] Started server process [1572] +[2026-05-11 15:40:15,707] [INFO] Waiting for application startup. +[2026-05-11 15:40:15,740] [INFO] Creating new Picamera2 object +[2026-05-11 15:40:15,809] [INFO] Initialization successful. +[2026-05-11 15:40:15,810] [INFO] Camera now open. +[2026-05-11 15:40:15,823] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,828] [INFO] Configuration successful! +[2026-05-11 15:40:15,846] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,849] [INFO] Configuration successful! +[2026-05-11 15:40:15,872] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,876] [INFO] Configuration successful! +[2026-05-11 15:40:15,900] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,904] [INFO] Configuration successful! +[2026-05-11 15:40:15,948] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,951] [INFO] Configuration successful! +[2026-05-11 15:40:15,974] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:15,977] [INFO] Configuration successful! +[2026-05-11 15:40:15,999] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:16,002] [INFO] Configuration successful! +[2026-05-11 15:40:16,025] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:16,028] [INFO] Configuration successful! +[2026-05-11 15:40:16,067] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:40:16,070] [INFO] Configuration successful! +[2026-05-11 15:40:16,110] [INFO] Starting picamera MJPEG stream... +[2026-05-11 15:40:16,158] [INFO] Camera started +[2026-05-11 15:40:16,194] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-11 15:40:16,196] [INFO] Updating ESI port settings +[2026-05-11 15:40:16,196] [INFO] Opening ESI connection to port None +[2026-05-11 15:40:16,225] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-11 15:40:16,226] [INFO] Creating serial.Serial instance... +[2026-05-11 15:40:16,229] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:40:16,230] [INFO] Testing communication to SangaBoard +[2026-05-11 15:40:16,230] [INFO] Running firmware checks... +[2026-05-11 15:40:16,237] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:40:16,243] [INFO] Success! +[2026-05-11 15:40:16,245] [INFO] Creating serial.Serial instance... +[2026-05-11 15:40:16,247] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:40:16,248] [INFO] Testing communication to SangaBoard +[2026-05-11 15:40:16,249] [INFO] Running firmware checks... +[2026-05-11 15:40:16,255] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:40:16,258] [INFO] Opened ESI connection to port None +[2026-05-11 15:40:16,259] [INFO] Checking valid firmware... +[2026-05-11 15:40:16,261] [INFO] Running firmware checks... +[2026-05-11 15:40:16,272] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:40:16,273] [INFO] Loading modules... +[2026-05-11 15:40:16,306] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-11 15:40:16,331] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-11 15:40:16,356] [INFO] Application startup complete. +[2026-05-11 15:40:16,397] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 15:40:32,784] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:32,788] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:32,801] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:32,810] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,028] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,042] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,101] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,115] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,494] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,497] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,511] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,518] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,769] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,785] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,878] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:33,895] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,070] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,079] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,089] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,107] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,361] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,376] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,462] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,474] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,572] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,575] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,595] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,600] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,777] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,794] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,875] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:34,889] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:35,850] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:35,854] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:35,865] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:35,870] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,028] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,044] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,115] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,130] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,919] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,921] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,934] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:36,941] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,085] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,096] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,180] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,194] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,460] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,465] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,481] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,483] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,639] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,650] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,693] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,705] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,753] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,756] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,771] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,781] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,884] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,895] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:37,998] [WARNING] Invalid HTTP request received. +[2026-05-11 15:40:38,011] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,594] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,611] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,760] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,770] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,776] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,781] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,786] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,790] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,801] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,814] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,821] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,827] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,838] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,847] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,852] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,859] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,865] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,871] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,876] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,886] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,893] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,904] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,910] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,917] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,922] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,937] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,947] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,958] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,965] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,972] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,981] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,991] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:50,996] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,006] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,013] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,020] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,026] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,032] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,040] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,060] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,090] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,097] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,104] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,123] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,137] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,145] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,152] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,162] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,169] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,176] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,187] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,196] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,221] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,273] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,403] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,409] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,429] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,433] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,437] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,442] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,467] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,473] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,478] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,489] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,495] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,503] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,510] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,520] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,529] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,553] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,576] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,582] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,590] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,604] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,609] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,617] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,627] [WARNING] Invalid HTTP request received. +[2026-05-11 15:49:51,635] [WARNING] Invalid HTTP request received. +[2026-05-11 15:54:23,597] [INFO] Shutting down +[2026-05-11 15:54:23,702] [INFO] Waiting for application shutdown. +[2026-05-11 15:54:23,747] [INFO] Camera stopped +[2026-05-11 15:54:24,555] [INFO] Stopped MJPEG stream. +[2026-05-11 15:54:25,164] [INFO] Camera closed successfully. +[2026-05-11 15:54:25,166] [INFO] Application shutdown complete. +[2026-05-11 15:54:25,168] [INFO] Finished server process [1572] +[2026-05-11 15:54:43,934] [INFO] OFM server root logger has been set up at INFO level +[2026-05-11 15:54:44,885] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:54:44,887] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:54:44,888] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-11 15:54:47,876] [INFO] Started server process [1754] +[2026-05-11 15:54:47,878] [INFO] Waiting for application startup. +[2026-05-11 15:54:47,939] [INFO] Creating new Picamera2 object +[2026-05-11 15:54:48,069] [INFO] Initialization successful. +[2026-05-11 15:54:48,071] [INFO] Camera now open. +[2026-05-11 15:54:48,095] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,105] [INFO] Configuration successful! +[2026-05-11 15:54:48,139] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,145] [INFO] Configuration successful! +[2026-05-11 15:54:48,176] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,179] [INFO] Configuration successful! +[2026-05-11 15:54:48,204] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,207] [INFO] Configuration successful! +[2026-05-11 15:54:48,251] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,254] [INFO] Configuration successful! +[2026-05-11 15:54:48,276] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,279] [INFO] Configuration successful! +[2026-05-11 15:54:48,301] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,304] [INFO] Configuration successful! +[2026-05-11 15:54:48,327] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,330] [INFO] Configuration successful! +[2026-05-11 15:54:48,376] [INFO] Camera configuration has been adjusted! +[2026-05-11 15:54:48,382] [INFO] Configuration successful! +[2026-05-11 15:54:48,446] [INFO] Starting picamera MJPEG stream... +[2026-05-11 15:54:48,526] [INFO] Camera started +[2026-05-11 15:54:48,581] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-11 15:54:48,582] [INFO] Updating ESI port settings +[2026-05-11 15:54:48,583] [INFO] Opening ESI connection to port None +[2026-05-11 15:54:48,611] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-11 15:54:48,612] [INFO] Creating serial.Serial instance... +[2026-05-11 15:54:48,615] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:54:48,616] [INFO] Testing communication to SangaBoard +[2026-05-11 15:54:48,617] [INFO] Running firmware checks... +[2026-05-11 15:54:48,623] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:54:48,629] [INFO] Success! +[2026-05-11 15:54:48,631] [INFO] Creating serial.Serial instance... +[2026-05-11 15:54:48,634] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-11 15:54:48,636] [INFO] Testing communication to SangaBoard +[2026-05-11 15:54:48,637] [INFO] Running firmware checks... +[2026-05-11 15:54:48,651] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:54:48,653] [INFO] Opened ESI connection to port None +[2026-05-11 15:54:48,657] [INFO] Checking valid firmware... +[2026-05-11 15:54:48,658] [INFO] Running firmware checks... +[2026-05-11 15:54:48,664] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-11 15:54:48,666] [INFO] Loading modules... +[2026-05-11 15:54:48,702] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-11 15:54:48,725] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-11 15:54:48,745] [INFO] Application startup complete. +[2026-05-11 15:54:48,803] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-11 15:55:09,405] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,421] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,563] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,566] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,570] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,577] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,585] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,594] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,603] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,620] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,625] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,635] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,649] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,658] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,667] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,679] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,688] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,697] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,705] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,714] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,721] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,729] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,738] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,749] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,755] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,759] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,772] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,785] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,793] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,802] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,813] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,822] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,827] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,834] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,850] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,859] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,866] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,871] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,879] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,887] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,895] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,903] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,917] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,928] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,935] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,944] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,954] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,964] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,972] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:09,983] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,003] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,014] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,019] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,025] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,240] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,251] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,258] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,264] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,270] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,275] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,284] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,296] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,306] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,315] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,320] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,329] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,335] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,378] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,394] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,404] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,413] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,422] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,427] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,433] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,448] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,453] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,458] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:10,464] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,606] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,615] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,622] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,642] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,920] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:21,959] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,013] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,025] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,303] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,310] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,326] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,355] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,578] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,591] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,650] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:22,674] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,584] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,588] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,633] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,638] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,909] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,976] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:23,994] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:24,046] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:24,910] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:24,914] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:24,923] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:24,943] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:25,328] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:25,369] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:25,416] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:25,443] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,386] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,391] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,419] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,423] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,766] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,782] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,857] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:26,886] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,018] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,048] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,053] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,060] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,313] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,377] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,415] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,451] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,454] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,493] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,498] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,564] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,713] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,728] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,818] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,856] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,955] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:27,986] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,007] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,013] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,202] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,217] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,281] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,299] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,318] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,321] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,336] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,381] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,708] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,715] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,725] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:28,742] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,046] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,050] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,075] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,082] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,249] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,272] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,350] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,386] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,389] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,412] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,418] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,425] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,538] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,553] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,616] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,622] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,629] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,644] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,655] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,661] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,953] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,957] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:29,961] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,006] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,015] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,018] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,043] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,056] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,134] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,188] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,230] [WARNING] Invalid HTTP request received. +[2026-05-11 15:55:30,258] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,248] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,251] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,279] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,281] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,632] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,648] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,711] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:03,741] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,373] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,377] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,386] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,414] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,648] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,674] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,713] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,743] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,747] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,750] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,757] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,763] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,914] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:04,944] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,039] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,071] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,077] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,084] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,105] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,145] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,280] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,285] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,289] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,361] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,366] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,382] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,513] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,516] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,563] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,566] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,571] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,576] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,737] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,740] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,749] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,907] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,912] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,914] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,944] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,948] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,967] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,972] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:05,984] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,099] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,105] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,113] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,140] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,145] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,153] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,378] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,384] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,391] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,395] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,403] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,413] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,422] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,427] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,502] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,508] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,519] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,763] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,766] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,775] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,780] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,790] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,794] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,807] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,814] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,919] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,942] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,946] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:06,953] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,048] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,052] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,054] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,060] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,076] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,079] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,291] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,298] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,306] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,317] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,323] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,335] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,387] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,410] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,571] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,608] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,646] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,650] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,667] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,682] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,690] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,703] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,790] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,826] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,845] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,880] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,883] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,894] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,918] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:07,934] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,095] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,102] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,106] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,124] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,127] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,134] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,189] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,246] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,280] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,310] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,374] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:08,400] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,106] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,110] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,114] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,120] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,125] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:10,143] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,263] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,272] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,365] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,553] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,558] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,562] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,602] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,605] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,617] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,627] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,780] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,783] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,802] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,962] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,968] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:12,997] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,006] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,010] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,176] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,191] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,200] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,261] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,344] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,347] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:13,372] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:14,442] [WARNING] Invalid HTTP request received. +[2026-05-11 15:56:14,473] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,079] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,096] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,182] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,185] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,189] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,191] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,195] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,200] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,206] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,219] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,223] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,230] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,238] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,248] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,254] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,264] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,280] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,288] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,295] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,308] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,319] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,331] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,341] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,351] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,357] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,363] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,372] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,379] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,387] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,394] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,403] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,414] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,422] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,432] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,438] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,451] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,456] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,464] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,474] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,484] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,490] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,499] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,510] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,524] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,532] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,541] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,551] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,557] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,565] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,573] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,606] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,614] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,632] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,679] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,787] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,795] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,799] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,805] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,815] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,821] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,827] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,840] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,848] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,853] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,860] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,866] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,874] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,887] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,901] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,908] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,916] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,922] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,929] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,942] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,952] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,961] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,970] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:06,984] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,882] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,887] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,891] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,928] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,932] [WARNING] Invalid HTTP request received. +[2026-05-11 20:18:14,953] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,553] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,571] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,700] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,707] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,713] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,724] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,728] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,737] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,750] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,757] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,762] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,772] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,782] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,788] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,793] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,798] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,804] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,811] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,825] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,835] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,839] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,851] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,861] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,869] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,879] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,887] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,893] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,902] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,911] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,924] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,932] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,939] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,955] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,961] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,970] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,981] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,988] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:18,997] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,004] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,011] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,022] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,030] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,037] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,043] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,054] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,059] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,067] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,075] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,087] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,092] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,126] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,130] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,249] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,282] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,416] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,421] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,430] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,435] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,445] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,454] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,467] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,472] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,475] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,486] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,493] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,499] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,509] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,524] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,532] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,541] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,554] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,565] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,583] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,596] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,606] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,619] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,630] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:19,636] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:33,786] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:33,800] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,053] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,065] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,077] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,083] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,089] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,093] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,100] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,106] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,117] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,121] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,127] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,137] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,143] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,150] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,156] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,163] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,170] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,185] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,192] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,200] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,207] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,220] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,225] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,233] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,239] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,249] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,257] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,267] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,274] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,277] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,290] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,301] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,310] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,316] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,324] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,339] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,348] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,353] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,366] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,374] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,380] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,387] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,401] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,408] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,413] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,428] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,439] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,446] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,452] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,460] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,557] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,587] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,706] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,714] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,722] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,727] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,734] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,745] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,752] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,757] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,761] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,768] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,778] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,787] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,796] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,805] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,823] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,834] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,840] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,852] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,858] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,865] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,875] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,893] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,901] [WARNING] Invalid HTTP request received. +[2026-05-12 04:26:34,907] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,388] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,406] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,581] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,583] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,588] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,598] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,610] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,615] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,619] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,658] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,661] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,674] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,680] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,686] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,690] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,703] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,710] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,720] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,737] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,751] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,754] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,761] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,766] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,774] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,779] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,793] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,795] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,811] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,817] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,830] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,834] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,870] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,881] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,889] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,902] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,908] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,912] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,961] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,969] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,980] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:40,988] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,004] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,009] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,025] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,035] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,067] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,076] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,091] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,100] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,113] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,119] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,136] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,185] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,196] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,434] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,441] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,445] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,452] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,455] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,458] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,493] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,506] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,509] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,513] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,521] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,525] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,600] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,611] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,615] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,619] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,626] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,632] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,666] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,685] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,694] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,701] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,707] [WARNING] Invalid HTTP request received. +[2026-05-12 04:27:41,713] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,761] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,772] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,906] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,910] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,915] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,918] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,921] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,934] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,946] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,953] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,959] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,965] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,971] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,978] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,986] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,992] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:19,999] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,004] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,019] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,025] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,037] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,045] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,054] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,060] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,068] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,074] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,085] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,090] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,101] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,109] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,117] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,128] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,139] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,147] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,157] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,162] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,170] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,177] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,190] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,198] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,208] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,213] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,223] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,230] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,239] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,255] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,262] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,270] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,281] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,290] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,325] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,367] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,393] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,449] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,568] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,572] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,574] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,578] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,582] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,588] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,605] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,610] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,617] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,624] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,633] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,642] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,654] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,661] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,669] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,676] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,689] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,700] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,707] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,724] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,731] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,738] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,746] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:20,757] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,661] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,665] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,668] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,699] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,703] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:28,733] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:39,155] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:39,159] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:39,226] [WARNING] Invalid HTTP request received. +[2026-05-12 04:29:39,228] [WARNING] Invalid HTTP request received. +[2026-05-12 07:29:41,301] [INFO] OFM server root logger has been set up at INFO level +[2026-05-12 07:29:42,245] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:29:42,246] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:29:42,247] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:29:44,284] [INFO] Started server process [511] +[2026-05-12 07:29:44,285] [INFO] Waiting for application startup. +[2026-05-12 07:29:44,330] [INFO] Creating new Picamera2 object +[2026-05-12 07:29:44,471] [INFO] Initialization successful. +[2026-05-12 07:29:44,472] [INFO] Camera now open. +[2026-05-12 07:29:44,485] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,490] [INFO] Configuration successful! +[2026-05-12 07:29:44,513] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,517] [INFO] Configuration successful! +[2026-05-12 07:29:44,541] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,544] [INFO] Configuration successful! +[2026-05-12 07:29:44,569] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,572] [INFO] Configuration successful! +[2026-05-12 07:29:44,616] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,619] [INFO] Configuration successful! +[2026-05-12 07:29:44,642] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,645] [INFO] Configuration successful! +[2026-05-12 07:29:44,667] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,671] [INFO] Configuration successful! +[2026-05-12 07:29:44,694] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,697] [INFO] Configuration successful! +[2026-05-12 07:29:44,737] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:29:44,740] [INFO] Configuration successful! +[2026-05-12 07:29:44,776] [INFO] Starting picamera MJPEG stream... +[2026-05-12 07:29:44,826] [INFO] Camera started +[2026-05-12 07:29:44,859] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-12 07:29:44,860] [INFO] Updating ESI port settings +[2026-05-12 07:29:44,860] [INFO] Opening ESI connection to port None +[2026-05-12 07:29:44,876] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-12 07:29:44,877] [INFO] Creating serial.Serial instance... +[2026-05-12 07:29:44,878] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 07:29:44,878] [INFO] Testing communication to SangaBoard +[2026-05-12 07:29:44,879] [INFO] Running firmware checks... +[2026-05-12 07:29:44,885] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:29:44,888] [INFO] Success! +[2026-05-12 07:29:44,889] [INFO] Creating serial.Serial instance... +[2026-05-12 07:29:44,890] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 07:29:44,891] [INFO] Testing communication to SangaBoard +[2026-05-12 07:29:44,891] [INFO] Running firmware checks... +[2026-05-12 07:29:44,897] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:29:44,898] [INFO] Opened ESI connection to port None +[2026-05-12 07:29:44,898] [INFO] Checking valid firmware... +[2026-05-12 07:29:44,898] [INFO] Running firmware checks... +[2026-05-12 07:29:44,904] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:29:44,905] [INFO] Loading modules... +[2026-05-12 07:29:44,926] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-12 07:29:44,943] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-12 07:29:44,959] [INFO] Application startup complete. +[2026-05-12 07:29:44,996] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-12 07:29:47,063] [WARNING] Invalid HTTP request received. +[2026-05-12 07:29:47,077] [WARNING] Invalid HTTP request received. +[2026-05-12 07:52:36,549] [INFO] Shutting down +[2026-05-12 07:52:36,657] [INFO] Waiting for application shutdown. +[2026-05-12 07:52:36,678] [INFO] Camera stopped +[2026-05-12 07:52:37,071] [INFO] Stopped MJPEG stream. +[2026-05-12 07:52:37,486] [INFO] Camera closed successfully. +[2026-05-12 07:52:37,488] [INFO] Application shutdown complete. +[2026-05-12 07:52:37,489] [INFO] Finished server process [511] +[2026-05-12 07:52:51,273] [INFO] OFM server root logger has been set up at INFO level +[2026-05-12 07:52:52,192] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:52:52,193] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:52:52,194] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 07:52:53,893] [INFO] Started server process [858] +[2026-05-12 07:52:53,895] [INFO] Waiting for application startup. +[2026-05-12 07:52:53,928] [INFO] Creating new Picamera2 object +[2026-05-12 07:52:53,997] [INFO] Initialization successful. +[2026-05-12 07:52:53,998] [INFO] Camera now open. +[2026-05-12 07:52:54,011] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,016] [INFO] Configuration successful! +[2026-05-12 07:52:54,036] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,040] [INFO] Configuration successful! +[2026-05-12 07:52:54,066] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,070] [INFO] Configuration successful! +[2026-05-12 07:52:54,094] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,098] [INFO] Configuration successful! +[2026-05-12 07:52:54,147] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,150] [INFO] Configuration successful! +[2026-05-12 07:52:54,173] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,177] [INFO] Configuration successful! +[2026-05-12 07:52:54,198] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,202] [INFO] Configuration successful! +[2026-05-12 07:52:54,224] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,228] [INFO] Configuration successful! +[2026-05-12 07:52:54,267] [INFO] Camera configuration has been adjusted! +[2026-05-12 07:52:54,271] [INFO] Configuration successful! +[2026-05-12 07:52:54,313] [INFO] Starting picamera MJPEG stream... +[2026-05-12 07:52:54,363] [INFO] Camera started +[2026-05-12 07:52:54,396] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-12 07:52:54,396] [INFO] Updating ESI port settings +[2026-05-12 07:52:54,397] [INFO] Opening ESI connection to port None +[2026-05-12 07:52:54,413] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-12 07:52:54,413] [INFO] Creating serial.Serial instance... +[2026-05-12 07:52:54,414] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 07:52:54,415] [INFO] Testing communication to SangaBoard +[2026-05-12 07:52:54,415] [INFO] Running firmware checks... +[2026-05-12 07:52:54,421] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:52:54,424] [INFO] Success! +[2026-05-12 07:52:54,425] [INFO] Creating serial.Serial instance... +[2026-05-12 07:52:54,426] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 07:52:54,427] [INFO] Testing communication to SangaBoard +[2026-05-12 07:52:54,427] [INFO] Running firmware checks... +[2026-05-12 07:52:54,432] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:52:54,433] [INFO] Opened ESI connection to port None +[2026-05-12 07:52:54,434] [INFO] Checking valid firmware... +[2026-05-12 07:52:54,434] [INFO] Running firmware checks... +[2026-05-12 07:52:54,439] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 07:52:54,440] [INFO] Loading modules... +[2026-05-12 07:52:54,459] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-12 07:52:54,477] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-12 07:52:54,492] [INFO] Application startup complete. +[2026-05-12 07:52:54,517] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-12 10:21:27,877] [WARNING] Invalid HTTP request received. +[2026-05-12 10:21:27,891] [WARNING] Invalid HTTP request received. +[2026-05-12 10:21:35,368] [WARNING] Invalid HTTP request received. +[2026-05-12 10:21:35,384] [WARNING] Invalid HTTP request received. +[2026-05-12 10:21:56,117] [WARNING] Invalid HTTP request received. +[2026-05-12 10:21:56,128] [WARNING] Invalid HTTP request received. +[2026-05-12 10:24:58,113] [INFO] Shutting down +[2026-05-12 10:24:58,214] [INFO] Waiting for application shutdown. +[2026-05-12 10:24:58,236] [INFO] Camera stopped +[2026-05-12 10:24:59,012] [INFO] Stopped MJPEG stream. +[2026-05-12 10:24:59,445] [INFO] Camera closed successfully. +[2026-05-12 10:24:59,446] [INFO] Application shutdown complete. +[2026-05-12 10:24:59,447] [INFO] Finished server process [858] +[2026-05-12 10:25:13,120] [INFO] OFM server root logger has been set up at INFO level +[2026-05-12 10:25:14,040] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 10:25:14,041] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 10:25:14,042] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-12 10:25:15,740] [INFO] Started server process [1068] +[2026-05-12 10:25:15,742] [INFO] Waiting for application startup. +[2026-05-12 10:25:15,776] [INFO] Creating new Picamera2 object +[2026-05-12 10:25:15,845] [INFO] Initialization successful. +[2026-05-12 10:25:15,846] [INFO] Camera now open. +[2026-05-12 10:25:15,859] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:15,865] [INFO] Configuration successful! +[2026-05-12 10:25:15,887] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:15,891] [INFO] Configuration successful! +[2026-05-12 10:25:15,924] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:15,928] [INFO] Configuration successful! +[2026-05-12 10:25:15,953] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:15,956] [INFO] Configuration successful! +[2026-05-12 10:25:16,015] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:16,019] [INFO] Configuration successful! +[2026-05-12 10:25:16,041] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:16,045] [INFO] Configuration successful! +[2026-05-12 10:25:16,066] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:16,070] [INFO] Configuration successful! +[2026-05-12 10:25:16,092] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:16,097] [INFO] Configuration successful! +[2026-05-12 10:25:16,136] [INFO] Camera configuration has been adjusted! +[2026-05-12 10:25:16,140] [INFO] Configuration successful! +[2026-05-12 10:25:16,182] [INFO] Starting picamera MJPEG stream... +[2026-05-12 10:25:16,228] [INFO] Camera started +[2026-05-12 10:25:16,260] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-12 10:25:16,261] [INFO] Updating ESI port settings +[2026-05-12 10:25:16,262] [INFO] Opening ESI connection to port None +[2026-05-12 10:25:16,278] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-12 10:25:16,278] [INFO] Creating serial.Serial instance... +[2026-05-12 10:25:16,280] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 10:25:16,280] [INFO] Testing communication to SangaBoard +[2026-05-12 10:25:16,281] [INFO] Running firmware checks... +[2026-05-12 10:25:16,287] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 10:25:16,290] [INFO] Success! +[2026-05-12 10:25:16,291] [INFO] Creating serial.Serial instance... +[2026-05-12 10:25:16,293] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-12 10:25:16,294] [INFO] Testing communication to SangaBoard +[2026-05-12 10:25:16,294] [INFO] Running firmware checks... +[2026-05-12 10:25:16,300] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 10:25:16,301] [INFO] Opened ESI connection to port None +[2026-05-12 10:25:16,302] [INFO] Checking valid firmware... +[2026-05-12 10:25:16,302] [INFO] Running firmware checks... +[2026-05-12 10:25:16,308] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-12 10:25:16,310] [INFO] Loading modules... +[2026-05-12 10:25:16,331] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-12 10:25:16,347] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-12 10:25:16,360] [INFO] Application startup complete. +[2026-05-12 10:25:16,398] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-12 11:01:38,150] [WARNING] Invalid HTTP request received. +[2026-05-12 11:01:38,162] [WARNING] Invalid HTTP request received. +[2026-05-12 11:01:41,457] [WARNING] Invalid HTTP request received. +[2026-05-12 11:01:41,465] [WARNING] Invalid HTTP request received. +[2026-05-12 11:02:11,211] [WARNING] Invalid HTTP request received. +[2026-05-12 11:02:11,230] [WARNING] Invalid HTTP request received. +[2026-05-13 00:58:18,095] [INFO] OFM server root logger has been set up at INFO level +[2026-05-13 00:58:19,034] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-13 00:58:19,035] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-13 00:58:19,036] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-13 19:20:16,790] [INFO] Started server process [518] +[2026-05-13 19:20:16,791] [INFO] Waiting for application startup. +[2026-05-13 19:20:16,835] [INFO] Creating new Picamera2 object +[2026-05-13 19:20:16,997] [INFO] Initialization successful. +[2026-05-13 19:20:16,998] [INFO] Camera now open. +[2026-05-13 19:20:17,011] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,016] [INFO] Configuration successful! +[2026-05-13 19:20:17,040] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,044] [INFO] Configuration successful! +[2026-05-13 19:20:17,068] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,071] [INFO] Configuration successful! +[2026-05-13 19:20:17,096] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,100] [INFO] Configuration successful! +[2026-05-13 19:20:17,143] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,146] [INFO] Configuration successful! +[2026-05-13 19:20:17,169] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,172] [INFO] Configuration successful! +[2026-05-13 19:20:17,194] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,198] [INFO] Configuration successful! +[2026-05-13 19:20:17,221] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,224] [INFO] Configuration successful! +[2026-05-13 19:20:17,263] [INFO] Camera configuration has been adjusted! +[2026-05-13 19:20:17,267] [INFO] Configuration successful! +[2026-05-13 19:20:17,302] [INFO] Starting picamera MJPEG stream... +[2026-05-13 19:20:17,351] [INFO] Camera started +[2026-05-13 19:20:17,384] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-13 19:20:17,385] [INFO] Updating ESI port settings +[2026-05-13 19:20:17,386] [INFO] Opening ESI connection to port None +[2026-05-13 19:20:17,404] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-13 19:20:17,405] [INFO] Creating serial.Serial instance... +[2026-05-13 19:20:17,406] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-13 19:20:17,407] [INFO] Testing communication to SangaBoard +[2026-05-13 19:20:17,407] [INFO] Running firmware checks... +[2026-05-13 19:20:17,413] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-13 19:20:17,416] [INFO] Success! +[2026-05-13 19:20:17,417] [INFO] Creating serial.Serial instance... +[2026-05-13 19:20:17,418] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-13 19:20:17,419] [INFO] Testing communication to SangaBoard +[2026-05-13 19:20:17,419] [INFO] Running firmware checks... +[2026-05-13 19:20:17,425] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-13 19:20:17,426] [INFO] Opened ESI connection to port None +[2026-05-13 19:20:17,426] [INFO] Checking valid firmware... +[2026-05-13 19:20:17,426] [INFO] Running firmware checks... +[2026-05-13 19:20:17,432] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-13 19:20:17,433] [INFO] Loading modules... +[2026-05-13 19:20:17,453] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-13 19:20:17,469] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-13 19:20:17,484] [INFO] Application startup complete. +[2026-05-13 19:20:17,520] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-13 19:22:39,006] [WARNING] Invalid HTTP request received. +[2026-05-13 19:22:39,022] [WARNING] Invalid HTTP request received. +[2026-05-13 19:22:44,400] [WARNING] Invalid HTTP request received. +[2026-05-13 19:22:44,413] [WARNING] Invalid HTTP request received. +[2026-05-14 03:52:23,711] [INFO] OFM server root logger has been set up at INFO level +[2026-05-14 05:47:41,886] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:47:41,887] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:47:41,888] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:47:43,816] [INFO] Started server process [513] +[2026-05-14 05:47:43,817] [INFO] Waiting for application startup. +[2026-05-14 05:47:43,861] [INFO] Creating new Picamera2 object +[2026-05-14 05:47:44,002] [INFO] Initialization successful. +[2026-05-14 05:47:44,003] [INFO] Camera now open. +[2026-05-14 05:47:44,016] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,022] [INFO] Configuration successful! +[2026-05-14 05:47:44,046] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,050] [INFO] Configuration successful! +[2026-05-14 05:47:44,074] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,078] [INFO] Configuration successful! +[2026-05-14 05:47:44,103] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,107] [INFO] Configuration successful! +[2026-05-14 05:47:44,150] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,154] [INFO] Configuration successful! +[2026-05-14 05:47:44,177] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,180] [INFO] Configuration successful! +[2026-05-14 05:47:44,202] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,205] [INFO] Configuration successful! +[2026-05-14 05:47:44,228] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,232] [INFO] Configuration successful! +[2026-05-14 05:47:44,271] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:47:44,275] [INFO] Configuration successful! +[2026-05-14 05:47:44,312] [INFO] Starting picamera MJPEG stream... +[2026-05-14 05:47:44,362] [INFO] Camera started +[2026-05-14 05:47:44,396] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-14 05:47:44,397] [INFO] Updating ESI port settings +[2026-05-14 05:47:44,398] [INFO] Opening ESI connection to port None +[2026-05-14 05:47:44,413] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-14 05:47:44,414] [INFO] Creating serial.Serial instance... +[2026-05-14 05:47:44,415] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 05:47:44,416] [INFO] Testing communication to SangaBoard +[2026-05-14 05:47:44,416] [INFO] Running firmware checks... +[2026-05-14 05:47:44,422] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:47:44,425] [INFO] Success! +[2026-05-14 05:47:44,426] [INFO] Creating serial.Serial instance... +[2026-05-14 05:47:44,427] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 05:47:44,428] [INFO] Testing communication to SangaBoard +[2026-05-14 05:47:44,429] [INFO] Running firmware checks... +[2026-05-14 05:47:44,434] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:47:44,435] [INFO] Opened ESI connection to port None +[2026-05-14 05:47:44,435] [INFO] Checking valid firmware... +[2026-05-14 05:47:44,436] [INFO] Running firmware checks... +[2026-05-14 05:47:44,441] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:47:44,442] [INFO] Loading modules... +[2026-05-14 05:47:44,463] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-14 05:47:44,478] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-14 05:47:44,494] [INFO] Application startup complete. +[2026-05-14 05:47:44,525] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-14 05:48:18,045] [INFO] Shutting down +[2026-05-14 05:48:18,150] [INFO] Waiting for application shutdown. +[2026-05-14 05:48:18,174] [INFO] Camera stopped +[2026-05-14 05:48:18,571] [INFO] Stopped MJPEG stream. +[2026-05-14 05:48:18,990] [INFO] Camera closed successfully. +[2026-05-14 05:48:18,993] [INFO] Application shutdown complete. +[2026-05-14 05:48:18,995] [INFO] Finished server process [513] +[2026-05-14 05:48:32,801] [INFO] OFM server root logger has been set up at INFO level +[2026-05-14 05:48:33,717] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:48:33,718] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:48:33,719] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 05:48:35,414] [INFO] Started server process [833] +[2026-05-14 05:48:35,415] [INFO] Waiting for application startup. +[2026-05-14 05:48:35,450] [INFO] Creating new Picamera2 object +[2026-05-14 05:48:35,520] [INFO] Initialization successful. +[2026-05-14 05:48:35,521] [INFO] Camera now open. +[2026-05-14 05:48:35,534] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,540] [INFO] Configuration successful! +[2026-05-14 05:48:35,559] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,563] [INFO] Configuration successful! +[2026-05-14 05:48:35,588] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,591] [INFO] Configuration successful! +[2026-05-14 05:48:35,616] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,620] [INFO] Configuration successful! +[2026-05-14 05:48:35,666] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,669] [INFO] Configuration successful! +[2026-05-14 05:48:35,692] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,696] [INFO] Configuration successful! +[2026-05-14 05:48:35,717] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,721] [INFO] Configuration successful! +[2026-05-14 05:48:35,744] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,747] [INFO] Configuration successful! +[2026-05-14 05:48:35,787] [INFO] Camera configuration has been adjusted! +[2026-05-14 05:48:35,790] [INFO] Configuration successful! +[2026-05-14 05:48:35,829] [INFO] Starting picamera MJPEG stream... +[2026-05-14 05:48:35,881] [INFO] Camera started +[2026-05-14 05:48:35,913] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-14 05:48:35,914] [INFO] Updating ESI port settings +[2026-05-14 05:48:35,914] [INFO] Opening ESI connection to port None +[2026-05-14 05:48:35,931] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-14 05:48:35,931] [INFO] Creating serial.Serial instance... +[2026-05-14 05:48:35,933] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 05:48:35,933] [INFO] Testing communication to SangaBoard +[2026-05-14 05:48:35,933] [INFO] Running firmware checks... +[2026-05-14 05:48:35,939] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:48:35,942] [INFO] Success! +[2026-05-14 05:48:35,943] [INFO] Creating serial.Serial instance... +[2026-05-14 05:48:35,944] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 05:48:35,945] [INFO] Testing communication to SangaBoard +[2026-05-14 05:48:35,946] [INFO] Running firmware checks... +[2026-05-14 05:48:35,951] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:48:35,952] [INFO] Opened ESI connection to port None +[2026-05-14 05:48:35,953] [INFO] Checking valid firmware... +[2026-05-14 05:48:35,953] [INFO] Running firmware checks... +[2026-05-14 05:48:35,958] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 05:48:35,959] [INFO] Loading modules... +[2026-05-14 05:48:35,982] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-14 05:48:36,001] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-14 05:48:36,014] [INFO] Application startup complete. +[2026-05-14 05:48:36,047] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-14 05:53:22,005] [WARNING] Invalid HTTP request received. +[2026-05-14 05:53:22,022] [WARNING] Invalid HTTP request received. +[2026-05-14 05:58:33,720] [WARNING] Invalid HTTP request received. +[2026-05-14 05:58:33,914] [WARNING] Invalid HTTP request received. +[2026-05-14 06:17:41,504] [WARNING] Invalid HTTP request received. +[2026-05-14 06:17:41,602] [WARNING] Invalid HTTP request received. +[2026-05-14 08:20:10,419] [ERROR] Error in stream: the ith frame has been overwritten, stream stopped +Traceback (most recent call last): + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 291, in frame_async_generator + async with self.buffer_for_reading(i) as frame: + File "/usr/lib/python3.11/contextlib.py", line 204, in __aenter__ + return await anext(self.gen) + ^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 227, in buffer_for_reading + entry = await self.ringbuffer_entry(i) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 203, in ringbuffer_entry + raise ValueError("the ith frame has been overwritten") +ValueError: the ith frame has been overwritten +[2026-05-14 08:20:12,365] [ERROR] Error in stream: the ith frame has been overwritten, stream stopped +Traceback (most recent call last): + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 291, in frame_async_generator + async with self.buffer_for_reading(i) as frame: + File "/usr/lib/python3.11/contextlib.py", line 204, in __aenter__ + return await anext(self.gen) + ^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 227, in buffer_for_reading + entry = await self.ringbuffer_entry(i) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/labthings_fastapi/outputs/mjpeg_stream.py", line 203, in ringbuffer_entry + raise ValueError("the ith frame has been overwritten") +ValueError: the ith frame has been overwritten +[2026-05-14 08:45:44,927] [INFO] Shutting down +[2026-05-14 08:45:45,091] [INFO] Waiting for application shutdown. +[2026-05-14 08:45:45,440] [INFO] Camera stopped +[2026-05-14 08:45:46,392] [INFO] Stopped MJPEG stream. +[2026-05-14 08:45:47,320] [INFO] Camera closed successfully. +[2026-05-14 08:45:47,346] [INFO] Application shutdown complete. +[2026-05-14 08:45:47,367] [INFO] Finished server process [833] +[2026-05-14 08:46:12,808] [INFO] OFM server root logger has been set up at INFO level +[2026-05-14 08:46:13,732] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 08:46:13,733] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 08:46:13,734] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 08:46:15,580] [INFO] Started server process [1419] +[2026-05-14 08:46:15,581] [INFO] Waiting for application startup. +[2026-05-14 08:46:15,624] [INFO] Creating new Picamera2 object +[2026-05-14 08:46:15,763] [INFO] Initialization successful. +[2026-05-14 08:46:15,764] [INFO] Camera now open. +[2026-05-14 08:46:15,777] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,783] [INFO] Configuration successful! +[2026-05-14 08:46:15,806] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,810] [INFO] Configuration successful! +[2026-05-14 08:46:15,838] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,842] [INFO] Configuration successful! +[2026-05-14 08:46:15,867] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,870] [INFO] Configuration successful! +[2026-05-14 08:46:15,924] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,928] [INFO] Configuration successful! +[2026-05-14 08:46:15,950] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,953] [INFO] Configuration successful! +[2026-05-14 08:46:15,975] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:15,979] [INFO] Configuration successful! +[2026-05-14 08:46:16,001] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:16,004] [INFO] Configuration successful! +[2026-05-14 08:46:16,043] [INFO] Camera configuration has been adjusted! +[2026-05-14 08:46:16,047] [INFO] Configuration successful! +[2026-05-14 08:46:16,090] [INFO] Starting picamera MJPEG stream... +[2026-05-14 08:46:16,146] [INFO] Camera started +[2026-05-14 08:46:16,179] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-14 08:46:16,180] [INFO] Updating ESI port settings +[2026-05-14 08:46:16,180] [INFO] Opening ESI connection to port None +[2026-05-14 08:46:16,197] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-14 08:46:16,197] [INFO] Creating serial.Serial instance... +[2026-05-14 08:46:16,199] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 08:46:16,199] [INFO] Testing communication to SangaBoard +[2026-05-14 08:46:16,200] [INFO] Running firmware checks... +[2026-05-14 08:46:16,205] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 08:46:16,208] [INFO] Success! +[2026-05-14 08:46:16,209] [INFO] Creating serial.Serial instance... +[2026-05-14 08:46:16,211] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 08:46:16,211] [INFO] Testing communication to SangaBoard +[2026-05-14 08:46:16,212] [INFO] Running firmware checks... +[2026-05-14 08:46:16,217] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 08:46:16,218] [INFO] Opened ESI connection to port None +[2026-05-14 08:46:16,219] [INFO] Checking valid firmware... +[2026-05-14 08:46:16,219] [INFO] Running firmware checks... +[2026-05-14 08:46:16,224] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 08:46:16,225] [INFO] Loading modules... +[2026-05-14 08:46:16,250] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-14 08:46:16,269] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-14 08:46:16,287] [INFO] Application startup complete. +[2026-05-14 08:46:16,334] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) +[2026-05-14 13:58:09,781] [WARNING] Invalid HTTP request received. +[2026-05-14 13:58:09,803] [WARNING] Invalid HTTP request received. +[2026-05-14 14:03:05,831] [WARNING] Invalid HTTP request received. +[2026-05-14 14:03:05,847] [WARNING] Invalid HTTP request received. +[2026-05-14 14:03:11,069] [WARNING] Invalid HTTP request received. +[2026-05-14 14:03:11,084] [WARNING] Invalid HTTP request received. +[2026-05-14 14:12:12,059] [INFO] Shutting down +[2026-05-14 14:12:12,166] [INFO] Waiting for connections to close. (CTRL+C to force quit) +[2026-05-14 14:12:14,165] [ERROR] Cancel 1 running task(s), timeout graceful shutdown exceeded +[2026-05-14 14:12:14,168] [INFO] Waiting for application shutdown. +[2026-05-14 14:12:14,177] [ERROR] Exception in ASGI application +Traceback (most recent call last): + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/fastapi/applications.py", line 1159, in __call__ + await super().__call__(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/applications.py", line 107, in __call__ + await self.middleware_stack(scope, receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 192, in __call__ + async with anyio.create_task_group() as task_group: + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__ + raise exc_val + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 194, in __call__ + await response(scope, wrapped_receive, send) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/base.py", line 238, in __call__ + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py", line 161, in _send + await send(message) + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 454, in send + await self.flow.drain() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/var/openflexure/application/openflexure-microscope-server/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/flow_control.py", line 19, in drain + await self._is_writable_event.wait() # pragma: full coverage + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/lib/python3.11/asyncio/locks.py", line 213, in wait + await fut +asyncio.exceptions.CancelledError: Task cancelled, timeout graceful shutdown exceeded +[2026-05-14 14:12:14,370] [INFO] Camera stopped +[2026-05-14 14:12:14,422] [INFO] Stopped MJPEG stream. +[2026-05-14 14:12:14,986] [INFO] Camera closed successfully. +[2026-05-14 14:12:14,988] [INFO] Application shutdown complete. +[2026-05-14 14:12:14,990] [INFO] Finished server process [1419] +[2026-05-14 14:12:30,543] [INFO] OFM server root logger has been set up at INFO level +[2026-05-14 14:12:31,469] [WARNING] An extra key stack_dz was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 14:12:31,470] [WARNING] An extra key stack_images_to_save was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 14:12:31,471] [WARNING] An extra key stack_min_images_to_test was found in the settings file. It will be deleted the next time settings are saved. +[2026-05-14 14:12:33,243] [INFO] Started server process [3204] +[2026-05-14 14:12:33,245] [INFO] Waiting for application startup. +[2026-05-14 14:12:33,295] [INFO] Creating new Picamera2 object +[2026-05-14 14:12:33,370] [INFO] Initialization successful. +[2026-05-14 14:12:33,372] [INFO] Camera now open. +[2026-05-14 14:12:33,385] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,389] [INFO] Configuration successful! +[2026-05-14 14:12:33,406] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,409] [INFO] Configuration successful! +[2026-05-14 14:12:33,434] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,438] [INFO] Configuration successful! +[2026-05-14 14:12:33,462] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,465] [INFO] Configuration successful! +[2026-05-14 14:12:33,520] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,524] [INFO] Configuration successful! +[2026-05-14 14:12:33,546] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,549] [INFO] Configuration successful! +[2026-05-14 14:12:33,570] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,573] [INFO] Configuration successful! +[2026-05-14 14:12:33,596] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,600] [INFO] Configuration successful! +[2026-05-14 14:12:33,638] [INFO] Camera configuration has been adjusted! +[2026-05-14 14:12:33,642] [INFO] Configuration successful! +[2026-05-14 14:12:33,687] [INFO] Starting picamera MJPEG stream... +[2026-05-14 14:12:33,734] [INFO] Camera started +[2026-05-14 14:12:33,764] [INFO] Initialising ExtensibleSerialInstrument on port None +[2026-05-14 14:12:33,765] [INFO] Updating ESI port settings +[2026-05-14 14:12:33,765] [INFO] Opening ESI connection to port None +[2026-05-14 14:12:33,781] [INFO] Trying port /dev/ttyAMA0 with settings {'baudrate': 115200, 'bytesize': 8, 'parity': 'N', 'stopbits': 1} +[2026-05-14 14:12:33,781] [INFO] Creating serial.Serial instance... +[2026-05-14 14:12:33,782] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 14:12:33,783] [INFO] Testing communication to SangaBoard +[2026-05-14 14:12:33,783] [INFO] Running firmware checks... +[2026-05-14 14:12:33,789] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 14:12:33,792] [INFO] Success! +[2026-05-14 14:12:33,793] [INFO] Creating serial.Serial instance... +[2026-05-14 14:12:33,794] [INFO] Created Serial(port='/dev/ttyAMA0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False) +[2026-05-14 14:12:33,794] [INFO] Testing communication to SangaBoard +[2026-05-14 14:12:33,795] [INFO] Running firmware checks... +[2026-05-14 14:12:33,800] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 14:12:33,801] [INFO] Opened ESI connection to port None +[2026-05-14 14:12:33,802] [INFO] Checking valid firmware... +[2026-05-14 14:12:33,802] [INFO] Running firmware checks... +[2026-05-14 14:12:33,807] [INFO] Firmware response: Sangaboard Firmware v1.0.1 +[2026-05-14 14:12:33,808] [INFO] Loading modules... +[2026-05-14 14:12:33,830] [INFO] Enabling backwards-compatible behaviour on new Sangaboard firmware +[2026-05-14 14:12:33,845] [WARNING] Sangaboard firmware version 1.0.1 is below the recommended 1.0.4. Visit https://openflexure.miraheze.org/wiki/Sangaboard for instructions on updating. +[2026-05-14 14:12:33,861] [INFO] Application startup complete. +[2026-05-14 14:12:33,900] [INFO] Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit) \ No newline at end of file diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 5d5e79fc..e7934c1a 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -1,4 +1,4 @@ -import { mount } from "@vue/test-utils"; +import { shallowMount, flushPromises } from "@vue/test-utils"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { createTestingPinia } from "@pinia/testing"; import axios from "axios"; @@ -9,7 +9,9 @@ vi.mock("axios"); // Mock VueUse to prevent IntersectionObserver crashes in JSDOM vi.mock("@vueuse/core", () => ({ - useIntersectionObserver: vi.fn(), + useIntersectionObserver: vi.fn(() => ({ + stop: vi.fn(), + })), })); describe("LoggingContent.vue", () => { @@ -18,7 +20,7 @@ describe("LoggingContent.vue", () => { // A sample log string matching backend's format const mockLogData = `[2026-05-14 08:46:12,808] [INFO] OFM server root logger has been set up at INFO level`; - beforeEach(() => { + beforeEach(async () => { // Reset mocks before each test vi.clearAllMocks(); @@ -26,7 +28,8 @@ describe("LoggingContent.vue", () => { axios.get.mockResolvedValue({ data: mockLogData }); // Mount the component with a fake Pinia store - wrapper = mount(LoggingContent, { + wrapper = shallowMount(LoggingContent, { + attachTo: document.body, global: { plugins: [ createTestingPinia({ @@ -37,9 +40,15 @@ describe("LoggingContent.vue", () => { }), ], // Simplify child components - stubs: ["PaginateLinks", "EndpointButton"], + stubs: { + PaginateLinks: true, + EndpointButton: true, + transition: false, + teleport: true, + }, }, }); + await flushPromises(); }); // Render check @@ -51,6 +60,7 @@ describe("LoggingContent.vue", () => { it("fetches logs and parses them correctly when updateLogs is called", async () => { // Trigger the method await wrapper.vm.updateLogs(); + await flushPromises(); // Verify Axios was called with the correct URI from the Pinia store expect(axios.get).toHaveBeenCalledWith("http://microscope.local:5000/api/v3/log/"); diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index 255ea48f..b1dd132c 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -5,18 +5,33 @@ import { defineConfig } from "vitest/config"; import vue from "@vitejs/plugin-vue"; import path from "path"; +console.log("\n\n::: Reading vitest config.") + export default defineConfig({ - plugins: [vue()], + plugins: [vue({ + template: { + compilerOptions: { + hoistStatic: false, + }, + }, + })], test: { environment: "jsdom", globals: true, + + server: { + deps: { + inline: ["vue", "@vue/test-utils", "pinia", "@pinia/testing"], + }, + }, }, resolve: { alias: { "@": path.resolve(__dirname, "./src"), + "vue": path.resolve(__dirname, "./node_modules/vue"), }, }, }); From 9968978a7b9e1925baabe52a67dea312c8bd1b3a Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 22:07:38 -0600 Subject: [PATCH 06/23] ui_migration feature(unitesting) modifying vitest config and spec, add test id flags to component --- .../tabContentComponents/loggingContent.vue | 2 + webapp/src/tests/unit/LoggingContent.spec.js | 106 ++++++++++++++---- webapp/vitest.config.js | 10 +- 3 files changed, 90 insertions(+), 28 deletions(-) diff --git a/webapp/src/components/tabContentComponents/loggingContent.vue b/webapp/src/components/tabContentComponents/loggingContent.vue index 1802aa8d..f621a734 100644 --- a/webapp/src/components/tabContentComponents/loggingContent.vue +++ b/webapp/src/components/tabContentComponents/loggingContent.vue @@ -17,6 +17,7 @@ class="uk-button uk-button-default uk-width-1-1" type="button" @click="updateLogs()" + data-test-id="update-btn" > Refresh Logs @@ -27,6 +28,7 @@ :url="logFileURI" button-label="Download Log File" :button-primary="false" + data-test-id="download-btn" /> diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index e7934c1a..93a7aedc 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -2,24 +2,40 @@ import { shallowMount, flushPromises } from "@vue/test-utils"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { createTestingPinia } from "@pinia/testing"; import axios from "axios"; +import fs from "fs"; +import path from "path"; import LoggingContent from "../../components/tabContentComponents/loggingContent.vue"; // Mock Axios -vi.mock("axios"); +vi.mock("axios", () => { + return { + default: { + get: vi.fn(), + post: vi.fn(), + put: vi.fn(), + delete: vi.fn(), + patch: vi.fn(), + }, + }; +}); // Mock VueUse to prevent IntersectionObserver crashes in JSDOM +// This will be removed once vue-route is implemented vi.mock("@vueuse/core", () => ({ useIntersectionObserver: vi.fn(() => ({ stop: vi.fn(), })), })); -describe("LoggingContent.vue", () => { +// Test Description +describe("Test LoggingContent.vue", () => { let wrapper; - // A sample log string matching backend's format - const mockLogData = `[2026-05-14 08:46:12,808] [INFO] OFM server root logger has been set up at INFO level`; + // Define path to a real log file and read it + const logFilePath = path.resolve(__dirname, "../fixtures/realLog.txt"); + const mockLogData = fs.readFileSync(logFilePath, "utf-8"); + // Things to do before each test beforeEach(async () => { // Reset mocks before each test vi.clearAllMocks(); @@ -41,22 +57,32 @@ describe("LoggingContent.vue", () => { ], // Simplify child components stubs: { - PaginateLinks: true, - EndpointButton: true, - transition: false, - teleport: true, - }, + PaginateLinks: true, + EndpointButton: true, + transition: true, + teleport: true, + settings: true, + }, }, }); - await flushPromises(); + // flush so we avoid leaving uncompleted processes running on background + await flushPromises(); }); - // Render check - it("renders the component correctly", () => { + // Tear down wrapper, unmount testing component + afterEach(() => { + wrapper.unmount(); + }); + + // Test 1: Render check, if things do exist in the page as intended + it("renders the component correctly", async () => { + // Check if component is been loaded and it is rendered expect(wrapper.exists()).toBe(true); + // Check if navbar exists expect(wrapper.find(".logging-navbar").exists()).toBe(true); }); + // Test 2: Check log parsing to see if specific INFO exists it("fetches logs and parses them correctly when updateLogs is called", async () => { // Trigger the method await wrapper.vm.updateLogs(); @@ -65,28 +91,60 @@ describe("LoggingContent.vue", () => { // Verify Axios was called with the correct URI from the Pinia store expect(axios.get).toHaveBeenCalledWith("http://microscope.local:5000/api/v3/log/"); - // Verify the logs array was populated and reversed (newest first) - expect(wrapper.vm.logs.length).toBe(1); + // Verify the logs have correct file length + // Helps validate formatting, etc + expect(wrapper.vm.logs.length).toBe(5491); - // Check if the most recent log (ERROR) is first due to .reverse() + // Check the most recent log expect(wrapper.vm.logs[0].level).toBe("INFO"); - // Check if the multi-line traceback was appended correctly to the ERROR log - expect(wrapper.vm.logs[0].message).toContain("OFM"); - expect(wrapper.vm.logs[0].summary).toContain("server"); + // Check if the multi-line file has real first connection information + expect(wrapper.vm.logs[0].message).toContain("uvicorn"); + expect(wrapper.vm.logs[0].summary).toContain("http://0.0.0.0:5000"); }); + // Test 3: Filter logging file information it("filters logs based on the selected level", async () => { await wrapper.vm.updateLogs(); - // Set filter to ERROR (should only show ERROR and CRITICAL) - wrapper.vm.filterLevel = "INFO"; - - // wait for Vue reactivity to update computed properties + // Set filter to WARNING wait and compare expected length + wrapper.vm.filterLevel = "WARNING"; await wrapper.vm.$nextTick(); + expect(wrapper.vm.filteredItems.length).toBe(1449); + expect(wrapper.vm.filteredItems[0].level).toBe("WARNING"); - // Only the 1 ERROR log should remain in filteredItems - expect(wrapper.vm.filteredItems.length).toBe(1); + // Set filter to INFO wait and compare expected length + wrapper.vm.filterLevel = "INFO"; + await wrapper.vm.$nextTick(); + expect(wrapper.vm.filteredItems.length).toBe(5491); expect(wrapper.vm.filteredItems[0].level).toBe("INFO"); + + // Set filter to ERROR wait and compare expected length + wrapper.vm.filterLevel = "ERROR"; + await wrapper.vm.$nextTick(); + expect(wrapper.vm.filteredItems.length).toBe(7); + expect(wrapper.vm.filteredItems[0].level).toBe("ERROR"); + }); + + // Test 4: Click buttons + // This required the component file to be modified by adding data-test-id flags. + // flags are needed as classes and text content may change by translation or style change. + it("click buttons", async () => { + // Click download button + const downloadButton = wrapper.find('[data-test-id="download-btn"]'); + expect(downloadButton.exists()).toBe(true); + await downloadButton.trigger("click"); + + // Click update button + const updateButton = wrapper.find('[data-test-id="update-btn"]'); + expect(updateButton.exists()).toBe(true); + await updateButton.trigger("click"); + }); + + // Test 5: Compare downloaded file to fixture file. + // Test 6: WIP + + afterAll(async () => { + await new Promise((resolve) => setTimeout(resolve, 15)); }); }); diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index b1dd132c..372ea36b 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -5,16 +5,18 @@ import { defineConfig } from "vitest/config"; import vue from "@vitejs/plugin-vue"; import path from "path"; -console.log("\n\n::: Reading vitest config.") +console.log("\n\n::: Reading vitest config."); export default defineConfig({ - plugins: [vue({ + plugins: [ + vue({ template: { compilerOptions: { hoistStatic: false, }, }, - })], + }), + ], test: { environment: "jsdom", @@ -31,7 +33,7 @@ export default defineConfig({ resolve: { alias: { "@": path.resolve(__dirname, "./src"), - "vue": path.resolve(__dirname, "./node_modules/vue"), + vue: path.resolve(__dirname, "./node_modules/vue"), }, }, }); From 591d3f6747fb1027f8a208469cf8323d725cf18c Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 22:08:42 -0600 Subject: [PATCH 07/23] ui_migration node(pack) add package requirements for testing --- webapp/package-lock.json | 258 ++++++++++++++++++++++++++++++++++++++- webapp/package.json | 2 + 2 files changed, 258 insertions(+), 2 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 1713f46a..3c37d602 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -24,6 +24,7 @@ "@babel/eslint-parser": "^7.28.5", "@pinia/testing": "^1.0.3", "@vitejs/plugin-vue": "^6.0.6", + "@vitest/coverage-v8": "^4.1.6", "@vue/eslint-config-prettier": "9.0.0", "autoprefixer": "^10.4.24", "core-js": "^3.46.0", @@ -32,6 +33,7 @@ "eslint-plugin-pinia": "^0.4.2", "eslint-plugin-prettier": "^5.1.0", "eslint-plugin-vue": "^9.20.0", + "happy-dom": "^20.9.0", "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", @@ -366,6 +368,16 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@bramus/specificity": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", @@ -886,7 +898,6 @@ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -903,7 +914,6 @@ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1084,12 +1094,39 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "25.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz", + "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, "node_modules/@types/web-bluetooth": { "version": "0.0.21", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "license": "MIT" }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", @@ -1402,6 +1439,37 @@ "vue": "^3.2.25" } }, + "node_modules/@vitest/coverage-v8": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.6.tgz", + "integrity": "sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.6", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.6", + "vitest": "4.1.6" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, "node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -1809,6 +1877,35 @@ "node": ">=12" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3354,6 +3451,47 @@ "license": "ISC", "optional": true }, + "node_modules/happy-dom": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.9.0.tgz", + "integrity": "sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/happy-dom/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/happy-dom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3442,6 +3580,13 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/html-tags": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", @@ -3671,6 +3816,74 @@ "dev": true, "license": "ISC" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3932,6 +4145,18 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -5671,6 +5896,13 @@ "node": ">=20.18.1" } }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, "node_modules/unicorn-magic": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", @@ -6172,6 +6404,28 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/webapp/package.json b/webapp/package.json index f142bc10..5adf9c97 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -33,6 +33,7 @@ "@babel/eslint-parser": "^7.28.5", "@pinia/testing": "^1.0.3", "@vitejs/plugin-vue": "^6.0.6", + "@vitest/coverage-v8": "^4.1.6", "@vue/eslint-config-prettier": "9.0.0", "autoprefixer": "^10.4.24", "core-js": "^3.46.0", @@ -41,6 +42,7 @@ "eslint-plugin-pinia": "^0.4.2", "eslint-plugin-prettier": "^5.1.0", "eslint-plugin-vue": "^9.20.0", + "happy-dom": "^20.9.0", "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", From e803d6001371228becae3eb620457783115916b0 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 22:52:50 -0600 Subject: [PATCH 08/23] ui_migration config(vitest) reduce heap size for unitest --- webapp/package.json | 3 ++- webapp/src/tests/unit/LoggingContent.spec.js | 18 ++++++++++++-- webapp/vitest.config.js | 25 +++++++++++++++++++- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/webapp/package.json b/webapp/package.json index 5adf9c97..7b70c00e 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -15,7 +15,8 @@ "lint": "eslint . --ignore-pattern .gitignore --max-warnings=0", "lint:fix": "eslint . --fix --ignore-pattern .gitignore", "lint:style": "stylelint \"src/**/*.{vue,less,css}\" --max-warnings=0", - "lint:style:fix": "stylelint \"src/**/*.{vue,less,css}\" --fix" + "lint:style:fix": "stylelint \"src/**/*.{vue,less,css}\" --fix", + "unitest": "vitest src/tests/unit/LoggingContent.spec.js --no-cache --mode test --detectAsyncLeaks --coverage --isolate --silent --changed --logHeapUsage" }, "dependencies": { "@vueuse/core": "^14.1.0", diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 93a7aedc..7f4e0a66 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -1,6 +1,7 @@ import { shallowMount, flushPromises } from "@vue/test-utils"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { createTestingPinia } from "@pinia/testing"; +import { setActivePinia } from 'pinia'; import axios from "axios"; import fs from "fs"; import path from "path"; @@ -37,8 +38,9 @@ describe("Test LoggingContent.vue", () => { // Things to do before each test beforeEach(async () => { + vi.useFakeTimers() // Reset mocks before each test - vi.clearAllMocks(); + vi.resetAllMocks(); // Set axios to return our fake logs axios.get.mockResolvedValue({ data: mockLogData }); @@ -67,11 +69,23 @@ describe("Test LoggingContent.vue", () => { }); // flush so we avoid leaving uncompleted processes running on background await flushPromises(); + vi.advanceTimersByTime(1000) + vi.useRealTimers() }); // Tear down wrapper, unmount testing component afterEach(() => { - wrapper.unmount(); + if (wrapper) { + wrapper.unmount() // Clean up virtual DOM and memory bindings + } + setActivePinia(undefined) + document.body.innerHTML = '' + + if (global.gc) { + global.gc() // Forces V8 engine to immediately run Garbage Collection + } + vi.clearAllTimers() + vi.useRealTimers() }); // Test 1: Render check, if things do exist in the page as intended diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index 372ea36b..2c243456 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -19,7 +19,30 @@ export default defineConfig({ ], test: { - environment: "jsdom", + css: false, + pool: 'forks', + singleThread: true, + + define: { + __VUE_PROD_DEVTOOLS__: false, + }, + + coverage: { + provider: 'v8', + clean: true, + cleanOnStart: true, + }, + + deps: { + optimizer: { + web: { + enabled: true, + include: ['@mui/material', 'lucide-react'], // Add your largest component dependencies here + }, + }, + }, + + environment: "happy-dom", globals: true, From d75051df4a49cdb91567b9e7e91e22269d5f96ee Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Thu, 14 May 2026 22:56:16 -0600 Subject: [PATCH 09/23] ui_migration node(pack) add test:unit command --- .gitignore | 2 +- .gitlab-ci.yml | 8 ++++++ webapp/eslint.config.mjs | 17 +++++++++++++ webapp/package-lock.json | 25 ++++++++++++++++--- webapp/package.json | 5 ++-- .../tabContentComponents/loggingContent.vue | 2 +- webapp/src/tests/unit/LoggingContent.spec.js | 20 +++++++-------- webapp/vitest.config.js | 15 ++++++++--- 8 files changed, 72 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 582845f5..0a17713c 100644 --- a/.gitignore +++ b/.gitignore @@ -94,7 +94,7 @@ openflexure_settings/ # Files created by test utilities /tests/unit_tests/utilities/*.pstats /tests/unit_tests/utilities/*.png - +coverage/ # Files created by simulator openflexure/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91592724..b6c46652 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -158,6 +158,14 @@ eslint: script: - npm run lint - npm run lint:style + # The test run if only + - npm run test:unit + artifacts: + name: "vitest-coverage-$CI_COMMIT_REF_SLUG" + when: always + expire_in: 1 week + paths: + - coverage/ # Build JS app build: diff --git a/webapp/eslint.config.mjs b/webapp/eslint.config.mjs index e7c8f7b4..6f931bfa 100644 --- a/webapp/eslint.config.mjs +++ b/webapp/eslint.config.mjs @@ -73,5 +73,22 @@ export default [ "pinia/require-setup-store-properties-export": "warn", }, }, + + { + files: ["src/tests/unit/**/*.spec.js"], + languageOptions: { + globals: { + describe: "readonly", + it: "readonly", + expect: "readonly", + vi: "readonly", + beforeEach: "readonly", + afterEach: "readonly", + mockLogData: "readonly", // Prevents unused global mock variable warnings + afterAll: "readonly", + }, + }, + }, + prettierConfig, ]; diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 3c37d602..3733d2de 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -30,8 +30,9 @@ "core-js": "^3.46.0", "cross-env": "^10.1.0", "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-pinia": "^0.4.2", - "eslint-plugin-prettier": "^5.1.0", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-vue": "^9.20.0", "happy-dom": "^20.9.0", "jsdom": "^29.1.1", @@ -1703,6 +1704,19 @@ "prettier": ">= 3.0.0" } }, + "node_modules/@vue/eslint-config-prettier/node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.33", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", @@ -2738,14 +2752,17 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } diff --git a/webapp/package.json b/webapp/package.json index 7b70c00e..b593ed8e 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -16,7 +16,7 @@ "lint:fix": "eslint . --fix --ignore-pattern .gitignore", "lint:style": "stylelint \"src/**/*.{vue,less,css}\" --max-warnings=0", "lint:style:fix": "stylelint \"src/**/*.{vue,less,css}\" --fix", - "unitest": "vitest src/tests/unit/LoggingContent.spec.js --no-cache --mode test --detectAsyncLeaks --coverage --isolate --silent --changed --logHeapUsage" + "test:unit": "NODE_OPTIONS=--expose-gc vitest run src/tests/unit/ --no-cache --mode test --detectAsyncLeaks --coverage --isolate=true --pool=forks --silent --logHeapUsage" }, "dependencies": { "@vueuse/core": "^14.1.0", @@ -40,8 +40,9 @@ "core-js": "^3.46.0", "cross-env": "^10.1.0", "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-pinia": "^0.4.2", - "eslint-plugin-prettier": "^5.1.0", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-vue": "^9.20.0", "happy-dom": "^20.9.0", "jsdom": "^29.1.1", diff --git a/webapp/src/components/tabContentComponents/loggingContent.vue b/webapp/src/components/tabContentComponents/loggingContent.vue index f621a734..21b0421d 100644 --- a/webapp/src/components/tabContentComponents/loggingContent.vue +++ b/webapp/src/components/tabContentComponents/loggingContent.vue @@ -16,8 +16,8 @@ diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 7f4e0a66..0a57329c 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -1,7 +1,7 @@ import { shallowMount, flushPromises } from "@vue/test-utils"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { createTestingPinia } from "@pinia/testing"; -import { setActivePinia } from 'pinia'; +import { setActivePinia } from "pinia"; import axios from "axios"; import fs from "fs"; import path from "path"; @@ -38,7 +38,7 @@ describe("Test LoggingContent.vue", () => { // Things to do before each test beforeEach(async () => { - vi.useFakeTimers() + vi.useFakeTimers(); // Reset mocks before each test vi.resetAllMocks(); @@ -69,23 +69,23 @@ describe("Test LoggingContent.vue", () => { }); // flush so we avoid leaving uncompleted processes running on background await flushPromises(); - vi.advanceTimersByTime(1000) - vi.useRealTimers() + vi.advanceTimersByTime(1000); + vi.useRealTimers(); }); // Tear down wrapper, unmount testing component afterEach(() => { if (wrapper) { - wrapper.unmount() // Clean up virtual DOM and memory bindings + wrapper.unmount(); // Clean up virtual DOM and memory bindings } - setActivePinia(undefined) - document.body.innerHTML = '' + setActivePinia(undefined); + document.body.innerHTML = ""; if (global.gc) { - global.gc() // Forces V8 engine to immediately run Garbage Collection + global.gc(); // Forces V8 engine to immediately run Garbage Collection } - vi.clearAllTimers() - vi.useRealTimers() + vi.clearAllTimers(); + vi.useRealTimers(); }); // Test 1: Render check, if things do exist in the page as intended diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index 2c243456..a37912df 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -20,7 +20,7 @@ export default defineConfig({ test: { css: false, - pool: 'forks', + pool: "forks", singleThread: true, define: { @@ -28,16 +28,23 @@ export default defineConfig({ }, coverage: { - provider: 'v8', + provider: "v8", clean: true, cleanOnStart: true, - }, + reporter: ["text", "html"], + thresholds: { + lines: 70, + statements: 70, + functions: 50, + branches: 40, + }, + }, deps: { optimizer: { web: { enabled: true, - include: ['@mui/material', 'lucide-react'], // Add your largest component dependencies here + include: ["@mui/material", "lucide-react"], // Add your largest component dependencies here }, }, }, From 938d202b3803ae86ec3186a179cceb0d893e1751 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 00:29:11 -0600 Subject: [PATCH 10/23] ui_migration codespell(config) Add ignore for text files to avoid fails on readonly vars --- .codespellrc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.codespellrc b/.codespellrc index 1e682e69..09d8d388 100644 --- a/.codespellrc +++ b/.codespellrc @@ -16,7 +16,10 @@ skip = node_modules, ./src/openflexure_microscope_server/static, .venv, *.egg-info, - report.xml + src/tests/unit, + ./webapp/src/tests/unit/*.spec.js, + ./webapp/eslint.config.mjs, + ./webapp/coverage, regex = [a-zA-Z0-9\-'’]+ ignore-words-list = fom From e478644d2ad447eeb8f8a671b743afda18e27d9d Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 08:30:00 -0600 Subject: [PATCH 11/23] ui_migration codespell(config) Add codespell exceptions for fixtures and else --- .codespellrc | 6 ++---- .codespellrc2 | 6 ++++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.codespellrc b/.codespellrc index 09d8d388..fca99ec4 100644 --- a/.codespellrc +++ b/.codespellrc @@ -18,9 +18,7 @@ skip = node_modules, *.egg-info, src/tests/unit, ./webapp/src/tests/unit/*.spec.js, - ./webapp/eslint.config.mjs, - ./webapp/coverage, + ./webapp/coverage/*, regex = [a-zA-Z0-9\-'’]+ -ignore-words-list = fom - +ignore-words-list = fom, afterAll diff --git a/.codespellrc2 b/.codespellrc2 index 2a690037..a7c9c725 100644 --- a/.codespellrc2 +++ b/.codespellrc2 @@ -1,7 +1,7 @@ [codespell] # A separate RC file for detecting camelCase, PascalCase, and kebab-case errors # A little more prone to false positives than our standard regex, also fails to detect -# hyphenated words in the dictonary. +# hyphenated words in the dictionary. # Same as the main RC-file except it also excludes CHANGELOG as this is well covered # by the normal RC file, and we get false positives from git hashes. @@ -19,7 +19,9 @@ skip = node_modules, .venv, *.egg-info, report.xml, - CHANGELOG.md + CHANGELOG.md, + ./webapp/src/tests/fixtures/*, + ./webapp/coverage/*, # Ignores split by | # Ignore hexadecimal numbers preceded by # From ca08e617950a59e5acdd670c9681bf6d99fd2371 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 08:55:02 -0600 Subject: [PATCH 12/23] ui_migration node(pack) add test utils dependency --- webapp/package-lock.json | 539 +++++++++++++++++++++++++++++++++++++++ webapp/package.json | 1 + 2 files changed, 540 insertions(+) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 3733d2de..fa2830f3 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -26,6 +26,7 @@ "@vitejs/plugin-vue": "^6.0.6", "@vitest/coverage-v8": "^4.1.6", "@vue/eslint-config-prettier": "9.0.0", + "@vue/test-utils": "^2.4.10", "autoprefixer": "^10.4.24", "core-js": "^3.46.0", "cross-env": "^10.1.0", @@ -869,6 +870,49 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -975,6 +1019,13 @@ "node": ">= 8" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, "node_modules/@pinia/testing": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@pinia/testing/-/testing-1.0.3.tgz", @@ -988,6 +1039,17 @@ "pinia": ">=3.0.4" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/core": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", @@ -1767,6 +1829,27 @@ "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", "license": "MIT" }, + "node_modules/@vue/test-utils": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.10.tgz", + "integrity": "sha512-SmoZ5EA1kYiAFs9NkYdiFFQF+cSnUwnvlYEbY+DogWQZUiqOm/Y29eSbc5T6yi75SgSF9863SBeXniIEoPajCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" + }, + "peerDependencies": { + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } + } + }, "node_modules/@vueuse/core": { "version": "14.3.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", @@ -1805,6 +1888,16 @@ "vue": "^3.5.0" } }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -2222,6 +2315,16 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2229,6 +2332,17 @@ "dev": true, "license": "MIT" }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2514,6 +2628,71 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.349", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz", @@ -3243,6 +3422,23 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -3343,6 +3539,28 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3356,6 +3574,32 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -3901,6 +4145,54 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-mYhz0Og/Wv8bZJcBC6rRzYG+rYf8DyQSK3rcUbuGHQIgSsX6uynAIVoaPgqf0udH2AGS953hGFy3w6on1rJzMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4338,6 +4630,16 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -4407,6 +4709,22 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4500,6 +4818,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4588,6 +4913,30 @@ "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -4818,6 +5167,13 @@ "node": ">=6.0.0" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, "node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -5168,6 +5524,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -5184,6 +5579,30 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6211,6 +6630,13 @@ } } }, + "node_modules/vue-component-type-helpers": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.9.tgz", + "integrity": "sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==", + "dev": true, + "license": "MIT" + }, "node_modules/vue-eslint-parser": { "version": "9.4.3", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", @@ -6408,6 +6834,119 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/write-file-atomic": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", diff --git a/webapp/package.json b/webapp/package.json index b593ed8e..35e06ece 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -36,6 +36,7 @@ "@vitejs/plugin-vue": "^6.0.6", "@vitest/coverage-v8": "^4.1.6", "@vue/eslint-config-prettier": "9.0.0", + "@vue/test-utils": "^2.4.10", "autoprefixer": "^10.4.24", "core-js": "^3.46.0", "cross-env": "^10.1.0", From 3fc2a79a89a6008d7c23dac93c56e6650f51e32b Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 09:01:36 -0600 Subject: [PATCH 13/23] ui_migration node(pack) package maintenance to fix new test packages deprecations --- webapp/package-lock.json | 888 +++++++++++++++++++++++++++------------ 1 file changed, 608 insertions(+), 280 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index fa2830f3..25d8f99b 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -475,9 +475,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", - "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "dev": true, "funding": [ { @@ -499,9 +499,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", - "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", "dev": true, "funding": [ { @@ -516,7 +516,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.2.0" + "@csstools/css-calc": "^3.2.1" }, "engines": { "node": ">=20.19.0" @@ -550,9 +550,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", - "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", "dev": true, "funding": [ { @@ -888,31 +888,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1064,16 +1039,254 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz", - "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", - "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", "cpu": [ "x64" ], @@ -1085,9 +1298,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", - "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", "cpu": [ "x64" ], @@ -1098,6 +1311,90 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -1144,6 +1441,9 @@ "license": "MIT" }, "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", @@ -1191,17 +1491,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", - "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/type-utils": "8.59.2", - "@typescript-eslint/utils": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1214,7 +1514,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.2", + "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1230,16 +1530,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", - "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "engines": { @@ -1255,14 +1555,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", - "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.2", - "@typescript-eslint/types": "^8.59.2", + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "engines": { @@ -1277,14 +1577,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", - "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1295,9 +1595,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", - "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, "license": "MIT", "engines": { @@ -1312,15 +1612,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz", - "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/utils": "8.59.2", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1337,9 +1637,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", - "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -1351,16 +1651,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", - "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.2", - "@typescript-eslint/tsconfig-utils": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1431,16 +1731,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz", - "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1455,13 +1755,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", - "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1486,13 +1786,13 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.6.tgz", - "integrity": "sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.13" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -1669,18 +1969,6 @@ "source-map-js": "^1.2.1" } }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/@vue/compiler-dom": { "version": "3.5.33", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", @@ -1921,6 +2209,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -2067,13 +2367,14 @@ } }, "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, @@ -2085,9 +2386,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.27", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", - "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2495,11 +2796,20 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2570,6 +2880,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -2694,20 +3017,23 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.349", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz", - "integrity": "sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==", + "version": "1.5.356", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", + "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", @@ -3730,29 +4056,6 @@ "node": ">=20.0.0" } }, - "node_modules/happy-dom/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/happy-dom/node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3894,6 +4197,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -4040,16 +4356,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4102,35 +4408,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", @@ -4264,6 +4541,16 @@ "node": "20 || >=22" } }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/jsdom/node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -4376,6 +4663,32 @@ "source-map": "~0.6.0" } }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4467,29 +4780,32 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", - "optional": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/material-design-icons": { @@ -4656,7 +4972,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -4703,9 +5018,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "dev": true, "license": "MIT" }, @@ -5280,9 +5595,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.60.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", - "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", "dev": true, "license": "MIT", "dependencies": { @@ -5296,31 +5611,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.3", - "@rollup/rollup-android-arm64": "4.60.3", - "@rollup/rollup-darwin-arm64": "4.60.3", - "@rollup/rollup-darwin-x64": "4.60.3", - "@rollup/rollup-freebsd-arm64": "4.60.3", - "@rollup/rollup-freebsd-x64": "4.60.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", - "@rollup/rollup-linux-arm-musleabihf": "4.60.3", - "@rollup/rollup-linux-arm64-gnu": "4.60.3", - "@rollup/rollup-linux-arm64-musl": "4.60.3", - "@rollup/rollup-linux-loong64-gnu": "4.60.3", - "@rollup/rollup-linux-loong64-musl": "4.60.3", - "@rollup/rollup-linux-ppc64-gnu": "4.60.3", - "@rollup/rollup-linux-ppc64-musl": "4.60.3", - "@rollup/rollup-linux-riscv64-gnu": "4.60.3", - "@rollup/rollup-linux-riscv64-musl": "4.60.3", - "@rollup/rollup-linux-s390x-gnu": "4.60.3", - "@rollup/rollup-linux-x64-gnu": "4.60.3", - "@rollup/rollup-linux-x64-musl": "4.60.3", - "@rollup/rollup-openbsd-x64": "4.60.3", - "@rollup/rollup-openharmony-arm64": "4.60.3", - "@rollup/rollup-win32-arm64-msvc": "4.60.3", - "@rollup/rollup-win32-ia32-msvc": "4.60.3", - "@rollup/rollup-win32-x64-gnu": "4.60.3", - "@rollup/rollup-win32-x64-msvc": "4.60.3", + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", "fsevents": "~2.3.2" } }, @@ -5508,17 +5823,18 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=20" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5550,6 +5866,13 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5617,9 +5940,9 @@ } }, "node_modules/stylelint": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.0.tgz", - "integrity": "sha512-/3czzmbF9XdGWvReDF3Ex4R23Ajolo7j8RB2bFNEqk6Ht356nlpVV+G5bG2Qt8AW1ofJzXztBRDnAtd7cgowWA==", + "version": "17.11.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.1.tgz", + "integrity": "sha512-+smN/HqVTggUx3iuAzOi9fPh8SrH+cJWlZrYVldXoJ06orWBhZ4Ue/QEp64oei6pVrAh4w3tG+Y12Vw7MbCFRQ==", "dev": true, "funding": [ { @@ -5654,13 +5977,12 @@ "html-tags": "^5.1.0", "ignore": "^7.0.5", "import-meta-resolve": "^4.2.0", - "is-plain-object": "^5.0.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.13", + "postcss": "^8.5.14", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", @@ -5901,6 +6223,23 @@ "node": ">=4" } }, + "node_modules/stylelint/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/superjson": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", @@ -6069,6 +6408,13 @@ "node": ">=8" } }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -6293,16 +6639,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.2.tgz", - "integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.2", - "@typescript-eslint/parser": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/utils": "8.59.2" + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6767,13 +7113,13 @@ } }, "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=12" } }, "node_modules/whatwg-url": { @@ -6881,6 +7227,13 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6922,31 +7275,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/write-file-atomic": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", From a5fc9c65dc185454fc52888ff69d7fe2c2e5cae4 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 23:27:17 +0000 Subject: [PATCH 14/23] Apply suggestions from code review of branch webapp_unit_testing Co-authored-by: Julian Stirling --- .gitlab-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b6c46652..d67806e9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -150,10 +150,11 @@ combined-tests: coverage_format: cobertura path: coverage.xml -# JavaScript linting with ESLint (via Vue CLI) +# JavaScript linting and testing +# ESLint, StyleLint and ViTest # Only runs when a .js or .vue file is edited -eslint: - stage: analysis +javascript-lint-and-test: + stage: testing extends: .javascript_webapp script: - npm run lint From 97eadb92711d32b0af9a4594529c058d48e53467 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 09:01:36 -0600 Subject: [PATCH 15/23] ui_migration node(pack) package maintenance to fix new test packages deprecations --- webapp/package-lock.json | 1230 ++++++++++++++++++++++++++++++++++---- 1 file changed, 1116 insertions(+), 114 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 25d8f99b..0149947c 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -475,6 +475,9 @@ } }, "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "version": "3.2.1", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", @@ -499,6 +502,9 @@ } }, "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", "version": "4.1.1", "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", @@ -517,6 +523,7 @@ "dependencies": { "@csstools/color-helpers": "^6.0.2", "@csstools/css-calc": "^3.2.1" + "@csstools/css-calc": "^3.2.1" }, "engines": { "node": ">=20.19.0" @@ -550,6 +557,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", + "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", "version": "1.1.4", "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", @@ -625,6 +635,278 @@ "dev": true, "license": "MIT" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", @@ -642,6 +924,159 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -1039,6 +1474,9 @@ } }, "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", @@ -1283,7 +1721,248 @@ "linux" ] }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", @@ -1298,6 +1977,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", @@ -1395,6 +2077,90 @@ "win32" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -1441,12 +2207,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -1491,6 +2254,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", @@ -1502,6 +2268,10 @@ "@typescript-eslint/type-utils": "8.59.3", "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1514,6 +2284,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -1530,12 +2301,19 @@ } }, "node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", @@ -1555,12 +2333,17 @@ } }, "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "@typescript-eslint/tsconfig-utils": "^8.59.3", "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" @@ -1577,6 +2360,9 @@ } }, "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", @@ -1585,6 +2371,8 @@ "dependencies": { "@typescript-eslint/types": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1595,6 +2383,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", @@ -1612,12 +2403,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3", @@ -1637,6 +2434,9 @@ } }, "node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", @@ -1651,12 +2451,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "@typescript-eslint/project-service": "8.59.3", "@typescript-eslint/tsconfig-utils": "8.59.3", "@typescript-eslint/types": "8.59.3", @@ -1689,9 +2496,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -1718,9 +2525,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -1731,6 +2538,9 @@ } }, "node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", @@ -1741,6 +2551,9 @@ "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1755,12 +2568,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/types": "8.59.3", "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, @@ -1786,6 +2603,9 @@ } }, "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", "version": "6.0.7", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", @@ -1793,6 +2613,7 @@ "license": "MIT", "dependencies": { "@rolldown/pluginutils": "^1.0.1" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -1970,40 +2791,40 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", + "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-core": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", + "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.34", + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.10", + "postcss": "^8.5.14", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", + "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/devtools-api": { @@ -2068,53 +2889,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", - "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", + "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.33" + "@vue/shared": "3.5.34" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", - "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", + "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/reactivity": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", - "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", + "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/runtime-core": "3.5.33", - "@vue/shared": "3.5.33", + "@vue/reactivity": "3.5.34", + "@vue/runtime-core": "3.5.34", + "@vue/shared": "3.5.34", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", - "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", + "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { - "vue": "3.5.33" + "vue": "3.5.34" } }, "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -2221,6 +3042,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -2367,6 +3200,9 @@ } }, "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "version": "1.16.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", @@ -2375,6 +3211,7 @@ "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, @@ -2386,6 +3223,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "version": "2.10.29", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", @@ -2530,9 +3370,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, "funding": [ { @@ -2806,6 +3646,16 @@ "node": ">=20" } }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3017,6 +3867,9 @@ } }, "node_modules/electron-to-chromium": { + "version": "1.5.356", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", + "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", "version": "1.5.356", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", @@ -3024,6 +3877,9 @@ "license": "ISC" }, "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", @@ -3362,9 +4218,9 @@ } }, "node_modules/eslint-plugin-vue/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -3646,24 +4502,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3795,6 +4633,21 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4210,6 +5063,19 @@ "node": ">= 6" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -4461,13 +5327,13 @@ } }, "node_modules/js-cookie": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.6.tgz", - "integrity": "sha512-mYhz0Og/Wv8bZJcBC6rRzYG+rYf8DyQSK3rcUbuGHQIgSsX6uynAIVoaPgqf0udH2AGS953hGFy3w6on1rJzMw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=14" } }, "node_modules/js-tokens": { @@ -4551,6 +5417,16 @@ "node": ">=20" } }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/jsdom/node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -4689,6 +5565,32 @@ "semver": "bin/semver" } }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4780,6 +5682,9 @@ } }, "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", @@ -4787,15 +5692,23 @@ "license": "MIT", "dependencies": { "semver": "^7.5.3" + "semver": "^7.5.3" }, "engines": { "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", @@ -4804,6 +5717,10 @@ "bin": { "semver": "bin/semver.js" }, + "engines": { + "node": ">=10" + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } @@ -4885,19 +5802,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5018,6 +5922,9 @@ } }, "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "version": "2.0.44", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", @@ -5272,13 +6179,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -5595,6 +6502,9 @@ "license": "MIT" }, "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", @@ -5611,6 +6521,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", "@rollup/rollup-android-arm-eabi": "4.60.4", "@rollup/rollup-android-arm64": "4.60.4", "@rollup/rollup-darwin-arm64": "4.60.4", @@ -5639,6 +6574,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5823,6 +6765,9 @@ "license": "MIT" }, "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", @@ -5832,9 +6777,13 @@ "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5873,6 +6822,13 @@ "dev": true, "license": "MIT" }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5940,6 +6896,9 @@ } }, "node_modules/stylelint": { + "version": "17.11.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.1.tgz", + "integrity": "sha512-+smN/HqVTggUx3iuAzOi9fPh8SrH+cJWlZrYVldXoJ06orWBhZ4Ue/QEp64oei6pVrAh4w3tG+Y12Vw7MbCFRQ==", "version": "17.11.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.1.tgz", "integrity": "sha512-+smN/HqVTggUx3iuAzOi9fPh8SrH+cJWlZrYVldXoJ06orWBhZ4Ue/QEp64oei6pVrAh4w3tG+Y12Vw7MbCFRQ==", @@ -5983,6 +6942,7 @@ "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.14", + "postcss": "^8.5.14", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", @@ -6240,6 +7200,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/superjson": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", @@ -6415,6 +7392,13 @@ "dev": true, "license": "MIT" }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -6639,6 +7623,9 @@ } }, "node_modules/typescript-eslint": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", @@ -6649,6 +7636,10 @@ "@typescript-eslint/parser": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3" + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6747,9 +7738,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", "dev": true, "license": "MIT", "dependencies": { @@ -6956,16 +7947,16 @@ } }, "node_modules/vue": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", - "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", + "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-sfc": "3.5.33", - "@vue/runtime-dom": "3.5.33", - "@vue/server-renderer": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-sfc": "3.5.34", + "@vue/runtime-dom": "3.5.34", + "@vue/server-renderer": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { "typescript": "*" @@ -7067,9 +8058,9 @@ } }, "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -7113,6 +8104,9 @@ } }, "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", @@ -7120,6 +8114,7 @@ "license": "MIT", "engines": { "node": ">=12" + "node": ">=12" } }, "node_modules/whatwg-url": { @@ -7234,6 +8229,13 @@ "dev": true, "license": "MIT" }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", From fb1517851207bf69b10bc26aef8d53ca242b3f29 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Fri, 15 May 2026 17:44:08 -0600 Subject: [PATCH 16/23] ui_migration feature(vitest) add all vue files to vitest coverage reporter --- .gitlab-ci.yml | 2 +- webapp/package-lock.json | 605 --------------------------------------- webapp/vitest.config.js | 14 +- 3 files changed, 9 insertions(+), 612 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d67806e9..eb1d4a73 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -166,7 +166,7 @@ javascript-lint-and-test: when: always expire_in: 1 week paths: - - coverage/ + - webapp/coverage/ # Build JS app build: diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 0149947c..bf600ff6 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -475,9 +475,6 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "version": "3.2.1", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", @@ -502,9 +499,6 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", - "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", "version": "4.1.1", "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", @@ -523,7 +517,6 @@ "dependencies": { "@csstools/color-helpers": "^6.0.2", "@csstools/css-calc": "^3.2.1" - "@csstools/css-calc": "^3.2.1" }, "engines": { "node": ">=20.19.0" @@ -557,9 +550,6 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", - "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", "version": "1.1.4", "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", @@ -1474,9 +1464,6 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", @@ -1721,248 +1708,7 @@ "linux" ] }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", @@ -1977,9 +1723,6 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", @@ -2077,90 +1820,6 @@ "win32" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -2254,9 +1913,6 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", - "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", @@ -2268,10 +1924,6 @@ "@typescript-eslint/type-utils": "8.59.3", "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/type-utils": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2284,7 +1936,6 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.3", "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" @@ -2301,19 +1952,12 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", @@ -2333,17 +1977,12 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", "@typescript-eslint/tsconfig-utils": "^8.59.3", "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" @@ -2360,9 +1999,6 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", @@ -2371,8 +2007,6 @@ "dependencies": { "@typescript-eslint/types": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3" - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2383,9 +2017,6 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", @@ -2403,18 +2034,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", - "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3", @@ -2434,9 +2059,6 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", @@ -2451,19 +2073,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", "@typescript-eslint/project-service": "8.59.3", "@typescript-eslint/tsconfig-utils": "8.59.3", "@typescript-eslint/types": "8.59.3", @@ -2538,9 +2153,6 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", - "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", @@ -2551,9 +2163,6 @@ "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3" - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2568,16 +2177,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, @@ -2603,9 +2208,6 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", - "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", "version": "6.0.7", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", @@ -2613,7 +2215,6 @@ "license": "MIT", "dependencies": { "@rolldown/pluginutils": "^1.0.1" - "@rolldown/pluginutils": "^1.0.1" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -3042,18 +2643,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -3200,9 +2789,6 @@ } }, "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "version": "1.16.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", @@ -3211,7 +2797,6 @@ "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", - "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, @@ -3223,9 +2808,6 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", - "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "version": "2.10.29", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", @@ -3646,16 +3228,6 @@ "node": ">=20" } }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3730,19 +3302,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -3867,9 +3426,6 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", - "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", "version": "1.5.356", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", @@ -3877,9 +3433,6 @@ "license": "ISC" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", @@ -3887,9 +3440,6 @@ "license": "MIT" }, "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", @@ -5063,19 +4613,6 @@ "node": ">= 6" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -5417,16 +4954,6 @@ "node": ">=20" } }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/jsdom/node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -5565,32 +5092,6 @@ "semver": "bin/semver" } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5682,9 +5183,6 @@ } }, "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", @@ -5692,23 +5190,15 @@ "license": "MIT", "dependencies": { "semver": "^7.5.3" - "semver": "^7.5.3" }, "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - "node": ">=10" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", @@ -5717,10 +5207,6 @@ "bin": { "semver": "bin/semver.js" }, - "engines": { - "node": ">=10" - "semver": "bin/semver.js" - }, "engines": { "node": ">=10" } @@ -5922,9 +5408,6 @@ } }, "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "version": "2.0.44", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", @@ -6502,9 +5985,6 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", "version": "4.60.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", @@ -6521,31 +6001,6 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.4", - "@rollup/rollup-android-arm64": "4.60.4", - "@rollup/rollup-darwin-arm64": "4.60.4", - "@rollup/rollup-darwin-x64": "4.60.4", - "@rollup/rollup-freebsd-arm64": "4.60.4", - "@rollup/rollup-freebsd-x64": "4.60.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", - "@rollup/rollup-linux-arm-musleabihf": "4.60.4", - "@rollup/rollup-linux-arm64-gnu": "4.60.4", - "@rollup/rollup-linux-arm64-musl": "4.60.4", - "@rollup/rollup-linux-loong64-gnu": "4.60.4", - "@rollup/rollup-linux-loong64-musl": "4.60.4", - "@rollup/rollup-linux-ppc64-gnu": "4.60.4", - "@rollup/rollup-linux-ppc64-musl": "4.60.4", - "@rollup/rollup-linux-riscv64-gnu": "4.60.4", - "@rollup/rollup-linux-riscv64-musl": "4.60.4", - "@rollup/rollup-linux-s390x-gnu": "4.60.4", - "@rollup/rollup-linux-x64-gnu": "4.60.4", - "@rollup/rollup-linux-x64-musl": "4.60.4", - "@rollup/rollup-openbsd-x64": "4.60.4", - "@rollup/rollup-openharmony-arm64": "4.60.4", - "@rollup/rollup-win32-arm64-msvc": "4.60.4", - "@rollup/rollup-win32-ia32-msvc": "4.60.4", - "@rollup/rollup-win32-x64-gnu": "4.60.4", - "@rollup/rollup-win32-x64-msvc": "4.60.4", "@rollup/rollup-android-arm-eabi": "4.60.4", "@rollup/rollup-android-arm64": "4.60.4", "@rollup/rollup-darwin-arm64": "4.60.4", @@ -6765,9 +6220,6 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", @@ -6777,13 +6229,9 @@ "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" - "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6822,13 +6270,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6896,9 +6337,6 @@ } }, "node_modules/stylelint": { - "version": "17.11.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.1.tgz", - "integrity": "sha512-+smN/HqVTggUx3iuAzOi9fPh8SrH+cJWlZrYVldXoJ06orWBhZ4Ue/QEp64oei6pVrAh4w3tG+Y12Vw7MbCFRQ==", "version": "17.11.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.11.1.tgz", "integrity": "sha512-+smN/HqVTggUx3iuAzOi9fPh8SrH+cJWlZrYVldXoJ06orWBhZ4Ue/QEp64oei6pVrAh4w3tG+Y12Vw7MbCFRQ==", @@ -6942,7 +6380,6 @@ "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.14", - "postcss": "^8.5.14", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", @@ -7200,23 +6637,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/superjson": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", @@ -7392,13 +6812,6 @@ "dev": true, "license": "MIT" }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -7623,9 +7036,6 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", - "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", "version": "8.59.3", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", @@ -7636,10 +7046,6 @@ "@typescript-eslint/parser": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3" - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8104,9 +7510,6 @@ } }, "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", @@ -8114,7 +7517,6 @@ "license": "MIT", "engines": { "node": ">=12" - "node": ">=12" } }, "node_modules/whatwg-url": { @@ -8229,13 +7631,6 @@ "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index a37912df..ad4081f8 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -5,8 +5,6 @@ import { defineConfig } from "vitest/config"; import vue from "@vitejs/plugin-vue"; import path from "path"; -console.log("\n\n::: Reading vitest config."); - export default defineConfig({ plugins: [ vue({ @@ -28,16 +26,20 @@ export default defineConfig({ }, coverage: { + enabled: true, provider: "v8", clean: true, cleanOnStart: true, reporter: ["text", "html"], + all: true, + include: ["src/**/*.vue", "src/**/*.js"], + exclude: [], thresholds: { - lines: 70, - statements: 70, - functions: 50, - branches: 40, + lines: 4, + statements: 3, + functions: 3, + branches: 1, }, }, deps: { From b517721ff9fe262731d136211af1a0ed47c670cb Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Mon, 18 May 2026 19:24:06 -0600 Subject: [PATCH 17/23] ui_migration configure(vitest) add npm run commands, fix codespell for test .spec.files, remove comments, remove data tags on vite build, and refine packages --- .codespellrc | 1 - webapp/package-lock.json | 588 +++---------------- webapp/package.json | 3 +- webapp/src/tests/unit/LoggingContent.spec.js | 7 +- webapp/vite.config.mjs | 18 +- 5 files changed, 106 insertions(+), 511 deletions(-) diff --git a/.codespellrc b/.codespellrc index fca99ec4..9dee9e4d 100644 --- a/.codespellrc +++ b/.codespellrc @@ -17,7 +17,6 @@ skip = node_modules, .venv, *.egg-info, src/tests/unit, - ./webapp/src/tests/unit/*.spec.js, ./webapp/coverage/*, regex = [a-zA-Z0-9\-'’]+ diff --git a/webapp/package-lock.json b/webapp/package-lock.json index bf600ff6..a1367b0d 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -36,7 +36,6 @@ "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-vue": "^9.20.0", "happy-dom": "^20.9.0", - "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", "postcss-html": "^1.8.1", @@ -53,57 +52,6 @@ "node": ">=20.0.0" } }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", - "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", - "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/generational-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", - "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -380,27 +328,14 @@ "node": ">=18" } }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, "node_modules/@cacheable/memory": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", - "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.9.tgz", + "integrity": "sha512-HdMx6DoGywB30vacDbBsITbIX4pgFqj1zsrV58jZBUw3klzkNoXhj7qOqAgledhxG7YZI5rBSJg7Zp8/VG0DuA==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.4.0", + "@cacheable/utils": "^2.4.1", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" @@ -454,26 +389,6 @@ "@keyv/serialize": "^1.1.1" } }, - "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, "node_modules/@csstools/css-calc": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", @@ -498,34 +413,6 @@ "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@csstools/css-color-parser": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", - "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.2.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, "node_modules/@csstools/css-parser-algorithms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", @@ -1211,24 +1098,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -1880,9 +1749,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz", - "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==", + "version": "25.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.0.tgz", + "integrity": "sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1913,17 +1782,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", - "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", + "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/type-utils": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/type-utils": "8.59.4", + "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1936,7 +1805,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.3", + "@typescript-eslint/parser": "^8.59.4", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1952,16 +1821,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3" }, "engines": { @@ -1977,14 +1846,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", "debug": "^4.4.3" }, "engines": { @@ -1999,14 +1868,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2017,9 +1886,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", "engines": { @@ -2034,15 +1903,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", - "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", + "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2059,9 +1928,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", "engines": { @@ -2073,16 +1942,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2153,16 +2022,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", - "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", + "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3" + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2177,13 +2046,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/types": "8.59.4", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2808,9 +2677,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", - "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "version": "2.10.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.31.tgz", + "integrity": "sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2820,16 +2689,6 @@ "node": ">=6.0.0" } }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, "node_modules/birpc": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", @@ -2952,9 +2811,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", "dev": true, "funding": [ { @@ -3204,30 +3063,6 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3245,13 +3080,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3426,9 +3254,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", - "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", + "version": "1.5.357", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", + "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", "dev": true, "license": "ISC" }, @@ -4534,19 +4362,6 @@ "dev": true, "license": "MIT" }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4759,13 +4574,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", @@ -4864,13 +4672,13 @@ } }, "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.7.tgz", + "integrity": "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/js-tokens": { @@ -4893,77 +4701,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", - "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.1.11", - "@asamuzakjp/dom-selector": "^7.1.1", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.3", - "@exodus/bytes": "^1.15.0", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.3.5", - "parse5": "^8.0.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.1", - "undici": "^7.25.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.1", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/lru-cache": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", - "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/jsdom/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -5572,32 +5309,6 @@ "node": ">= 0.10" } }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6079,19 +5790,6 @@ "node": ">=11.0.0" } }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -6738,13 +6436,6 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, "node_modules/synckit": { "version": "0.11.12", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", @@ -6922,26 +6613,6 @@ "node": ">=14.0.0" } }, - "node_modules/tldts": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.30.tgz", - "integrity": "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.30" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.30.tgz", - "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", - "dev": true, - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6955,32 +6626,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -7036,16 +6681,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", - "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", + "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3" + "@typescript-eslint/eslint-plugin": "8.59.4", + "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/utils": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7065,16 +6710,6 @@ "integrity": "sha512-zTpbaNMWTTsWZOiFJkFHa+zia1pRgY3FA6hEAckVgk4aJ19+qie7M/qH9GJgI1nlxP97xMcGH/MXw0qWaKURfQ==", "license": "MIT" }, - "node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", @@ -7374,9 +7009,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.9.tgz", - "integrity": "sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.0.tgz", + "integrity": "sha512-vwR8DDsBysI9NWXa0okPFpCcW+BUC3sPTuLBNo1faMzw4QWMFd+3/lFYFu29ZN0q+8UReXWJHEYesC9dcXYCLg==", "dev": true, "license": "MIT" }, @@ -7476,39 +7111,6 @@ "node": ">=10" } }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -7519,21 +7121,6 @@ "node": ">=12" } }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7717,13 +7304,6 @@ "node": ">=12" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/webapp/package.json b/webapp/package.json index 35e06ece..8d5a9981 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -16,6 +16,8 @@ "lint:fix": "eslint . --fix --ignore-pattern .gitignore", "lint:style": "stylelint \"src/**/*.{vue,less,css}\" --max-warnings=0", "lint:style:fix": "stylelint \"src/**/*.{vue,less,css}\" --fix", + "lint:test": "prettier -c src/tests/unit/*.spec.js", + "lint:test:fix": "prettier -w src/tests/unit/*.spec.js", "test:unit": "NODE_OPTIONS=--expose-gc vitest run src/tests/unit/ --no-cache --mode test --detectAsyncLeaks --coverage --isolate=true --pool=forks --silent --logHeapUsage" }, "dependencies": { @@ -46,7 +48,6 @@ "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-vue": "^9.20.0", "happy-dom": "^20.9.0", - "jsdom": "^29.1.1", "less": "^4.5.1", "material-symbols": "^0.39.1", "postcss-html": "^1.8.1", diff --git a/webapp/src/tests/unit/LoggingContent.spec.js b/webapp/src/tests/unit/LoggingContent.spec.js index 0a57329c..2153c29f 100644 --- a/webapp/src/tests/unit/LoggingContent.spec.js +++ b/webapp/src/tests/unit/LoggingContent.spec.js @@ -142,7 +142,7 @@ describe("Test LoggingContent.vue", () => { // Test 4: Click buttons // This required the component file to be modified by adding data-test-id flags. - // flags are needed as classes and text content may change by translation or style change. + // Flags are needed as classes and text content may change by translation or style change. it("click buttons", async () => { // Click download button const downloadButton = wrapper.find('[data-test-id="download-btn"]'); @@ -155,9 +155,8 @@ describe("Test LoggingContent.vue", () => { await updateButton.trigger("click"); }); - // Test 5: Compare downloaded file to fixture file. - // Test 6: WIP - + // Prevents Vitest "Async Leak" errors by giving Vue's internal + // DevTools timer a few milliseconds to finish before teardown. afterAll(async () => { await new Promise((resolve) => setTimeout(resolve, 15)); }); diff --git a/webapp/vite.config.mjs b/webapp/vite.config.mjs index b384a2a9..67eec9c5 100644 --- a/webapp/vite.config.mjs +++ b/webapp/vite.config.mjs @@ -10,6 +10,7 @@ import vue from "@vitejs/plugin-vue"; // https://vitejs.dev/config/ export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), ""); + const isProduction = mode === 'production'; var target; @@ -27,7 +28,22 @@ export default defineConfig(({ command, mode }) => { } return { - plugins: [vue()], + plugins: [ + vue({ + // Block for removing data-test-id tags on npm run build + template: { + compilerOptions: { + nodeTransforms: isProduction ? [ + (node) => { + if (node.type === 1 /* NodeTypes.ELEMENT */) { + node.props = node.props.filter(prop => prop.name !== 'data-test-id'); + } + } + ] : [] + } + } + }) + ], build: { // Output directory for production builds From a54980b027f032eb430ffac401bd1351fbfd5a70 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Mon, 18 May 2026 20:18:22 -0600 Subject: [PATCH 18/23] ui_migration setup(vitest) Add comments to vitestfile, set and optimise packages on test --- webapp/vite.config.mjs | 24 +++++++++++++----------- webapp/vitest.config.js | 32 +++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/webapp/vite.config.mjs b/webapp/vite.config.mjs index 67eec9c5..a8542d50 100644 --- a/webapp/vite.config.mjs +++ b/webapp/vite.config.mjs @@ -10,7 +10,7 @@ import vue from "@vitejs/plugin-vue"; // https://vitejs.dev/config/ export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), ""); - const isProduction = mode === 'production'; + const isProduction = mode === "production"; var target; @@ -33,16 +33,18 @@ export default defineConfig(({ command, mode }) => { // Block for removing data-test-id tags on npm run build template: { compilerOptions: { - nodeTransforms: isProduction ? [ - (node) => { - if (node.type === 1 /* NodeTypes.ELEMENT */) { - node.props = node.props.filter(prop => prop.name !== 'data-test-id'); - } - } - ] : [] - } - } - }) + nodeTransforms: isProduction + ? [ + (node) => { + if (node.type === 1 /* NodeTypes.ELEMENT */) { + node.props = node.props.filter((prop) => prop.name !== "data-test-id"); + } + }, + ] + : [], + }, + }, + }), ], build: { diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index ad4081f8..41bf6348 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -1,5 +1,4 @@ -// File: vitest.config.js -// Generic configuration for vitest +// OFM unit testing configuration file. import { defineConfig } from "vitest/config"; import vue from "@vitejs/plugin-vue"; @@ -10,6 +9,8 @@ export default defineConfig({ vue({ template: { compilerOptions: { + // This configuration is set to avoid vue warns about missing refs. + // Forces the test to render all html as dynamic, and avoid hoisting. hoistStatic: false, }, }, @@ -17,24 +18,35 @@ export default defineConfig({ ], test: { + // CSS is disabled for now, the test loads the DOM without styles. css: false, pool: "forks", + // Runs in a single thread to avoid CI pipeline crashing. singleThread: true, + // Switch loading vue features define: { + // Feature not needed for current testing __VUE_PROD_DEVTOOLS__: false, + // We use and enforce VUE optionsAPI + __VUE_OPTIONS_API__: true, }, + // Coverage analysis tools setup coverage: { enabled: true, provider: "v8", clean: true, cleanOnStart: true, + // text gives output on STOUT and html creates an artifact reporter: ["text", "html"], all: true, + // Files to include or exclude in coverage include: ["src/**/*.vue", "src/**/*.js"], exclude: [], - + // These thresholds raise ERROR if the coverture it's under the provided percentages. + // As the coverture is low we set the limit low, as testing spec files increase, + // these thresholds need to increase accordingly. thresholds: { lines: 4, statements: 3, @@ -42,19 +54,26 @@ export default defineConfig({ branches: 1, }, }, + // Add largest component dependencies here + // This chunks together the largest libraries to avoid recurrent parsing and loading + // and increasing memory overhead. Good for CI. deps: { optimizer: { web: { enabled: true, - include: ["@mui/material", "lucide-react"], // Add your largest component dependencies here + include: ["uikit", "openseadragon", "material-design-icons"], }, }, }, + // This is the package responsible for simulating the DOM the other option is JSDOM + // Happy-dom is the most efficient in memory and its future proof for later node versions. environment: "happy-dom", - globals: true, + globals: true, // Probably good for Mixins + // This tells vitest to not skip loading these packages, + // and load them from the local node_modules at run time. server: { deps: { inline: ["vue", "@vue/test-utils", "pinia", "@pinia/testing"], @@ -62,6 +81,9 @@ export default defineConfig({ }, }, + // This is to enforce the use of specific packages versions on the testing. + // This one for example says to load explicitly the vue package at the project's level, + // and not the global vue if existing. resolve: { alias: { "@": path.resolve(__dirname, "./src"), From f85a46c1f8e6e1bc75811e47def25c99dde841dc Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 19 May 2026 00:27:00 -0600 Subject: [PATCH 19/23] ui_migration setup(CI) Add npm run lint:test to CI --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eb1d4a73..3b974a7a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -159,7 +159,8 @@ javascript-lint-and-test: script: - npm run lint - npm run lint:style - # The test run if only + - npm run lint:test + # The test runs only if a test spec file has changed - npm run test:unit artifacts: name: "vitest-coverage-$CI_COMMIT_REF_SLUG" From 656afd30d2d0dc09aef735fa2b5f4c6e73572e85 Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 19 May 2026 15:47:37 +0000 Subject: [PATCH 20/23] Apply suggestions from code review of branch webapp_unit_testing Co-authored-by: Beth Probert --- .gitlab-ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b974a7a..b9383f66 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -168,6 +168,11 @@ javascript-lint-and-test: expire_in: 1 week paths: - webapp/coverage/ + reports: + # Tells GitLab where to find the Cobertura file for MR integration + coverage_report: + coverage_format: cobertura + path: webapp/coverage/cobertura-coverage.xml # Build JS app build: From bf6dcebc16157458357d83ca2ba556e7c12afe3c Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 19 May 2026 09:51:18 -0600 Subject: [PATCH 21/23] Apply suggestions from code review of branch webapp_unit_testing Co-authored-by: @beth_probert --- .gitlab-ci.yml | 1 + webapp/vite.config.mjs | 7 ++++++- webapp/vitest.config.js | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b9383f66..35a9d11c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -174,6 +174,7 @@ javascript-lint-and-test: coverage_format: cobertura path: webapp/coverage/cobertura-coverage.xml + # Build JS app build: stage: build diff --git a/webapp/vite.config.mjs b/webapp/vite.config.mjs index a8542d50..37a19b7a 100644 --- a/webapp/vite.config.mjs +++ b/webapp/vite.config.mjs @@ -30,13 +30,18 @@ export default defineConfig(({ command, mode }) => { return { plugins: [ vue({ - // Block for removing data-test-id tags on npm run build + // Strip "data-test-id" attributes (used by Vitest) from the production build. + // This enforces separation of concerns and prevents developers from relying on + // test IDs for styling or core application logic. template: { compilerOptions: { + // Only apply this AST transformation during production builds nodeTransforms: isProduction ? [ (node) => { + // Check if the current AST node is an HTML element if (node.type === 1 /* NodeTypes.ELEMENT */) { + // Filter out any property named "data-test-id" node.props = node.props.filter((prop) => prop.name !== "data-test-id"); } }, diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index 41bf6348..a07d6ae7 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -39,7 +39,7 @@ export default defineConfig({ clean: true, cleanOnStart: true, // text gives output on STOUT and html creates an artifact - reporter: ["text", "html"], + reporter: ["text", "html", "cobertura"], all: true, // Files to include or exclude in coverage include: ["src/**/*.vue", "src/**/*.js"], From 63991b34256e047bf1fdec2345758a374bfd3a6f Mon Sep 17 00:00:00 2001 From: Antonio Anaya Date: Tue, 19 May 2026 18:30:14 -0600 Subject: [PATCH 22/23] ui_migration setup(nodejs) Fix prettier eslint configurations remove workarounds lint:test and lint:test:fix --- .gitlab-ci.yml | 1 - webapp/.prettierignore | 1 + webapp/eslint.config.mjs | 10 ++++++++-- webapp/package-lock.json | 26 +++++++++++++------------- webapp/package.json | 2 -- 5 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 webapp/.prettierignore diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 35a9d11c..448ab2f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -159,7 +159,6 @@ javascript-lint-and-test: script: - npm run lint - npm run lint:style - - npm run lint:test # The test runs only if a test spec file has changed - npm run test:unit artifacts: diff --git a/webapp/.prettierignore b/webapp/.prettierignore new file mode 100644 index 00000000..4b4d8631 --- /dev/null +++ b/webapp/.prettierignore @@ -0,0 +1 @@ +coverage/ \ No newline at end of file diff --git a/webapp/eslint.config.mjs b/webapp/eslint.config.mjs index 6f931bfa..73e0b41b 100644 --- a/webapp/eslint.config.mjs +++ b/webapp/eslint.config.mjs @@ -9,7 +9,13 @@ const isDev = process.env.NODE_ENV === "development"; export default [ { - ignores: ["dist/**/*", "lib/**/*", "**/*.min.js", "tools/architecture_dashboard/**/*"], + ignores: [ + "dist/**/*", + "lib/**/*", + "**/*.min.js", + "tools/architecture_dashboard/**/*", + "coverage/", + ], }, js.configs.recommended, @@ -17,7 +23,7 @@ export default [ ...vue.configs["flat/recommended"], { - files: ["**/*.vue", "**/*.js", "**/*.jsx", "**/*.cjs", "**/*.mjs"], + files: ["**/*.vue", "**/*.js", "**/*.jsx", "**/*.cjs", "**/*.mjs", "**/*.spec.js"], languageOptions: { ecmaVersion: 2021, sourceType: "module", diff --git a/webapp/package-lock.json b/webapp/package-lock.json index a1367b0d..e2a62a30 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -1749,9 +1749,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.0.tgz", - "integrity": "sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==", + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "dev": true, "license": "MIT", "dependencies": { @@ -3254,9 +3254,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.357", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", - "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", + "version": "1.5.360", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.360.tgz", + "integrity": "sha512-GkcBt6YYAw9SxFWn+xVar4cLVGlXVuswwtRLBozi2zp0GjXs4ZnOrqV4zbXzg35n7w81hCkyJNYicgXlVHAmBA==", "dev": true, "license": "ISC" }, @@ -5443,9 +5443,9 @@ } }, "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -5462,7 +5462,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -7009,9 +7009,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.0.tgz", - "integrity": "sha512-vwR8DDsBysI9NWXa0okPFpCcW+BUC3sPTuLBNo1faMzw4QWMFd+3/lFYFu29ZN0q+8UReXWJHEYesC9dcXYCLg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.1.tgz", + "integrity": "sha512-pu58kqxmVyEH6VfNYW1UyEfR3XAnJ27ZXT3yzXxxpjLxVzAbyC35Zk/nm/RMs7ijWnJNSd9fWkeex2OhUsx3MA==", "dev": true, "license": "MIT" }, diff --git a/webapp/package.json b/webapp/package.json index 8d5a9981..f9ab7758 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -16,8 +16,6 @@ "lint:fix": "eslint . --fix --ignore-pattern .gitignore", "lint:style": "stylelint \"src/**/*.{vue,less,css}\" --max-warnings=0", "lint:style:fix": "stylelint \"src/**/*.{vue,less,css}\" --fix", - "lint:test": "prettier -c src/tests/unit/*.spec.js", - "lint:test:fix": "prettier -w src/tests/unit/*.spec.js", "test:unit": "NODE_OPTIONS=--expose-gc vitest run src/tests/unit/ --no-cache --mode test --detectAsyncLeaks --coverage --isolate=true --pool=forks --silent --logHeapUsage" }, "dependencies": { From ad22d106a69b60d88f0034d8dd12f53974e2318b Mon Sep 17 00:00:00 2001 From: Julian Stirling Date: Wed, 20 May 2026 14:11:49 +0000 Subject: [PATCH 23/23] Apply suggestions from code review of branch webapp_unit_testing Co-authored-by: Beth Probert --- webapp/vite.config.mjs | 2 +- webapp/vitest.config.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/vite.config.mjs b/webapp/vite.config.mjs index 37a19b7a..c6f02b96 100644 --- a/webapp/vite.config.mjs +++ b/webapp/vite.config.mjs @@ -40,7 +40,7 @@ export default defineConfig(({ command, mode }) => { ? [ (node) => { // Check if the current AST node is an HTML element - if (node.type === 1 /* NodeTypes.ELEMENT */) { + if (node.type === 1) { // Filter out any property named "data-test-id" node.props = node.props.filter((prop) => prop.name !== "data-test-id"); } diff --git a/webapp/vitest.config.js b/webapp/vitest.config.js index a07d6ae7..3dcaa9a8 100644 --- a/webapp/vitest.config.js +++ b/webapp/vitest.config.js @@ -44,8 +44,8 @@ export default defineConfig({ // Files to include or exclude in coverage include: ["src/**/*.vue", "src/**/*.js"], exclude: [], - // These thresholds raise ERROR if the coverture it's under the provided percentages. - // As the coverture is low we set the limit low, as testing spec files increase, + // These thresholds raise ERROR if the coverage it's under the provided percentages. + // As the coverage is low we set the limit low, as testing spec files increase, // these thresholds need to increase accordingly. thresholds: { lines: 4,