From c408d5bf6dd11a95d2f707eb2b56800a3cf9965e Mon Sep 17 00:00:00 2001
From: alex
Date: Thu, 9 May 2024 22:48:29 +0200
Subject: [PATCH] readme
---
README.md | 2 +
template-old/01/docker-compose.yml | 42 -
.../backup/octoprint/octoprint/config.backup | 74 -
.../backup/octoprint/octoprint/config.yaml | 74 -
.../octoprint/data/achievements/2024.json | 22 -
.../octoprint/data/achievements/data.json | 39 -
.../octoprint/data/announcements/_blog.cache | Bin 1541 -> 0 bytes
.../data/announcements/_important.cache | Bin 2232 -> 0 bytes
.../data/announcements/_octopi.cache | Bin 1485 -> 0 bytes
.../data/announcements/_plugins.cache | Bin 2331 -> 0 bytes
.../data/announcements/_releases.cache | Bin 1519 -> 0 bytes
.../data/file_check/last_check_info.json | 1 -
.../octoprint/data/plugin_blacklist.yaml | 5 -
.../octoprint/data/pluginmanager/notices.json | 1 -
.../octoprint/data/pluginmanager/plugins.json | 1 -
.../data/preemptive_cache_config.yaml | 6 -
.../data/softwareupdate/versioncache.yaml | 73 -
.../generated/webassets/packed_client.js | 202 -
.../generated/webassets/packed_client.js.gz | Bin 11220 -> 0 bytes
.../generated/webassets/packed_core.css | 23 -
.../generated/webassets/packed_core.css.gz | Bin 14048 -> 0 bytes
.../generated/webassets/packed_core.js | 1908 --------
.../generated/webassets/packed_core.js.gz | Bin 155093 -> 0 bytes
.../generated/webassets/packed_libs.css | 508 --
.../generated/webassets/packed_libs.css.gz | Bin 56592 -> 0 bytes
.../generated/webassets/packed_libs.js | 4133 -----------------
.../generated/webassets/packed_libs.js.gz | Bin 438461 -> 0 bytes
.../generated/webassets/packed_plugins.js | 104 -
.../generated/webassets/packed_plugins.js.gz | Bin 1492 -> 0 bytes
.../backup/octoprint/octoprint/logs/auth.log | 3 -
.../octoprint/octoprint/logs/octoprint.log | 1030 ----
.../logs/plugin_bambu_printer_serial.log | 0
.../logs/plugin_pluginmanager_console.log | 102 -
.../logs/plugin_softwareupdate_console.log | 0
.../octoprint/octoprint/logs/serial.log | 1 -
.../logs/serial.log.2024-05-09_11-18-22 | 1 -
.../logs/serial.log.2024-05-09_11-47-18 | 1 -
.../logs/serial.log.2024-05-09_11-53-18 | 1 -
.../octoprint/octoprint/logs/tornado.log | 1375 ------
.../printerProfiles/_default.profile | 34 -
.../backup/octoprint/octoprint/users.yaml | 13 -
.../INSTALLER | 1 -
.../METADATA | 14 -
.../RECORD | 18 -
.../REQUESTED | 0
.../WHEEL | 6 -
.../direct_url.json | 1 -
.../entry_points.txt | 2 -
.../top_level.txt | 1 -
.../__pycache__/six.cpython-310.pyc | Bin 27550 -> 0 bytes
.../site-packages/dateutil/__init__.py | 24 -
.../__pycache__/__init__.cpython-310.pyc | Bin 928 -> 0 bytes
.../__pycache__/_common.cpython-310.pyc | Bin 1408 -> 0 bytes
.../__pycache__/_version.cpython-310.pyc | Bin 262 -> 0 bytes
.../__pycache__/easter.cpython-310.pyc | Bin 2192 -> 0 bytes
.../__pycache__/relativedelta.cpython-310.pyc | Bin 15722 -> 0 bytes
.../__pycache__/rrule.cpython-310.pyc | Bin 43284 -> 0 bytes
.../__pycache__/tzwin.cpython-310.pyc | Bin 181 -> 0 bytes
.../__pycache__/utils.cpython-310.pyc | Bin 2245 -> 0 bytes
.../site-packages/dateutil/_common.py | 43 -
.../site-packages/dateutil/_version.py | 4 -
.../site-packages/dateutil/easter.py | 89 -
.../site-packages/dateutil/parser/__init__.py | 61 -
.../__pycache__/__init__.cpython-310.pyc | Bin 2056 -> 0 bytes
.../__pycache__/_parser.cpython-310.pyc | Bin 40491 -> 0 bytes
.../__pycache__/isoparser.cpython-310.pyc | Bin 11288 -> 0 bytes
.../site-packages/dateutil/parser/_parser.py | 1613 -------
.../dateutil/parser/isoparser.py | 416 --
.../site-packages/dateutil/relativedelta.py | 599 ---
.../site-packages/dateutil/rrule.py | 1737 -------
.../site-packages/dateutil/tz/__init__.py | 12 -
.../tz/__pycache__/__init__.cpython-310.pyc | Bin 654 -> 0 bytes
.../tz/__pycache__/_common.cpython-310.pyc | Bin 10740 -> 0 bytes
.../tz/__pycache__/_factories.cpython-310.pyc | Bin 2923 -> 0 bytes
.../tz/__pycache__/tz.cpython-310.pyc | Bin 44905 -> 0 bytes
.../tz/__pycache__/win.cpython-310.pyc | Bin 11418 -> 0 bytes
.../site-packages/dateutil/tz/_common.py | 419 --
.../site-packages/dateutil/tz/_factories.py | 80 -
.../site-packages/dateutil/tz/tz.py | 1849 --------
.../site-packages/dateutil/tz/win.py | 370 --
.../site-packages/dateutil/tzwin.py | 2 -
.../site-packages/dateutil/utils.py | 71 -
.../dateutil/zoneinfo/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 5749 -> 0 bytes
.../__pycache__/rebuild.cpython-310.pyc | Bin 2676 -> 0 bytes
.../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 156400 -> 0 bytes
.../dateutil/zoneinfo/rebuild.py | 75 -
.../octoprint_bambu_printer/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 6155 -> 0 bytes
.../__pycache__/virtual.cpython-310.pyc | Bin 29620 -> 0 bytes
.../ftpsclient/__init__.py | 1 -
.../__pycache__/__init__.cpython-310.pyc | Bin 235 -> 0 bytes
.../__pycache__/ftpsclient.cpython-310.pyc | Bin 7517 -> 0 bytes
.../ftpsclient/ftpsclient.py | 228 -
.../static/js/bambu_printer.js | 92 -
.../templates/bambu_printer_settings.jinja2 | 78 -
.../octoprint_bambu_printer/virtual.py | 1063 -----
.../python3.10/site-packages/paho/__init__.py | 0
.../paho/__pycache__/__init__.cpython-310.pyc | Bin 157 -> 0 bytes
.../site-packages/paho/mqtt/__init__.py | 5 -
.../mqtt/__pycache__/__init__.cpython-310.pyc | Bin 358 -> 0 bytes
.../mqtt/__pycache__/client.cpython-310.pyc | Bin 109114 -> 0 bytes
.../mqtt/__pycache__/matcher.cpython-310.pyc | Bin 2878 -> 0 bytes
.../__pycache__/packettypes.cpython-310.pyc | Bin 1642 -> 0 bytes
.../__pycache__/properties.cpython-310.pyc | Bin 12577 -> 0 bytes
.../mqtt/__pycache__/publish.cpython-310.pyc | Bin 8543 -> 0 bytes
.../__pycache__/reasoncodes.cpython-310.pyc | Bin 6696 -> 0 bytes
.../__pycache__/subscribe.cpython-310.pyc | Bin 9673 -> 0 bytes
.../subscribeoptions.cpython-310.pyc | Bin 4688 -> 0 bytes
.../site-packages/paho/mqtt/client.py | 3989 ----------------
.../site-packages/paho/mqtt/matcher.py | 78 -
.../site-packages/paho/mqtt/packettypes.py | 43 -
.../site-packages/paho/mqtt/properties.py | 438 --
.../site-packages/paho/mqtt/publish.py | 241 -
.../site-packages/paho/mqtt/reasoncodes.py | 192 -
.../site-packages/paho/mqtt/subscribe.py | 274 --
.../paho/mqtt/subscribeoptions.py | 110 -
.../paho_mqtt-1.6.1.dist-info/INSTALLER | 1 -
.../paho_mqtt-1.6.1.dist-info/LICENSE.txt | 3 -
.../paho_mqtt-1.6.1.dist-info/METADATA | 1509 ------
.../paho_mqtt-1.6.1.dist-info/RECORD | 26 -
.../paho_mqtt-1.6.1.dist-info/WHEEL | 5 -
.../paho_mqtt-1.6.1.dist-info/top_level.txt | 1 -
.../pybambu-1.0.1.dist-info/INSTALLER | 1 -
.../pybambu-1.0.1.dist-info/METADATA | 42 -
.../pybambu-1.0.1.dist-info/RECORD | 19 -
.../pybambu-1.0.1.dist-info/WHEEL | 5 -
.../pybambu-1.0.1.dist-info/top_level.txt | 1 -
.../site-packages/pybambu/__init__.py | 4 -
.../__pycache__/__init__.cpython-310.pyc | Bin 298 -> 0 bytes
.../__pycache__/bambu_client.cpython-310.pyc | Bin 15371 -> 0 bytes
.../__pycache__/bambu_cloud.cpython-310.pyc | Bin 5108 -> 0 bytes
.../__pycache__/commands.cpython-310.pyc | Bin 891 -> 0 bytes
.../pybambu/__pycache__/const.cpython-310.pyc | Bin 15635 -> 0 bytes
.../__pycache__/models.cpython-310.pyc | Bin 28589 -> 0 bytes
.../pybambu/__pycache__/utils.cpython-310.pyc | Bin 6065 -> 0 bytes
.../site-packages/pybambu/bambu_client.py | 521 ---
.../site-packages/pybambu/bambu_cloud.py | 209 -
.../site-packages/pybambu/commands.py | 24 -
.../python3.10/site-packages/pybambu/const.py | 323 --
.../site-packages/pybambu/models.py | 1295 ------
.../python3.10/site-packages/pybambu/utils.py | 188 -
.../INSTALLER | 1 -
.../LICENSE | 54 -
.../METADATA | 204 -
.../RECORD | 44 -
.../WHEEL | 6 -
.../top_level.txt | 1 -
.../zip-safe | 1 -
.../six-1.16.0.dist-info/INSTALLER | 1 -
.../six-1.16.0.dist-info/LICENSE | 18 -
.../six-1.16.0.dist-info/METADATA | 49 -
.../site-packages/six-1.16.0.dist-info/RECORD | 8 -
.../site-packages/six-1.16.0.dist-info/WHEEL | 6 -
.../six-1.16.0.dist-info/top_level.txt | 1 -
.../lib/python3.10/site-packages/six.py | 998 ----
template-old/backup/octoprint_backup.tar | Bin 5836800 -> 0 bytes
template-old/create-instance.sh | 20 -
template-old/docker-compose.yml | 41 -
template-old/test/Dockerfile | 3 -
template-old/test/docker-compose.yml | 16 -
.../test/octoprint/octoprint/config.backup | 74 -
.../test/octoprint/octoprint/config.yaml | 74 -
.../octoprint/data/achievements/2024.json | 22 -
.../octoprint/data/achievements/data.json | 39 -
.../octoprint/data/announcements/_blog.cache | Bin 1541 -> 0 bytes
.../data/announcements/_important.cache | Bin 2232 -> 0 bytes
.../data/announcements/_octopi.cache | Bin 1485 -> 0 bytes
.../data/announcements/_plugins.cache | Bin 2331 -> 0 bytes
.../data/announcements/_releases.cache | Bin 1519 -> 0 bytes
.../data/file_check/last_check_info.json | 1 -
.../octoprint/data/plugin_blacklist.yaml | 5 -
.../octoprint/data/pluginmanager/notices.json | 1 -
.../octoprint/data/pluginmanager/plugins.json | 1 -
.../data/preemptive_cache_config.yaml | 6 -
.../data/softwareupdate/versioncache.yaml | 73 -
.../generated/webassets/packed_client.js | 202 -
.../generated/webassets/packed_client.js.gz | Bin 11220 -> 0 bytes
.../generated/webassets/packed_core.css | 23 -
.../generated/webassets/packed_core.css.gz | Bin 14048 -> 0 bytes
.../generated/webassets/packed_core.js | 1908 --------
.../generated/webassets/packed_core.js.gz | Bin 155093 -> 0 bytes
.../generated/webassets/packed_libs.css | 508 --
.../generated/webassets/packed_libs.css.gz | Bin 56592 -> 0 bytes
.../generated/webassets/packed_libs.js | 4133 -----------------
.../generated/webassets/packed_libs.js.gz | Bin 438461 -> 0 bytes
.../generated/webassets/packed_plugins.js | 104 -
.../generated/webassets/packed_plugins.js.gz | Bin 1492 -> 0 bytes
.../test/octoprint/octoprint/logs/auth.log | 3 -
.../octoprint/octoprint/logs/octoprint.log | 1030 ----
.../logs/plugin_bambu_printer_serial.log | 0
.../logs/plugin_pluginmanager_console.log | 102 -
.../logs/plugin_softwareupdate_console.log | 0
.../test/octoprint/octoprint/logs/serial.log | 1 -
.../logs/serial.log.2024-05-09_11-18-22 | 1 -
.../logs/serial.log.2024-05-09_11-47-18 | 1 -
.../logs/serial.log.2024-05-09_11-53-18 | 1 -
.../test/octoprint/octoprint/logs/tornado.log | 1375 ------
.../printerProfiles/_default.profile | 34 -
.../test/octoprint/octoprint/users.yaml | 13 -
.../INSTALLER | 1 -
.../METADATA | 14 -
.../RECORD | 18 -
.../REQUESTED | 0
.../WHEEL | 6 -
.../direct_url.json | 1 -
.../entry_points.txt | 2 -
.../top_level.txt | 1 -
.../__pycache__/six.cpython-310.pyc | Bin 27550 -> 0 bytes
.../site-packages/dateutil/__init__.py | 24 -
.../__pycache__/__init__.cpython-310.pyc | Bin 928 -> 0 bytes
.../__pycache__/_common.cpython-310.pyc | Bin 1408 -> 0 bytes
.../__pycache__/_version.cpython-310.pyc | Bin 262 -> 0 bytes
.../__pycache__/easter.cpython-310.pyc | Bin 2192 -> 0 bytes
.../__pycache__/relativedelta.cpython-310.pyc | Bin 15722 -> 0 bytes
.../__pycache__/rrule.cpython-310.pyc | Bin 43284 -> 0 bytes
.../__pycache__/tzwin.cpython-310.pyc | Bin 181 -> 0 bytes
.../__pycache__/utils.cpython-310.pyc | Bin 2245 -> 0 bytes
.../site-packages/dateutil/_common.py | 43 -
.../site-packages/dateutil/_version.py | 4 -
.../site-packages/dateutil/easter.py | 89 -
.../site-packages/dateutil/parser/__init__.py | 61 -
.../__pycache__/__init__.cpython-310.pyc | Bin 2056 -> 0 bytes
.../__pycache__/_parser.cpython-310.pyc | Bin 40491 -> 0 bytes
.../__pycache__/isoparser.cpython-310.pyc | Bin 11288 -> 0 bytes
.../site-packages/dateutil/parser/_parser.py | 1613 -------
.../dateutil/parser/isoparser.py | 416 --
.../site-packages/dateutil/relativedelta.py | 599 ---
.../site-packages/dateutil/rrule.py | 1737 -------
.../site-packages/dateutil/tz/__init__.py | 12 -
.../tz/__pycache__/__init__.cpython-310.pyc | Bin 654 -> 0 bytes
.../tz/__pycache__/_common.cpython-310.pyc | Bin 10740 -> 0 bytes
.../tz/__pycache__/_factories.cpython-310.pyc | Bin 2923 -> 0 bytes
.../tz/__pycache__/tz.cpython-310.pyc | Bin 44905 -> 0 bytes
.../tz/__pycache__/win.cpython-310.pyc | Bin 11418 -> 0 bytes
.../site-packages/dateutil/tz/_common.py | 419 --
.../site-packages/dateutil/tz/_factories.py | 80 -
.../site-packages/dateutil/tz/tz.py | 1849 --------
.../site-packages/dateutil/tz/win.py | 370 --
.../site-packages/dateutil/tzwin.py | 2 -
.../site-packages/dateutil/utils.py | 71 -
.../dateutil/zoneinfo/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 5749 -> 0 bytes
.../__pycache__/rebuild.cpython-310.pyc | Bin 2676 -> 0 bytes
.../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 156400 -> 0 bytes
.../dateutil/zoneinfo/rebuild.py | 75 -
.../octoprint_bambu_printer/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 6155 -> 0 bytes
.../__pycache__/virtual.cpython-310.pyc | Bin 29620 -> 0 bytes
.../ftpsclient/__init__.py | 1 -
.../__pycache__/__init__.cpython-310.pyc | Bin 235 -> 0 bytes
.../__pycache__/ftpsclient.cpython-310.pyc | Bin 7517 -> 0 bytes
.../ftpsclient/ftpsclient.py | 228 -
.../static/js/bambu_printer.js | 92 -
.../templates/bambu_printer_settings.jinja2 | 78 -
.../octoprint_bambu_printer/virtual.py | 1063 -----
.../python3.10/site-packages/paho/__init__.py | 0
.../paho/__pycache__/__init__.cpython-310.pyc | Bin 157 -> 0 bytes
.../site-packages/paho/mqtt/__init__.py | 5 -
.../mqtt/__pycache__/__init__.cpython-310.pyc | Bin 358 -> 0 bytes
.../mqtt/__pycache__/client.cpython-310.pyc | Bin 109114 -> 0 bytes
.../mqtt/__pycache__/matcher.cpython-310.pyc | Bin 2878 -> 0 bytes
.../__pycache__/packettypes.cpython-310.pyc | Bin 1642 -> 0 bytes
.../__pycache__/properties.cpython-310.pyc | Bin 12577 -> 0 bytes
.../mqtt/__pycache__/publish.cpython-310.pyc | Bin 8543 -> 0 bytes
.../__pycache__/reasoncodes.cpython-310.pyc | Bin 6696 -> 0 bytes
.../__pycache__/subscribe.cpython-310.pyc | Bin 9673 -> 0 bytes
.../subscribeoptions.cpython-310.pyc | Bin 4688 -> 0 bytes
.../site-packages/paho/mqtt/client.py | 3989 ----------------
.../site-packages/paho/mqtt/matcher.py | 78 -
.../site-packages/paho/mqtt/packettypes.py | 43 -
.../site-packages/paho/mqtt/properties.py | 438 --
.../site-packages/paho/mqtt/publish.py | 241 -
.../site-packages/paho/mqtt/reasoncodes.py | 192 -
.../site-packages/paho/mqtt/subscribe.py | 274 --
.../paho/mqtt/subscribeoptions.py | 110 -
.../paho_mqtt-1.6.1.dist-info/INSTALLER | 1 -
.../paho_mqtt-1.6.1.dist-info/LICENSE.txt | 3 -
.../paho_mqtt-1.6.1.dist-info/METADATA | 1509 ------
.../paho_mqtt-1.6.1.dist-info/RECORD | 26 -
.../paho_mqtt-1.6.1.dist-info/WHEEL | 5 -
.../paho_mqtt-1.6.1.dist-info/top_level.txt | 1 -
.../pybambu-1.0.1.dist-info/INSTALLER | 1 -
.../pybambu-1.0.1.dist-info/METADATA | 42 -
.../pybambu-1.0.1.dist-info/RECORD | 19 -
.../pybambu-1.0.1.dist-info/WHEEL | 5 -
.../pybambu-1.0.1.dist-info/top_level.txt | 1 -
.../site-packages/pybambu/__init__.py | 4 -
.../__pycache__/__init__.cpython-310.pyc | Bin 298 -> 0 bytes
.../__pycache__/bambu_client.cpython-310.pyc | Bin 15371 -> 0 bytes
.../__pycache__/bambu_cloud.cpython-310.pyc | Bin 5108 -> 0 bytes
.../__pycache__/commands.cpython-310.pyc | Bin 891 -> 0 bytes
.../pybambu/__pycache__/const.cpython-310.pyc | Bin 15635 -> 0 bytes
.../__pycache__/models.cpython-310.pyc | Bin 28589 -> 0 bytes
.../pybambu/__pycache__/utils.cpython-310.pyc | Bin 6065 -> 0 bytes
.../site-packages/pybambu/bambu_client.py | 521 ---
.../site-packages/pybambu/bambu_cloud.py | 209 -
.../site-packages/pybambu/commands.py | 24 -
.../python3.10/site-packages/pybambu/const.py | 323 --
.../site-packages/pybambu/models.py | 1295 ------
.../python3.10/site-packages/pybambu/utils.py | 188 -
.../INSTALLER | 1 -
.../LICENSE | 54 -
.../METADATA | 204 -
.../RECORD | 44 -
.../WHEEL | 6 -
.../top_level.txt | 1 -
.../zip-safe | 1 -
.../six-1.16.0.dist-info/INSTALLER | 1 -
.../six-1.16.0.dist-info/LICENSE | 18 -
.../six-1.16.0.dist-info/METADATA | 49 -
.../site-packages/six-1.16.0.dist-info/RECORD | 8 -
.../site-packages/six-1.16.0.dist-info/WHEEL | 6 -
.../six-1.16.0.dist-info/top_level.txt | 1 -
.../lib/python3.10/site-packages/six.py | 998 ----
.../octoprint_test_01/octoprint/config.backup | 23 -
.../octoprint_test_01/octoprint/config.yaml | 23 -
.../octoprint/data/achievements/2024.json | 22 -
.../octoprint/data/achievements/data.json | 39 -
.../octoprint/data/announcements/_blog.cache | Bin 1540 -> 0 bytes
.../data/announcements/_important.cache | Bin 2234 -> 0 bytes
.../data/announcements/_octopi.cache | Bin 1486 -> 0 bytes
.../data/announcements/_plugins.cache | Bin 2335 -> 0 bytes
.../data/announcements/_releases.cache | Bin 1522 -> 0 bytes
.../octoprint/data/pluginmanager/notices.json | 1 -
.../octoprint/data/pluginmanager/plugins.json | 1 -
.../data/preemptive_cache_config.yaml | 6 -
.../data/softwareupdate/versioncache.yaml | 55 -
.../generated/webassets/packed_client.js | 202 -
.../generated/webassets/packed_client.js.gz | Bin 11220 -> 0 bytes
.../generated/webassets/packed_core.css | 28 -
.../generated/webassets/packed_core.css.gz | Bin 14083 -> 0 bytes
.../generated/webassets/packed_core.js | 1922 --------
.../generated/webassets/packed_core.js.gz | Bin 156181 -> 0 bytes
.../generated/webassets/packed_libs.css | 508 --
.../generated/webassets/packed_libs.css.gz | Bin 56592 -> 0 bytes
.../generated/webassets/packed_libs.js | 4133 -----------------
.../generated/webassets/packed_libs.js.gz | Bin 438461 -> 0 bytes
.../octoprint_test_01/octoprint/logs/auth.log | 0
.../octoprint/logs/octoprint.log | 111 -
.../logs/plugin_pluginmanager_console.log | 0
.../logs/plugin_softwareupdate_console.log | 0
.../octoprint/logs/tornado.log | 34 -
.../octoprint/octoprint/config.backup | 74 -
.../octoprint/octoprint/config.yaml | 74 -
.../octoprint/data/achievements/2024.json | 22 -
.../octoprint/data/achievements/data.json | 39 -
.../octoprint/data/announcements/_blog.cache | Bin 1541 -> 0 bytes
.../data/announcements/_important.cache | Bin 2232 -> 0 bytes
.../data/announcements/_octopi.cache | Bin 1485 -> 0 bytes
.../data/announcements/_plugins.cache | Bin 2331 -> 0 bytes
.../data/announcements/_releases.cache | Bin 1519 -> 0 bytes
.../data/file_check/last_check_info.json | 1 -
.../octoprint/data/plugin_blacklist.yaml | 5 -
.../octoprint/data/pluginmanager/notices.json | 1 -
.../octoprint/data/pluginmanager/plugins.json | 1 -
.../data/preemptive_cache_config.yaml | 6 -
.../data/softwareupdate/versioncache.yaml | 73 -
.../generated/webassets/packed_client.js | 202 -
.../generated/webassets/packed_client.js.gz | Bin 11220 -> 0 bytes
.../generated/webassets/packed_core.css | 23 -
.../generated/webassets/packed_core.css.gz | Bin 14048 -> 0 bytes
.../generated/webassets/packed_core.js | 1908 --------
.../generated/webassets/packed_core.js.gz | Bin 155093 -> 0 bytes
.../generated/webassets/packed_libs.css | 508 --
.../generated/webassets/packed_libs.css.gz | Bin 56592 -> 0 bytes
.../generated/webassets/packed_libs.js | 4133 -----------------
.../generated/webassets/packed_libs.js.gz | Bin 438461 -> 0 bytes
.../generated/webassets/packed_plugins.js | 104 -
.../generated/webassets/packed_plugins.js.gz | Bin 1492 -> 0 bytes
.../octoprint/octoprint/logs/auth.log | 3 -
.../octoprint/octoprint/logs/octoprint.log | 1030 ----
.../logs/plugin_bambu_printer_serial.log | 0
.../logs/plugin_pluginmanager_console.log | 102 -
.../logs/plugin_softwareupdate_console.log | 0
.../octoprint/octoprint/logs/serial.log | 1 -
.../logs/serial.log.2024-05-09_11-18-22 | 1 -
.../logs/serial.log.2024-05-09_11-47-18 | 1 -
.../logs/serial.log.2024-05-09_11-53-18 | 1 -
.../octoprint/octoprint/logs/tornado.log | 1375 ------
.../printerProfiles/_default.profile | 34 -
.../octoprint/octoprint/users.yaml | 13 -
.../INSTALLER | 1 -
.../METADATA | 14 -
.../RECORD | 18 -
.../REQUESTED | 0
.../WHEEL | 6 -
.../direct_url.json | 1 -
.../entry_points.txt | 2 -
.../top_level.txt | 1 -
.../__pycache__/six.cpython-310.pyc | Bin 27550 -> 0 bytes
.../site-packages/dateutil/__init__.py | 24 -
.../__pycache__/__init__.cpython-310.pyc | Bin 928 -> 0 bytes
.../__pycache__/_common.cpython-310.pyc | Bin 1408 -> 0 bytes
.../__pycache__/_version.cpython-310.pyc | Bin 262 -> 0 bytes
.../__pycache__/easter.cpython-310.pyc | Bin 2192 -> 0 bytes
.../__pycache__/relativedelta.cpython-310.pyc | Bin 15722 -> 0 bytes
.../__pycache__/rrule.cpython-310.pyc | Bin 43284 -> 0 bytes
.../__pycache__/tzwin.cpython-310.pyc | Bin 181 -> 0 bytes
.../__pycache__/utils.cpython-310.pyc | Bin 2245 -> 0 bytes
.../site-packages/dateutil/_common.py | 43 -
.../site-packages/dateutil/_version.py | 4 -
.../site-packages/dateutil/easter.py | 89 -
.../site-packages/dateutil/parser/__init__.py | 61 -
.../__pycache__/__init__.cpython-310.pyc | Bin 2056 -> 0 bytes
.../__pycache__/_parser.cpython-310.pyc | Bin 40491 -> 0 bytes
.../__pycache__/isoparser.cpython-310.pyc | Bin 11288 -> 0 bytes
.../site-packages/dateutil/parser/_parser.py | 1613 -------
.../dateutil/parser/isoparser.py | 416 --
.../site-packages/dateutil/relativedelta.py | 599 ---
.../site-packages/dateutil/rrule.py | 1737 -------
.../site-packages/dateutil/tz/__init__.py | 12 -
.../tz/__pycache__/__init__.cpython-310.pyc | Bin 654 -> 0 bytes
.../tz/__pycache__/_common.cpython-310.pyc | Bin 10740 -> 0 bytes
.../tz/__pycache__/_factories.cpython-310.pyc | Bin 2923 -> 0 bytes
.../tz/__pycache__/tz.cpython-310.pyc | Bin 44905 -> 0 bytes
.../tz/__pycache__/win.cpython-310.pyc | Bin 11418 -> 0 bytes
.../site-packages/dateutil/tz/_common.py | 419 --
.../site-packages/dateutil/tz/_factories.py | 80 -
.../site-packages/dateutil/tz/tz.py | 1849 --------
.../site-packages/dateutil/tz/win.py | 370 --
.../site-packages/dateutil/tzwin.py | 2 -
.../site-packages/dateutil/utils.py | 71 -
.../dateutil/zoneinfo/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 5749 -> 0 bytes
.../__pycache__/rebuild.cpython-310.pyc | Bin 2676 -> 0 bytes
.../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 156400 -> 0 bytes
.../dateutil/zoneinfo/rebuild.py | 75 -
.../octoprint_bambu_printer/__init__.py | 167 -
.../__pycache__/__init__.cpython-310.pyc | Bin 6155 -> 0 bytes
.../__pycache__/virtual.cpython-310.pyc | Bin 29620 -> 0 bytes
.../ftpsclient/__init__.py | 1 -
.../__pycache__/__init__.cpython-310.pyc | Bin 235 -> 0 bytes
.../__pycache__/ftpsclient.cpython-310.pyc | Bin 7517 -> 0 bytes
.../ftpsclient/ftpsclient.py | 228 -
.../static/js/bambu_printer.js | 92 -
.../templates/bambu_printer_settings.jinja2 | 78 -
.../octoprint_bambu_printer/virtual.py | 1063 -----
.../python3.10/site-packages/paho/__init__.py | 0
.../paho/__pycache__/__init__.cpython-310.pyc | Bin 157 -> 0 bytes
.../site-packages/paho/mqtt/__init__.py | 5 -
.../mqtt/__pycache__/__init__.cpython-310.pyc | Bin 358 -> 0 bytes
.../mqtt/__pycache__/client.cpython-310.pyc | Bin 109114 -> 0 bytes
.../mqtt/__pycache__/matcher.cpython-310.pyc | Bin 2878 -> 0 bytes
.../__pycache__/packettypes.cpython-310.pyc | Bin 1642 -> 0 bytes
.../__pycache__/properties.cpython-310.pyc | Bin 12577 -> 0 bytes
.../mqtt/__pycache__/publish.cpython-310.pyc | Bin 8543 -> 0 bytes
.../__pycache__/reasoncodes.cpython-310.pyc | Bin 6696 -> 0 bytes
.../__pycache__/subscribe.cpython-310.pyc | Bin 9673 -> 0 bytes
.../subscribeoptions.cpython-310.pyc | Bin 4688 -> 0 bytes
.../site-packages/paho/mqtt/client.py | 3989 ----------------
.../site-packages/paho/mqtt/matcher.py | 78 -
.../site-packages/paho/mqtt/packettypes.py | 43 -
.../site-packages/paho/mqtt/properties.py | 438 --
.../site-packages/paho/mqtt/publish.py | 241 -
.../site-packages/paho/mqtt/reasoncodes.py | 192 -
.../site-packages/paho/mqtt/subscribe.py | 274 --
.../paho/mqtt/subscribeoptions.py | 110 -
.../paho_mqtt-1.6.1.dist-info/INSTALLER | 1 -
.../paho_mqtt-1.6.1.dist-info/LICENSE.txt | 3 -
.../paho_mqtt-1.6.1.dist-info/METADATA | 1509 ------
.../paho_mqtt-1.6.1.dist-info/RECORD | 26 -
.../paho_mqtt-1.6.1.dist-info/WHEEL | 5 -
.../paho_mqtt-1.6.1.dist-info/top_level.txt | 1 -
.../pybambu-1.0.1.dist-info/INSTALLER | 1 -
.../pybambu-1.0.1.dist-info/METADATA | 42 -
.../pybambu-1.0.1.dist-info/RECORD | 19 -
.../pybambu-1.0.1.dist-info/WHEEL | 5 -
.../pybambu-1.0.1.dist-info/top_level.txt | 1 -
.../site-packages/pybambu/__init__.py | 4 -
.../__pycache__/__init__.cpython-310.pyc | Bin 298 -> 0 bytes
.../__pycache__/bambu_client.cpython-310.pyc | Bin 15371 -> 0 bytes
.../__pycache__/bambu_cloud.cpython-310.pyc | Bin 5108 -> 0 bytes
.../__pycache__/commands.cpython-310.pyc | Bin 891 -> 0 bytes
.../pybambu/__pycache__/const.cpython-310.pyc | Bin 15635 -> 0 bytes
.../__pycache__/models.cpython-310.pyc | Bin 28589 -> 0 bytes
.../pybambu/__pycache__/utils.cpython-310.pyc | Bin 6065 -> 0 bytes
.../site-packages/pybambu/bambu_client.py | 521 ---
.../site-packages/pybambu/bambu_cloud.py | 209 -
.../site-packages/pybambu/commands.py | 24 -
.../python3.10/site-packages/pybambu/const.py | 323 --
.../site-packages/pybambu/models.py | 1295 ------
.../python3.10/site-packages/pybambu/utils.py | 188 -
.../INSTALLER | 1 -
.../LICENSE | 54 -
.../METADATA | 204 -
.../RECORD | 44 -
.../WHEEL | 6 -
.../top_level.txt | 1 -
.../zip-safe | 1 -
.../six-1.16.0.dist-info/INSTALLER | 1 -
.../six-1.16.0.dist-info/LICENSE | 18 -
.../six-1.16.0.dist-info/METADATA | 49 -
.../site-packages/six-1.16.0.dist-info/RECORD | 8 -
.../site-packages/six-1.16.0.dist-info/WHEEL | 6 -
.../six-1.16.0.dist-info/top_level.txt | 1 -
.../lib/python3.10/site-packages/six.py | 998 ----
.../printerProfiles/_default.profile | 34 -
498 files changed, 2 insertions(+), 97195 deletions(-)
create mode 100644 README.md
delete mode 100644 template-old/01/docker-compose.yml
delete mode 100644 template-old/backup/octoprint/octoprint/config.backup
delete mode 100644 template-old/backup/octoprint/octoprint/config.yaml
delete mode 100644 template-old/backup/octoprint/octoprint/data/achievements/2024.json
delete mode 100644 template-old/backup/octoprint/octoprint/data/achievements/data.json
delete mode 100644 template-old/backup/octoprint/octoprint/data/announcements/_blog.cache
delete mode 100644 template-old/backup/octoprint/octoprint/data/announcements/_important.cache
delete mode 100644 template-old/backup/octoprint/octoprint/data/announcements/_octopi.cache
delete mode 100644 template-old/backup/octoprint/octoprint/data/announcements/_plugins.cache
delete mode 100644 template-old/backup/octoprint/octoprint/data/announcements/_releases.cache
delete mode 100644 template-old/backup/octoprint/octoprint/data/file_check/last_check_info.json
delete mode 100644 template-old/backup/octoprint/octoprint/data/plugin_blacklist.yaml
delete mode 100644 template-old/backup/octoprint/octoprint/data/pluginmanager/notices.json
delete mode 100644 template-old/backup/octoprint/octoprint/data/pluginmanager/plugins.json
delete mode 100644 template-old/backup/octoprint/octoprint/data/preemptive_cache_config.yaml
delete mode 100644 template-old/backup/octoprint/octoprint/data/softwareupdate/versioncache.yaml
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_client.js
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_client.js.gz
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css.gz
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_core.js
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_core.js.gz
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_libs.css
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_libs.css.gz
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_libs.js
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_libs.js.gz
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_plugins.js
delete mode 100644 template-old/backup/octoprint/octoprint/generated/webassets/packed_plugins.js.gz
delete mode 100644 template-old/backup/octoprint/octoprint/logs/auth.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/octoprint.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/plugin_bambu_printer_serial.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/plugin_pluginmanager_console.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/plugin_softwareupdate_console.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/serial.log
delete mode 100644 template-old/backup/octoprint/octoprint/logs/serial.log.2024-05-09_11-18-22
delete mode 100644 template-old/backup/octoprint/octoprint/logs/serial.log.2024-05-09_11-47-18
delete mode 100644 template-old/backup/octoprint/octoprint/logs/serial.log.2024-05-09_11-53-18
delete mode 100644 template-old/backup/octoprint/octoprint/logs/tornado.log
delete mode 100644 template-old/backup/octoprint/octoprint/printerProfiles/_default.profile
delete mode 100644 template-old/backup/octoprint/octoprint/users.yaml
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/INSTALLER
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/METADATA
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/RECORD
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/REQUESTED
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/WHEEL
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/direct_url.json
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/entry_points.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/top_level.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_version.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/easter.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/relativedelta.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/_common.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/_version.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/easter.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/isoparser.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/_parser.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/isoparser.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/relativedelta.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/rrule.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_factories.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/win.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_common.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_factories.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/tz.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/win.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/tzwin.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/utils.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/rebuild.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/virtual.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/ftpsclient.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/ftpsclient.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/static/js/bambu_printer.js
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/templates/bambu_printer_settings.jinja2
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/virtual.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/client.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/matcher.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/packettypes.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/properties.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/publish.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/reasoncodes.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribe.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribeoptions.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/client.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/matcher.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/packettypes.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/properties.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/publish.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/reasoncodes.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribe.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribeoptions.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/INSTALLER
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/LICENSE.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/METADATA
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/RECORD
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/WHEEL
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/top_level.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/INSTALLER
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/METADATA
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/RECORD
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/WHEEL
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/top_level.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__init__.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_client.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_cloud.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/commands.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/const.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/models.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_client.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_cloud.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/commands.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/const.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/models.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/pybambu/utils.py
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/INSTALLER
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/LICENSE
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/METADATA
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/RECORD
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/WHEEL
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/zip-safe
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/INSTALLER
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/LICENSE
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/METADATA
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/RECORD
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/WHEEL
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/top_level.txt
delete mode 100644 template-old/backup/octoprint/plugins/lib/python3.10/site-packages/six.py
delete mode 100644 template-old/backup/octoprint_backup.tar
delete mode 100755 template-old/create-instance.sh
delete mode 100644 template-old/docker-compose.yml
delete mode 100644 template-old/test/Dockerfile
delete mode 100644 template-old/test/docker-compose.yml
delete mode 100644 template-old/test/octoprint/octoprint/config.backup
delete mode 100644 template-old/test/octoprint/octoprint/config.yaml
delete mode 100644 template-old/test/octoprint/octoprint/data/achievements/2024.json
delete mode 100644 template-old/test/octoprint/octoprint/data/achievements/data.json
delete mode 100644 template-old/test/octoprint/octoprint/data/announcements/_blog.cache
delete mode 100644 template-old/test/octoprint/octoprint/data/announcements/_important.cache
delete mode 100644 template-old/test/octoprint/octoprint/data/announcements/_octopi.cache
delete mode 100644 template-old/test/octoprint/octoprint/data/announcements/_plugins.cache
delete mode 100644 template-old/test/octoprint/octoprint/data/announcements/_releases.cache
delete mode 100644 template-old/test/octoprint/octoprint/data/file_check/last_check_info.json
delete mode 100644 template-old/test/octoprint/octoprint/data/plugin_blacklist.yaml
delete mode 100644 template-old/test/octoprint/octoprint/data/pluginmanager/notices.json
delete mode 100644 template-old/test/octoprint/octoprint/data/pluginmanager/plugins.json
delete mode 100644 template-old/test/octoprint/octoprint/data/preemptive_cache_config.yaml
delete mode 100644 template-old/test/octoprint/octoprint/data/softwareupdate/versioncache.yaml
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_client.js
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_client.js.gz
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_core.css
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_core.css.gz
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_core.js
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_core.js.gz
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_libs.css
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_libs.css.gz
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_libs.js
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_libs.js.gz
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_plugins.js
delete mode 100644 template-old/test/octoprint/octoprint/generated/webassets/packed_plugins.js.gz
delete mode 100644 template-old/test/octoprint/octoprint/logs/auth.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/octoprint.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/plugin_bambu_printer_serial.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/plugin_pluginmanager_console.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/plugin_softwareupdate_console.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/serial.log
delete mode 100644 template-old/test/octoprint/octoprint/logs/serial.log.2024-05-09_11-18-22
delete mode 100644 template-old/test/octoprint/octoprint/logs/serial.log.2024-05-09_11-47-18
delete mode 100644 template-old/test/octoprint/octoprint/logs/serial.log.2024-05-09_11-53-18
delete mode 100644 template-old/test/octoprint/octoprint/logs/tornado.log
delete mode 100644 template-old/test/octoprint/octoprint/printerProfiles/_default.profile
delete mode 100644 template-old/test/octoprint/octoprint/users.yaml
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/INSTALLER
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/METADATA
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/RECORD
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/REQUESTED
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/WHEEL
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/direct_url.json
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/entry_points.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/top_level.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_version.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/easter.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/relativedelta.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/_common.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/_version.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/easter.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/isoparser.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/_parser.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/isoparser.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/relativedelta.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/rrule.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_factories.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/win.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_common.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_factories.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/tz.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/win.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/tzwin.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/utils.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/rebuild.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/virtual.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/ftpsclient.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/ftpsclient.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/static/js/bambu_printer.js
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/templates/bambu_printer_settings.jinja2
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/virtual.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/client.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/matcher.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/packettypes.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/properties.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/publish.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/reasoncodes.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribe.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribeoptions.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/client.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/matcher.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/packettypes.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/properties.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/publish.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/reasoncodes.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribe.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribeoptions.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/INSTALLER
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/LICENSE.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/METADATA
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/RECORD
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/WHEEL
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/top_level.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/INSTALLER
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/METADATA
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/RECORD
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/WHEEL
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/top_level.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__init__.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_client.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_cloud.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/commands.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/const.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/models.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_client.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_cloud.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/commands.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/const.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/models.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/pybambu/utils.py
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/INSTALLER
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/LICENSE
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/METADATA
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/RECORD
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/WHEEL
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/zip-safe
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/INSTALLER
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/LICENSE
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/METADATA
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/RECORD
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/WHEEL
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/top_level.txt
delete mode 100644 template-old/test/octoprint/plugins/lib/python3.10/site-packages/six.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/config.backup
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/config.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/achievements/2024.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/achievements/data.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/announcements/_blog.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/announcements/_important.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/announcements/_octopi.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/announcements/_plugins.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/announcements/_releases.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/pluginmanager/notices.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/pluginmanager/plugins.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/preemptive_cache_config.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/data/softwareupdate/versioncache.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_client.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_client.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_core.css
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_core.css.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_core.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_core.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_libs.css
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_libs.css.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_libs.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/generated/webassets/packed_libs.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/logs/auth.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/logs/octoprint.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/logs/plugin_pluginmanager_console.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/logs/plugin_softwareupdate_console.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/logs/tornado.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/config.backup
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/config.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/achievements/2024.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/achievements/data.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/announcements/_blog.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/announcements/_important.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/announcements/_octopi.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/announcements/_plugins.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/announcements/_releases.cache
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/file_check/last_check_info.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/plugin_blacklist.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/pluginmanager/notices.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/pluginmanager/plugins.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/preemptive_cache_config.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/data/softwareupdate/versioncache.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_client.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_client.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_core.css
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_core.css.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_core.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_core.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_libs.css
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_libs.css.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_libs.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_libs.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_plugins.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/generated/webassets/packed_plugins.js.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/auth.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/octoprint.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/plugin_bambu_printer_serial.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/plugin_pluginmanager_console.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/plugin_softwareupdate_console.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/serial.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/serial.log.2024-05-09_11-18-22
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/serial.log.2024-05-09_11-47-18
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/serial.log.2024-05-09_11-53-18
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/logs/tornado.log
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/printerProfiles/_default.profile
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/octoprint/users.yaml
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/INSTALLER
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/METADATA
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/RECORD
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/REQUESTED
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/WHEEL
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/direct_url.json
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/entry_points.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/OctoPrint_BambuPrinter-0.0.18.dist-info/top_level.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/_version.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/easter.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/relativedelta.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/_common.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/_version.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/easter.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/__pycache__/isoparser.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/_parser.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/parser/isoparser.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/relativedelta.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/rrule.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_common.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/_factories.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/__pycache__/win.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_common.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/_factories.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/tz.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tz/win.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/tzwin.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/utils.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/dateutil/zoneinfo/rebuild.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/__pycache__/virtual.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/__pycache__/ftpsclient.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/ftpsclient/ftpsclient.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/static/js/bambu_printer.js
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/templates/bambu_printer_settings.jinja2
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/octoprint_bambu_printer/virtual.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/client.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/matcher.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/packettypes.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/properties.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/publish.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/reasoncodes.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribe.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/__pycache__/subscribeoptions.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/client.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/matcher.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/packettypes.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/properties.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/publish.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/reasoncodes.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribe.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho/mqtt/subscribeoptions.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/INSTALLER
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/LICENSE.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/METADATA
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/RECORD
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/WHEEL
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/paho_mqtt-1.6.1.dist-info/top_level.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/INSTALLER
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/METADATA
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/RECORD
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/WHEEL
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu-1.0.1.dist-info/top_level.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__init__.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/__init__.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_client.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/bambu_cloud.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/commands.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/const.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/models.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/__pycache__/utils.cpython-310.pyc
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_client.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/bambu_cloud.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/commands.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/const.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/models.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/pybambu/utils.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/INSTALLER
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/LICENSE
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/METADATA
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/RECORD
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/WHEEL
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/top_level.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/python_dateutil-2.9.0.post0.dist-info/zip-safe
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/INSTALLER
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/LICENSE
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/METADATA
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/RECORD
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/WHEEL
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six-1.16.0.dist-info/top_level.txt
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/plugins/lib/python3.10/site-packages/six.py
delete mode 100644 template-old/volumes/octoprint_test_01/octoprint/printerProfiles/_default.profile
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3fe3540
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# Octoprint Multi Docker Setup
+Execute `start.sh` to create multiple Octoprint instances using the Octoprint template as the base system.
\ No newline at end of file
diff --git a/template-old/01/docker-compose.yml b/template-old/01/docker-compose.yml
deleted file mode 100644
index 2f1efca..0000000
--- a/template-old/01/docker-compose.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-version: '2.4'
-
-services:
- octoprint_1:
- container_name: octoprint-test-1
- #image: octoprint/octoprint
- restart: unless-stopped
- image: octoprint_1
- ports:
- - 127.0.0.1:50137:80
- # devices:
- # use `python -m serial.tools.miniterm` to see what the name is of the printer, this requires pyserial
- # - /dev/ttyACM0:/dev/ttyACM0
- # - /dev/video0:/dev/video0
- volumes:
- - octoprint1:/octoprint
- # uncomment the lines below to ensure camera streaming is enabled when
- # you add a video device
- #environment:
- # - ENABLE_MJPG_STREAMER=true
-
- ####
- # uncomment if you wish to edit the configuration files of octoprint
- # refer to docs on configuration editing for more information
- ####
-
- #config-editor:
- # image: linuxserver/code-server
- # ports:
- # - 8443:8443
- # depends_on:
- # - octoprint
- # restart: unless-stopped
- # environment:
- # - PUID=0
- # - PGID=0
- # - TZ=America/Chicago
- # volumes:
- # - octoprint:/octoprint
-
-volumes:
- octoprint1:
diff --git a/template-old/backup/octoprint/octoprint/config.backup b/template-old/backup/octoprint/octoprint/config.backup
deleted file mode 100644
index eb07d93..0000000
--- a/template-old/backup/octoprint/octoprint/config.backup
+++ /dev/null
@@ -1,74 +0,0 @@
-accessControl:
- userfile: /octoprint/octoprint/users.yaml
-api:
- key: 91EEB0475E5844059C3CBC0C18E37B63
-appearance:
- color: white
- name: My Template
-plugins:
- announcements:
- _config_version: 1
- channels:
- _blog:
- read_until: 1711358100
- _important:
- read_until: 1698310200
- _octopi:
- read_until: 1684929600
- _plugins:
- read_until: 1714176000
- _releases:
- read_until: 1713957300
- bambu_printer:
- access_code: '1234'
- device_type: P1P
- host: 127.0.0.1
- serial: '1234'
- classicwebcam:
- _config_version: 1
- snapshot: http://localhost:8080/?action=snapshot
- stream: /webcam/?action=stream
- discovery:
- upnpUuid: f208a345-7fab-4b7b-8922-a12766395145
- errortracking:
- unique_id: 2074483d-5218-452c-992f-07225b0f7efd
- gcodeviewer:
- _config_version: 1
- softwareupdate:
- _config_version: 9
- tracking:
- enabled: false
- unique_id: 2aa3b43d-6962-431d-a80b-818b7230d03e
- virtual_printer:
- _config_version: 1
-printerProfiles:
- default: _default
-serial:
- autoconnect: true
-server:
- commands:
- serverRestartCommand: s6-svc -r /var/run/s6/services/octoprint
- firstRun: false
- onlineCheck:
- enabled: false
- pluginBlacklist:
- enabled: true
- secretKey: xZHLyQYSTO24lFaEE7yHGoMKiYcJWE46
- seenWizards:
- backup: null
- classicwebcam: 1
- corewizard: 4
- file_check: 1
- tracking: null
-temperature:
- profiles:
- - bed: 100
- chamber: null
- extruder: 210
- name: ABS
- - bed: 60
- chamber: null
- extruder: 180
- name: PLA
-webcam:
- ffmpeg: /usr/bin/ffmpeg
diff --git a/template-old/backup/octoprint/octoprint/config.yaml b/template-old/backup/octoprint/octoprint/config.yaml
deleted file mode 100644
index eb07d93..0000000
--- a/template-old/backup/octoprint/octoprint/config.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-accessControl:
- userfile: /octoprint/octoprint/users.yaml
-api:
- key: 91EEB0475E5844059C3CBC0C18E37B63
-appearance:
- color: white
- name: My Template
-plugins:
- announcements:
- _config_version: 1
- channels:
- _blog:
- read_until: 1711358100
- _important:
- read_until: 1698310200
- _octopi:
- read_until: 1684929600
- _plugins:
- read_until: 1714176000
- _releases:
- read_until: 1713957300
- bambu_printer:
- access_code: '1234'
- device_type: P1P
- host: 127.0.0.1
- serial: '1234'
- classicwebcam:
- _config_version: 1
- snapshot: http://localhost:8080/?action=snapshot
- stream: /webcam/?action=stream
- discovery:
- upnpUuid: f208a345-7fab-4b7b-8922-a12766395145
- errortracking:
- unique_id: 2074483d-5218-452c-992f-07225b0f7efd
- gcodeviewer:
- _config_version: 1
- softwareupdate:
- _config_version: 9
- tracking:
- enabled: false
- unique_id: 2aa3b43d-6962-431d-a80b-818b7230d03e
- virtual_printer:
- _config_version: 1
-printerProfiles:
- default: _default
-serial:
- autoconnect: true
-server:
- commands:
- serverRestartCommand: s6-svc -r /var/run/s6/services/octoprint
- firstRun: false
- onlineCheck:
- enabled: false
- pluginBlacklist:
- enabled: true
- secretKey: xZHLyQYSTO24lFaEE7yHGoMKiYcJWE46
- seenWizards:
- backup: null
- classicwebcam: 1
- corewizard: 4
- file_check: 1
- tracking: null
-temperature:
- profiles:
- - bed: 100
- chamber: null
- extruder: 210
- name: ABS
- - bed: 60
- chamber: null
- extruder: 180
- name: PLA
-webcam:
- ffmpeg: /usr/bin/ffmpeg
diff --git a/template-old/backup/octoprint/octoprint/data/achievements/2024.json b/template-old/backup/octoprint/octoprint/data/achievements/2024.json
deleted file mode 100644
index 306da77..0000000
--- a/template-old/backup/octoprint/octoprint/data/achievements/2024.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "last_version": "1.10.0",
- "seen_versions": 1,
- "server_starts": 7,
- "prints_started": 0,
- "prints_cancelled": 0,
- "prints_errored": 0,
- "prints_finished": 0,
- "prints_started_per_weekday": {},
- "print_duration_total": 0.0,
- "print_duration_cancelled": 0.0,
- "print_duration_errored": 0.0,
- "print_duration_finished": 0.0,
- "longest_print_duration": 0.0,
- "longest_print_date": 0,
- "files_uploaded": 0,
- "files_deleted": 0,
- "plugins_installed": 0,
- "plugins_uninstalled": 0,
- "most_plugins": 20,
- "achievements": 1
-}
\ No newline at end of file
diff --git a/template-old/backup/octoprint/octoprint/data/achievements/data.json b/template-old/backup/octoprint/octoprint/data/achievements/data.json
deleted file mode 100644
index e694e4c..0000000
--- a/template-old/backup/octoprint/octoprint/data/achievements/data.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "stats": {
- "last_version": "1.10.0",
- "seen_versions": 1,
- "server_starts": 7,
- "prints_started": 0,
- "prints_cancelled": 0,
- "prints_errored": 0,
- "prints_finished": 0,
- "prints_started_per_weekday": {},
- "print_duration_total": 0.0,
- "print_duration_cancelled": 0.0,
- "print_duration_errored": 0.0,
- "print_duration_finished": 0.0,
- "longest_print_duration": 0.0,
- "longest_print_date": 0,
- "files_uploaded": 0,
- "files_deleted": 0,
- "plugins_installed": 0,
- "plugins_uninstalled": 0,
- "most_plugins": 20,
- "created": 1715245186,
- "created_version": "1.10.0"
- },
- "achievements": {
- "the_wizard": 1715245188
- },
- "state": {
- "date_last_print": "",
- "prints_today": 0,
- "date_last_cancelled_print": "",
- "prints_cancelled_today": 0,
- "consecutive_prints_cancelled_today": 0,
- "file_last_print": "",
- "consecutive_prints_of_same_file": 0,
- "date_last_weekend_print": "",
- "consecutive_weekend_prints": 0
- }
-}
\ No newline at end of file
diff --git a/template-old/backup/octoprint/octoprint/data/announcements/_blog.cache b/template-old/backup/octoprint/octoprint/data/announcements/_blog.cache
deleted file mode 100644
index c1186f0e4394bbb45ff18f8eb900c431201e494a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1541
zcmV+g2KxDUoZXsRbDKC6$G?ioKI}uWkp!fMw{*9iZD)IV$m~w1)A7h48?{(sBoWum
z$QFz
zpnJcYLSzNnFaw{-l+JmMltgcshE|e*Uy5lo_4ZvJm{MWaWv>~XX}qvTRlO*MDR>UO
zzERRgG9nI0@fvPodq}yXncQlqU3}LJ&7*@@AgyM>92Y5J(2&ahgB_dVcN0m;IVAA
zBZupChqj%@vVyPo;wjm}Et~t}7MAlUa`BkR#U04SLreHip7Hg9Yeb?}#o^G@on^>f
z;E|a#Z43~e0d)g`7y5+yWaiHr?64okbVTyPfY5-!Flem7_-B$Jt7B{IU+%nA@{0m2pQN~>!S
zuGKJ8nXB5ATOXv(Kq|;8v{ki6rmiZb?G#0(EjCllWX3Ch6fFK*d?2!jd;|j$!u)SI>?21h(Xd>7i_
ztVhN?;DrI6xwF+{sfQ;acf?Ci1m7|_R^QJ
zV;;`U7#Wi>(!rR!oe!hkmwcgX@QldCNSuv3)*r)J%^`=JIn(`NjSiPXLfSZUXEoZO
z=EupntkHmWl`F_;tR42!m$hRaMrG|UR#jW{TxeV53{LTTPs0^VjvoDnY^^TWjg6
zECi!12N@w%<}M>Ms8FQ5Y~xVSTGjGDh-`7h(%z;
znME1cFKfp<49^-&
zZOPlMdC1&z7|)=bH4ewvJkQ-Oj+(jonWoKsVEVOj-1csGxxDWfGN)2x&C|m`8}rmz
z_S<`}tB#tWHxR^{7iCD4(j>)nm=|T5w`3xpCU69GDeqm8r+tFfZvZ>nA-i93$u)z+
zzyrZZ=7i_H=3llD-mk-HGHu=i+1qwqEI7-#29@00y0^tL<(?0MVQrU_nbQ?qggt^5
r*d^*_Hp&2$qs`$RE>uuH4f-tFyw{?4s5INlOs
diff --git a/template-old/backup/octoprint/octoprint/data/announcements/_important.cache b/template-old/backup/octoprint/octoprint/data/announcements/_important.cache
deleted file mode 100644
index 12f044004833271332b307da7b00c39c3a81bb49..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2232
zcmV;p2uJsLob6g|kK4u({wo`PXcB}HN$GSt366s+iUJPc)`guKMPwXSwoHKx#5)+aU_&8QrKwu^Sj7N
zSBYpDy%tOfQ81^O-BNbP<&eK1cD-BrVR;cybFe)hO`he-MYnHS6F;ZUIFiLc`XFoTWg%_5hYqZcZ#$$4
zQ$y3UUNyT*yGy0CSGlNxY)g5am-yT#Y{l0UExNcx6z?$qQsmx9w`VuLQo``HtZ=nt
zKQ#qnO1YYir{i;W`SS9`SA%iDr)j;%3C~(cSSPEBmHbAiuO0K@xxguR9tk31*0lI4
zG_yJg9J5!YFoH?TII|C0!Wtti97!0w5ynb@GssI#o-tP%?YCvPF~b#itntpac$dl|
zGPz*5Yoxs<3`-Z3<+-p{t}7TLjmTXEt&&3kY*Bsv@LwG)8=|W
zy86HN;zLZD&De8pz@*s)%QDdDFie_VfIPEVoMmxKr1P`K?cGutqjW%K~U|zHwSt_6PP4
zps+880=R0yYOXx$1>bB9FN7VAbsx*XhX|U38|cyWoOH?*+A4fCsxJ(v-oTVZk@!_boPkkI#04J
zNwfA_IieVi5S*5M?7*ZtgtC*!^dpKsJBj|$hsGxxPsZ6ftL3(IR7TuT8PPKQaC~@*
zu7{{?iwc7)CX4|vcBKHs%%0$ThXl4Uy6z;$OgEy1AwcY~(4utV2tWXKUdjBLt)iEx
z!d4OchBN@WsK=--Bbl`>05P8a>f14~vgvGOw$vU(LA4Fgxf`CRe((Ezzn=2~
zq;t`e&N-1zHdH-#PNZ`|q?1uWm&Ma;`iP`+9^iSAto?Q*)u?swD5UDBOVzIM8Jd9x
z*L)HkeTvr4&P~tSlQJ|Y-7se`E_z7zL)=qoVB~Hm1gITtj;a8G;~ouE0XJ2;q0P}$
z2>|q=j|z1FM^B|U-DiuNJI(e2C^)ouM(~2BSM6Mm1ft9~B&-`!Fe{zsPSP5vFZHe;
zQn6B0&G7v5->~P03ZHDsE*sNv&|-1-Gd0{ft?T+rWihRP>PAG57IPtvm_nAxCQ6CY8H@GIit<)3FD9gTIg{UAXP35;(GQJ<2?rzfBw2^PK$vjy_PlNRQr~YoM
zHrzyS6rOpK@TYD45fC2k0nv>HX0_R)Pub|U*$H@EsjiL)TzeP4&gua2@sp%^x>7K{
zdHVNz`?b7)FNk8`dK!JeogSQA)b^}Z~}$ClQ(DUJ!(XCE%xAZmxq0ZV2ZcW
z2F)vV98I*zhVCMRiA0y|H*#vsp1F`F=x#T_bJ2IuEA?S!g>trC+v$U)hpA*g;0&g9
z53dwDYEIqri2dR%y)D`x(B*OJ;#hEZ`Fy1An|{u@Qk8U|1-1h=^ODIt^!CR>dNn;3
z+XDRCZjM@LVcTq4I7qW}p81B!ng|t6p`cUFh8ZzVO6UNF*m3@K?m7a>t5ERg!Q<`9
z%Ycp#dFSAw2U3MnsGRh2Fo=`|pX~
z-)kSAYZbF}&i*8FY9D7TypJ4cgf)w^NjwklBf~q%v+NOj$61n1l5~DN(3$s>9Q#P4
zs{wVM)K8wK@AGt)@X2MfZogi|cA=XDVJw}#A)K35AGV+K`4pAMy4U${+ppwm<
zX5KUvPAVd~1WEB7tvoI7q6dCdkS^GBzNepOozW0_vRI~*A%3297SG}Z&7da>dhHcw
z)3k$dM=mEB(5)R({Z`PgKX95IrIO;5tI?0*dJl5EnT{9ZS#-Sip)X5;D#9R5-rdq~
z6>}Ya9Jq|U+l($KB&Ts=Cn`eONgTkk_;D!mo^vhM7IV$g%$Y*Fbzz!m{zLmk#!>-wGA5Q4Tf%)&
zWtr>DnKE^t0&5}jwAChOVG0IXwC&9hV`Jcj4^m&Y!m
zA^HeiP)q|v=oDl4M=vq_IX7z03RWu9=*pSRzAGuBj43snL8w9m=G;@dtRg)#*N*$m
z^yUs-8oGqK7(Ub`Vd&!Xa~MLFii;-3OAd?RuuSt(FwIRg-(8QSEI-e<7l@WhkD)pQBne#ZU
z^4CobXLH_+?`VLolg5_7ps!_>#;Ix^pw$%3maU-hG6$q4a?qI&vJw%`L35O$MwGzy
zHs&)nH%nuFY+%WLs?jG1#5DQgQg
z)fWIi2eEu%kK{)k^(_JTnp7^rV-SzX2mnQ7WY4y#aqO{6Mzw7RZV=KQ1%Ud5`gnYs
zG}rUi&<8@urW)7;?IaD|0iS|S&{OHe9pHmHkubHxI>jR?o`+Z*XXtwsBSdG_vQ-Q^
z4eTk#*sb&YpivA;UiGRNKqMSK$R%o5G3q$TX#pQB*(
zGV)t`@lgucVvM(24A6_f-WG$JEe2#5L9@lc?r_qtUO-y@u=f(ndSMN;t6p>jJk=oq
z_Q<&BQ-T&^-!VZ`bZ9p|^k_|w&ug7Xfr8^45ZD;gUfvGT2PO<}i8&guwlg3uap}+;
z4KyFP?vJ*_$Hb?@+X0OSWNi0n;ITlR=y^ZLNiDpI!c%1Z2ayk&`1cB&?~%!K%ev$H
z_^}4RPZ9{ZAqjz9Ng%{nc_RsM-LoVRa@gY!tCqEGVDCr`AZxywZM*ITe
z2^0QN{|W!-aKb;@O|A`JGG?S=C(jN%(k9v|3f~}A6@@JI(RKj#2f2^kBy8DDCJ0Za
zWN3%oWKz3-=)(7~W%sy0c9V&TdUEGf3}Ss`byM(Ype`JK0OZuxK02AT??>*#+DFgL
z+8-S7zE=eTYuXyBDi+u-kbbapV~JySJKoZq-h{_oME%!B#w5{Dfsik);vSsT4je_DfT<
zTTnUsvhT_E9lQ{{dP*l#Ol@S}A*9|DW6*SB_z4^JZSq|eCYHJlpsi~Ye#r$dnU>{^
z&=Jgpqw|4Ztg{SV2HwOQIydX?D@-_x!5^Ug#=Jfo$rwZtDpq>jAnBe0dm0#&G`87DqCiq{
zoFe~yXDC^KH-pK8p4*sEZAu^&S#tznYaL@dBSEQ
z;VI6AS+*J(T;M0ERt!l|Bh~+!v5lXX`RkV=oinYXS6{t_F}Xe%;5UPYkGx8zAq$
zxmXJYGkkQvZEhIkuZ2mcS{5pTS4!*O=wk}8DAHFmz*t_m0I!d3DIs*5K?G)?0Y?
z=6x?#7(!(1-O1axER~tSn1OJ4Q2_L
z*rcuo!^7Q?G?PphA%+7YZ(vys5iW=$F*?cxk5&(X_J0-m3_8H|lJ7RCv(k+%wAKEN
zVH-D$Cy88Ywvq)iXfFVa&zJ&CAPFBT6#OPbN+22Xeh0pd_iPl$(Pb|Hog*P%oJTSS
z^ek9na>@R{f2&7y08%E(v$!5t#)ZUb93%S17#O1bnLrYH2$w{I?wZmdIm59le2BzG7jp$vvLk3vtQ>7u29NKVk|}}&va$t1OiHqisvvIn45JC%>L#@cSnWyqjV!w}
z%zPRK*}<@PN+5=fy2G$hg<*UCWb_Cawqu3X!K@+wMyR&K+YR1w8sr)Yp9jvAV|Pkd
zaJBovHO4n7%=tJdTs8hF=^b(JM|pLXK<`~uKkog(6A|+=UuZiPzFXE7_EwL9WtJX+
z=L&4BRQFIw5f%c5Z**F5WkIGwpLS!RQswDd+`Vj4CSez)X6~hg%}vx$
zVpxbI#?XiMqSMeVv^{ahG%L)=z
zzHRy_*l#?S`Y#`0$s#M9vYqI>eEO?2xu1+hcEXX*i^3Msx(i3DXk_eqw1eqi!IIgMhJJ7lsF6Eq#!+sM^P+ES-wm+@^E&TZe7idUF|iFro#
ztRjyjxd_XNfz8Ou{wbz$JdWwFpxB!yYl`JUBvp?V$F-ZQSrOB;p2gSJg1R~wJjOY4!yxV7u4*cw*)6MG?rx{X(Znv6Q{qDsI_NZ)
z`@{7tIu{KZ((B6T--f0KKw%mfPR
z21ftK?RZ-WF&K3Swm(XU!DDp3w++!c(l%q?2xhlgyJ2jT8Xwnr2uit@X=-}s8>V)I
z_{kT99#$aSvQ5J=y>bV;CJXhja(_1+RqcG|s?twooRN=OZ#uZ8alh_qoM4i!>3(l}
zXVHB!?8y|awfVfDTE83t0Z9;gu2Q(cLqjUPc9SN-#4A*P9T=th^yGX%sxIcJfWa?dC{~IFlSAX9(
BjHv(s
diff --git a/template-old/backup/octoprint/octoprint/data/announcements/_releases.cache b/template-old/backup/octoprint/octoprint/data/announcements/_releases.cache
deleted file mode 100644
index 27a39bf86288d430262845b39c3dc65dea4df4c9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1519
zcmV&8{y%F$4qlP@vmT6xc&i7_>y&Tq#l@sW@Jc
z|K4*XITy!ngoSdvC4sF-hv(zvd>_dp-UJK%j}B%_CM~A{SI!7-gV~pxzzHXLFbjU?
z8)CTR%<>tD2XQor0@^&C=iD(NgBe(FOEh-;+J&WLLV=BBYE`in+*g&9G+2NOuz@F6
zOjgHy-_pQVMZwG#3_f#33a#AQ5}`=Wuej7@0o9~rsio8#o|DCvWKvsBoF;BXwKU=aCib=U8P84;Cva)NUE7!vR6x_idY2DftvQy(;q3+OkWwnsP
zu6YhM_>1S1Btvpp8j?hC5y!K5G>angHiDnvf%Uv(#$utHU_SrbYL!W5?R*ZQ5Fp&Z
zI#XqCj@JSGg5Kzm!bcp_ctj(bz!iLd{R(xELVat32nHAG!KC9xF~>1*o^~a)dkMGJ
z&Xsl+hB|Y)G(x$7Hmh(U^(sWTFdByNsrcri4VjCk+2JphE9O>LCgbmowQum>g6Ex0QY}@+dt7Q`P39AmrChMWgO!R
zYhklBTrc`&z0fU3au=VEGMEUjlOES4h>;gfMhJs
z!FCCq>cEmo;kG`-;app|Cm|oTq9mF;kdWbQ7
z`BSBo#vn@(9W}Bvp7bkAX&668*wni$c?0b#OPv7EOO}#T$x`xEmLUGMIx~8D7NGNN
z;z6lN$ZvenN=-6L{YedMo9e%`k(y!Juhb-AoIFFq#JkjZ1MMm`odC~EYT{E#P5e}9
zmcm%~G8#f>lO<=a0@l&TYZ;(wKZ;suhJXD1tXph-n(rcw8$&
zg4exjLL8>?Gi-^yYl1h>uA0yZ@bxqS2|6A0vJcw1KC<(HD2E`2aKBq|?|6bd!lKs{
zX@GQjv@pM_q~eAxM6+_oXUG_wZee2GnQyfD#tigMUi$;W2x}|2FWj22whq7%aG3Lw
ztDLKBJLqGlbDj-7m~WX9h%r=_w9dEqO4+8kshQRZmr)}wlcYy&ffaugM$^4CCxoJ3
zHF+6KC;d1M@!E>f%NAwl`q-wVWzqrq6xup`L7{6pkd_auo@bFWLY<29{Z@64wVx|q
z=OaE;vSqEu7cD6r*ZGL{MGJiOnkP-eXuQ8wufxGNYhMD>k+sJlUYoVOtoC=VAF=kb
zT_qpqK|A9ySO;&KDa(Rcsf~lZu@%tTdNI8#37cmu7}_N2hn>mi4e*Zd%(Q}U5*`(X5l!p9w>d(F-P4@Mz;?(@L&`G%LlbY=7rh;zxg
zO>w*buK$!0y-!>{m=0.1.1,<=0.2.8'
-- - gcodeleveling
- - '>=0.1.0,<=0.1.1'
diff --git a/template-old/backup/octoprint/octoprint/data/pluginmanager/notices.json b/template-old/backup/octoprint/octoprint/data/pluginmanager/notices.json
deleted file mode 100644
index f314dcf..0000000
--- a/template-old/backup/octoprint/octoprint/data/pluginmanager/notices.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"date": "2017-05-16 10:30:00 +0000", "link": "https://github.com/OctoPrint/OctoPrint-Autoselect/releases/tag/0.2.0", "plugin": "autoselect", "text": "Version 0.2.0 of this plugin is available, but your version 0.1.0 does not yet support updating automatically. Please re-install the plugin from the repository to update. More details can be found at the \"Read more...\" link below.", "versions": ["0.1.0"]}, {"date": "2020-04-21 08:30:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/issues/124", "plugin": "DisplayLayerProgress", "text": "Some users are experiencing layer shifts that seem to be caused by this plugin. If this affects you, please disable it for now and follow the discussion found at the \"Read more...\" link below.", "versions": ["1.17.0", "1.18.0", "1.19.0", "1.19.1", "1.20.0"]}, {"date": "2020-05-04 13:00:00 +0000", "link": "https://github.com/tpmullan/OctoPrint-DetailedProgress/releases/tag/0.2.3", "plugin": "detailedprogress", "text": "Version 0.2.3 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2", "0.1.3", "0.1.4"]}, {"date": "2020-05-18 14:50:00 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/466", "plugin": "octoprint_eta", "text": "This plugin seems to have been abandoned by its original author, but a new maintainer has stepped up to maintain a fork which you might want to manually install. If so, please uninstall \"OctoPrint-Display-ETA\" and then install \"OctoPrint-Display-ETA\" from the repository."}, {"date": "2020-06-15 09:45:00 +0000", "link": "https://github.com/OctoPrint/OctoPrint-CommandSplitter/releases/tag/0.2.2", "plugin": "commandsplitter", "text": "Version 0.2.2 of this plugin is available, but your version does not yet support updating automatically. Please re-install the plugin from the repository to update. More details can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.2.0", "0.2.1"]}, {"date": "2020-09-14 08:45:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-FilamentManager/releases/tag/1.6.0", "plugin": "filamentmanager", "pluginversions": ["<1.6.0"], "text": "Version 1.6.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.2.0", "0.2.1", "0.2.2", "0.3.0", "0.4.0", "0.4.1", "0.5.0", "0.5.1", "0.5.2", "0.5.3"]}, {"date": "2020-09-15 04:00:00 +0000", "link": "https://github.com/AliceGrey/OctoprintKlipperPlugin/releases/tag/0.3.1", "plugin": "klipper", "pluginversions": ["<0.3.1"], "text": "Version 0.3.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.5", "0.2.0", "0.2.1", "0.2.2", "0.2.3", "0.2.4", "0.2.5"]}, {"date": "2020-09-22 08:45:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-CostEstimation/releases/tag/3.0.0", "plugin": "costestimation", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.3.0", "0.4.0", "1.0.0", "1.1.0", "2.0.0", "2.0.1", "2.1.0", "2.1.1", "2.1.2", "2.1.3"]}, {"date": "2020-09-23 15:15:00 +0000", "plugin": "ender3v2tempfix", "text": "Version 0.0.4 of this plugin is available, but due to a name change the automatic update needs a bit of extra help. Please uninstall the plugin and then just reinstall it from the plugin repository.", "versions": ["0.0.1", "0.0.2", "0.0.3"]}, {"date": "2020-09-27 18:00:00 +0000", "link": "https://github.com/ssorgatem/Octoprint-Filament-Reloaded/releases/tag/1.3.0", "plugin": "filamentreload", "pluginversions": ["<1.3.0"], "text": "Version 1.3.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.1.0", "1.1.1", "1.2.0"]}, {"date": "2020-10-07 12:00:00 +0000", "link": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin/releases/tag/2.0.0", "plugin": "eeprom_marlin", "pluginversions": ["<2.0.0"], "text": "Version 2.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.2", "1.2.1", "1.2.2"]}, {"date": "2020-10-19 12:00:00 +0000", "link": "https://github.com/AlexVerrico/octoprint-stats/releases/tag/3.0.0", "plugin": "stats", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "2.0.0", "2.0.2"]}, {"date": "2020-10-31 12:00:00 +0000", "link": "https://github.com/Zinc-OS/continuousprint/releases/tag/1.0.4", "plugin": "continuousprint", "pluginversions": ["<1.0.4"], "text": "Version 1.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"]}, {"date": "2020-12-02 15:00:00 +0000", "link": "https://github.com/Willmac16/OctoPrint-GcodeLeveling/issues/5", "octoversions": [">=1.5.0"], "plugin": "gcodeleveling", "pluginversions": ["<=0.1.1"], "text": "There are reports of this plugin somehow breaking extrusion on OctoPrint 1.5.0. It has since been blacklisted until the author can look into this. If it is still active on your instance, please disable it and restart to avoid this problem.", "versions": ["0.1.0", "0.1.1"]}, {"date": "2020-12-08 12:00:00 +0000", "link": "https://github.com/gdombiak/OctoPrint-M73ETAOverride/releases/tag/1.0.4", "plugin": "m73etaoverride", "pluginversions": ["<1.0.2"], "text": "Version 1.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1"]}, {"date": "2020-12-09 12:00:00 +0000", "link": "https://github.com/gruvin/OctoPrint-WebcamTab/releases/tag/0.2.0", "plugin": "webcamtab", "pluginversions": ["<0.2.0"], "text": "Version 0.2.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2"]}, {"date": "2021-02-10 12:00:00 +0000", "link": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect/releases/tag/1.0.3", "plugin": "mmu2filamentselect", "pluginversions": ["<1.0.3"], "text": "Version 1.0.3 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1", "1.0.2"]}, {"date": "2021-02-27 17:00:00 +0000", "link": "https://github.com/mkevenaar/OctoPrint-Slack/releases/tag/0.2.4", "plugin": "slack", "pluginversions": ["<0.2.4"], "text": "Version 0.2.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1", "0.2", "0.2.1", "0.2.2", "0.2.3"]}, {"date": "2021-08-19 22:30:00 +0000", "link": "https://www.thespaghettidetective.com/blog/2021/08/19/what-happened-last-night/", "plugin": "thespaghettidetective", "pluginversions": ["<1.7.3"], "text": "On August 19th 2021 a vulnerability was discovered with The Spaghetti Detective that allowed unauthorized access to OctoPrint instances. The issue was resolved shortly after being discovered, more information is available at the \"Read more...\" link below.", "versions": ["0.2.0", "0.2.1", "0.3.0", "0.5.0", "0.5.1", "0.5.2", "0.5.3", "0.5.4", "0.6.0", "0.6.1", "0.7.0", "0.7.1", "0.8.0", "0.8.1", "0.8.2", "0.8.3", "0.9.0", "0.9.1", "0.9.2", "0.9.3", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.1.0", "1.1.1", "1.1.2", "1.1.3", "1.1.4", "1.1.5", "1.1.6", "1.2.0", "1.2.1", "1.2.2", "1.2.3", "1.2.4", "1.2.5", "1.3.0", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.4.0", "1.4.1", "1.4.2", "1.4.3", "1.4.4", "1.4.5", "1.4.6", "1.4.7", "1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.6.0", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.6.5", "1.6.6", "1.6.7", "1.7.0", "1.7.1", "1.7.2"]}, {"date": "2021-08-25 12:00:00 +0000", "link": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor/releases/tag/0.2.1", "plugin": "metadatapreprocessor", "pluginversions": ["<0.2.1"], "text": "Version 0.2.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.2.0"]}, {"date": "2021-10-12 16:00:00 +0000", "link": "https://github.com/vitormhenrique/OctoPrint-Enclosure/issues/435", "plugin": "enclosure", "text": "The maintainer of this plugin is looking for some help with maintaining it from the community. If this sounds like something you'd like to lend a hand in, please click on the \"Read more...\" link below."}, {"date": "2021-10-20 12:00:00 +0000", "link": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout/releases/tag/0.0.4", "plugin": "HeaterTimeout", "pluginversions": ["<0.0.4"], "text": "Version 0.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.0.1", "0.0.2", "0.0.3"]}, {"date": "2022-01-27 12:00:00 +0000", "link": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor/releases/tag/1.1.6", "plugin": "smartfilamentsensor", "pluginversions": ["<1.1.6"], "text": "Version 1.1.6 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-03-12 12:00:00 +0000", "link": "https://github.com/smartin015/continuousprint/releases/tag/1.4.1", "plugin": "continuousprint", "pluginversions": ["<1.4.1"], "text": "Version 1.4.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-03-24 12:00:00 +0000", "link": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/releases/tag/0.1.4", "plugin": "prusa_mini_eta", "pluginversions": ["<0.1.4"], "text": "Version 0.1.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-05-09 12:00:00 +0000", "link": "https://www.obico.io/docs/user-guides/move-from-tsd-to-obico-in-octoprint/", "plugin": "thespaghettidetective", "text": "This plugin is now succeeded by \"Obico for OctoPrint\". Please uninstall this plugin (keep data) in the plugin manager. Then install the \"Obico for OctoPrint\" plugin. Your settings in this plugin will be automatically migrated to the new plugin. To find out more, click the \"Read more...\" link below."}, {"date": "2022-10-01 12:00:00 +0000", "link": "https://github.com/gbonesso/OctoPrint-LEDStripControl/releases/tag/v0.3.8", "plugin": "ledstripcontrol", "pluginversions": ["<0.3.8"], "text": "Version 0.3.8 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-12-11 18:00:00 +0000", "link": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser/releases/tag/v3.0.1", "plugin": "SlicerSettingsParser", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-12-25 12:00:00 +0000", "link": "https://github.com/synman/OctoPrint-SystemCommandEditor/releases/tag/1.0.0", "plugin": "systemcommandeditor", "pluginversions": ["<1.0.0"], "text": "Version 1.0.0+ of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-02-02 12:00:00 +0000", "link": "https://github.com/derekantrican/OctoPrint-Webhooks/releases/tag/3.1.3", "plugin": "webhooks", "pluginversions": ["<3.1.3"], "text": "Version 3.1.3+ of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-09-16 12:00:00 +0000", "link": "https://github.com/thomst08/OctoLight/releases/tag/v0.1.5", "plugin": "octolight", "pluginversions": ["<0.1.5"], "text": "Version 0.1.5 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update and keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2", "0.1.3", "0.1.4"]}, {"date": "2023-11-27 12:00:00 +0000", "link": "https://github.com/dojohnso/OctoPrint-PrintJobHistory/releases/tag/1.17.1", "plugin": "PrintJobHistory", "pluginversions": ["<1.17.1"], "text": "Version 1.17.1 of this plugin is available from a new maintainer. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-12-06 12:00:00 +0000", "link": "https://github.com/dojohnso/OctoPrint-SpoolManager/releases/tag/1.7.1", "plugin": "SpoolManager", "pluginversions": ["<1.7.1"], "text": "Version 1.7.1 of this plugin is available from a new maintainer. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2021-07-25 23:34:43 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/914", "plugin": "TemperatureFailsafe", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-11-14 14:36:01 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/961", "plugin": "gslc", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-01-25 07:48:19 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/995", "plugin": "filamentrevolutions", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-02-25 14:24:57 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/800", "plugin": "autocalibration", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-09-07 20:42:41 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/608", "plugin": "cost", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-06-28 08:04:28 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1082", "plugin": "Thingiverse", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-02-24 19:39:28 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/796", "plugin": "filetypes", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-09-21 10:13:51 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/624", "plugin": "growl", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-12-01 23:42:04 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1126", "plugin": "touchui", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-07-01 08:23:04 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1085", "plugin": "flashforge", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-12-15 19:28:43 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/711", "plugin": "active_filters", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-07-20 08:10:10 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/911", "plugin": "slicer", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}]
\ No newline at end of file
diff --git a/template-old/backup/octoprint/octoprint/data/pluginmanager/plugins.json b/template-old/backup/octoprint/octoprint/data/pluginmanager/plugins.json
deleted file mode 100644
index b2dffa2..0000000
--- a/template-old/backup/octoprint/octoprint/data/pluginmanager/plugins.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"id": "mqtt", "published": "2015-04-11 00:00:00 +0000", "title": "MQTT", "description": "Adds support for subscribing and publishing to MQTT topics.", "archive": "https://github.com/OctoPrint/OctoPrint-MQTT/archive/master.zip", "author": "Franziska Kunsmann, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-MQTT", "page": "https://plugins.octoprint.org/plugins/mqtt/", "compatibility": {"octoprint": ["1.3.5"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.8.15", "date": "2024-02-10 18:26:17 +0000", "tag": "0.8.15"}, "releases": 23, "last_push": "2024-02-10 18:25:23 +0000", "stars": 152, "issues": {"open": 34, "closed": 77}}, "stats": {"instances_month": 3222, "install_events_month": 172, "instances_week": 2467, "install_events_week": 36}}, {"id": "growl", "published": "2015-04-14 00:00:00 +0000", "title": "Growl", "description": "Get Growl notifications from your OctoPrint installation.", "archive": "https://github.com/OctoPrint/OctoPrint-Growl/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Growl", "page": "https://plugins.octoprint.org/plugins/growl/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/growl/notification.png", "abandoned": true, "github": {"latest_release": {"name": "0.1.1", "date": "2017-11-24 16:37:26 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2020-07-01 13:36:07 +0000", "stars": 5, "issues": {"open": 1, "closed": 6}}, "stats": {"instances_month": 7, "install_events_month": 1, "instances_week": 6, "install_events_week": 0}}, {"id": "actiontrigger", "published": "2015-04-17 00:00:00 +0000", "title": "Action Trigger Plugin", "description": "Plugin for OctoPrint that handles serial commands sent out by the printer.", "archive": "https://github.com/Booli/OctoPrint-ActionTriggerPlugin/archive/master.zip", "author": "Pim Rutgers", "homepage": "https://github.com/Booli/OctoPrint-ActionTriggerPlugin", "page": "https://plugins.octoprint.org/plugins/actiontrigger/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Python 3 compatibility release ", "date": "2020-06-28 09:19:33 +0000", "tag": "v1.1"}, "releases": 2, "last_push": "2020-09-14 09:38:22 +0000", "stars": 4, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 98, "install_events_month": 8, "instances_week": 75, "install_events_week": 1}}, {"id": "navbartemp", "published": "2015-04-17 00:00:00 +0000", "title": "Navbar Temp", "description": "Display temperatures on navbar", "archive": "https://github.com/imrahil/OctoPrint-NavbarTemp/archive/master.zip", "author": "Cosik, Jarek Szczepanski", "homepage": "https://github.com/imrahil/OctoPrint-NavbarTemp", "page": "https://plugins.octoprint.org/plugins/navbartemp/", "compatibility": {"octoprint": [], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/imrahil/OctoPrint-NavbarTemp/blob/master/images/navbar.png?raw=true", "abandoned": false, "github": {"latest_release": {"name": "v 0.15", "date": "2022-08-15 14:21:53 +0000", "tag": "0.15"}, "releases": 11, "last_push": "2022-08-15 14:16:11 +0000", "stars": 43, "issues": {"open": 14, "closed": 57}}, "stats": {"instances_month": 11785, "install_events_month": 568, "instances_week": 8507, "install_events_week": 124}}, {"id": "gpx", "published": "2015-04-23 00:00:00 +0000", "title": "GPX", "description": "Use OctoPrint with s3g/x3g printers (like FlashForge and older MakerBot)", "archive": "https://markwal.github.io/octoprint-download/OctoPrint-GPX.tgz", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-GPX", "page": "https://plugins.octoprint.org/plugins/gpx/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://markwal.github.io/octoprint-download/gpx.png", "abandoned": false, "github": {"latest_release": {"name": "2.6.8", "date": "2020-12-05 23:42:05 +0000", "tag": "2.6.8"}, "releases": 30, "last_push": "2020-12-01 05:58:38 +0000", "stars": 103, "issues": {"open": 35, "closed": 59}}, "stats": {"instances_month": 387, "install_events_month": 5, "instances_week": 276, "install_events_week": 1}}, {"id": "customControl", "published": "2015-04-26 00:00:00 +0000", "title": "Custom Control Editor", "description": "Makes custom controls editable via the settings dialog", "archive": "https://github.com/Salandora/octoprint-customControl/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/octoprint-customControl", "page": "https://plugins.octoprint.org/plugins/customControl/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/customControl/img4.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.2.2", "date": "2020-05-07 13:14:45 +0000", "tag": "0.2.2"}, "releases": 4, "last_push": "2020-05-03 22:33:36 +0000", "stars": 25, "issues": {"open": 24, "closed": 17}}, "stats": {"instances_month": 1657, "install_events_month": 78, "instances_week": 1236, "install_events_week": 17}}, {"id": "octoglow", "published": "2015-05-12 00:00:00 +0000", "title": "OctoGlow", "description": "Display OctoPrint status on a PiGlow board.", "archive": "https://github.com/dmalec/OctoPrint-OctoGlow/archive/master.zip", "author": "Dan Malec", "homepage": "https://github.com/dmalec/OctoPrint-OctoGlow", "page": "https://plugins.octoprint.org/plugins/octoglow/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "CC BY-NC-SA 4.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octoglow/progress.png", "abandoned": false, "github": {"last_push": "2015-03-08 15:12:11 +0000", "stars": 6, "issues": {"open": 5, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "snapstream", "published": "2015-05-22 00:00:00 +0000", "title": "SnapStream", "description": "Emulate webcam streaming by showing a sequence of snapshots", "archive": "https://github.com/markwal/OctoPrint-SnapStream/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-SnapStream", "page": "https://plugins.octoprint.org/plugins/snapstream/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.3", "date": "2021-02-17 05:43:59 +0000", "tag": "0.3"}, "releases": 2, "last_push": "2021-02-17 05:39:43 +0000", "stars": 6, "issues": {"open": 5, "closed": 3}}, "stats": {"instances_month": 134, "install_events_month": 22, "instances_week": 86, "install_events_week": 3}}, {"id": "systemcommandeditor", "published": "2015-06-03 00:00:00 +0000", "title": "System Command Editor", "description": "This plugin makes System Commands editable through the OctoPrint WebUI", "archive": "https://github.com/synman/OctoPrint-SystemCommandEditor/archive/master.zip", "author": "Shell M. Shrader, Marc Hannappel", "homepage": "https://github.com/synman/OctoPrint-SystemCommandEditor", "page": "https://plugins.octoprint.org/plugins/systemcommandeditor/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/systemCommandEditor/img1.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2022-12-26 02:54:09 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2022-12-26 20:05:32 +0000", "stars": 5, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 929, "install_events_month": 50, "instances_week": 713, "install_events_week": 10}}, {"id": "editorcollection", "published": "2015-06-04 00:00:00 +0000", "title": "Editor Collection", "description": "This plugin is for putting Salandora's editor plugins onto one page", "archive": "https://github.com/Salandora/OctoPrint-EditorCollection/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-EditorCollection", "page": "https://plugins.octoprint.org/plugins/editorcollection/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/editorCollection/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Editor Collection Version 0.1.2", "date": "2015-07-24 22:01:17 +0000", "tag": "0.1.2"}, "releases": 2, "last_push": "2020-05-22 17:19:11 +0000", "stars": 1, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 47, "install_events_month": 3, "instances_week": 41, "install_events_week": 1}}, {"id": "screensquish", "published": "2015-06-17 00:00:00 +0000", "title": "ScreenSquish", "description": "Scalable UI that does some old fashioned (v2) bootstrap responsive and some collapse etc.", "archive": "https://github.com/markwal/OctoPrint-ScreenSquish/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-ScreenSquish", "page": "https://plugins.octoprint.org/plugins/screensquish/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/screensquish/squishsample.png", "abandoned": false, "github": {"latest_release": {"name": "0.4", "date": "2020-05-10 04:17:01 +0000", "tag": "0.4"}, "releases": 1, "last_push": "2020-05-10 04:14:50 +0000", "stars": 5, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 44, "install_events_month": 4, "instances_week": 30, "install_events_week": 2}}, {"id": "stlviewer", "published": "2015-06-20 00:00:00 +0000", "title": "STL Viewer", "description": "Simple stl viewer tab from uploaded files.", "archive": "https://github.com/jneilliii/Octoprint-STLViewer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/Octoprint-STLViewer", "page": "https://plugins.octoprint.org/plugins/stlviewer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stlviewer/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.4.2", "date": "2019-10-22 02:50:02 +0000", "tag": "0.4.2"}, "releases": 5, "last_push": "2024-01-14 15:59:05 +0000", "stars": 21, "issues": {"open": 1, "closed": 22}}, "stats": {"instances_month": 1833, "install_events_month": 187, "instances_week": 1208, "install_events_week": 32}}, {"id": "commandsplitter", "published": "2015-06-21 00:00:00 +0000", "title": "CommandSplitter", "description": "Splits multiple commands on one line in GCODE files into multiple lines", "archive": "https://github.com/OctoPrint/OctoPrint-CommandSplitter/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-CommandSplitter", "page": "https://plugins.octoprint.org/plugins/commandsplitter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.3 (stable)", "date": "2020-07-28 18:24:14 +0000", "tag": "0.2.3"}, "releases": 5, "last_push": "2022-06-23 08:52:19 +0000", "stars": 2, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 45, "install_events_month": 13, "instances_week": 27, "install_events_week": 0}}, {"id": "requestspinner", "published": "2015-06-21 00:00:00 +0000", "title": "RequestSpinner", "description": "Shows a little spinner in the web frontend when background requests are active", "archive": "https://github.com/OctoPrint/OctoPrint-RequestSpinner/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-RequestSpinner", "page": "https://plugins.octoprint.org/plugins/requestspinner/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/requestspinner/requestspinner.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.0 (stable)", "date": "2020-04-24 17:19:24 +0000", "tag": "0.2.0"}, "releases": 3, "last_push": "2020-04-24 17:17:58 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 147, "install_events_month": 3, "instances_week": 124, "install_events_week": 1}}, {"id": "autoselect", "published": "2015-06-27 00:00:00 +0000", "title": "Autoselect", "description": "Automatically selects freshly uploaded files for printing if no print job is currently active.", "archive": "https://github.com/OctoPrint/OctoPrint-Autoselect/archive/master.zip", "author": "Jubaleth, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Autoselect", "page": "https://plugins.octoprint.org/plugins/autoselect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.3.0 (stable)", "date": "2020-05-02 22:37:45 +0000", "tag": "0.3.0"}, "releases": 3, "last_push": "2020-05-02 22:35:41 +0000", "stars": 9, "issues": {"open": 4, "closed": 6}}, "stats": {"instances_month": 927, "install_events_month": 27, "instances_week": 717, "install_events_week": 1}}, {"id": "status_line", "published": "2015-07-04 00:00:00 +0000", "title": "StatusLine", "description": "Display M117 (Display Message) in the SideBar", "archive": "https://github.com/AmedeeBulle/StatusLine/archive/master.zip", "author": "Philippe Vanhaesendonck", "homepage": "https://github.com/AmedeeBulle/StatusLine", "page": "https://plugins.octoprint.org/plugins/status_line/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/AmedeeBulle/StatusLine/master/status_line.png", "abandoned": false, "github": {"last_push": "2020-06-17 09:19:09 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 175, "install_events_month": 9, "instances_week": 124, "install_events_week": 1}}, {"id": "yamlpatcher", "published": "2015-07-07 00:00:00 +0000", "title": "Yamlpatcher", "description": "Allows patching up config.yaml through the web interface", "archive": "https://github.com/OctoPrint/OctoPrint-Yamlpatcher/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Yamlpatcher", "page": "https://plugins.octoprint.org/plugins/yamlpatcher/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "http://i.imgur.com/Xs1xGHu.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1 (stable)", "date": "2016-01-19 09:09:11 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2019-08-01 12:32:55 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 23, "install_events_month": 3, "instances_week": 17, "install_events_week": 0}}, {"id": "octobullet", "published": "2015-07-23 00:00:00 +0000", "title": "Pushbullet", "description": "Pushes notifications about finished print jobs via Pushbullet", "archive": "https://github.com/OctoPrint/OctoPrint-Pushbullet/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Pushbullet", "page": "https://plugins.octoprint.org/plugins/octobullet/", "compatibility": {"octoprint": ["1.2.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octobullet/example_push.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.14", "date": "2020-10-17 13:53:25 +0000", "tag": "0.1.14"}, "releases": 13, "last_push": "2020-10-17 13:50:18 +0000", "stars": 13, "issues": {"open": 8, "closed": 20}}, "stats": {"instances_month": 227, "install_events_month": 9, "instances_week": 174, "install_events_week": 0}}, {"id": "eeprom_repetier", "published": "2015-07-28 00:00:00 +0000", "title": "EEPROM Repetier Editor", "description": "Makes it possible to change the EEPROM values of Repetier Firmware through OctoPrint", "archive": "https://github.com/Salandora/OctoPrint-EEprom-Repetier/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-EEprom-Repetier", "page": "https://plugins.octoprint.org/plugins/eeprom_repetier/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_repetier/eeprom_values.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.6", "date": "2021-04-08 06:12:14 +0000", "tag": "0.1.6"}, "releases": 5, "last_push": "2021-05-02 05:53:13 +0000", "stars": 9, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 159, "install_events_month": 10, "instances_week": 110, "install_events_week": 1}}, {"id": "displayprogress", "published": "2015-08-03 00:00:00 +0000", "title": "DisplayProgress", "description": "Displays the print progress on the printer's display", "archive": "https://github.com/OctoPrint/OctoPrint-DisplayProgress/archive/master.zip", "author": "jneilliii, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-DisplayProgress", "page": "https://plugins.octoprint.org/plugins/displayprogress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/displayprogress/example.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2020-05-20 07:15:51 +0000", "tag": "0.1.3"}, "releases": 4, "last_push": "2020-05-20 07:13:26 +0000", "stars": 18, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 1449, "install_events_month": 115, "instances_week": 1016, "install_events_week": 23}}, {"id": "eeprom_marlin", "published": "2015-08-30 00:00:00 +0000", "title": "Marlin EEPROM Editor", "description": "Makes it possible to change the EEPROM values of Marlin Firmware through OctoPrint", "archive": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin/releases/latest/download/release.zip", "author": "Charlie Powell, Anderson Silva", "homepage": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin", "page": "https://plugins.octoprint.org/plugins/eeprom_marlin/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_marlin/firmware_info.png", "abandoned": false, "github": {"latest_release": {"name": "3.3.0 Stable Release", "date": "2023-01-03 15:29:43 +0000", "tag": "3.3.0"}, "releases": 16, "last_push": "2023-12-27 13:00:34 +0000", "stars": 31, "issues": {"open": 7, "closed": 61}}, "stats": {"instances_month": 4596, "install_events_month": 394, "instances_week": 3274, "install_events_week": 94}}, {"id": "stats", "published": "2015-09-13 00:00:00 +0000", "title": "Printer Statistics", "description": "Statistics of your 3D Printer", "archive": "https://github.com/AlexVerrico/octoprint-stats/archive/master.zip", "author": "Alex Verrico, Anderson Silva", "homepage": "https://github.com/AlexVerrico/octoprint-stats", "page": "https://plugins.octoprint.org/plugins/stats/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.5,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stats/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.4 - bugfix, courtesy of @jneilliii", "date": "2023-07-30 22:22:07 +0000", "tag": "v3.1.4"}, "releases": 5, "last_push": "2024-02-05 02:45:09 +0000", "stars": 14, "issues": {"open": 7, "closed": 15}}, "stats": {"instances_month": 998, "install_events_month": 36, "instances_week": 684, "install_events_week": 14}}, {"id": "automaticshutdown", "published": "2015-09-22 00:00:00 +0000", "title": "AutomaticShutdown", "description": "Plugin to enable automatic system shutdown after finishing a print job", "archive": "https://github.com/OctoPrint/OctoPrint-AutomaticShutdown/archive/master.zip", "author": "Nicanor Romero Venier", "homepage": "https://github.com/OctoPrint/OctoPrint-AutomaticShutdown", "page": "https://plugins.octoprint.org/plugins/automaticshutdown/", "compatibility": {"octoprint": ["1.2.5"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/automaticshutdown/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2022-01-18 18:18:22 +0000", "tag": "0.1.5"}, "releases": 4, "last_push": "2022-01-18 18:15:32 +0000", "stars": 18, "issues": {"open": 11, "closed": 22}}, "stats": {"instances_month": 574, "install_events_month": 47, "instances_week": 338, "install_events_week": 12}}, {"id": "displayz", "published": "2015-09-22 00:00:00 +0000", "title": "DisplayZ", "description": "Brings back the current Z display in the state sidebar panel", "archive": "https://github.com/foosel/OctoPrint-DisplayZ/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/foosel/OctoPrint-DisplayZ", "page": "https://plugins.octoprint.org/plugins/displayz/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/displayz/displayz.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2020-07-01 08:01:36 +0000", "tag": "0.2.0"}, "releases": 1, "last_push": "2020-07-04 20:01:44 +0000", "stars": 6, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1563, "install_events_month": 86, "instances_week": 1146, "install_events_week": 16}}, {"id": "portlister", "published": "2015-10-08 00:00:00 +0000", "title": "PortLister", "description": "Refreshes the port list in the browser when a printer shows up", "archive": "https://github.com/markwal/OctoPrint-PortLister/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-PortLister", "page": "https://plugins.octoprint.org/plugins/portlister/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.10", "date": "2020-05-09 22:30:40 +0000", "tag": "0.1.10"}, "releases": 10, "last_push": "2020-05-09 21:54:53 +0000", "stars": 25, "issues": {"open": 3, "closed": 9}}, "stats": {"instances_month": 934, "install_events_month": 72, "instances_week": 717, "install_events_week": 22}}, {"id": "touchui", "published": "2015-10-10 00:00:00 +0000", "title": "TouchUI", "description": "A touch friendly interface for Mobile and TFT touch modules", "archive": "https://github.com/BillyBlaze/OctoPrint-TouchUI/archive/master.zip", "author": "Paul de Vries", "homepage": "https://billyblaze.github.io/OctoPrint-TouchUI", "page": "https://plugins.octoprint.org/plugins/touchui/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://billyblaze.github.io/OctoPrint-TouchUI/images/touchuisample.png", "abandoned": true, "github": {"latest_release": {"name": "0.3.18", "date": "2021-07-05 18:20:53 +0000", "tag": "0.3.18"}, "releases": 22, "last_push": "2021-07-05 18:17:46 +0000", "stars": 275, "issues": {"open": 0, "closed": 524}}, "stats": {"instances_month": 5476, "install_events_month": 455, "instances_week": 3706, "install_events_week": 104}}, {"id": "slack", "published": "2015-10-28 00:00:00 +0000", "title": "Slack", "description": "Send message to Slack chat when printing events happen", "archive": "https://github.com/mkevenaar/OctoPrint-Slack/releases/latest/download/release.zip", "author": "Maurice Kevenaar, Richard Joyce", "homepage": "https://github.com/mkevenaar/OctoPrint-Slack", "page": "https://plugins.octoprint.org/plugins/slack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/slack/slack.png", "abandoned": false, "github": {"latest_release": {"name": "Release 0.2.5", "date": "2021-02-28 18:12:00 +0000", "tag": "0.2.5"}, "releases": 2, "last_push": "2024-05-09 00:41:33 +0000", "stars": 6, "issues": {"open": 18, "closed": 18}}, "stats": {"instances_month": 45, "install_events_month": 5, "instances_week": 41, "install_events_week": 2}}, {"id": "autocalibration", "published": "2015-11-09 00:00:00 +0000", "title": "Autocalibration", "description": "Calibrates your printers backlash for the X, Y or Z-axis.", "archive": "https://github.com/platsch/OctoPrint-Autocalibration/archive/master.zip", "author": "Florens Wasserfall (Platsch)", "homepage": "https://github.com/platsch/OctoPrint-Autocalibration", "page": "https://plugins.octoprint.org/plugins/autocalibration/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autocalibration/screenshot.png", "abandoned": true, "github": {"last_push": "2015-11-10 13:37:58 +0000", "stars": 2, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 36, "install_events_month": 2, "instances_week": 19, "install_events_week": 1}}, {"id": "updatefix127", "published": "2015-12-07 00:00:00 +0000", "title": "Updatefix 1.2.7", "description": "Fixes an issue in OctoPrint 1.2.7 that prevents updating", "archive": "https://github.com/OctoPrint/OctoPrint-Updatefix-1.2.7/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Updatefix-1.2.7", "page": "https://plugins.octoprint.org/plugins/updatefix127/", "compatibility": {"octoprint": [">=1.2.7,<1.2.8"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0 (stable)", "date": "2015-12-07 11:57:36 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2015-12-07 11:47:13 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "eeprom_marlin_printrbot", "published": "2015-12-26 00:00:00 +0000", "title": "EEPROM Printrbot variant of Marlin Editor", "description": "Makes it possible to change the EEPROM values of Printrbot variant of Marlin Firmware through OctoPrint", "archive": "https://github.com/ryanneufeld/OctoPrint-EEPROM-Marlin-Printrbot/archive/master.zip", "author": "Ryan Neufeld", "homepage": "https://github.com/ryanneufeld/OctoPrint-EEPROM-Marlin-Printrbot", "page": "https://plugins.octoprint.org/plugins/eeprom_marlin_printrbot/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2015-12-26 21:30:56 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "active_filters", "published": "2016-01-01 00:00:00 +0000", "title": "Active Filters", "description": "Save terminal filters status", "archive": "https://github.com/MoonshineSG/OctoPrint-ActiveFilters/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-ActiveFilters", "page": "https://plugins.octoprint.org/plugins/active_filters/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "0.0.1", "date": "2016-01-04 08:23:19 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2017-05-12 02:51:56 +0000", "stars": 1, "issues": {"open": 4, "closed": 0}}, "stats": {"instances_month": 14, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "title_status", "published": "2016-01-18 00:00:00 +0000", "title": "Title Status", "description": "Show printers status in window title", "archive": "https://github.com/MoonshineSG/OctoPrint-TitleStatus/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-TitleStatus", "page": "https://plugins.octoprint.org/plugins/title_status/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.5", "date": "2020-06-24 09:08:42 +0000", "tag": "0.0.5"}, "releases": 5, "last_push": "2020-12-09 02:46:05 +0000", "stars": 2, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 233, "install_events_month": 13, "instances_week": 195, "install_events_week": 5}}, {"id": "telegram", "published": "2016-02-25 00:00:00 +0000", "title": "OctoPrint-Telegram", "description": "A plugin to send and react on messages before, during and after a print via Telegram Messenger.", "archive": "https://github.com/fabianonline/OctoPrint-Telegram/archive/master.zip", "author": "Fabian Schlenz", "homepage": "https://github.com/fabianonline/OctoPrint-Telegram", "page": "https://plugins.octoprint.org/plugins/telegram/", "compatibility": {"octoprint": ["1.2.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/telegram/features3.png", "abandoned": false, "github": {"latest_release": {"name": "1.6.7", "date": "2024-05-08 10:15:52 +0000", "tag": "1.6.7"}, "releases": 25, "last_push": "2024-05-08 10:14:50 +0000", "stars": 305, "issues": {"open": 137, "closed": 207}}, "stats": {"instances_month": 3684, "install_events_month": 228, "instances_week": 2617, "install_events_week": 55}}, {"id": "pushover", "published": "2016-04-13 00:00:00 +0000", "title": "Pushover", "description": "A plugin that send a notification with Pushover when the job is done or is failed", "archive": "https://github.com/thijsbekke/OctoPrint-Pushover/archive/master.zip", "author": "Thijs Bekke", "homepage": "https://github.com/thijsbekke/OctoPrint-Pushover/", "page": "https://plugins.octoprint.org/plugins/pushover/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pushover/pushover.png", "abandoned": false, "github": {"latest_release": {"name": "Tweaked the log messages ", "date": "2020-07-16 21:25:46 +0000", "tag": "0.3.8"}, "releases": 23, "last_push": "2020-07-21 18:55:41 +0000", "stars": 32, "issues": {"open": 17, "closed": 41}}, "stats": {"instances_month": 647, "install_events_month": 23, "instances_week": 522, "install_events_week": 1}}, {"id": "redeem", "published": "2016-04-26 00:00:00 +0000", "title": "OctoPrint Redeem", "description": "Control Redeems configuration", "archive": "https://github.com/eliasbakken/octoprint_redeem/archive/master.zip", "author": "Elias Bakken", "homepage": "http://wiki.thing-printer.com/index.php?title=Main_Page", "page": "https://plugins.octoprint.org/plugins/redeem/", "compatibility": {"octoprint": ["1.2.8"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "http://www.thing-printer.com/wp-content/uploads/2016/04/octoprint-redeem.png", "abandoned": false, "github": {"last_push": "2017-08-28 06:07:26 +0000", "stars": 0, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "cost", "published": "2016-06-11 00:00:00 +0000", "title": "Cost estimator", "description": "When a file is loaded to be printed, it will display the estimated cost of printing.", "archive": "https://github.com/jasiek/OctoPrint-Cost/archive/master.zip", "author": "Jan Szumiec", "homepage": "https://github.com/jasiek/OctoPrint-Cost", "page": "https://plugins.octoprint.org/plugins/cost/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "MIT", "abandoned": true, "github": {"latest_release": {"name": "0.1.3: The Missing Release", "date": "2017-07-13 10:32:48 +0000", "tag": "0.1.3"}, "releases": 1, "last_push": "2019-12-14 13:07:40 +0000", "stars": 10, "issues": {"open": 16, "closed": 5}}, "stats": {"instances_month": 115, "install_events_month": 1, "instances_week": 76, "install_events_week": 0}}, {"id": "autoscroll", "published": "2016-06-27 00:00:00 +0000", "title": "Autoscroll", "description": "Turn on/off terminal autoscroll when scrolling up/down", "archive": "https://github.com/MoonshineSG/OctoPrint-Autoscroll/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-Autoscroll", "page": "https://plugins.octoprint.org/plugins/autoscroll/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.3", "date": "2020-05-08 01:24:30 +0000", "tag": "0.0.3"}, "releases": 3, "last_push": "2020-05-08 01:23:26 +0000", "stars": 6, "issues": {"open": 3, "closed": 1}}, "stats": {"instances_month": 1694, "install_events_month": 51, "instances_week": 1243, "install_events_week": 15}}, {"id": "filament_sensor", "published": "2016-06-29 00:00:00 +0000", "title": "Filament Sensor", "description": "Use a filament sensor to pause printing when filament runs out.", "archive": "https://github.com/MoonshineSG/OctoPrint-Filament/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-Filament", "page": "https://plugins.octoprint.org/plugins/filament_sensor/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2016-06-29 02:42:55 +0000", "tag": "1.0.1"}, "releases": 1, "last_push": "2018-04-17 08:28:41 +0000", "stars": 26, "issues": {"open": 16, "closed": 10}}, "stats": {"instances_month": 36, "install_events_month": 3, "instances_week": 22, "install_events_week": 1}}, {"id": "multi_colors", "published": "2016-06-29 00:00:00 +0000", "title": "Multi Colors", "description": "Inject GCODE at specified layers to allow multi color printing", "archive": "https://github.com/MoonshineSG/OctoPrint-MultiColors/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-MultiColors", "page": "https://plugins.octoprint.org/plugins/multi_colors/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.17", "date": "2020-05-08 01:21:01 +0000", "tag": "1.0.17"}, "releases": 20, "last_push": "2020-05-08 01:19:23 +0000", "stars": 21, "issues": {"open": 11, "closed": 31}}, "stats": {"instances_month": 694, "install_events_month": 40, "instances_week": 506, "install_events_week": 8}}, {"id": "gcodebar", "published": "2016-09-01 00:00:00 +0000", "title": "GCodeBar", "description": "Send GCode from the sidebar", "archive": "https://github.com/mtowara/OctoPrint-Gcodebar/archive/master.zip", "author": "Markus Towara", "homepage": "https://github.com/mtowara/OctoPrint-Gcodebar", "page": "https://plugins.octoprint.org/plugins/gcodebar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodebar/gcodebar.png", "abandoned": false, "github": {"latest_release": {"name": "Python3 compability", "date": "2019-12-12 10:06:48 +0000", "tag": "0.1.5"}, "releases": 2, "last_push": "2019-12-12 09:59:06 +0000", "stars": 4, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 406, "install_events_month": 18, "instances_week": 292, "install_events_week": 3}}, {"id": "detailedprogress", "published": "2016-09-02 00:00:00 +0000", "title": "Detailed Progress", "description": "Displays detailed progress on the LCD screen", "archive": "https://github.com/tpmullan/OctoPrint-DetailedProgress/archive/master.zip", "author": "tpmullan", "homepage": "https://github.com/tpmullan/OctoPrint-DetailedProgress", "page": "https://plugins.octoprint.org/plugins/detailedprogress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/detailedprogress/example-eta.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.7", "date": "2021-01-31 18:42:04 +0000", "tag": "0.2.7"}, "releases": 5, "last_push": "2022-04-21 01:59:32 +0000", "stars": 28, "issues": {"open": 13, "closed": 26}}, "stats": {"instances_month": 5047, "install_events_month": 397, "instances_week": 3547, "install_events_week": 90}}, {"id": "slicer", "published": "2016-09-22 00:00:00 +0000", "title": "Full-featured Slicer", "description": "A full-blown GUI-based slicer. Rotate and scale model; slice multiple STL files at a time; set layer height and other slicing settings.", "archive": "https://github.com/kennethjiang/OctoPrint-Slicer/archive/master.zip", "author": "eyal0, Kenneth Jiang", "homepage": "https://github.com/kennethjiang/OctoPrint-Slicer", "page": "https://plugins.octoprint.org/plugins/slicer/", "compatibility": {"octoprint": ["1.2.14"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/slicer/screenshot1.png", "abandoned": true, "github": {"latest_release": {"name": "Support for OctoPrint 1.6.0 (teacher's edition)", "date": "2021-05-07 15:41:20 +0000", "tag": "2.0.0"}, "releases": 40, "last_push": "2021-05-07 15:39:39 +0000", "stars": 98, "issues": {"open": 22, "closed": 118}}, "stats": {"instances_month": 1019, "install_events_month": 131, "instances_week": 616, "install_events_week": 30}}, {"id": "M117NavBar", "published": "2016-10-27 00:00:00 +0000", "title": "OctoPrint-M117NavBar", "description": "Plugin to send M117 gcode messages to the top navbar of OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-M117NavBar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117NavBar", "page": "https://plugins.octoprint.org/plugins/M117NavBar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117NavBar/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2019-10-22 02:42:28 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-14 15:58:54 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 362, "install_events_month": 32, "instances_week": 265, "install_events_week": 5}}, {"id": "M117PopUp", "published": "2016-10-27 00:00:00 +0000", "title": "OctoPrint-M117PopUp", "description": "Plugin to send M117 gcode messages to the web interface.", "archive": "https://github.com/jneilliii/OctoPrint-M117PopUp/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117PopUp", "page": "https://plugins.octoprint.org/plugins/M117PopUp/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117PopUp/screenshot_1.png", "abandoned": false, "github": {"latest_release": {"name": "0.6.2", "date": "2019-11-25 04:53:34 +0000", "tag": "0.6.2"}, "releases": 8, "last_push": "2024-01-14 15:58:52 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 91, "install_events_month": 11, "instances_week": 53, "install_events_week": 1}}, {"id": "filemanager", "published": "2016-12-09 00:00:00 +0000", "title": "FileManager", "description": "A simple filemanager for OctoPrint", "archive": "https://github.com/Salandora/OctoPrint-FileManager/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-FileManager", "page": "https://plugins.octoprint.org/plugins/filemanager/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filemanager/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.6", "date": "2021-02-28 18:48:54 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2021-02-28 18:04:17 +0000", "stars": 27, "issues": {"open": 16, "closed": 21}}, "stats": {"instances_month": 6449, "install_events_month": 545, "instances_week": 4671, "install_events_week": 94}}, {"id": "filament_sensor_reloaded", "published": "2017-01-06 00:00:00 +0000", "title": "Filament Sensor Reloaded", "description": "Use a filament sensor to pause printing when filament runs out.", "archive": "https://github.com/nickmitchko/Octoprint-Filament-Reloaded/archive/master.zip", "author": "kontakt, ssorgatem, nickmitchko", "homepage": "https://github.com/nickmitchko/Octoprint-Filament-Reloaded", "page": "https://plugins.octoprint.org/plugins/filament_sensor_reloaded/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.4.3", "date": "2023-03-06 17:28:18 +0000", "tag": "1.4.3"}, "releases": 11, "last_push": "2023-03-06 17:26:06 +0000", "stars": 9, "issues": {"open": 2, "closed": 13}}, "stats": {"instances_month": 479, "install_events_month": 35, "instances_week": 326, "install_events_week": 5}}, {"id": "smsnotifier", "published": "2017-01-10 00:00:00 +0000", "title": "SMS Notifier (with Twilio)", "description": "Recieve SMS notifications when OctoPrint jobs are complete.", "archive": "https://github.com/taxilian/OctoPrint-Twilio/archive/master.zip", "author": "Richard Bteman", "homepage": "https://github.com/taxilian/OctoPrint-Twilio", "page": "https://plugins.octoprint.org/plugins/smsnotifier/", "compatibility": {"octoprint": ["1.2.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/smsnotifier/smsnotifier.png", "abandoned": false, "github": {"last_push": "2020-12-08 10:14:56 +0000", "stars": 5, "issues": {"open": 2, "closed": 12}}, "stats": {"instances_month": 190, "install_events_month": 11, "instances_week": 134, "install_events_week": 1}}, {"id": "fullscreen", "published": "2017-01-16 00:00:00 +0000", "title": "Fullscreen Webcam", "description": "Open the webcam feed in fullscreen mode with extra details about the printjob", "archive": "https://github.com/BillyBlaze/OctoPrint-FullScreen/archive/master.zip", "author": "Paul de Vries", "homepage": "https://github.com/BillyBlaze/OctoPrint-FullScreen", "page": "https://plugins.octoprint.org/plugins/fullscreen/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/fullscreen_webcam/main.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.0.6", "date": "2020-11-22 14:35:43 +0000", "tag": "0.0.6"}, "releases": 6, "last_push": "2020-11-22 14:29:52 +0000", "stars": 24, "issues": {"open": 14, "closed": 23}}, "stats": {"instances_month": 8494, "install_events_month": 563, "instances_week": 6165, "install_events_week": 132}}, {"id": "freemobilenotifier", "published": "2017-01-25 00:00:00 +0000", "title": "OctoPrint_FreeMobile-Notifier", "description": "Octoprint plugin for print completion notifications using Free (Free is a French telecommunications company)", "archive": "https://github.com/Pinaute/OctoPrint_FreeMobile-Notifier/archive/master.zip", "author": "Antoine CAVARD", "homepage": "https://github.com/Pinaute/OctoPrint_FreeMobile-Notifier", "page": "https://plugins.octoprint.org/plugins/freemobilenotifier/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/freemobilenotifier/freemobilenotifier.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2020-12-02 22:03:47 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2020-12-02 21:56:26 +0000", "stars": 1, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 72, "install_events_month": 5, "instances_week": 48, "install_events_week": 1}}, {"id": "psucontrol", "published": "2017-01-25 00:00:00 +0000", "title": "PSU Control", "description": "Smart control of your power supply via GPIO, GCODE Command, System Command, or variety of sub-plugins.", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl", "page": "https://plugins.octoprint.org/plugins/psucontrol/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/kantlivelong/OctoPrint-PSUControl/master/psucontrol_navbar_settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2021-05-12 14:08:04 +0000", "tag": "1.0.6"}, "releases": 19, "last_push": "2021-08-18 02:08:27 +0000", "stars": 202, "issues": {"open": 59, "closed": 180}}, "stats": {"instances_month": 6575, "install_events_month": 505, "instances_week": 4865, "install_events_week": 114}}, {"id": "slic3r", "published": "2017-02-07 00:00:00 +0000", "title": "OctoPrint-Slic3r", "description": "Adds support for slicing via Slic3r from within OctoPrint", "archive": "https://github.com/OctoPrint/OctoPrint-Slic3r/archive/master.zip", "author": "Javier Mart\u00ednez Arrieta, Eyal Soha", "homepage": "https://github.com/OctoPrint/OctoPrint-Slic3r", "page": "https://plugins.octoprint.org/plugins/slic3r/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/slic3r/logo.png", "abandoned": false, "github": {"latest_release": {"name": "Update to work with PrusaSlicer 2.4", "date": "2022-08-29 17:06:02 +0000", "tag": "1.3.1"}, "releases": 9, "last_push": "2022-08-29 17:05:28 +0000", "stars": 88, "issues": {"open": 10, "closed": 41}}, "stats": {"instances_month": 402, "install_events_month": 42, "instances_week": 272, "install_events_week": 10}}, {"id": "tobecaplugin", "published": "2017-02-16 00:00:00 +0000", "title": "Tobeca Plugin", "description": "Plugin for OctoPrint that adds a special tab with commands for the Tobeca 3d printer.", "archive": "https://github.com/tobeca/OctoPrint-TobecaPlugin/archive/master.zip", "author": "Saymtech", "homepage": "https://github.com/tobeca/OctoPrint-TobecaPlugin/", "page": "https://plugins.octoprint.org/plugins/tobecaplugin/", "compatibility": {"octoprint": ["1.2.16"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2017-03-08 14:38:22 +0000", "tag": "0.1.3"}, "releases": 3, "last_push": "2017-03-08 14:36:23 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "roomtemp", "published": "2017-03-02 00:00:00 +0000", "title": "Room Temperature", "description": "Display room temperature on navbar", "archive": "https://github.com/l00ma/OctoPrint-roomTemp/archive/master.zip", "author": "Frederic Moutin", "homepage": "https://github.com/l00ma/OctoPrint-roomTemp", "page": "https://plugins.octoprint.org/plugins/roomtemp/", "compatibility": {"octoprint": ["1.3.1"], "os": ["disabled"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/l00ma/OctoPrint-roomTemp/master/RoomTemp.png", "disabled": "This plugin can cause severe server issues in its current form.
\n", "abandoned": false, "github": {"last_push": "2022-11-24 09:02:02 +0000", "stars": 8, "issues": {"open": 14, "closed": 3}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 3, "install_events_week": 0}}, {"id": "touchtest", "published": "2017-03-05 00:00:00 +0000", "title": "Touchtest Bed Leveling", "description": "A simple tool to move the extruder to different touch points around the perimeter of the print bed. Useful for bed leveling.", "archive": "https://github.com/Peaches491/OctoPrint-Touchtest/archive/master.zip", "author": "Daniel Miller", "homepage": "https://github.com/Peaches491/OctoPrint-Touchtest", "page": "https://plugins.octoprint.org/plugins/touchtest/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/touchtest/example.png", "abandoned": false, "github": {"latest_release": {"name": "Style fixes", "date": "2020-11-06 17:03:32 +0000", "tag": "0.4.1"}, "releases": 3, "last_push": "2020-11-06 17:02:06 +0000", "stars": 6, "issues": {"open": 12, "closed": 13}}, "stats": {"instances_month": 759, "install_events_month": 68, "instances_week": 532, "install_events_week": 20}}, {"id": "ledstripcontrol", "published": "2017-03-10 00:00:00 +0000", "title": "LEDStripControl", "description": "Control RGB LED Strips via your Raspberry Pi and GCode.", "archive": "https://github.com/gbonesso/OctoPrint-LEDStripControl/archive/master.zip", "author": "Gustavo Bonesso, Uriah Welcome", "homepage": "https://github.com/gbonesso/OctoPrint-LEDStripControl", "page": "https://plugins.octoprint.org/plugins/ledstripcontrol/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-09-27 15:42:33 +0000", "tag": "v0.3.8"}, "releases": 1, "last_push": "2022-09-27 21:06:22 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 168, "install_events_month": 2, "instances_week": 117, "install_events_week": 1}}, {"id": "gcodesystemcommands", "published": "2017-03-14 00:00:00 +0000", "title": "GCODE System Commands", "description": "Define G-Code commands that execute local system commands", "archive": "https://github.com/kantlivelong/OctoPrint-GCodeSystemCommands/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-GCodeSystemCommands", "page": "https://plugins.octoprint.org/plugins/gcodesystemcommands/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodesystemcommands/gcodesystemcommands_settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2020-04-27 20:44:10 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2020-04-28 20:46:34 +0000", "stars": 37, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 641, "install_events_month": 24, "instances_week": 469, "install_events_week": 5}}, {"id": "enclosure", "published": "2017-03-15 00:00:00 +0000", "title": "OctoPrint-Enclosure", "description": "Control printer environment (Temperature control / Lights / Fans and Filament Sensor) using Raspberry Pi GPIO", "archive": "https://github.com/vitormhenrique/OctoPrint-Enclosure/archive/master.zip", "author": "Vitor Henrique", "homepage": "https://github.com/vitormhenrique/OctoPrint-Enclosure", "page": "https://plugins.octoprint.org/plugins/enclosure/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/enclosure/Plugin_Temperature_Control.png", "abandoned": false, "github": {"latest_release": {"name": "Fixed missing library", "date": "2021-10-18 14:01:27 +0000", "tag": "4.13.2"}, "releases": 28, "last_push": "2022-03-12 19:00:46 +0000", "stars": 391, "issues": {"open": 152, "closed": 269}}, "stats": {"instances_month": 3052, "install_events_month": 158, "instances_week": 2215, "install_events_week": 47}}, {"id": "OctoRemote", "published": "2017-03-29 00:00:00 +0000", "title": "OctoPrint-Octoremote", "description": "Control your 3D-Printer with an Arduino and a Keypad or a custom remote", "archive": "https://github.com/pkElectronics/OctoPrint-Octoremote/archive/master.zip", "author": "Pascal Krumme", "homepage": "https://github.com/pkElectronics/OctoPrint-Octoremote", "page": "https://plugins.octoprint.org/plugins/OctoRemote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoRemote/Hardware1.JPG", "abandoned": false, "github": {"latest_release": {"name": "Release 0.1.2", "date": "2018-02-03 18:34:53 +0000", "tag": "0.1.2"}, "releases": 1, "last_push": "2018-02-03 18:48:19 +0000", "stars": 23, "issues": {"open": 1, "closed": 10}}, "stats": {"instances_month": 6, "install_events_month": 2, "instances_week": 2, "install_events_week": 1}}, {"id": "tempsgraph", "published": "2017-03-29 00:00:00 +0000", "title": "OctoPrint-Tempsgraph", "description": "Replaces the temperature graph with an interactive and zoomable one", "archive": "https://github.com/1r0b1n0/OctoPrint-Tempsgraph/archive/master.zip", "author": "Robin Vanhove", "homepage": "https://github.com/1r0b1n0/OctoPrint-Tempsgraph", "page": "https://plugins.octoprint.org/plugins/tempsgraph/", "compatibility": {"octoprint": ["1.3.2"], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/tempsgraph/zoom.png", "abandoned": false, "github": {"latest_release": {"name": "Fixes for more responsive design", "date": "2021-03-11 10:29:27 +0000", "tag": "0.3.7"}, "releases": 10, "last_push": "2021-03-11 09:43:10 +0000", "stars": 18, "issues": {"open": 21, "closed": 9}}, "stats": {"instances_month": 963, "install_events_month": 45, "instances_week": 702, "install_events_week": 9}}, {"id": "temperaturefailesafe", "published": "2017-04-14 00:00:00 +0000", "title": "TemperatureFailsafe", "description": "Execute shell commands when temperatures violate thresholds", "archive": "https://github.com/google/OctoPrint-TemperatureFailsafe/archive/master.zip", "author": "Uriah Welcome", "homepage": "https://github.com/google/OctoPrint-TemperatureFailsafe", "page": "https://plugins.octoprint.org/plugins/temperaturefailesafe/", "compatibility": {"octoprint": ["1.3.1"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": true, "github": {"last_push": "2020-01-27 21:41:25 +0000", "stars": 26, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 297, "install_events_month": 13, "instances_week": 199, "install_events_week": 4}}, {"id": "finetunerptr", "published": "2017-04-23 00:00:00 +0000", "title": "OctoPrint-Finetunerptr", "description": "Control important maintenance and calibration settings easy accessible from a dropdown-button in the navbar.", "archive": "https://github.com/xyzaxyz/OctoPrint-Finetunerptr/archive/master.zip", "author": "Andreas Bruckmann", "homepage": "https://github.com/xyzaxyz/OctoPrint-Finetunerptr", "page": "https://plugins.octoprint.org/plugins/finetunerptr/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/finetunerptr/OctoPrint-FineTuneRptr.png", "abandoned": false, "github": {"latest_release": {"name": "V1.3.6.3", "date": "2018-03-17 15:44:14 +0000", "tag": "1.3.6.3"}, "releases": 4, "last_push": "2018-03-17 15:41:53 +0000", "stars": 8, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "octoprint-grbl-plugin", "published": "2017-05-11 00:00:00 +0000", "title": "Grbl support for OctoPrint", "description": "Support Grbl style GCODE for using CNCs and Laser engravers with OctoPrint.", "archive": "https://github.com/mic159/octoprint-grbl-plugin/archive/master.zip", "author": "mic159", "homepage": "https://github.com/mic159/octoprint-grbl-plugin", "page": "https://plugins.octoprint.org/plugins/octoprint-grbl-plugin/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<3"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/grbl/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2018-04-19 13:45:43 +0000", "tag": "1.0.2"}, "releases": 3, "last_push": "2018-04-19 13:46:50 +0000", "stars": 36, "issues": {"open": 8, "closed": 2}}, "stats": {"instances_month": 3, "install_events_month": 1, "instances_week": 3, "install_events_week": 0}}, {"id": "OctoPNP", "published": "2017-05-19 00:00:00 +0000", "title": "OctoPNP", "description": "OctoPrint plugin for camera based pick 'n place operations", "archive": "https://github.com/platsch/OctoPNP/archive/master.zip", "author": "Florens Wasserfall", "homepage": "https://github.com/platsch/OctoPNP", "page": "https://plugins.octoprint.org/plugins/OctoPNP/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoPNP/screenshot.png", "abandoned": false, "github": {"last_push": "2021-11-01 10:13:03 +0000", "stars": 39, "issues": {"open": 5, "closed": 1}}, "stats": {"instances_month": 17, "install_events_month": 3, "instances_week": 15, "install_events_week": 0}}, {"id": "Octoslack", "published": "2017-05-20 00:00:00 +0000", "title": "Octoslack", "description": "An OctoPrint plugin for monitoring your printer and prints via Slack, Mattermost, Pushbullet, Pushover, Rocket.Chat, Discord, Riot/Matrix, or Microsoft Teams", "archive": "https://github.com/fraschetti/Octoslack/archive/master.zip", "author": "Chris Fraschetti", "homepage": "https://github.com/fraschetti/Octoslack", "page": "https://plugins.octoprint.org/plugins/Octoslack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/Octoslack/Octoslack-PrintProgress_SlackOnly.png", "abandoned": false, "github": {"latest_release": {"name": "2.2.0 - Migration to native Slack libraries", "date": "2021-05-15 05:46:12 +0000", "tag": "2.2.0"}, "releases": 27, "last_push": "2022-11-05 07:55:19 +0000", "stars": 74, "issues": {"open": 40, "closed": 75}}, "stats": {"instances_month": 457, "install_events_month": 29, "instances_week": 367, "install_events_week": 9}}, {"id": "actioncommands", "published": "2017-06-30 00:00:00 +0000", "title": "Action Commands", "description": "Adds handling for user-definable action commands.", "archive": "https://github.com/benlye/OctoPrint-ActionCommandsPlugin/archive/master.zip", "author": "Ben Lye", "homepage": "https://github.com/benlye/OctoPrint-ActionCommandsPlugin", "page": "https://plugins.octoprint.org/plugins/actioncommands/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/actioncommands/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.5", "date": "2022-02-04 08:39:29 +0000", "tag": "0.5"}, "releases": 5, "last_push": "2022-02-04 08:35:15 +0000", "stars": 16, "issues": {"open": 1, "closed": 6}}, "stats": {"instances_month": 627, "install_events_month": 33, "instances_week": 470, "install_events_week": 6}}, {"id": "BLTouch", "published": "2017-07-14 00:00:00 +0000", "title": "OctoPrint-BLTouch", "description": "Simple plugin to add BLTouch controls to the Control tab.", "archive": "https://github.com/jneilliii/OctoPrint-BLTouch/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BLTouch", "page": "https://plugins.octoprint.org/plugins/BLTouch/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BLTouch/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.4", "date": "2020-10-08 20:04:11 +0000", "tag": "0.3.4"}, "releases": 9, "last_push": "2024-01-14 15:58:39 +0000", "stars": 19, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 8777, "install_events_month": 730, "instances_week": 5973, "install_events_week": 156}}, {"id": "polarcloud", "published": "2017-07-14 00:00:00 +0000", "title": "Polar Cloud", "description": "Connects OctoPrint to the Polar Cloud so you can easily monitor and control OctoPrint outside of your local network", "archive": "https://github.com/markwal/OctoPrint-PolarCloud/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-PolarCloud/blob/master/README.md", "page": "https://plugins.octoprint.org/plugins/polarcloud/", "compatibility": {"octoprint": ["1.3.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/polarcloud/polarcloud.png", "abandoned": false, "github": {"latest_release": {"name": "1.17", "date": "2023-01-21 03:21:06 +0000", "tag": "1.17"}, "releases": 20, "last_push": "2023-01-21 03:14:33 +0000", "stars": 15, "issues": {"open": 8, "closed": 55}}, "stats": {"instances_month": 206, "install_events_month": 14, "instances_week": 130, "install_events_week": 2}}, {"id": "costestimation", "published": "2017-07-16 00:00:00 +0000", "title": "CostEstimation", "description": "Displays the estimated print cost for the loaded model", "archive": "https://github.com/OllisGit/OctoPrint-CostEstimation/releases/latest/download/master.zip", "author": "Sven Lohrmann, Olli", "homepage": "https://github.com/OllisGit/OctoPrint-CostEstimation", "page": "https://plugins.octoprint.org/plugins/costestimation/", "compatibility": {"octoprint": ["1.2.14", "1.3.6", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V3.5.0", "date": "2022-02-14 18:33:44 +0000", "tag": "3.5.0"}, "releases": 6, "last_push": "2022-02-14 18:29:15 +0000", "stars": 21, "issues": {"open": 7, "closed": 14}}, "stats": {"instances_month": 4258, "install_events_month": 313, "instances_week": 3132, "install_events_week": 60}}, {"id": "simpleemergencystop", "published": "2017-07-23 00:00:00 +0000", "title": "Simple Emergency Stop", "description": "Add an emergency stop buton on NavBar!", "archive": "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop/archive/master.zip", "author": "Sebastien Clement (SebClem)", "homepage": "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop", "page": "https://plugins.octoprint.org/plugins/simpleemergencystop/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/simpleemergencystop/emergencystopsign.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2024-04-10 12:31:58 +0000", "tag": "1.0.6"}, "releases": 18, "last_push": "2024-04-10 12:31:01 +0000", "stars": 20, "issues": {"open": 6, "closed": 14}}, "stats": {"instances_month": 9350, "install_events_month": 695, "instances_week": 6587, "install_events_week": 151}}, {"id": "youtubelive", "published": "2017-07-23 00:00:00 +0000", "title": "YouTube Live", "description": "Simple plugin to add a YouTube Live tab to OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-YouTubeLive/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-YouTubeLive", "page": "https://plugins.octoprint.org/plugins/youtubelive/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/youtubelive/tab_screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.5.3", "date": "2024-04-27 00:23:01 +0000", "tag": "0.5.3"}, "releases": 8, "last_push": "2024-04-27 00:21:17 +0000", "stars": 43, "issues": {"open": 4, "closed": 60}}, "stats": {"instances_month": 230, "install_events_month": 30, "instances_week": 145, "install_events_week": 7}}, {"id": "eeprom_MPSelectMini", "published": "2017-08-13 00:00:00 +0000", "title": "EEPROM Editor for Monoprice Select Mini", "description": "Makes it possible to change the EEPROM values of the Monoprice Select Mini or Malyan M200 Firmware through OctoPrint", "archive": "https://github.com/bruhmann/OctoPrint-EEprom-MPSelectMini/archive/master.zip", "author": "Brian Ruhmann", "homepage": "https://github.com/bruhmann/OctoPrint-EEprom-MPSelectMini", "page": "https://plugins.octoprint.org/plugins/eeprom_MPSelectMini/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_mpselectmini/screen.png", "abandoned": false, "github": {"last_push": "2020-07-18 18:24:56 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 73, "install_events_month": 7, "instances_week": 48, "install_events_week": 1}}, {"id": "Hangprinter", "published": "2017-08-20 00:00:00 +0000", "title": "OctoPrint-Hangprinter", "description": "This plugin provides some useful hangprinter control elements. It can be used for setting up and calibration of a Hangprinter.", "archive": "https://github.com/mariolukas/OctoPrint-Hangprinter/archive/master.zip", "author": "Mario Lukas", "homepage": "https://github.com/mariolukas/OctoPrint-Hangprinter", "page": "https://plugins.octoprint.org/plugins/Hangprinter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Hangprinter/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2017-08-24 21:20:06 +0000", "tag": "0.1.5"}, "releases": 5, "last_push": "2017-08-24 21:18:39 +0000", "stars": 2, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "filamentmanager", "published": "2017-08-22 00:00:00 +0000", "title": "FilamentManager", "description": "Filament Manager for OctoPrint", "archive": "https://github.com/OllisGit/OctoPrint-FilamentManager/releases/latest/download/master.zip", "author": "Sven Lohrmann, Olli", "homepage": "https://github.com/OllisGit/OctoPrint-FilamentManager", "page": "https://plugins.octoprint.org/plugins/filamentmanager/", "compatibility": {"octoprint": ["1.3.6", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V1.9.1", "date": "2021-11-15 21:39:39 +0000", "tag": "1.9.1"}, "releases": 11, "last_push": "2021-11-15 21:35:32 +0000", "stars": 52, "issues": {"open": 52, "closed": 64}}, "stats": {"instances_month": 5472, "install_events_month": 313, "instances_week": 3832, "install_events_week": 65}}, {"id": "filetypes", "published": "2017-08-23 00:00:00 +0000", "title": "Filetypes", "description": "Let you select file types visible in upload dialog", "archive": "https://github.com/TheLongRunSmoke/OctoPrint-Filetypes/archive/master.zip", "author": "thelongrunsmoke", "homepage": "https://github.com/TheLongRunSmoke/OctoPrint-Filetypes", "page": "https://plugins.octoprint.org/plugins/filetypes/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filetypes/screen.jpg", "abandoned": true, "github": {"latest_release": {"name": "Initial release", "date": "2017-08-23 04:56:50 +0000", "tag": "v0.1.0"}, "releases": 1, "last_push": "2017-08-23 04:08:46 +0000", "stars": 0, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 9, "install_events_week": 0}}, {"id": "custombackground", "published": "2017-08-27 00:00:00 +0000", "title": "OctoPrint-CustomBackground", "description": "Plugin to change the background image on the temperature graph.", "archive": "https://github.com/jneilliii/OctoPrint-CustomBackground/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-CustomBackground", "page": "https://plugins.octoprint.org/plugins/custombackground/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CustomBackground/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-12-25 07:07:36 +0000", "tag": "1.0.0"}, "releases": 14, "last_push": "2024-01-14 15:58:39 +0000", "stars": 11, "issues": {"open": 2, "closed": 30}}, "stats": {"instances_month": 907, "install_events_month": 54, "instances_week": 696, "install_events_week": 12}}, {"id": "tplinksmartplug", "published": "2017-09-03 00:00:00 +0000", "title": "OctoPrint-TPLinkSmartplug", "description": "Plugin to control TP-Link Smartplug devices from OctoPrint web interface.", "archive": "https://github.com/jneilliii/OctoPrint-TPLinkSmartplug/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TPLinkSmartplug", "page": "https://plugins.octoprint.org/plugins/tplinksmartplug/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TPLinkSmartplug/screenshot_on.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.3", "date": "2023-03-18 14:35:08 +0000", "tag": "1.0.3"}, "releases": 61, "last_push": "2024-01-14 15:59:11 +0000", "stars": 107, "issues": {"open": 29, "closed": 277}}, "stats": {"instances_month": 2951, "install_events_month": 205, "instances_week": 2300, "install_events_week": 53}}, {"id": "RepetierInformer", "published": "2017-09-18 00:00:00 +0000", "title": "OctoPrint-RepetierInformer", "description": "Send notices to the Repetier-Informer app.", "archive": "https://github.com/drdelaney/OctoPrint-RepetierInformer/archive/master.zip", "author": "Dan Delaney", "homepage": "https://github.com/drdelaney/OctoPrint-RepetierInformer", "page": "https://plugins.octoprint.org/plugins/RepetierInformer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/RepetierInformer/RepetierInformer-appNotification.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2018-11-24 18:25:23 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2018-11-24 18:24:16 +0000", "stars": 0, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 0, "install_events_week": 0}}, {"id": "HeaterTimeout", "published": "2017-09-25 00:00:00 +0000", "title": "HeaterTimeout", "description": "Automatically shut off heaters if no print has been started.", "archive": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout/archive/master.zip", "author": "Andrew Cherevatkin, Uriah Welcome", "homepage": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout", "page": "https://plugins.octoprint.org/plugins/HeaterTimeout/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": false, "github": {"latest_release": {"name": "Octoprint HeaterTimeout 0.0.4", "date": "2021-10-19 19:15:21 +0000", "tag": "0.0.4"}, "releases": 1, "last_push": "2023-05-28 14:04:56 +0000", "stars": 4, "issues": {"open": 7, "closed": 0}}, "stats": {"instances_month": 4491, "install_events_month": 272, "instances_week": 3216, "install_events_week": 56}}, {"id": "GcodeEditor", "published": "2017-11-01 00:00:00 +0000", "title": "GcodeEditor", "description": "Edit gcode that's been uploaded to OctoPrint", "archive": "https://github.com/ieatacid/OctoPrint-GcodeEditor/archive/master.zip", "author": "ieatacid", "homepage": "https://github.com/ieatacid/OctoPrint-GcodeEditor", "page": "https://plugins.octoprint.org/plugins/GcodeEditor/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/GcodeEditor/edit_gcode.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.14", "date": "2023-04-17 23:05:49 +0000", "tag": "0.2.14"}, "releases": 13, "last_push": "2023-05-18 01:17:17 +0000", "stars": 21, "issues": {"open": 0, "closed": 29}}, "stats": {"instances_month": 3465, "install_events_month": 176, "instances_week": 2480, "install_events_week": 33}}, {"id": "themeify", "published": "2017-11-11 00:00:00 +0000", "title": "Themeify", "description": "Beautiful themes for octoprint", "archive": "https://github.com/birkbjo/OctoPrint-Themeify/archive/master.zip", "author": "Birk Johansson", "homepage": "https://github.com/birkbjo/OctoPrint-Themeify", "page": "https://plugins.octoprint.org/plugins/themeify/", "compatibility": {"octoprint": ["1.3.5"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/themeify/discorded_ss.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2020-04-02 09:03:04 +0000", "tag": "v1.2.2"}, "releases": 10, "last_push": "2020-09-04 00:25:50 +0000", "stars": 93, "issues": {"open": 64, "closed": 43}}, "stats": {"instances_month": 15949, "install_events_month": 1116, "instances_week": 11744, "install_events_week": 241}}, {"id": "preheat", "published": "2017-11-21 00:00:00 +0000", "title": "Preheat Button", "description": "Automatically heat nozzle and bed to the printing temperature of the current gcode file", "archive": "https://github.com/marian42/octoprint-preheat/archive/master.zip", "author": "Marian Kleineberg", "homepage": "https://github.com/marian42/octoprint-preheat", "page": "https://plugins.octoprint.org/plugins/preheat/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/preheat/preheat.png", "abandoned": false, "github": {"latest_release": {"name": "Add preheat on file select feature and fix a UI bug with UI Customizer", "date": "2021-05-31 22:55:57 +0000", "tag": "0.8.0"}, "releases": 13, "last_push": "2021-05-31 22:41:35 +0000", "stars": 37, "issues": {"open": 8, "closed": 46}}, "stats": {"instances_month": 10833, "install_events_month": 798, "instances_week": 7863, "install_events_week": 171}}, {"id": "tasmota", "published": "2017-11-24 00:00:00 +0000", "title": "OctoPrint-Tasmota", "description": "Simple plugin to control sonoff devices that have been flashed with Tasmota.", "archive": "https://github.com/jneilliii/OctoPrint-Tasmota/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Tasmota", "page": "https://plugins.octoprint.org/plugins/tasmota/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/tasmota/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.3", "date": "2022-10-15 20:46:19 +0000", "tag": "1.1.3"}, "releases": 66, "last_push": "2024-01-14 15:59:09 +0000", "stars": 61, "issues": {"open": 12, "closed": 148}}, "stats": {"instances_month": 1304, "install_events_month": 56, "instances_week": 966, "install_events_week": 14}}, {"id": "astroprint", "published": "2017-12-15 00:00:00 +0000", "title": "AstroPrint Cloud", "description": "Wirelessly manage and monitor your OctoPi powered printer from the AstroPrint Platform (AP Mobile Apps, AP Desktop Software, & AP Web Portal).", "archive": "https://github.com/AstroPrint/OctoPrint-AstroPrint/archive/master.zip", "author": "AstroPrint", "homepage": "https://github.com/AstroPrint/OctoPrint-AstroPrint/blob/master/README.md", "page": "https://plugins.octoprint.org/plugins/astroprint/", "compatibility": {"octoprint": ["1.3.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/astroprint/astroprint-hero.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.6.5", "date": "2021-05-19 19:25:14 +0000", "tag": "1.6.5"}, "releases": 41, "last_push": "2021-05-19 19:24:28 +0000", "stars": 31, "issues": {"open": 15, "closed": 46}}, "stats": {"instances_month": 1077, "install_events_month": 59, "instances_week": 707, "install_events_week": 13}}, {"id": "display_eta", "published": "2017-12-19 00:00:00 +0000", "title": "OctoPrint-Display-ETA", "description": "Show finish time (ETA) for current print.", "archive": "https://github.com/AlexVerrico/Octoprint-Display-ETA/archive/master.zip", "author": "AlexVerrico, Pablo Ventura", "homepage": "https://github.com/AlexVerrico/Octoprint-Display-ETA", "page": "https://plugins.octoprint.org/plugins/display_eta/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/display_eta/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Version 2.2.0 - Feature update", "date": "2022-04-13 11:05:35 +0000", "tag": "2.2.0"}, "releases": 12, "last_push": "2022-04-13 11:03:27 +0000", "stars": 10, "issues": {"open": 8, "closed": 19}}, "stats": {"instances_month": 1965, "install_events_month": 187, "instances_week": 1359, "install_events_week": 42}}, {"id": "TerminalCommands", "published": "2017-12-31 00:00:00 +0000", "title": "OctoPrint-TerminalCommands", "description": "Lets you add custom G-code command buttons to OctoPrint's Terminal view tab", "archive": "https://github.com/ieatacid/OctoPrint-TerminalCommands/archive/master.zip", "author": "ieatacid", "homepage": "https://github.com/ieatacid/OctoPrint-TerminalCommands", "page": "https://plugins.octoprint.org/plugins/TerminalCommands/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TerminalCommands/terminal_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2022-06-04 23:05:02 +0000", "tag": "0.1.8"}, "releases": 8, "last_push": "2022-06-04 23:03:04 +0000", "stars": 12, "issues": {"open": 12, "closed": 8}}, "stats": {"instances_month": 342, "install_events_month": 24, "instances_week": 239, "install_events_week": 5}}, {"id": "firmwareupdater", "published": "2018-01-15 00:00:00 +0000", "title": "Firmware Updater", "description": "Update your printer's firmware from OctoPrint", "archive": "https://github.com/OctoPrint/OctoPrint-FirmwareUpdater/archive/master.zip", "author": "Ben Lye, Gina H\u00e4u\u00dfge, Nicanor Romero Venier", "homepage": "https://github.com/OctoPrint/OctoPrint-FirmwareUpdater", "page": "https://plugins.octoprint.org/plugins/firmwareupdater/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/firmwareupdater/firmware-updater.png", "abandoned": false, "github": {"latest_release": {"name": "1.14.0", "date": "2023-03-20 11:37:33 +0000", "tag": "1.14.0"}, "releases": 76, "last_push": "2023-07-10 07:35:47 +0000", "stars": 347, "issues": {"open": 4, "closed": 255}}, "stats": {"instances_month": 25808, "install_events_month": 1392, "instances_week": 20008, "install_events_week": 314}}, {"id": "m73progress", "published": "2018-01-16 00:00:00 +0000", "title": "M73 Progress", "description": "A plugin to update the built-in progress bar on your printer's LCD.", "archive": "https://github.com/cesarvandevelde/OctoPrint-M73Progress/archive/master.zip", "author": "Cesar Vandevelde", "homepage": "https://github.com/cesarvandevelde/OctoPrint-M73Progress", "page": "https://plugins.octoprint.org/plugins/m73progress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/m73progress/m73progress.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.1", "date": "2020-06-24 06:49:15 +0000", "tag": "v0.2.1"}, "releases": 3, "last_push": "2020-06-24 06:42:12 +0000", "stars": 22, "issues": {"open": 6, "closed": 9}}, "stats": {"instances_month": 2860, "install_events_month": 193, "instances_week": 2061, "install_events_week": 35}}, {"id": "webcamtab", "published": "2018-01-16 00:00:00 +0000", "title": "WebcamTab", "description": "Moves the webcam stream from Control tab to its own Webcam tab.", "archive": "https://github.com/gruvin/OctoPrint-WebcamTab/archive/master.zip", "author": "Sven Lohrmann (original), Bryan J. Rentoul", "homepage": "https://github.com/gruvin/OctoPrint-WebcamTab", "page": "https://plugins.octoprint.org/plugins/webcamtab/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Support for OctoPrint 1.9.0 RELEASE by alex1platon", "date": "2023-06-20 01:10:34 +0000", "tag": "0.3.1"}, "releases": 8, "last_push": "2023-06-20 00:52:56 +0000", "stars": 6, "issues": {"open": 1, "closed": 12}}, "stats": {"instances_month": 1400, "install_events_month": 116, "instances_week": 955, "install_events_week": 26}}, {"id": "floatingnavbar", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-FloatingNavbar", "description": "Make the navbar float/stick to the top of the page.", "archive": "https://github.com/jneilliii/OctoPrint-FloatingNavbar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-FloatingNavbar", "page": "https://plugins.octoprint.org/plugins/floatingnavbar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/floatingnavbar/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.7", "date": "2021-05-02 00:51:38 +0000", "tag": "0.3.7"}, "releases": 9, "last_push": "2024-01-14 15:58:39 +0000", "stars": 10, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 3630, "install_events_month": 129, "instances_week": 2632, "install_events_week": 31}}, {"id": "mqttpublish", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-MQTTPublish", "description": "Add buttons to navbar to publish messages to MQTT server.", "archive": "https://github.com/jneilliii/OctoPrint-MQTTPublish/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MQTTPublish", "page": "https://plugins.octoprint.org/plugins/mqttpublish/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mqttpublish/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.6.0", "date": "2019-10-22 02:57:43 +0000", "tag": "0.6.0"}, "releases": 7, "last_push": "2024-01-14 15:58:56 +0000", "stars": 4, "issues": {"open": 4, "closed": 9}}, "stats": {"instances_month": 277, "install_events_month": 19, "instances_week": 214, "install_events_week": 5}}, {"id": "tasmota_mqtt", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-TasmotaMQTT", "description": "Plugin to control Tasmota devices via MQTT protocol.", "archive": "https://github.com/jneilliii/OctoPrint-TasmotaMQTT/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TasmotaMQTT", "page": "https://plugins.octoprint.org/plugins/tasmota_mqtt/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/tasmota_mqtt/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.9", "date": "2021-10-23 03:30:53 +0000", "tag": "0.3.9"}, "releases": 23, "last_push": "2024-01-14 15:59:12 +0000", "stars": 18, "issues": {"open": 4, "closed": 41}}, "stats": {"instances_month": 360, "install_events_month": 13, "instances_week": 251, "install_events_week": 3}}, {"id": "M117SpeechSynthesis", "published": "2018-01-18 00:00:00 +0000", "title": "OctoPrint-M117SpeechSynthesis", "description": "Plugin to speak aloud M117 gcode messages via the web ui.", "archive": "https://github.com/jneilliii/OctoPrint-M117SpeechSynthesis/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117SpeechSynthesis", "page": "https://plugins.octoprint.org/plugins/M117SpeechSynthesis/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117SpeechSynthesis/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2022-04-16 23:50:38 +0000", "tag": "1.0.0"}, "releases": 14, "last_push": "2024-01-14 15:58:56 +0000", "stars": 6, "issues": {"open": 1, "closed": 12}}, "stats": {"instances_month": 95, "install_events_month": 14, "instances_week": 58, "install_events_week": 2}}, {"id": "taborder", "published": "2018-01-22 00:00:00 +0000", "title": "OctoPrint-TabOrder", "description": "Simple plugin to allow the ordering of tabs within OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-TabOrder/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TabOrder", "page": "https://plugins.octoprint.org/plugins/taborder/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/taborder/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.12", "date": "2020-11-22 18:30:55 +0000", "tag": "0.5.12"}, "releases": 23, "last_push": "2024-01-14 15:59:09 +0000", "stars": 22, "issues": {"open": 3, "closed": 38}}, "stats": {"instances_month": 2995, "install_events_month": 147, "instances_week": 2162, "install_events_week": 35}}, {"id": "atxpihat", "published": "2018-01-25 00:00:00 +0000", "title": "ATXPiHat", "description": "Software support for the ATXPiHat", "archive": "https://github.com/banichow/OctoPrint-Atxpihat/archive/master.zip", "follow_dependency_links": true, "author": "Brian Anichowski", "homepage": "https://www.baprojectworkshop.com", "page": "https://plugins.octoprint.org/plugins/atxpihat/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux"], "python": ">=2.7,<3"}, "license": "Creative Commons", "image": "https://plugins.octoprint.org/assets/img/plugins/atxpihat/screenshot2.png", "abandoned": false, "github": {"latest_release": {"name": "General update", "date": "2018-06-17 21:13:24 +0000", "tag": "1.1.5"}, "releases": 7, "last_push": "2018-07-09 00:56:31 +0000", "stars": 5, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "ESPurna_RGB", "published": "2018-01-30 00:00:00 +0000", "title": "ESPurna RGB", "description": "Control ESPurna RGB LED device wirelessly", "archive": "https://github.com/pokeimon/OctoPrint-ESPurnaRGB/archive/master.zip", "author": "Imon Daneshmand", "homepage": "https://github.com/pokeimon/OctoPrint-ESPurnaRGB", "page": "https://plugins.octoprint.org/plugins/ESPurna_RGB/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ESPurna_RGB/screenshot1.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.0", "date": "2021-02-19 21:08:41 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2021-02-19 21:05:13 +0000", "stars": 2, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 5, "install_events_month": 2, "instances_week": 4, "install_events_week": 0}}, {"id": "malyan_connection_fix", "published": "2018-02-07 00:00:00 +0000", "title": "Malyan/Monoprice Connection Fix", "description": "Fixes connection issues with Malyan/Monoprice printers", "archive": "https://github.com/OctoPrint/OctoPrint-MalyanConnectionFix/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-MalyanConnectionFix", "page": "https://plugins.octoprint.org/plugins/malyan_connection_fix/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.3 (stable release)", "date": "2019-12-13 16:44:11 +0000", "tag": "0.1.3"}, "releases": 4, "last_push": "2022-06-23 08:52:03 +0000", "stars": 37, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 427, "install_events_month": 29, "instances_week": 327, "install_events_week": 6}}, {"id": "CR10_Leveling", "published": "2018-02-26 00:00:00 +0000", "title": "Bed Leveling", "description": "Adds bed leveling buttons to the controls tab", "archive": "https://github.com/lsellens/OctoPrint-Cr10_leveling/archive/master.zip", "author": "lsellens, AvanOsch, electr0sheep", "homepage": "https://github.com/lsellens/OctoPrint-Cr10_leveling", "page": "https://plugins.octoprint.org/plugins/CR10_Leveling/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7, <4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CR10_Leveling/control.png", "abandoned": false, "github": {"latest_release": {"name": "Version 2.1.3", "date": "2021-12-11 00:30:22 +0000", "tag": "v2.1.3"}, "releases": 17, "last_push": "2021-12-11 00:21:56 +0000", "stars": 10, "issues": {"open": 2, "closed": 28}}, "stats": {"instances_month": 2053, "install_events_month": 231, "instances_week": 1358, "install_events_week": 46}}, {"id": "octorant", "published": "2018-03-11 00:00:00 +0000", "title": "OctoPrint-Octorant", "description": "Discord plugin for OctoPrint", "archive": "https://github.com/bchanudet/OctoPrint-Octorant/archive/master.zip", "author": "Benjamin Chanudet", "homepage": "https://github.com/bchanudet/OctoPrint-Octorant", "page": "https://plugins.octoprint.org/plugins/octorant/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octorant/featured.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.3.4 (stable)", "date": "2023-11-05 17:56:22 +0000", "tag": "1.3.4"}, "releases": 11, "last_push": "2023-11-05 17:54:00 +0000", "stars": 25, "issues": {"open": 11, "closed": 49}}, "stats": {"instances_month": 312, "install_events_month": 21, "instances_week": 231, "install_events_week": 5}}, {"id": "octolapse", "published": "2018-03-24 00:00:00 +0000", "title": "Octolapse", "description": "Create a stabilized timelapse of your 3D prints. Highly customizable, loads of presets, lots of fun. Requires OctoPrint 1.3.9 or higher. Python 3 users MUST install the Python 3 Development package before installation.", "archive": "https://github.com/FormerLurker/Octolapse/archive/master.zip", "author": "Brad Hochgesang", "homepage": "https://formerlurker.github.io/Octolapse/", "page": "https://plugins.octoprint.org/plugins/octolapse/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPL-3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octolapse/tab_mini.png", "abandoned": false, "github": {"latest_release": {"name": "V0.4.5", "date": "2023-11-08 19:12:35 +0000", "tag": "v0.4.5"}, "releases": 34, "last_push": "2023-11-08 18:51:13 +0000", "stars": 624, "issues": {"open": 280, "closed": 567}}, "stats": {"instances_month": 26993, "install_events_month": 1870, "instances_week": 21680, "install_events_week": 450}}, {"id": "DisplayLayerProgress", "published": "2018-04-09 00:00:00 +0000", "title": "DisplayLayerProgress", "description": "Displays the Layer, Progress and other data on \"Printer-Display\", \"NavBar\", \"BrowserTab-Title\" and in the Browser as a simulated \"Printer-Display\"", "archive": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress", "page": "https://plugins.octoprint.org/plugins/DisplayLayerProgress/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/raw/master/screenshots/navbar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.28.0", "date": "2022-01-26 23:12:44 +0000", "tag": "1.28.0"}, "releases": 68, "last_push": "2022-07-09 16:41:16 +0000", "stars": 123, "issues": {"open": 26, "closed": 243}}, "stats": {"instances_month": 16688, "install_events_month": 1018, "instances_week": 12056, "install_events_week": 221}}, {"id": "bedlevelvisualizer", "published": "2018-04-14 00:00:00 +0000", "title": "Bed Level Visualizer", "description": "Displays 3D mesh of bed topography report.", "archive": "https://github.com/jneilliii/OctoPrint-BedLevelVisualizer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedLevelVisualizer/", "page": "https://plugins.octoprint.org/plugins/bedlevelvisualizer/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT License", "image": "https://plugins.octoprint.org/assets/img/plugins/bedlevelvisualizer/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.1", "date": "2022-01-01 19:53:39 +0000", "tag": "1.1.1"}, "releases": 60, "last_push": "2024-03-25 22:18:59 +0000", "stars": 362, "issues": {"open": 42, "closed": 477}}, "stats": {"instances_month": 34400, "install_events_month": 2454, "instances_week": 24372, "install_events_week": 560}}, {"id": "DeleteAfterPrint", "published": "2018-04-20 00:00:00 +0000", "title": "DeleteMoveAfterPrint", "description": "Deletes/Move automaticaly the Print-Model", "archive": "https://github.com/OllisGit/OctoPrint-DeleteAfterPrint/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DeleteAfterPrint", "page": "https://plugins.octoprint.org/plugins/DeleteAfterPrint/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/OllisGit/OctoPrint-DeleteAfterPrint/master/screenshots/sidebar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.10.0", "date": "2022-01-09 20:50:31 +0000", "tag": "1.10.0"}, "releases": 16, "last_push": "2022-01-09 20:45:53 +0000", "stars": 9, "issues": {"open": 10, "closed": 21}}, "stats": {"instances_month": 516, "install_events_month": 22, "instances_week": 404, "install_events_week": 5}}, {"id": "opitemp", "published": "2018-04-23 00:00:00 +0000", "title": "OpiTemp", "description": "Orange Pi temperature in the navbar.", "archive": "https://github.com/hashashin/OctoPrint-OpiTemp/archive/master.zip", "author": "hashashin", "homepage": "https://github.com/hashashin/OctoPrint-OpiTemp", "page": "https://plugins.octoprint.org/plugins/opitemp/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/opitemp/opitemp.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2020-04-30 01:46:21 +0000", "tag": "1.0.8"}, "releases": 9, "last_push": "2020-04-30 01:45:18 +0000", "stars": 1, "issues": {"open": 2, "closed": 9}}, "stats": {"instances_month": 143, "install_events_month": 10, "instances_week": 89, "install_events_week": 3}}, {"id": "ipOnConnect", "published": "2018-05-04 00:00:00 +0000", "title": "OctoPrint-ipOnConnect", "description": "Simple plugin to display the ip address of connected OctoPrint instance on the control panel using M117 command.", "archive": "https://github.com/jneilliii/OctoPrint-ipOnConnect/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ipOnConnect", "page": "https://plugins.octoprint.org/plugins/ipOnConnect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ipOnConnect/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.4", "date": "2020-07-29 03:06:46 +0000", "tag": "0.2.4"}, "releases": 6, "last_push": "2024-01-14 15:58:56 +0000", "stars": 14, "issues": {"open": 0, "closed": 9}}, "stats": {"instances_month": 3965, "install_events_month": 258, "instances_week": 2804, "install_events_week": 51}}, {"id": "multicam", "published": "2018-05-09 00:00:00 +0000", "title": "MultiCam", "description": "Extends the Control tab of OctoPrint, allowing the ability to switch between multiple webcam feeds.", "archive": "https://github.com/mikedmor/OctoPrint_MultiCam/archive/master.zip", "author": "Michael Morris", "homepage": "https://github.com/mikedmor/OctoPrint_MultiCam", "page": "https://plugins.octoprint.org/plugins/multicam/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.2", "date": "2023-09-03 18:40:37 +0000", "tag": "0.4.2"}, "releases": 18, "last_push": "2023-09-03 18:39:06 +0000", "stars": 45, "issues": {"open": 8, "closed": 47}}, "stats": {"instances_month": 2887, "install_events_month": 306, "instances_week": 1973, "install_events_week": 54}}, {"id": "dropbox_timelapse", "published": "2018-05-10 00:00:00 +0000", "title": "OctoPrint-Dropbox-Timelapse", "description": "Automatically upload rendered timelapses to Dropbox. Can also delete after upload to save space on the Raspberry Pi SD Card.", "archive": "https://github.com/jslay88/OctoPrint-Dropbox-Timelapse/archive/master.zip", "author": "Justin Slay, Sam Kemp, Brad Hochgesang", "homepage": "https://github.com/jslay88/OctoPrint-Dropbox-Timelapse", "page": "https://plugins.octoprint.org/plugins/dropbox_timelapse/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-04-17 05:26:32 +0000", "tag": "0.1.4"}, "releases": 5, "last_push": "2020-04-17 05:25:36 +0000", "stars": 9, "issues": {"open": 6, "closed": 6}}, "stats": {"instances_month": 163, "install_events_month": 6, "instances_week": 130, "install_events_week": 1}}, {"id": "discordremote", "published": "2018-06-04 00:00:00 +0000", "title": "OctoPrint-DiscordRemote", "description": "Discord bot for OctoPrint", "archive": "https://github.com/cameroncros/OctoPrint-DiscordRemote/archive/master.zip", "author": "Cameron Cross, Benjamin Chanudet", "homepage": "https://github.com/cameroncros/OctoPrint-DiscordRemote", "page": "https://plugins.octoprint.org/plugins/discordremote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/discordremote/featured.jpg", "abandoned": false, "github": {"latest_release": {"name": "Release v5.10.0", "date": "2023-10-16 23:31:38 +0000", "tag": "v5.10.0"}, "releases": 94, "last_push": "2023-10-16 23:25:54 +0000", "stars": 66, "issues": {"open": 8, "closed": 186}}, "stats": {"instances_month": 440, "install_events_month": 38, "instances_week": 316, "install_events_week": 6}}, {"id": "auth_bookedscheduler", "published": "2018-06-05 00:00:00 +0000", "title": "Auth Booked Scheduler", "description": "Authentication via Booked Scheduler", "archive": "https://github.com/soundstorm/OctoPrint-BookedScheduler/archive/master.zip", "author": "Luca Zimmermann", "homepage": "https://github.com/soundstorm/OctoPrint-BookedScheduler", "page": "https://plugins.octoprint.org/plugins/auth_bookedscheduler/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V1.3", "date": "2018-12-25 13:43:45 +0000", "tag": "1.3"}, "releases": 5, "last_push": "2018-12-25 13:43:01 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "sidebartempgraph", "published": "2018-06-05 00:00:00 +0000", "title": "OctoPrint-SideBarTempGraph", "description": "Plugin to display temperature graph in the side bar.", "archive": "https://github.com/jneilliii/OctoPrint-SideBarTempGraph/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-SideBarTempGraph", "page": "https://plugins.octoprint.org/plugins/sidebartempgraph/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/sidebartempgraph/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2020-08-04 15:12:51 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2024-01-14 15:59:04 +0000", "stars": 3, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 384, "install_events_month": 22, "instances_week": 288, "install_events_week": 1}}, {"id": "cancelobject", "published": "2018-06-08 00:00:00 +0000", "title": "OctoPrint-Cancelobject", "description": "Cancel single objects during a print based on gcode comment lines", "archive": "https://github.com/paukstelis/OctoPrint-Cancelobject/archive/master.zip", "author": "Paul Paukstelis", "homepage": "https://github.com/paukstelis/OctoPrint-Cancelobject", "page": "https://plugins.octoprint.org/plugins/cancelobject/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cancelobject/cancelobject.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.0", "date": "2024-02-05 01:23:30 +0000", "tag": "0.5.0"}, "releases": 13, "last_push": "2024-02-05 01:21:51 +0000", "stars": 105, "issues": {"open": 20, "closed": 54}}, "stats": {"instances_month": 10868, "install_events_month": 770, "instances_week": 7926, "install_events_week": 180}}, {"id": "shutdownprinter", "published": "2018-06-18 00:00:00 +0000", "title": "ShutdownPrinter", "description": "Plugin for shutdown printer after finishing a print job", "archive": "https://github.com/devildant/OctoPrint-ShutdownPrinter/archive/master.zip", "author": "devildant", "homepage": "https://github.com/devildant/OctoPrint-ShutdownPrinter", "page": "https://plugins.octoprint.org/plugins/shutdownprinter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/shutdownprinter/sidebar.JPG", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2019-11-22 15:55:17 +0000", "tag": "1.0.8"}, "releases": 21, "last_push": "2022-05-22 01:56:55 +0000", "stars": 17, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 697, "install_events_month": 33, "instances_week": 443, "install_events_week": 6}}, {"id": "excluderegion", "published": "2018-07-05 00:00:00 +0000", "title": "Exclude Region", "description": "Adds the ability to prevent printing within rectangular or circular regions of the currently active gcode file", "archive": "https://github.com/bradcfisher/OctoPrint-ExcludeRegionPlugin/archive/master.zip", "author": "Brad Fisher", "homepage": "https://github.com/bradcfisher/OctoPrint-ExcludeRegionPlugin", "page": "https://plugins.octoprint.org/plugins/excluderegion/", "compatibility": {"octoprint": ["1.3.8"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/excluderegion/excluderegion-gcode-viewer.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2022-12-08 00:56:34 +0000", "tag": "0.3.2"}, "releases": 8, "last_push": "2022-12-08 00:55:45 +0000", "stars": 55, "issues": {"open": 20, "closed": 46}}, "stats": {"instances_month": 9602, "install_events_month": 630, "instances_week": 6930, "install_events_week": 130}}, {"id": "gcodestatEstimator", "published": "2018-07-05 00:00:00 +0000", "title": "GcodeStat Estimator", "description": "uses data put in to g-code by gcodestat to estimate time to finish print", "archive": "https://github.com/arhi/OctoPrint-gcodestatEstimator/archive/master.zip", "author": "Bogdan Kecman", "homepage": "https://github.com/arhi/OctoPrint-gcodestatEstimator", "page": "https://plugins.octoprint.org/plugins/gcodestatEstimator/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<3"}, "license": "unlicence", "abandoned": false, "github": {"latest_release": {"name": "0.3", "date": "2018-06-23 00:41:24 +0000", "tag": "0.3"}, "releases": 3, "last_push": "2021-02-21 11:35:32 +0000", "stars": 5, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 6, "install_events_week": 0}}, {"id": "domoticz", "published": "2018-07-07 00:00:00 +0000", "title": "OctoPrint-Domoticz", "description": "Simple plugin to control light switches via Domoticz server.", "archive": "https://github.com/jneilliii/OctoPrint-Domoticz/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Domoticz", "page": "https://plugins.octoprint.org/plugins/domoticz/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/domoticz/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2020-10-16 17:44:11 +0000", "tag": "0.1.3"}, "releases": 9, "last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 6, "closed": 14}}, "stats": {"instances_month": 50, "install_events_month": 3, "instances_week": 45, "install_events_week": 0}}, {"id": "PrintTimeGenius", "published": "2018-07-12 00:00:00 +0000", "title": "OctoPrint-PrintTimeGenius", "description": "Use a gcode pre-analysis to provide better print time estimation", "archive": "https://github.com/eyal0/OctoPrint-PrintTimeGenius/archive/master.zip", "author": "Eyal", "homepage": "https://github.com/eyal0/OctoPrint-PrintTimeGenius", "page": "https://plugins.octoprint.org/plugins/PrintTimeGenius/", "compatibility": {"octoprint": ["1.3.9rc1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrintTimeGenius/precise.png", "abandoned": false, "github": {"latest_release": {"name": "2.3.3 Use collections.abc for analyze_gcode_comments", "date": "2024-04-16 20:26:35 +0000", "tag": "2.3.3"}, "releases": 42, "last_push": "2024-04-16 20:24:52 +0000", "stars": 189, "issues": {"open": 58, "closed": 189}}, "stats": {"instances_month": 39895, "install_events_month": 2307, "instances_week": 31638, "install_events_week": 534}}, {"id": "layerdisplay", "published": "2018-07-15 00:00:00 +0000", "title": "LayerDisplay", "description": "Displays the current layer and total layers for a print job.", "archive": "https://github.com/chatrat12/layerdisplay/archive/master.zip", "author": "Matt Thompson", "homepage": "https://github.com/chatrat12/layerdisplay", "page": "https://plugins.octoprint.org/plugins/layerdisplay/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/layerdisplay/layerdisplay.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.3", "date": "2020-03-30 20:23:28 +0000", "tag": "0.4.3"}, "releases": 9, "last_push": "2021-08-04 11:07:26 +0000", "stars": 17, "issues": {"open": 9, "closed": 7}}, "stats": {"instances_month": 106, "install_events_month": 1, "instances_week": 78, "install_events_week": 0}}, {"id": "bedlevelingwizard", "published": "2018-07-16 00:00:00 +0000", "title": "OctoPrint-BedLevelingWizard", "description": "Plugin to aid in the process of manually leveling your bed.", "archive": "https://github.com/jneilliii/OctoPrint-BedLevelingWizard/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedLevelingWizard", "page": "https://plugins.octoprint.org/plugins/bedlevelingwizard/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.5", "date": "2022-10-15 18:50:31 +0000", "tag": "0.2.5"}, "releases": 14, "last_push": "2024-01-14 15:58:39 +0000", "stars": 26, "issues": {"open": 6, "closed": 26}}, "stats": {"instances_month": 2741, "install_events_month": 284, "instances_week": 1809, "install_events_week": 69}}, {"id": "statefulsidebar", "published": "2018-07-16 00:00:00 +0000", "title": "Stateful Sidebar", "description": "Plugin that monitors and stores the state of sidebar collapsed panels and restores that state upon next visit to OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-StatefulSidebar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-StatefulSidebar", "page": "https://plugins.octoprint.org/plugins/statefulsidebar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.2", "date": "2019-10-22 02:48:08 +0000", "tag": "0.1.2"}, "releases": 4, "last_push": "2024-01-14 15:59:07 +0000", "stars": 3, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 147, "install_events_month": 5, "instances_week": 113, "install_events_week": 3}}, {"id": "MultipleUpload", "published": "2018-07-17 00:00:00 +0000", "title": "OctoPrint-MultipleUpload", "description": "Allow uploading multiple files at once", "archive": "https://github.com/eyal0/OctoPrint-MultipleUpload/archive/master.zip", "author": "Eyal", "homepage": "https://github.com/eyal0/OctoPrint-MultipleUpload", "page": "https://plugins.octoprint.org/plugins/MultipleUpload/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MultipleUpload/open_files.png", "abandoned": false, "github": {"latest_release": {"name": "Python3 support", "date": "2020-04-01 01:15:54 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2020-04-01 01:15:10 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 549, "install_events_month": 29, "instances_week": 422, "install_events_week": 4}}, {"id": "rtmpstreamer", "published": "2018-08-13 00:00:00 +0000", "title": "OctoPrint-RTMPStreamer", "description": "Plugin that reencodes the mjpg stream provided by octopi/mjpgstreamer/yawcam and posts to any RTMP stream server (ie Twitch) and adds a tab that will allow for wathing configured stream assuming there is a webpage url that allows that type of connection.", "archive": "https://github.com/jneilliii/OctoPrint-RTMPStreamer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-RTMPStreamer", "page": "https://plugins.octoprint.org/plugins/rtmpstreamer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/rtmpstreamer/tab_screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.5", "date": "2023-10-11 15:01:40 +0000", "tag": "1.0.5"}, "releases": 23, "last_push": "2024-01-14 15:58:58 +0000", "stars": 21, "issues": {"open": 7, "closed": 35}}, "stats": {"instances_month": 330, "install_events_month": 32, "instances_week": 216, "install_events_week": 8}}, {"id": "klipper", "published": "2018-08-21 00:00:00 +0000", "title": "OctoKlipper", "description": "A plugin for a better integration of Klipper into OctoPrint.", "archive": "https://github.com/thelastWallE/OctoprintKlipperPlugin/archive/master.zip", "author": "thelastWallE, Alice Weigt", "homepage": "https://github.com/thelastWallE/OctoprintKlipperPlugin", "page": "https://plugins.octoprint.org/plugins/klipper/", "compatibility": {"octoprint": ["1.3.8"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/klipper/message-log.png", "abandoned": false, "github": {"latest_release": {"name": "OctoKlipper 0.3.9.5", "date": "2023-02-27 17:01:12 +0000", "tag": "0.3.9.5"}, "releases": 41, "last_push": "2023-02-27 16:52:54 +0000", "stars": 65, "issues": {"open": 17, "closed": 56}}, "stats": {"instances_month": 4218, "install_events_month": 585, "instances_week": 2237, "install_events_week": 121}}, {"id": "filament_sensor_ng", "published": "2018-09-17 00:00:00 +0000", "title": "Filament Sensor NG", "description": "A filament monitor that pauses the print when your filament runs out and lets you restart it.", "archive": "https://github.com/Red-M/Octoprint-Filament-Reloaded/archive/master.zip", "author": "Red_M", "homepage": "https://github.com/Red-M/Octoprint-Filament-Reloaded", "page": "https://plugins.octoprint.org/plugins/filament_sensor_ng/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "GPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2018-09-18 21:31:27 +0000", "tag": "1.0.2"}, "releases": 3, "last_push": "2018-09-18 21:30:10 +0000", "stars": 11, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 16, "install_events_month": 2, "instances_week": 12, "install_events_week": 0}}, {"id": "ProgressBasedOnTime", "published": "2018-09-18 00:00:00 +0000", "title": "OctoPrint-ProgressBasedOnTime", "description": "Replace file based progression by time based progression", "archive": "https://github.com/celogeek/OctoPrint-ProgressBasedOnTime/archive/master.zip", "author": "Celogeek", "homepage": "https://github.com/celogeek/OctoPrint-ProgressBasedOnTime", "page": "https://plugins.octoprint.org/plugins/ProgressBasedOnTime/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "fix missing print time", "date": "2020-09-20 13:32:57 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2020-09-20 13:31:11 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 209, "install_events_month": 10, "instances_week": 153, "install_events_week": 2}}, {"id": "m73etaoverride", "published": "2018-09-18 00:00:00 +0000", "title": "M73 ETA Override", "description": "Plugin that overrides OctoPrint ETA to values from last M73 gcode sent to the printer", "archive": "https://github.com/gdombiak/OctoPrint-M73ETAOverride/archive/master.zip", "author": "Jakub Furman, Gaston Dombiak", "homepage": "https://github.com/gdombiak/OctoPrint-M73ETAOverride", "page": "https://plugins.octoprint.org/plugins/m73etaoverride/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2020-12-05 20:49:59 +0000", "tag": "1.0.4"}, "releases": 3, "last_push": "2020-12-05 20:49:31 +0000", "stars": 12, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 308, "install_events_month": 10, "instances_week": 263, "install_events_week": 4}}, {"id": "wemoswitch", "published": "2018-09-18 00:00:00 +0000", "title": "OctoPrint-WemoSwitch", "description": "Plugin to control Belkin Wemo devices from OctoPrint web interface.", "archive": "https://github.com/jneilliii/OctoPrint-WemoSwitch/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WemoSwitch", "page": "https://plugins.octoprint.org/plugins/wemoswitch/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wemoswitch/screenshot_on.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.14", "date": "2023-07-05 00:46:11 +0000", "tag": "0.1.14"}, "releases": 22, "last_push": "2024-01-14 15:59:18 +0000", "stars": 12, "issues": {"open": 4, "closed": 57}}, "stats": {"instances_month": 229, "install_events_month": 14, "instances_week": 184, "install_events_week": 1}}, {"id": "kronos_data_collector", "published": "2018-09-26 00:00:00 +0000", "title": "Project Kronos Data Collector", "description": "Help build the Project Kronos print-failure autodetection neural network", "archive": "https://github.com/MrBreadWater/project-kronos-data-collector/archive/master.zip", "author": "Jacob Paniagua", "homepage": "https://github.com/MrBreadWater/project-kronos-data-collector", "page": "https://plugins.octoprint.org/plugins/kronos_data_collector/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Bug Fixes & Style Update", "date": "2020-04-27 04:37:00 +0000", "tag": "1.3.5"}, "releases": 13, "last_push": "2020-04-27 21:43:23 +0000", "stars": 15, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "OctoAutoremote", "published": "2018-09-28 00:00:00 +0000", "title": "OctoPrint_AutoRemote", "description": "A quick Autoremote/Tasker plugin for OctoPrint", "archive": "https://github.com/trunzoc/Octoprint_Autoremote/archive/master.zip", "author": "Craig Trunzo", "homepage": "https://github.com/trunzoc/Octoprint_AutoRemote", "page": "https://plugins.octoprint.org/plugins/OctoAutoremote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoAutoremote/settings.png", "abandoned": false, "github": {"latest_release": {"name": "JSON rework", "date": "2018-10-03 02:21:51 +0000", "tag": "1.5.0"}, "releases": 6, "last_push": "2021-07-16 13:14:48 +0000", "stars": 0, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "gitfiles", "published": "2018-09-29 00:00:00 +0000", "title": "OctoPrint-GitFiles", "description": "Use a github repository for keeping your OctoPrint Files collection up-to-date.", "archive": "https://github.com/OutsourcedGuru/OctoPrint-GitFiles/archive/master.zip", "author": "OutsourcedGuru", "homepage": "https://github.com/OutsourcedGuru/OctoPrint-GitFiles", "page": "https://plugins.octoprint.org/plugins/gitfiles/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "MIT", "image": "https://user-images.githubusercontent.com/15971213/45835939-45777700-bcc0-11e8-80c6-2bc31e08f3ec.png", "abandoned": false, "github": {"last_push": "2019-02-27 04:27:52 +0000", "stars": 29, "issues": {"open": 3, "closed": 6}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "nexmonotifier", "published": "2018-10-02 00:00:00 +0000", "title": "OctoPrint-Nexmonotifier", "description": "Octoprint plugin for print completion notifications using Nexmo SMS gateway", "archive": "https://github.com/gfk76/OctoPrint-Nexmonotifier/archive/master.zip", "author": "Gert Kjerslev", "homepage": "https://github.com/gfk76/OctoPrint-Nexmonotifier", "page": "https://plugins.octoprint.org/plugins/nexmonotifier/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1", "date": "2019-02-19 08:34:39 +0000", "tag": "1.1"}, "releases": 2, "last_push": "2019-02-19 08:10:01 +0000", "stars": 1, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "ABL_Expert", "published": "2018-10-04 00:00:00 +0000", "title": "Auto bed leveling expert", "description": "Marlin auto bed leveling control, mesh correction, and z probe handling. This plugin needs some features enabled in your firmware to work. Please read https://framagit.org/razer/Octoprint_ABL_Expert/-/blob/master/README.md for more information", "archive": "https://framagit.org/razer/Octoprint_ABL_Expert/-/archive/0.6/Octoprint_ABL_Expert-0.6.zip", "author": "razer", "homepage": "https://framagit.org/razer/Octoprint_ABL_Expert", "page": "https://plugins.octoprint.org/plugins/ABL_Expert/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "stats": {"instances_month": 3514, "install_events_month": 363, "instances_week": 2314, "install_events_week": 82}}, {"id": "tuyasmartplug", "published": "2018-11-12 00:00:00 +0000", "title": "OctoPrint-TuyaSmartplug", "description": "Plugin to control Tuya based Smartplug devices from OctoPrint web interface.", "archive": "https://github.com/ziirish/OctoPrint-TuyaSmartplug/archive/master.zip", "author": "ziirish", "homepage": "https://github.com/ziirish/OctoPrint-TuyaSmartplug", "page": "https://plugins.octoprint.org/plugins/tuyasmartplug/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TuyaSmartplug/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Fixes on Issues #51 and #52", "date": "2023-05-01 20:40:23 +0000", "tag": "0.3.2"}, "releases": 7, "last_push": "2023-05-01 20:36:05 +0000", "stars": 19, "issues": {"open": 30, "closed": 27}}, "stats": {"instances_month": 481, "install_events_month": 60, "instances_week": 321, "install_events_week": 11}}, {"id": "active_filters_extended", "published": "2018-11-17 00:00:00 +0000", "title": "Active Filters Extended", "description": "Makes the enabled terminal filters persistent between browser reloads and from different connecting clients.", "archive": "https://github.com/jneilliii/OctoPrint-ActiveFiltersExtended/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ActiveFiltersExtended", "page": "https://plugins.octoprint.org/plugins/active_filters_extended/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2019-10-22 02:37:41 +0000", "tag": "0.1.0"}, "releases": 2, "last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 3403, "install_events_month": 36, "instances_week": 2498, "install_events_week": 7}}, {"id": "dragon_order", "published": "2018-11-18 00:00:00 +0000", "title": "OctoPrint-DragonOrder", "description": "Plugin that allows the re-ordering of navbar, sidebar, and tabs by dragging them into desired location within the UI.", "archive": "https://github.com/jneilliii/OctoPrint-DragonOrder/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-DragonOrder", "page": "https://plugins.octoprint.org/plugins/dragon_order/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2020-11-06 19:50:57 +0000", "tag": "0.1.7"}, "releases": 8, "last_push": "2024-01-14 15:58:38 +0000", "stars": 8, "issues": {"open": 2, "closed": 17}}, "stats": {"instances_month": 842, "install_events_month": 35, "instances_week": 631, "install_events_week": 9}}, {"id": "signalnotifier", "published": "2018-12-04 00:00:00 +0000", "title": "OctoPrint_Signal-Notifier", "description": "Print completion notifications using Signal. Requires signal-cli.", "archive": "https://github.com/aerickson/OctoPrint_Signal-Notifier/archive/master.zip", "author": "Andrew Erickson", "homepage": "https://github.com/aerickson/OctoPrint_Signal-Notifier", "page": "https://plugins.octoprint.org/plugins/signalnotifier/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/signalnotifier/signalnotifier.png", "abandoned": false, "github": {"last_push": "2020-05-12 03:40:31 +0000", "stars": 9, "issues": {"open": 8, "closed": 8}}, "stats": {"instances_month": 29, "install_events_month": 2, "instances_week": 15, "install_events_week": 0}}, {"id": "SlicerSettingsParser", "published": "2018-12-22 00:00:00 +0000", "title": "SlicerSettingsParser", "description": "Plugin to analyze gcode for slicer settings comments and add additional metadata of such settings.", "archive": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser/archive/master.zip", "author": "Larsjuhw, T6", "homepage": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser", "page": "https://plugins.octoprint.org/plugins/SlicerSettingsParser/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "3.3.0", "date": "2023-11-20 16:56:32 +0000", "tag": "v3.3.0"}, "releases": 5, "last_push": "2023-11-20 16:54:48 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 838, "install_events_month": 56, "instances_week": 600, "install_events_week": 9}}, {"id": "SlicerSettingsTab", "published": "2018-12-22 00:00:00 +0000", "title": "OctoPrint-SlicerSettingsTab", "description": "Adds tab which displays slicer settings of selected gcode file.", "archive": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsTab/archive/master.zip", "author": "Larsjuhw, T6", "homepage": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsTab", "page": "https://plugins.octoprint.org/plugins/SlicerSettingsTab/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SlicerSettingsTab/main.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2022-12-14 01:13:18 +0000", "tag": "v1.1.0"}, "releases": 6, "last_push": "2022-12-14 01:12:17 +0000", "stars": 8, "issues": {"open": 2, "closed": 4}}, "stats": {"instances_month": 293, "install_events_month": 24, "instances_week": 211, "install_events_week": 5}}, {"id": "IFTTT", "published": "2018-12-29 00:00:00 +0000", "title": "OctoPrint-IFTTT", "description": "Connects OctoPrint events to IFTTT", "archive": "https://github.com/tjjfvi/OctoPrint-IFTTT/archive/master.zip", "author": "T6", "homepage": "https://github.com/tjjfvi/OctoPrint-IFTTT", "page": "https://plugins.octoprint.org/plugins/IFTTT/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.4.1", "date": "2022-12-30 13:20:38 +0000", "tag": "v1.4.1"}, "releases": 10, "last_push": "2022-12-28 15:05:26 +0000", "stars": 34, "issues": {"open": 9, "closed": 28}}, "stats": {"instances_month": 647, "install_events_month": 27, "instances_week": 481, "install_events_week": 6}}, {"id": "BetterHeaterTimeout", "published": "2019-01-02 00:00:00 +0000", "title": "OctoPrint-BetterHeaterTimeout", "description": "Turns off heaters after specified time being on and unused", "archive": "https://github.com/tjjfvi/OctoPrint-BetterHeaterTimeout/archive/master.zip", "author": "T6", "homepage": "https://github.com/tjjfvi/OctoPrint-BetterHeaterTimeout", "page": "https://plugins.octoprint.org/plugins/BetterHeaterTimeout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BetterHeaterTimeout/timedout.png", "abandoned": false, "github": {"latest_release": {"name": "1.3.0", "date": "2020-10-25 20:55:24 +0000", "tag": "v1.3.0"}, "releases": 5, "last_push": "2020-10-25 20:53:27 +0000", "stars": 12, "issues": {"open": 10, "closed": 8}}, "stats": {"instances_month": 2288, "install_events_month": 71, "instances_week": 1728, "install_events_week": 15}}, {"id": "LCD1602_I2cdisplay", "published": "2019-01-28 00:00:00 +0000", "title": "octoprint-LCD1602", "description": "This plug-in allows you to control a 16X2 lcd display (hd44780 connected to port I2C) to display the octoprint status. It is useful for people like me who have a printer without a display. It indicates on which port the printer is connected, the progress of printing. It also displays the remaining print time (thanks to a simple method). See https://github.com/n3bojs4/octoprint-LCD1602/blob/master/CHANGELOG.md for more details.", "archive": "https://github.com/n3bojs4/OctoPrint-Lcd1602/archive/master.zip", "author": "n3bojs4", "homepage": "https://github.com/n3bojs4/octoprint-LCD1602", "page": "https://plugins.octoprint.org/plugins/LCD1602_I2cdisplay/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/LCD1602_I2cdisplay/progress.jpg", "abandoned": false, "github": {"latest_release": {"name": "initial version", "date": "2019-02-08 13:37:39 +0000", "tag": "0.1"}, "releases": 1, "last_push": "2022-03-19 19:31:40 +0000", "stars": 15, "issues": {"open": 14, "closed": 13}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "hardwarepwm", "published": "2019-02-08 00:00:00 +0000", "title": "OctoPrint-Hardwarepwm", "description": "Plugin for true hardware PWM on the Raspberry Pi", "archive": "https://github.com/farfalleflickan/OctoPrint-Hardwarepwm/archive/master.zip", "author": "Daria Rostirolla", "homepage": "https://github.com/farfalleflickan/OctoPrint-Hardwarepwm", "page": "https://plugins.octoprint.org/plugins/hardwarepwm/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/hardwarepwm/settingsPage.png", "abandoned": false, "github": {"latest_release": {"name": "Hotfix for duty cycle not getting saved", "date": "2021-08-17 20:37:30 +0000", "tag": "v0.2.1"}, "releases": 7, "last_push": "2021-08-17 20:36:54 +0000", "stars": 9, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 28, "install_events_month": 6, "instances_week": 17, "install_events_week": 2}}, {"id": "filament_sensor_ng_orangepi", "published": "2019-02-18 00:00:00 +0000", "title": "FilamentSensor OrangePi", "description": "A filament monitor that pauses the print when your filament runs out and lets you restart it.", "archive": "https://github.com/deadly667/Octoprint-Filament-Sensor-ng-OrangePi/archive/master.zip", "author": "Deadly667", "homepage": "https://github.com/deadly667/Octoprint-Filament-Sensor-ng-OrangePi", "page": "https://plugins.octoprint.org/plugins/filament_sensor_ng_orangepi/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "GPLv3", "abandoned": false, "github": {"last_push": "2019-02-16 18:55:37 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 3, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "printtrack", "published": "2019-02-25 00:00:00 +0000", "title": "OctoPrint-PrintTrack", "description": "Keep track of your printer and prints with some simple additions & customizability.", "archive": "https://github.com/ElectricSquid/OctoPrint-PrintTrack/archive/master.zip", "author": "ElectricSquid", "homepage": "https://github.com/ElectricSquid/OctoPrint-PrintTrack", "page": "https://plugins.octoprint.org/plugins/printtrack/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printtrack/printtrack_title.png", "abandoned": false, "github": {"last_push": "2020-09-25 22:54:18 +0000", "stars": 3, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 95, "install_events_month": 3, "instances_week": 68, "install_events_week": 1}}, {"id": "rgb_status", "published": "2019-02-27 00:00:00 +0000", "title": "RGB Status", "description": "Adds RGB LED support to OctoPrint with the ability to choose colors and effects based on the current status of your printer", "archive": "https://github.com/EricHigdon/OctoPrint-RGB_status/archive/master.zip", "author": "Eric Higdon", "homepage": "https://github.com/EricHigdon/OctoPrint-RGB_status", "page": "https://plugins.octoprint.org/plugins/rgb_status/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/rgb_status/featured.png", "abandoned": false, "github": {"latest_release": {"name": "V1.7.2", "date": "2020-06-20 16:01:08 +0000", "tag": "V1.7.2"}, "releases": 12, "last_push": "2021-02-04 20:48:34 +0000", "stars": 33, "issues": {"open": 31, "closed": 58}}, "stats": {"instances_month": 28, "install_events_month": 1, "instances_week": 20, "install_events_week": 0}}, {"id": "xMattersIntegration", "published": "2019-03-04 00:00:00 +0000", "title": "xMatters Integration", "description": "Event notifications using xMatters", "archive": "https://github.com/svv2014/OctoPrint-Xmatters-integration/archive/master.zip", "author": "svv2014", "homepage": "https://github.com/svv2014/OctoPrint-xMatters-integration", "page": "https://plugins.octoprint.org/plugins/xMattersIntegration/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/xMattersIntegration/settings.png", "abandoned": false, "github": {"latest_release": {"name": "Custom Slack Message", "date": "2019-07-20 16:02:58 +0000", "tag": "0.1.8"}, "releases": 4, "last_push": "2019-07-20 16:01:34 +0000", "stars": 3, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "curalegacy", "published": "2019-03-28 00:00:00 +0000", "title": "CuraEngine Legacy", "description": "Plugin for slicing via the legacy version of CuraEngine from within OctoPrint, unbundled from OctoPrint starting with version 1.3.11", "archive": "https://github.com/OctoPrint/OctoPrint-CuraLegacy/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-CuraLegacy", "page": "https://plugins.octoprint.org/plugins/curalegacy/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1.2", "date": "2021-03-02 07:08:26 +0000", "tag": "1.1.2"}, "releases": 6, "last_push": "2021-03-02 07:05:58 +0000", "stars": 18, "issues": {"open": 1, "closed": 10}}, "stats": {"instances_month": 913, "install_events_month": 74, "instances_week": 604, "install_events_week": 12}}, {"id": "bettergrblsupport", "published": "2019-04-01 00:00:00 +0000", "title": "Better Grbl Support", "description": "Provides core functionality and UI integration for GRBL based engravers and CNC machines", "archive": "https://github.com/synman/OctoPrint-Bettergrblsupport/archive/master.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-Bettergrblsupport", "page": "https://plugins.octoprint.org/plugins/bettergrblsupport/", "compatibility": {"octoprint": ["1.3.10"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/bettergrblsupport/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "2.3.1", "date": "2023-11-12 06:25:13 +0000", "tag": "2.3.1"}, "releases": 63, "last_push": "2024-01-12 04:06:15 +0000", "stars": 61, "issues": {"open": 13, "closed": 79}}, "stats": {"instances_month": 254, "install_events_month": 69, "instances_week": 107, "install_events_week": 21}}, {"id": "DryRun", "published": "2019-04-02 00:00:00 +0000", "title": "DryRun", "description": "Print without heating/extruding.", "archive": "https://github.com/OllisGit/OctoPrint-DryRun/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DryRun", "page": "https://plugins.octoprint.org/plugins/DryRun/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-DryRun/raw/master/screenshots/StateAndNavBar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.2.0", "date": "2020-05-25 21:42:08 +0000", "tag": "1.2.0"}, "releases": 8, "last_push": "2020-05-25 21:39:32 +0000", "stars": 12, "issues": {"open": 4, "closed": 7}}, "stats": {"instances_month": 331, "install_events_month": 9, "instances_week": 252, "install_events_week": 2}}, {"id": "marlin_flasher", "published": "2019-04-02 00:00:00 +0000", "title": "Marlin Flasher", "description": "Plugin that allows you to flash your printer to the latest Marlin version", "archive": "https://github.com/Renaud11232/OctoPrint-Marlin-Flasher/archive/master.zip", "author": "Renaud Gaspard", "homepage": "https://github.com/Renaud11232/OctoPrint-Marlin-Flasher", "page": "https://plugins.octoprint.org/plugins/marlin_flasher/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/marlin_flasher/arduino_flash.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.7", "date": "2023-04-12 20:59:47 +0000", "tag": "1.0.7"}, "releases": 57, "last_push": "2023-04-12 20:57:40 +0000", "stars": 37, "issues": {"open": 4, "closed": 88}}, "stats": {"instances_month": 904, "install_events_month": 110, "instances_week": 569, "install_events_week": 22}}, {"id": "FanSpeedMirror", "published": "2019-04-13 00:00:00 +0000", "title": "OctoPrint-FanSpeedMirror", "description": "Mirror the parameter(s) of GCode commands M106, M107 to scripts on the OctoPrint host", "archive": "https://github.com/b-morgan/OctoPrint-FanSpeedMirror/archive/master.zip", "author": "Brad Morgan", "homepage": "https://github.com/b-morgan/OctoPrint-FanSpeedMirror", "page": "https://plugins.octoprint.org/plugins/FanSpeedMirror/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2020-04-03 19:35:37 +0000", "tag": "1.3.1"}, "releases": 4, "last_push": "2020-04-03 19:33:29 +0000", "stars": 5, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 256, "install_events_month": 24, "instances_week": 169, "install_events_week": 9}}, {"id": "repeatingcommand", "published": "2019-04-16 00:00:00 +0000", "title": "OctoPrint_RepeatingCommand", "description": "Octoprint plugin for running a command at an interval during prints.", "archive": "https://github.com/aerickson/OctoPrint_RepeatingCommand/archive/master.zip", "author": "Andrew Erickson", "homepage": "https://github.com/aerickson/OctoPrint_RepeatingCommand", "page": "https://plugins.octoprint.org/plugins/repeatingcommand/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/repeatingcommand/settings.png", "abandoned": false, "github": {"last_push": "2020-06-11 07:38:28 +0000", "stars": 0, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "octoprint_complicated", "published": "2019-04-23 00:00:00 +0000", "title": "OctoPrint-Complicated", "description": "Display Print Progress on your Apple Watch using the Complicated iOS App", "archive": "https://github.com/frenchie4111/complicated-octoprint/archive/master.zip", "author": "Mike Lyons", "homepage": "https://github.com/frenchie4111/complicated-octoprint", "page": "https://plugins.octoprint.org/plugins/octoprint_complicated/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoprint_complicated/demo.png", "abandoned": false, "github": {"latest_release": {"name": "Added push notifications for print progress", "date": "2019-08-10 20:49:10 +0000", "tag": "v1.1.3"}, "releases": 3, "last_push": "2019-08-10 20:48:42 +0000", "stars": 9, "issues": {"open": 8, "closed": 1}}, "stats": {"instances_month": 11, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "PCA9685LEDStripControl", "published": "2019-05-07 00:00:00 +0000", "title": "PCA9685 LED Strip Control", "description": "OctoPrint plugin for controling RGB LED Strips via PCA9685 over I2C", "archive": "https://github.com/ozgunawesome/OctoPrint-PCA9685LEDStripControl/archive/master.zip", "author": "Ozgun Ayaz", "homepage": "https://github.com/ozgunawesome/OctoPrint-PCA9685LEDStripControl", "page": "https://plugins.octoprint.org/plugins/PCA9685LEDStripControl/", "compatibility": {"octoprint": ["1.3.1"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "Apache", "image": "https://plugins.octoprint.org/assets/img/plugins/PCA9685LEDStripControl/PCA9685_dev_board.jpg", "abandoned": false, "github": {"latest_release": {"name": "Fixed some potential conflict", "date": "2019-05-07 17:53:11 +0000", "tag": "0.3.9"}, "releases": 2, "last_push": "2019-05-07 17:52:29 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "preprintservice", "published": "2019-05-12 00:00:00 +0000", "title": "OctoPrint-PrePrintService", "description": "This service supports your 3D printing workflow by providing auto-rotation and slicing functionality.", "archive": "https://github.com/christophschranz/OctoPrint-PrePrintService/archive/master.zip", "author": "Christoph Schranz", "homepage": "https://github.com/christophschranz/OctoPrint-PrePrintService", "page": "https://plugins.octoprint.org/plugins/preprintservice/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/preprintservice/workflow.png", "abandoned": false, "github": {"last_push": "2023-09-01 10:53:03 +0000", "stars": 11, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 47, "install_events_month": 9, "instances_week": 28, "install_events_week": 1}}, {"id": "octopod", "published": "2019-05-28 00:00:00 +0000", "title": "OctoPrint-OctoPod", "description": "OctoPrint plugin for OctoPod", "archive": "https://github.com/gdombiak/OctoPrint-OctoPod/archive/master.zip", "author": "Gaston Dombiak", "homepage": "https://github.com/gdombiak/OctoPrint-OctoPod", "page": "https://plugins.octoprint.org/plugins/octopod/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octopod/print_finished.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.3.16", "date": "2023-11-26 22:30:18 +0000", "tag": "0.3.16"}, "releases": 29, "last_push": "2023-11-26 22:38:37 +0000", "stars": 72, "issues": {"open": 35, "closed": 95}}, "stats": {"instances_month": 6629, "install_events_month": 417, "instances_week": 4794, "install_events_week": 91}}, {"id": "uploadanything", "published": "2019-05-28 00:00:00 +0000", "title": "Upload Anything", "description": "Allows custom file types to be uploaded via the web interface", "archive": "https://github.com/rlogiacco/UploadAnything/archive/master.zip", "author": "Roberto Lo Giacco", "homepage": "https://github.com/rlogiacco/UploadAnything", "page": "https://plugins.octoprint.org/plugins/uploadanything/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "Apache License 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/uploadanything/settings.png", "abandoned": false, "github": {"last_push": "2020-11-29 22:29:46 +0000", "stars": 3, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 280, "install_events_month": 25, "instances_week": 196, "install_events_week": 3}}, {"id": "Change_Filament", "published": "2019-05-29 00:00:00 +0000", "title": "Change_Filament", "description": "Facilitates changing filament (backs out old, loads new)", "archive": "https://github.com/jim-p/Change_Filament/archive/master.zip", "author": "Jim Pingle", "homepage": "https://github.com/jim-p/Change_Filament", "page": "https://plugins.octoprint.org/plugins/Change_Filament/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "bsd-3-clause", "image": "https://plugins.octoprint.org/assets/img/plugins/Change_Filament/cf_buttons.png", "abandoned": false, "github": {"last_push": "2021-01-03 23:21:43 +0000", "stars": 16, "issues": {"open": 19, "closed": 20}}, "stats": {"instances_month": 4273, "install_events_month": 290, "instances_week": 3040, "install_events_week": 60}}, {"id": "OctoFlat", "published": "2019-06-03 00:00:00 +0000", "title": "OctoPrint-OctoFlat", "description": "A flat theme for OctoPrint.", "archive": "https://github.com/juniorRubyist/OctoPrint-OctoFlat/archive/master.zip", "author": "Joseph Geis", "homepage": "https://github.com/juniorRubyist/OctoPrint-OctoFlat", "page": "https://plugins.octoprint.org/plugins/OctoFlat/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://raw.githubusercontent.com/juniorRubyist/OctoPrint-OctoFlat/master/assets/octoprint_1.png", "abandoned": false, "github": {"latest_release": {"name": "OctoFlat Reaction", "date": "2019-06-02 03:05:19 +0000", "tag": "0.2.0"}, "releases": 1, "last_push": "2020-06-27 19:21:22 +0000", "stars": 5, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 47, "install_events_month": 1, "instances_week": 33, "install_events_week": 0}}, {"id": "filamentencore", "published": "2019-06-03 00:00:00 +0000", "title": "Filament Sensor Encore", "description": "OctoPrint plug-in that detects when printer is out of filament", "archive": "https://github.com/draagc/OctoPrint-FilamentEncore/archive/master.zip", "author": "Dragos Costache", "homepage": "https://github.com/draagc/OctoPrint-FilamentEncore", "page": "https://plugins.octoprint.org/plugins/filamentencore/", "compatibility": {"octoprint": ["1.2.6"], "os": ["disabled"], "python": ">=2.7,<3"}, "license": "AGPLv3", "disabled": "There has been a report of OctoPrint crashing on resume. Disabled until this issue has been clarified. See foosel/OctoPrint#3213 and draagc/OctoPrint-FilamentEncore#3 .
\n", "abandoned": false, "github": {"last_push": "2019-05-31 16:01:01 +0000", "stars": 5, "issues": {"open": 4, "closed": 0}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 4, "install_events_week": 0}}, {"id": "PrinterAlerts", "published": "2019-06-08 00:00:00 +0000", "title": "OctoPrint-PrinterAlerts", "description": "Alert the user when their printer is waiting for interaction.", "archive": "https://github.com/Patronics/OctoPrint-PrinterAlerts/archive/master.zip", "author": "Patrick Leiser", "homepage": "https://github.com/Patronics/OctoPrint-PrinterAlerts", "page": "https://plugins.octoprint.org/plugins/PrinterAlerts/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "aGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrinterAlerts/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.7.5: add Python 3 Support", "date": "2020-10-22 18:50:14 +0000", "tag": "0.7.5"}, "releases": 2, "last_push": "2020-10-22 18:48:27 +0000", "stars": 5, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 263, "install_events_month": 13, "instances_week": 204, "install_events_week": 4}}, {"id": "PauseForUserEvent", "published": "2019-06-11 00:00:00 +0000", "title": "PauseForUser Event", "description": "Adds a new event 'paused_for_user' when the printer needs manual intervention", "archive": "https://github.com/zeroflow/OctoPrint-PauseForUserEvent/archive/master.zip", "author": "Thomas Arthofer", "homepage": "https://github.com/zeroflow/OctoPrint-PauseForUserEvent", "page": "https://plugins.octoprint.org/plugins/PauseForUserEvent/", "compatibility": {"octoprint": ["1.3.11"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2019-06-05 17:21:20 +0000", "stars": 5, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 26, "install_events_month": 1, "instances_week": 18, "install_events_week": 0}}, {"id": "prusaetaoverride", "published": "2019-08-25 00:00:00 +0000", "title": "Slicer M73 ETA override Plugin (Prusa; Marlin 2)", "description": "Plugin that overrides OctoPrint ETA/progress to values from last M73 gcode response received from printer", "archive": "https://github.com/arekm/octopi_eta_override/archive/master.zip", "author": "Anton Skorochod", "homepage": "https://github.com/arekm/octopi_eta_override", "page": "https://plugins.octoprint.org/plugins/prusaetaoverride/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2022-12-08 07:54:01 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2022-12-08 08:45:28 +0000", "stars": 9, "issues": {"open": 0, "closed": 13}}, "stats": {"instances_month": 627, "install_events_month": 24, "instances_week": 507, "install_events_week": 5}}, {"id": "webcamSB", "published": "2019-09-04 00:00:00 +0000", "title": "OctoPrint-Webcamsb", "description": "Sidebar webcam viewer", "archive": "https://github.com/quanticchaos/OctoPrint-Webcamsb/archive/master.zip", "author": "Luis Magar Brunner", "homepage": "https://github.com/quanticchaos/OctoPrint-Webcamsb", "page": "https://plugins.octoprint.org/plugins/webcamSB/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webcamSB/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2020-06-02 02:37:12 +0000", "tag": "0.1.8"}, "releases": 8, "last_push": "2020-06-02 02:33:52 +0000", "stars": 9, "issues": {"open": 15, "closed": 7}}, "stats": {"instances_month": 1876, "install_events_month": 122, "instances_week": 1325, "install_events_week": 33}}, {"id": "gslc", "published": "2019-09-05 00:00:00 +0000", "title": "GcodeSuperLaserController", "description": "A plugin for Laser engraving add", "archive": "https://github.com/jneilliii/GCodeSuperLaserController/archive/master.zip", "author": "Skiepp", "homepage": "https://github.com/jneilliii/GCodeSuperLaserController", "page": "https://plugins.octoprint.org/plugins/gslc/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<3"}, "license": "Apache License 2.0", "abandoned": true, "github": {"latest_release": {"name": "1.1", "date": "2021-11-14 21:37:31 +0000", "tag": "1.1"}, "releases": 1, "last_push": "2021-11-14 21:39:13 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "dashboard", "published": "2019-09-10 00:00:00 +0000", "title": "OctoPrint-Dashboard", "description": "A dashboard tab for Octoprint", "archive": "https://github.com/j7126/OctoPrint-Dashboard/archive/master.zip", "author": "Stefan Cohen, j7126, Willmac16", "homepage": "https://github.com/j7126/OctoPrint-Dashboard", "page": "https://plugins.octoprint.org/plugins/dashboard/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/dashboard/screenshot-2.png", "abandoned": false, "github": {"latest_release": {"name": "1.19.11", "date": "2024-04-09 02:37:46 +0000", "tag": "1.19.11"}, "releases": 49, "last_push": "2024-04-09 02:32:53 +0000", "stars": 286, "issues": {"open": 48, "closed": 282}}, "stats": {"instances_month": 26832, "install_events_month": 1897, "instances_week": 20758, "install_events_week": 433}}, {"id": "octovox", "published": "2019-09-11 00:00:00 +0000", "title": "OctoPrint-OctoVox", "description": "OctoPrint plugin for OctoVox Amazon Alexa Integration", "archive": "https://github.com/johnnyruz/OctoPrint-OctoVox/archive/master.zip", "author": "John Ruzick", "homepage": "https://github.com/johnnyruz/OctoPrint-OctoVox", "page": "https://plugins.octoprint.org/plugins/octovox/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octovox/alexa_response.png", "abandoned": false, "github": {"latest_release": {"name": "Update for Python3/OctoPrint 1.4 Compatibility", "date": "2019-10-24 13:09:47 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2019-10-20 22:41:59 +0000", "stars": 31, "issues": {"open": 24, "closed": 8}}, "stats": {"instances_month": 372, "install_events_month": 26, "instances_week": 270, "install_events_week": 3}}, {"id": "AutostartPrint", "published": "2019-09-23 00:00:00 +0000", "title": "AutostartPrint", "description": "Autostart a print job after conneting.", "archive": "https://github.com/OllisGit/OctoPrint-AutostartPrint/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-AutostartPrint", "page": "https://plugins.octoprint.org/plugins/AutostartPrint/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/Octoprint-AutostartPrint/raw/master/screenshots/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "V1.3.0", "date": "2020-08-02 09:58:20 +0000", "tag": "1.3.0"}, "releases": 7, "last_push": "2020-08-02 09:55:03 +0000", "stars": 4, "issues": {"open": 2, "closed": 7}}, "stats": {"instances_month": 58, "install_events_month": 4, "instances_week": 48, "install_events_week": 1}}, {"id": "AutoLogout", "published": "2019-10-03 00:00:00 +0000", "title": "AutoLogout", "description": "Plugin logs out the user if there is some time of inactvity or after a print job is finished.", "archive": "https://github.com/OllisGit/OctoPrint-AutoLogout/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-AutoLogout", "page": "https://plugins.octoprint.org/plugins/AutoLogout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/Octoprint-AutoLogout/raw/master/screenshots/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "V1.2.0", "date": "2021-05-15 14:01:41 +0000", "tag": "1.2.0"}, "releases": 6, "last_push": "2021-05-15 14:03:58 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 43, "install_events_month": 2, "instances_week": 34, "install_events_week": 0}}, {"id": "metadatapreprocessor", "published": "2019-10-03 00:00:00 +0000", "title": "MetadataPreprocessor", "description": "Plugin to speed up the gcode analysis in OctoPrint", "archive": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor/releases/latest/download/release.zip", "author": "awenelo, Sven Lohrmann", "homepage": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor", "page": "https://plugins.octoprint.org/plugins/metadatapreprocessor/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 - Python 3 compatability", "date": "2021-08-27 12:11:47 +0000", "tag": "0.2.1"}, "releases": 1, "last_push": "2021-08-23 19:34:11 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 81, "install_events_month": 7, "instances_week": 56, "install_events_week": 2}}, {"id": "orvibos20", "published": "2019-10-03 00:00:00 +0000", "title": "OctoPrint-OrviboS20", "description": "Plugin to control Orvibo S20 Smart Plug from the OctoPrint web interface.", "archive": "https://github.com/cprasmu/OctoPrint-OrviboS20/archive/master.zip", "author": "cprasmu", "homepage": "https://github.com/cprasmu/OctoPrint-OrviboS20", "page": "https://plugins.octoprint.org/plugins/orvibos20/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/orvibos20/power_on_dark.png", "abandoned": false, "github": {"latest_release": {"name": "Python 3 Compatibility", "date": "2020-06-14 12:15:09 +0000", "tag": "0.2.3"}, "releases": 2, "last_push": "2020-06-14 12:12:03 +0000", "stars": 2, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 9, "install_events_month": 1, "instances_week": 8, "install_events_week": 0}}, {"id": "mmu2filamentselect", "published": "2019-10-04 00:00:00 +0000", "title": "OctoPrint-Mmu2filamentselect", "description": "Select the filament for Prusa MMU2 when printing in single mode.", "archive": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect/archive/master.zip", "author": "Thomas K\u00f6ckerbauer, Florian Sch\u00fctte", "homepage": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect", "page": "https://plugins.octoprint.org/plugins/mmu2filamentselect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mmu2filamentselect/octoprusa.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-08-12 20:07:57 +0000", "tag": "1.0.7"}, "releases": 5, "last_push": "2021-08-12 20:04:49 +0000", "stars": 7, "issues": {"open": 8, "closed": 8}}, "stats": {"instances_month": 575, "install_events_month": 25, "instances_week": 445, "install_events_week": 4}}, {"id": "filamentstorage", "published": "2019-10-25 00:00:00 +0000", "title": "OctoPrint-Filamentstorage", "description": "Plugin for OpenSource Filament Storage Containers that report Temp, Humidity, and scale values over USB.", "archive": "https://github.com/waltmoorhouse/OctoPrint-Filamentstorage/archive/master.zip", "author": "Walt Moorhouse", "homepage": "https://github.com/waltmoorhouse/OctoPrint-Filamentstorage", "page": "https://plugins.octoprint.org/plugins/filamentstorage/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filamentstorage/main.png", "abandoned": false, "github": {"last_push": "2019-12-04 09:00:58 +0000", "stars": 21, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "CrealityTemperature", "published": "2019-10-28 00:00:00 +0000", "title": "Creality Temperature Fix", "description": "Fix to parse correctly temperatures from Creality printer", "archive": "https://github.com/RomainOdeval/OctoPrint-CrealityTemperature/releases/latest/download/master.zip", "author": "Romain Odeval, Jean-Christophe Heger", "homepage": "https://github.com/RomainOdeval/OctoPrint-CrealityTemperature/", "page": "https://plugins.octoprint.org/plugins/CrealityTemperature/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.2.4", "date": "2020-07-20 17:46:40 +0000", "tag": "v1.2.4"}, "releases": 5, "last_push": "2022-01-02 18:16:57 +0000", "stars": 3, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 4318, "install_events_month": 417, "instances_week": 2979, "install_events_week": 102}}, {"id": "thingiverse", "published": "2019-10-28 00:00:00 +0000", "title": "OctoPrint-Thingiverse", "description": "This plugin creates a new tab where Thingiverse website is embedded.", "archive": "https://github.com/stefancandrea/OctoPrint-Thingiverse/archive/master.zip", "author": "stefancandrea", "homepage": "https://github.com/stefancandrea/OctoPrint-Thingiverse/", "page": "https://plugins.octoprint.org/plugins/thingiverse/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "1.1.0", "date": "2020-08-13 06:25:26 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2020-08-13 07:02:45 +0000", "stars": 5, "issues": {"open": 0, "closed": 10}}, "stats": {"instances_month": 847, "install_events_month": 100, "instances_week": 555, "install_events_week": 23}}, {"id": "influxdb", "published": "2019-11-02 00:00:00 +0000", "title": "OctoPrint-InfluxDB", "description": "Writes temperatures and events to an Influx database.", "archive": "https://github.com/agrif/OctoPrint-InfluxDB/archive/master.zip", "author": "Aaron Griffith", "homepage": "https://github.com/agrif/OctoPrint-InfluxDB", "page": "https://plugins.octoprint.org/plugins/influxdb/", "compatibility": {"octoprint": ["1.3.11"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/influxdb/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.1", "date": "2024-05-03 22:02:12 +0000", "tag": "1.4.1"}, "releases": 9, "last_push": "2024-05-03 21:56:27 +0000", "stars": 23, "issues": {"open": 6, "closed": 18}}, "stats": {"instances_month": 101, "install_events_month": 4, "instances_week": 82, "install_events_week": 1}}, {"id": "obico", "published": "2019-11-07 00:00:00 +0000", "title": "Obico for OctoPrint: Full Remote Access - AI Failure Detection & Smart 3D Printing", "description": "Securely access OctoPrint remotely from anywhere for free with Obico. Get unlimited live webcam streaming, secure remote access, 3D printer status notifications, and a free companion mobile app for iOS and Android. Obico is the easiest plugin to access OctoPi remotely! The best part? Advanced AI-powered failure detection watches your prints so you don\u2019t have to.", "archive": "https://github.com/TheSpaghettiDetective/OctoPrint-Obico/archive/master.zip", "author": "The Obico team", "homepage": "https://www.obico.io", "page": "https://plugins.octoprint.org/plugins/obico/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/obico/featured.png", "abandoned": false, "github": {"latest_release": {"name": "Fix the compatibility issues in OctoPrint 1.10.0", "date": "2024-05-06 19:23:19 +0000", "tag": "2.4.13"}, "releases": 113, "last_push": "2024-05-06 19:21:58 +0000", "stars": 135, "issues": {"open": 48, "closed": 83}}, "stats": {"instances_month": 15868, "install_events_month": 2633, "instances_week": 7484, "install_events_week": 603}}, {"id": "thespaghettidetective", "published": "2019-11-07 00:00:00 +0000", "title": "Access Anywhere - The Spaghetti Detective", "description": "The Spaghetti Detective is now Obico! Please install \"Obico for OctoPrint\" instead.", "archive": "https://github.com/TheSpaghettiDetective/OctoPrint-TheSpaghettiDetective/archive/master.zip", "author": "The Obico team", "homepage": "https://www.obico.io", "page": "https://plugins.octoprint.org/plugins/thespaghettidetective/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Last TSD version update", "date": "2022-05-10 00:56:52 +0000", "tag": "1.8.12"}, "releases": 1, "last_push": "2022-05-07 22:16:43 +0000", "stars": 7, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 1526, "install_events_month": 108, "instances_week": 993, "install_events_week": 26}}, {"id": "UltimakerFormatPackage", "published": "2019-11-16 00:00:00 +0000", "title": "Cura Thumbnails", "description": "This plugin adds support for Ultimaker Format Package (.ufp) files.", "archive": "https://github.com/jneilliii/OctoPrint-UltimakerFormatPackage/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-UltimakerFormatPackage", "page": "https://plugins.octoprint.org/plugins/UltimakerFormatPackage/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/UltimakerFormatPackage/screenshot_thumbnail.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2022-04-16 23:46:10 +0000", "tag": "1.0.2"}, "releases": 29, "last_push": "2024-01-14 15:59:16 +0000", "stars": 29, "issues": {"open": 1, "closed": 45}}, "stats": {"instances_month": 6186, "install_events_month": 526, "instances_week": 4408, "install_events_week": 128}}, {"id": "filamentrevolutions", "published": "2019-11-29 00:00:00 +0000", "title": "Filament Sensor Revolutions", "description": "Use 1 or 2 filament sensors to pause printing or send GCode commands when filament runs out or is jammed.", "archive": "https://github.com/RomRider/Octoprint-Filament-Revolutions/archive/master.zip", "author": "RomRider", "homepage": "https://github.com/RomRider/Octoprint-Filament-Revolutions", "page": "https://plugins.octoprint.org/plugins/filamentrevolutions/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": true, "github": {"last_push": "2019-11-25 18:03:40 +0000", "stars": 12, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "mystromswitch", "published": "2019-12-03 00:00:00 +0000", "title": "OctoPrint-MyStromSwitch", "description": "Plugin to integrate myStrom Switch into your OctoPrint installation", "archive": "https://github.com/da4id/OctoPrint-MyStromSwitch/archive/master.zip", "author": "David Zingg", "homepage": "https://github.com/da4id/OctoPrint-MyStromSwitch", "page": "https://plugins.octoprint.org/plugins/mystromswitch/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mystromswitch/sidebar_on_button.png", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2020-07-25 14:50:05 +0000", "tag": "1.2.0"}, "releases": 10, "last_push": "2020-07-25 14:49:36 +0000", "stars": 4, "issues": {"open": 5, "closed": 22}}, "stats": {"instances_month": 34, "install_events_month": 0, "instances_week": 27, "install_events_week": 0}}, {"id": "resource_monitor", "published": "2019-12-03 00:00:00 +0000", "title": "Resource Monitor", "description": "A plugin to view the current CPU, RAM, disk and network usage on your system", "archive": "https://github.com/Renaud11232/OctoPrint-Resource-Monitor/archive/master.zip", "author": "Renaud Gaspard", "homepage": "https://github.com/Renaud11232/OctoPrint-Resource-Monitor", "page": "https://plugins.octoprint.org/plugins/resource_monitor/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/resource_monitor/cpu.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.16", "date": "2024-05-08 21:38:39 +0000", "tag": "0.3.16"}, "releases": 57, "last_push": "2024-05-08 21:35:38 +0000", "stars": 39, "issues": {"open": 5, "closed": 39}}, "stats": {"instances_month": 7461, "install_events_month": 638, "instances_week": 5334, "install_events_week": 147}}, {"id": "prometheus_exporter", "published": "2019-12-09 00:00:00 +0000", "title": "Prometheus Exporter", "description": "A plugin for prometheus compatible metrics endpoint", "archive": "https://github.com/tg44/OctoPrint-Prometheus-Exporter/archive/master.zip", "author": "Gergo Torcsvari", "homepage": "https://github.com/tg44/OctoPrint-Prometheus-Exporter", "page": "https://plugins.octoprint.org/plugins/prometheus_exporter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "0.2.3", "date": "2024-02-01 10:12:22 +0000", "tag": "0.2.3"}, "releases": 5, "last_push": "2024-02-01 09:55:13 +0000", "stars": 43, "issues": {"open": 4, "closed": 21}}, "stats": {"instances_month": 164, "install_events_month": 19, "instances_week": 134, "install_events_week": 4}}, {"id": "PrusaLevelingGuide", "published": "2019-12-18 00:00:00 +0000", "title": "Prusa Leveling Guide", "description": "Plugin that helps walk you through adjusting the Prusa MK3 heatbed using the nylock mod", "archive": "https://github.com/scottrini/OctoPrint-PrusaLevelingGuide/archive/master.zip", "author": "Scott Rini", "homepage": "https://github.com/scottrini/OctoPrint-PrusaLevelingGuide", "page": "https://plugins.octoprint.org/plugins/PrusaLevelingGuide/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrusaLevelingGuide/bed.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.18 Updated variance calculation", "date": "2022-11-28 19:06:56 +0000", "tag": "1.0.18"}, "releases": 21, "last_push": "2022-11-28 19:02:57 +0000", "stars": 43, "issues": {"open": 4, "closed": 46}}, "stats": {"instances_month": 2634, "install_events_month": 139, "instances_week": 1916, "install_events_week": 33}}, {"id": "octohue", "published": "2020-01-31 00:00:00 +0000", "title": "OctoHue", "description": "Hue lighting control for Octoprint - Illuminate your printer and signal its status using Phillips Hue lights", "archive": "https://github.com/entrippy/OctoPrint-OctoHue/archive/master.zip", "author": "Simon Beckett", "homepage": "https://github.com/entrippy/OctoPrint-OctoHue", "page": "https://plugins.octoprint.org/plugins/octohue/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octohue/Featured-Image.png", "abandoned": false, "github": {"latest_release": {"name": "OctoHue 0.6.0 : Lets play with friends", "date": "2023-11-26 07:09:07 +0000", "tag": "0.6.0"}, "releases": 10, "last_push": "2023-11-26 07:07:23 +0000", "stars": 18, "issues": {"open": 9, "closed": 22}}, "stats": {"instances_month": 220, "install_events_month": 9, "instances_week": 171, "install_events_week": 4}}, {"id": "progress_title", "published": "2020-01-31 00:00:00 +0000", "title": "Progress Title", "description": "Show progress percentage in document title", "archive": "https://github.com/pwnbus/OctoPrint-Progress-Title/archive/master.zip", "author": "pwnbus", "homepage": "https://github.com/pwnbus/OctoPrint-Progress-Title", "page": "https://plugins.octoprint.org/plugins/progress_title/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/progress_title/title.png", "abandoned": false, "github": {"latest_release": {"name": "Add settings for position in title", "date": "2021-11-04 06:02:49 +0000", "tag": "v0.1.2"}, "releases": 3, "last_push": "2021-11-04 05:57:19 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 495, "install_events_month": 23, "instances_week": 376, "install_events_week": 8}}, {"id": "terminalcommandsextended", "published": "2020-02-07 00:00:00 +0000", "title": "Terminal Commands Extended", "description": "Plugin that adds custom gcode command buttons to the Terminal tab.", "archive": "https://github.com/jneilliii/OctoPrint-TerminalCommandsExtended/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TerminalCommandsExtended", "page": "https://plugins.octoprint.org/plugins/terminalcommandsextended/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalcommandsextended/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2022-05-28 22:11:09 +0000", "tag": "0.1.7"}, "releases": 14, "last_push": "2024-01-14 15:59:12 +0000", "stars": 9, "issues": {"open": 10, "closed": 21}}, "stats": {"instances_month": 4159, "install_events_month": 87, "instances_week": 3070, "install_events_week": 19}}, {"id": "OctoPrint-hueCommands", "published": "2020-03-18 00:00:00 +0000", "title": "Add GCODE like HUE commands to OctoPrint", "description": "Illuminate your print job and signal its status using a Philips Hue light. Enter a GCODE equivalent anywhere you want.", "archive": "https://github.com/LMS0815/OctoPrint-hueCommands/archive/master/OctoPrint-hueCommands.zip", "author": "LMS0815", "homepage": "https://github.com/LMS0815/OctoPrint-hueCommands", "page": "https://plugins.octoprint.org/plugins/OctoPrint-hueCommands/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/LMS0815/OctoPrint-hueCommands/master/screenshots/huecommands_settings.png", "abandoned": false, "github": {"last_push": "2020-12-18 09:28:21 +0000", "stars": 4, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 38, "install_events_month": 5, "instances_week": 24, "install_events_week": 2}}, {"id": "remove_ttys_ports", "published": "2020-03-23 00:00:00 +0000", "title": "Remove /dev/ttyS* Ports (port auto detection fix)", "description": "Removes any matched /dev/ttyS* ports from the serial port list again and thus works around autodetection issues with 1.4.0 on systems with such ports", "archive": "https://github.com/OctoPrint/OctoPrint-Remove-ttyS-Ports/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Remove-ttyS-Ports", "page": "https://plugins.octoprint.org/plugins/remove_ttys_ports/", "compatibility": {"octoprint": [">=1.4.0,<1.4.1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2020-03-23 17:51:09 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2020-03-25 17:23:38 +0000", "stars": 1, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 3, "install_events_month": 0, "instances_week": 1, "install_events_week": 0}}, {"id": "fixcbdfirmware", "published": "2020-03-25 00:00:00 +0000", "title": "Fix CBD Firmware", "description": "Fixes communication with a broken firmware making its rounds that identifies as \"CBD make it\"", "archive": "https://github.com/OctoPrint/OctoPrint-FixCBDFirmware/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-FixCBDFirmware", "page": "https://plugins.octoprint.org/plugins/fixcbdfirmware/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2021-02-23 14:46:34 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2023-10-02 09:58:40 +0000", "stars": 6, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 411, "install_events_month": 40, "instances_week": 304, "install_events_week": 5}}, {"id": "Python3PluginCompatibilityCheck", "published": "2020-03-31 00:00:00 +0000", "title": "Python 3 Check", "description": "Checks installed plugins for Python 3 compatibility based on their entry in Plugin Repository.", "archive": "https://github.com/jneilliii/OctoPrint-Python3PluginCompatibilityCheck/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Python3PluginCompatibilityCheck", "page": "https://plugins.octoprint.org/plugins/Python3PluginCompatibilityCheck/", "compatibility": {"octoprint": ["1.3.11"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2020-09-22 20:57:42 +0000", "tag": "0.1.5"}, "releases": 7, "last_push": "2024-01-14 15:58:55 +0000", "stars": 7, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 29, "install_events_month": 3, "instances_week": 16, "install_events_week": 0}}, {"id": "AutoTerminalInput", "published": "2020-04-01 00:00:00 +0000", "title": "Auto Terminal Input", "description": "Automatically focuses the command input when switching to the Terminal tab in OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-AutoTerminalInput/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-AutoTerminalInput", "page": "https://plugins.octoprint.org/plugins/AutoTerminalInput/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 206, "install_events_month": 19, "instances_week": 149, "install_events_week": 3}}, {"id": "prusaslicerthumbnails", "published": "2020-04-22 00:00:00 +0000", "title": "Slicer Thumbnails", "description": "Extracts various slicer's embedded thumbnails from gcode files.", "archive": "https://github.com/jneilliii/OctoPrint-PrusaSlicerThumbnails/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PrusaSlicerThumbnails", "page": "https://plugins.octoprint.org/plugins/prusaslicerthumbnails/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prusaslicerthumbnails/screenshot_thumbnail.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.7", "date": "2024-02-09 16:22:55 +0000", "tag": "1.0.7"}, "releases": 45, "last_push": "2024-02-09 16:22:27 +0000", "stars": 93, "issues": {"open": 0, "closed": 94}}, "stats": {"instances_month": 16135, "install_events_month": 1439, "instances_week": 11826, "install_events_week": 315}}, {"id": "filamentsensorsimplified", "published": "2020-04-23 00:00:00 +0000", "title": "Filament Sensor Simplified", "description": "This plugin reacts to filament sensor output. If triggered it issues desired gcode to printer.", "archive": "https://github.com/LuckyX182/Filament_sensor_simplified/archive/master.zip", "author": "Luk\u00e1\u0161 Malatinsk\u00fd", "homepage": "https://github.com/LuckyX182/Filament_sensor_simplified", "page": "https://plugins.octoprint.org/plugins/filamentsensorsimplified/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/LuckyX182/Filament_sensor_simplified/raw/master/screenshots/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.3", "date": "2022-07-11 22:49:20 +0000", "tag": "0.3.3"}, "releases": 9, "last_push": "2022-07-11 22:48:16 +0000", "stars": 30, "issues": {"open": 15, "closed": 42}}, "stats": {"instances_month": 776, "install_events_month": 71, "instances_week": 541, "install_events_week": 16}}, {"id": "continuousprint", "published": "2020-04-24 00:00:00 +0000", "title": "Continuous Print", "description": "This plugin automates your printer! Queue your prints, push the button, and walk away - now with auto bed clearing and failure recovery.", "archive": "https://github.com/smartin015/continuousprint/archive/master.zip", "author": "Scott Martin (Current), Louis Sarwal, Paul Goddard", "homepage": "https://github.com/smartin015/continuousprint", "page": "https://plugins.octoprint.org/plugins/continuousprint/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/continuousprint/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "2.4.1", "date": "2024-04-27 17:05:33 +0000", "tag": "2.4.1"}, "releases": 33, "last_push": "2024-04-27 17:05:09 +0000", "stars": 39, "issues": {"open": 42, "closed": 88}}, "stats": {"instances_month": 1012, "install_events_month": 129, "instances_week": 695, "install_events_week": 18}}, {"id": "FriendlyNeighborhoodBeeper", "published": "2020-04-25 00:00:00 +0000", "title": "Friendly Neighborhood Beeper", "description": "Beeps after completion/failure of a print, but only during the specified hours", "archive": "https://github.com/techfreek/OctoPrint-Friendlybeeper/archive/master.zip", "author": "Alex Bahm", "homepage": "https://github.com/techfreek/OctoPrint-Friendlybeeper", "page": "https://plugins.octoprint.org/plugins/FriendlyNeighborhoodBeeper/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/FriendlyBeeper/settings.png", "abandoned": false, "github": {"latest_release": {"name": "Settings validation and improvements to beep preview", "date": "2021-01-13 01:48:33 +0000", "tag": "v0.4.1"}, "releases": 8, "last_push": "2021-01-13 01:38:30 +0000", "stars": 1, "issues": {"open": 4, "closed": 8}}, "stats": {"instances_month": 165, "install_events_month": 10, "instances_week": 122, "install_events_week": 2}}, {"id": "TemperatureLegendMover", "published": "2020-04-26 00:00:00 +0000", "title": "TemperatureLegendMover", "description": "Move the Temperature-Legend into a specific corner", "archive": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover", "page": "https://plugins.octoprint.org/plugins/TemperatureLegendMover/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover/raw/master/screenshots/temperature-legend.png", "abandoned": false, "github": {"latest_release": {"name": "V1.0.0", "date": "2020-04-25 14:34:37 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2020-04-25 15:07:25 +0000", "stars": 4, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 114, "install_events_month": 22, "instances_week": 82, "install_events_week": 7}}, {"id": "emergencystopsimplified", "published": "2020-04-26 00:00:00 +0000", "title": "Emergency Stop Simplified", "description": "This plugin reacts to a switch or button, if triggered (switch open) it issues M112 command to printer.", "archive": "https://github.com/Mechazawa/Emergency_stop_simplified/archive/master.zip", "author": "Mechazawa", "homepage": "https://github.com/Mechazawa/Emergency_stop_simplified", "page": "https://plugins.octoprint.org/plugins/emergencystopsimplified/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-04-26 00:25:01 +0000", "stars": 6, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 215, "install_events_month": 18, "instances_week": 147, "install_events_week": 5}}, {"id": "webhooks", "published": "2020-04-29 00:00:00 +0000", "title": "OctoPrint-Webhooks", "description": "This allows you to send a webhook to any URL when events happen on OctoPrint.", "archive": "https://github.com/derekantrican/OctoPrint-Webhooks/archive/master.zip", "author": "Derek Antrican, Blane Townsend", "homepage": "https://github.com/derekantrican/OctoPrint-Webhooks", "page": "https://plugins.octoprint.org/plugins/webhooks/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webhooks/Featured.png", "abandoned": false, "github": {"latest_release": {"name": "Added @appearance variable to list of supported variables", "date": "2023-10-08 01:09:33 +0000", "tag": "4.2.1"}, "releases": 6, "last_push": "2023-10-08 01:08:08 +0000", "stars": 7, "issues": {"open": 6, "closed": 7}}, "stats": {"instances_month": 400, "install_events_month": 32, "instances_week": 290, "install_events_week": 7}}, {"id": "printoid", "published": "2020-04-30 00:00:00 +0000", "title": "OctoPrint-Printoid", "description": "Notifications plugin for Printoid (Android app for OctoPrint)", "archive": "https://github.com/anthonyst91/OctoPrint-Printoid/archive/master.zip", "author": "Anthony St\u00e9phan", "homepage": "https://github.com/anthonyst91/OctoPrint-Printoid", "page": "https://plugins.octoprint.org/plugins/printoid/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "abandoned": false, "github": {"latest_release": {"name": "Version v1.2.0", "date": "2022-02-07 09:49:53 +0000", "tag": "v1.2.0"}, "releases": 6, "last_push": "2022-02-10 08:31:17 +0000", "stars": 13, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1213, "install_events_month": 61, "instances_week": 880, "install_events_week": 8}}, {"id": "smartpreheat", "published": "2020-05-02 00:00:00 +0000", "title": "Smart Preheat", "description": "Parses GCode files and provides variables that can be accessed in GCode scripts. Reduces heatup time and allows for preheating before bed leveling.", "archive": "https://github.com/kantlivelong/OctoPrint-SmartPreheat/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-SmartPreheat", "page": "https://plugins.octoprint.org/plugins/smartpreheat/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/kantlivelong/OctoPrint-SmartPreheat/master/extra/screenshots/beforePrintStarted.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.6", "date": "2021-02-02 17:31:42 +0000", "tag": "0.0.6"}, "releases": 6, "last_push": "2021-02-01 19:24:56 +0000", "stars": 24, "issues": {"open": 3, "closed": 10}}, "stats": {"instances_month": 1061, "install_events_month": 81, "instances_week": 727, "install_events_week": 16}}, {"id": "terminalresponse", "published": "2020-05-07 00:00:00 +0000", "title": "Terminal Response", "description": "Monitors terminal for a regular expression and allows you to respond with your own commands.", "archive": "https://github.com/xia0/OctoPrint-TerminalResponse/archive/master.zip", "author": "Xiao Jin", "homepage": "https://github.com/xia0/OctoPrint-TerminalResponse", "page": "https://plugins.octoprint.org/plugins/terminalresponse/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalresponse/01.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2021-05-03 08:37:49 +0000", "tag": "0.1.4"}, "releases": 1, "last_push": "2021-05-03 08:32:30 +0000", "stars": 4, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 28, "install_events_month": 2, "instances_week": 18, "install_events_week": 1}}, {"id": "FlashForge", "published": "2020-05-18 00:00:00 +0000", "title": "Flashforge/Dremel/PowerSpec Printer Support", "description": "Enable OctoPrint to connect to certain FlashForge, Dremel and PowerSpec printers.", "archive": "https://github.com/Mrnt/OctoPrint-FlashForge/archive/master.zip", "author": "Mrnt", "homepage": "https://github.com/Mrnt/OctoPrint-FlashForge", "page": "https://plugins.octoprint.org/plugins/FlashForge/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "0.2.6", "date": "2020-10-15 16:25:51 +0000", "tag": "0.2.6"}, "releases": 23, "last_push": "2024-03-29 20:54:09 +0000", "stars": 87, "issues": {"open": 30, "closed": 31}}, "stats": {"instances_month": 113, "install_events_month": 1, "instances_week": 68, "install_events_week": 1}}, {"id": "EasyServo", "published": "2020-05-21 00:00:00 +0000", "title": "Easy Servo", "description": "Plugin to control two servos attached to a camera gimbal to control motion.", "archive": "https://github.com/mledan/OctoPrint-EasyServo/archive/master.zip", "author": "mledan, iFrostizz, jneilliii", "homepage": "https://github.com/mledan/OctoPrint-EasyServo", "page": "https://plugins.octoprint.org/plugins/EasyServo/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Release for issue #22 ", "date": "2023-01-12 05:10:46 +0000", "tag": "v0.2.4"}, "releases": 7, "last_push": "2024-04-02 17:24:45 +0000", "stars": 21, "issues": {"open": 3, "closed": 13}}, "stats": {"instances_month": 114, "install_events_month": 7, "instances_week": 88, "install_events_week": 0}}, {"id": "multilineterminal", "published": "2020-05-21 00:00:00 +0000", "title": "Multi Line Terminal", "description": "Makes the terminal input a multi line text area.", "archive": "https://github.com/jneilliii/OctoPrint-MultiLineTerminal/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MultiLineTerminal", "page": "https://plugins.octoprint.org/plugins/multilineterminal/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/multilineterminal/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2020-10-17 05:00:49 +0000", "tag": "0.1.5"}, "releases": 6, "last_push": "2024-01-14 15:58:52 +0000", "stars": 5, "issues": {"open": 2, "closed": 7}}, "stats": {"instances_month": 268, "install_events_month": 11, "instances_week": 209, "install_events_week": 2}}, {"id": "ikea_tradfri", "published": "2020-05-24 00:00:00 +0000", "title": "Ikea Tradfri", "description": "Control Ikea Tradfri outlet", "archive": "https://github.com/ralmn/OctoPrint-Ikea-tradfri/archive/master.zip", "author": "Mathieu \"ralmn\" HIREL", "homepage": "https://github.com/ralmn/OctoPrint-Ikea-tradfri", "page": "https://plugins.octoprint.org/plugins/ikea_tradfri/", "compatibility": {"octoprint": ["1.4.0", "1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ikea_tradfri/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.7.5", "date": "2021-11-04 23:07:05 +0000", "tag": "1.7.5"}, "releases": 26, "last_push": "2021-11-04 23:05:17 +0000", "stars": 10, "issues": {"open": 5, "closed": 42}}, "stats": {"instances_month": 45, "install_events_month": 3, "instances_week": 33, "install_events_week": 1}}, {"id": "CooldownNotification", "published": "2020-05-26 00:00:00 +0000", "title": "CooldownNotification", "description": "A plugin to execute gcode commands when the print bed cools to a certain temperature", "archive": "https://github.com/gmccauley/OctoPrint-CooldownNotification/archive/master.zip", "author": "George McCauley", "homepage": "https://github.com/gmccauley/OctoPrint-CooldownNotification", "page": "https://plugins.octoprint.org/plugins/CooldownNotification/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CooldownNotification/settings.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.2 - 29 May 2020", "date": "2020-05-30 03:40:25 +0000", "tag": "v0.1.2"}, "releases": 3, "last_push": "2020-05-30 03:46:45 +0000", "stars": 6, "issues": {"open": 8, "closed": 5}}, "stats": {"instances_month": 150, "install_events_month": 4, "instances_week": 111, "install_events_week": 3}}, {"id": "PrintJobHistory", "published": "2020-05-28 00:00:00 +0000", "title": "PrintJobHistory", "description": "The OctoPrint-Plugin stores all print-job information of a print in a database.", "archive": "https://github.com/dojohnso/OctoPrint-PrintJobHistory/releases/latest/download/main.zip", "author": "dojohnso, Olli", "homepage": "https://github.com/dojohnso/OctoPrint-PrintJobHistory", "page": "https://plugins.octoprint.org/plugins/PrintJobHistory/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrintJobHistory/editPrintJob-dialog.png", "abandoned": false, "github": {"latest_release": {"name": "V1.17.2", "date": "2023-12-01 15:57:59 +0000", "tag": "1.17.2"}, "releases": 4, "last_push": "2023-12-01 15:59:53 +0000", "stars": 16, "issues": {"open": 8, "closed": 5}}, "stats": {"instances_month": 2700, "install_events_month": 207, "instances_week": 2009, "install_events_week": 45}}, {"id": "mqttsubscribe", "published": "2020-05-29 00:00:00 +0000", "title": "MQTT Subscribe", "description": "This plugin allows controlling OctoPrint via MQTT messages.", "archive": "https://github.com/jneilliii/OctoPrint-MQTTSubscribe/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MQTTSubscribe", "page": "https://plugins.octoprint.org/plugins/mqttsubscribe/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2022-11-05 19:14:33 +0000", "tag": "0.1.8"}, "releases": 9, "last_push": "2024-01-14 15:58:55 +0000", "stars": 12, "issues": {"open": 0, "closed": 27}}, "stats": {"instances_month": 253, "install_events_month": 21, "instances_week": 196, "install_events_week": 6}}, {"id": "lametric", "published": "2020-06-01 00:00:00 +0000", "title": "Lametric", "description": "Display progress of your Octoprint instance on your LaMetric smart clock.", "archive": "https://github.com/thijsbekke/Octoprint-LaMetric/archive/master.zip", "author": "Thijs Bekke", "homepage": "https://github.com/thijsbekke/Octoprint-LaMetric/", "page": "https://plugins.octoprint.org/plugins/lametric/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/lametric/screenshot_1.png", "abandoned": false, "github": {"latest_release": {"name": "Add a test button to the settings", "date": "2020-06-12 06:28:24 +0000", "tag": "0.1.3"}, "releases": 2, "last_push": "2020-06-12 06:00:04 +0000", "stars": 7, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 22, "install_events_month": 1, "instances_week": 15, "install_events_week": 0}}, {"id": "M300Player", "published": "2020-06-02 00:00:00 +0000", "title": "M300 Player", "description": "Plugin that will play M300 beeps in the web interface.", "archive": "https://github.com/jneilliii/OctoPrint-M300Player/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M300Player", "page": "https://plugins.octoprint.org/plugins/M300Player/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M300Player/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2019-10-22 02:44:11 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-14 15:58:54 +0000", "stars": 5, "issues": {"open": 2, "closed": 3}}, "stats": {"instances_month": 127, "install_events_month": 21, "instances_week": 83, "install_events_week": 2}}, {"id": "setandwait", "published": "2020-06-02 00:00:00 +0000", "title": "Set And Wait", "description": "This OctoPrint plugin implements Set And Wait commands M109 & M190 into OctoPrint and sends their non-blocking counterparts to the controller.", "archive": "https://github.com/kantlivelong/OctoPrint-SetAndWait/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-SetAndWait", "page": "https://plugins.octoprint.org/plugins/setandwait/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2020-06-02 04:14:18 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2020-06-02 04:09:02 +0000", "stars": 3, "issues": {"open": 6, "closed": 1}}, "stats": {"instances_month": 119, "install_events_month": 8, "instances_week": 97, "install_events_week": 0}}, {"id": "stickypad", "published": "2020-06-02 00:00:00 +0000", "title": "Sticky Pad", "description": "This plugin adds a persistent sticky pad to the web interface for keeping random notes.", "archive": "https://github.com/jneilliii/OctoPrint-StickyPad/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-StickyPad", "page": "https://plugins.octoprint.org/plugins/stickypad/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stickypad/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-09-17 16:39:06 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2024-01-14 15:59:05 +0000", "stars": 2, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 222, "install_events_month": 9, "instances_week": 166, "install_events_week": 0}}, {"id": "webcam_iframe", "published": "2020-06-02 00:00:00 +0000", "title": "Webcam Iframe", "description": "Simple plugin that replaces the webcam image on the control tab with an iframe that loads the webcam url from the default settings.", "archive": "https://github.com/jneilliii/OctoPrint-WebcamIframe/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WebcamIframe", "page": "https://plugins.octoprint.org/plugins/webcam_iframe/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webcam_iframe/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.7", "date": "2024-02-19 08:04:38 +0000", "tag": "0.0.7"}, "releases": 6, "last_push": "2024-02-19 08:03:37 +0000", "stars": 18, "issues": {"open": 1, "closed": 15}}, "stats": {"instances_month": 222, "install_events_month": 47, "instances_week": 123, "install_events_week": 12}}, {"id": "restorelevelingafterg28", "published": "2020-06-03 00:00:00 +0000", "title": "Restore Leveling After G28", "description": "Automatically keeps bed leveling on after G28 (Auto Home).", "archive": "https://github.com/Xennis/OctoPrint-RestoreLevelingAfterG28/archive/master.zip", "author": "Xennis", "homepage": "https://github.com/Xennis/OctoPrint-RestoreLevelingAfterG28", "page": "https://plugins.octoprint.org/plugins/restorelevelingafterg28/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2020-07-29 20:17:07 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2023-07-13 14:35:20 +0000", "stars": 4, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 343, "install_events_month": 31, "instances_week": 230, "install_events_week": 9}}, {"id": "widescreen", "published": "2020-06-03 00:00:00 +0000", "title": "OctoPrint-WideScreen", "description": "Plugin that adds a right sidebar panel and moves configured panels from left sidebar to the right sidebar.", "archive": "https://github.com/jneilliii/OctoPrint-WideScreen/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WideScreen", "page": "https://plugins.octoprint.org/plugins/widescreen/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/widescreen/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-11-21 03:46:58 +0000", "tag": "0.1.4"}, "releases": 8, "last_push": "2024-01-14 15:59:19 +0000", "stars": 20, "issues": {"open": 3, "closed": 17}}, "stats": {"instances_month": 1923, "install_events_month": 150, "instances_week": 1323, "install_events_week": 35}}, {"id": "prusa_mini_eta", "published": "2020-06-04 00:00:00 +0000", "title": "OctoPrint-Prusa-Mini-ETA", "description": "Prusa ETA detection from the gcode files prepared by the Prusa Slicer.", "archive": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/archive/master.zip", "author": "Etienne G. (current), Michal Duda", "homepage": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA", "page": "https://plugins.octoprint.org/plugins/prusa_mini_eta/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/raw/master/assets/img/Print-Time-Left.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-03-30 21:06:31 +0000", "tag": "0.1.4"}, "releases": 1, "last_push": "2022-03-22 22:55:44 +0000", "stars": 4, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 546, "install_events_month": 36, "instances_week": 416, "install_events_week": 4}}, {"id": "signalclirestapi", "published": "2020-06-06 00:00:00 +0000", "title": "Signalclirestapi", "description": "Another Signal Messenger Integration based on the signal-cli-rest-api docker image. Supports Signal Messenger groups and print progress.", "archive": "https://github.com/bbernhard/OctoPrint-Signalclirestapi/archive/master.zip", "author": "Bernhard B.", "homepage": "https://github.com/bbernhard/OctoPrint-Signalclirestapi", "page": "https://plugins.octoprint.org/plugins/signalclirestapi/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/signalclirestapi/config1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.2.1", "date": "2023-02-02 17:05:52 +0000", "tag": "0.2.1"}, "releases": 3, "last_push": "2023-02-02 17:05:12 +0000", "stars": 5, "issues": {"open": 1, "closed": 5}}, "stats": {"instances_month": 11, "install_events_month": 3, "instances_week": 6, "install_events_week": 1}}, {"id": "SMuFF", "published": "2020-06-11 00:00:00 +0000", "title": "OctoPrint-Smuff", "description": "A plugin for controlling tool changes on the SMuFF from OctoPrint as published on Thingiverse https://www.thingiverse.com/thing:3431438", "archive": "https://github.com/technik-gegg/OctoPrint-Smuff/archive/master.zip", "author": "Technik Gegg", "homepage": "https://github.com/technik-gegg/OctoPrint-Smuff", "page": "https://plugins.octoprint.org/plugins/SMuFF/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SMuFF/SMuFF-V5.png", "abandoned": false, "github": {"latest_release": {"name": "V1.2.4", "date": "2023-12-22 05:04:33 +0000", "tag": "V1.2.4"}, "releases": 3, "last_push": "2023-05-06 07:05:06 +0000", "stars": 18, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 10, "install_events_month": 4, "instances_week": 7, "install_events_week": 0}}, {"id": "consolidate_temp_control", "published": "2020-06-12 00:00:00 +0000", "title": "Consolidate Temp Control", "description": "This plugin consolidates the temperature and control tabs into one.", "archive": "https://github.com/jneilliii/OctoPrint-ConsolidateTempControl/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ConsolidateTempControl", "page": "https://plugins.octoprint.org/plugins/consolidate_temp_control/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/consolidate_temp_control/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.10", "date": "2023-05-24 20:41:26 +0000", "tag": "0.1.10"}, "releases": 13, "last_push": "2024-01-14 15:58:42 +0000", "stars": 15, "issues": {"open": 0, "closed": 20}}, "stats": {"instances_month": 1194, "install_events_month": 68, "instances_week": 874, "install_events_week": 14}}, {"id": "simple_filament_change_buttons", "published": "2020-06-12 00:00:00 +0000", "title": "Simple Filament Change Buttons", "description": "Simply adds some buttons to send the filament load/unload/change commands for Marlin, so you don't have to use the LCD menu", "archive": "https://github.com/TheThief/Octoprint_Simple_Filament_Change_Buttons/archive/master.zip", "author": "Gareth Martin", "homepage": "https://github.com/TheThief/Octoprint_Simple_Filament_Change_Buttons/", "page": "https://plugins.octoprint.org/plugins/simple_filament_change_buttons/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "mit", "image": "https://plugins.octoprint.org/assets/img/plugins/simple_filament_change_buttons/sfc_buttons.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1", "date": "2021-01-26 11:55:48 +0000", "tag": "v1.1"}, "releases": 2, "last_push": "2023-04-05 07:01:05 +0000", "stars": 5, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 1937, "install_events_month": 136, "instances_week": 1391, "install_events_week": 30}}, {"id": "homeassistant", "published": "2020-06-14 00:00:00 +0000", "title": "HomeAssistant Discovery", "description": "Automatically add your OctoPrint server to Home Assistant with MQTT", "archive": "https://github.com/cmroche/OctoPrint-HomeAssistant/archive/master.zip", "author": "Clifford Roche", "homepage": "https://github.com/cmroche/OctoPrint-HomeAssistant", "page": "https://plugins.octoprint.org/plugins/homeassistant/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/homeassistant/hassio.png", "abandoned": false, "github": {"latest_release": {"name": "3.7.0", "date": "2023-08-06 20:28:39 +0000", "tag": "3.7.0"}, "releases": 37, "last_push": "2023-08-06 20:27:46 +0000", "stars": 109, "issues": {"open": 12, "closed": 62}}, "stats": {"instances_month": 3210, "install_events_month": 241, "instances_week": 2398, "install_events_week": 54}}, {"id": "z_probe_offset", "published": "2020-06-14 00:00:00 +0000", "title": "Z Probe Offset Control", "description": "Add input to the control view for editing the z probe offset on marlin based printers", "archive": "https://framagit.org/razer/octoprint_z_probe_offset/-/archive/latest/octoprint_z_probe_offset-latest.zip", "author": "razer", "homepage": "https://framagit.org/razer/octoprint_z_probe_offset", "page": "https://plugins.octoprint.org/plugins/z_probe_offset/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/z_probe_offset/z_probe_offset_control.png", "abandoned": false, "stats": {"instances_month": 3401, "install_events_month": 320, "instances_week": 2318, "install_events_week": 67}}, {"id": "geeks3d", "published": "2020-06-22 00:00:00 +0000", "title": "OctoPrint-3DGeeks", "description": "Companion plugin for 3D Geeks (Android & iOS App)", "archive": "https://github.com/2BWorks/OctoPrint-3DGeeks/archive/master.zip", "author": "Toby from 3D Geeks", "homepage": "https://www.3dgeeks.app", "page": "https://plugins.octoprint.org/plugins/geeks3d/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/geeks3d/featured.png", "abandoned": false, "github": {"last_push": "2020-06-26 08:22:37 +0000", "stars": 3, "issues": {"open": 5, "closed": 1}}, "stats": {"instances_month": 182, "install_events_month": 10, "instances_week": 131, "install_events_week": 1}}, {"id": "RewriteM600", "published": "2020-06-23 00:00:00 +0000", "title": "Rewrite M600 - For M600 Unsupported", "description": "Implement M600 for pinters that can't support M600 by default (TFT with out marlin mode support, like Artilelry X1 and Genius)", "archive": "https://github.com/wgcv/RewriteM600/archive/master.zip", "author": "Gustavo Cevallos", "homepage": "https://github.com/wgcv/RewriteM600", "page": "https://plugins.octoprint.org/plugins/RewriteM600/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/RewriteM600/M600-in-action.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.5", "date": "2020-07-05 18:58:36 +0000", "tag": "v1.0.5"}, "releases": 4, "last_push": "2021-10-02 18:41:15 +0000", "stars": 12, "issues": {"open": 9, "closed": 2}}, "stats": {"instances_month": 237, "install_events_month": 17, "instances_week": 162, "install_events_week": 3}}, {"id": "ngrok", "published": "2020-06-23 00:00:00 +0000", "title": "Ngrok Tunnel", "description": "A plugin to securely access your OctoPrint instance remotely through ngrok", "archive": "https://github.com/fieldOfView/OctoPrint-ngrok/archive/master.zip", "author": "fieldOfView", "homepage": "https://github.com/fieldOfView/OctoPrint-ngrok", "page": "https://plugins.octoprint.org/plugins/ngrok/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ngrok/ngrok_navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2021-05-18 10:29:25 +0000", "tag": "0.4.0"}, "releases": 10, "last_push": "2021-05-18 10:27:23 +0000", "stars": 15, "issues": {"open": 9, "closed": 23}}, "stats": {"instances_month": 393, "install_events_month": 40, "instances_week": 285, "install_events_week": 12}}, {"id": "DuCalibrator", "published": "2020-06-24 00:00:00 +0000", "title": "Delta Micro Calibrator", "description": "An OctoPrint Plugin for performing micro calibration in linear delta machines.", "archive": "https://github.com/Fabi0San/DuCalibrator/archive/master.zip", "author": "Fabio Santos", "homepage": "https://github.com/Fabi0San/DuCalibrator", "page": "https://plugins.octoprint.org/plugins/DuCalibrator/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/DuCalibrator/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.4", "date": "2020-06-28 22:45:15 +0000", "tag": "1.0.4"}, "releases": 4, "last_push": "2020-06-28 22:43:15 +0000", "stars": 13, "issues": {"open": 6, "closed": 15}}, "stats": {"instances_month": 57, "install_events_month": 7, "instances_week": 43, "install_events_week": 3}}, {"id": "ThermalRunaway", "published": "2020-06-28 00:00:00 +0000", "title": "Thermal Runaway", "description": "An Octoprint Plugin to provide some basic Thermal Runaway protection", "archive": "https://github.com/AlexVerrico/Octoprint-ThermalRunaway/archive/master.zip", "author": "Alex Verrico", "homepage": "https://github.com/AlexVerrico/Octoprint-ThermalRunaway", "page": "https://plugins.octoprint.org/plugins/ThermalRunaway/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ThermalRunaway/ThermalRunaway-config.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.0 - Rewrite of thermal runaway detection logic", "date": "2022-01-14 01:05:03 +0000", "tag": "3.1.0"}, "releases": 10, "last_push": "2022-01-14 01:01:53 +0000", "stars": 5, "issues": {"open": 4, "closed": 11}}, "stats": {"instances_month": 278, "install_events_month": 24, "instances_week": 202, "install_events_week": 6}}, {"id": "macro", "published": "2020-06-28 00:00:00 +0000", "title": "Sidebar Macros", "description": "Plugin for Octoprint to add macros list in sidebar", "archive": "https://github.com/mike1pol/octoprint_macro/archive/master.zip", "author": "Mikhail Poluboyarinov", "homepage": "https://github.com/mike1pol/octoprint_macro", "page": "https://plugins.octoprint.org/plugins/macro/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/macro/main.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2022-01-14 08:26:47 +0000", "tag": "0.3.2"}, "releases": 6, "last_push": "2022-01-14 08:25:55 +0000", "stars": 4, "issues": {"open": 10, "closed": 17}}, "stats": {"instances_month": 439, "install_events_month": 32, "instances_week": 320, "install_events_week": 8}}, {"id": "swapxy", "published": "2020-07-02 00:00:00 +0000", "title": "SwapXY", "description": "Swap the X and Y axes used by the jog controls", "archive": "https://gitlab.com/wolframmfg/octoprint-swapxy/-/archive/main/octoprint-swapxy-main.zip", "author": "Andy Castille ", "homepage": "https://gitlab.com/wolframmfg/octoprint-swapxy", "page": "https://plugins.octoprint.org/plugins/swapxy/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/swapxy/swapxy_controls.png", "abandoned": false, "stats": {"instances_month": 21, "install_events_month": 1, "instances_week": 17, "install_events_week": 0}}, {"id": "GPIOShutdown", "published": "2020-07-03 00:00:00 +0000", "title": "GPIO Shutdown", "description": "A plugin that shutdown the Rasperry Pi if you connect ground to one of the selected GPIO ports.", "archive": "https://github.com/fmalekpour/OctoPrint-Gpioshutdown/archive/master.zip", "author": "Farhad Malekpour", "homepage": "https://github.com/fmalekpour/OctoPrint-Gpioshutdown", "page": "https://plugins.octoprint.org/plugins/GPIOShutdown/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/fmalekpour/OctoPrint-Gpioshutdown/master/screenshots/screen01.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2021-04-01 05:52:15 +0000", "tag": "1.0.4"}, "releases": 4, "last_push": "2021-04-01 05:49:36 +0000", "stars": 12, "issues": {"open": 14, "closed": 5}}, "stats": {"instances_month": 196, "install_events_month": 9, "instances_week": 120, "install_events_week": 1}}, {"id": "M150Control", "published": "2020-07-03 00:00:00 +0000", "title": "OctoPrint-M150control", "description": "Send M150 control through the UI", "archive": "https://github.com/horfee/OctoPrint-M150control/archive/master.zip", "author": "Jean-Philippe Alexandre", "homepage": "https://github.com/horfee/OctoPrint-M150control", "page": "https://plugins.octoprint.org/plugins/M150Control/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M150Control/screenshot.jpg", "abandoned": false, "github": {"last_push": "2020-07-16 14:18:51 +0000", "stars": 1, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 73, "install_events_month": 6, "instances_week": 54, "install_events_week": 0}}, {"id": "gridspace", "published": "2020-07-04 00:00:00 +0000", "title": "OctoPrint-GridSpace", "description": "Allows for direct printing from GridSpace's Kiri:Moto slicer", "archive": "https://github.com/GridSpace/OctoPrint-GridSpace/archive/master.zip", "author": "Stewart Allen", "homepage": "https://github.com/GridSpace/OctoPrint-GridSpace", "page": "https://plugins.octoprint.org/plugins/gridspace/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/gridspace/Kiri-In-OctoPrint.png", "abandoned": false, "github": {"last_push": "2022-10-22 20:19:54 +0000", "stars": 6, "issues": {"open": 4, "closed": 2}}, "stats": {"instances_month": 60, "install_events_month": 5, "instances_week": 38, "install_events_week": 0}}, {"id": "ArduCamFocus", "published": "2020-07-11 00:00:00 +0000", "title": "ArduCamFocus", "description": "Plugin to control ArduCam with motorized focus control on octopi", "archive": "https://github.com/moof-src/ArduCamFocus/archive/master.zip", "author": "moof, jneilliii", "homepage": "https://github.com/moof-src/ArduCamFocus", "page": "https://plugins.octoprint.org/plugins/ArduCamFocus/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ArduCamFocus/ControlScreenShot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.6 - Improved Error Handling", "date": "2021-04-24 13:03:22 +0000", "tag": "0.0.6"}, "releases": 2, "last_push": "2021-04-24 12:38:06 +0000", "stars": 16, "issues": {"open": 7, "closed": 6}}, "stats": {"instances_month": 280, "install_events_month": 27, "instances_week": 188, "install_events_week": 8}}, {"id": "GPIOCoolDownFan", "published": "2020-07-16 00:00:00 +0000", "title": "OctoPrint-Cooldownfan", "description": "Turn on the cooldown fan after printing finished", "archive": "https://github.com/fmalekpour/OctoPrint-Cooldownfan/archive/master.zip", "author": "Farhad Malekpour", "homepage": "https://github.com/fmalekpour/OctoPrint-Cooldownfan", "page": "https://plugins.octoprint.org/plugins/GPIOCoolDownFan/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cooldownfan/cool-down-fan-config-screen.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-07-16 07:40:04 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2020-07-17 03:05:44 +0000", "stars": 6, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 66, "install_events_month": 3, "instances_week": 45, "install_events_week": 2}}, {"id": "marlinbft", "published": "2020-07-26 00:00:00 +0000", "title": "OctoPrint-MarlinBft", "description": "Upload files using Marlin Binary File Transfer Mark II", "archive": "https://github.com/charleswillis3/OctoPrint-MarlinBft/archive/master.zip", "author": "Charles Willis", "homepage": "https://github.com/charleswillis3/OctoPrint-MarlinBft", "page": "https://plugins.octoprint.org/plugins/marlinbft/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/marlinbft/marlinbft-feature.png", "abandoned": false, "github": {"last_push": "2020-07-29 10:34:40 +0000", "stars": 11, "issues": {"open": 10, "closed": 5}}, "stats": {"instances_month": 121, "install_events_month": 14, "instances_week": 77, "install_events_week": 1}}, {"id": "printhistory", "published": "2020-07-27 00:00:00 +0000", "title": "Print History", "description": "Saves filename, print time and filament usage for each print", "archive": "https://github.com/imrahil/OctoPrint-PrintHistory/archive/master.zip", "author": "Jarek Szczepanski, Guy Sheffer", "homepage": "https://github.com/imrahil/OctoPrint-PrintHistory", "page": "https://plugins.octoprint.org/plugins/printhistory/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printhistory/printhistory.png", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint PrintHistory Plugin 1.4.1", "date": "2023-05-21 16:52:30 +0000", "tag": "1.4.1"}, "releases": 16, "last_push": "2023-06-29 02:51:06 +0000", "stars": 63, "issues": {"open": 29, "closed": 52}}, "stats": {"instances_month": 1493, "install_events_month": 119, "instances_week": 1125, "install_events_week": 27}}, {"id": "ws281x_led_status", "published": "2020-07-28 00:00:00 +0000", "title": "WS281x LED Status", "description": "Add some WS281x type RGB LEDs to your printer for a quick status update!", "archive": "https://github.com/cp2004/OctoPrint-WS281x_LED_Status/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-WS281x_LED_Status", "page": "https://plugins.octoprint.org/plugins/ws281x_led_status/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ws281x_led_status/ws281x_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.8.1 (Stable Release)", "date": "2022-03-13 20:57:54 +0000", "tag": "0.8.1"}, "releases": 26, "last_push": "2023-12-27 13:00:31 +0000", "stars": 111, "issues": {"open": 19, "closed": 173}}, "stats": {"instances_month": 780, "install_events_month": 57, "instances_week": 537, "install_events_week": 18}}, {"id": "virtual_printerconfig", "published": "2020-08-04 00:00:00 +0000", "title": "Virtual Printer Settings", "description": "Add configurable settings to the Virtual Printer plugin under OctoPrint's settings", "archive": "https://github.com/cp2004/OctoPrint-VirtualPrinterSettings/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-VirtualPrinterSettings", "page": "https://plugins.octoprint.org/plugins/virtual_printerconfig/", "compatibility": {"octoprint": ["1.8.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/virtual_printerconfig/settings.png", "abandoned": false, "github": {"latest_release": {"name": "2022.07.04", "date": "2022-07-04 21:16:42 +0000", "tag": "2022.07.04"}, "releases": 8, "last_push": "2023-12-27 13:00:32 +0000", "stars": 5, "issues": {"open": 0, "closed": 9}}, "stats": {"instances_month": 229, "install_events_month": 29, "instances_week": 145, "install_events_week": 4}}, {"id": "consolidatedtabs", "published": "2020-08-06 00:00:00 +0000", "title": "Consolidated Tabs", "description": "Combines configured tabs into a single tab as draggable and resizable panels.", "archive": "https://github.com/jneilliii/OctoPrint-ConsolidatedTabs/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ConsolidatedTabs", "page": "https://plugins.octoprint.org/plugins/consolidatedtabs/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/consolidatedtabs/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2023-05-25 00:33:21 +0000", "tag": "1.0.2"}, "releases": 21, "last_push": "2024-01-14 15:58:43 +0000", "stars": 22, "issues": {"open": 3, "closed": 47}}, "stats": {"instances_month": 805, "install_events_month": 54, "instances_week": 589, "install_events_week": 9}}, {"id": "octotweet", "published": "2020-08-08 00:00:00 +0000", "title": "OctoPrint-Octotweet", "description": "Twitter plugin for OctoPrint", "archive": "https://github.com/jpg32/OctoPrint-Octotweet/archive/master.zip", "author": "Jean Pierre GARCIA", "homepage": "https://github.com/jpg32/OctoPrint-Octotweet", "page": "https://plugins.octoprint.org/plugins/octotweet/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octotweet/twitter.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.0.5", "date": "2020-11-07 16:39:00 +0000", "tag": "v1.0.5"}, "releases": 4, "last_push": "2020-11-07 16:37:07 +0000", "stars": 3, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 1, "instances_week": 13, "install_events_week": 0}}, {"id": "heatbedsavety", "published": "2020-08-14 00:00:00 +0000", "title": "OctoPrint-HeatBedSavety", "description": "HighPower HeatBedSavety Plugin", "archive": "https://github.com/linux-paul/OctoPrint-Heatbedsavety/archive/master.zip", "author": "linux-paul", "homepage": "https://github.com/linux-paul/OctoPrint-Heatbedsavety", "page": "https://plugins.octoprint.org/plugins/heatbedsavety/", "compatibility": {"octoprint": ["1.3.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-08-17 06:01:47 +0000", "stars": 1, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 11, "install_events_month": 2, "instances_week": 7, "install_events_week": 0}}, {"id": "ophom", "published": "2020-08-16 00:00:00 +0000", "title": "Ophom", "description": "Octoprint Philips Hue Outlet Manager", "archive": "https://github.com/Salamafet/ophom/archive/master.zip", "author": "St\u00e9phane Z.", "homepage": "https://github.com/Salamafet/ophom", "page": "https://plugins.octoprint.org/plugins/ophom/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Fix for Octoprint 1.8.3 update", "date": "2022-09-28 21:41:19 +0000", "tag": "1.5.1"}, "releases": 17, "last_push": "2024-02-05 18:09:04 +0000", "stars": 7, "issues": {"open": 4, "closed": 34}}, "stats": {"instances_month": 261, "install_events_month": 10, "instances_week": 176, "install_events_week": 1}}, {"id": "prettygcode", "published": "2020-08-17 00:00:00 +0000", "title": "OctoPrint-PrettyGCode", "description": "A pretty GCode visualizer for Octoprint", "archive": "https://github.com/Kragrathea/OctoPrint-PrettyGCode/archive/master.zip", "author": "Kragrathea", "homepage": "https://github.com/Kragrathea/OctoPrint-PrettyGCode", "page": "https://plugins.octoprint.org/plugins/prettygcode/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prettygcode/PrettyGcode-Screen1.jpg", "abandoned": false, "github": {"latest_release": {"name": "Version 1.2.4", "date": "2020-12-14 01:39:57 +0000", "tag": "v1.2.4"}, "releases": 10, "last_push": "2021-10-11 20:58:45 +0000", "stars": 113, "issues": {"open": 47, "closed": 58}}, "stats": {"instances_month": 15645, "install_events_month": 1498, "instances_week": 12074, "install_events_week": 340}}, {"id": "procastinator", "published": "2020-08-21 00:00:00 +0000", "title": "Procastinator", "description": "Puts printjobs on hold until a certain time", "archive": "https://github.com/juergenpabel/OctoPrint-Procastinator/archive/master.zip", "author": "Juergen Pabel", "homepage": "https://github.com/juergenpabel/OctoPrint-Procastinator", "page": "https://plugins.octoprint.org/plugins/procastinator/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/procastinator/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.1", "date": "2020-08-25 18:48:39 +0000", "tag": "1.1.1"}, "releases": 19, "last_push": "2020-08-25 18:48:35 +0000", "stars": 2, "issues": {"open": 10, "closed": 3}}, "stats": {"instances_month": 162, "install_events_month": 10, "instances_week": 121, "install_events_week": 3}}, {"id": "SpoolManager", "published": "2020-08-23 00:00:00 +0000", "title": "SpoolManager", "description": "The OctoPrint-Plugin manages all spool informations and stores it in a database.", "archive": "https://github.com/dojohnso/OctoPrint-SpoolManager/releases/latest/download/main.zip", "author": "dojohnso, Olli", "homepage": "https://github.com/dojohnso/OctoPrint-SpoolManager", "page": "https://plugins.octoprint.org/plugins/SpoolManager/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SpoolManager/editSpool-dialog.png", "abandoned": false, "github": {"latest_release": {"name": "V1.7.3", "date": "2023-12-10 19:46:21 +0000", "tag": "1.7.3"}, "releases": 4, "last_push": "2024-02-08 15:07:10 +0000", "stars": 17, "issues": {"open": 4, "closed": 24}}, "stats": {"instances_month": 3835, "install_events_month": 360, "instances_week": 2759, "install_events_week": 91}}, {"id": "ender3v2tempfix", "published": "2020-09-07 00:00:00 +0000", "title": "Creality 2x temperature reporting fix", "description": "Fixes the temperature reporting from Creality printers shipped with the new mainboard (new Ender-3 Pro's, Ender-3 Pro v2, CR-6 SE & possibly more)", "archive": "https://github.com/SimplyPrint/OctoPrint-Creality2xTemperatureReportingFix/archive/master.zip", "author": "Albert MN. @ SimplyPrint, b-morgan", "homepage": "https://github.com/SimplyPrint/OctoPrint-Creality2xTemperatureReportingFix", "page": "https://plugins.octoprint.org/plugins/ender3v2tempfix/", "compatibility": {"octoprint": [], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "0.0.4", "date": "2020-09-23 11:41:29 +0000", "tag": "0.0.4"}, "releases": 3, "last_push": "2021-04-26 18:52:11 +0000", "stars": 27, "issues": {"open": 2, "closed": 15}}, "stats": {"instances_month": 12231, "install_events_month": 889, "instances_week": 8959, "install_events_week": 204}}, {"id": "backupscheduler", "published": "2020-09-19 00:00:00 +0000", "title": "Backup Scheduler", "description": "Schedule OctoPrint backups at regular intervals.", "archive": "https://github.com/jneilliii/OctoPrint-BackupScheduler/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BackupScheduler", "page": "https://plugins.octoprint.org/plugins/backupscheduler/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/backupscheduler/screenshot_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2021-07-31 06:30:14 +0000", "tag": "0.1.0"}, "releases": 11, "last_push": "2024-01-14 15:58:41 +0000", "stars": 11, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 1534, "install_events_month": 95, "instances_week": 1184, "install_events_week": 12}}, {"id": "googledrivebackup", "published": "2020-09-21 00:00:00 +0000", "title": "Google Drive Backup", "description": "This plugin will automatically save a copy of your OctoPrint backup to Google Drive upon completion.", "archive": "https://github.com/jneilliii/OctoPrint-GoogleDriveBackup/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-GoogleDriveBackup", "page": "https://plugins.octoprint.org/plugins/googledrivebackup/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/googledrivebackup/configuration_step7.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2024-01-21 18:08:08 +0000", "tag": "0.1.3"}, "releases": 10, "last_push": "2024-01-21 18:06:45 +0000", "stars": 29, "issues": {"open": 1, "closed": 42}}, "stats": {"instances_month": 978, "install_events_month": 88, "instances_week": 701, "install_events_week": 20}}, {"id": "terminalmessaging", "published": "2020-09-22 00:00:00 +0000", "title": "Terminal Messaging", "description": "Adds styling to the terminal tab that makes it easier to see where a message is from.", "archive": "https://github.com/jeffeb3/OctoPrint-TerminalMessaging/archive/master.zip", "author": "jeffeb3", "homepage": "https://github.com/jeffeb3/OctoPrint-TerminalMessaging", "page": "https://plugins.octoprint.org/plugins/terminalmessaging/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalmessaging/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.0", "date": "2020-10-27 17:53:09 +0000", "tag": "0.1.0"}, "releases": 4, "last_push": "2020-10-27 17:50:18 +0000", "stars": 7, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 375, "install_events_month": 24, "instances_week": 297, "install_events_week": 5}}, {"id": "marlingcodedocumentation", "published": "2020-09-27 00:00:00 +0000", "title": "MarlinGcodeDocumentation", "description": "Provides documentation for Marlin, RepRap, and Klipper, GCode commands in the Terminal tab", "archive": "https://github.com/costas-basdekis/MarlinGcodeDocumentation/archive/master.zip", "author": "Costas Basdekis", "homepage": "https://github.com/costas-basdekis/MarlinGcodeDocumentation", "page": "https://plugins.octoprint.org/plugins/marlingcodedocumentation/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/marlingcodedocumentation/screenshot-example-command.png", "abandoned": false, "github": {"latest_release": {"name": "Release v0.18.0", "date": "2022-05-20 22:39:41 +0000", "tag": "v0.18.0"}, "releases": 12, "last_push": "2022-05-20 13:51:46 +0000", "stars": 18, "issues": {"open": 3, "closed": 17}}, "stats": {"instances_month": 1713, "install_events_month": 134, "instances_week": 1217, "install_events_week": 24}}, {"id": "MakerOS", "published": "2020-10-05 00:00:00 +0000", "title": "MakerOS", "description": "An OctoPrint plugin integration with the MakerOS Platform API.", "archive": "https://github.com/makeros3d/Octoprint-Makeros/archive/master.zip", "author": "Thomas Lawton", "homepage": "https://github.com/makeros3d/Octoprint-Makeros", "page": "https://plugins.octoprint.org/plugins/MakerOS/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MakerOS/Octoprint-Makeros-projects.png", "abandoned": false, "github": {"last_push": "2020-11-23 15:28:16 +0000", "stars": 1, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 10, "install_events_month": 5, "instances_week": 8, "install_events_week": 1}}, {"id": "wifistatus", "published": "2020-10-08 00:00:00 +0000", "title": "WiFi Status", "description": "Displays the WiFi connection status on the OctoPrint navigation bar.", "archive": "https://github.com/ManuelMcLure/OctoPrint-WiFiStatus/archive/main.zip", "author": "Manuel McLure", "homepage": "https://github.com/ManuelMcLure/OctoPrint-WiFiStatus", "page": "https://plugins.octoprint.org/plugins/wifistatus/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wifistatus/WiFiStatus.png", "abandoned": false, "github": {"latest_release": {"name": "Fix netmask fetching in OctoPrint 1.10+", "date": "2024-04-24 19:07:59 +0000", "tag": "v1.9.0"}, "releases": 19, "last_push": "2024-04-24 19:04:25 +0000", "stars": 12, "issues": {"open": 0, "closed": 20}}, "stats": {"instances_month": 3161, "install_events_month": 320, "instances_week": 2082, "install_events_week": 62}}, {"id": "raisecloud", "published": "2020-10-10 00:00:00 +0000", "title": "RaiseCloud", "description": "Manage your OctoPi powered 3D printer through our powerful cloud management platform, RaiseCloud (web or app).", "archive": "https://github.com/Raise3D/Octoprint-Raisecloud/archive/master.zip", "author": "Raise3D", "homepage": "https://github.com/Raise3D/Octoprint-Raisecloud", "privacypolicy": "https://www.raise3d.com/legal/privacy-policy/", "page": "https://plugins.octoprint.org/plugins/raisecloud/", "compatibility": {"octoprint": ["1.3.12"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/raisecloud/Raise3D.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2020-08-21 02:36:10 +0000", "tag": "1.1.0"}, "releases": 3, "last_push": "2023-08-17 07:52:43 +0000", "stars": 7, "issues": {"open": 4, "closed": 5}}, "stats": {"instances_month": 364, "install_events_month": 28, "instances_week": 241, "install_events_week": 5}}, {"id": "smartfilamentsensor", "published": "2020-10-16 00:00:00 +0000", "title": "Octoprint-Smart-Filament-Sensor", "description": "A plugin to directly add Smart Filament Sensors like BigTreeTech Smart Filament Sensor to Octoprint.", "archive": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor/archive/master.zip", "author": "Royrdan, Anni Lange", "homepage": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor", "page": "https://plugins.octoprint.org/plugins/smartfilamentsensor/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "GPLv3", "abandoned": false, "github": {"latest_release": {"name": "GPIO interupt fix, Resume fix, GPIO cleanup fix", "date": "2022-06-29 07:41:10 +0000", "tag": "1.2"}, "releases": 7, "last_push": "2022-07-08 09:04:09 +0000", "stars": 7, "issues": {"open": 21, "closed": 8}}, "stats": {"instances_month": 490, "install_events_month": 42, "instances_week": 345, "install_events_week": 10}}, {"id": "arc_welder", "published": "2020-10-24 00:00:00 +0000", "title": "Arc Welder", "description": "Anti-Stutter and GCode Compression. Replaces G0/G1 with G2/G3 where possible.", "archive": "https://github.com/FormerLurker/ArcWelderPlugin/archive/master.zip", "author": "Brad Hochgesang", "homepage": "https://github.com/FormerLurker/ArcWelderPlugin", "page": "https://plugins.octoprint.org/plugins/arc_welder/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPL-3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/arc_welder/tab_full.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-10-24 22:19:14 +0000", "tag": "1.0.0"}, "releases": 11, "last_push": "2020-10-25 21:25:50 +0000", "stars": 438, "issues": {"open": 100, "closed": 129}}, "stats": {"instances_month": 6768, "install_events_month": 570, "instances_week": 4761, "install_events_week": 121}}, {"id": "octoeverywhere", "published": "2020-11-07 00:00:00 +0000", "title": "OctoEverywhere - Free Remote Access, AI Failure Detection, And More!", "description": "Free, simple, and secure remote monitoring and control of your OctoPrint printer anywhere in the world. OctoEverywhere gives you unlimited OctoPrint access on any web browser and can empower your favorite OctoPrint Android and iOS apps to work everywhere. Meet Gadget, your new free and unlimited AI-powered print failure detection assistant! Gadget continuously watches your prints for errors, so you don't have to!", "archive": "https://github.com/QuinnDamerell/OctoPrint-OctoEverywhere/archive/master.zip", "author": "Quinn Damerell", "homepage": "https://OctoEverywhere.com/", "page": "https://plugins.octoprint.org/plugins/octoeverywhere/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoeverywhere/homepage.png", "abandoned": false, "github": {"latest_release": {"name": "\ud83c\udf89 Bambu Labs Is Here! Also RTSP Webcam Streaming, Default Camera, And More", "date": "2024-05-03 05:44:41 +0000", "tag": "3.3.3"}, "releases": 55, "last_push": "2024-05-04 04:41:54 +0000", "stars": 126, "issues": {"open": 4, "closed": 50}}, "stats": {"instances_month": 51552, "install_events_month": 3039, "instances_week": 47483, "install_events_week": 724}}, {"id": "lightsout", "published": "2020-11-08 00:00:00 +0000", "title": "OctoPrint-LightsOut", "description": "Automatically shuts off lights after some delay when printing completes", "archive": "https://github.com/Peaches491/OctoPrint-LightsOut/archive/master.zip", "author": "Daniel Miller", "homepage": "https://github.com/Peaches491/OctoPrint-LightsOut", "page": "https://plugins.octoprint.org/plugins/lightsout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/lightsout/settings_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "*Actually* Ignore M150 while printing", "date": "2020-11-09 23:10:54 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2020-11-09 23:06:00 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 84, "install_events_month": 5, "instances_week": 62, "install_events_week": 0}}, {"id": "autologin_config", "published": "2020-11-15 00:00:00 +0000", "title": "OctoPrint-AutoLoginConfig", "description": "Configure AutoLoginLocal from the UI with ease.", "archive": "https://github.com/OctoPrint/OctoPrint-AutoLoginConfig/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/OctoPrint/OctoPrint-AutoLoginConfig", "page": "https://plugins.octoprint.org/plugins/autologin_config/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autologin_config/config.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 Stable Release", "date": "2023-03-19 21:47:12 +0000", "tag": "0.2.1"}, "releases": 10, "last_push": "2023-03-19 21:41:07 +0000", "stars": 2, "issues": {"open": 2, "closed": 5}}, "stats": {"instances_month": 519, "install_events_month": 44, "instances_week": 374, "install_events_week": 11}}, {"id": "gcodeleveling", "published": "2020-11-29 00:00:00 +0000", "title": "OctoPrint-GcodeLeveling", "description": "Leveling of Z values in Gcode using manually measured positions", "archive": "https://github.com/willmac16/OctoPrint-GcodeLeveling/archive/master.zip", "author": "Will MacCormack", "homepage": "https://github.com/willmac16/OctoPrint-GcodeLeveling", "page": "https://plugins.octoprint.org/plugins/gcodeleveling/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodeleveling/point-entry.png", "abandoned": false, "github": {"latest_release": {"name": "Auto-Probing", "date": "2021-03-16 05:20:06 +0000", "tag": "0.4.0"}, "releases": 8, "last_push": "2021-03-16 05:13:57 +0000", "stars": 5, "issues": {"open": 0, "closed": 10}}, "stats": {"instances_month": 89, "install_events_month": 11, "instances_week": 58, "install_events_week": 4}}, {"id": "uicustomizer", "published": "2020-11-30 00:00:00 +0000", "title": "UI Customizer", "description": "Customize Octoprint with 5+ awesome themes, webcam and gcode widgets, rearrange layout and support mobile/tablets and much more...", "archive": "https://github.com/LazeMSS/OctoPrint-UICustomizer/archive/main.zip", "author": "Mikkel Skovgaard", "homepage": "https://github.com/LazeMSS/OctoPrint-UICustomizer", "page": "https://plugins.octoprint.org/plugins/uicustomizer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/uicustomizer/responsive.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.9.91 - prepare for OP 1.10.0", "date": "2024-02-12 15:35:26 +0000", "tag": "0.1.9.91"}, "releases": 59, "last_push": "2024-02-12 15:33:56 +0000", "stars": 166, "issues": {"open": 16, "closed": 253}}, "stats": {"instances_month": 13136, "install_events_month": 1196, "instances_week": 9192, "install_events_week": 251}}, {"id": "customcss", "published": "2020-12-10 00:00:00 +0000", "title": "OctoPrint-CustomCSS", "description": "Quickly add custom CSS to modify your OctoPrint UI.", "archive": "https://github.com/crankeye/OctoPrint-CustomCSS/archive/master.zip", "author": "Neal Lambert", "homepage": "https://github.com/crankeye/OctoPrint-CustomCSS", "page": "https://plugins.octoprint.org/plugins/customcss/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-12-10 09:07:48 +0000", "stars": 4, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 112, "install_events_month": 2, "instances_week": 90, "install_events_week": 0}}, {"id": "display_panel", "published": "2020-12-16 00:00:00 +0000", "title": "OctoPrint Micro Panel", "description": "Simple control and status paired with a physical button panel and OLED display", "archive": "https://github.com/sethvoltz/OctoPrint-DisplayPanel/archive/main.zip", "author": "Seth Voltz", "homepage": "https://github.com/sethvoltz/OctoPrint-DisplayPanel", "page": "https://plugins.octoprint.org/plugins/display_panel/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/display_panel/in-situ.jpeg", "abandoned": false, "github": {"latest_release": {"name": "Version 3.0.1", "date": "2021-04-12 05:04:28 +0000", "tag": "v3.0.1"}, "releases": 10, "last_push": "2022-01-25 05:22:42 +0000", "stars": 56, "issues": {"open": 0, "closed": 39}}, "stats": {"instances_month": 64, "install_events_month": 9, "instances_week": 39, "install_events_week": 1}}, {"id": "octoprint_nanny", "published": "2020-12-25 00:00:00 +0000", "title": "OctoPrint Nanny", "description": "Get notified of print defects and safety hazards", "archive": "https://github.com/bitsy-ai/octoprint-nanny-plugin/archive/main.zip", "author": "Leigh Johnson", "homepage": "https://print-nanny.com", "page": "https://plugins.octoprint.org/plugins/octoprint_nanny/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "GNU AFFERO GENERAL PUBLIC LICENSE", "image": "https://plugins.octoprint.org/assets/img/plugins/octoprint_nanny/screenshot_2.png", "abandoned": false, "github": {"latest_release": {"name": "0.15.15", "date": "2023-03-08 14:16:28 +0000", "tag": "0.15.15"}, "releases": 117, "last_push": "2023-03-29 18:54:59 +0000", "stars": 24, "issues": {"open": 0, "closed": 81}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 5, "install_events_week": 0}}, {"id": "LongPathSDList", "published": "2021-01-03 00:00:00 +0000", "title": "OctoPrint-Longpathsdlist", "description": "Could block serial communication - read more at the plugin homepage! This is a simple plugin to show long path names in the SD List.", "archive": "https://github.com/Petttkous/OctoPrint-Longpathsdlist/archive/master.zip", "author": "Petttkous", "homepage": "https://github.com/Petttkous/OctoPrint-Longpathsdlist", "page": "https://plugins.octoprint.org/plugins/LongPathSDList/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/LongPathSDList/after.png", "abandoned": false, "github": {"last_push": "2023-04-20 23:27:13 +0000", "stars": 3, "issues": {"open": 4, "closed": 3}}, "stats": {"instances_month": 240, "install_events_month": 13, "instances_week": 179, "install_events_week": 3}}, {"id": "TimeToFilament", "published": "2021-01-14 00:00:00 +0000", "title": "OctoPrint-TimeToFilament", "description": "Display time until next filament change", "archive": "https://github.com/eyal0/OctoPrint-TimeToFilament/archive/master.zip", "author": "eyal0", "homepage": "https://github.com/eyal0/OctoPrint-TimeToFilament", "page": "https://plugins.octoprint.org/plugins/TimeToFilament/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TimeToFilament/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Auto-install PrintTimeGenius", "date": "2021-01-19 19:20:39 +0000", "tag": "1.2.1"}, "releases": 7, "last_push": "2023-03-31 17:19:39 +0000", "stars": 4, "issues": {"open": 18, "closed": 20}}, "stats": {"instances_month": 546, "install_events_month": 31, "instances_week": 424, "install_events_week": 6}}, {"id": "webdavbackup", "published": "2021-01-16 00:00:00 +0000", "title": "WebDAV Backup", "description": "This plugin will automatically save a copy of your OctoPrint backup to a WebDAV server upon completion.", "archive": "https://github.com/edekeijzer/OctoPrint-WebDavBackup/archive/main.zip", "author": "edekeijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-WebDavBackup", "page": "https://plugins.octoprint.org/plugins/webdavbackup/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/webdavbackup/configuration_screen.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.1", "date": "2021-04-07 17:28:35 +0000", "tag": "0.5.1"}, "releases": 8, "last_push": "2023-10-04 09:55:05 +0000", "stars": 7, "issues": {"open": 0, "closed": 25}}, "stats": {"instances_month": 140, "install_events_month": 10, "instances_week": 104, "install_events_week": 2}}, {"id": "OctoBuddy", "published": "2021-01-17 00:00:00 +0000", "title": "OctoBuddy", "description": "A plugin that allows common printer actions to be performed with physical buttons via GPIO", "archive": "https://github.com/mlo821/OctoBuddy/archive/master.zip", "author": "Mark Lorenz", "homepage": "https://github.com/mlo821/OctoBuddy", "page": "https://plugins.octoprint.org/plugins/OctoBuddy/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoBuddy/ShelfMount1.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.5 Release", "date": "2021-01-19 01:06:03 +0000", "tag": "1.0.5"}, "releases": 5, "last_push": "2021-01-19 01:04:52 +0000", "stars": 17, "issues": {"open": 11, "closed": 2}}, "stats": {"instances_month": 51, "install_events_month": 3, "instances_week": 40, "install_events_week": 0}}, {"id": "octolight", "published": "2021-01-18 00:00:00 +0000", "title": "OctoLight", "description": "A simple plugin to toggle a GPIO pin on a RPi. This can be toggled through a button, printer events or custom GCODE.", "archive": "https://github.com/thomst08/OctoLight/archive/master.zip", "author": "Steven Thomson, \u017diga Kralj", "homepage": "https://github.com/thomst08/OctoLight", "page": "https://plugins.octoprint.org/plugins/octolight/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octolight/screenshoot.png", "abandoned": false, "github": {"latest_release": {"name": "OctoLight v0.2.3", "date": "2024-04-07 03:45:56 +0000", "tag": "v0.2.3"}, "releases": 9, "last_push": "2024-04-07 03:42:22 +0000", "stars": 6, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 510, "install_events_month": 56, "instances_week": 355, "install_events_week": 13}}, {"id": "usb_keyboard", "published": "2021-01-20 00:00:00 +0000", "title": "USB Keyboard", "description": "Use a USB Keyboard to control your printer and Octoprint!", "archive": "https://github.com/barrettford/Octoprint-Usb_keyboard/archive/master.zip", "author": "Barrett Ford", "homepage": "https://github.com/barrettford/Octoprint-Usb_keyboard", "page": "https://plugins.octoprint.org/plugins/usb_keyboard/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "GPL-3.0 License", "image": "https://plugins.octoprint.org/assets/img/plugins/usb_keyboard/example_qwerty.png", "abandoned": false, "github": {"latest_release": {"name": "Added shutdown/restart commands", "date": "2021-04-08 22:43:46 +0000", "tag": "v0.2.6"}, "releases": 11, "last_push": "2023-03-29 16:51:58 +0000", "stars": 18, "issues": {"open": 7, "closed": 24}}, "stats": {"instances_month": 147, "install_events_month": 12, "instances_week": 108, "install_events_week": 3}}, {"id": "toptemp", "published": "2021-01-24 00:00:00 +0000", "title": "Top Temp", "description": "Show the temperatures of everything in the navbar/topbar of OctoPrint. It can display the hotend, chamber, all tools/hotends and also add an unlimited number of your own \u201ctop widgets\u201d for example showing cpu temperature, fan speed - well anything that is a number (for now) that you can get back from running a command.", "archive": "https://github.com/LazeMSS/OctoPrint-TopTemp/archive/main.zip", "author": "Mikkel Skovgaard", "homepage": "https://github.com/LazeMSS/OctoPrint-TopTemp", "page": "https://plugins.octoprint.org/plugins/toptemp/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/toptemp/main.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2.3 - More custom cmd fixing", "date": "2023-01-15 21:02:14 +0000", "tag": "0.0.2.3"}, "releases": 18, "last_push": "2023-01-15 20:59:14 +0000", "stars": 22, "issues": {"open": 10, "closed": 72}}, "stats": {"instances_month": 1811, "install_events_month": 116, "instances_week": 1286, "install_events_week": 25}}, {"id": "meatpack", "published": "2021-01-26 00:00:00 +0000", "title": "MeatPack", "description": "Automatic G-Code Compression", "archive": "https://github.com/scottmudge/OctoPrint-MeatPack/archive/master.zip", "author": "Scott Mudge", "homepage": "https://github.com/scottmudge/OctoPrint-MeatPack", "page": "https://plugins.octoprint.org/plugins/meatpack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/meatpack/meatpack.png", "abandoned": false, "github": {"latest_release": {"name": "Version 1.5.22 - License Update", "date": "2023-08-14 06:32:47 +0000", "tag": "v1.5.22"}, "releases": 10, "last_push": "2023-08-14 06:29:24 +0000", "stars": 120, "issues": {"open": 17, "closed": 12}}, "stats": {"instances_month": 272, "install_events_month": 25, "instances_week": 188, "install_events_week": 6}}, {"id": "SimplyPrint", "published": "2021-02-02 00:00:00 +0000", "title": "SimplyPrint Cloud", "description": "3D print online anywhere; elevate your 3D printing experience from your computer or phone, with smart features like filament manager, livestream, print queue, and much more. Simple, beautiful, smart.", "archive": "https://github.com/SimplyPrint/OctoPrint-SimplyPrint/archive/master.zip", "author": "SimplyPrint", "homepage": "https://simplyprint.io/", "privacypolicy": "https://simplyprint.io/legal/en/privacy", "page": "https://plugins.octoprint.org/plugins/SimplyPrint/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "GNU General Public License v3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/SimplyPrint/showcase_feature_image.png", "abandoned": false, "github": {"latest_release": {"name": "4.1.3", "date": "2023-11-12 19:36:25 +0000", "tag": "4.1.3"}, "releases": 38, "last_push": "2023-11-12 15:37:44 +0000", "stars": 11, "issues": {"open": 5, "closed": 16}}, "stats": {"instances_month": 1269, "install_events_month": 147, "instances_week": 816, "install_events_week": 24}}, {"id": "robotcontrol", "published": "2021-02-11 00:00:00 +0000", "title": "Robot Control", "description": "Plugin to control a robot over i2c", "archive": "https://github.com/Zinc-OS/octoprint-robot-plugin/archive/master.zip", "author": "Louis Sarwal", "homepage": "https://github.com/Zinc-OS/octoprint-robot-plugin", "page": "https://plugins.octoprint.org/plugins/robotcontrol/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/robotcontrol/Screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2", "date": "2021-02-12 22:49:34 +0000", "tag": "0.0.2"}, "releases": 2, "last_push": "2021-02-13 23:03:42 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 11, "install_events_month": 2, "instances_week": 9, "install_events_week": 1}}, {"id": "inlineconfirm", "published": "2021-02-14 00:00:00 +0000", "title": "OctoPrint-InlineConfirm", "description": "Removes the confirm cancel print dialog and replaces it with confirmation by clicking the cancel buton twice.", "archive": "https://github.com/j7126/OctoPrint-InlineConfirm/archive/master.zip", "author": "j7126", "homepage": "https://github.com/j7126/OctoPrint-InlineConfirm", "page": "https://plugins.octoprint.org/plugins/inlineconfirm/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/inlineconfirm/cancel_print_button.gif", "abandoned": false, "github": {"latest_release": {"name": "1.1.4", "date": "2021-08-25 04:18:32 +0000", "tag": "1.1.4"}, "releases": 6, "last_push": "2021-08-25 04:17:02 +0000", "stars": 3, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 224, "install_events_month": 5, "instances_week": 167, "install_events_week": 0}}, {"id": "gpiocontrol", "published": "2021-02-16 00:00:00 +0000", "title": "GPIO Control", "description": "GPIO Control adds a sidebar with on/off buttons. You can add as many buttons as you want that will control each device connected to your Raspberry Pi.", "archive": "https://github.com/catgiggle/OctoPrint-GpioControl/archive/master.zip", "author": "Damian W\u00f3jcik", "homepage": "https://github.com/catgiggle/OctoPrint-GpioControl", "page": "https://plugins.octoprint.org/plugins/gpiocontrol/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiocontrol/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.8", "date": "2021-02-23 20:25:44 +0000", "tag": "v1.0.8"}, "releases": 9, "last_push": "2021-02-23 20:22:23 +0000", "stars": 22, "issues": {"open": 16, "closed": 11}}, "stats": {"instances_month": 1225, "install_events_month": 87, "instances_week": 860, "install_events_week": 21}}, {"id": "TpLinkAutoShutdown", "published": "2021-02-17 00:00:00 +0000", "title": "OctoPrint-TpLinkAutoShutdown", "description": "This plugin is designed to help you integrate your IoT TP-Link Kasa wireless plug into OctoPrint. The basis of the plug-in is to enable you to automatically switch-off your 3D printer once a print has successfully completed.", "archive": "https://github.com/jamesmccannon02/OctoPrint-Tplinkautoshutdown/archive/master.zip", "author": "James D. McCannon", "homepage": "https://github.com/jamesmccannon02/OctoPrint-Tplinkautoshutdown", "page": "https://plugins.octoprint.org/plugins/TpLinkAutoShutdown/", "compatibility": {"octoprint": ["1.5.3"], "os": ["linux", "windows", "macos"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.3.0 - HS300 specific features", "date": "2021-09-19 21:59:38 +0000", "tag": "1.3.0"}, "releases": 18, "last_push": "2023-04-23 13:38:40 +0000", "stars": 8, "issues": {"open": 9, "closed": 25}}, "stats": {"instances_month": 480, "install_events_month": 42, "instances_week": 325, "install_events_week": 8}}, {"id": "SlicerEstimator", "published": "2021-02-24 00:00:00 +0000", "title": "Slicer Estimator", "description": "Slicer Estimator - adds accurate remaining time to print, remaining time to filament changes and other custom metadata like filament brand, etc. to OctoPrint", "archive": "https://github.com/NilsRo/OctoPrint-SlicerEstimator/archive/master.zip", "author": "Nils Hendrik Rottgardt", "homepage": "https://github.com/NilsRo/OctoPrint-SlicerEstimator", "page": "https://plugins.octoprint.org/plugins/SlicerEstimator/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Bugfix: Reupload a downloaded file breaks metadata parsing", "date": "2024-05-02 20:25:04 +0000", "tag": "1.6.6"}, "releases": 43, "last_push": "2024-05-02 20:22:40 +0000", "stars": 5, "issues": {"open": 0, "closed": 34}}, "stats": {"instances_month": 1110, "install_events_month": 98, "instances_week": 770, "install_events_week": 26}}, {"id": "ublmeshedit", "published": "2021-02-24 00:00:00 +0000", "title": "OctoPrint-UBLMeshEdit", "description": "A plugin that provides a method for manually editing and saving/loading UBL meshes.", "archive": "https://github.com/The-EG/OctoPrint-UBLMeshEdit/archive/main.zip", "author": "Taylor Talkington", "homepage": "https://github.com/The-EG/OctoPrint-UBLMeshEdit", "page": "https://plugins.octoprint.org/plugins/ublmeshedit/", "compatibility": {"octoprint": ["1.3.7"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ublmeshedit/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2021-05-19 16:13:38 +0000", "tag": "0.3.2"}, "releases": 11, "last_push": "2021-05-19 16:12:29 +0000", "stars": 16, "issues": {"open": 2, "closed": 11}}, "stats": {"instances_month": 426, "install_events_month": 35, "instances_week": 310, "install_events_week": 5}}, {"id": "ignorepausedforuser", "published": "2021-02-25 00:00:00 +0000", "title": "IgnorePausedForUser", "description": "Plugin to ignore 'Paused for User' message from printer.", "archive": "https://github.com/DavideM84/OctoPrint-IgnorePausedForUser/archive/main.zip", "author": "Davide Mencarelli", "homepage": "https://github.com/DavideM84/OctoPrint-IgnorePausedForUser", "page": "https://plugins.octoprint.org/plugins/ignorepausedforuser/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "GNU v3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/ignorepausedforuser/ignorepausedforuser.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.2.8", "date": "2021-03-17 10:49:09 +0000", "tag": "v1.2.8"}, "releases": 6, "last_push": "2021-03-17 10:45:30 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 54, "install_events_month": 4, "instances_week": 44, "install_events_week": 0}}, {"id": "translatemodel", "published": "2021-03-01 00:00:00 +0000", "title": "OctoPrint-TranslateModel", "description": "A plugin to move models around without re-slicing.", "archive": "https://github.com/Willmac16/OctoPrint-TranslateModel/archive/main.zip", "author": "Will MacCormack", "homepage": "https://github.com/Willmac16/OctoPrint-TranslateModel", "page": "https://plugins.octoprint.org/plugins/translatemodel/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/translatemodel/viewerGraphic.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.0 Added support for Prusa M555 Command", "date": "2023-09-29 02:55:46 +0000", "tag": "0.3.0"}, "releases": 8, "last_push": "2023-09-29 02:53:53 +0000", "stars": 7, "issues": {"open": 2, "closed": 13}}, "stats": {"instances_month": 260, "install_events_month": 12, "instances_week": 187, "install_events_week": 4}}, {"id": "youtube_timelapse", "published": "2021-03-09 00:00:00 +0000", "title": "Octoprint Youtube Timelapse", "description": "Automatically upload rendered timelapses to Youtube. Can also delete after upload to save space on the Raspberry Pi SD Card.", "archive": "https://github.com/ryanfox1985/OctoPrint-Youtube-Timelapse/archive/master.zip", "author": "ryanfox1985", "homepage": "https://github.com/ryanfox1985/OctoPrint-Youtube-Timelapse", "page": "https://plugins.octoprint.org/plugins/youtube_timelapse/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/youtube_timelapse/configuration_step7.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2021-03-10 17:25:26 +0000", "tag": "0.1.8"}, "releases": 3, "last_push": "2021-08-01 09:26:49 +0000", "stars": 14, "issues": {"open": 22, "closed": 5}}, "stats": {"instances_month": 161, "install_events_month": 24, "instances_week": 109, "install_events_week": 6}}, {"id": "octorelay", "published": "2021-03-13 00:00:00 +0000", "title": "OctoRelay", "description": "A plugin to control relays or other things on the GPIO pins of your raspberry pi. For example turn the power of printer, the light or a fan ON and OFF via the web interface.", "archive": "https://github.com/borisbu/OctoRelay/releases/latest/download/release.zip", "author": "Boris Burgstaller", "homepage": "https://github.com/borisbu/OctoRelay", "page": "https://plugins.octoprint.org/plugins/octorelay/", "compatibility": {"octoprint": ["1.5.3"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octorelay/controls.jpg", "abandoned": false, "github": {"latest_release": {"name": "4.2.0", "date": "2024-04-24 16:06:14 +0000", "tag": "4.2.0"}, "releases": 117, "last_push": "2024-04-29 20:36:08 +0000", "stars": 42, "issues": {"open": 8, "closed": 86}}, "stats": {"instances_month": 1253, "install_events_month": 94, "instances_week": 901, "install_events_week": 23}}, {"id": "octolabel", "published": "2021-03-21 00:00:00 +0000", "title": "OctoPrint-OctoLabel", "description": "Label printing plugin for OctoPrint", "archive": "https://github.com/LowieGoossens/octolabel/archive/master.zip", "author": "Lowie Goossens", "homepage": "https://github.com/LowieGoossens/octolabel", "page": "https://plugins.octoprint.org/plugins/octolabel/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "latest bug free version", "date": "2021-03-21 19:33:40 +0000", "tag": "master_previous"}, "releases": 3, "last_push": "2023-01-30 12:12:57 +0000", "stars": 6, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 20, "install_events_month": 0, "instances_week": 17, "install_events_week": 0}}, {"id": "OctoText", "published": "2021-03-30 00:00:00 +0000", "title": "OctoText", "description": "Send text messages on common printer events", "archive": "https://github.com/berrystephenw/OctoText/archive/refs/heads/main.zip", "author": "Stephen Berry", "homepage": "https://github.com/berrystephenw/OctoText", "page": "https://plugins.octoprint.org/plugins/OctoText/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoText/octotext-email.png", "abandoned": false, "github": {"latest_release": {"name": "Bug fix in CC field", "date": "2022-05-11 17:46:12 +0000", "tag": "0.3.3.1"}, "releases": 28, "last_push": "2022-05-11 17:03:00 +0000", "stars": 11, "issues": {"open": 10, "closed": 35}}, "stats": {"instances_month": 579, "install_events_month": 44, "instances_week": 441, "install_events_week": 10}}, {"id": "energeniecontrol", "published": "2021-04-05 00:00:00 +0000", "title": "OctoPrint-EnergenieControl", "description": "Controls Energenie sockets to turn printer on and off.", "archive": "https://github.com/arlohb/OctoPrint-EnergenieControl/archive/main.zip", "author": "Arlo Blythe", "homepage": "https://github.com/arlohb/OctoPrint-EnergenieControl", "page": "https://plugins.octoprint.org/plugins/energeniecontrol/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2022-02-19 18:20:42 +0000", "tag": "v1.0.2"}, "releases": 3, "last_push": "2022-02-19 18:19:05 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 15, "install_events_month": 4, "instances_week": 11, "install_events_week": 1}}, {"id": "psucontrol_rpigpio", "published": "2021-04-05 00:00:00 +0000", "title": "PSU Control - RPi.GPIO", "description": "Adds legacy RPi.GPIO to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-RPiGPIO/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-RPiGPIO", "page": "https://plugins.octoprint.org/plugins/psucontrol_rpigpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2021-05-12 13:57:49 +0000", "tag": "1.0.4"}, "releases": 5, "last_push": "2021-05-12 13:56:05 +0000", "stars": 7, "issues": {"open": 1, "closed": 14}}, "stats": {"instances_month": 697, "install_events_month": 55, "instances_week": 476, "install_events_week": 13}}, {"id": "wled", "published": "2021-04-16 00:00:00 +0000", "title": "WLED Connection", "description": "WLED is an awesome project, as is OctoPrint. What could be better than a plugin linking the two?", "archive": "https://github.com/cp2004/OctoPrint-WLED/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-WLED", "page": "https://plugins.octoprint.org/plugins/wled/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wled/wled-octoprint.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 (Stable Release)", "date": "2021-06-12 12:22:40 +0000", "tag": "0.2.1"}, "releases": 6, "last_push": "2023-12-27 13:00:32 +0000", "stars": 60, "issues": {"open": 22, "closed": 19}}, "stats": {"instances_month": 445, "install_events_month": 38, "instances_week": 308, "install_events_week": 5}}, {"id": "networkhealth", "published": "2021-04-20 00:00:00 +0000", "title": "Network Health", "description": "Monitors the health of the Network connection and restarts it if necessary", "archive": "https://github.com/jonfairbanks/OctoPrint-NetworkHealth/archive/master.zip", "author": "Jon Fairbanks", "homepage": "https://github.com/jonfairbanks/OctoPrint-NetworkHealth", "page": "https://plugins.octoprint.org/plugins/networkhealth/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/networkhealth/logo.png", "abandoned": false, "github": {"latest_release": {"name": "Error Handling", "date": "2021-05-11 00:11:38 +0000", "tag": "v1.0.4"}, "releases": 5, "last_push": "2023-05-14 06:34:18 +0000", "stars": 7, "issues": {"open": 2, "closed": 5}}, "stats": {"instances_month": 528, "install_events_month": 39, "instances_week": 403, "install_events_week": 6}}, {"id": "psucontrol_tplink", "published": "2021-04-28 00:00:00 +0000", "title": "PSU Control - TPLink", "description": "Adds TPLink Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-TPLink/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-TPLink", "page": "https://plugins.octoprint.org/plugins/psucontrol_tplink/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2021-05-12 14:00:05 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-12 13:58:37 +0000", "stars": 5, "issues": {"open": 4, "closed": 3}}, "stats": {"instances_month": 440, "install_events_month": 45, "instances_week": 322, "install_events_week": 7}}, {"id": "camerasettings", "published": "2021-04-29 00:00:00 +0000", "title": "Camera Settings", "description": "Interactive camera settings via v4l2-ctl", "archive": "https://github.com/The-EG/OctoPrint-CameraSettings/archive/main.zip", "author": "Taylor Talkington", "homepage": "https://github.com/The-EG/OctoPrint-CameraSettings", "page": "https://plugins.octoprint.org/plugins/camerasettings/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/camerasettings/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.3", "date": "2023-07-02 14:05:53 +0000", "tag": "0.4.3"}, "releases": 31, "last_push": "2023-07-02 14:57:27 +0000", "stars": 55, "issues": {"open": 15, "closed": 196}}, "stats": {"instances_month": 9056, "install_events_month": 911, "instances_week": 6251, "install_events_week": 220}}, {"id": "filament_scale", "published": "2021-04-29 00:00:00 +0000", "title": "Filament Scale Enhanced", "description": "Display filament weight using a HX-711 and a load cell", "archive": "https://github.com/techman83/Filament-Scale-Enhanced/releases/latest/download/Filament_Scale_Enhanced.zip", "author": "Victor Noordhoek, Techman83", "homepage": "https://github.com/techman83/Filament-Scale-Enhanced", "page": "https://plugins.octoprint.org/plugins/filament_scale/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filament_scale/display.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.12", "date": "2023-08-12 12:47:11 +0000", "tag": "v0.2.12"}, "releases": 12, "last_push": "2023-08-12 12:29:50 +0000", "stars": 23, "issues": {"open": 17, "closed": 10}}, "stats": {"instances_month": 108, "install_events_month": 9, "instances_week": 80, "install_events_week": 3}}, {"id": "psucontrol_tasmota", "published": "2021-05-02 00:00:00 +0000", "title": "PSU Control - Tasmota", "description": "Adds Tasmota Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-Tasmota/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-Tasmota", "page": "https://plugins.octoprint.org/plugins/psucontrol_tasmota/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2021-05-12 14:04:20 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-12 14:02:36 +0000", "stars": 8, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 245, "install_events_month": 23, "instances_week": 185, "install_events_week": 1}}, {"id": "octodashcompanion", "published": "2021-05-03 00:00:00 +0000", "title": "OctoDash Companion", "description": "This plugin allows for configuring OctoDash settings and upload custom theme files from within the OctoPrint interface.", "archive": "https://github.com/jneilliii/OctoPrint-OctoDashCompanion/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-OctoDashCompanion", "page": "https://plugins.octoprint.org/plugins/octodashcompanion/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octodashcompanion/screenshot_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.7", "date": "2022-03-20 20:01:43 +0000", "tag": "0.0.7"}, "releases": 21, "last_push": "2024-01-14 15:58:52 +0000", "stars": 16, "issues": {"open": 6, "closed": 23}}, "stats": {"instances_month": 3048, "install_events_month": 239, "instances_week": 2046, "install_events_week": 51}}, {"id": "psucontrol_tendabeli", "published": "2021-05-03 00:00:00 +0000", "title": "PSU Control - Tenda Beli", "description": "Adds Tenda Beli SP3 Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/jgroman/OctoPrint-PSUControl-TendaBeli/archive/master.zip", "author": "Jaroslav Groman", "homepage": "https://github.com/jgroman/OctoPrint-PSUControl-TendaBeli", "page": "https://plugins.octoprint.org/plugins/psucontrol_tendabeli/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-05-03 18:50:54 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2021-05-20 10:30:39 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 14, "install_events_month": 2, "instances_week": 13, "install_events_week": 0}}, {"id": "psucontrol_wemo", "published": "2021-05-08 00:00:00 +0000", "title": "PSU Control - Wemo", "description": "Adds Wemo Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/jneilliii/OctoPrint-PSUControl-Wemo/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PSUControl-Wemo", "page": "https://plugins.octoprint.org/plugins/psucontrol_wemo/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 - Upstream Bugfixes", "date": "2021-05-11 00:39:49 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-11 00:38:47 +0000", "stars": 1, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 49, "install_events_month": 8, "instances_week": 38, "install_events_week": 1}}, {"id": "calibrationcompanion", "published": "2021-05-10 00:00:00 +0000", "title": "Calibration Companion", "description": "This plugin was created to calibrate 3D printer settings easily.", "archive": "https://github.com/iFrostizz/OctoPrint-CalibrationCompanion/archive/main.zip", "author": "iFrostizz", "homepage": "https://github.com/iFrostizz/OctoPrint-CalibrationCompanion", "page": "https://plugins.octoprint.org/plugins/calibrationcompanion/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/calibrationcompanion/setup.png", "abandoned": false, "github": {"latest_release": {"name": "Faster UI, progess bar, smaller acc. tower, more variables.", "date": "2021-06-20 23:35:48 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2022-09-08 15:29:58 +0000", "stars": 32, "issues": {"open": 7, "closed": 25}}, "stats": {"instances_month": 1543, "install_events_month": 143, "instances_week": 1055, "install_events_week": 38}}, {"id": "mqtt_for_psucontrol", "published": "2021-05-12 00:00:00 +0000", "title": "MQTT exposure for PSU Control", "description": "Control your PSU Control with MQTT or Home Assistant", "archive": "https://github.com/oerkel47/OctoPrint-MQTT-for-PSUcontrol/archive/main.zip", "author": "oerkel47", "homepage": "https://github.com/oerkel47/OctoPrint-MQTT-for-PSUcontrol", "page": "https://plugins.octoprint.org/plugins/mqtt_for_psucontrol/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mqtt_for_psucontrol/screenshot_settings.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2021-10-21 17:47:37 +0000", "tag": "1.2.0"}, "releases": 5, "last_push": "2021-10-21 17:42:30 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 192, "install_events_month": 14, "instances_week": 151, "install_events_week": 5}}, {"id": "psucontrol_homeassistant", "published": "2021-05-15 00:00:00 +0000", "title": "PSU Control - HomeAssistant", "description": "Adds HomeAssistant support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/edekeijzer/OctoPrint-PSUControl-HomeAssistant/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-PSUControl-HomeAssistant", "page": "https://plugins.octoprint.org/plugins/psucontrol_homeassistant/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.5", "date": "2022-05-09 09:30:59 +0000", "tag": "1.0.5"}, "releases": 4, "last_push": "2023-10-08 13:40:38 +0000", "stars": 29, "issues": {"open": 1, "closed": 17}}, "stats": {"instances_month": 1122, "install_events_month": 105, "instances_week": 859, "install_events_week": 22}}, {"id": "psucontrol_shelly", "published": "2021-05-15 00:00:00 +0000", "title": "PSU Control - Shelly", "description": "Adds Shelly smart switch support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/edekeijzer/OctoPrint-PSUControl-Shelly/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-PSUControl-Shelly", "page": "https://plugins.octoprint.org/plugins/psucontrol_shelly/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2021-05-19 14:54:27 +0000", "tag": "1.0.2"}, "releases": 2, "last_push": "2023-01-26 13:36:11 +0000", "stars": 8, "issues": {"open": 5, "closed": 12}}, "stats": {"instances_month": 352, "install_events_month": 24, "instances_week": 255, "install_events_week": 6}}, {"id": "draggable_files", "published": "2021-05-18 00:00:00 +0000", "title": "Draggable Files", "description": "Plugin that allows for the dragging of files in the File Manager", "archive": "https://github.com/SanderRonde/Octoprint-Draggable-Files/archive/main.zip", "author": "Sander Ronde", "homepage": "https://github.com/SanderRonde/Octoprint-Draggable-Files", "page": "https://plugins.octoprint.org/plugins/draggable_files/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "1.1.2", "date": "2021-10-09 17:49:31 +0000", "tag": "1.1.2"}, "releases": 9, "last_push": "2021-10-09 17:48:36 +0000", "stars": 5, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 1252, "install_events_month": 76, "instances_week": 942, "install_events_week": 16}}, {"id": "navbarclock", "published": "2021-06-01 00:00:00 +0000", "title": "Navbar Clock", "description": "Displays the current time on the OctoPrint navigation bar", "archive": "https://github.com/ManuelMcLure/OctoPrint-NavbarClock/archive/main.zip", "author": "Manuel McLure", "homepage": "https://github.com/ManuelMcLure/OctoPrint-NavbarClock", "page": "https://plugins.octoprint.org/plugins/navbarclock/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/navbarclock/NavbarClock.png", "abandoned": false, "github": {"latest_release": {"name": "Less whitespace", "date": "2021-09-26 05:04:41 +0000", "tag": "v1.1.4"}, "releases": 8, "last_push": "2021-09-26 05:03:56 +0000", "stars": 0, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 534, "install_events_month": 53, "instances_week": 362, "install_events_week": 17}}, {"id": "fortune", "published": "2021-06-04 00:00:00 +0000", "title": "OctoPrint-Fortune", "description": "Gives you a pithy fortune on web login or startup", "archive": "https://github.com/berrystephenw/OctoPrint-Fortune/archive/main.zip", "author": "Stephen Berry", "homepage": "https://github.com/berrystephenw/OctoPrint-Fortune", "page": "https://plugins.octoprint.org/plugins/fortune/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "BSD", "image": "https://plugins.octoprint.org/assets/img/plugins/fortune/fortune-1.png", "abandoned": false, "github": {"latest_release": {"name": "Additional Fortune files", "date": "2022-03-04 14:45:39 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2022-03-04 14:40:46 +0000", "stars": 3, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 41, "install_events_month": 1, "instances_week": 32, "install_events_week": 0}}, {"id": "ArducamCameraControl", "published": "2021-06-18 00:00:00 +0000", "title": "ArducamCameraControl", "description": "Plugin to control Arducam motorized and ptz camera", "archive": "https://github.com/arducam/ArducamCameraControl/archive/master.zip", "author": "Arducam", "homepage": "https://github.com/arducam/ArducamCameraControl", "page": "https://plugins.octoprint.org/plugins/ArducamCameraControl/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ArducamCameraControl/ArducamCameraControl.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-06-18 06:58:42 +0000", "tag": "0.3"}, "releases": 3, "last_push": "2022-03-08 09:13:03 +0000", "stars": 8, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 296, "install_events_month": 36, "instances_week": 174, "install_events_week": 8}}, {"id": "gpiofancontroller", "published": "2021-07-04 00:00:00 +0000", "title": "OctoPrint-GpioFanController", "description": "Uses PI GPIO pins to control a variable speed fan with PWM", "archive": "https://github.com/z4gunn/OctoPrint-GpioFanController/archive/master.zip", "author": "Erik Gundersen", "homepage": "https://github.com/z4gunn/OctoPrint-GpioFanController", "page": "https://plugins.octoprint.org/plugins/gpiofancontroller/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiofancontroller/featured.png", "abandoned": false, "github": {"latest_release": {"name": "added dependency for RPi.GPIO and fixed lag while adjusting sidebar speed control", "date": "2021-07-18 14:18:52 +0000", "tag": "0.2.1"}, "releases": 4, "last_push": "2021-08-02 14:46:39 +0000", "stars": 6, "issues": {"open": 10, "closed": 2}}, "stats": {"instances_month": 188, "install_events_month": 24, "instances_week": 134, "install_events_week": 11}}, {"id": "gpiorgbcontroller", "published": "2021-07-07 00:00:00 +0000", "title": "OctoPrint-GpioRgbController", "description": "Uses PI GPIO pins to control a RGB Led strip", "archive": "https://github.com/z4gunn/OctoPrint-GpioRgbController/archive/master.zip", "author": "Erik Gundersen", "homepage": "https://github.com/z4gunn/OctoPrint-GpioRgbController", "page": "https://plugins.octoprint.org/plugins/gpiorgbcontroller/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiorgbcontroller/featured.png", "abandoned": false, "github": {"latest_release": {"name": "fixed unused pin factory import", "date": "2021-07-18 13:18:22 +0000", "tag": "0.3.3"}, "releases": 6, "last_push": "2021-08-02 14:48:53 +0000", "stars": 9, "issues": {"open": 7, "closed": 8}}, "stats": {"instances_month": 90, "install_events_month": 14, "instances_week": 62, "install_events_week": 3}}, {"id": "LightControls", "published": "2021-07-09 00:00:00 +0000", "title": "OctoPrint-LightControls", "description": "Adds easily configurable PWM Light controls to Octoprint Control Tab", "archive": "https://github.com/RoboMagus/OctoPrint-LightControls/archive/main.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-LightControls", "page": "https://plugins.octoprint.org/plugins/LightControls/", "compatibility": {"octoprint": ["1.6.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Support for Hardware PWM", "date": "2023-08-26 08:28:46 +0000", "tag": "0.4.3"}, "releases": 11, "last_push": "2023-08-26 08:23:35 +0000", "stars": 5, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 96, "install_events_month": 8, "instances_week": 67, "install_events_week": 3}}, {"id": "mote_lighting_control", "published": "2021-07-14 00:00:00 +0000", "title": "OctoPrint-MoteLightingControl", "description": "Control a set of Mote lights - with different OctoPrint conditions causing changes in the lighting colour and state.", "archive": "https://github.com/nigelm/OctoPrint-MoteLightingControl/archive/main.zip", "author": "Nigel Metheringham", "homepage": "https://github.com/nigelm/OctoPrint-MoteLightingControl", "page": "https://plugins.octoprint.org/plugins/mote_lighting_control/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mote_lighting_control/mote_lights.jpg", "abandoned": false, "github": {"last_push": "2021-08-31 10:53:10 +0000", "stars": 2, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 7, "install_events_month": 2, "instances_week": 6, "install_events_week": 0}}, {"id": "matrix_notifier", "published": "2021-07-21 00:00:00 +0000", "title": "Matrix Notifier", "description": "Sends matrix notifications and snapshots of your print.", "archive": "https://github.com/Cadair/octoprint-matrix-notifier-plugin/archive/main.zip", "author": "Stuart Mumford", "homepage": "https://github.com/Cadair/octoprint-matrix-notifier-plugin", "page": "https://plugins.octoprint.org/plugins/matrix_notifier/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/matrix_notifier/printstarted.png", "abandoned": false, "github": {"latest_release": {"name": "v0.3.0", "date": "2024-03-26 10:41:23 +0000", "tag": "v0.3.0"}, "releases": 3, "last_push": "2024-04-29 17:49:40 +0000", "stars": 15, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 21, "install_events_month": 3, "instances_week": 18, "install_events_week": 0}}, {"id": "physicalbutton", "published": "2021-08-01 00:00:00 +0000", "title": "Physical Button", "description": "Add physical buttons to OctoPrint", "archive": "https://github.com/LuxuSam/PhysicalButton/archive/master.zip", "author": "LuxuSam", "homepage": "https://github.com/LuxuSam/PhysicalButton/tree/master", "page": "https://plugins.octoprint.org/plugins/physicalbutton/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/physicalbutton/PhysicalButton_Logo.png", "abandoned": false, "github": {"latest_release": {"name": "Installation Fix for Python Versions < 3.8 - 29 February 2024", "date": "2024-02-29 15:02:29 +0000", "tag": "v0.6.2"}, "releases": 11, "last_push": "2024-02-29 14:48:12 +0000", "stars": 30, "issues": {"open": 6, "closed": 33}}, "stats": {"instances_month": 246, "install_events_month": 20, "instances_week": 183, "install_events_week": 6}}, {"id": "gcode_macro", "published": "2021-08-09 00:00:00 +0000", "title": "Gcode Macros", "description": "Configure custom gcode macros you can use anywhere!", "archive": "https://github.com/cp2004/OctoPrint-GCodeMacros/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-GCodeMacros", "page": "https://plugins.octoprint.org/plugins/gcode_macro/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcode_macro/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.3.0", "date": "2022-12-20 21:22:10 +0000", "tag": "1.3.0"}, "releases": 7, "last_push": "2023-12-27 13:00:32 +0000", "stars": 8, "issues": {"open": 3, "closed": 11}}, "stats": {"instances_month": 383, "install_events_month": 28, "instances_week": 278, "install_events_week": 6}}, {"id": "autobim", "published": "2021-08-15 00:00:00 +0000", "title": "AutoBim", "description": "A bed tramming utility for OctoPrint", "archive": "https://github.com/j-be/AutoBim/archive/master.zip", "author": "Juri Berlanda", "homepage": "https://github.com/j-be/AutoBim", "page": "https://plugins.octoprint.org/plugins/autobim/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autobim/ui_1.png", "abandoned": false, "github": {"latest_release": {"name": "v0.4.1 - Add support for new G30 response", "date": "2023-09-29 09:57:44 +0000", "tag": "v0.4.1"}, "releases": 19, "last_push": "2023-09-29 09:56:06 +0000", "stars": 29, "issues": {"open": 15, "closed": 22}}, "stats": {"instances_month": 441, "install_events_month": 46, "instances_week": 317, "install_events_week": 7}}, {"id": "Chituboard", "published": "2021-08-16 00:00:00 +0000", "title": "Octoprint-Chituboard", "description": "compatibility layer for SLA printers with Chituboards like the Photon and Mars series", "archive": "https://github.com/rudetrooper/Octoprint-Chituboard/archive/main.zip", "author": "Vikram Sarkhel", "homepage": "https://github.com/rudetrooper/Octoprint-Chituboard", "page": "https://plugins.octoprint.org/plugins/Chituboard/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Chituboard/octoprint_chituboard.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.4", "date": "2021-12-14 00:58:52 +0000", "tag": "v0.1.4"}, "releases": 3, "last_push": "2023-05-20 02:07:13 +0000", "stars": 78, "issues": {"open": 24, "closed": 13}}, "stats": {"instances_month": 49, "install_events_month": 6, "instances_week": 24, "install_events_week": 0}}, {"id": "plotlytempgraph", "published": "2021-08-21 00:00:00 +0000", "title": "OctoPrint-PlotlyTempGraph", "description": "Display temperature data in a plotly js graph.", "archive": "https://github.com/jneilliii/OctoPrint-PlotlyTempGraph/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PlotlyTempGraph", "page": "https://plugins.octoprint.org/plugins/plotlytempgraph/", "compatibility": {"octoprint": ["1.3.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/plotlytempgraph/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2023-09-30 01:00:05 +0000", "tag": "0.1.7"}, "releases": 31, "last_push": "2024-01-14 15:58:55 +0000", "stars": 22, "issues": {"open": 1, "closed": 44}}, "stats": {"instances_month": 562, "install_events_month": 44, "instances_week": 405, "install_events_week": 13}}, {"id": "printscheduler", "published": "2021-08-21 00:00:00 +0000", "title": "Print Scheduler", "description": "Plugin that allows to schedule prints to run at a specified time.", "archive": "https://github.com/jneilliii/OctoPrint-PrintScheduler/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PrintScheduler", "page": "https://plugins.octoprint.org/plugins/printscheduler/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/printscheduler/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2023-03-19 04:52:32 +0000", "tag": "1.0.2"}, "releases": 15, "last_push": "2024-01-14 15:58:59 +0000", "stars": 10, "issues": {"open": 2, "closed": 41}}, "stats": {"instances_month": 976, "install_events_month": 86, "instances_week": 743, "install_events_week": 14}}, {"id": "ups", "published": "2021-08-22 00:00:00 +0000", "title": "UPS", "description": "Integrates a UPS monitored by NUT into OctoPrint", "archive": "https://github.com/kantlivelong/OctoPrint-UPS/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-UPS", "page": "https://plugins.octoprint.org/plugins/ups/", "compatibility": {"octoprint": ["1.6.0"], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ups/ups_navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2021-08-20 03:54:03 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2021-08-20 03:50:38 +0000", "stars": 15, "issues": {"open": 8, "closed": 6}}, "stats": {"instances_month": 187, "install_events_month": 21, "instances_week": 149, "install_events_week": 6}}, {"id": "SafetyPrinter", "published": "2021-08-30 00:00:00 +0000", "title": "Safety Printer", "description": "This plugin interfaces with Safety Printer MCU to improve your printer's safety.", "archive": "https://github.com/SinisterRj/Octoprint_SafetyPrinter/archive/refs/heads/main.zip", "author": "Rodrigo C. C. Silva", "homepage": "https://github.com/SinisterRj/SafetyPrinter/wiki", "page": "https://plugins.octoprint.org/plugins/SafetyPrinter/", "compatibility": {"octoprint": [], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SafetyPrinter/icon.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2022-12-26 18:47:41 +0000", "tag": "1.2.0"}, "releases": 13, "last_push": "2024-01-15 18:27:00 +0000", "stars": 3, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 52, "install_events_month": 9, "instances_week": 32, "install_events_week": 2}}, {"id": "thingiverse_downloader", "published": "2021-09-10 00:00:00 +0000", "title": "Thingiverse Downloader", "description": "Download and extract a thing from Thingiverse to your Octoprint instance", "archive": "https://github.com/appdevelopmentandsuch/Thingiverse-Downloader/archive/main.zip", "author": "Lucas Bock", "homepage": "https://github.com/appdevelopmentandsuch/Thingiverse-Downloader", "page": "https://plugins.octoprint.org/plugins/thingiverse_downloader/", "compatibility": {"octoprint": ["1.3.5"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/thingiverse_downloader/demo.png", "abandoned": false, "github": {"latest_release": {"name": "v0.3.0", "date": "2021-09-10 12:23:23 +0000", "tag": "v0.3.0"}, "releases": 5, "last_push": "2021-09-10 12:20:49 +0000", "stars": 8, "issues": {"open": 1, "closed": 9}}, "stats": {"instances_month": 635, "install_events_month": 56, "instances_week": 394, "install_events_week": 9}}, {"id": "fractalbridge", "published": "2021-09-15 00:00:00 +0000", "title": "Fractal Bridge", "description": "Fractal's printer control plugin for OctoPrint", "archive": "https://github.com/FractalManufacturing/OctoPrint-FractalBridge/archive/master.zip", "author": "Fractal", "homepage": "https://github.com/FractalManufacturing/OctoPrint-FractalBridge", "page": "https://plugins.octoprint.org/plugins/fractalbridge/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/fractalbridge/fractal-home.png", "abandoned": false, "github": {"last_push": "2021-09-16 15:19:50 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 8, "install_events_month": 3, "instances_week": 5, "install_events_week": 0}}, {"id": "bedcooldown", "published": "2021-09-26 00:00:00 +0000", "title": "OctoPrint-BedCooldown", "description": "Turns off the bed heater toward the end of a print", "archive": "https://github.com/rfinnie/OctoPrint-BedCooldown/archive/main.zip", "author": "Ryan Finnie", "homepage": "https://github.com/rfinnie/OctoPrint-BedCooldown", "page": "https://plugins.octoprint.org/plugins/bedcooldown/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MPL-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/bedcooldown/graph.png", "abandoned": false, "github": {"latest_release": {"name": "Bed Cooldown 0.6.0", "date": "2022-11-20 21:50:41 +0000", "tag": "v0.6.0"}, "releases": 9, "last_push": "2023-12-06 23:31:40 +0000", "stars": 3, "issues": {"open": 3, "closed": 7}}, "stats": {"instances_month": 729, "install_events_month": 34, "instances_week": 547, "install_events_week": 8}}, {"id": "psucontrol_openhab3", "published": "2021-09-27 00:00:00 +0000", "title": "PSU Control - openHAB3", "description": "Adds openHAB3 support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/Tomatenjoghurt/OctoPrint-PSUControl-openHAB3/archive/main.zip", "author": "Philipp Gro\u00dfe", "homepage": "https://github.com/Tomatenjoghurt/OctoPrint-PSUControl-openHAB3", "page": "https://plugins.octoprint.org/plugins/psucontrol_openhab3/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2021-09-09 09:37:27 +0000", "tag": "1.0.8"}, "releases": 9, "last_push": "2022-06-13 13:07:17 +0000", "stars": 5, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 40, "install_events_month": 3, "instances_week": 31, "install_events_week": 0}}, {"id": "psucontrol_mqtt", "published": "2021-10-05 00:00:00 +0000", "title": "PSU Control - MQTT", "description": "adds support for generic MQTT switches to PSU Control as a subplugin", "archive": "https://github.com/oerkel47/OctoPrint-PSUControl-MQTT/archive/main.zip", "author": "oerkel47", "homepage": "https://github.com/oerkel47/OctoPrint-PSUControl-MQTT", "page": "https://plugins.octoprint.org/plugins/psucontrol_mqtt/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_mqtt/screenshot_settings.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2021-11-17 09:56:59 +0000", "tag": "1.0.2"}, "releases": 2, "last_push": "2021-11-17 09:50:32 +0000", "stars": 8, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 163, "install_events_month": 9, "instances_week": 126, "install_events_week": 4}}, {"id": "octoapp", "published": "2021-12-01 00:00:00 +0000", "title": "OctoApp", "description": "The Companion Plugin for OctoApp", "archive": "https://github.com/crysxd/OctoApp-Plugin/archive/refs/heads/release.zip", "author": "Christian W\u00fcrthner", "homepage": "https://play.google.com/store/apps/details?id=de.crysxd.octoapp&hl=en&gl=US", "page": "https://plugins.octoprint.org/plugins/octoapp/", "compatibility": {"octoprint": ["1.7.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPL v3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoapp/carousel.webp", "abandoned": false, "github": {"latest_release": {"name": "2.0.10", "date": "2024-04-06 07:23:23 +0000", "tag": "2.0.10"}, "releases": 28, "last_push": "2024-04-13 15:18:13 +0000", "stars": 46, "issues": {"open": 2, "closed": 35}}, "stats": {"instances_month": 6863, "install_events_month": 796, "instances_week": 5019, "install_events_week": 192}}, {"id": "BLOCKS", "published": "2021-12-24 00:00:00 +0000", "title": "Blocks", "description": "Theme for Blocks 3D printers and extended functionalities.", "archive": "https://github.com/HugoCLSC/Octoprint-BLOCKS/archive/main.zip", "author": "Hugo C. Lopes Santos Costa", "homepage": "https://github.com/HugoCLSC/OctoPrint-BLOCKS", "page": "https://plugins.octoprint.org/plugins/BLOCKS/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3.3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BLOCKS/Blocks_VECTORIZADOpreto.png", "abandoned": false, "github": {"latest_release": {"name": "Release V1.0.4", "date": "2023-08-03 13:31:34 +0000", "tag": "v1.0.4"}, "releases": 5, "last_push": "2023-08-14 16:44:38 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 10, "install_events_week": 0}}, {"id": "custom_gcode_events", "published": "2022-01-02 00:00:00 +0000", "title": "OctoPrint-Custom_gcode_events", "description": "Enables the User to configure custom GCode hooks (both sent and received) that will fire a User-defined event to be picked up by other plugins.", "archive": "https://github.com/RoboMagus/OctoPrint-Custom_gcode_events/archive/master.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-Custom_gcode_events", "page": "https://plugins.octoprint.org/plugins/custom_gcode_events/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Custom Event Registration + Settings bugfix", "date": "2023-11-14 19:39:54 +0000", "tag": "0.3.2"}, "releases": 5, "last_push": "2023-11-14 19:33:49 +0000", "stars": 4, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 43, "install_events_month": 2, "instances_week": 32, "install_events_week": 0}}, {"id": "onedrive_backup", "published": "2022-01-03 00:00:00 +0000", "title": "OneDrive Backup", "description": "Automatically upload OctoPrint backups to Microsoft OneDrive", "archive": "https://github.com/cp2004/OctoPrint-OneDrive-Backup/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-OneDrive-Backup", "page": "https://plugins.octoprint.org/plugins/onedrive_backup/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/onedrive_backup/config-3.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 Stable Release", "date": "2022-01-17 22:32:58 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2023-12-27 13:00:34 +0000", "stars": 15, "issues": {"open": 4, "closed": 14}}, "stats": {"instances_month": 693, "install_events_month": 43, "instances_week": 505, "install_events_week": 5}}, {"id": "gpiostatus", "published": "2022-01-08 00:00:00 +0000", "title": "GPIO Status", "description": "Check the Raspberry GPIO status and other hardware data.", "archive": "https://github.com/danieleborgo/OctoPrint-GPIOStatus/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-GPIOStatus", "page": "https://plugins.octoprint.org/plugins/gpiostatus/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiostatus/GPIO.png", "abandoned": false, "github": {"latest_release": {"name": "GPIO Status 0.2.1", "date": "2022-01-17 17:31:20 +0000", "tag": "0.2.1"}, "releases": 1, "last_push": "2022-08-23 19:00:35 +0000", "stars": 9, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 518, "install_events_month": 49, "instances_week": 378, "install_events_week": 16}}, {"id": "shutdownbuttonledbuzzer", "published": "2022-01-08 00:00:00 +0000", "title": "ShutdownButtonLEDBuzzer", "description": "It implements a shutdown physical button for the Raspberry Pi, with a buzzer and a status LED.", "archive": "https://github.com/danieleborgo/OctoPrint-ShutdownButtonLEDBuzzer/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-ShutdownButtonLEDBuzzer", "page": "https://plugins.octoprint.org/plugins/shutdownbuttonledbuzzer/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/shutdownbuttonledbuzzer/circuit.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2022-05-30 18:10:54 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2023-02-25 17:16:17 +0000", "stars": 5, "issues": {"open": 0, "closed": 7}}, "stats": {"instances_month": 66, "install_events_month": 5, "instances_week": 35, "install_events_week": 1}}, {"id": "activeconnections", "published": "2022-01-22 00:00:00 +0000", "title": "Active Connections", "description": "Displays list of active connections in a sidebar panel.", "archive": "https://github.com/jneilliii/OctoPrint-ActiveConnections/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ActiveConnections", "page": "https://plugins.octoprint.org/plugins/activeconnections/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/activeconnections/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1", "date": "2022-01-29 05:30:27 +0000", "tag": "0.2.1"}, "releases": 3, "last_push": "2024-01-14 15:58:38 +0000", "stars": 4, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 367, "install_events_month": 25, "instances_week": 278, "install_events_week": 3}}, {"id": "googledrivefiles", "published": "2022-01-22 00:00:00 +0000", "title": "Google Drive Files", "description": "Adds Google Drive file access from within OctoPrint's file manager.", "archive": "https://github.com/jneilliii/OctoPrint-GoogleDriveFiles/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-GoogleDriveFiles", "page": "https://plugins.octoprint.org/plugins/googledrivefiles/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/googledrivefiles/screenshot_filelist.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2024-01-11 01:12:09 +0000", "tag": "0.1.1"}, "releases": 6, "last_push": "2024-01-14 15:58:39 +0000", "stars": 15, "issues": {"open": 4, "closed": 16}}, "stats": {"instances_month": 320, "install_events_month": 28, "instances_week": 229, "install_events_week": 9}}, {"id": "printwatch", "published": "2022-01-31 00:00:00 +0000", "title": "Abort Failures - Printwatch", "description": "PrintWatch monitors your prints for defects in real-time and optimizes your 3D printers using Artificial Intelligence for Free. PrintWatch allows you to remotely view and manage your printers from anywhere in the world. Save wasted material and time with our AI monitoring system that notifies you and/or pauses the print when something goes wrong. Go about your day with the peace of mind that your 3D printer is working as it should.", "archive": "https://github.com/printpal-io/OctoPrint-Printwatch/archive/master.zip", "author": "printpal.io", "homepage": "https://github.com/printpal-io/OctoPrint-Printwatch", "privacypolicy": "https://printpal.io/privacy/", "page": "https://plugins.octoprint.org/plugins/printwatch/", "compatibility": {"octoprint": ["1.3.2"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printwatch/printwatch-web-app-individual-printer.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.3.01 - Free Plan", "date": "2023-07-13 15:37:14 +0000", "tag": "1.3.01"}, "releases": 7, "last_push": "2024-01-31 22:27:16 +0000", "stars": 37, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 415, "install_events_month": 54, "instances_week": 257, "install_events_week": 16}}, {"id": "timelapsepurger", "published": "2022-02-06 00:00:00 +0000", "title": "Timelapse Purger", "description": "Automatically deletes timelapses that are older than configured number of days.", "archive": "https://github.com/jneilliii/OctoPrint-TimelapsePurger/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TimelapsePurger", "page": "https://plugins.octoprint.org/plugins/timelapsepurger/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/timelapsepurger/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2022-11-13 03:00:16 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2024-01-14 15:59:14 +0000", "stars": 1, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 877, "install_events_month": 63, "instances_week": 647, "install_events_week": 14}}, {"id": "CalibrationTools", "published": "2022-02-09 00:00:00 +0000", "title": "Calibration Tools", "description": "Marlin Calibration Tools", "archive": "https://github.com/SergiuToporjinschi/OctoPrint-CalibrationTools/archive/main.zip", "author": "Sergiu Toporjinschi", "homepage": "https://github.com/SergiuToporjinschi/OctoPrint-CalibrationTools", "page": "https://plugins.octoprint.org/plugins/CalibrationTools/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "GNUv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CalibrationTools/featuredimage.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2022-02-16 10:41:32 +0000", "tag": "1.0.4"}, "releases": 7, "last_push": "2022-02-16 11:18:01 +0000", "stars": 18, "issues": {"open": 14, "closed": 6}}, "stats": {"instances_month": 2897, "install_events_month": 301, "instances_week": 1949, "install_events_week": 71}}, {"id": "emc2101", "published": "2022-02-14 00:00:00 +0000", "title": "OctoPrint-Emc2101", "description": "Enable control status display of up to 8 4-Pin PWM fans each controlled by an Adafruit 2101", "archive": "https://github.com/JeremyLaurenson/OctoPrint-Emc2101/archive/main.zip", "author": "Jeremy Laurenson", "homepage": "https://github.com/JeremyLaurenson/OctoPrint-Emc2101", "page": "https://plugins.octoprint.org/plugins/emc2101/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/emc2101/EMC_ss_0.0.4-2.png", "abandoned": false, "github": {"latest_release": {"name": "Bugfix for single sensor use case", "date": "2022-05-25 15:58:53 +0000", "tag": "0.0.8"}, "releases": 8, "last_push": "2024-02-18 13:49:30 +0000", "stars": 8, "issues": {"open": 7, "closed": 3}}, "stats": {"instances_month": 19, "install_events_month": 4, "instances_week": 13, "install_events_week": 1}}, {"id": "octoprint_psucontrol_meross", "published": "2022-02-22 00:00:00 +0000", "title": "PSU Control - Meross", "description": "Adds Meross IOT device support to PSUControl", "archive": "https://github.com/VRGhost/OctoPrint-PSUControl-Meross/archive/refs/tags/stable-latest.zip", "author": "Ilja Orlovs", "homepage": "https://github.com/VRGhost/OctoPrint-PSUControl-Meross", "page": "https://plugins.octoprint.org/plugins/octoprint_psucontrol_meross/", "compatibility": {"octoprint": ["1.7.3"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.13.3", "date": "2024-01-13 20:59:59 +0000", "tag": "0.13.3"}, "releases": 12, "last_push": "2024-01-13 20:55:12 +0000", "stars": 4, "issues": {"open": 3, "closed": 6}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "openmiko", "published": "2022-02-26 00:00:00 +0000", "title": "OctoPrint-OpenMiko", "description": "Control OpenMiko Day/Night Mode", "archive": "https://github.com/tmountjr/OctoPrint-OpenMiko/archive/main.zip", "author": "Tom Mount", "homepage": "https://github.com/tmountjr/OctoPrint-OpenMiko", "page": "https://plugins.octoprint.org/plugins/openmiko/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/openmiko/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.1", "date": "2022-03-24 03:03:05 +0000", "tag": "v0.2.1"}, "releases": 3, "last_push": "2022-03-24 03:02:09 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 34, "install_events_month": 4, "instances_week": 27, "install_events_week": 1}}, {"id": "ServoSpindle", "published": "2022-02-27 00:00:00 +0000", "title": "Servo Spindle for GRBL CNC", "description": "Servo Spindle enables servo based control of a CNC spindle by connecting to an ESC and trapping Grbl M3/M5/S### commands", "archive": "https://github.com/synman/OctoPrint-Servospindle/archive/main.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-Servospindle", "page": "https://plugins.octoprint.org/plugins/ServoSpindle/", "compatibility": {"octoprint": ["1.3.10"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/ServoSpindle/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2022-02-28 14:44:50 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2022-02-07 11:58:33 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 5, "instances_week": 6, "install_events_week": 0}}, {"id": "usbrelaycontrol", "published": "2022-03-01 00:00:00 +0000", "title": "USB Relay Control", "description": "Control USB relays from within OctoPrint", "archive": "https://github.com/abudden/OctoPrint-USBRelayControl/archive/master.zip", "author": "A. S. Budden", "homepage": "https://github.com/abudden/OctoPrint-USBRelayControl", "page": "https://plugins.octoprint.org/plugins/usbrelaycontrol/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPL", "image": "https://plugins.octoprint.org/assets/img/plugins/usbrelaycontrol/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.0", "date": "2022-02-28 18:51:26 +0000", "tag": "v1.0.0"}, "releases": 2, "last_push": "2022-02-28 18:37:28 +0000", "stars": 11, "issues": {"open": 7, "closed": 3}}, "stats": {"instances_month": 125, "install_events_month": 19, "instances_week": 82, "install_events_week": 4}}, {"id": "cnc_gcodeviewer", "published": "2022-03-03 00:00:00 +0000", "title": "CNC GCode Viewer", "description": "GCode Viewer for CNC toolpaths with no extrusions", "archive": "https://github.com/vector76/cnc_gcodeviewer/archive/main.zip", "author": "Jamie Kawabata", "homepage": "https://github.com/vector76/cnc_gcodeviewer", "page": "https://plugins.octoprint.org/plugins/cnc_gcodeviewer/", "compatibility": {"octoprint": ["1.4.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cnc_gcodeviewer/crown_screen_shot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.1", "date": "2022-11-14 08:35:02 +0000", "tag": "v1.1.1"}, "releases": 7, "last_push": "2022-11-14 08:33:14 +0000", "stars": 3, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 131, "install_events_month": 16, "instances_week": 85, "install_events_week": 4}}, {"id": "wyze", "published": "2022-03-16 00:00:00 +0000", "title": "OctoPrint-Wyze", "description": "Control Wyze devices through OctoPrint", "archive": "https://github.com/eshapiro42/OctoPrint-Wyze/archive/main.zip", "author": "Eric Shapiro", "homepage": "https://github.com/eshapiro42/OctoPrint-Wyze", "page": "https://plugins.octoprint.org/plugins/wyze/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.8,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wyze/OctoPrint-Wyze.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.2", "date": "2023-10-27 18:37:18 +0000", "tag": "v0.2.2"}, "releases": 9, "last_push": "2023-10-27 18:39:47 +0000", "stars": 10, "issues": {"open": 3, "closed": 12}}, "stats": {"instances_month": 71, "install_events_month": 18, "instances_week": 46, "install_events_week": 6}}, {"id": "pwmbuzzer", "published": "2022-03-29 00:00:00 +0000", "title": "OctoPrint-PWMBuzzer", "description": "Uses PWM via GPIO to sound tones whenever an M300 command is encountered", "archive": "https://github.com/stealthmonkey99/OctoPrint-PWMBuzzer/archive/main.zip", "author": "Matt Bielich", "homepage": "https://github.com/stealthmonkey99/OctoPrint-PWMBuzzer", "page": "https://plugins.octoprint.org/plugins/pwmbuzzer/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pwmbuzzer/composer.png", "abandoned": false, "github": {"latest_release": {"name": "v1.2.0: better sound with hardware timer PWM", "date": "2022-07-31 22:29:54 +0000", "tag": "v1.2.0"}, "releases": 3, "last_push": "2022-09-10 20:54:32 +0000", "stars": 6, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 72, "install_events_month": 8, "instances_week": 51, "install_events_week": 1}}, {"id": "framer", "published": "2022-04-05 00:00:00 +0000", "title": "OctoPrint-Framer", "description": "Adds frame buttons to the items in the file list which let you verify the area used for the laser/CNC job.", "archive": "https://github.com/rriet/OctoPrint-Framer/archive/master.zip", "author": "Ricardo Riet Correa", "homepage": "https://github.com/rriet/OctoPrint-Framer", "page": "https://plugins.octoprint.org/plugins/framer/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "GNUv3", "image": "https://plugins.octoprint.org/assets/img/plugins/framer/screen.png", "abandoned": false, "github": {"last_push": "2022-04-06 17:35:54 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 96, "install_events_month": 12, "instances_week": 60, "install_events_week": 1}}, {"id": "crealitycloud", "published": "2022-04-14 00:00:00 +0000", "title": "OctoPrint-CrealityCloud", "description": "A OctoPrint-Plugin that connect the Octoprint to Creality Cloud", "archive": "https://github.com/crealitycloud/OctoPrint-Crealitycloud/archive/master.zip", "author": "Creality", "homepage": "https://github.com/crealitycloud/OctoPrint-CrealityCloud", "privacypolicy": "https://www.crealitycloud.com/policy?type=policy", "page": "https://plugins.octoprint.org/plugins/crealitycloud/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2024-04-03 06:40:26 +0000", "tag": "1.0.9"}, "releases": 16, "last_push": "2024-04-03 06:34:53 +0000", "stars": 26, "issues": {"open": 9, "closed": 13}}, "stats": {"instances_month": 1206, "install_events_month": 253, "instances_week": 753, "install_events_week": 62}}, {"id": "psucontrol_tapo", "published": "2022-04-14 00:00:00 +0000", "title": "PSU Control - Tapo", "description": "Adds Tapo Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/dswd/OctoPrint-PSUControl-Tapo/archive/master.zip", "author": "Dennis Schwerdel", "homepage": "https://github.com/dswd/OctoPrint-PSUControl-Tapo", "page": "https://plugins.octoprint.org/plugins/psucontrol_tapo/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v0.4.0", "date": "2023-10-05 18:03:26 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2023-10-05 16:39:23 +0000", "stars": 7, "issues": {"open": 8, "closed": 6}}, "stats": {"instances_month": 439, "install_events_month": 74, "instances_week": 315, "install_events_week": 15}}, {"id": "detector2", "published": "2022-04-15 00:00:00 +0000", "title": "OctoPrint-Detector2", "description": "Detects errors directly in your browser and sends email with detected error", "archive": "https://github.com/mikulash/OctoPrint-Detector2/archive/master.zip", "author": "Mikulas Heinz", "homepage": "https://github.com/mikulash/OctoPrint-Detector2", "page": "https://plugins.octoprint.org/plugins/detector2/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/detector2/errorPreview.png", "abandoned": false, "github": {"latest_release": {"name": "Email fix and communication with other plugins", "date": "2022-07-26 22:23:15 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2022-07-26 22:16:43 +0000", "stars": 27, "issues": {"open": 10, "closed": 4}}, "stats": {"instances_month": 189, "install_events_month": 12, "instances_week": 129, "install_events_week": 1}}, {"id": "psucontrol_opigpio", "published": "2022-04-27 00:00:00 +0000", "title": "PSUControl - OPi.GPIO", "description": "Adds OPi.GPIO to OctoPrint-PSUControl as a sub-plugin for OrangePi Zero and other SBCs supported by OPi.GPIO.", "archive": "https://github.com/Blue-Beaker/OctoPrint-PSUControl-OPi.GPIO/archive/master.zip", "author": "Blue-Beaker", "homepage": "https://github.com/Blue-Beaker/OctoPrint-PSUControl-OPi.GPIO", "page": "https://plugins.octoprint.org/plugins/psucontrol_opigpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.0.4", "date": "2022-04-27 07:32:28 +0000", "tag": "1.0.4"}, "releases": 1, "last_push": "2022-04-27 07:26:37 +0000", "stars": 3, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 37, "install_events_month": 10, "instances_week": 17, "install_events_week": 2}}, {"id": "psucontrol_fritz", "published": "2022-04-28 00:00:00 +0000", "title": "PSU Control - FRITZ!Box", "description": "Adds FRITZ!Dect Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/not-na/OctoPrint-PSUControl-Fritz/archive/master.zip", "author": "not-na", "homepage": "https://github.com/not-na/OctoPrint-PSUControl-Fritz", "page": "https://plugins.octoprint.org/plugins/psucontrol_fritz/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "PSUControl - Fritz v1.0.3", "date": "2022-04-27 22:50:57 +0000", "tag": "1.0.3"}, "releases": 2, "last_push": "2022-04-27 22:45:27 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 33, "install_events_month": 3, "instances_week": 26, "install_events_week": 0}}, {"id": "bedready", "published": "2022-04-29 00:00:00 +0000", "title": "OctoPrint-BedReady", "description": "Plugin that uses the camera and opencv to determine if the bed matches a reference image indicating that the bed is clear and ready to start a print.", "archive": "https://github.com/jneilliii/OctoPrint-BedReady/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedReady", "page": "https://plugins.octoprint.org/plugins/bedready/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/bedready/screenshot_bed_not_ready.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.2", "date": "2023-12-27 17:23:06 +0000", "tag": "0.2.2"}, "releases": 10, "last_push": "2024-01-14 15:58:39 +0000", "stars": 11, "issues": {"open": 11, "closed": 8}}, "stats": {"instances_month": 318, "install_events_month": 53, "instances_week": 201, "install_events_week": 16}}, {"id": "extrafileinfo", "published": "2022-05-05 00:00:00 +0000", "title": "ExtraFileInfo", "description": "Adds a file's slicer settings to its additional data column.", "archive": "https://github.com/larsjuhw/OctoPrint-Extrafileinfo/archive/master.zip", "author": "Larsjuhw", "homepage": "https://github.com/larsjuhw/OctoPrint-Extrafileinfo", "page": "https://plugins.octoprint.org/plugins/extrafileinfo/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/extrafileinfo/file.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.0", "date": "2023-11-20 18:28:48 +0000", "tag": "1.4.0"}, "releases": 9, "last_push": "2023-11-20 18:27:05 +0000", "stars": 8, "issues": {"open": 0, "closed": 12}}, "stats": {"instances_month": 585, "install_events_month": 11, "instances_week": 468, "install_events_week": 7}}, {"id": "preheathelper", "published": "2022-05-07 00:00:00 +0000", "title": "OctoPrint-PreheatHelper", "description": "A little helper to automate your printer pre-heating!", "archive": "https://github.com/RoboMagus/OctoPrint-PreheatHelper/archive/master.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-PreheatHelper", "page": "https://plugins.octoprint.org/plugins/preheathelper/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Add release channels to plugin", "date": "2022-12-20 08:58:06 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2023-07-06 10:05:08 +0000", "stars": 1, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 418, "install_events_month": 31, "instances_week": 275, "install_events_week": 5}}, {"id": "psucontrol_jeedom", "published": "2022-05-24 00:00:00 +0000", "title": "PSU Control - Jeedom", "description": "Adds Jeedom support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/TexGG/OctoPrint-PSUControl-Jeedom/archive/main.zip", "author": "Tex", "homepage": "https://github.com/TexGG/OctoPrint-PSUControl-Jeedom", "page": "https://plugins.octoprint.org/plugins/psucontrol_jeedom/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Corrections for plugin publication", "date": "2022-05-21 20:07:45 +0000", "tag": "v1.0.2"}, "releases": 3, "last_push": "2022-05-21 20:06:05 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 2, "instances_week": 9, "install_events_week": 0}}, {"id": "queue", "published": "2022-06-06 00:00:00 +0000", "title": "OctoPrint-Queue", "description": "A simple queue setup designed for use by staff at a public library.", "archive": "https://github.com/chennes/OctoPrint-Queue/archive/master.zip", "author": "Chris Hennes, Pioneer Library System", "homepage": "https://github.com/chennes/OctoPrint-Queue", "page": "https://plugins.octoprint.org/plugins/queue/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=3.0,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/queue/queue.png", "abandoned": false, "github": {"latest_release": {"name": "v2.0.0", "date": "2022-06-07 03:11:37 +0000", "tag": "v2.0.0"}, "releases": 2, "last_push": "2023-05-22 00:53:36 +0000", "stars": 14, "issues": {"open": 8, "closed": 2}}, "stats": {"instances_month": 116, "install_events_month": 17, "instances_week": 70, "install_events_week": 4}}, {"id": "CreatbotUtil", "published": "2022-06-14 00:00:00 +0000", "title": "Creatbot Util", "description": "Various utility functions to make OctoPrint work better with Creatbot printers.", "archive": "https://github.com/kForth/OctoPrint-CreatbotUtil/archive/main.zip", "author": "Kestin Goforth", "homepage": "https://github.com/kForth/OctoPrint-CreatbotUtil", "page": "https://plugins.octoprint.org/plugins/CreatbotUtil/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint-CreatbotUtil v1.2.0", "date": "2022-09-19 15:12:51 +0000", "tag": "1.2.0"}, "releases": 4, "last_push": "2023-01-25 16:06:45 +0000", "stars": 3, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 13, "install_events_week": 0}}, {"id": "psucontrol_espurna", "published": "2022-06-21 00:00:00 +0000", "title": "Octoprint-PSUControl-ESPurna", "description": "Plugin to control devices with ESPurna firmware", "archive": "https://github.com/luismanson/Octoprint-PSUControl-ESPurna/archive/master.zip", "author": "Luis Diaz", "homepage": "https://github.com/luismanson/Octoprint-PSUControl-ESPurna", "page": "https://plugins.octoprint.org/plugins/psucontrol_espurna/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v0.1.3", "date": "2022-06-22 23:40:42 +0000", "tag": "v0.1.3"}, "releases": 3, "last_push": "2022-06-22 23:20:11 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 5, "install_events_month": 2, "instances_week": 3, "install_events_week": 0}}, {"id": "persist_terminal_command_history", "published": "2022-07-17 00:00:00 +0000", "title": "OctoPrint-PersistTerminalCommandHistory", "description": "Persist terminal command history across reloads", "archive": "https://github.com/nivekmai/OctoPrint-PersistTerminalCommandHistory/archive/master.zip", "author": "Kevin Christensen", "homepage": "https://github.com/nivekmai/OctoPrint-PersistTerminalCommandHistory", "page": "https://plugins.octoprint.org/plugins/persist_terminal_command_history/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2022-07-19 05:21:59 +0000", "tag": "0.2.0"}, "releases": 2, "last_push": "2022-07-20 13:40:07 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 165, "install_events_month": 15, "instances_week": 125, "install_events_week": 2}}, {"id": "autoprint", "published": "2022-07-21 00:00:00 +0000", "title": "OctoPrint-Autoprint", "description": "Tool to automatically start the printer and prints remotely", "archive": "https://github.com/chof747/octoprint-autoprint/archive/master.zip", "author": "Christian Hofbauer", "homepage": "https://github.com/chof747/octoprint-autoprint", "page": "https://plugins.octoprint.org/plugins/autoprint/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autoprint/featured_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Energy Saving Options", "date": "2022-10-08 06:35:46 +0000", "tag": "1.1.0"}, "releases": 8, "last_push": "2022-10-08 06:33:12 +0000", "stars": 2, "issues": {"open": 3, "closed": 4}}, "stats": {"instances_month": 90, "install_events_month": 6, "instances_week": 70, "install_events_week": 3}}, {"id": "sdwire", "published": "2022-07-24 00:00:00 +0000", "title": "OctoPrint-Sdwire", "description": "Fast file upload to SD card using sdwire hardware", "archive": "https://github.com/arekm/OctoPrint-Sdwire/archive/master.zip", "author": "Arkadiusz Mi\u015bkiewicz", "homepage": "https://github.com/arekm/OctoPrint-Sdwire", "page": "https://plugins.octoprint.org/plugins/sdwire/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/sdwire/sdwire-hw.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2022-10-03 16:28:56 +0000", "tag": "0.1.5"}, "releases": 6, "last_push": "2022-10-03 16:19:50 +0000", "stars": 6, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 27, "install_events_month": 5, "instances_week": 19, "install_events_week": 0}}, {"id": "mkswifisdcard", "published": "2022-08-01 00:00:00 +0000", "title": "OctoPrint-mkswifisdcard", "description": "Octoprint plugin for fast upload file to SD-card over MKS WiFi module", "archive": "https://github.com/om2804/octoprint_mkswifisdcard/archive/main.zip", "author": "om2804", "homepage": "https://github.com/om2804/octoprint_mkswifisdcard", "page": "https://plugins.octoprint.org/plugins/mkswifisdcard/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mkswifisdcard/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2022-08-16 15:38:29 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2022-08-16 15:31:59 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 89, "install_events_month": 8, "instances_week": 54, "install_events_week": 1}}, {"id": "prusammu", "published": "2022-08-01 00:00:00 +0000", "title": "Prusa MMU", "description": "This plugin adds Prusa MMU support to OctoPrint. The active filament will be displayed in the navbar and you will be prompted to select which filament to use when slicing in \"MMU Single\" mode. Other settings are available to name each tool and set defaults. This plugin only works for Prusa printers with an MMU. Supports MMU firmware 1.X.X and 3.X.X.", "archive": "https://github.com/jukebox42/Octoprint-PrusaMMU/releases/latest/download/Octoprint-PrusaMmu.zip", "author": "jukebox42", "homepage": "https://github.com/jukebox42/Octoprint-PrusaMMU", "page": "https://plugins.octoprint.org/plugins/prusammu/", "compatibility": {"octoprint": ["1.8.0", "1.8.1"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prusammu/nav.png", "abandoned": false, "github": {"latest_release": {"name": "2023.10.29", "date": "2023-10-29 22:41:32 +0000", "tag": "2023.10.29"}, "releases": 18, "last_push": "2023-10-29 22:36:26 +0000", "stars": 10, "issues": {"open": 3, "closed": 20}}, "stats": {"instances_month": 845, "install_events_month": 92, "instances_week": 643, "install_events_week": 19}}, {"id": "karmen", "published": "2022-08-15 00:00:00 +0000", "title": "Karmen Connector", "description": "Secured 3D printer monitoring and sharing. G-codes and user management. Schedule print jobs, view print history and timelapse videos. FREE!", "archive": "https://github.com/fragaria/karmen-octoprint-plugin/archive/refs/heads/main.zip", "author": "Pavel Vojacek", "homepage": "https://github.com/fragaria/karmen-octoprint-plugin", "privacypolicy": "https://karmen.tech/documents/fragaria-privacy-policy.pdf", "page": "https://plugins.octoprint.org/plugins/karmen/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/karmen/versionA.png", "abandoned": false, "github": {"latest_release": {"name": "0.8.0", "date": "2023-11-28 09:50:36 +0000", "tag": "0.8.0"}, "releases": 25, "last_push": "2023-11-28 09:48:34 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 85, "install_events_month": 8, "instances_week": 50, "install_events_week": 2}}, {"id": "HeaderAnnouncements", "published": "2022-09-12 00:00:00 +0000", "title": "OctoPrint-HeaderAnnouncements", "description": "Add an announcement to the header of your octoprint install for use in a shared environment", "archive": "https://github.com/wwsean08/OctoPrint-HeaderAnnouncements/archive/main.zip", "author": "Sean Smith", "homepage": "https://github.com/wwsean08/OctoPrint-HeaderAnnouncements", "page": "https://plugins.octoprint.org/plugins/HeaderAnnouncements/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/HeaderAnnouncements/announcement.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-09-17 20:58:04 +0000", "tag": "v0.1.1"}, "releases": 4, "last_push": "2022-09-17 20:57:38 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 28, "install_events_month": 1, "instances_week": 25, "install_events_week": 0}}, {"id": "nexus_ai", "published": "2022-09-29 00:00:00 +0000", "title": "Octoprint Nexus AI", "description": "Nexus AI was oriniall developed for Sentry Pro to detect print failure. Fiberpunk make it free and accessible to as many 3D printer users as possible.", "archive": "https://github.com/fiberpunk1/OctoPrint-Nexus-AI/archive/master.zip", "author": "Fiberpunk team", "homepage": "https://fiber-punk.com/pages/nexusai", "page": "https://plugins.octoprint.org/plugins/nexus_ai/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/nexus_ai/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2022-10-02 23:15:26 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2022-11-28 15:51:16 +0000", "stars": 79, "issues": {"open": 7, "closed": 4}}, "stats": {"instances_month": 388, "install_events_month": 16, "instances_week": 261, "install_events_week": 3}}, {"id": "SmartABL", "published": "2022-12-29 00:00:00 +0000", "title": "SmartABL", "description": "Plugin designed to expedite your 3D printing process. It smartly reduces unnecessary Auto Bed Leveling (ABL) actions", "archive": "https://github.com/scmanjarrez/OctoPrint-SmartABL/archive/master.zip", "author": "scmanjarrez", "homepage": "https://github.com/scmanjarrez/OctoPrint-SmartABL", "page": "https://plugins.octoprint.org/plugins/SmartABL/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SmartABL/settings.png", "abandoned": false, "github": {"latest_release": {"name": "SmartABL 1.2.2", "date": "2023-06-25 22:52:03 +0000", "tag": "1.2.2"}, "releases": 28, "last_push": "2024-01-01 03:17:24 +0000", "stars": 10, "issues": {"open": 2, "closed": 20}}, "stats": {"instances_month": 591, "install_events_month": 53, "instances_week": 433, "install_events_week": 8}}, {"id": "esp32camUI", "published": "2023-01-04 00:00:00 +0000", "title": "OctoPrint-Esp32CamUI", "description": "Extend the interface of the ESP32-CAM into the OctoPrint interface.", "archive": "https://github.com/CyberSensei1/OctoPrint-Esp32CamUI/archive/main.zip", "author": "CyberSensei", "homepage": "https://github.com/CyberSensei1/OctoPrint-Esp32CamUI", "page": "https://plugins.octoprint.org/plugins/esp32camUI/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/esp32camUI/Tab_ScreenShot.jpg", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint-Esp32CamUI v0.1.0", "date": "2023-01-04 06:31:45 +0000", "tag": "v0.1.0"}, "releases": 1, "last_push": "2023-01-04 06:33:21 +0000", "stars": 11, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 250, "install_events_month": 24, "instances_week": 162, "install_events_week": 6}}, {"id": "onedrive_files", "published": "2023-01-07 00:00:00 +0000", "title": "OneDrive File Sync", "description": "Automatically sync your OctoPrint files with OneDrive", "archive": "https://github.com/cp2004/OctoPrint-OneDriveFileSync/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-OneDriveFileSync", "page": "https://plugins.octoprint.org/plugins/onedrive_files/", "compatibility": {"octoprint": ["1.6.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/onedrive_files/config-3.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6 Stable Release", "date": "2023-04-05 21:53:24 +0000", "tag": "1.0.6"}, "releases": 11, "last_push": "2023-12-27 13:00:33 +0000", "stars": 5, "issues": {"open": 5, "closed": 15}}, "stats": {"instances_month": 339, "install_events_month": 24, "instances_week": 240, "install_events_week": 2}}, {"id": "MacroSteps", "published": "2023-01-11 00:00:00 +0000", "title": "OctoPrint-MacroSteps", "description": "A plugin that shows a step by step any print start macro.", "archive": "https://github.com/SinisterRj/OctoPrint-MacroSteps/archive/main.zip", "author": "Rodrigo C. C. Silva", "homepage": "https://github.com/SinisterRj/OctoPrint-MacroSteps", "page": "https://plugins.octoprint.org/plugins/MacroSteps/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MacroSteps/MSfeatured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2023-01-22 11:21:22 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-15 18:27:28 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 174, "install_events_month": 6, "instances_week": 118, "install_events_week": 0}}, {"id": "powerfailure", "published": "2023-01-23 00:00:00 +0000", "title": "OctoPrint-PowerFailure", "description": "This plugin attempts to recover a print after a power failure or printer disconnect.", "archive": "https://github.com/pablogventura/OctoPrint-PowerFailure/archive/master.zip", "author": "Pablo Ventura, Paul Paukstelis", "homepage": "https://github.com/pablogventura/OctoPrint-PowerFailure", "page": "https://plugins.octoprint.org/plugins/powerfailure/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.2.1", "date": "2023-06-08 10:14:08 +0000", "tag": "1.2.1"}, "releases": 12, "last_push": "2023-06-08 10:09:46 +0000", "stars": 27, "issues": {"open": 9, "closed": 17}}, "stats": {"instances_month": 5472, "install_events_month": 301, "instances_week": 3789, "install_events_week": 67}}, {"id": "influxdb2", "published": "2023-03-04 00:00:00 +0000", "title": "InfluxDB2", "description": "Push Metrics to InfluxDB 2.0+", "archive": "https://gitlab.com/moltenbytes32/octoprint-influxdb2/-/archive/master/octoprint-influxdb2-master.zip", "author": "MoltenBytes", "homepage": "https://gitlab.com/moltenbytes32/octoprint-influxdb2", "page": "https://plugins.octoprint.org/plugins/influxdb2/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/influxdb2/thumbnail.jpg", "abandoned": false, "stats": {"instances_month": 118, "install_events_month": 4, "instances_week": 72, "install_events_week": 1}}, {"id": "turn_off_heat_on_pause_timer", "published": "2023-03-16 00:00:00 +0000", "title": "OctoPrint-TurnOffHeatOnPauseTimer", "description": "Enables setting a timer for how long after the printer is paused that it should turn off hotend, heatbed and/or chamber.", "archive": "https://github.com/Argon2000/OctoPrint-TurnOffHeatOnPauseTimer/archive/master.zip", "author": "Per \u00c5strand", "homepage": "https://github.com/Argon2000/OctoPrint-TurnOffHeatOnPauseTimer", "page": "https://plugins.octoprint.org/plugins/turn_off_heat_on_pause_timer/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/turn_off_heat_on_pause_timer/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2023-03-18 14:15:41 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2023-03-18 08:16:10 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 135, "install_events_month": 4, "instances_week": 99, "install_events_week": 0}}, {"id": "ssd1306_oled_display", "published": "2023-03-25 00:00:00 +0000", "title": "SSD1306 OLED Display", "description": "Use a 128x32 SSD1306-based display to display printer and job status for OctoPrint.", "archive": "https://github.com/fredrikbaberg/OctoPrint-SSD1306/archive/main.zip", "author": "Fredrik Baberg", "homepage": "https://github.com/fredrikbaberg/OctoPrint-SSD1306", "page": "https://plugins.octoprint.org/plugins/ssd1306_oled_display/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ssd1306_oled_display/pioled.jpg", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2023-03-25 19:23:33 +0000", "tag": "0.1.4"}, "releases": 12, "last_push": "2023-05-02 06:40:58 +0000", "stars": 4, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 42, "install_events_month": 7, "instances_week": 25, "install_events_week": 4}}, {"id": "psucontrol_fhem", "published": "2023-04-18 00:00:00 +0000", "title": "PSU Control - FHEM", "description": "Adds FHEM support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/nils-org/OctoPrint-PSUControl-FHEM/archive/main.zip", "author": "Nils Andresen", "homepage": "https://github.com/nils-org/OctoPrint-PSUControl-FHEM", "page": "https://plugins.octoprint.org/plugins/psucontrol_fhem/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_fhem/fhem-settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2023-04-17 18:55:58 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2023-04-17 18:50:15 +0000", "stars": 0, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 12, "install_events_month": 2, "instances_week": 9, "install_events_week": 0}}, {"id": "webcamextras", "published": "2023-04-22 00:00:00 +0000", "title": "Webcam extras", "description": "Zoom, fullscreen and minimize the webcam view", "archive": "https://github.com/poulou0/OctoPrint-WebcamExtras/archive/refs/heads/main.zip", "author": "poulou", "homepage": "https://github.com/poulou0/OctoPrint-WebcamExtras", "page": "https://plugins.octoprint.org/plugins/webcamextras/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/webcamextras/default_theme.jpg", "abandoned": false, "github": {"latest_release": {"name": "Integration dashboard + multicam", "date": "2023-07-20 14:09:20 +0000", "tag": "0.0.11"}, "releases": 10, "last_push": "2023-09-19 09:55:36 +0000", "stars": 10, "issues": {"open": 1, "closed": 9}}, "stats": {"instances_month": 3211, "install_events_month": 264, "instances_week": 2166, "install_events_week": 47}}, {"id": "timelapseplus", "published": "2023-04-24 00:00:00 +0000", "title": "Timelapse+", "description": "Timelapse+ is a powerful yet lightweight plugin to stabilize, capture, enhance and render your print timelapses.", "archive": "https://github.com/cmuche/octoprint-timelapseplus/archive/master.zip", "author": "Christoph Muche", "homepage": "https://github.com/cmuche/octoprint-timelapseplus", "page": "https://plugins.octoprint.org/plugins/timelapseplus/", "compatibility": {"octoprint": ["1.8.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "CC BY-ND", "image": "https://plugins.octoprint.org/assets/img/plugins/timelapseplus/logo.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.1", "date": "2023-07-02 14:22:42 +0000", "tag": "1.4.1"}, "releases": 9, "last_push": "2023-07-02 14:11:41 +0000", "stars": 24, "issues": {"open": 19, "closed": 68}}, "stats": {"instances_month": 1231, "install_events_month": 124, "instances_week": 764, "install_events_week": 23}}, {"id": "connectandprint", "published": "2023-04-26 00:00:00 +0000", "title": "Connect And Print", "description": "Automatically connect to your printer and start the print job on file upload", "archive": "https://raw.githubusercontent.com/Maxinger15/connectandprint/master/connectandprint.py", "author": "Max Grallinger", "homepage": "https://github.com/Maxinger15/connectandprint", "page": "https://plugins.octoprint.org/plugins/connectandprint/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2023-05-25 14:20:01 +0000", "tag": "1.2.0"}, "releases": 3, "last_push": "2023-08-06 18:01:42 +0000", "stars": 5, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 382, "install_events_month": 16, "instances_week": 226, "install_events_week": 4}}, {"id": "siocontrol", "published": "2023-05-02 00:00:00 +0000", "title": "SIO Control", "description": "Serial IO Control, an alterative way to control locally connected IO. Works on any device(PC,SBC) and OS that supports OctoPrint including Windows.", "archive": "https://github.com/jcassel/OctoPrint-Siocontrol/archive/main.zip", "author": "jcassel", "homepage": "https://github.com/jcassel/OctoPrint-Siocontrol", "page": "https://plugins.octoprint.org/plugins/siocontrol/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/siocontrol/SideBarExample.PNG", "abandoned": false, "github": {"latest_release": {"name": "v1.0.2", "date": "2024-04-08 22:35:32 +0000", "tag": "v1.0.2"}, "releases": 9, "last_push": "2024-04-08 22:30:07 +0000", "stars": 10, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 111, "install_events_month": 8, "instances_week": 50, "install_events_week": 3}}, {"id": "marlinslider", "published": "2023-05-20 00:00:00 +0000", "title": "Marlin Slider Controls", "description": "Control your fans, feedrate and flowrate in Marlinfw Version 2+.", "archive": "https://github.com/CmdrCody51/OctoPrint-MarlinSlider/archive/main.zip", "author": "CmdrCody51", "homepage": "https://github.com/CmdrCody51/OctoPrint-MarlinSlider", "page": "https://plugins.octoprint.org/plugins/marlinslider/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/marlinslider/slider-tools.png", "abandoned": false, "github": {"latest_release": {"name": "Fixed - Again", "date": "2024-03-07 03:28:18 +0000", "tag": "v0.3.1"}, "releases": 6, "last_push": "2024-03-07 03:20:43 +0000", "stars": 2, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 2150, "install_events_month": 102, "instances_week": 1062, "install_events_week": 24}}, {"id": "cmdexec", "published": "2023-06-13 00:00:00 +0000", "title": "Cmd exec", "description": "Execute bash commands from Octoprint's UI", "archive": "https://github.com/Chargnn/Octoprint-CmdExec/archive/master.zip", "author": "Alexis Coulombe", "homepage": "https://github.com/Chargnn/Octoprint-CmdExec/", "page": "https://plugins.octoprint.org/plugins/cmdexec/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2023-06-30 00:57:21 +0000", "tag": "1.0.6"}, "releases": 6, "last_push": "2023-06-30 00:56:47 +0000", "stars": 6, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 272, "install_events_month": 33, "instances_week": 178, "install_events_week": 9}}, {"id": "octolightHA", "published": "2023-07-04 00:00:00 +0000", "title": "OctoLight Home Assistant", "description": "Adds a button to the navbar, toggling a Home Assistant controlled light. Forked off of OctoLight by \u017diga Kralj", "archive": "https://github.com/mark-bloom/OctoLight_Home-Assistant/archive/master.zip", "author": "Mark Bloom", "homepage": "https://github.com/mark-bloom/OctoLight_Home-Assistant", "page": "https://plugins.octoprint.org/plugins/octolightHA/", "compatibility": {"octoprint": ["0.0.1"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octolightHA/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.0.4 update: add configuration settings", "date": "2023-10-26 01:44:01 +0000", "tag": "v0.0.4"}, "releases": 4, "last_push": "2024-01-02 01:20:51 +0000", "stars": 5, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 307, "install_events_month": 43, "instances_week": 238, "install_events_week": 15}}, {"id": "Wattometer", "published": "2023-07-17 00:00:00 +0000", "title": "Wattometer", "description": "Get an overview of the used power for a print via FRITZ!DECT 200.", "archive": "https://github.com/RealTryZ/Wattometer/archive/master.zip", "author": "Pascal Witt", "homepage": "https://github.com/RealTryZ/Wattometer", "page": "https://plugins.octoprint.org/plugins/Wattometer/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Wattometer/Wattometer_Settings.png", "abandoned": false, "github": {"latest_release": {"name": "v0.4.0 Major Release", "date": "2023-10-25 17:06:54 +0000", "tag": "v0.4.0"}, "releases": 6, "last_push": "2023-10-25 17:04:07 +0000", "stars": 2, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 155, "install_events_month": 12, "instances_week": 104, "install_events_week": 3}}, {"id": "FileDescription", "published": "2023-08-23 00:00:00 +0000", "title": "FileDescription", "description": "Adds description and searchable tags entries to all files in the file manager.", "archive": "https://github.com/larsjuhw/Octoprint-FileDescription/archive/master.zip", "author": "Larsjuhw", "homepage": "https://github.com/larsjuhw/Octoprint-FileDescription", "page": "https://plugins.octoprint.org/plugins/FileDescription/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/FileDescription/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.2", "date": "2023-09-17 15:18:30 +0000", "tag": "0.1.2"}, "releases": 7, "last_push": "2023-09-17 15:16:25 +0000", "stars": 1, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 454, "install_events_month": 16, "instances_week": 365, "install_events_week": 4}}, {"id": "bedcheckai", "published": "2023-09-18 00:00:00 +0000", "title": "OctoPrint-BedCheckAI", "description": "Detects the print bed in the camera frame. Useful for automation and smarter printing", "archive": "https://github.com/printpal-io/OctoPrint-BedCheckAI/archive/master.zip", "author": "printpal.io", "homepage": "https://printpal.io", "page": "https://plugins.octoprint.org/plugins/bedcheckai/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/bedcheckai/tools.jpg", "abandoned": false, "github": {"last_push": "2024-02-06 22:39:41 +0000", "stars": 7, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 427, "install_events_month": 65, "instances_week": 312, "install_events_week": 17}}, {"id": "ActivatePrusaHostTimer", "published": "2023-12-01 00:00:00 +0000", "title": "Activate Prusa HostTimer", "description": "OctoPrint plugin to activate Prusa host features.", "archive": "https://github.com/sarusani/OctoPrint-ActivatePrusaHostTimer/archive/master.zip", "author": "sarusani", "homepage": "https://github.com/sarusani/OctoPrint-ActivatePrusaHostTimer", "page": "https://plugins.octoprint.org/plugins/ActivatePrusaHostTimer/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2023-12-28 18:00:29 +0000", "tag": "1.1.0"}, "releases": 12, "last_push": "2023-12-28 17:59:47 +0000", "stars": 7, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 210, "install_events_month": 19, "instances_week": 162, "install_events_week": 5}}, {"id": "bgcode", "published": "2023-12-06 00:00:00 +0000", "title": "BGCode", "description": "Adds bgcode support provided in PrusaSlicer version 2.7.0+", "archive": "https://github.com/jneilliii/OctoPrint-BGCode/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BGCode", "page": "https://plugins.octoprint.org/plugins/bgcode/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2023-11-26 18:44:21 +0000", "tag": "0.2.0"}, "releases": 2, "last_push": "2024-03-02 19:00:50 +0000", "stars": 9, "issues": {"open": 1, "closed": 11}}, "stats": {"instances_month": 836, "install_events_month": 140, "instances_week": 688, "install_events_week": 30}}, {"id": "psucontrol_momentarygpio", "published": "2023-12-07 00:00:00 +0000", "title": "OctoPrint-PSUControl-MomentaryGpio", "description": "A sub-plugin for PSUControl. Adds a momentary option to PSUControl power controls that sends a signal for a brief time rather than continuous. Useful for bistable relays.", "archive": "https://github.com/irotsoma/OctoPrint-PSUControl-MomentaryGpio/archive/master.zip", "author": "Justin Zak", "homepage": "https://github.com/irotsoma/OctoPrint-PSUControl-MomentaryGpio", "page": "https://plugins.octoprint.org/plugins/psucontrol_momentarygpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_momentarygpio/momentarygpio_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.1", "date": "2024-02-02 22:15:36 +0000", "tag": "v1.0.1"}, "releases": 2, "last_push": "2024-02-02 22:13:41 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 22, "install_events_month": 6, "instances_week": 15, "install_events_week": 2}}, {"id": "xmpp_plugin", "published": "2023-12-27 00:00:00 +0000", "title": "XMPP Plugin", "description": "Sends print progress notifications over xmpp", "archive": "https://github.com/tobser/octoprint-xmpp-plugin/archive/main.zip", "author": "Tobias Sachs", "homepage": "https://github.com/tobser/octoprint-xmpp-plugin", "page": "https://plugins.octoprint.org/plugins/xmpp_plugin/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/xmpp_plugin/xmpp-plugin-configuration.png", "abandoned": false, "github": {"last_push": "2023-12-27 21:32:12 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 20, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "mqttchambertemperature", "published": "2024-01-02 00:00:00 +0000", "title": "MQTT Chamber Temperature", "description": "Enables Chamber temperature reporting via subscribing to an MQTT topic", "archive": "https://github.com/synman/OctoPrint-MqttChamberTemperature/archive/master.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-MqttChamberTemperature", "page": "https://plugins.octoprint.org/plugins/mqttchambertemperature/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "WTFPL", "image": "https://plugins.octoprint.org/assets/img/plugins/mqttchambertemperature/toptemp.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.3", "date": "2024-05-04 19:09:07 +0000", "tag": "0.0.3"}, "releases": 6, "last_push": "2024-05-04 19:07:22 +0000", "stars": 1, "issues": {"open": 2, "closed": 2}}, "stats": {"instances_month": 62, "install_events_month": 9, "instances_week": 46, "install_events_week": 4}}, {"id": "api_notifications", "published": "2024-01-21 00:00:00 +0000", "title": "API Notifications", "description": "Adds an API endpoint which allows you to send notification pop-ups to the OctoPrint interface from scripts", "archive": "https://github.com/edekeijzer/OctoPrint-API-Notifications/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-API-Notifications", "page": "https://plugins.octoprint.org/plugins/api_notifications/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2024-01-21 11:22:17 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 34, "install_events_month": 6, "instances_week": 32, "install_events_week": 2}}, {"id": "filamentbuddy", "published": "2024-01-21 00:00:00 +0000", "title": "FilamentBuddy", "description": "This plugin implements three features, filament change buttons, filament sensor manager and filament remover when the print is completed.", "archive": "https://github.com/danieleborgo/OctoPrint-FilamentBuddy/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-FilamentBuddy", "page": "https://plugins.octoprint.org/plugins/filamentbuddy/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux", "windows"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filamentbuddy/fc_simplified.png", "abandoned": false, "github": {"latest_release": {"name": "FilamentBuddy 0.1.0", "date": "2024-02-20 21:44:21 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2024-02-15 21:18:50 +0000", "stars": 1, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 399, "install_events_month": 66, "instances_week": 301, "install_events_week": 14}}, {"id": "pause_management", "published": "2024-01-22 00:00:00 +0000", "title": "Pause Management", "description": "Plugin allowing to ignore upcoming pauses in gcode or add additional pauses while printing.", "archive": "https://github.com/jneilliii/OctoPrint-PauseManagement/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PauseManagement", "page": "https://plugins.octoprint.org/plugins/pause_management/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pause_management/screenshot_sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.4", "date": "2023-12-21 02:24:11 +0000", "tag": "0.0.4"}, "releases": 4, "last_push": "2024-04-12 03:11:58 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 249, "install_events_month": 36, "instances_week": 194, "install_events_week": 4}}, {"id": "camerastreamer_control", "published": "2024-02-01 00:00:00 +0000", "title": "Camera-Streamer Control", "description": "Make use of smooth, low-latency, low-bandwidth WebRTC streams from the OctoPi 'New camera stack'", "archive": "https://github.com/cp2004/OctoPrint-CameraStreamer-Control/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-CameraStreamer-Control", "page": "https://plugins.octoprint.org/plugins/camerastreamer_control/", "compatibility": {"octoprint": ["1.9.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 Initial Release", "date": "2024-02-01 17:05:47 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2024-02-01 17:05:40 +0000", "stars": 17, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 902, "install_events_month": 261, "instances_week": 637, "install_events_week": 75}}, {"id": "SIOReaction", "published": "2024-02-11 00:00:00 +0000", "title": "SIO Reaction", "description": "Sub Plugin for SIO Control. Create Reactions to changes in IO, GCode, and more.", "archive": "https://github.com/jcassel/OctoPrint-SIOReaction/archive/main.zip", "author": "jcassel", "homepage": "https://github.com/jcassel/OctoPrint-SIOReaction", "page": "https://plugins.octoprint.org/plugins/SIOReaction/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SIOReaction/SettingsExample.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.6, update to documentation.", "date": "2024-04-08 17:00:49 +0000", "tag": "v0.1.6"}, "releases": 6, "last_push": "2024-04-08 16:59:37 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 12, "install_events_month": 5, "instances_week": 8, "install_events_week": 2}}, {"id": "Nozzle_Filament_Validator", "published": "2024-02-26 00:00:00 +0000", "title": "OctoPrint-Nozzle-Filament-Validator", "description": "Validate nozzle size and filament type before starting a print.", "archive": "https://github.com/Rylan-Meilutis/OctoPrint-Nozzle-Filament-Validator/archive/master.zip", "author": "Rylan Meilutis", "homepage": "https://github.com/Rylan-Meilutis/OctoPrint-Nozzle-Filament-Validator", "page": "https://plugins.octoprint.org/plugins/Nozzle_Filament_Validator/", "compatibility": {"octoprint": ["1.9.3"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Nozzle_Filament_Validator/settings_page.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.1", "date": "2024-05-02 04:13:54 +0000", "tag": "v3.1.1"}, "releases": 20, "last_push": "2024-05-02 04:07:48 +0000", "stars": 1, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 95, "install_events_month": 17, "instances_week": 70, "install_events_week": 3}}, {"id": "PrusaResetMode", "published": "2024-03-01 00:00:00 +0000", "title": "Prusa Reset Mode", "description": "A simple plugin to prevent your Prusa printer from resetting when OctoPrint connects", "archive": "https://github.com/jacopotediosi/OctoPrint-PrusaResetMode/archive/main.zip", "author": "Jacopo Tediosi", "homepage": "https://github.com/jacopotediosi/Octoprint-PrusaResetMode", "page": "https://plugins.octoprint.org/plugins/PrusaResetMode/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/PrusaResetMode/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.1", "date": "2024-03-04 10:08:38 +0000", "tag": "v0.1.1"}, "releases": 2, "last_push": "2024-03-04 09:58:34 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 410, "install_events_month": 111, "instances_week": 314, "install_events_week": 22}}, {"id": "zupfe", "published": "2024-03-03 00:00:00 +0000", "title": "OctoPrint-Zupfe", "description": "A plugin for octoprint that allows you to see in real time print jobs in ZupFe, the interactive online gcode viewer. View gcode content and interact with the 3d model to find the exact command of any extrusion.", "archive": "https://github.com/glennerichall/OctoPrint-Zupfe/archive/master.zip", "author": "Glenn Hall", "homepage": "https://zupfe.velor.ca", "page": "https://plugins.octoprint.org/plugins/zupfe/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/zupfe/img_3.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.2", "date": "2024-04-23 20:38:07 +0000", "tag": "v0.1.2"}, "releases": 1, "last_push": "2024-04-23 19:59:58 +0000", "stars": 2, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 152, "install_events_month": 41, "instances_week": 108, "install_events_week": 4}}, {"id": "pinozcam", "published": "2024-03-06 00:00:00 +0000", "title": "OctoPrint-PiNozCam", "description": "AI-driven FREE monitoring for 3D print failures using Pi Arm CPU.", "archive": "https://github.com/DrAlexLiu/OctoPrint-PiNozCam/archive/master.zip", "author": "DrAlexLiu", "homepage": "https://github.com/DrAlexLiu/OctoPrint-PiNozCam", "page": "https://plugins.octoprint.org/plugins/pinozcam/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.0.1", "date": "2024-03-31 18:49:18 +0000", "tag": "v1.0.1"}, "releases": 2, "last_push": "2024-04-15 06:01:05 +0000", "stars": 22, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 140, "install_events_month": 73, "instances_week": 92, "install_events_week": 11}}, {"id": "jogwheel", "published": "2024-03-25 00:00:00 +0000", "title": "Jog Wheel Control", "description": "Replaces the control tab axis buttons with a jog wheel interface.", "archive": "https://github.com/jneilliii/OctoPrint-JogWheelControl/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-JogWheelControl", "page": "https://plugins.octoprint.org/plugins/jogwheel/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/jogwheel/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2", "date": "2024-03-27 04:26:40 +0000", "tag": "0.0.2"}, "releases": 2, "last_push": "2024-03-27 04:25:42 +0000", "stars": 1, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 488, "install_events_month": 235, "instances_week": 350, "install_events_week": 26}}, {"id": "Spoolman", "published": "2024-04-27 00:00:00 +0000", "title": "octoprint-spoolman", "description": "Plugin integrating OctoPrint with Spoolman, a universal filament spools inventory manager.", "archive": "https://github.com/mdziekon/octoprint-spoolman/archive/master.zip", "author": "Micha\u0142 Dzieko\u0144ski (mdziekon)", "homepage": "https://github.com/mdziekon/octoprint-spoolman", "page": "https://plugins.octoprint.org/plugins/Spoolman/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Spoolman/showcase__selected_spools.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.2", "date": "2024-05-03 19:44:49 +0000", "tag": "1.1.2"}, "releases": 7, "last_push": "2024-05-03 19:43:12 +0000", "stars": 5, "issues": {"open": 5, "closed": 20}}, "stats": {"instances_month": 216, "install_events_month": 212, "instances_week": 172, "install_events_week": 108}}]
\ No newline at end of file
diff --git a/template-old/backup/octoprint/octoprint/data/preemptive_cache_config.yaml b/template-old/backup/octoprint/octoprint/data/preemptive_cache_config.yaml
deleted file mode 100644
index ed26b84..0000000
--- a/template-old/backup/octoprint/octoprint/data/preemptive_cache_config.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-/:
-- _count: 21
- _timestamp: 1715267200.7118652
- base_url: http://localhost:50136/
- path: /
- query_string: l10n=en
diff --git a/template-old/backup/octoprint/octoprint/data/softwareupdate/versioncache.yaml b/template-old/backup/octoprint/octoprint/data/softwareupdate/versioncache.yaml
deleted file mode 100644
index 245c02a..0000000
--- a/template-old/backup/octoprint/octoprint/data/softwareupdate/versioncache.yaml
+++ /dev/null
@@ -1,73 +0,0 @@
-__version: 1.10.0
-bambu_printer:
- available: false
- compatible: true
- disabled: false
- error: null
- hash: c5c2a267896bf792143ac3aac05223f7
- information:
- local:
- name: 0.0.18
- value: 0.0.18
- needs_online: true
- remote:
- name: 0.0.18
- release_notes: https://github.com/jneilliii/OctoPrint-BambuPrinter/releases/tag/0.0.18
- value: 0.0.18
- online: true
- possible: true
- timestamp: 1715253505.066055
-file_check:
- available: false
- compatible: true
- disabled: false
- error: null
- hash: f595880f4ef52d3ad09769ae10d6157f
- information:
- local:
- name: 2024.3.27
- value: 2024.3.27
- needs_online: true
- remote:
- name: 2024.3.27
- release_notes: https://github.com/OctoPrint/OctoPrint-FileCheck/releases/tag/2024.3.27
- value: 2024.3.27
- online: true
- possible: true
- timestamp: 1715245191.0575087
-firmware_check:
- available: false
- compatible: true
- disabled: false
- error: null
- hash: 2cc0c5c664767763a036f68d2318d063
- information:
- local:
- name: 2021.10.11
- value: 2021.10.11
- needs_online: true
- remote:
- name: 2021.10.11
- release_notes: https://github.com/OctoPrint/OctoPrint-FirmwareCheck/releases/tag/2021.10.11
- value: 2021.10.11
- online: true
- possible: true
- timestamp: 1715245191.0564404
-octoprint:
- available: false
- compatible: true
- disabled: false
- error: null
- hash: b188a004c8f9dfd4213157c84536db06
- information:
- local:
- name: 1.10.0
- value: 1.10.0
- needs_online: true
- remote:
- name: 1.10.0
- release_notes: https://github.com/OctoPrint/OctoPrint/releases/tag/1.10.0
- value: 1.10.0
- online: true
- possible: true
- timestamp: 1715245191.0577404
diff --git a/template-old/backup/octoprint/octoprint/generated/webassets/packed_client.js b/template-old/backup/octoprint/octoprint/generated/webassets/packed_client.js
deleted file mode 100644
index 24fd3f4..0000000
--- a/template-old/backup/octoprint/octoprint/generated/webassets/packed_client.js
+++ /dev/null
@@ -1,202 +0,0 @@
-// source: js/app/client/base.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define("OctoPrintClient",["jquery","lodash"],factory);}else{global.OctoPrintClient=factory(global.$,global._);global.OctoPrint=new global.OctoPrintClient();}})(this,function($,_){var PluginRegistry=function(base){this.base=base;this.components={};};var OctoPrintClient=function(options){this.options=options||{baseurl:undefined,apikey:undefined,locale:undefined};this.components={};this.plugins=new PluginRegistry(this);};OctoPrintClient.registerComponent=function(name,component){Object.defineProperty(OctoPrintClient.prototype,name,{get:function(){if(this.components[name]!==undefined){return this.components[name];}
-var instance=new component(this);this.components[name]=instance;return instance;},enumerable:false,configurable:false});};OctoPrintClient.registerPluginComponent=function(name,component){Object.defineProperty(PluginRegistry.prototype,name,{get:function(){if(this.components[name]!==undefined){return this.components[name];}
-var instance=new component(this.base);this.components[name]=instance;return instance;},enumerable:false,configurable:false});};var noCache=function(opts){opts=opts||{};var params=$.extend({},opts);params.headers=$.extend({},params.headers||{});params.headers["Cache-Control"]="no-cache";return params;};var contentTypeJson=function(opts){opts=opts||{};var params=$.extend({},opts);params.contentType="application/json; charset=UTF-8";return params;};var contentTypeFalse=function(opts){opts=opts||{};var params=$.extend({},opts);params.contentType=false;return params;};var noProcessData=function(opts){opts=opts||{};var params=$.extend({},opts);params.processData=false;return params;};var replaceUndefinedWithNull=function(key,value){if(value===undefined){return null;}else{return value;}};OctoPrintClient.prototype.getBaseUrl=function(){var url=this.options.baseurl;if(!_.endsWith(url,"/")){url=url+"/";}
-return url;};OctoPrintClient.prototype.getParsedBaseUrl=function(location){if(!this.options.baseurl)return"";try{var url=new URL(this.options.baseurl);}catch(e){location=location||window.location;var parsed=new URL(location);var path=this.options.baseurl;if(!path||path[0]!=="/"){path="/"+(path?path:"");}
-var url=new URL(parsed.protocol+"//"+parsed.host+path);}
-return url;};OctoPrintClient.prototype.getCookieSuffix=function(){if(!this.options.baseurl)return"";var url=this.getParsedBaseUrl();var port=url.port||(url.protocol==="https:"?443:80);if(url.pathname&&url.pathname!=="/"){var path=url.pathname;if(path.endsWith("/")){path=path.substring(0,path.length-1);}
-return"_P"+port+"_R"+path.replace(/\//g,"|");}else{return"_P"+port;}};OctoPrintClient.prototype.getCookieName=function(name){return name+this.getCookieSuffix();};OctoPrintClient.prototype.getCookie=function(name){name=this.getCookieName(name);return("; "+document.cookie).split("; "+name+"=").pop().split(";")[0];};OctoPrintClient.prototype.getRequestHeaders=function(method,additional,opts){if(arguments.length<=1){if(!_.isString(method)){additional=method;console.warn("Calling OctoPrintClient.getRequestHeaders with additional "+"headers as the first parameter is deprecated. Please "+"consult the docs about the current signature and adjust "+"your code accordingly.");}}
-method=method||"GET";additional=additional||{};opts=opts||{};var headers=$.extend({},additional);if(this.options.apikey){headers["X-Api-Key"]=this.options.apikey;}else{var csrfToken=this.getCookie("csrf_token");if(!/^(GET|HEAD|OPTIONS)$/.test(method)&&csrfToken&&!opts.crossDomain){headers["X-CSRF-Token"]=csrfToken;}}
-if(this.options.locale!==undefined){headers["X-Locale"]=this.options.locale;}
-return headers;};OctoPrintClient.prototype.ajax=function(method,url,opts){opts=opts||{};method=opts.method||method||"GET";url=opts.url||url||"";var urlToCall=url;if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){urlToCall=this.getBaseUrl()+url;opts.url=urlToCall;}
-var headers=this.getRequestHeaders(method,opts.headers,opts);var params=$.extend({},opts);params.type=method;params.headers=headers;params.dataType=params.dataType||"json";return $.ajax(urlToCall,params);};OctoPrintClient.prototype.ajaxWithData=function(method,url,data,opts){opts=opts||{};var params=$.extend({},opts);params.data=data;return this.ajax(method,url,params);};OctoPrintClient.prototype.get=function(url,opts){return this.ajax("GET",url,opts);};OctoPrintClient.prototype.getWithQuery=function(url,data,opts){return this.ajaxWithData("GET",url,data,opts);};OctoPrintClient.prototype.post=function(url,data,opts){return this.ajaxWithData("POST",url,data,noCache(opts));};OctoPrintClient.prototype.postForm=function(url,data,opts){var form=new FormData();_.each(data,function(value,key){form.append(key,value);});return this.post(url,form,contentTypeFalse(noProcessData(opts)));};OctoPrintClient.prototype.postJson=function(url,data,opts){return this.post(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.put=function(url,data,opts){return this.ajaxWithData("PUT",url,data,noCache(opts));};OctoPrintClient.prototype.putJson=function(url,data,opts){return this.put(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.patch=function(url,data,opts){return this.ajaxWithData("PATCH",url,data,noCache(opts));};OctoPrintClient.prototype.patchJson=function(url,data,opts){return this.patch(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.delete=function(url,opts){return this.ajax("DELETE",url,opts);};OctoPrintClient.prototype.download=function(url,opts){var params=$.extend({},opts||{});params.dataType="text";return this.get(url,params);};OctoPrintClient.prototype.bulkDownloadUrl=function(url,files){return(url+"?"+
-_.map(files,function(f){return"files="+encodeURIComponent(f);}).join("&"));};OctoPrintClient.prototype.upload=function(url,file,filename,additional){additional=additional||{};var fileData;if(file instanceof jQuery){fileData=file[0].files[0];}else if(typeof file=="string"){fileData=$(file)[0].files[0];}else{fileData=file;}
-filename=filename||fileData.name;var filesize=fileData.size;var form=new FormData();form.append("file",fileData,filename);_.each(additional,function(value,key){form.append(key,value);});var deferred=$.Deferred();var request=new XMLHttpRequest();request.onreadystatechange=function(){if(request.readyState==4){deferred.notify({loaded:filesize,total:filesize});var success=(request.status>=200&&request.status<300)||request.status===304;var error,json,statusText;try{json=JSON.parse(request.response);statusText="success";}catch(e){success=false;error=e;statusText="parsererror";}
-if(success){deferred.resolve([json,statusText,request]);}else{if(!statusText){statusText=request.statusText;}
-deferred.reject([request,statusText,error]);}}};request.ontimeout=function(){deferred.reject([request,"timeout","Timeout"]);};request.upload.addEventListener("loadstart",function(e){deferred.notify({loaded:e.loaded,total:e.total});});request.upload.addEventListener("progress",function(e){deferred.notify({loaded:e.loaded,total:e.total});});request.upload.addEventListener("loadend",function(e){deferred.notify({loaded:e.loaded,total:e.total});});var method="POST";var headers=this.getRequestHeaders(method);var urlToCall=url;if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){urlToCall=this.getBaseUrl()+url;}
-request.open(method,urlToCall);_.each(headers,function(value,key){request.setRequestHeader(key,value);});request.send(form);return deferred.promise();};OctoPrintClient.prototype.issueCommand=function(url,command,payload,opts){payload=payload||{};var data=$.extend({},payload);data.command=command;return this.postJson(url,data,opts);};OctoPrintClient.prototype.getSimpleApiUrl=function(plugin){return"api/plugin/"+plugin;};OctoPrintClient.prototype.simpleApiGet=function(plugin,opts){return this.get(OctoPrintClient.prototype.getSimpleApiUrl(plugin),opts);};OctoPrintClient.prototype.simpleApiCommand=function(plugin,command,payload,opts){return this.issueCommand(OctoPrintClient.prototype.getSimpleApiUrl(plugin),command,payload,opts);};OctoPrintClient.prototype.getBlueprintUrl=function(plugin){return"plugin/"+plugin+"/";};OctoPrintClient.createRejectedDeferred=function(){var deferred=$.Deferred();deferred.reject(arguments);return deferred;};OctoPrintClient.createCustomException=function(name){var constructor;if(_.isFunction(name)){constructor=name;}else{constructor=function(message){this.name=name;this.message=message;this.stack=new Error().stack;};}
-constructor.prototype=Object.create(Error.prototype);constructor.prototype.constructor=constructor;return constructor;};OctoPrintClient.InvalidArgumentError=OctoPrintClient.createCustomException("InvalidArgumentError");OctoPrintClient.deprecated=function(deprecatedFct,newFct,fn){return function(){console.warn(deprecatedFct+" is deprecated, please use the new "+
-newFct+" function instead");return fn.apply(this,arguments);};};OctoPrintClient.deprecatedMethod=function(object,oldNamespace,oldFct,newNamespace,newFct,fn){object[oldFct]=OctoPrintClient.deprecated(oldNamespace+"."+oldFct,newNamespace+"."+newFct,fn);};OctoPrintClient.deprecatedVariable=function(object,oldNamespace,oldVar,newNamespace,newVar,getter,setter){Object.defineProperty(object,oldVar,{get:function(){return OctoPrintClient.deprecated(oldNamespace+"."+oldVar,newNamespace+"."+newVar,getter)();},set:function(val){OctoPrintClient.deprecated(oldNamespace+"."+oldVar,newNamespace+"."+newVar,setter)(val);}});};OctoPrintClient.escapePath=function(path){return _.map(path.split("/"),function(p){return encodeURIComponent(p);}).join("/");};return OctoPrintClient;});
-;
-
-// source: js/app/client/socket.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient","jquery","lodash","sockjs"],factory);}else{factory(global.OctoPrintClient,global.$,global._,global.SockJS);}})(this,function(OctoPrintClient,$,_,SockJS){var normalClose=1000;var OctoPrintSocketClient=function(base){var self=this;this.base=base;this.options={timeouts:[0,1,1,2,3,5,8,13,20,40,100],connectTimeout:5000,transportTimeout:4000,rateSlidingWindowSize:20};this.socket=undefined;this.reconnecting=false;this.reconnectTrial=0;this.registeredHandlers={};this.rateThrottleFactor=1;this.rateBase=500;this.rateLastMeasurements=[];this.connectTimeout=undefined;this.onMessage("connected",function(){if(self.connectTimeout){clearTimeout(self.connectTimeout);self.connectTimeout=undefined;}});};OctoPrintSocketClient.prototype.propagateMessage=function(event,data){var start=new Date().getTime();var eventObj={event:event,data:data};var catchAllHandlers=this.registeredHandlers["*"];if(catchAllHandlers&&catchAllHandlers.length){_.each(catchAllHandlers,function(handler){handler(eventObj);});}
-var handlers=this.registeredHandlers[event];if(handlers&&handlers.length){_.each(handlers,function(handler){handler(eventObj);});}
-var end=new Date().getTime();this.analyzeTiming(end-start);};OctoPrintSocketClient.prototype.analyzeTiming=function(measurement){while(this.rateLastMeasurements.length>=this.options.rateSlidingWindowSize){this.rateLastMeasurements.shift();}
-this.rateLastMeasurements.push(measurement);var processingLimit=this.rateThrottleFactor*this.rateBase;if(measurement>processingLimit){this.onRateTooHigh(measurement,processingLimit);}else if(this.rateThrottleFactor>1){var maxProcessingTime=Math.max.apply(null,this.rateLastMeasurements);var lowerProcessingLimit=(this.rateThrottleFactor-1)*this.rateBase;if(maxProcessingTime0){self.connectTimeout=setTimeout(function(){self.onConnectTimeout();},timeout);}
-var transportTimeout=self.options.transportTimeout;if(opts.hasOwnProperty("transportTimeout")){transportTimeout=opts.transportTimeout;delete opts.transportTimeout;}
-opts.timeout=transportTimeout;self.socket=new SockJS(url+"sockjs",undefined,opts);self.socket.onopen=onOpen;self.socket.onclose=onClose;self.socket.onmessage=onMessage;};OctoPrintSocketClient.prototype.reconnect=function(){this.disconnect();this.socket=undefined;this.connect();};OctoPrintSocketClient.prototype.disconnect=function(){if(this.socket!==undefined){this.socket.close();}};OctoPrintSocketClient.prototype.onMessage=function(message,handler){if(!this.registeredHandlers.hasOwnProperty(message)){this.registeredHandlers[message]=[];}
-this.registeredHandlers[message].push(handler);return this;};OctoPrintSocketClient.prototype.removeMessage=function(message,handler){if(!this.registeredHandlers.hasOwnProperty(message)){return;}
-const index=OctoPrint.socket.registeredHandlers[message].indexOf(handler);if(index>-1){OctoPrint.socket.registeredHandlers[message].splice(index,1);}};OctoPrintSocketClient.prototype.onReconnectAttempt=function(trial){};OctoPrintSocketClient.prototype.onReconnectFailed=function(){};OctoPrintSocketClient.prototype.onConnected=function(){};OctoPrintSocketClient.prototype.onDisconnected=function(code){};OctoPrintSocketClient.prototype.onConnectTimeout=function(){};OctoPrintSocketClient.prototype.onRateTooLow=function(measured,minimum){this.increaseRate();};OctoPrintSocketClient.prototype.onRateTooHigh=function(measured,maximum){this.decreaseRate();};OctoPrintClient.registerComponent("socket",OctoPrintSocketClient);return OctoPrintSocketClient;});
-;
-
-// source: js/app/client/access.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define("OctoPrintAccessClient",["OctoPrintClient"],factory);}else{global.OctoPrintAccessClient=factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var baseAccessUrl="api/access";var OctoPrintAccessPermissionsClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/permissions";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessPermissionsClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};var OctoPrintAccessGroupsClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/groups";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessGroupsClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};OctoPrintAccessGroupsClient.prototype.add=function(group,opts){if(!group.key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");}
-if(!group.name){throw new OctoPrintClient.InvalidArgumentError("group name must be set");}
-var data={key:group.key,name:group.name,description:group.description,permissions:group.permissions,subgroups:group.subgroups,default:group.default};return this.base.postJson(this.url(),data,opts);};OctoPrintAccessGroupsClient.prototype.get=function(key,opts){if(!key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");}
-return this.base.get(this.url(key),opts);};OctoPrintAccessGroupsClient.prototype.update=function(group,opts){if(!group.key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");}
-var data={description:group.hasOwnProperty("description")?group.description:"",permissions:group.permissions,subgroups:group.subgroups,default:group.default};return this.base.putJson(this.url(group.key),data,opts);};OctoPrintAccessGroupsClient.prototype.delete=function(key,opts){if(!key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");}
-return this.base.delete(this.url(key),opts);};var OctoPrintAccessUsersClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/users";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessUsersClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};OctoPrintAccessUsersClient.prototype.add=function(user,opts){if(!user.name||!user.password){throw new OctoPrintClient.InvalidArgumentError("Both user's name and password need to be set");}
-var data={name:user.name,password:user.password,groups:user.hasOwnProperty("groups")?user.groups:[],permissions:user.hasOwnProperty("permissions")?user.permissions:[],active:user.hasOwnProperty("active")?!!user.active:true,admin:user.hasOwnProperty("admin")?!!user.admin:false};return this.base.postJson(this.url(),data,opts);};OctoPrintAccessUsersClient.prototype.get=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-return this.base.get(this.url(name),opts);};OctoPrintAccessUsersClient.prototype.update=function(name,active,admin,permissions,groups,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-var data={active:!!active,groups:groups,permissions:permissions,admin:!!admin};return this.base.putJson(this.url(name),data,opts);};OctoPrintAccessUsersClient.prototype.delete=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-return this.base.delete(this.url(name),opts);};OctoPrintAccessUsersClient.prototype.changePassword=function(name,password,oldpw,opts){if(_.isObject(oldpw)){opts=oldpw;oldpw=undefined;}
-if(!name||!password){throw new OctoPrintClient.InvalidArgumentError("user name and new password must be set");}
-var data={password:password};if(oldpw){data["current"]=oldpw;}
-return this.base.putJson(this.url(name,"password"),data,opts);};OctoPrintAccessUsersClient.prototype.generateApiKey=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-return this.base.postJson(this.url(name,"apikey"),opts);};OctoPrintAccessUsersClient.prototype.resetApiKey=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-return this.base.delete(this.url(name,"apikey"),opts);};OctoPrintAccessUsersClient.prototype.getSettings=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-return this.base.get(this.url(name,"settings"),opts);};OctoPrintAccessUsersClient.prototype.saveSettings=function(name,settings,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");}
-settings=settings||{};return this.base.patchJson(this.url(name,"settings"),settings,opts);};var OctoPrintAccessClient=function(base){this.base=base;this.permissions=new OctoPrintAccessPermissionsClient(this);this.groups=new OctoPrintAccessGroupsClient(this);this.users=new OctoPrintAccessUsersClient(this);};OctoPrintClient.registerComponent("access",OctoPrintAccessClient);return OctoPrintAccessClient;});
-;
-
-// source: js/app/client/browser.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var loginUrl="api/login";var logoutUrl="api/logout";var OctoPrintBrowserClient=function(base){this.base=base;};OctoPrintBrowserClient.prototype.login=function(username,password,remember,opts){var data={user:username,pass:password,remember:!!remember};return this.base.postJson(loginUrl,data,opts);};OctoPrintBrowserClient.prototype.passiveLogin=function(opts){return this.base.postJson(loginUrl,{passive:true},opts);};OctoPrintBrowserClient.prototype.logout=function(opts){return this.base.postJson(logoutUrl,{},opts);};OctoPrintClient.registerComponent("browser",OctoPrintBrowserClient);return OctoPrintBrowserClient;});
-;
-
-// source: js/app/client/connection.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var url="api/connection";var OctoPrintConnectionClient=function(base){this.base=base;};OctoPrintConnectionClient.prototype.getSettings=function(opts){return this.base.get(url,opts);};OctoPrintConnectionClient.prototype.connect=function(data,opts){return this.base.issueCommand(url,"connect",data||{},opts);};OctoPrintConnectionClient.prototype.disconnect=function(opts){return this.base.issueCommand(url,"disconnect",{},opts);};OctoPrintConnectionClient.prototype.fakeAck=function(opts){return this.base.issueCommand(url,"fake_ack",{},opts);};OctoPrintClient.registerComponent("connection",OctoPrintConnectionClient);return OctoPrintConnectionClient;});
-;
-
-// source: js/app/client/control.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var customUrl="api/printer/command/custom";var commandUrl="api/printer/command";var OctoPrintControlClient=function(base){this.base=base;};OctoPrintControlClient.prototype.getCustomControls=function(opts){return this.base.get(customUrl,opts);};OctoPrintControlClient.prototype.sendGcodeWithParameters=function(commands,parameters,opts){commands=commands||[];parameters=parameters||{};if(typeof commands==="string"){commands=[commands];}
-return this.base.postJson(commandUrl,{commands:commands,parameters:parameters},opts);};OctoPrintControlClient.prototype.sendGcodeScriptWithParameters=function(script,context,parameters,opts){script=script||"";context=context||{};parameters=parameters||{};return this.base.postJson(commandUrl,{script:script,context:context,parameters:parameters},opts);};OctoPrintControlClient.prototype.sendGcode=function(commands,opts){return this.sendGcodeWithParameters(commands,undefined,opts);};OctoPrintControlClient.prototype.sendGcodeScript=function(script,context,opts){return this.sendGcodeScriptWithParameters(script,context,undefined,opts);};OctoPrintClient.registerComponent("control",OctoPrintControlClient);return OctoPrintControlClient;});
-;
-
-// source: js/app/client/files.js
-(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient","jquery","lodash"],factory);}else{factory(global.OctoPrintClient,global.$,global._);}})(this,function(OctoPrintClient,$,_){var url="api/files";var downloadUrl="downloads/files";var testUrl=url+"/test";var OctoPrintFilesClient=function(base){this.base=base;};var resourceForLocation=function(location){return url+"/"+OctoPrintClient.escapePath(location);};var downloadForLocation=function(location){return downloadUrl+"/"+OctoPrintClient.escapePath(location);};var downloadForEntry=function(location,filename){return downloadForLocation(location)+"/"+OctoPrintClient.escapePath(filename);};var resourceForEntry=function(location,filename){return resourceForLocation(location)+"/"+OctoPrintClient.escapePath(filename);};var preProcessList=function(response){var recursiveCheck=function(element,index,list){if(!element.hasOwnProperty("parent"))
-element.parent={children:list,parent:undefined};if(!element.hasOwnProperty("size"))element.size=undefined;if(!element.hasOwnProperty("date"))element.date=undefined;if(element.type=="folder"){element.weight=0;_.each(element.children,function(e,i,l){e.parent=element;recursiveCheck(e,i,l);element.weight+=e.weight;});}else{element.weight=1;}};_.each(response.files,recursiveCheck);};OctoPrintFilesClient.prototype.get=function(location,entryname,opts){return this.base.get(resourceForEntry(location,entryname),opts);};OctoPrintFilesClient.prototype.list=function(recursively,force,opts){recursively=recursively||false;force=force||false;var query={};if(recursively){query.recursive=recursively;}
-if(force){query.force=force;}
-return this.base.getWithQuery(url,query,opts).done(preProcessList);};OctoPrintFilesClient.prototype.listForLocation=function(location,recursively,opts){recursively=recursively||false;return this.base.getWithQuery(resourceForLocation(location),{recursive:recursively},opts).done(preProcessList);};OctoPrintFilesClient.prototype.issueEntryCommand=function(location,entryname,command,data,opts){var url=resourceForEntry(location,entryname);return this.base.issueCommand(url,command,data,opts);};OctoPrintFilesClient.prototype.select=function(location,path,print,opts){print=print||false;var data={print:print};return this.issueEntryCommand(location,path,"select",data,opts);};OctoPrintFilesClient.prototype.analyse=function(location,path,parameters,opts){return this.issueEntryCommand(location,path,"analyse",parameters||{},opts);};OctoPrintFilesClient.prototype.slice=function(location,path,parameters,opts){return this.issueEntryCommand(location,path,"slice",parameters||{},opts);};OctoPrintFilesClient.prototype.delete=function(location,path,opts){return this.base.delete(resourceForEntry(location,path),opts);};OctoPrintFilesClient.prototype.copy=function(location,path,destination,opts){return this.issueEntryCommand(location,path,"copy",{destination:destination},opts);};OctoPrintFilesClient.prototype.move=function(location,path,destination,opts){return this.issueEntryCommand(location,path,"move",{destination:destination},opts);};OctoPrintFilesClient.prototype.createFolder=function(location,name,path,opts){var data={foldername:name};if(path!==undefined&&path!==""){data.path=path;}
-return this.base.postForm(resourceForLocation(location),data,opts);};OctoPrintFilesClient.prototype.upload=function(location,file,data){data=data||{};var filename=data.filename||undefined;if(data.userdata&&typeof data.userdata==="object"){data.userdata=JSON.stringify(userdata);}
-return this.base.upload(resourceForLocation(location),file,filename,data);};OctoPrintFilesClient.prototype.download=function(location,path,opts){return this.base.download(downloadForEntry(location,path),opts);};OctoPrintFilesClient.prototype.downloadPath=function(location,path){var url=downloadForEntry(location,path);if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){url=this.base.getBaseUrl()+url;}
-return url;};OctoPrintFilesClient.prototype.pathForEntry=function(entry){if(!entry||!entry.hasOwnProperty("parent")||entry.parent==undefined){return"";}
-var recursivePath=function(element,path){if(element.hasOwnProperty("parent")&&element.parent!=undefined){return recursivePath(element.parent,element.name+"/"+path);}
-return path;};return recursivePath(entry.parent,entry.name);};OctoPrintFilesClient.prototype.entryForPath=function(path,root){if(_.isArray(root)){root={children:root};}
-var recursiveSearch=function(path,entry){if(path.length==0){return entry;}
-if(!entry.hasOwnProperty("children")||!entry.children){return undefined;}
-var name=path.shift();for(var i=0;ipASiM^J6_ngwvRZ%mPM2jNlkQ~d(NdNtGHyR)Sg0GQeCoYwSBp&@j
z18BS&ySrOOw#w(xbn8R08!nf-^CXVaa`!kaqREHi!RTa_&dWGUN2f`4947urI4`sO
zYP^n5M&;Eq%1*Wx(Mg;}K@fN{vA4Y~0w>|cV!RgbBkwh2eUry&`HYZw{(<-5e^ya`
z<@sKcEyCi=J5&f}H&IeVYk_uRWeqqLQ#JX<=a-}L%+3*{(dCvK%m}dDj7Q~JT=Rod1^m3eUL)95o=jJ%kl(@&m+^UYr3EC}JWQf0;KoG;1ucn}f@ERxMcjiN
zW)`87oDxL&GYPFCJq<4+Utt-qUmt&n=H*0C@g~ofQC?n+Y=Fx=D>Kv?pYpFyqjIW1
z3WYMMKfrW{4}(B4I9}&bxysWmXUf^l1C%)MS%&F6B4$+@=F^!mkXdF7UVY#AQM$T_
z^6(hsd=i320^jLLe7e$tZra2rq`k2a&BFRK$dHu&9tDZ$)9hI|KZ}gY0yPDHv4&vv
z5DAxI9$pl|HhcAUYb3c
zW0)s76FHb(UDB-S9<<9zJP#4z?gs!r+nS$+c@dSt`*$xN{k@Z<
zmnhr2rHP8mi8qB>kj`#s*amNJ>t9k{O3ZpB
zX2thP4TTC)LW(F>$I$J>>FH?Cr+_3%Ps_7Mk1K(BM{hu$K^K
z_tf{Uy|GcHRF=+KB_#bj&}#OZRdt1r9Vtz{Tt?%5rD(&&-@pWj=tV5IJtJ?nLASyJ?2BmYB+iRcwAB$9LtAkH!-ZuYLG_3F2c~EQx{vvggjG^f
zCXg%uIL=n$bH2)Rz`s?*r)dcCkG8^e0cbz005oL1f)NaKcMAxg&$E01v?o^+)VZ4n
zfyG%808Vhhr9oO1e{#|^5W_9>(_7I{rdX%{qZ-ulM>2Cmh<+u
zg15c>5P6!+^9*{@>>`X)gTQC|Z(ly5lt81(h2pch69W#@n$!TjqG+2@k*R87IYVnT
z2tS0MYMPIoq|1)rLM9$%Nt-2(Z7xN_%k?$=RITy53^hKedSx(K^HS@VvBjN2w*fM3
zh%G3ZI&X$1i%_-gI|yIW5U7OQV@WlW+02S21wh$3DVs@sY$%kdtm>9sEX#s}7hq=2@4Uws#=tC!nzap>F
zxf)nftx74oU?S`P!r2ZJxW=@NK?+O5RHbf3w*)WbHps`TYvd_#M&6`H8pl;AnCYE=LquwJRqwoktOYw-cpk
zIKF@TtD2yLM9{iSK4dYN!rNX)0j!pFAt7w~p(#4eSX?(7p42=-7F1QVLhxNpo@FOn
zAE@Vm=8)3__yS{z2{A&03bZ4)s#$rAfWe>8K2OW}4FMn5Gn>G{Fp)e2^5yzkCYjLq
zQBqyRe~3gBghj$y@EE>8P+!-cBo$w3>+4qqtE%3N7%VAu86e%
z{O#2*V8F4xHNtL%-X>X^gKcyLB~V85voJl4tf9V4NXhmwSrB|riyee(l4d1V`ZX#@
zw3tdc`Jg#rqCT0}Vl~J9DNs-m@2dDQ_;zn^d)o~B;k&)P@%6PC7zDw0d*2f*K%eD4
z+H1audk3|TCU-C_phk%%Kr|K#P=1`%tulb>2%0=?wnvgFX5t7@5E+>Wa85Bee+6>l
zJep(xU6y=|Mh6y+KGSn3rwh;=uc85cg~;TdIJ|kFVZgcc(E+E@aS&;U;pRpw>oUHG
zGQD#($Tfj^oY?cdcl?I%6g1H$Oh9>Ge1z8G6)pp$Q9kl8m_`p?rOr{a#zYhG!Wt7z
z=y}7&PX{h&qE2%xz57Q+S<}VsF`@GESWcLtv))6a@fR4(;eeL)2bv&llp%7dR!k1q
zTuqo#V~ekvtt*p3Q-{r-GJlnvp};RQBH)ycjYFrER~@5dL*Bzn4x4GTc5YpQNNT*kX12q$^z
zr4?==f&Q$I`9wyCA%#XuZz3gaJ=jxZ)Jld)aTktGnqIIQ(C9?aRU|)wdM+`ttw^lm
z5bGK>xO3=5%jhk&w9!KL*Y;|PyGyqlYBd>Jt0awxpRI~AyLjCLeFS7>Q5O2-$bg?B5Sps_IoT{PunWUk
zWefqHZXReTsv-(_MOm;oqFhz%c;?JB(W%vWW>M-vb!q;ZLYoyYo^lBg%Al9XN1iLM
zH?E0ec8(R<{5&e}dhgglee+mt@0jl)?hi$M
z6PdMJ%mU@tHj&AfeSr6meb**28^kyMk?@N#(0CoE99`7L&C0i~1h)_^?fdF#x
zxX=uL2kk-8#8ED=J$20_H}7cD>x9hS=YoK|fR`(Mu|@;Bgg$rgs3eS0S&$qWldS
z=v5w3>lz#!%1uc+!#2HH`kUxgM;<4P^q~tWC(7Rf13d@y204E@Q_LKJ8g{Ev>pGxM
zH9|`lo&tMJWu+bwj=IQTW+lO)3)utDv3nn*MTS^;l7o^%BO0vfZCYiY;ty{U!h!wM
zBvFOYP)G;f-@HRKd+ZF`+ja=AK#$iv`my6HQJ;yB@tR*ol4Kh4@VZzRVU&kRJ5wZ`
zHIQ<)5eYEBaZ6dut)^je^+yCjxW*1?A5ppVDQY9DZW$__9O6D!qq*Sf
ztjBC=I-wM2@d<5)ebAg{xhl>K+Qh1ySXTi|uYip*XsF45GwLyxmImoZ3y9nio4!Rj
zS@uhOYGC&5^xE8~8~u-uMU}Y-KfO_Tu@r;fu(O0-t;(--N}m2Tg`*dzaS0oEauE^gwh
zBMu?G=ZkbZ-qhQXX?x}vfHSR+ScbnZC
zMl0Khy4yuuaMqEU0}LpJjxY?_cDWOXJ(mbY&Ic1D3B>H$5ti7H5f-m6Q#C~K%wz~$
zLKC}iOekUrZ_5=WNXgRI%P7^gkBD;EU1qqny95jAGimIM(`DdAD0P-(!&VE%>%{MaR3Xk)|x!r}c!{qc_ZXdJ!?p-a>6J{N$xRwi_F%&*D=W6KTG|LN;3~Q{pv`Lm^jt)fQWE;AQ08qikVXd<8p+2hM6o)vbl=e(>Dq$N-O7z8!UPX41eT?pjKh^fqwCxrQ2BJ^Zq@XN`
zHr6Q1>ywH*po7AG1k-js2o%mq%_EW9f84X+?M_CsQ>cGg4+0|EWnEkQWLI71(2ROl
zSLLN1ZwTUd^~LF4T&rBfS`T$vd8SCu$0gQ7I1O7j+RP8
z-r!+OPKq>dqWmJJfka`?Q--{sL(G4O4I$#8O;>7>6flz{AaaA09dCD8A@c-`m3frP
zal}DQW;0M+SloG<=b?5;lIF7~^Ds%O?7o=Z)=zjb1Z~M%7}lL*zf_*=qS2qXKQ=O}MNZ%7O#BqdwNsEAe
zRy{`^W!-|TTNijxR3AF`3{T
ztcCbmedJgz#4lFILWMX^eFM~!aFvt_B7NP=YUQQ2fM|v0-U-rLa>hn|cwx5wzL%9_(@Ggrk;2ITC%c~q!P*|+G6jO{=5n!us7(8
zqceD4fbD$$eF4rJ{^_~`jraTM3ET*bjsOLtsRw>e#1?4rz6^`vGRqgkmFB0cJi|RD
z`Tr?I8;++LB{+Z+Ew;+cU2UlqSETqd)6}5I=W0iRcD3fdfBb}EIpx8jQJ0+=brX$q
z>v;eKSgG;H$emlnLB@wddYrb*SGYkQ#v%>bFiOisDTSwq+jlB%B{2FFl5(X4oAuU6
zy1TP(*IvRljCi|O5eE=R)|$i(P9Lt!YNPM|1n$b`>69fT0s
z@Itq{hR7H#qXvc~
z$a~~Wq6p**Ezj0r`f91
zV{moQ)T5sS_q`NJD=H(KJ{Cdj=3v3>XmQ8T#jzSfR2>;6of_$rtvt6qYkm2Yn8~Ls9uYV=+0^+
zH(g}uU$-W$WL2q{v8u~66*08N*g3np;FfW``=EL={MuS{!})wdV4RntZ9tseqw0kH
z*&yVuwea4ktIVE15bsHN9zC6(Z-5kY9)0Y(1;dJ(64qX?wsoCM1&gzf5z2s
z+hLgmz*A*jFu`F7YkrmD)v
zS9zxnYNyrf%?5JWr|I=3>4?d9;U?r$S(lNB55$8UTyfHXpCp-Pne}5|fS;PgOzTA5
zQWOrQs4HWGLRDGpeObc`qfz`V)VPY#&fZ2@ThmMaXni*q&PKP2?rd?%C&iaIxpnIU
zTRo3xS>_M%E85nD=3d5=ABCO*ee1nfzFG0hYL#DN+MaE)@IoR=;boS;l1@||Zd)t2
zq_o=7d?-+Js(NGa)DM9sfm0n0q%
zGZ?RoRVw9JWi7~@uW}qaJv)nZlPyZbxfZcA4%fNFtPO|P*J47N=p2t9$P^+ZSkKSm
zWC5>J1mcTO-93C8RP;szFl99P^r{VGW;@%
zPtVF=PkPLd;gTKAvxp!231pNUbIO@1T23}I;qL?yztN^?YG^D99^-l>6Cuk^cuDe2
z3`T>k)%>QFB&CND>ZdmE=(MeDeRgDbOc%PzNGye9E|M$sl{c@*P~n00etj)Y7EscF
zeq|6UG&SRaFt@Z^<26N0RFDo*EF%yonNEY=Fl(xOC(_V`atXpG3+Nh0X7%eSl-6d^
z*9Fx}MD1j^wl;nRd#XXcxfP2v;3Ms+ITdjzqxAn_d2Gb4vX3&(y2qP!4Bb2wP(A0a
zT7+lZeHtW5KQ(mI2mR^_%8N%BJf&aL%B{)B!r%!4yg@|Mu}=M1jYYL>whtnRfqTAb
zyZ06-?!dku$_VtPblD5AChUfml9z{?^^=?<^d(`QEw7pgSb((`ry^hj(I9BgUu#gN
z+Iw#y;W>eOq7Xsf0foY|%S-Cs9hCBvw<^)9h6;;-wzuHVjr2^fpB~xX<`B;lOTH83
zr@m?Ij(!I_n%*Hb+jjP77?*r9U%4SR+&YqfAELQ(rD#}46o<L
zO&GVg&4J28$HglKu92DEm!INZgwzJ@xH
zvlbw_nw4_DQ=#w6tic(i?{kzr54#aQTZV|{t8xKfeUL2@gLdo&_x}UrPIl$+lQoM
zmv<0+%liPOmj~$u6fZS=(0{1c=uFZ@v@u;`C~|ekv~g9~1yJ}$YFWxM==Rt#Z!geb
zJPiZR8G3?WhO7F0ZOy32M@0;GNtS)YWOyuv2t;|kO6X=$2#h(Du7v&s1
zs3-lgiS*u(b`C4DUnip8#;K^z7A^_X(-kzz#aGbIDPFAB?v)H5+U8jqH#sBXY(<*k
z+9N;mpucV!TggiRdIEP%ek3?ho}U{RF3iuX^(Svfq+(-uem-lO9^rgL^tmc9zlr?1
zZd(aDHJrCNd_k8y*K+cHDN%9i@mj?11l|)*OQ3~I
zT5%)qHl;~~-$9i^5DI+_K6gAwB<=*P}*Vm8P1G^$q
zL`=n_7pW(Va5HkT(|Q-?*nLG8OFS^T$|G$;x1=~JU;YaCsojCfvOF2>h{I>`KHC
zImMqY66GF|!6ZhXpt;v~I)@k8O6_P7AAxu@QYoUR;?YGZBiyjUCE4XYRyc#u6UMa}
zrC1-Gp&NLJgU8^({
z6J;8DR!vUL`EIJ}vzSJ7-#JX+?Q6!Z#WGTLU(&_ru)oq4OSu;jV}5dDQ>}=w0~zZ|F3vKv88Y+r+RxCV{b_`XZeO$`
ziKeHQzFt}McBAHgr59&!=q}ItY5vxmQ^jcp7*(gEItTSzpv9I(rKtimuv7~=5YIz}
zQNJBjUJ9x%Z^rgOtcm&F@7b0FhL@FZ2|!!&uF|o7sjlw4u!(}&9baw5*dar!Y-{(h
z@WrZycjyR`1Sw50v;eV>-0fmZp}XB&b-D3Sm2Utp(Wdsq#0_u@o)#bDvYqf7h;sND
zH{!b++9aMs@~>c(n>pciXFTkY8^)gqs@Z-bSRIqB8;v4?v<7~yHUuji5;QHPi(axa
zDt}$rX63#hbZ|qiXR{2+r%AF;G!#$M1^2YK@L|%1N3|Eh6*!(}4}V
z$kj}R5`Rylu~y9e$pLG706E=eWusfbR&ouveaIFj?>$rQvU=};cG0NbUJ2^faSuIc
zX|K5r^4$zLT5CPJyRp6kd>3CsTTP6(UCW3#=~;$N=YQrtv&8tT`lbd9BdoX
z6gjx{)pA+Ox6)NhFQ+t>qmsI=ccMT=C&kbdoxc5EC`Es#W$1xD`V`GqWqq?YgArR^
z{VpTRNdvty0N1QpvpjmQ*Rt9SfxR!3<~f?Oy_TGn?hR@vLC6?
za0&E%or7n^U#n*nE7kETIe*@fQaVzR--a1j^Uu-4;fd{qLqXOlX~rLdnPP!rq?DT`bzID6SjdAX+O*@#b^odPbQrAs@%Se
zk~tLU&m^Myaqg~jhUz4@t0Au1&>>BL-LKSWanWIA8d=|dmA9uPtkr-{Ik4Yyt!vnf
zdjZI$r#;ZS`>4@iA_SD7M3{#H+eq<5oHy>>Z#~P>llb&Yw`p^t;?GoLabDM!4O1z-
zXi}tj=ran{5ldrnK+oLI@UF~4zlq?w`E4cWw7|*j`sc8|-4{CE*YJH2E%Rs|meJz9
z!&P||`*L3TX>^H?leB(HmJ6p!uU$+jJl0RV9TS?CfG>`c=_)+7N&0>Rck1t*j=|B&
zbMZd%Fbcgy(xYp%Xi$z>My$8v4gzpB-;Ez)06qP>E{19+0kUa{yU9R<+)V~;cM`w7
z+FpYUZ1<|f-DL1ey_*sd3B<^kO|BYhr&mB80I!=R?!VnEiAZ2cz6=*Jceq2OY+cvm
zCe2I)B-#N@xBT>=*#zYR&_`p9HNht3)f15(n*p1sv<_jA-1U2H-1KTGJm35pPN|lC
z5ShBG{Kht6U#(u6UmLX%GW#GhjZ0|Ubm~bw-}-F5x2BzB9gr)#L432lBJMx*9cic8tW69eQ$2klzlWrQjRTcOcNh`rQ$W>W&K6IF%`R`6viG9G;RFhL
z_!z%Jd8(ia2&z|eE891??H>j_qxFrJe>}4s+UX1-cJzW#o;5k5Y$W;xEiZ(}N%Z+h
zr_VV$$vq-}zvKqU(}VfuQty*@S9}^%12}TIbN*I*)V5AAgbt>6KgvJq>#1iMx@*qz
z^6m*o&;kB%IRTOYe;k|?MAcws-bQpf&hVov%(uJdg}ja7kAwJJQ8Ac-r;A073RxY*
z5dnA400R#A>0pCnns{jG$*^_y9n3m9G8Na^kzK}rg!$rYSP};rESVjvv-&p$4(+b=
zTz9qYvjHZ^EH1Rp2Tb=x5-mEHg%QV^6HobxCpHHip2mU{8zXI$8>psEhU-$w
zb`<{=g<8jU1z&zoTwqFK@?CGI%GIKyV*jjhd!i;5zlC7eO^SA!Hr++ej@XzyO0zOP
ziG}AxU6mUXeHEHb_jn2Be%E*#+K6@lYEoW4ch*a>XmA@}EEAkA;Of&@Htt(k`_ed1
z4Bc;_u8_p2!)fD2dL>(Lk4di^KdZi`AaG>Rf{eo{EQKuWM($VJf?BZ5UW-B-Cz}J1UBvw55tH
zm*>%yZWM`tub~<&m;VG#2CKfF%~W>`@89139AW7SaXNOxx8Ql2B)w2|)hfn4-tnG<
zNg}-c3?jrh5Ch=+w$-R1)GU{QxAP!M@%p;=Z-1?-1H_DX9?(M86K@+I=;N!N4r9hs
z&)G&a@*}44YfSa;IAvj~MFn&dyIfA;|7IgXUS>H?^O{#X`*%i^udaU{Kwchw%+5_I
z0fK5tzsM50UK!^=IOSGxmaUQnUfGTbV%mG5Ein6AK*N?w4qOBBtvH1SF_Aql*IkY0z%pVqx2)+jJ^q|a)Yht7mlM;d)TlRE;R+A!mT2ThbqTiZyrKgr
zqQ6HPXLAMmI2ze|u%Mbt)2v?dh^S%DmLPz53e@f_$aF+ObcGAO)iz>{WJAYSVbDSP
zk6{u#-jnW&vP4^0Py`y~B#Nh*IJz58Q57FSakOnKlS$YJQweGCb_FC~#_1xvB-dQ=
zMU<_|5mM<(;>j-S+JZKs_0gLiu=;}PnXcCkw@wRPw%cyab=cv0bhGV!9L~>I%gXc?
z-(P{{{Sz_Le-3ihKL04>V$MA3C~i9@bwz4vpvdxe?3%+ByaGnV^%Dq#
zA1D!nsF%@?R)AKaDOhrRg^mSQK5wQ~akEH*G;gc3p
zAD#5p8$>;}xjjT_98q6awTV^OSI{ovokMh;@6b63E91aL7IQ|TlBnmt4$6&)ay(6v
z4d$D5j2>^vNRkb-P6yOPviqhdEkT?9?$AL!{HxGI!O(`fSj&8yMZfw)ktuF(
zyosI|5d1dUUHVc>)T}c}b_$QvN?ADIE6|cxf|EO4N@nSJd`Jd93nK?D%VMY}63{k^
zdI}2m_=rHuSzrOl&C#8&R5wA#vjGq{U^iE|0`ybZ9o>ms@gS7Gc(63nLNGIn@!g#O}`hnBIjN6tJ;7LhE=+e;iIQF
z+sU1$*r5w3k6m{7avIq0sb-&js0P2?fR*5?ULv}zjFZ;5Nl8iY&S(u%z#kL*
zkk^t}&{Z1#wv#bZm5je-GU>~*jPrMxwAnv-__8JzzJJlQS
zj(;m?wma%O&~Od`Di_vjHC2yNG=)+orn{I5!`kPvCE>=J5{M
zs2bhR#0i>wp*}MyNW#$?*q7+-Bb{HpiqmtjF7oUGxvtz!v8f{?(AdeSzx3D*m5iCG
zBzkwmZmIHQ>Oy*yAXeHoQKy4?Cy0}9d+k9qrR{snd(%2dyWsMuL3I9KQ-Z!?h++9B
z8QR9ES)X6JtF%eFxWzhEt6(5P<(7r}dXV9_+uJNyPFNsddcuzQiaHZARoGEz8L8h4G0tYQXDc1#JIg0nZP&yUG**F)?@UHSIT7?+7VeDc7fDldrBgIv;
zc>nfQV4~acc14tDIM8*-#9sV;k(PO^`=O6Sfaqk~Iy+c+7)^AIZjVDE4&%7%B^
z>M=8hF7F=Y&lw?;f%HNCL1hTOLl-DB^OLsVRLUu11FwJ=T#j1HpaXt6H2P86`U`dj
zqT>sb1RZEu%)}klBH#8lzcBNhTHdfJBh_uy4X#UZX!$Q3>yHdIYG~d1l%CeQbrsiU
z<<+lXbY^v}8p#rv9vrgOR?#`dpPL~p+xI`o`%dqPcUip5D}VMBN$vJkLsw<2uBKI7qu`=*UjF);O}0jd^~IF2?jmC^-5faTvdB~
z8@YlxYK!*HMe5MdW-;71+d>-+EBuQ#UzH?2Z>^HuzviD&!Rb0opj#80p~q|9rFqeR
z7lUr23}0un>?yyMR)>pyN2+Gqx6H%&xv`CBRe;U>6&Snkn6tr-+>Ly?0~?IcY`~A`
y;LEsTw$GM8DR3}>=+*Pr1Zir(oAPsmqv#ca29_LdVU2iJmj4Cr>J#L$0s#O(aMdgT
diff --git a/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css b/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css
deleted file mode 100644
index 2121677..0000000
--- a/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css
+++ /dev/null
@@ -1,23 +0,0 @@
-.actioncol,.btn{text-align:center}.btn,.btn-link,ul.dropdown-menu li a{cursor:pointer}.btn,.slider .slider-handle{background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));margin-bottom:0}.btn,.btn-danger,.btn-info,.btn-inverse,.btn-primary,.btn-success,.btn-warning{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;font-size:14px;line-height:20px;vertical-align:middle;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);*background-color:#e6e6e6;border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:focus,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:first-child{*margin-left:0}.btn:focus,.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.active,.btn:active{background-color:#ccc\9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-primary,.slider .slider-selection{text-shadow:0 -1px 0 rgba(0,0,0,.25);background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c)}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class*=" icon-"],.btn-large [class^=icon-]{margin-top:4px}.btn-small [class*=" icon-"],.btn-small [class^=icon-],table td.timelapse_files_checkbox input[type=checkbox],table td.timelapse_unrendered_checkbox input[type=checkbox],table th.timelapse_files_checkbox input[type=checkbox],table th.timelapse_unrendered_checkbox input[type=checkbox]{margin-top:0}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-mini [class*=" icon-"],.btn-mini [class^=icon-]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.btn-danger.active,.btn-info.active,.btn-inverse.active,.btn-primary.active,.btn-success.active,.btn-warning.active{color:rgba(255,255,255,.75)}.btn-primary{color:#fff;background-color:#006dcc;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#04c}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary.active,.btn-primary:active{background-color:#039\9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#f89406}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning.active,.btn-warning:active{background-color:#c67605\9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#bd362f}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger.active,.btn-danger:active{background-color:#942a25\9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#51a351}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success.active,.btn-success:active{background-color:#408140\9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#2f96b4}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info.active,.btn-info:active{background-color:#24748c\9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#222}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:focus,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse.active,.btn-inverse:active{background-color:#080808\9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;color:#08c;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:focus,.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover{color:#333;text-decoration:none}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.actioncol,.nowrap{white-space:nowrap}.actioncol a{text-decoration:none;color:#000}.actioncol a.disabled{color:#ccc;cursor:default}#navbar .navbar-inner{background-color:#ebebeb;background-image:-moz-linear-gradient(top,#fff,#ccc);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#ccc));background-image:-webkit-linear-gradient(top,#fff,#ccc);background-image:-o-linear-gradient(top,#fff,#ccc);background-image:linear-gradient(to bottom,#fff,#ccc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffcccccc', GradientType=0)}#navbar .navbar-inner .brand,#navbar .navbar-inner .nav>li>a{text-shadow:0 1px 0 #ccc;color:#333}#navbar .navbar-inner .brand .caret,#navbar .navbar-inner .nav>li>a .caret{border-bottom-color:#939393;border-top-color:#939393}#navbar .navbar-inner .brand:focus .caret,#navbar .navbar-inner .brand:hover .caret,#navbar .navbar-inner .nav>li>a:focus .caret,#navbar .navbar-inner .nav>li>a:hover .caret{border-bottom-color:#636363;border-top-color:#636363}#navbar .navbar-inner .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner .nav>li.dropdown.open>.dropdown-toggle{background-color:#e0e0e0;background-image:-moz-linear-gradient(top,#ccc,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(top,#ccc,#fff);background-image:-o-linear-gradient(top,#ccc,#fff);background-image:linear-gradient(to bottom,#ccc,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffcccccc', endColorstr='#ffffffff', GradientType=0)}#navbar .navbar-inner .nav>li>a:hover{background-color:#dedede;background-image:-moz-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#bfbfbf));background-image:-webkit-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:-o-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:linear-gradient(to bottom,#f2f2f2,#bfbfbf);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffbfbfbf', GradientType=0)}#navbar .navbar-inner.transparent{background-color:rgba(235,235,235,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.6)),to(rgba(204,204,204,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99ffffff', endColorstr='#99cccccc', GradientType=0)}#navbar .navbar-inner.transparent .brand,#navbar .navbar-inner.transparent .nav>li>a{text-shadow:0 1px 0 #ccc;color:#333}#navbar .navbar-inner.transparent .brand .caret,#navbar .navbar-inner.transparent .nav>li>a .caret{border-bottom-color:#939393;border-top-color:#939393}#navbar .navbar-inner.transparent .brand:focus .caret,#navbar .navbar-inner.transparent .brand:hover .caret,#navbar .navbar-inner.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.transparent .nav>li>a:hover .caret{border-bottom-color:#636363;border-top-color:#636363}#navbar .navbar-inner.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(224,224,224,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(204,204,204,.6)),to(rgba(255,255,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99cccccc', endColorstr='#99ffffff', GradientType=0)}#navbar .navbar-inner.transparent .nav>li>a:hover{background-color:rgba(222,222,222,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(242,242,242,.6)),to(rgba(191,191,191,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f2f2f2', endColorstr='#99bfbfbf', GradientType=0)}#navbar .navbar-inner.red{background-color:#bb645f;background-image:-moz-linear-gradient(top,#e28e8a,#802420);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e28e8a),to(#802420));background-image:-webkit-linear-gradient(top,#e28e8a,#802420);background-image:-o-linear-gradient(top,#e28e8a,#802420);background-image:linear-gradient(to bottom,#e28e8a,#802420);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe28e8a', endColorstr='#ff802420', GradientType=0)}#navbar .navbar-inner.red .brand,#navbar .navbar-inner.red .nav>li>a{text-shadow:0 1px 0 #d86761;color:#f2f2f2}#navbar .navbar-inner.red .brand .caret,#navbar .navbar-inner.red .nav>li>a .caret{border-bottom-color:#d89491;border-top-color:#d89491}#navbar .navbar-inner.red .brand:focus .caret,#navbar .navbar-inner.red .brand:hover .caret,#navbar .navbar-inner.red .nav>li>a:focus .caret,#navbar .navbar-inner.red .nav>li>a:hover .caret{border-bottom-color:#e5c3c1;border-top-color:#e5c3c1}#navbar .navbar-inner.red .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.red .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.red .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.red .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.red .nav>li.dropdown.open>.dropdown-toggle{background-color:#a74f4a;background-image:-moz-linear-gradient(top,#802420,#e28e8a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#802420),to(#e28e8a));background-image:-webkit-linear-gradient(top,#802420,#e28e8a);background-image:-o-linear-gradient(top,#802420,#e28e8a);background-image:linear-gradient(to bottom,#802420,#e28e8a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff802420', endColorstr='#ffe28e8a', GradientType=0)}#navbar .navbar-inner.red .nav>li>a:hover{background-color:#af5651;background-image:-moz-linear-gradient(top,#dd7a75,#6b1f1b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd7a75),to(#6b1f1b));background-image:-webkit-linear-gradient(top,#dd7a75,#6b1f1b);background-image:-o-linear-gradient(top,#dd7a75,#6b1f1b);background-image:linear-gradient(to bottom,#dd7a75,#6b1f1b);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd7a75', endColorstr='#ff6b1f1b', GradientType=0)}#navbar .navbar-inner.red.transparent{background-color:rgba(187,100,95,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(226,142,138,.6)),to(rgba(128,36,32,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99e28e8a', endColorstr='#99802420', GradientType=0)}#navbar .navbar-inner.red.transparent .brand,#navbar .navbar-inner.red.transparent .nav>li>a{text-shadow:0 1px 0 #d86761;color:#f2f2f2}#navbar .navbar-inner.red.transparent .brand .caret,#navbar .navbar-inner.red.transparent .nav>li>a .caret{border-bottom-color:#d89491;border-top-color:#d89491}#navbar .navbar-inner.red.transparent .brand:focus .caret,#navbar .navbar-inner.red.transparent .brand:hover .caret,#navbar .navbar-inner.red.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.red.transparent .nav>li>a:hover .caret{border-bottom-color:#e5c3c1;border-top-color:#e5c3c1}#navbar .navbar-inner.red.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.red.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.red.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.red.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.red.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(167,79,74,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(128,36,32,.6)),to(rgba(226,142,138,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99802420', endColorstr='#99e28e8a', GradientType=0)}#navbar .navbar-inner.red.transparent .nav>li>a:hover{background-color:rgba(175,86,81,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(221,122,117,.6)),to(rgba(107,31,27,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99dd7a75', endColorstr='#996b1f1b', GradientType=0)}#navbar .navbar-inner.orange{background-color:#e39665;background-image:-moz-linear-gradient(top,#f9c3a0,#c2530c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9c3a0),to(#c2530c));background-image:-webkit-linear-gradient(top,#f9c3a0,#c2530c);background-image:-o-linear-gradient(top,#f9c3a0,#c2530c);background-image:linear-gradient(to bottom,#f9c3a0,#c2530c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9c3a0', endColorstr='#ffc2530c', GradientType=0)}#navbar .navbar-inner.orange .brand,#navbar .navbar-inner.orange .nav>li>a{text-shadow:0 1px 0 #f6a570;color:#f2f2f2}#navbar .navbar-inner.orange .brand .caret,#navbar .navbar-inner.orange .nav>li>a .caret{border-bottom-color:#f2b58d;border-top-color:#f2b58d}#navbar .navbar-inner.orange .brand:focus .caret,#navbar .navbar-inner.orange .brand:hover .caret,#navbar .navbar-inner.orange .nav>li>a:focus .caret,#navbar .navbar-inner.orange .nav>li>a:hover .caret{border-bottom-color:#f2d3bf;border-top-color:#f2d3bf}#navbar .navbar-inner.orange .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.orange .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.orange .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.orange .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.orange .nav>li.dropdown.open>.dropdown-toggle{background-color:#d88047;background-image:-moz-linear-gradient(top,#c2530c,#f9c3a0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c2530c),to(#f9c3a0));background-image:-webkit-linear-gradient(top,#c2530c,#f9c3a0);background-image:-o-linear-gradient(top,#c2530c,#f9c3a0);background-image:linear-gradient(to bottom,#c2530c,#f9c3a0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc2530c', endColorstr='#fff9c3a0', GradientType=0)}#navbar .navbar-inner.orange .nav>li>a:hover{background-color:#d98956;background-image:-moz-linear-gradient(top,#f8b488,#aa490a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8b488),to(#aa490a));background-image:-webkit-linear-gradient(top,#f8b488,#aa490a);background-image:-o-linear-gradient(top,#f8b488,#aa490a);background-image:linear-gradient(to bottom,#f8b488,#aa490a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8b488', endColorstr='#ffaa490a', GradientType=0)}#navbar .navbar-inner.orange.transparent{background-color:rgba(227,150,101,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(249,195,160,.6)),to(rgba(194,83,12,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f9c3a0', endColorstr='#99c2530c', GradientType=0)}#navbar .navbar-inner.orange.transparent .brand,#navbar .navbar-inner.orange.transparent .nav>li>a{text-shadow:0 1px 0 #f6a570;color:#f2f2f2}#navbar .navbar-inner.yellow .brand,#navbar .navbar-inner.yellow .nav>li>a,#navbar .navbar-inner.yellow.transparent .brand,#navbar .navbar-inner.yellow.transparent .nav>li>a{text-shadow:0 1px 0 #c2b00c;color:#f2f2f2}#navbar .navbar-inner.orange.transparent .brand .caret,#navbar .navbar-inner.orange.transparent .nav>li>a .caret{border-bottom-color:#f2b58d;border-top-color:#f2b58d}#navbar .navbar-inner.orange.transparent .brand:focus .caret,#navbar .navbar-inner.orange.transparent .brand:hover .caret,#navbar .navbar-inner.orange.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.orange.transparent .nav>li>a:hover .caret{border-bottom-color:#f2d3bf;border-top-color:#f2d3bf}#navbar .navbar-inner.orange.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.orange.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.orange.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.orange.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.orange.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(216,128,71,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(194,83,12,.6)),to(rgba(249,195,160,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c2530c', endColorstr='#99f9c3a0', GradientType=0)}#navbar .navbar-inner.orange.transparent .nav>li>a:hover{background-color:rgba(217,137,86,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(248,180,136,.6)),to(rgba(170,73,10,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f8b488', endColorstr='#99aa490a', GradientType=0)}#navbar .navbar-inner.yellow{background-color:#e3d765;background-image:-moz-linear-gradient(top,#f9f0a0,#c2b00c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f0a0),to(#c2b00c));background-image:-webkit-linear-gradient(top,#f9f0a0,#c2b00c);background-image:-o-linear-gradient(top,#f9f0a0,#c2b00c);background-image:linear-gradient(to bottom,#f9f0a0,#c2b00c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f0a0', endColorstr='#ffc2b00c', GradientType=0)}#navbar .navbar-inner.yellow .brand .caret,#navbar .navbar-inner.yellow .nav>li>a .caret{border-bottom-color:#f2e88d;border-top-color:#f2e88d}#navbar .navbar-inner.yellow .brand:focus .caret,#navbar .navbar-inner.yellow .brand:hover .caret,#navbar .navbar-inner.yellow .nav>li>a:focus .caret,#navbar .navbar-inner.yellow .nav>li>a:hover .caret{border-bottom-color:#f2edbf;border-top-color:#f2edbf}#navbar .navbar-inner.yellow .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.yellow .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.yellow .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.yellow .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.yellow .nav>li.dropdown.open>.dropdown-toggle{background-color:#d8ca47;background-image:-moz-linear-gradient(top,#c2b00c,#f9f0a0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c2b00c),to(#f9f0a0));background-image:-webkit-linear-gradient(top,#c2b00c,#f9f0a0);background-image:-o-linear-gradient(top,#c2b00c,#f9f0a0);background-image:linear-gradient(to bottom,#c2b00c,#f9f0a0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc2b00c', endColorstr='#fff9f0a0', GradientType=0)}#navbar .navbar-inner.yellow .nav>li>a:hover{background-color:#d9cc56;background-image:-moz-linear-gradient(top,#f8ed88,#aa9a0a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8ed88),to(#aa9a0a));background-image:-webkit-linear-gradient(top,#f8ed88,#aa9a0a);background-image:-o-linear-gradient(top,#f8ed88,#aa9a0a);background-image:linear-gradient(to bottom,#f8ed88,#aa9a0a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8ed88', endColorstr='#ffaa9a0a', GradientType=0)}#navbar .navbar-inner.yellow.transparent{background-color:rgba(227,215,101,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(249,240,160,.6)),to(rgba(194,176,12,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f9f0a0', endColorstr='#99c2b00c', GradientType=0)}#navbar .navbar-inner.green .brand,#navbar .navbar-inner.green .nav>li>a,#navbar .navbar-inner.green.transparent .brand,#navbar .navbar-inner.green.transparent .nav>li>a{text-shadow:0 1px 0 #50da00;color:#333}#navbar .navbar-inner.yellow.transparent .brand .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a .caret{border-bottom-color:#f2e88d;border-top-color:#f2e88d}#navbar .navbar-inner.yellow.transparent .brand:focus .caret,#navbar .navbar-inner.yellow.transparent .brand:hover .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a:hover .caret{border-bottom-color:#f2edbf;border-top-color:#f2edbf}#navbar .navbar-inner.yellow.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.yellow.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(216,202,71,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(194,176,12,.6)),to(rgba(249,240,160,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c2b00c', endColorstr='#99f9f0a0', GradientType=0)}#navbar .navbar-inner.yellow.transparent .nav>li>a:hover{background-color:rgba(217,204,86,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(248,237,136,.6)),to(rgba(170,154,10,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f8ed88', endColorstr='#99aa9a0a', GradientType=0)}#navbar .navbar-inner.green{background-color:#98f064;background-image:-moz-linear-gradient(top,#c8ffa7,#50da00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8ffa7),to(#50da00));background-image:-webkit-linear-gradient(top,#c8ffa7,#50da00);background-image:-o-linear-gradient(top,#c8ffa7,#50da00);background-image:linear-gradient(to bottom,#c8ffa7,#50da00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8ffa7', endColorstr='#ff50da00', GradientType=0)}#navbar .navbar-inner.green .brand .caret,#navbar .navbar-inner.green .nav>li>a .caret{border-bottom-color:#55992e;border-top-color:#55992e}#navbar .navbar-inner.green .brand:focus .caret,#navbar .navbar-inner.green .brand:hover .caret,#navbar .navbar-inner.green .nav>li>a:focus .caret,#navbar .navbar-inner.green .nav>li>a:hover .caret{border-bottom-color:#446630;border-top-color:#446630}#navbar .navbar-inner.green .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.green .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.green .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.green .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.green .nav>li.dropdown.open>.dropdown-toggle{background-color:#80e943;background-image:-moz-linear-gradient(top,#50da00,#c8ffa7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#50da00),to(#c8ffa7));background-image:-webkit-linear-gradient(top,#50da00,#c8ffa7);background-image:-o-linear-gradient(top,#50da00,#c8ffa7);background-image:linear-gradient(to bottom,#50da00,#c8ffa7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff50da00', endColorstr='#ffc8ffa7', GradientType=0)}#navbar .navbar-inner.green .nav>li>a:hover{background-color:#8ae655;background-image:-moz-linear-gradient(top,#b8ff8e,#47c100);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b8ff8e),to(#47c100));background-image:-webkit-linear-gradient(top,#b8ff8e,#47c100);background-image:-o-linear-gradient(top,#b8ff8e,#47c100);background-image:linear-gradient(to bottom,#b8ff8e,#47c100);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb8ff8e', endColorstr='#ff47c100', GradientType=0)}#navbar .navbar-inner.green.transparent{background-color:rgba(152,240,100,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,255,167,.6)),to(rgba(80,218,0,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8ffa7', endColorstr='#9950da00', GradientType=0)}#navbar .navbar-inner.blue .brand,#navbar .navbar-inner.blue .nav>li>a,#navbar .navbar-inner.blue.transparent .brand,#navbar .navbar-inner.blue.transparent .nav>li>a{text-shadow:0 1px 0 #1a66ff;color:#f2f2f2}#navbar .navbar-inner.green.transparent .brand .caret,#navbar .navbar-inner.green.transparent .nav>li>a .caret{border-bottom-color:#55992e;border-top-color:#55992e}#navbar .navbar-inner.green.transparent .brand:focus .caret,#navbar .navbar-inner.green.transparent .brand:hover .caret,#navbar .navbar-inner.green.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.green.transparent .nav>li>a:hover .caret{border-bottom-color:#446630;border-top-color:#446630}#navbar .navbar-inner.green.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.green.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.green.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.green.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.green.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(128,233,67,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(80,218,0,.6)),to(rgba(200,255,167,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9950da00', endColorstr='#99c8ffa7', GradientType=0)}#navbar .navbar-inner.green.transparent .nav>li>a:hover{background-color:rgba(138,230,85,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(184,255,142,.6)),to(rgba(71,193,0,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99b8ff8e', endColorstr='#9947c100', GradientType=0)}#navbar .navbar-inner.blue{background-color:#2e63cc;background-image:-moz-linear-gradient(top,#4d88ff,#002b80);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4d88ff),to(#002b80));background-image:-webkit-linear-gradient(top,#4d88ff,#002b80);background-image:-o-linear-gradient(top,#4d88ff,#002b80);background-image:linear-gradient(to bottom,#4d88ff,#002b80);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d88ff', endColorstr='#ff002b80', GradientType=0)}#navbar .navbar-inner.blue .brand .caret,#navbar .navbar-inner.blue .nav>li>a .caret{border-bottom-color:#799bdf;border-top-color:#799bdf}#navbar .navbar-inner.blue .brand:focus .caret,#navbar .navbar-inner.blue .brand:hover .caret,#navbar .navbar-inner.blue .nav>li>a:focus .caret,#navbar .navbar-inner.blue .nav>li>a:hover .caret{border-bottom-color:#b6c7e9;border-top-color:#b6c7e9}#navbar .navbar-inner.blue .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.blue .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.blue .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.blue .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.blue .nav>li.dropdown.open>.dropdown-toggle{background-color:#1f50b3;background-image:-moz-linear-gradient(top,#002b80,#4d88ff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#002b80),to(#4d88ff));background-image:-webkit-linear-gradient(top,#002b80,#4d88ff);background-image:-o-linear-gradient(top,#002b80,#4d88ff);background-image:linear-gradient(to bottom,#002b80,#4d88ff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff002b80', endColorstr='#ff4d88ff', GradientType=0)}#navbar .navbar-inner.blue .nav>li>a:hover{background-color:#1f55c2;background-image:-moz-linear-gradient(top,#37f,#026);background-image:-webkit-gradient(linear,0 0,0 100%,from(#37f),to(#026));background-image:-webkit-linear-gradient(top,#37f,#026);background-image:-o-linear-gradient(top,#37f,#026);background-image:linear-gradient(to bottom,#37f,#026);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3377ff', endColorstr='#ff002266', GradientType=0)}#navbar .navbar-inner.blue.transparent{background-color:rgba(46,99,204,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(77,136,255,.6)),to(rgba(0,43,128,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#994d88ff', endColorstr='#99002b80', GradientType=0)}#navbar .navbar-inner.blue.transparent .brand .caret,#navbar .navbar-inner.blue.transparent .nav>li>a .caret{border-bottom-color:#799bdf;border-top-color:#799bdf}#navbar .navbar-inner.blue.transparent .brand:focus .caret,#navbar .navbar-inner.blue.transparent .brand:hover .caret,#navbar .navbar-inner.blue.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.blue.transparent .nav>li>a:hover .caret{border-bottom-color:#b6c7e9;border-top-color:#b6c7e9}#navbar .navbar-inner.blue.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.blue.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.blue.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.blue.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.blue.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(31,80,179,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(0,43,128,.6)),to(rgba(77,136,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99002b80', endColorstr='#994d88ff', GradientType=0)}#navbar .navbar-inner.blue.transparent .nav>li>a:hover{background-color:rgba(31,85,194,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(51,119,255,.6)),to(rgba(0,34,102,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#993377ff', endColorstr='#99002266', GradientType=0)}#navbar .navbar-inner.violet{background-color:#9864f0;background-image:-moz-linear-gradient(top,#c8a7ff,#5000da);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8a7ff),to(#5000da));background-image:-webkit-linear-gradient(top,#c8a7ff,#5000da);background-image:-o-linear-gradient(top,#c8a7ff,#5000da);background-image:linear-gradient(to bottom,#c8a7ff,#5000da);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8a7ff', endColorstr='#ff5000da', GradientType=0)}#navbar .navbar-inner.violet .brand,#navbar .navbar-inner.violet .nav>li>a{text-shadow:0 1px 0 #a774ff;color:#f2f2f2}#navbar .navbar-inner.violet .brand .caret,#navbar .navbar-inner.violet .nav>li>a .caret{border-bottom-color:#b58df9;border-top-color:#b58df9}#navbar .navbar-inner.violet .brand:focus .caret,#navbar .navbar-inner.violet .brand:hover .caret,#navbar .navbar-inner.violet .nav>li>a:focus .caret,#navbar .navbar-inner.violet .nav>li>a:hover .caret{border-bottom-color:#d3bff5;border-top-color:#d3bff5}#navbar .navbar-inner.violet .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.violet .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.violet .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.violet .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.violet .nav>li.dropdown.open>.dropdown-toggle{background-color:#8043e9;background-image:-moz-linear-gradient(top,#5000da,#c8a7ff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5000da),to(#c8a7ff));background-image:-webkit-linear-gradient(top,#5000da,#c8a7ff);background-image:-o-linear-gradient(top,#5000da,#c8a7ff);background-image:linear-gradient(to bottom,#5000da,#c8a7ff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5000da', endColorstr='#ffc8a7ff', GradientType=0)}#navbar .navbar-inner.violet .nav>li>a:hover{background-color:#8a55e6;background-image:-moz-linear-gradient(top,#b88eff,#4700c1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b88eff),to(#4700c1));background-image:-webkit-linear-gradient(top,#b88eff,#4700c1);background-image:-o-linear-gradient(top,#b88eff,#4700c1);background-image:linear-gradient(to bottom,#b88eff,#4700c1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb88eff', endColorstr='#ff4700c1', GradientType=0)}#navbar .navbar-inner.violet.transparent{background-color:rgba(152,100,240,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,167,255,.6)),to(rgba(80,0,218,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8a7ff', endColorstr='#995000da', GradientType=0)}#navbar .navbar-inner.violet.transparent .brand,#navbar .navbar-inner.violet.transparent .nav>li>a{text-shadow:0 1px 0 #a774ff;color:#f2f2f2}#navbar .navbar-inner.black .brand,#navbar .navbar-inner.black .nav>li>a,#navbar .navbar-inner.black.transparent .brand,#navbar .navbar-inner.black.transparent .nav>li>a{text-shadow:0 1px 0 #5e5e5e;color:#f2f2f2}#navbar .navbar-inner.violet.transparent .brand .caret,#navbar .navbar-inner.violet.transparent .nav>li>a .caret{border-bottom-color:#b58df9;border-top-color:#b58df9}#navbar .navbar-inner.violet.transparent .brand:focus .caret,#navbar .navbar-inner.violet.transparent .brand:hover .caret,#navbar .navbar-inner.violet.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.violet.transparent .nav>li>a:hover .caret{border-bottom-color:#d3bff5;border-top-color:#d3bff5}#navbar .navbar-inner.violet.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.violet.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.violet.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.violet.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.violet.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(128,67,233,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(80,0,218,.6)),to(rgba(200,167,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#995000da', endColorstr='#99c8a7ff', GradientType=0)}#navbar .navbar-inner.violet.transparent .nav>li>a:hover{background-color:rgba(138,85,230,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(184,142,255,.6)),to(rgba(71,0,193,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99b88eff', endColorstr='#994700c1', GradientType=0)}#navbar .navbar-inner.black{background-color:#4f4f4f;background-image:-moz-linear-gradient(top,#787878,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#787878),to(#121212));background-image:-webkit-linear-gradient(top,#787878,#121212);background-image:-o-linear-gradient(top,#787878,#121212);background-image:linear-gradient(to bottom,#787878,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff787878', endColorstr='#ff121212', GradientType=0)}#navbar .navbar-inner.black .brand .caret,#navbar .navbar-inner.black .nav>li>a .caret{border-bottom-color:#959595;border-top-color:#959595}#navbar .navbar-inner.black .brand:focus .caret,#navbar .navbar-inner.black .brand:hover .caret,#navbar .navbar-inner.black .nav>li>a:focus .caret,#navbar .navbar-inner.black .nav>li>a:hover .caret{border-bottom-color:#c4c4c4;border-top-color:#c4c4c4}#navbar .navbar-inner.black .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.black .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.black .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.black .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.black .nav>li.dropdown.open>.dropdown-toggle{background-color:#3b3b3b;background-image:-moz-linear-gradient(top,#121212,#787878);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#787878));background-image:-webkit-linear-gradient(top,#121212,#787878);background-image:-o-linear-gradient(top,#121212,#787878);background-image:linear-gradient(to bottom,#121212,#787878);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212', endColorstr='#ff787878', GradientType=0)}#navbar .navbar-inner.black .nav>li>a:hover{background-color:#424242;background-image:-moz-linear-gradient(top,#6b6b6b,#050505);background-image:-webkit-gradient(linear,0 0,0 100%,from(#6b6b6b),to(#050505));background-image:-webkit-linear-gradient(top,#6b6b6b,#050505);background-image:-o-linear-gradient(top,#6b6b6b,#050505);background-image:linear-gradient(to bottom,#6b6b6b,#050505);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6b6b6b', endColorstr='#ff050505', GradientType=0)}#navbar .navbar-inner.black.transparent{background-color:rgba(79,79,79,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(120,120,120,.6)),to(rgba(18,18,18,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99787878', endColorstr='#99121212', GradientType=0)}#navbar .navbar-inner.black.transparent .brand .caret,#navbar .navbar-inner.black.transparent .nav>li>a .caret{border-bottom-color:#959595;border-top-color:#959595}#navbar .navbar-inner.black.transparent .brand:focus .caret,#navbar .navbar-inner.black.transparent .brand:hover .caret,#navbar .navbar-inner.black.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.black.transparent .nav>li>a:hover .caret{border-bottom-color:#c4c4c4;border-top-color:#c4c4c4}#navbar .navbar-inner.black.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.black.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.black.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.black.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.black.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(59,59,59,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(18,18,18,.6)),to(rgba(120,120,120,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99121212', endColorstr='#99787878', GradientType=0)}#navbar .navbar-inner.black.transparent .nav>li>a:hover{background-color:rgba(66,66,66,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(107,107,107,.6)),to(rgba(5,5,5,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#996b6b6b', endColorstr='#99050505', GradientType=0)}#navbar .navbar-inner.white{background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#fff,#c8c8c8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#c8c8c8));background-image:-webkit-linear-gradient(top,#fff,#c8c8c8);background-image:-o-linear-gradient(top,#fff,#c8c8c8);background-image:linear-gradient(to bottom,#fff,#c8c8c8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffc8c8c8', GradientType=0)}#navbar .navbar-inner.white .brand,#navbar .navbar-inner.white .nav>li>a{text-shadow:0 1px 0 #c8c8c8;color:#333}#navbar .navbar-inner.white .brand .caret,#navbar .navbar-inner.white .nav>li>a .caret{border-bottom-color:#919191;border-top-color:#919191}#navbar .navbar-inner.white .brand:focus .caret,#navbar .navbar-inner.white .brand:hover .caret,#navbar .navbar-inner.white .nav>li>a:focus .caret,#navbar .navbar-inner.white .nav>li>a:hover .caret{border-bottom-color:#626262;border-top-color:#626262}#navbar .navbar-inner.white .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.white .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.white .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.white .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.white .nav>li.dropdown.open>.dropdown-toggle{background-color:#dedede;background-image:-moz-linear-gradient(top,#c8c8c8,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8c8c8),to(#fff));background-image:-webkit-linear-gradient(top,#c8c8c8,#fff);background-image:-o-linear-gradient(top,#c8c8c8,#fff);background-image:linear-gradient(to bottom,#c8c8c8,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8c8c8', endColorstr='#ffffffff', GradientType=0)}#navbar .navbar-inner.white .nav>li>a:hover{background-color:#dcdcdc;background-image:-moz-linear-gradient(top,#f2f2f2,#bbb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#bbb));background-image:-webkit-linear-gradient(top,#f2f2f2,#bbb);background-image:-o-linear-gradient(top,#f2f2f2,#bbb);background-image:linear-gradient(to bottom,#f2f2f2,#bbb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffbbbbbb', GradientType=0)}#navbar .navbar-inner.white.transparent{background-color:rgba(233,233,233,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.6)),to(rgba(200,200,200,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99ffffff', endColorstr='#99c8c8c8', GradientType=0)}#navbar .navbar-inner.white.transparent .brand,#navbar .navbar-inner.white.transparent .nav>li>a{text-shadow:0 1px 0 #c8c8c8;color:#333}#navbar .navbar-inner.white.transparent .brand .caret,#navbar .navbar-inner.white.transparent .nav>li>a .caret{border-bottom-color:#919191;border-top-color:#919191}#navbar .navbar-inner.white.transparent .brand:focus .caret,#navbar .navbar-inner.white.transparent .brand:hover .caret,#navbar .navbar-inner.white.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.white.transparent .nav>li>a:hover .caret{border-bottom-color:#626262;border-top-color:#626262}#navbar .navbar-inner.white.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.white.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.white.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.white.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.white.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(222,222,222,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,200,200,.6)),to(rgba(255,255,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8c8c8', endColorstr='#99ffffff', GradientType=0)}#navbar .navbar-inner.white.transparent .nav>li>a:hover{background-color:rgba(220,220,220,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(242,242,242,.6)),to(rgba(187,187,187,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f2f2f2', endColorstr='#99bbbbbb', GradientType=0)}#navbar .navbar-inner .brand{padding:10px 20px 6px}#navbar .navbar-inner .brand span{padding-left:26px;background-size:20px 20px;background-repeat:no-repeat;display:inline-block;max-width:250px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:top;line-height:20px;height:24px}#navbar_login a.dropdown-toggle span{display:inline-block;max-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.octoprint-container{margin-top:20px}.octoprint-container .tab-content{padding:9px 15px;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:1px solid #ddd;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.octoprint-container .nav{margin-bottom:0}.octoprint-container .tab-content h1{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5;font-weight:400}.octoprint-container .accordion-heading .accordion-heading-button{float:right}.octoprint-container .accordion-heading .accordion-heading-button>a{display:inline-block;padding:8px 15px;font-size:14px;line-height:20px;color:#000;text-decoration:none;background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.octoprint-container .accordion-heading a.accordion-toggle{display:inline-block}.octoprint-container .accordion-heading [class*=" icon-"],.octoprint-container .accordion-heading [class^=icon-]{color:#000}.print-control .btn{padding-left:4px;padding-right:4px}.upload-buttons .btn{margin-right:0}table{table-layout:fixed}table .popover-title{text-overflow:ellipsis;word-break:break-all}table td,table th{overflow:hidden}table td.gcode_files_name,table th.gcode_files_name{text-overflow:ellipsis;text-align:left;white-space:nowrap}table td.gcode_files_action,table th.gcode_files_action{width:90px;text-align:center;white-space:nowrap}table td.gcode_files_action a,table th.gcode_files_action a{text-decoration:none;color:#000}table td.gcode_files_action a.disabled,table th.gcode_files_action a.disabled{color:#ccc;cursor:default}table td.timelapse_files_checkbox,table td.timelapse_unrendered_checkbox,table th.timelapse_files_checkbox,table th.timelapse_unrendered_checkbox{text-align:center;vertical-align:middle;width:10px}table td.timelapse_unrendered_name,table th.timelapse_unrendered_name{text-overflow:ellipsis;text-align:left}table td.timelapse_files_details .name,table th.timelapse_files_details .name{text-overflow:ellipsis;text-align:left;margin:0}table td.timelapse_files_details .detail,table th.timelapse_files_details .detail{text-overflow:ellipsis;text-align:left;margin:0;font-size:85%;color:#999}table td.timelapse_files_thumb,table th.timelapse_files_thumb{width:110px;position:relative}table td.timelapse_files_thumb .thumb,table th.timelapse_files_thumb .thumb{width:110px;height:calc(110px * 9 / 16);border-radius:3px;background-color:#eee;position:relative}table td.timelapse_files_thumb .thumb.letterbox,table th.timelapse_files_thumb .thumb.letterbox{background-color:#000}table td.timelapse_files_thumb .thumb img,table th.timelapse_files_thumb .thumb img{max-width:100%;max-height:100%;border-radius:3px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}table td table.settings_groups_details_table td,table td table.settings_groups_details_table th,table td table.settings_users_details_table td,table td table.settings_users_details_table th,table th table.settings_groups_details_table td,table th table.settings_groups_details_table th,table th table.settings_users_details_table td,table th table.settings_users_details_table th{padding:0;border:0}table td.timelapse_files_thumb .thumb a,table th.timelapse_files_thumb .thumb a{background-image:url(/static/img/play.svg);background-position:center;background-repeat:no-repeat;background-size:32px 32px;width:100%;height:100%;opacity:.8;position:absolute;top:0;left:0;content:""}table td.timelapse_files_thumb .thumb a:hover,table th.timelapse_files_thumb .thumb a:hover{opacity:1}table td.timelapse_files_size,table td.timelapse_unrendered_size,table th.timelapse_files_size,table th.timelapse_unrendered_size{text-align:right;width:55px}table td.timelapse_unrendered_count,table th.timelapse_unrendered_count{text-align:right;width:45px}table td.timelapse_files_action,table td.timelapse_unrendered_action,table th.timelapse_files_action,table th.timelapse_unrendered_action{width:60px;position:relative;text-align:center;white-space:nowrap}table td.timelapse_files_action a,table td.timelapse_unrendered_action a,table th.timelapse_files_action a,table th.timelapse_unrendered_action a{text-decoration:none;color:#000}table td.timelapse_files_action a.disabled,table td.timelapse_unrendered_action a.disabled,table th.timelapse_files_action a.disabled,table th.timelapse_unrendered_action a.disabled{color:#ccc;cursor:default}table td.timelapse_files_action .btn-group,table td.timelapse_unrendered_action .btn-group,table th.timelapse_files_action .btn-group,table th.timelapse_unrendered_action .btn-group{position:absolute;bottom:5px;right:5px}table td.settings_users_name,table th.settings_users_name{text-overflow:ellipsis;text-align:left;width:100px}table td.settings_users_active,table th.settings_users_active{text-align:center;width:55px}table td table.settings_users_details_table,table th table.settings_users_details_table{font-size:.8em;margin-bottom:0}table td table.settings_users_details_table .settings_users_details_key,table th table.settings_users_details_table .settings_users_details_key{width:100px}table td.settings_groups_default,table th.settings_groups_default{text-align:center;width:20px}table td.settings_groups_name,table th.settings_groups_name{width:180px}table td table.settings_groups_details_table,table th table.settings_groups_details_table{font-size:.8em;margin-bottom:0}table td table.settings_groups_details_table .settings_groups_details_key,table th table.settings_groups_details_table .settings_groups_details_key{width:100px}table td.settings_groups_actions,table td.settings_users_actions,table th.settings_groups_actions,table th.settings_users_actions{width:60px;text-align:center;white-space:nowrap}table td.settings_groups_actions a,table td.settings_users_actions a,table th.settings_groups_actions a,table th.settings_users_actions a{text-decoration:none;color:#000}table td.settings_groups_actions a.disabled,table td.settings_users_actions a.disabled,table th.settings_groups_actions a.disabled,table th.settings_users_actions a.disabled{color:#ccc;cursor:default}table td.settings_accesscontrol_groups_list_checkbox,table td.settings_accesscontrol_permissions_list_checkbox,table td.settings_accesscontrol_subgroups_list_checkbox,table th.settings_accesscontrol_groups_list_checkbox,table th.settings_accesscontrol_permissions_list_checkbox,table th.settings_accesscontrol_subgroups_list_checkbox{width:20px}table td #settings-usersDialogAddUser,table td #settings-usersDialogEditUser,table th #settings-usersDialogAddUser,table th #settings-usersDialogEditUser{position:relative;top:50%;transform:translateY(-50%);margin-top:0!important}table td.settings_printerProfiles_profiles_name,table th.settings_printerProfiles_profiles_name{text-overflow:ellipsis;text-align:left}table td.settings_printerProfiles_profiles_model,table th.settings_printerProfiles_profiles_model{text-align:left;width:250px}table td.settings_printerProfiles_profiles_action,table th.settings_printerProfiles_profiles_action{width:80px;text-align:center;white-space:nowrap}table td.settings_printerProfiles_profiles_action a,table th.settings_printerProfiles_profiles_action a{text-decoration:none;color:#000}table td.settings_printerProfiles_profiles_action a.disabled,table th.settings_printerProfiles_profiles_action a.disabled{color:#ccc;cursor:default}#temperature-graph{height:350px;width:100%;background:url(../img/graph-background.png) center no-repeat}#temperature-table{table-layout:fixed;width:100%;margin-top:20px}#temperature-table td,#temperature-table th{line-height:25px}#temperature-table td.temperature_actual,#temperature-table td.temperature_offset,#temperature-table td.temperature_target,#temperature-table td.temperature_tool,#temperature-table th.temperature_actual,#temperature-table th.temperature_offset,#temperature-table th.temperature_target,#temperature-table th.temperature_tool{vertical-align:middle;text-align:center}#temperature-table td.temperature_actual form,#temperature-table td.temperature_offset form,#temperature-table td.temperature_target form,#temperature-table td.temperature_tool form,#temperature-table th.temperature_actual form,#temperature-table th.temperature_offset form,#temperature-table th.temperature_target form,#temperature-table th.temperature_tool form{margin:0}#temperature-table td.temperature_actual .dropdown-menu,#temperature-table td.temperature_offset .dropdown-menu,#temperature-table td.temperature_target .dropdown-menu,#temperature-table td.temperature_tool .dropdown-menu,#temperature-table th.temperature_actual .dropdown-menu,#temperature-table th.temperature_offset .dropdown-menu,#temperature-table th.temperature_target .dropdown-menu,#temperature-table th.temperature_tool .dropdown-menu{text-align:left}#temperature-table td.temperature_tool,#temperature-table th.temperature_tool{width:16%;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#speed_fill,#speed_innerWall,#speed_outerWall,#speed_support,#temp_newBedTemp,#temp_newTemp,#webcam_timelapse_fps,#webcam_timelapse_interval,#webcam_timelapse_postRoll,#webcam_timelapse_retractionZHop,.text-right{text-align:right}#temperature-table td.temperature_actual,#temperature-table th.temperature_actual{width:12%}#temperature-table td.temperature_target,#temperature-table th.temperature_target{width:42%;overflow:visible}#temperature-table td.temperature_offset,#temperature-table th.temperature_offset{width:30%}.temperature-mark-label{position:absolute;color:#fff;background-color:#aeb6bf;padding:0 5px;font-size:8px;transform-origin:0 0;transform:rotate(-90deg)}.temperature-mark-type-print{background-color:#218656}.temperature-mark-type-pause{background-color:#fdc02f}.temperature-mark-type-resume{background-color:#27caee}.temperature-mark-type-cancel{background-color:#da3749}.temperature-mark-type-done{background-color:#1b72f9}.temperature-mark-type-connected{background-color:#666}.temperature-mark-type-disconnected{background-color:#333}.tab-content,.tab-pane{overflow:visible}#connection_baudrates,#connection_ports,#connection_printers{width:100%}#offline_overlay,#reloadui_overlay{position:fixed;top:0;left:0;width:100%;height:100%;display:none}#offline_overlay{z-index:10002}#reloadui_overlay{z-index:10001}#offline_overlay_background,#reloadui_overlay_background{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#offline_overlay_wrapper,#reloadui_overlay_wrapper{position:absolute;top:0;bottom:0;left:0;right:0;padding-top:60px}#offline_overlay_wrapper .container,#reloadui_overlay_wrapper .container{margin:auto}#webcam_plugins_container{position:relative;border-radius:5px;margin-top:6px;overflow:hidden;min-height:300px;min-width:100%;background-color:#000}#webcam_plugins_container .tab-content{border:none;padding:0}#webcam_plugins_container:hover .keycontrol_overlay,#webcam_plugins_container:hover .nav,#webcam_plugins_container:hover .refresh_overlay{opacity:1}#webcam_plugins_container .nav{position:absolute;padding:5px;right:5px;top:5px;border-radius:5px;background:rgba(0,0,0,.5);opacity:0;transition:opacity .3s,visibility .3s}#webcam_plugins_container .nav .nav-item a{text-align:end;padding:5px;margin-bottom:1px;border-radius:5px;color:#fff}#webcam_plugins_container .nav .nav-item a:hover{background-color:rgba(255,255,255,.1);color:#fff}#webcam_plugins_container .nav .active{background-color:rgba(255,255,255,.2);border-radius:5px;color:#fff}#webcam_plugins_container .keycontrol_overlay,#webcam_plugins_container .refresh_overlay{position:absolute;left:5px;border-radius:5px;background:rgba(0,0,0,.5);opacity:0;transition:opacity .3s,visibility .3s}#webcam_plugins_container .refresh_overlay{padding:5px;top:5px}#webcam_plugins_container .refresh_overlay a{padding:5px;border-radius:5px;color:#fff}#webcam_plugins_container .refresh_overlay a:hover{background-color:rgba(255,255,255,.1);color:#fff}#webcam_plugins_container .keycontrol_overlay{right:5px;bottom:5px;overflow:hidden;font-size:85%;color:#fff;padding:0}#webcam_plugins_container .keycontrol_overlay kbd{border:1px solid #eee;border-radius:3px;margin-left:2px;margin-right:2px;font-size:90%;padding:2px;min-width:1em}#webcam_plugins_container .keycontrol_overlay .keycontrol_overlay_heading{position:relative;padding:10px;font-weight:700}#webcam_plugins_container .keycontrol_overlay .keycontrol_overlay_column{position:relative;width:45%;padding:10px;float:left}#state_wrapper hr{margin:5px 0}#files .gcode_files .scroll-wrapper{overflow-x:hidden;overflow-y:scroll;height:306px;padding-right:2px;position:relative}#files .gcode_files .entry{padding:5px;line-height:20px;border-bottom:1px solid #ddd;position:relative}#files .gcode_files .entry:hover{background-color:#f5f5f5}#files .gcode_files .entry .title{text-overflow:ellipsis;word-break:break-all;margin-right:30px;white-space:pre-wrap}#files .gcode_files .entry .additionalInfo,#files .gcode_files .entry .internal,#files .gcode_files .entry .size,#files .gcode_files .entry .uploaded{font-size:85%;color:#999}#files .gcode_files .entry .uploaded [title]{cursor:help}#control .custom_section h1,.clickable,.slider .slider-handle{cursor:pointer}#files .gcode_files .entry .internal{word-break:break-all}#files .gcode_files .entry .action-buttons{position:absolute;bottom:5px;right:5px}#files .gcode_files .entry .additionalInfo{padding-bottom:22px}@keyframes highlightframes{0%{background:#ff0}100%{background:0 0}}#files .gcode_files .entry.highlight{animation:highlightframes 2s}#files .gcode_files .back .back-path{white-space:nowrap}#files .gcode_files .back .back-path span{word-wrap:break-word;white-space:pre-line}#files .upload-buttons{margin-top:10px}#files .form-search{text-align:center;margin-bottom:5px!important}#control .box,#control .btn-group,#control .control-box,#control .jog-panel .slider{margin-bottom:10px}#control .jog-panel{float:left;margin-right:19px}#control h1{text-align:left}#control .jog-panel>div{text-align:center}#control .jog-panel>div.distance{text-align:left}#control .box{width:30px;height:30px;margin-right:10px;padding:0}#control .control-box{display:block;height:30px}#control .btn-group.distance>.btn{width:43px;padding:3px 0;height:30px}#control .slider-handle{width:14px;height:14px;margin-left:-7px;margin-top:-3px}#control .custom_section_horizontal>.custom_control{display:inline-block}#control .custom_section_vertical>.custom_control{display:block}#control .custom_control .slider{margin-left:10px;margin-right:10px;margin-bottom:2px}#control .pulsate_text_opacity{animation:pulsate_input 1s ease-out;animation-iteration-count:infinite}@keyframes pulsate_input{0%,100%{color:#555}50%{color:rgba(85,85,85,.2)}}#term .terminal{margin-bottom:30px}#term .terminal #terminal-output,#term .terminal #terminal-output-lowfi{min-height:340px;margin-bottom:5px}#settings_dialog .aboutlink,#settings_dialog .systeminfolink{float:left}#settings_dialog_menu,#wizard_dialog_menu{margin-left:0}#wizard_firstrun_acl .acl_decision{margin-top:1em}#wizard_firstrun_end p,#wizard_firstrun_start p{margin-bottom:1.5em;line-height:1.5}#settings_appearance_managelanguagesdialog_list{width:auto;height:300px;overflow-x:hidden;overflow-y:scroll;padding-right:2px}#settings_appearance_managelanguagesdialog_emptylist{overflow:hidden;width:100%;height:300px;text-align:center;display:table}#settings_appearance_managelanguagesdialog_emptylist div{display:table-cell;vertical-align:middle}#about_authors ul,#about_sponsors ul{columns:3;-webkit-columns:3;-moz-columns:3}.funding-banner{display:flex;flex-direction:row;align-items:center;padding:1em;height:60px;border-top:1px solid #85ba80;border-bottom:1px solid #85ba80;background-color:#85ba8066}.funding-banner .banner-icon{flex-shrink:0}.funding-banner .banner-text{flex-grow:1;font-size:1em;margin:0 0 0 1.5em}.footer ul li,.pnotify_additional_info .pnotify_more{font-size:85%}.footer ul{margin:0}.footer ul li{display:inline;margin-left:1em}.footer ul li:first-child{margin-left:0}.footer ul li a{color:#555}.footer #footer_links,.footer #footer_version{max-width:50%}.ui-pnotify{position:fixed}.ui-pnotify .alert a{color:#c09853}.ui-pnotify .alert-danger a,.ui-pnotify .alert-error a{color:#b94a48}.ui-pnotify .alert-success a{color:#468847}.ui-pnotify .alert-info a{color:#3a87ad}.text-center{text-align:center}.text-block{display:block}.overflow_visible{overflow:visible!important}.border_box{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none}textarea.block{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}@keyframes pulsate{0%,100%{opacity:.5}50%{opacity:1}}#drop_overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:none}#drop_overlay.in{display:block}#drop_overlay #drop_overlay_background{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#drop_overlay #drop_overlay_wrapper{position:absolute;top:0;bottom:0;left:0;right:0;padding-top:60px}#drop_overlay #drop_overlay_wrapper #drop,#drop_overlay #drop_overlay_wrapper #drop_background{position:absolute;top:0;left:0;margin-left:0;width:100%}#drop_overlay #drop_overlay_wrapper #drop_locally,#drop_overlay #drop_overlay_wrapper #drop_locally_background{position:absolute;top:0;left:50%;margin-left:-50%;width:50%;border-right:2px dashed #ccc}#drop_overlay #drop_overlay_wrapper #drop_sd,#drop_overlay #drop_overlay_wrapper #drop_sd_background{position:absolute;top:0;left:50%;margin-left:0;width:50%;border-left:2px dashed #ccc}#drop_overlay #drop_overlay_wrapper .dropzone{height:100%;z-index:10001;color:#fff;font-size:30px}#drop_overlay #drop_overlay_wrapper .dropzone i{font-size:50px}#drop_overlay #drop_overlay_wrapper .dropzone .text{display:block;text-align:center;line-height:40px;position:absolute;width:100%;bottom:5%;filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}#drop_overlay #drop_overlay_wrapper .dropzone_background{width:50%;height:100%;background-color:#000;filter:alpha(opacity=25);-moz-opacity:.25;-khtml-opacity:.25;opacity:.25}#drop_overlay #drop_overlay_wrapper .dropzone_background.hover{background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#drop_overlay #drop_overlay_wrapper .dropzone_background.fade{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;opacity:1}.center{float:none;margin-left:auto;margin-right:auto}.flipH{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.flipV{-webkit-transform:scaleY(-1);-moz-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}.flipH.flipV{-webkit-transform:scaleX(-1) scaleY(-1);-moz-transform:scaleX(-1) scaleY(-1);-ms-transform:scaleX(-1) scaleY(-1);transform:scaleX(-1) scaleY(-1)}.rotate90{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.ui-pnotify a{text-decoration:underline}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropdown-menu-right{right:0;left:auto}.slider .slider-selection{color:#fff;background-color:#006dcc;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.slider .slider-selection.active,.slider .slider-selection.disabled,.slider .slider-selection:active,.slider .slider-selection:focus,.slider .slider-selection:hover,.slider .slider-selection[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.slider .slider-selection.active,.slider .slider-selection:active{background-color:#039\9}.slider.slider-disabled .slider-selection{background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-track{background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.slider.slider-disabled .slider-track{background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-handle{display:inline-block;*display:inline;*zoom:1;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;*background-color:#e6e6e6;border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);padding:0;opacity:1;filter:alpha(opacity=100)}.slider .slider-handle.active,.slider .slider-handle.disabled,.slider .slider-handle:active,.slider .slider-handle:focus,.slider .slider-handle:hover,.slider .slider-handle[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.slider .slider-handle:first-child{*margin-left:0}.slider .slider-handle:focus,.slider .slider-handle:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.slider .slider-handle:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.slider .slider-handle.active,.slider .slider-handle:active{background-color:#ccc\9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.slider .slider-handle.disabled,.slider .slider-handle[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-handle.hide{display:none}.slider .slider-handle.round{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%}.modal.large{width:975px;margin-left:-487px}.full-sized-box{position:absolute;bottom:0;left:0;right:0;top:0;padding:15px}.full-sized-box .row-fluid{height:100%}@media (max-width:979px){.full-sized-box{position:static}}:root .full-sized-box,_::-webkit-full-page-media,_:future{position:static}.safari ::-webkit-scrollbar{width:10px;height:10px}.safari ::-webkit-scrollbar-track{border-radius:10px;-webkit-border-radius:10px}.safari ::-webkit-scrollbar-thumb{-webkit-border-radius:10px;border-radius:10px;background:rgba(100,100,100,.8)}.scrollable{height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.pre-output span{display:block}.input-append .add-on.add-on-limited,.input-prepend .add-on.add-on-limited{overflow-x:hidden;text-overflow:ellipsis;width:inherit}.input-append .btn-group:first-child .btn:first-child,.input-prepend .btn-group:first-child .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append .btn-group .btn:first-child,.input-prepend .btn-group .btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}label.checkbox input[type=checkbox],label.checkbox input[type=radio],label.radio input[type=checkbox],label.radio input[type=radio]{margin-top:2px}.input-append.input-block-level,.input-prepend.input-block-level{display:table}.input-append.input-block-level .add-on,.input-prepend.input-block-level .add-on{display:table-cell;width:1%}.input-append.input-block-level>input,.input-prepend.input-block-level>input{box-sizing:border-box;display:table;min-height:inherit;width:100%}.input-append.input-block-level :not(:last-child),.input-prepend.input-block-level :not(:last-child){border-right:0}.control-group.error .input-append .fileinput-button,.control-group.error .input-prepend .fileinput-button{border-color:#b94a48}.control-text{padding-top:5px;cursor:default}input[type=number]{text-align:right}input[type=number].input-nospin::-webkit-inner-spin-button,input[type=number].input-nospin::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number].input-nospin{-moz-appearance:textfield}.dropdown-menu li a.disabled,.dropdown-menu li a.disabled:active,.dropdown-menu li a.disabled:hover,.dropdown-menu li a.disabled:visited{background-color:transparent;background-image:none;color:#aaa;cursor:default}textarea.monospace{font-family:monospace}.progress-text-centered{position:relative}.progress-text-centered .bar{z-index:1;position:absolute;overflow:hidden}.progress-text-centered .progress-text-back,.progress-text-centered .progress-text-front{position:absolute;top:0;z-index:2;text-align:center;width:100%;box-sizing:border-box;padding:0 10px;font-size:12px;line-height:20px}.progress-text-centered .progress-text-front{color:#fff}.search-query-with-clear{position:relative}.search-query-with-clear .search-clear{display:inline-block;color:#ccc;position:absolute;right:28px;height:20px;padding:4px 0;cursor:pointer;visibility:hidden}.search-query-with-clear.active-clear .search-query{padding-right:28px;width:192px}.search-query-with-clear.active-clear .search-clear{visibility:visible}.search-query-with-clear input::-ms-clear{display:none}.search-query-with-clear input[type=search]::-webkit-search-cancel-button,.search-query-with-clear input[type=search]::-webkit-search-decoration,.search-query-with-clear input[type=search]::-webkit-search-results-button,.search-query-with-clear input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}#navbar_login:not(.open) #login_dropdown_loggedout{display:block;z-index:-1;height:0;width:0;padding:0!important;overflow:hidden;border:0;box-shadow:none;left:-9999px}#navbar_login:not(.open) #login_dropdown_loggedout.hide{display:none}#loginForm{margin:0}#loginForm button{margin-top:20px}#page-container-loading{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:12301}#page-container-loading .wrapper{position:absolute;top:0;bottom:0;left:0;right:0}#page-container-loading .wrapper .outer{display:table;width:100%;height:100%}#page-container-loading .wrapper .outer .inner{display:table-cell;vertical-align:middle}#page-container-loading .wrapper .outer .inner .content{text-align:center}#page-container-noscript{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:12310}#page-container-noscript .wrapper{position:absolute;top:0;bottom:0;left:0;right:0}#page-container-noscript .wrapper .outer{display:table;width:100%;height:100%}#page-container-noscript .wrapper .outer .inner{display:table-cell;vertical-align:middle}#page-container-noscript .wrapper .outer .inner .content{text-align:center}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes backgroundFadeIn{from{opacity:0}to{opacity:.7}}.fade-in{animation-name:fadeIn;animation-duration:.3s}.modal-backdrop:not(.fade){animation-name:backgroundFadeIn;animation-duration:.3s}
-.achievement-list .achievement-item .achievement-logo svg,.achievement-popup .achievement .achievement-logo svg{fill:currentColor}.achievement-list{display:flex;width:100%;flex-wrap:wrap}.achievement-list .achievement-item{display:flex;flex:1 1 calc(50% - 2.5em);max-width:calc(50% - 2.5em);padding:.5em;margin:.5em;border:1px solid #666;border-radius:.5em;opacity:.5}.achievement-list .achievement-item.achieved{color:#fff;background-color:#08c;border:1px solid #069;opacity:1}.achievement-list .achievement-item .achievement-logo{width:48px;height:48px;min-width:48px;margin-right:.5em}.achievement-popup .achievement{display:inline-flex;margin-top:1em}.achievement-popup .achievement .achievement-logo{width:48px;height:48px;min-width:48px;margin-right:.5em}.achievement-popup .achievement .achievement-description{flex-grow:1}.achievement-popup .achievement-nag{margin-top:1em}.achievement-popup .achievement-link{display:block;margin-top:1em}
-.sidebar_plugin_action_command_notification_entry {
- padding: 5px;
- line-height: 20px;
- border-bottom: 1px solid #ddd;
-}
-
-.sidebar_plugin_action_command_notification_scrollable {
- overflow-x: hidden;
- overflow-y: scroll;
- max-height: 306px;
-}
-
-table td.settings_plugin_announcements_channels_name,table th.settings_plugin_announcements_channels_name{text-overflow:ellipsis;text-align:left}table td.settings_plugin_announcements_channels_actions,table th.settings_plugin_announcements_channels_actions{text-align:center;width:80px}table td.settings_plugin_announcements_channels_actions a,table th.settings_plugin_announcements_channels_actions a{text-decoration:none;color:#000}table td.settings_plugin_announcements_channels_actions a.disabled,table th.settings_plugin_announcements_channels_actions a.disabled{color:#ccc;cursor:default}#plugin_announcements_dialog .unread{font-weight:700}#plugin_announcements_dialog article{padding-right:20px}#plugin_announcements_dialog article.read{opacity:.5}#plugin_announcements_dialog article.read:hover{opacity:1}#plugin_announcements_dialog article .actions{background-color:#f5f5f5;border-radius:2px;padding:2px 5px;margin-top:5px}#plugin_announcements_dialog article .actions .markread{float:right}#plugin_announcements_dialog article .actions a{color:#000}#plugin_announcements_dialog .modal-footer .configurelink{float:left}
-#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_actions,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_actions{width:75px;text-align:center}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_actions a,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_actions a{color:#000}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_user,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_user{width:100px}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_checkbox,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_checkbox{text-align:center;width:10px}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_checkbox input[type=checkbox],#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_checkbox input[type=checkbox]{margin-top:0}#plugin_appkeys_keygenerated .control-text{display:inline-block}
-#settings_plugin_backup_backup_table .settings_plugin_backup_actions{width:75px;text-align:center}#settings_plugin_backup_backup_table .settings_plugin_backup_actions a{color:#000}#settings_plugin_backup_backup_table .settings_plugin_backup_date{width:200px;text-align:right}#settings_plugin_backup_backup_table .settings_plugin_backup_size{width:100px;text-align:right}#settings_plugin_backup_backup_table .settings_plugin_backup_checkbox{text-align:center;width:10px}#settings_plugin_backup_backup_table .settings_plugin_backup_checkbox input[type=checkbox]{margin-top:0}#settings_plugin_backup_restoredialog_output .message{font-weight:700}#settings_plugin_backup_restoredialog_output .error{font-weight:700;color:#900}#settings_plugin_backup_restoredialog_output .stdout{color:#333}#settings_plugin_backup_restoredialog_output .stderr{color:#900}#settings_plugin_backup_restoredialog_output .call{color:#009}
-.classicwebcam_aspect_ratio_mixin{aspect-ratio:1}.classicwebcam_aspect_ratio_mixin.ratio43{aspect-ratio:4/3}.classicwebcam_aspect_ratio_mixin.ratio169{aspect-ratio:16/9}.classicwebcam_aspect_ratio_mixin.ratio1610{aspect-ratio:16/10}.classicwebcam_flexbox_mixin{width:100%;display:flex;justify-content:center;align-items:center}#webcam_video_container{width:100%;position:relative;outline:0}#webcam_video_container .video-controls{position:absolute;bottom:0;right:8px;z-index:10;opacity:.4}#webcam_video_container:hover .video-controls{opacity:1}#webcam_video_container #webcam_hls,#webcam_video_container #webcam_rtsp{width:100%;height:100%}#webcam_video_container .webcam_rotated,#webcam_video_container .webcam_unrotated{position:relative;width:100%;display:flex;justify-content:center;align-items:center;aspect-ratio:1}#webcam_video_container .webcam_rotated.ratio43,#webcam_video_container .webcam_unrotated.ratio43{aspect-ratio:4/3}#webcam_video_container .webcam_rotated.ratio169,#webcam_video_container .webcam_unrotated.ratio169{aspect-ratio:16/9}#webcam_video_container .webcam_rotated.ratio1610,#webcam_video_container .webcam_unrotated.ratio1610{aspect-ratio:16/10}#webcam_video_container .webcam_rotated .rotation_target,#webcam_video_container .webcam_rotated .rotation_target div,#webcam_video_container .webcam_unrotated .rotation_target,#webcam_video_container .webcam_unrotated .rotation_target div{width:100%;display:flex;justify-content:center;align-items:center}#webcam_video_container .webcam_rotated{aspect-ratio:1}#webcam_video_container .webcam_rotated .rotation_target{position:absolute;transform:rotate(-90deg)}#webcam_video_container .webcam_rotated .rotation_target div{height:100%}#webcam_img_container{width:100%;position:relative;outline:0;background-color:#000}#webcam_img_container .keycontrol_overlay{position:absolute;left:10px;right:10px;bottom:10px;background:rgba(0,0,0,.5);font-size:85%;color:#fff;padding:0}#webcam_img_container .keycontrol_overlay kbd{border:1px solid #eee;border-radius:3px;margin-left:2px;margin-right:2px;font-size:90%;padding:2px;min-width:1em}#webcam_img_container .keycontrol_overlay .keycontrol_overlay_heading{position:relative;padding:10px;font-weight:700}#webcam_img_container .keycontrol_overlay .keycontrol_overlay_column{position:relative;width:45%;padding:10px;float:left}#webcam_img_container .nowebcam{position:absolute;top:0;left:0;right:0;bottom:0}#webcam_img_container .nowebcam .text{color:#fff;text-align:center;position:relative;margin:auto;width:80%;top:50%;transform:translateY(-50%);display:block}#webcam_img_container .nowebcam .text.webcam_loading{animation:pulsate 3s ease-out;animation-iteration-count:infinite}#webcam_img_container .webcam_rotated{position:relative;width:100%;padding-bottom:100%;pointer-events:none}#webcam_img_container .webcam_rotated .webcam_fixed_ratio{position:absolute;transform:rotate(-90deg);top:0;bottom:0;pointer-events:none}#webcam_img_container .webcam_rotated .webcam_fixed_ratio .webcam_fixed_ratio_inner{width:100%;height:100%;pointer-events:none}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio{width:100%;pointer-events:none;aspect-ratio:1;position:relative}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio43{aspect-ratio:4/3}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio169{aspect-ratio:16/9}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio1610{aspect-ratio:16/10}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio .webcam_fixed_ratio_inner{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}#webcam_img_container img{width:100%;height:100%;object-fit:contain}#webcamTestContainer{min-height:384px}
-#sidebar_plugin_firmware_check_warning_wrapper{border:1px solid #b94a48}#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading{background-color:#b94a48;font-weight:700;color:#fff}#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading .icon-black,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:active,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:hover,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:visited{color:#fff}
-#gcode .progress{width:588px}#gcode .progress .bar{-webkit-transition:width 0s linear;-moz-transition:width 0s linear;-o-transition:width 0s linear;transition:width 0s linear}#gcode .canvas_container{position:relative}#gcode .canvas_container:active,#gcode .canvas_container:hover{outline:0}#gcode .layer-buttons{padding-top:5px;padding-bottom:7px}#gcode #gcode_layer_slider{position:absolute;right:0;top:0;height:568px;float:right}#gcode #gcode_layer_slider .slider-handle{width:14px;height:14px;margin-left:-3px;margin-top:-7px}#gcode #gcode_command_slider .slider-handle{width:14px;height:14px;margin-left:-7px;margin-top:-3px}
-table td.settings_logs_checkbox,table th.settings_logs_checkbox{text-align:center;width:10px}table td.settings_logs_checkbox input[type=checkbox],table th.settings_logs_checkbox input[type=checkbox]{margin-top:0}table td.settings_logs_name,table th.settings_logs_name{text-overflow:ellipsis;text-align:left}table td.settings_logs_size,table th.settings_logs_size{text-align:right;width:70px}table td.settings_logs_date,table th.settings_logs_date{text-align:left;width:130px}table td.settings_logs_action,table th.settings_logs_action{width:70px;text-align:center;white-space:nowrap}table td.settings_logs_action a,table th.settings_logs_action a{text-decoration:none;color:#000}table td.settings_logs_action a.disabled,table th.settings_logs_action a.disabled{color:#ccc;cursor:default}
-#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_checkbox input[type=checkbox],#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_checkbox input[type=checkbox],#settings_plugin_pluginmanager_pluginlist>table{margin-top:0}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions a,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions a,#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions a,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions a{color:#000;text-decoration:none}#settings_plugin_pluginmanager_pluginlist{height:calc(100vh - 450px);display:block;width:auto;overflow-x:hidden;padding-right:2px;margin-bottom:1em;position:relative;border-top:1px solid #eee;padding-top:6px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_checkbox,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_checkbox{text-align:center;width:10px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_name,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_name{text-overflow:ellipsis;text-align:left}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_name .prop,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_name .prop{white-space:nowrap}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions{text-align:center;width:80px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions a.disabled,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions a.disabled{color:#ccc;cursor:default}#settings_plugin_pluginmanager_orphanlist{display:block;width:auto;max-height:400px;overflow-x:hidden;overflow-y:scroll;padding-right:2px;margin-bottom:1em}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_id,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_id{text-overflow:ellipsis;text-align:left}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions{text-align:center;width:80px}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions a.disabled,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions a.disabled{color:#ccc;cursor:default}#settings_plugin_pluginmanager_repositorydialog h4{position:relative}#settings_plugin_pluginmanager_repositorydialog h4 a.dropdown-toggle{color:inherit;text-decoration:none;font-size:14px}#settings_plugin_pluginmanager_repositorydialog h4 ul.dropdown-menu{font-size:14px}#settings_plugin_pluginmanager_repositorydialog .form-search{text-align:center;margin-bottom:5px!important}#settings_plugin_pluginmanager_repositorydialog .form-inline{padding:5px 10px 5px 5px;margin-bottom:0}#settings_plugin_pluginmanager_repositorydialog .form-inline .help-block{margin-bottom:0;font-size:85%}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_empty,#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_unavailable{overflow:hidden;width:100%;height:400px;background-image:url(../../plugin/pluginmanager/static/img/repo_unavailable.png);text-align:center;display:table}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_empty div,#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_unavailable div{display:table-cell;vertical-align:middle}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list{width:auto;height:400px;overflow-x:hidden;overflow-y:scroll;padding-right:2px}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry{border-bottom:1px solid #ddd;padding:5px}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry .meta{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry .stats .prop{white-space:nowrap}#settings_plugin_pluginmanager_workingdialog_output{font-size:.8em}#settings_plugin_pluginmanager_workingdialog_output .message{font-weight:700}#settings_plugin_pluginmanager_workingdialog_output .separator{font-weight:700;color:#666}#settings_plugin_pluginmanager_workingdialog_output .error{font-weight:700;color:#900}#settings_plugin_pluginmanager_workingdialog_output .stdout{color:#333}#settings_plugin_pluginmanager_workingdialog_output .stderr{color:#900}#settings_plugin_pluginmanager_workingdialog_output .call{color:#009}
-#settings_plugin_softwareupdate_updatelist{display:block;width:auto;overflow-x:hidden;padding-right:2px;margin-bottom:1em}div.swupdate-advanced{margin-bottom:5px}td.settings_plugin_softwareupdate_column_update{width:16px}td.settings_plugin_softwareupdate_column_update a{text-decoration:none;color:#000}td.settings_plugin_softwareupdate_column_information .line{display:block}td.settings_plugin_softwareupdate_column_information .settings_plugin_softwareupdate_release_channel{line-height:20px;height:20px;font-size:9px;margin-bottom:0;vertical-align:baseline}#settings_plugin_softwareupdate_updatelog_list .line{display:block}#settings_plugin_softwareupdate_updatelog_list td.settings_plugin_softwareupdate_column_datetime{width:150px}#settings_plugin_softwareupdate_workingdialog_output{font-size:.8em}#settings_plugin_softwareupdate_workingdialog_output .message{font-weight:700}#settings_plugin_softwareupdate_workingdialog_output .separator{font-weight:700;color:#666}#settings_plugin_softwareupdate_workingdialog_output .stdout{color:#333}#settings_plugin_softwareupdate_workingdialog_output .stderr{color:#900}#settings_plugin_softwareupdate_workingdialog_output .call{color:#009}#settings_plugin_softwareupdate_workingdialog_output .message_error{font-weight:700;color:#900}.softwareupdate_notification ul{margin:10px 0 10px 25px}.softwareupdate_notification ul .name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.progress-softwareupdate.progress{position:relative;display:flex;overflow:hidden;height:25px;font-size:12px}.progress-softwareupdate.progress .bar{display:flex;justify-content:center;align-items:center;width:100%;color:#fff;height:25px;font-size:12px}.progress-softwareupdate.progress .progress-text{position:absolute;display:flex;justify-content:center;align-items:center;left:0;right:0;top:0;bottom:0;background:#fff;transition:clip-path 1s linear;height:25px;font-size:12px}
\ No newline at end of file
diff --git a/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css.gz b/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.css.gz
deleted file mode 100644
index 23550f3c8dc42225a9245aa3c5d5f59843b5ab24..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 14048
zcmXxKV|1oX)3zPkwvCBxb7I@JZEIrNwrx8T+qRQ4$v4;iyx*VWN3T_@YV}^VRUh3&
z7!3twF~w^J^5bA=Y;9_yZ*1>m`peka8EDzpI_Z!zaqaaT{Yk||M?GsXKA9>~X?pnm
z#;5ml4=UW)cGt_THi)DGrHxvVqQWmm_-ETA5ePZ}NbJH)LRpubml;)%Bq353=#jB<
z5rB7`!MCe^s-5CfWoDS#o7bl3RGWB!kfgXnCo`9KZO#5C8h~=DKi8z})T^aw720;D
zmF(Hjb40CNHoeG6P50pK1~=!Jy7glC^xiXGcj}RvJNRnC^O<=iP_}&419gbD2Y|XG
zGc@E$1@+Szdp97A0zBOxJ8*VysD9s*YYxm^Uf!T#+@5>3&Q;L}*y4w+aPsz1f`9Yy
z5juUWrWI460*;k{03+^zl5TNDrPQ~n)q2jd)7MSn8A0pTG!lRL!)t-B%|2nTAC-{P
zhj`4gcYpaJ5{5?+wmK>K*?oSQgFHk-HHtc((i$-*sX?n~|CwH5C3{CLy~evwcD^C@
zxfe|W-yPorW%oS4IibU?ZSojn!DTnkce9S2egIP
z6hZAORu~rM+%i^(uRc%_c<~F<292wEgS0UuxD$*g)(}{~s8`>&g-744@999PD>lK9nQRrnXb8CZeDAv0hq2g-zgVp;DwL~2^;HU@x2hU!~<=-W=8Ai_5pxElioY%xVOQ&nlY$Tq!=!bdn`COTNl_j5)*kc23C
zc+U>_n9u7zFpFWwu{ryW7
zrDIFksE$2#7hyNYmcLa4ks!Kvq3aF6h4u(a&pr$R*Dtt1q!$mNg}~cw4}dB^F$k&S
zi1YeR^W-jRUnA~oY$8D^lRl~Nl!twg&JRN0$3m*F_gdEcQA2Ibk|72nT1#f{
z4=%lvG11Lt+sncZ-6cu9RGbn(hxRL0Qs`Ig8m$fvleQ$z0!zpSFQsmUFo=s@Aj%PE
z71mkvPz^f~LBleHSaHQh9nu)gbxuVnc3`V1w&oGx7%T@u-b_tiUFrd?jxv}Qaez-6
z0@m-tRNc%@^kfsXG46^5LrW#~v=q2QW|YJ$x|dHehGi$yNlh^SfhY%CHWruk+Sz6+
ztXj<61k;XP246_P4w#IDsm_Z%Gm&JvF*K{Oc1v2ikAYaq$VTmyBfnhB#jatu7SB||
zJ0WNvtO+th-W#=`Qd>~s6~y?(V%ew0b&P)$`>2xoE$WUx+7C
z_|yk{<5yexlxp%IA7g%c`Jnbz~|h}ktAJE=Sn
z9N?F#iY1N!xa5VJLShaWYh(sEnUp(@!GmZBLvX(~L{G>R<>2CayG*zoSo!uJM%Yv#
zj|ihA&AnSvO1Ue{TcqljDG4*+un=?LKr?RGkH`r~HI?ZgIbA!9J(a5OYXY_CXRjm8
zfWTc-Hv-AMcR~u=O;e3oiCyg0@Lg9=0#s5mmaVsfA|mD4>m8?_Em8P3(j`~0F#YPi
zv5@_=DRM09Iq#5VV7S3kpg8KJDyZ?;Dk`k3ijk(~Q_VNRF>LJuV1wJmZRpGuGqdD>
z`X6cHP&(?wCN^VlK8lic@dKWeY8Y)e?m#_oZ!d}F8a=YkULx%b2d>H58Pq6|##pzo
zt@~}52#sIGz4(K}qJiCE*?BzvKA$lLWWno03!3?77J1U=d(JFu+4xin9_AUz8kVCGa1J%0oC>9HUVUC3`2JY9)_LJtVkkj=yC%y3#xLXV2*lnSiHmty5Nx7Ne
zFZfk2ZN$3bs9c4J>~aYdAHIE$p0|_KIk@AE5SDkI{W@D>=cbUD0`|(2z>fC|f7*-<
z;b*1Zyi*VoQuN=Y4DXh_m@#W!LiD=R0X}FI_#Our2YrL0yudNWXI>YezZc;
zHdl?c$XNtkz&!CNm`bYeD4vv80f!Eum!W$rZ`$tN%J<(+2z^&WgPDiBqV3SUciwMI
z2u#3Ogc~5mj^aqO`GV-sz#Wb$y+|o;HEPKVv%EnS)q{l}5^GL
zn2vbJHz@W`tjaek+V*Ufheypj!CtJb6vf+%OzJnvPN$F*0z#GLa2QG;+n@fes*k&P
zBM!p|x%vP?8pQ#kdu(Zd2H;sCP=>^@T&fOZt&WOxI2C0
zpT~Fk^YbrCDnAh-UGv<>8RwI<$Ir{JTY0JMuoVez-~9CGBnHdm>0jqq!>~{4EO!s{mhoGBz_8@8sCv;$@AJ
zHr#i{B87`t^-u&WFG
zH}1v3*%4npmlp-FMzFlHOi(w-
z+-?f6M8Kf!36LyCnZkO8k3eZFjo^-5%hq`N&%m-EvHGAv%i*zA1a13=vzEP%m2e@N
z%ow;^MrRFGFV5~MG$3jPCC0FOT+Y@IWi8=ZLW^{9y8|^7-xf$v*s#r?+5lS0l93rZu9hJjE;VI<6P1#}n?r{+ajjROV2|B@DFM6mm8gM^vUWPbh+
zdl6=0+ti}Y^nsg&9jWUOg&poi0=#duyKIILoOM)FMx)
zNr=_u22lUZut17X8No*F2a#~HzHZEHgP9tG%dVciX*a<$8@tvRHyYa-FloK_`No(J
zqzvdt<6ezP(!Qqz${3gdyDz%+dS@-Mqfk7~Tn?Mu$IL^})g{z=UA
zih6b+4CsCcfq8}UzLr<&l_*jXK_*-hn1{7X58}_w>({Nhb~UKW+b7=>ZKT)3r__tp
zt`fc`wn$)_u;NvGd^9({(u^Gw=N_@5YY0p?_1d$lJ|=Vsbn4Sw$9<*7skiPTIP-F!
zITN4V&}(mP^Gk%7PUyGj$HPXo>`!79@Mj;@gZI!WR-WdH%)kZW!AT{tBqW8KMkNwEZ(jG(b
z+)v2^T>=DGZzPdP(P5cvW-c$bfur6^r#LA@HFEis2&{~Di?nGrLlhpe(UcRB{^j5a}ig`FYHTQ>Q*jE(1896&*eT4f#=
zbI!LA$hjtqeP12g)wo~#`hmRx)kd~%bZuZo3DZZjBA1MTy~L?lYU%fF6XPqFoRA>r
z)GurU!)!I_U@Ll?9SS=gFoN@;lxqlXW8)5L6E_mIfVdjh12J^OI{~vNX;2Lm7ZX_>
zAoaiWtV3t~wJ7zEHXZn2VJGY>exY&69<~>fT%2pMK+A_?c+^NJuEj(aCvnOA{~<6X
z4$X4g^51ICd;-Wl?n6MT;bQB6SM#L_DU-NC7y=tNJCMH6(3u6tAXsFAW5O`XA&8j;
z{3zjkK2~5qKWWhIRY6!V+$4~(5V-VQ8FFYTKRjn>g{0?nSzrkAz2!eo{IUP%i68!-
zCm$S9GdEux(aB6`W%xXCw2TkdM6BC0$o(RIc&Nw^RwP#EJaNMR#FWkpYrbLShmVju
zTMGD>h{8){`yJn?zBoIJ=QnO$m&+_UIB@XY%E1N3%ypw^`0)bxC1Lu;D%DGz>>(F)
zTgHq^=DX2kTve|CsRROf5So%(NhCD&Ph=lT1pKleJ@N_(5eZZLBT=l{HbfVaaa!xk
z$Dtgk$&aOrcYjj3kc7zPrJpeuk~2X(8_bwX(L20bPq`5B@6ChbH)uUDH+Z9MC_4P4
z4&>6a0KhpF8y<9#QO;-*5o*W1NR(iB
zXg-Fc-|K(mvkjQIlxqYIn}=rSVf+?4Nz=Nu(=?PO-+T@3mjRPzpPkPa8$;QfwALV~
z!NAIAtY=7_TDIDU%8X-i3EM|>ZM!5*e%3_LxkX^ZAQOaGgM^XfwhN9;0-Fk50FAP!
zRa(EF2aVFWFd(E0GXn$|{ak6!Ta^lBf{Hh>@KYr}Qg
zF}D+;wj>kTG|E5P%KSgtLjR+!#y{HD|0~E*6z(+YcY@X$0!gHJ4zF%o8V!0kN-u
zP+RlH@4c|9<^6ouEy0t9c?BuRH)w+S3CK?9Vpmt!=Y2U4)n_T!Hvxb)ys=_M$>yJP
zw0R&-l~cldI|@WQLV6pz7)re@O=|mS%*{wlcfTA<0?~ttbQ8zC();%$c
z$Fy{n=}G|w|COE$OJMVCWBXi3u8J|9<<
z{oFhIuUTrd>|rB#5RqtftJWYsSO!h{!f}&1BW!#2y9|S|`VwLOe!AgS(8f4|9E
zU7;%qRAwv-E5sfmmgEzor>{83=8VWS2vZDjX#igQ>`kBdT~5!!jX-X-iU%(Vd*s@H
zb`Mro86+f4C=RM|Ukl%4%`BvUyhWv?5{m=J)}YcuO!JM2=?D5$Rqg?FKT4e@5+R
zItD@icjQDL8Hct0&2$ny;zh4b)3ZEjG0o=onnue5bw=xric4yZS2D<#bh$PK-nq7i
z-3lcyXdLArDr*!ayZ8j?c=Liwa8#5t43})4C&J1P#kmcdYCEP}l!LqpoT{|4su^eQe>D+**3BCbZ%soWqDMLYeXeU!`T8MQ^Q$*kynPs@aWUZ(_xxqcZhB4;~9S}
za%hZXmzWIaJuW{(qW2Z~zg89FleUsW@xX_s{e;y=j94D*Z-MPPF5j-lz$W6yS!@N~
z8>?MY|C#khq_U>?A5X=>|M4`;@;{yi_JGv=@V*sdo+^Z`7yy84l98dVnts2{5?CdS
z=fl;DsN_Et-lf4>bY_a~i*yJbuNf=8NrEI&`GC#v!u0+5@2A-mt@j@$72iY^+>7oa
z|7(>vhHt%j)zgD_9MC#Tsn%nWTVsQF|Dq22lb;d3|9?@#4gD829AP19*uDrLjJE(g
z9MSmBknY?0;LdOyqfFZ#s4D-h)_i221;2QlO!&=oDxd&cg{y_{R6Id&Ip+uz|l+X_hhV4JtGLS@3
z*P;85wDbdo2GS$b?@P?PWEZf&`H$aKN}ON*sW9^L@*qk<8qYtYrY6HL8!RD&yb$?`>!FRqo^pl!$51nPPT&8h*c$kT|aBm@x3t_MlKWhU15%e
z=SgUQh>(myF|sPBp8c-+?y?#}!lsPy*WP|8*XRl6^(W+=;VFD9
zru-873dMk(x2a`DSly=nAExZEF;CIlqD3v?gNUUs15hCr;lC@A*9Xku$Xs1hwj|`R
z$E)Nk0pBy(ELcfu^d%l!Nf13i;WSf+*9D(}u|NK!ZhEAIw)f0z?`{ON1($3MVk4rP
zp347IYUjFJ(NV5}PMQwc?BAh~&dN5wPL2Kh2l{bFbMvW;0BJWYuS}Mmz?Wqg2c*kWFMzo7h3P?cQ9(qu++X7Sok&jFg6d9W8P#tX9
zlsRrm(75qG;RqruD!~SK+Feb%M3`FIRT0`9e6BK%HOe|StD
z0_H`osq(=VF6AO*RK+}+8(VjmHgIW9>Smx&3p0$#?O?7ZRAQjwFHE$#0#b-)NqOL%
z2PUeis!~C82P&_WueABuXV@T&mZm57nf~n$A0U$Qh`hV=%$xPidybtWF1&dl_K3}J
zUOy$;BiRO(al@2D-AUxnFPB5A^QIa&(H#a5re)bccvq
zTi<#<=bXED9ARLrTxz+CU{(1;PEDK$2S1Ks!{xs(l#yrjVw?#Gqd9OtFVY-6EAvUerrYkSLX`
zFio22CAX*a1`YUw&aws;poNYSKYHx&{!{%>IW_e)n0u|S^Kd7(AS7Xk;@l>H&v7pf+$N_#tnctOkCtr`XqJ@W=b5_FJY^_PnL`
zcw+;ozvO@hk=B(?0n>Ippt!q+?H9OgUy4kF5_Nw<=fg-QI?abNExvUMbT;P5EmSX-Z+e`)djZc6Vunkg@BAp}O;9`5S
zGo&*}Gu9UmsO@as@(WP)4wkvbql{mmk)v7(IvpiOlD?3P*(V9Kfc-+BppF@sAo}Lf
zpTin*mrIn#SE@fr9Q9-
zsZdY}#f-zop)|4>>&I4eFk#5a^``;$hJMxJN|;4>7-9>*Ix)!Kc;pcF*{X1O|L?+H
ziD-c-l0Ue@3|3lauHOsD=~pDrNL)`qoRwgk-D=y)3F=-2UBw8efj?U$Z=O`N1#@=y
z*a6t|TXo1~GFCx;`meOZj&4`h`a=QMyF&q4Y6H=q(H}ugb|?@o%jJ8ojVWm1b(4n<
z2VVEIZrO!uDnX(4=f9x1bZzH;bp{U+plLbC7QqZY&!`rcx1M
zL~^jdN?TVkzQ8}|-Z??B*#W05c4494>1p}P1`V{k2Ehz$pS>-Z_%ja@mhaXXXb^j$
zBi3gUA{T$c{u0iVuhRN;vwbiwTd;M|{5`5r=*Is>W$XxykbvM<89zD3+$pbHkD`O7
zxoovXW#DD3*%zojnR9YPz<6%{=*_VQyMpal8IZlYium2|buY2)H-Ky1*(1`rPbE}~
z2Wz7_w>XW#MFWg?477HPWtmuv>f7hO9ovtj;#^DyyoW^Xf`YT5m4`E~2p&?6
zOS=zZTFw|XVPTfg$W}Q~N<$1(To*Qp-s!Z
z;3AmcDyY}B1ZCYIpp>)qw!LBz<*}QeX8dn!OJ)r_HS-m1a^cWA2)RCy8Y>2U68O!E
zMeXBnr;V1jL|HX2&70Gsu7%910B7Y_w;Cd%QH&=JeZh^xT$Jt**K{4}lTpQ(Y{@Jp
zCEu{P9EI3Kvnug9ti+wS{RzE|%JbnP!cQPPa-g;4DVv%^A`?tnCTTbH3vj1okOlps
zVo9**WVkGYg#}3OE6A!Q_GQ6AD(T5Y8wjN*O)a&cZEUF$8KvyS#t;>(6}mca^wC2k
z=0Cv`yf}%TsFEC)p@ZoK`|o9}(+{sdC}TfWHYzSs6+bv-=-OB1;8*1kZm4GoPNeU1
z*_F?H_C8W~thk6clOm@^aNW)Mf@CQ$6udaBTuaTK8GtQ8rnXOfXAi
z>hR|)4PZ2<2)Y0vXO8&PASN=L>q6I!_!^#yh)j#JCUYyoQmenn432(-NN-j6E*wvv
zjp)wq4l%r7UY~y(7`L{~R8+@=hXBH%mwu)GDT0b%a?kV&xBNme)F(CgK2T}S35&jG
zoc3r8CY#gKAAMfcw~vgam<4*vJ-18qoz}7jX$>JrE1c7*JGfdcA$c{aJhLrskSswp
zde9k+TfxDAS*JQJuv!Z)`L__cd*2JfqI7>452YeF>#*I-vh)U_V4ccxNLlb26eF&0
zM@T^bFMAZh0M(tBeKv@86vpig6)ILOYK?pPEO-LO0w8nYmRoouAnuYc5V}s@m^$j;
zmKrFRnc4bM2kC|TQdH9wu?H`obbMnI92$S`Z*)U!dN(V+S6p<`G$@>*wuOIK;fLXy
zrkDVdIywTMv$Sy!l{pUIb}#Q5In3-O?@gNs?Mgrt$gDv}TPAXRo!*k#A|xdjZ!{WK
zp~?Qxa@Km`o)Zf!q2+^UdQ|{9^>7(CaLZ$D<;pJF{?GLS2cs)gEXXZA+5LBNE6IX!
zjdUW`(lsa$YAGL4+Ix7?&qj=lhsh_GwbLV>?dA$|Dg7Mhw~{`E1iXNHo|Ty0c6oI8
zpn+oD(fpZxJX#OsQfMvHus|m13DV9xmREi2RPt!BQ4y4y_rm4`C~205mT;A)IXEgw
zN~<$tRbs9&ycs}mJ8f}?CNz9}C1ON9rP-D`D%>z(G4QH4{uT!6>}6vTUGcF%95FW<
zGoGNwaz6JS6-NKO+>KyPfN3YFr?naNA*yY(h~YGj3OL(v8dTM@C!sRaID{u9E2kKXfzcwLo)smf2nx8RJsFT@{b0R>Qajai%VA6amdpFI3&vha0s)~G
zT7J2k&7Z-w{9?V|f1YVBhKlxIF`LgV8i4Cpx?_MIY{b!lCJ~zKlZh{qZ?$#Y)az2K
zfWaDIf{`(AWl?>~M}|oUaRg*G@ptT$&K{$;|MGhFC*ZO4TAt(AvOl?bEg2y{$P{+4uSBFgA1)+
zGO`FSkR2r9h7o4>ct(K3Jp8fdMCtskzeY+%b``O&2^foEcwYtJXG~z5uC7?p%38F&
z)g-KRr#pbQ4lZ2Zu(<_(p_J*{1=;#KN}U;3?!|?IxE#XkF%s{d+2?ANB>)tNk)G8q
zsjxvWf1TZDcIwXu;x(?&W3j@vhe`F{kp!0mPnCk7*{gM=*LV&&wC?TQ2VGpJW1inS
z5YPD)Xcm{hX(Xc|Jx@yxNM5wzco}CML`jsnO8>FmInGQ`Pz;E<6MwQ2mz}?Q^65}Z
z)z*^IplAYUU0*QI{~hRE!j6&wzZNJqj~|z2LqLePWKT3Sk-GQ&xmne}7xC?l{egs-
z#=i;0psWWBIzUqWeTSfrC`+I>>Y48&Y5*$RRyTmacogw6ZUai)o)u~AbvqfQ`UNcc
z#uoq#@zu0FL)(|uj|S$OI0V8WCw4g1Yv?|_`t({KvCe82Q=k_qgQw(?|Ka5aTLf3D
zy{?@tN*x2Se?+DfsLd7tY@>T6$ILxwtGfYWb3;ifN9w#Er-Z5r(mYZhfckQcmOJF0
zADpvWx92Xk0VEq)(HmS3oa9|k2reJ2*3uHXOW2-bQ~4~j;qs7+5D~tH_CZPl
zmGndqA*#(tDR}`n%~n0#ebp@N?d*xRUc@Ntk#%QI2Uy_s;H|B257da+WrfjaW;LCq
zn>otBIUHBVqnEN?g8%phCzdsDRs=jp)aRF__?+Q(ma;5%uTZdOfgk;b;A|7ZeY#8vTZA6oyHkQaZO_Hms>yOPLdd*&LZI~`}?
zC0(Id&$&u{bdqB{(5jD~ab`KOeNL)i)ojn0{D%{UI*qbZwZlWBN3G~ku~frDeL-|yQTWow>z%93QaA?^>+5`I{X?N@ek
z)F42uFBelZnU7;`{SAXyx^tc=$DtZaEg{6%CsNj8liPX4@7Tor%SE$p)SzT~@FGiH
zf~3dP!wtP__L*$E*7VDN80w8E_by-7dbH~r`t}BkBTLGAZQp*>Ip5>~&}#C~SvX;A
zl5~n#>h^2X-nViKEy)e)uvm```v)Z+V?N_AR#ya`YoJn29&MAVC;ZTKU9K|9UiM9HZy8qFHwwhoSXrm$D|@2R
zN><24qTSy#&43St?|u)1H6v?qQ86vgIN#X`XGns>jpQ)ZNk6PUpz_*lbT>y$7*kD4
zxc_~d-xy1Sqr3L2dbt>$k$ZIML-`;*9dS^*eVN&_
zyZ*UwM%pCxcc?@p5N*AD{$V2e#_Qlf21&J}L*ws7fIc;R-!miL8I2+$cl4Lvy&$2D
zsUrr%EXkXUAn}q{vetmlc|A$u&NEKy!-&j2%&)(Q+YifDIB>;Zbgq6kV6*SwfM$kz
zWj(F29Tm!M&^ihxz9CLKA6+hhp?Ro?D_ZcwhnRPG?ULe8!H{@2_Mr9&f6Ge}|5xr%
zPwURqiHm)V(XXpZJ!XA(dd!T*ligIi`}F-Ly$KjU2)+^Wx=h51(#s@qMj$@ix_0tvWd8%~ctm95M^&6jR%G>ZEH
zn>n{77|+ZfXM*s^DQsnSm4s3{ja6RK=HjBQ{HnOB!F{2nD3__mn)a<1{eP2l%jKL3
zM{~CxZ*=ATMWEQlM{s!{>$CZvHc+HfDa1tO-y|Nj$aN_pauVe7d(%3tW@VR%$P_2>
zqd-oC?9c1ellXVrUky(PXWo(?bHT+#J9#J!5)OUR^?2_&u=nwp7s+FW>~nie)Luhp
z8}<@*bR5>>)8W>s#J?%U2PhWfYi3V4ci3w9viva9!84y+-NtJzr|mpf{uHwIHW}dS
z^!Dr&5AStt+_)PYou(|)nDyCaWxzTAGMG1qf*j}8*;mX(DEGuB7$j-QtX$LWMU2*V
zo-uEdh&btKhFSLLC=di19$H64)WxN)>qaGSIp`PC-+VIf4Sa+Pl%QPb=sGKxN4O4D
z%yuOLt_2@!pR8Lz-oea{uSfjObUAnwQKVsMcZAv%1i4}g9wqqze;QTR8laAa)y=n}
zq$iIkND=!}2rM%8I*ny#GF5_H$&6uy7rY9j<
zvQ#+JQ4}2K?6n&iTK^3*H})mFJR(rymVBtOR3?GHFpwx!{_wbv=9~v}^_g55?1~?!(Lx
z-nU0EOuvU4c2)wc@Ck3zi$L+59+UHNG!ozw<_)lJ&|O!a<#TDbniFwcXWW03R+JqS(wd
zMHEBG15fbirFPtrb2BD%+>0WUbq?4*)~|Qq8yH>Rjxab0S;2!WpZnfrqwWQ*Y2cnM
zgd>ZD5LWtIh}~Z3AQ0cdUcRYKW??wgO+GYgU)16~me;h#MtOCypAs(tH;z$L{1Gi*>;}v~C4f+Oy~Z8N)-~s2->}h~*3|wf{2&F2!d^89`+@cN*&?cQOk()AUEIiFolP+o|5yG=L~Cc{
zXtC?!czQ)CN$MCHrABe_(-jmy(jp|-^vG+LCan2cGG^U+GZBE1Ay6DR1<8j6sN>_2
zep0^d4zI5uf`N!ak%V8w=W_t$M^Rkd4nKKtgW?TXCV85$t3j*m*uVY9KvcNt)CyTR
zUH5mig}%?nYmHc(U4hF9FdnQvI*=vOR<(2lSKfeVq=NroTK%47uB_jWoqY-9uYJ|Q
zRDF_KRe7%tfVdN79fHC=eY+Q1_*Q5Yq^2inEiu$`PrI0i+r!OtC>!enJZkP6JC*V#(gE~5qzD-2b=IDfsU!kCN
z)Eq#fYJ5ivXc`2E3b3LB8c(gGM?xP&4`Win$L*^m1msn{yg!DEXm!lYw+wM&b!*^k
zTBIR+nl%v_#lafqjyl`
zzBUEuu~H@{qTQlop5Ft!oQ>J2!nkZ9WwhvBEBxH|{|kwH6Ja->e7ni_hE3@yu}>U58I3|DM!4
zS%jYTq(;Bj#gGq}c830q$&4=P^|8M^XIhU{?ZrdBtC?V#
zqDvL|^4&fUSOs9p<7j0bE7(S^_|DA-@0F2jgJZXQH{d;qz6N3*_R;+JCmzSD3$aW|
zk@;>z_Cp#SA}!-m#5}uiE^llmb
z<~>J@&^e!6JVF;WnBGbXK?g}$Uu*{OiVAQKSVOX
z18ToF$CAGE+#|W|8W%E_IS|-2j|>D3j;tHq2?GMrla&5*#{MGFpylkbux*n!fHW~y
z5Nh0?zh7@0FsRsMELb?uB76ID7j#2nN5Xub!iDScF2;iz-UbtgSSX!J%Ez!aF{j$`
zP@P#w#p@59VxK7)y<$u{MfqK9W*>+KcFE&{zI0iuy?|~cuuw7p^2aT;FRfDDv%}}v%?i<>0W%-6
zX!NEMtY#Qn{}leUgB0m3(F@w6xnp~0o`SDM?FntmIc-4n^ZtO+X*(38^odJ{;&mmS
z{pnmAB6EIV?ikVG(D_+)*2_^SRHpZGW1#QOwL|5uXr98-1^9hLo$1B@d7qCT`|+-@fG@(wB341u&qkLg=9Xa53eSp
zC1e$+wfYL*S>EmS&f+yRWkq#+!jjS#vc^@6Wef7a4idfNN<6PxK0Pf=Z(<=cB6avY
z)4Z`#Zd0~It#dz#UyhM
z8X?b^6p^4A=#gL2m^JM99+vv$uSV_ZolN>cwDCt?;J}o`so;0ZIREUaK;REkYaVB@
zz`nJopS1j~fDnLg_Wc-6S776IQg&^bGk@Q6+xG2lW;jGDmqaV>0d2vBY>AS2xz2z+
z@i0SlAbyetjq0MYDsCf9j5kG%Q)+6Ub!4^s4bG|KOvhl8Tm|32)Cqdv
zfCf=Pw?=JcW(s;gU?EAe1>CJf%U;Y`BK&{!56=wD@U
zi&n;u5CX<7*IF^NA2XxeP8bbu@J-PAw`(OnzY6lC{PQrPW^b5p-IB6QP@e+Fzm+_a
zXO{hp@m^ZAea<$;vzNWi8PM26e(UtOzJL7C)TM4pz;D!5>5ep8!^pI$)sx4?}bw9{>OV
diff --git a/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.js b/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.js
deleted file mode 100644
index 30563e8..0000000
--- a/template-old/backup/octoprint/octoprint/generated/webassets/packed_core.js
+++ /dev/null
@@ -1,1908 +0,0 @@
-// source: js/app/bindings/allowbindings.js
-ko.bindingHandlers.allowBindings={init:function(elem,valueAccessor){return{controlsDescendantBindings:!valueAccessor()};}};ko.virtualElements.allowedBindings.allowBindings=true;
-;
-
-// source: js/app/bindings/contextmenu.js
-ko.bindingHandlers.contextMenu={init:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());$(element).contextMenu(val);},update:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());$(element).contextMenu(val);}};
-;
-
-// source: js/app/bindings/gettext.js
-ko.bindingHandlers.gettext={init:function(){return{controlsDescendantBindings:true};},update:function(element,valueAccessor){var gt=gettext||function(text){return text;};ko.utils.setTextContent(element,gt(valueAccessor()));}};ko.virtualElements.allowedBindings["gettext"]=true;
-;
-
-// source: js/app/bindings/invisible.js
-ko.bindingHandlers.invisible={init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());ko.bindingHandlers.style.update(element,function(){return{visibility:val?"hidden":"visible"};});},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());ko.bindingHandlers.style.update(element,function(){return{visibility:val?"hidden":"visible"};});}};
-;
-
-// source: js/app/bindings/popover.js
-ko.bindingHandlers.popover={keys:["title","animation","placement","trigger","delay","content","html"],init:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var keys=ko.bindingHandlers.popover.keys;var options={};_.each(keys,function(key){options[key]=ko.utils.unwrapObservable(val[key]);});$(element).popover(options);},update:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var keys=ko.bindingHandlers.popover.keys;var value;_.each(keys,function(key){value=ko.utils.unwrapObservable(val[key]);$(element).data("popover").options[key]=value;});}};
-;
-
-// source: js/app/bindings/qrcode.js
-ko.bindingHandlers.qrcode={update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var defaultOptions={text:"",size:200,fill:"#000",background:null,label:"",fontname:"sans",fontcolor:"#000",radius:0,ecLevel:"L"};var options={};_.each(defaultOptions,function(value,key){options[key]=ko.utils.unwrapObservable(val[key])||value;});$(element).empty().qrcode(options);}};
-;
-
-// source: js/app/bindings/slimscrolledforeach.js
-ko.bindingHandlers.slimScrolledForeach={makeTemplateValueAccessor:function(valueAccessor){var modelValue=valueAccessor(),unwrappedValue=ko.utils.peekObservable(modelValue),result,slimscroll;if(!unwrappedValue||typeof unwrappedValue.length==="number"){result={foreach:modelValue,templateEngine:ko.nativeTemplateEngine.instance};slimscroll={};}else{ko.utils.unwrapObservable(modelValue);result={foreach:unwrappedValue["data"],as:unwrappedValue["as"],includeDestroyed:unwrappedValue["includeDestroyed"],afterAdd:unwrappedValue["afterAdd"],beforeRemove:unwrappedValue["beforeRemove"],afterRender:unwrappedValue["afterRender"],beforeMove:unwrappedValue["beforeMove"],afterMove:unwrappedValue["afterMove"],templateEngine:ko.nativeTemplateEngine.instance};slimscroll=unwrappedValue["slimscroll"];}
-return{accessor:function(){return result;},slimscroll:slimscroll};},slimscroll:function(element,options){options=options||{};setTimeout(function(){if(element.nodeName==="#comment"){$(element.parentElement).slimScroll(options);}else{$(element).slimScroll(options);}},10);},init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var prepped=ko.bindingHandlers["slimScrolledForeach"].makeTemplateValueAccessor(valueAccessor);ko.bindingHandlers["slimScrolledForeach"].slimscroll(element,prepped.slimscroll);return ko.bindingHandlers["template"]["init"](element,prepped.accessor);},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var prepped=ko.bindingHandlers["slimScrolledForeach"].makeTemplateValueAccessor(valueAccessor);var options=$.extend(prepped.slimscroll,{scrollBy:0});ko.bindingHandlers["slimScrolledForeach"].slimscroll(element,options);return ko.bindingHandlers["template"]["update"](element,prepped.accessor,allBindings,viewModel,bindingContext);}};ko.virtualElements.allowedBindings.slimScrolledForeach=true;
-;
-
-// source: js/app/bindings/toggle.js
-ko.bindingHandlers.toggle={init:function(element,valueAccessor){var value=valueAccessor();if(!ko.isObservable(value)){throw new Error("toggle binding should be used only with observable values");}
-$(element).on("click",function(event){event.preventDefault();var previousValue=ko.utils.unwrapObservable(value);value(!previousValue);});},update:function(element,valueAccessor){ko.utils.toggleDomNodeCssClass(element,"active",ko.utils.unwrapObservable(valueAccessor()));}};
-;
-
-// source: js/app/bindings/togglecontent.js
-ko.bindingHandlers.toggleContent={init:function(element,valueAccessor){var $elm=$(element),options=$.extend({class:null,container:null,parent:null,onComplete:function(){$(document).trigger("slideCompleted");}},valueAccessor());$elm.on("click",function(e){e.preventDefault();if(options.class){$elm.children('[class^="icon-"]').toggleClass(options.class);$elm.children('[class^="fa"]').toggleClass(options.class);}
-if(options.container){if(options.parent){$elm.parents(options.parent).find(options.container).stop().slideToggle("fast",options.onComplete);}else{$(options.container).stop().slideToggle("fast",options.onComplete);}}});}};
-;
-
-// source: js/app/bindings/valuewithinit.js
-ko.bindingHandlers.valueWithInit={init:function(element,valueAccessor,allBindingsAccessor,context){var observable=valueAccessor();var value=element.value;observable(value);ko.bindingHandlers.value.init(element,valueAccessor,allBindingsAccessor,context);},update:ko.bindingHandlers.value.update};
-;
-
-// source: js/app/viewmodels/access.js
-$(function(){function AccessViewModel(parameters){var access=this;access.loginState=parameters[0];var GROUP_ADMINS="admins";var GROUP_GUESTS="guests";access.users=(function(){var self={};self.listHelper=new ItemListHelper("users",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase())
-return 1;return 0;}},{},"name",[],[],CONFIG_USERSPERPAGE);self.emptyUser={name:"",active:false};self.currentUser=ko.observable(self.emptyUser).extend({notify:"always"});self.isCurrentUser=(user)=>{return user&&user.name&&user.name==access.loginState.username();};self.isDeleteUserEnabled=(user)=>{return!self.isCurrentUser(user);};self.editor={name:ko.observable(undefined),groups:ko.observableArray([]),permissions:ko.observableArray([]),password:ko.observable(undefined),currentPassword:ko.observable(undefined),repeatedPassword:ko.observable(undefined),passwordMismatch:ko.pureComputed(function(){return self.editor.password()!==self.editor.repeatedPassword();}),providedUsername:ko.pureComputed(function(){return self.editor.name()&&self.editor.name().trim();}),validUsername:ko.pureComputed(function(){return(!self.editor.name()||self.editor.name()==self.editor.name().trim());}),currentPasswordMismatch:ko.observable(false),apikey:ko.observable(undefined),active:ko.observable(undefined),permissionSelectable:function(permission){return true;},permissionSelected:function(permission){var index=self.editor.permissions().indexOf(permission);return index>=0;},togglePermission:function(permission){var permissions=self.editor.permissions();var index=permissions.indexOf(permission);if(index<0){permissions.push(permission);}else{permissions.splice(index,1);}
-self.editor.permissions(permissions);},groupSelected:function(group){var index=self.editor.groups().indexOf(group);return index>=0;},toggleGroup:function(group){var groups=self.editor.groups();var index=groups.indexOf(group);if(index<0){groups.push(group);}else{groups.splice(index,1);}
-self.editor.groups(groups);},joinedGroupPermissions:function(group){return access.permissionList(group);},header:ko.observable(undefined),new:ko.observable(true),confirm:undefined,valid:ko.pureComputed(function(){return(self.editor.providedUsername()&&self.editor.validUsername()&&(!self.editor.new()||(self.editor.password()&&self.editor.password().trim()&&!self.editor.passwordMismatch())));}),dangerRestricted:function(){return false;},dangerRestrictedText:gettext("This user may not have dangerous permissions.")};self.userEditorDialog=undefined;self.changePasswordDialog=undefined;self.currentUser.subscribe(function(newValue){if(newValue===undefined){self.editor.name(undefined);self.editor.groups(access.groups.defaults.slice(0));self.editor.permissions([]);self.editor.active(true);self.editor.apikey(undefined);self.editor.header(gettext("Add user"));self.editor.new(true);self.editor.confirm=self.confirmAddUser;}else{self.editor.name(newValue.name);self.editor.groups(newValue.groups.slice(0));self.editor.permissions(newValue.permissions.slice(0));self.editor.active(newValue.active);self.editor.apikey(newValue.apikey);self.editor.header(_.sprintf(gettext('Edit user "%(name)s"'),{name:newValue.name}));self.editor.new(false);self.editor.confirm=self.confirmEditUser;}
-self.editor.password(undefined);self.editor.repeatedPassword(undefined);self.editor.currentPassword(undefined);self.editor.currentPasswordMismatch(false);});self.editor.currentPassword.subscribe(function(){self.editor.currentPasswordMismatch(false);});self.requestData=function(){if(!CONFIG_ACCESS_CONTROL)return;if(!access.loginState.hasPermissionKo(access.permissions.ADMIN))return;return OctoPrint.access.users.list().done(self.fromResponse);};self.fromResponse=function(response){self.listHelper.updateItems(response.users);};self.showAddUserDialog=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.currentUser(undefined);$('ul.nav-pills a[data-toggle="tab"]:first',self.userEditorDialog).tab("show");self.userEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmAddUser=function(){if(!CONFIG_ACCESS_CONTROL)return;var user={name:self.editor.name(),password:self.editor.password(),groups:self.editor.groups(),permissions:self.editor.permissions(),active:self.editor.active()};access.loginState.reauthenticateIfNecessary(()=>{self.addUser(user).done(function(){self.currentUser(undefined);self.userEditorDialog.modal("hide");});});};self.showEditUserDialog=function(user){if(!CONFIG_ACCESS_CONTROL)return;var process=function(user){self.currentUser(user);$('ul.nav-pills a[data-toggle="tab"]:first',self.userEditorDialog).tab("show");self.userEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});};access.loginState.reauthenticateIfNecessary(()=>{OctoPrint.users.get(user.name).done(function(data){process(data);}).fail(function(){log.warn("Could not fetch current user data, proceeding with client side data copy");process(user);});});};self.confirmEditUser=function(){if(!CONFIG_ACCESS_CONTROL)return;var user=self.currentUser();user.active=self.editor.active();user.groups=self.editor.groups();user.permissions=self.editor.permissions();access.loginState.reauthenticateIfNecessary(()=>{self.updateUser(user).done(function(){self.currentUser(undefined);self.userEditorDialog.modal("hide");});});};self.confirmRemoveUser=(user)=>{if(!CONFIG_ACCESS_CONTROL)return;if(user.name===access.loginState.username()){new PNotify({title:gettext("Not possible"),text:gettext("You may not delete your own account."),type:"error"});return $.Deferred().reject("You may not delete your own account").promise();}
-access.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog({title:gettext("Are you sure?"),message:_.sprintf(gettext('You are about to delete the user "%(name)s".'),{name:_.escape(user.name)}),proceed:gettext("Delete"),onproceed:()=>{self.removeUser(user);}});});};self.showChangePasswordDialog=function(user){if(!CONFIG_ACCESS_CONTROL)return;const proceed=()=>{self.currentUser(user);self.changePasswordDialog.modal("show");};if(self.isCurrentUser(user)){proceed();}else{access.loginState.reauthenticateIfNecessary(proceed);}};self.confirmChangePassword=function(){if(!CONFIG_ACCESS_CONTROL)return;const proceed=()=>{self.updatePassword(self.currentUser().name,self.editor.password(),self.editor.currentPassword()).done(function(){self.currentUser(undefined);self.changePasswordDialog.modal("hide");}).fail(function(xhr){if(xhr.status===403){self.currentPasswordMismatch(true);}});};if(self.isCurrentUser()){proceed();}else{access.loginState.reauthenticateIfNecessary(proceed);}};self.confirmGenerateApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.generateApikey(self.currentUser().name).done(function(response){self._updateApikey(response.apikey);});});};self.copyApikey=function(){copyToClipboard(self.editor.apikey());};self._updateApikey=function(apikey){self.editor.apikey(apikey);self.requestData();};self.confirmDeleteApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.deleteApikey(self.currentUser().name).done(function(){self._updateApikey(undefined);});});};self.onStartup=function(){self.userEditorDialog=$("#settings-usersEditorDialog");self.changePasswordDialog=$("#settings-usersDialogChangePassword");};self.addUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");}
-if(!access.loginState.hasPermissionKo(access.permissions.ADMIN)){return $.Deferred().reject("You are not authorized to perform this action").promise();}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.add(user).done(self.fromResponse);};self.removeUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");}
-if(!access.loginState.hasPermissionKo(access.permissions.ADMIN)){return $.Deferred().reject("You are not authorized to perform this action").promise();}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.delete(user.name).done(self.fromResponse);};self.updateUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.update(user.name,user.active,user.admin,user.permissions,user.groups).done(self.fromResponse);};self.updatePassword=function(username,password,current){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.changePassword(username,password,current);};self.generateApikey=function(username){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.generateApiKey(username).done(function(){self.requestData();});};self.deleteApikey=function(username){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.users.resetApiKey(username);};return self;})();access.groups=(function(){var self={};self.listHelper=new ItemListHelper("groups",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase())
-return 1;return 0;}},{},"name",[],[],CONFIG_GROUPSPERPAGE);self.groupsList=self.listHelper.items;self.lookup={};self.defaults=[];self.emptyGroup={name:""};self.currentGroup=ko.observable(self.emptyGroup);self.editor={key:ko.observable(undefined),name:ko.observable(undefined),description:ko.observable(undefined),permissions:ko.observableArray([]),subgroups:ko.observableArray([]),default:ko.observable(false),permissionSelectable:function(permission){return self.editor.key()!==GROUP_GUESTS||!permission.dangerous;},permissionSelected:function(permission){var index=self.editor.permissions().indexOf(permission);return index>=0;},togglePermission:function(permission){var permissions=self.editor.permissions();var index=permissions.indexOf(permission);if(index<0){permissions.push(permission);}else{permissions.splice(index,1);}
-self.editor.permissions(permissions);},subgroupSelectable:function(subgroup){return(self.editor.key()!==subgroup.key&&(self.editor.key()!==GROUP_GUESTS||!subgroup.dangerous));},subgroupSelected:function(subgroup){var index=self.editor.subgroups().indexOf(subgroup);return index>=0;},toggleSubgroup:function(subgroup){var subgroups=self.editor.subgroups();var index=subgroups.indexOf(subgroup);if(index<0){subgroups.push(subgroup);}else{subgroups.splice(index,1);}
-self.editor.subgroups(subgroups);},joinedGroupPermissions:function(group){return access.permissionList(group);},header:ko.observable(undefined),new:ko.observable(true),confirm:undefined,valid:ko.pureComputed(function(){return self.editor.name()&&self.editor.name().trim();}),dangerRestricted:function(){return self.editor.key()===GROUP_GUESTS;},dangerRestrictedText:gettext("This group may not have dangerous permissions or subgroups.")};self.groupEditorDialog=undefined;self.groupsList.subscribe(function(oldValue){if(oldValue===undefined||oldValue.length===0)return;oldValue.forEach(function(p){delete self[p.key.toUpperCase()];});},null,"beforeChange");self.groupsList.subscribe(function(newValue){if(newValue===undefined)return;newValue.forEach(function(g){var needs=[];g.permissions.forEach(function(p){for(var key in p.needs){p.needs[key].forEach(function(value){needs.push(access.permissions.need(key,value));});}});if(needs.length>0){self.registerGroup(g.key.toUpperCase(),needs);}});});self.registerGroup=function(name,group){Object.defineProperty(self,name,{value:group,enumerable:true,configurable:true});};self.currentGroup.subscribe(function(newValue){if(newValue===undefined){self.editor.key(undefined);self.editor.name(undefined);self.editor.description(undefined);self.editor.permissions([]);self.editor.subgroups([]);self.editor.default(false);self.editor.header(gettext("Add group"));self.editor.new(true);self.editor.confirm=self.confirmAddGroup;}else{self.editor.key(newValue.key);self.editor.name(newValue.name);self.editor.description(newValue.description);self.editor.permissions(newValue.permissions.slice(0));self.editor.subgroups(newValue.subgroups.slice(0));self.editor.default(newValue.default);self.editor.header(_.sprintf(gettext('Edit group "%(name)s"'),{name:newValue.name}));self.editor.new(false);self.editor.confirm=self.confirmEditGroup;}});self.requestData=function(){return OctoPrint.access.groups.list().done(self.fromResponse);};self.fromResponse=function(response){var lookup={};var defaults=[];_.each(response.groups,function(group){lookup[group.key]=group;if(group.default){defaults.push(group.key);}});self.lookup=lookup;self.defaults=defaults;self.listHelper.updateItems(response.groups);};self.showAddGroupDialog=function(){access.loginState.reauthenticateIfNecessary(()=>{self.currentGroup(undefined);$('ul.nav-pills a[data-toggle="tab"]:first',self.groupEditorDialog).tab("show");self.groupEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmAddGroup=function(){var group={key:self.editor.name().toLowerCase().replace(/[^a-z0-9_ ]/g,"").replace(/ /g,"_"),name:self.editor.name(),description:self.editor.description(),permissions:self.editor.permissions(),subgroups:self.editor.subgroups(),default:self.editor.default()};self.addGroup(group).done(function(){self.currentGroup(undefined);self.groupEditorDialog.modal("hide");});};self.showEditGroupDialog=function(group){if(!group.changeable)return;access.loginState.reauthenticateIfNecessary(()=>{self.currentGroup(group);$('ul.nav-pills a[data-toggle="tab"]:first',self.groupEditorDialog).tab("show");self.groupEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmEditGroup=function(){var group=self.currentGroup();var data={key:group.key,name:group.name,description:self.editor.description(),permissions:self.editor.permissions(),subgroups:self.editor.subgroups(),default:self.editor.default()};self.updateGroup(data).done(function(){self.currentGroup(undefined);self.groupEditorDialog.modal("hide");});};self.confirmRemoveGroup=(group)=>{if(!group.removable)return;access.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog({title:gettext("Are you sure?"),message:_.sprintf(gettext('You are about to delete the group "%(name)s".'),{name:_.escape(group.name)}),proceed:gettext("Delete"),onproceed:()=>{self.removeGroup(group);}});});};self.onStartup=function(){self.groupEditorDialog=$("#settings-groupsEditorDialog");};self.addGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.groups.add(group).done(self.fromResponse);};self.removeGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-OctoPrint.access.groups.delete(group.key).done((response)=>{self.fromResponse(response);access.users.requestData();});};self.updateGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");}
-if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();}
-return OctoPrint.access.groups.update(group).done(self.fromResponse);};return self;})();access.permissions=(function(){var self={};self.need=function(method,value){return{method:method,value:value};};self.roleNeed=function(value){return self.need("role",value);};self.permissionList=ko.observableArray([]);self.lookup={};var registeredPermissions=[];var registerPermission=function(key,permission){Object.defineProperty(self,key,{value:permission,enumerable:true,configurable:true});registeredPermissions.push(key);};var clearAllRegisteredPermissions=function(){_.each(registeredPermissions,function(key){delete self[key];});registeredPermissions=[];};self.initialize=function(){clearAllRegisteredPermissions();var permissionList=[];var lookup={};_.each(PERMISSIONS,function(permission){var needs=[];_.each(permission.needs,function(value,key){needs.push(self.need(key,value));});if(needs.length>0){registerPermission(permission.key,needs);}
-if(!permission.combined){permissionList.push(permission);}
-lookup[permission.key]=permission;});permissionList.sort(access.permissionComparator);self.permissionList(permissionList);self.lookup=lookup;};return self;})();access.groupComparator=function(a,b){var nameA=a.name?a.name.toUpperCase():"";var nameB=b.name?b.name.toUpperCase():"";if(nameAnameB){return 1;}else{return 0;}};access.permissionComparator=function(a,b){var nameA=a.name?a.name.toUpperCase():"";var nameB=b.name?b.name.toUpperCase():"";var pluginA=a.plugin||"";var pluginB=b.plugin||"";var compA=pluginA+":"+nameA;var compB=pluginB+":"+nameB;if(compAcompB){return 1;}else{return 0;}};access.groupList=function(data){if(data.groups===undefined)return"";var mappedGroups=_.filter(_.map(data.groups,function(g){return access.groups.lookup[g];}),function(g){return g!==undefined;});mappedGroups.sort(access.groupComparator);return _.map(mappedGroups,function(g){return g.name;}).join(", ");};access.subgroupList=function(data){if(data.subgroups===undefined)return"";var mappedGroups=_.filter(_.map(data.subgroups,function(g){return access.groups.lookup[g];}),function(g){return g!==undefined;});mappedGroups.sort(access.groupComparator);return _.map(mappedGroups,function(g){return g.name;}).join(", ");};access.permissionList=function(data){if(!data||data.permissions===undefined)return"";var mappedPermissions=_.filter(_.map(data.permissions,function(p){return access.permissions.lookup[p];}),function(p){return p!==undefined;});mappedPermissions.sort(access.permissionComparator);return _.map(mappedPermissions,function(p){return p.name;}).join(", ");};access.onStartup=function(){access.groups.onStartup();access.users.onStartup();};access.onServerConnect=function(){access.permissions.initialize();};access.onServerReconnect=function(){access.permissions.initialize();};access.onUserPermissionsChanged=access.onUserLoggedIn=access.onUserLoggedOut=function(user){if(access.loginState.hasPermission(access.permissions.ADMIN)){access.groups.requestData().done(function(){access.users.requestData();});}};}
-OCTOPRINT_VIEWMODELS.push([AccessViewModel,["loginStateViewModel"],[]]);});
-;
-
-// source: js/app/viewmodels/appearance.js
-$(function(){var save={};function themeFavicon(colorname){save.colorName=colorname;var link=document.querySelector("link[rel='shortcut icon']");if(!link){link=document.createElement("link");link.setAttribute("rel","shortcut icon");document.head.appendChild(link);}
-var faviconUrl=document.querySelector("link[rel~='mask-icon-theme']").href||link.href||window.location.origin+"/favicon.ico";function onImageLoaded(){var icosize=256;var canvas=document.createElement("canvas");canvas.width=icosize;canvas.height=icosize;var context=canvas.getContext("2d");function grayscale(){var imageData=context.getImageData(0,0,canvas.width,canvas.height),pixels=imageData.data,i,l,r,g,b,a,luma;for(i=0,l=pixels.length;i0||self.settings.settings.serial.ignoreEmptyPorts());});self.enablePort=ko.pureComputed(function(){return self.validPort()&&self.isErrorOrClosed();});self.enableSaveSettings=ko.pureComputed(function(){return self.enableConnect()&&self.isErrorOrClosed();});self.enableAutoConnect=ko.pureComputed(function(){return self.enableConnect()&&self.isErrorOrClosed();});self.previousIsOperational=undefined;self.refreshVisible=ko.observable(true);self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.CONNECTION)){return;}
-OctoPrint.connection.getSettings().done(self.fromResponse);};self.fromResponse=function(response){var ports=response.options.ports;var baudrates=response.options.baudrates;var currentPort=response.current.port;var currentBaudrate=response.current.baudrate;var currentPrinterProfile=response.current.printerProfile;var portPreference=response.options.portPreference;var baudratePreference=response.options.baudratePreference;var printerPreference=response.options.printerProfilePreference;var printerProfiles=response.options.printerProfiles;self.portOptions(ports);self.baudrateOptions(baudrates);if(!self.selectedPort()&&ports){if(ports.indexOf(currentPort)>=0){self.selectedPort(currentPort);}else if(ports.indexOf(portPreference)>=0){self.selectedPort(portPreference);}}
-if(!self.selectedBaudrate()&&baudrates){if(baudrates.indexOf(currentBaudrate)>=0){self.selectedBaudrate(currentBaudrate);}else if(baudrates.indexOf(baudratePreference)>=0){self.selectedBaudrate(baudratePreference);}}
-if(!self.selectedPrinter()&&printerProfiles){if(printerProfiles.indexOf(currentPrinterProfile)>=0){self.selectedPrinter(currentPrinterProfile);}else if(printerProfiles.indexOf(printerPreference)>=0){self.selectedPrinter(printerPreference);}}
-self.saveSettings(false);self.portOptionsFetched(true);};self.fromHistoryData=function(data){self._processStateData(data.state);};self.fromCurrentData=function(data){self._processStateData(data.state);};self.openOrCloseOnStateChange=function(force){if(!self._startupComplete&&!force)return;var connectionTab=$("#connection");if(self.isOperational()&&connectionTab.hasClass("in")){connectionTab.collapse("hide");self.refreshVisible(false);}else if(!self.isOperational()&&!connectionTab.hasClass("in")){connectionTab.collapse("show");self.refreshVisible(true);}};self._processStateData=function(data){self.previousIsOperational=self.isOperational();self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);if(self.previousIsOperational!==self.isOperational()){self.openOrCloseOnStateChange();}};self.connect=function(){if(self.isErrorOrClosed()){var data={port:self.selectedPort()||"AUTO",baudrate:self.selectedBaudrate()||0,printerProfile:self.selectedPrinter(),autoconnect:self.settings.serial_autoconnect()};if(self.saveSettings())data["save"]=true;OctoPrint.connection.connect(data).done(function(){self.settings.requestData();self.settings.printerProfiles.requestData();});}else{if(!self.isPrinting()&&!self.isPaused()){self.requestData();OctoPrint.connection.disconnect();}else{showConfirmationDialog({title:gettext("Are you sure?"),message:gettext("You are about to disconnect from the printer while a print "+"is in progress.
"+"Disconnecting while a print is in progress will prevent OctoPrint from "+"completing the print. If you're printing from an SD card attached directly "+"to the printer, any attempt to restart OctoPrint or reconnect to the printer "+"could interrupt the print.
"),question:gettext("Are you sure you want to disconnect from the printer?"),cancel:gettext("Stay Connected"),proceed:gettext("Disconnect"),onproceed:function(){self.requestData();OctoPrint.connection.disconnect();}});}}};self.onEventSettingsUpdated=function(){self.requestData();};self.onEventConnected=function(){self.requestData();};self.onEventDisconnected=function(){self.requestData();};self.onEventConnectionsAutorefreshed=function(){self.requestData();};self.onStartup=function(){var connectionTab=$("#connection");connectionTab.on("show",function(){self.refreshVisible(true);});connectionTab.on("hide",function(){self.refreshVisible(false);});};self.onStartupComplete=function(){self.openOrCloseOnStateChange(true);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};}
-OCTOPRINT_VIEWMODELS.push({construct:ConnectionViewModel,dependencies:["loginStateViewModel","settingsViewModel","printerProfilesViewModel","accessViewModel"],elements:["#connection_wrapper"]});});
-;
-
-// source: js/app/viewmodels/control.js
-$(function(){function ControlViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self._createToolEntry=function(){return{name:ko.observable(),key:ko.observable()};};self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.extrusionAmount=ko.observable(undefined);self.controls=ko.observableArray([]);self.distances=ko.observableArray([0.1,1,10,100]);self.distance=ko.observable(10);self.tools=ko.observableArray([]);self.feedRate=ko.observable();self.flowRate=ko.observable();self.feedbackControlLookup={};self.controlsFromServer=[];self.additionalControls=[];self.intersectionObservers=[];self.keycontrolActive=ko.observable(false);self.keycontrolHelpActive=ko.observable(false);self.keycontrolPossible=ko.pureComputed(function(){return(self.loginState.hasPermission(self.access.permissions.CONTROL)&&self.settings.feature_keyboardControl()&&self.isOperational()&&!self.isPrinting()&&!$.browser.mobile);});self.showKeycontrols=ko.pureComputed(function(){return self.keycontrolPossible();});self._visibleWebcam=undefined;self._dispatchWebcamRefresh=function(target){log.debug(`Webcam refresh triggered for #${target.id}`);var vm=ko.dataFor(target.children[0]);if(vm===self){log.debug(`VM for webcam #${target.id} is not bound, skipping refresh`);}else if(vm===undefined){log.debug(`VM for webcam #${target.id} not found, skipping refresh`);}else if(typeof vm.onWebcamRefresh==="function"){vm.onWebcamRefresh();}else{log.debug(`VM for webcam #${target.id} does not declare 'onWebcamRefresh()', skipping refresh (vm=${vm.constructor.name})`);}};self._dispatchWebcamVisibilityChange=function(target,visible){log.debug(`Webcam visibility of #${target.id} changed to ${visible}`);var vm=ko.dataFor(target.children[0]);if(vm===self){log.debug(`VM for webcam #${target.id} is not bound, skipping visibility update`);}else if(vm===undefined){log.debug(`VM for webcam #${target.id} not found, skipping visibility update`);}else if(typeof vm.onWebcamVisibilityChange==="function"){vm.onWebcamVisibilityChange(visible);}else{log.debug(`VM for webcam #${target.id} does not declare 'onWebcamVisibilityChange(visible)', skipping visibility update (vm=${vm.constructor.name})`);}};const selectedCameraStorageKey="core.control.selectedCamera";self.selectDefaultWebcam=function(){if(!document.querySelector("#webcam_plugins_container .nav")){$("#webcam-group .tab-pane:first").addClass("active");return;}
-let div=localStorage[selectedCameraStorageKey];if(!div||document.getElementById(div.slice(1))===null){div=undefined;}
-if(div!==undefined){$(`${div}_link a`).tab("show");}else{$("#webcam_plugins_container .nav li:first a").tab("show");}};self.onStartupComplete=function(){$("#webcam_plugins_container .nav a[data-toggle='tab']").on("shown",(e)=>{localStorage[selectedCameraStorageKey]=e.target.hash;});self.selectDefaultWebcam();self.recreateIntersectionObservers();};self.recreateIntersectionObservers=function(){self.intersectionObservers.forEach(function(observer){observer.disconnect();});self.intersectionObservers=[];document.querySelectorAll("#webcam-group .tab-pane").forEach(function(target){var options={root:document.querySelector("#webcam_plugins_container"),rootMargin:"0px",threshold:0.01};var callback=function(entries){var visible=entries[0].isIntersecting;self._dispatchWebcamVisibilityChange(target,visible);if(visible){self._visibleWebcam=target;}else if(self._visibleWebcam===target&&!visible){self._visibleWebcam=undefined;}};var observer=new IntersectionObserver(callback,options);observer.observe(target);self.intersectionObservers.push(observer);});};self.onBrowserTabVisibilityChange=function(tabVisible){if(self._visibleWebcam!==undefined){self._dispatchWebcamVisibilityChange(self._visibleWebcam,tabVisible);}};self.refreshWebcam=function(){if(self._visibleWebcam!==undefined){self._dispatchWebcamRefresh(self._visibleWebcam);}};self.settings.printerProfiles.currentProfileData.subscribe(function(){self._updateExtruderCount();self._updateExtrusionAmount();const data=self.settings.printerProfiles.currentProfileData();if(data&&data.extruder){if(data.extruder.defaultExtrusionLength){data.extruder.defaultExtrusionLength.subscribe(self._updateExtrusionAmount);}
-if(data.extruder.count){data.extruder.count.subscribe(self._updateExtruderCount);}}
-self.settings.printerProfiles.currentProfileData().extruder.count.subscribe(self._updateExtruderCount);});self._updateExtrusionAmount=function(){const data=self.settings.printerProfiles.currentProfileData();if(!data||!data.extruder){return;}
-self.extrusionAmount(self.settings.printerProfiles.currentProfileData().extruder.defaultExtrusionLength());};self._updateExtruderCount=function(){const data=self.settings.printerProfiles.currentProfileData();if(!data||!data.extruder||!data.extruder.count){return;}
-var tools=[];var numExtruders=self.settings.printerProfiles.currentProfileData().extruder.count();if(numExtruders>1){for(var extruder=0;extruder0){self.additionalControls=additionalControls;self.rerenderControls();}};self.onFocus=function(data,event){if(!self.settings.feature_keyboardControl())return;self.keycontrolActive(true);};self.onMouseOver=function(data,event){if(!self.settings.feature_keyboardControl())return;$("#webcam_plugins_container").focus();self.keycontrolActive(true);};self.onMouseOut=function(data,event){if(!self.settings.feature_keyboardControl())return;$("#webcam_plugins_container").blur();self.keycontrolActive(false);};self.toggleKeycontrolHelp=function(){self.keycontrolHelpActive(!self.keycontrolHelpActive());};self.onKeyDown=function(data,event){if(!self.settings.feature_keyboardControl())return;var button=undefined;var visualizeClick=true;switch(event.which){case 37:button=$("#control-xdec");break;case 38:button=$("#control-yinc");break;case 39:button=$("#control-xinc");break;case 40:button=$("#control-ydec");break;case 49:case 97:button=$("#control-distance01");visualizeClick=false;break;case 50:case 98:button=$("#control-distance1");visualizeClick=false;break;case 51:case 99:button=$("#control-distance10");visualizeClick=false;break;case 52:case 100:button=$("#control-distance100");visualizeClick=false;break;case 33:case 87:button=$("#control-zinc");break;case 34:case 83:button=$("#control-zdec");break;case 36:button=$("#control-xyhome");break;case 35:button=$("#control-zhome");break;case 9:event.preventDefault();return false;default:return true;}
-if(button===undefined){return false;}else{event.preventDefault();if(visualizeClick){button.addClass("active");setTimeout(function(){button.removeClass("active");},150);}
-button.click();}};self.stripDistanceDecimal=function(distance){return distance.toString().replace(".","");};}
-OCTOPRINT_VIEWMODELS.push({construct:ControlViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#control","#control_link"]});});
-;
-
-// source: js/app/viewmodels/files.js
-$(function(){function FilesViewModel(parameters){var self=this;self.settingsViewModel=parameters[0];self.loginState=parameters[1];self.printerState=parameters[2];self.slicing=parameters[3];self.printerProfiles=parameters[4];self.access=parameters[5];self.allViewModels=undefined;self.filesListVisible=ko.observable(true);self.showInternalFilename=ko.observable(true);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.isSdReady=ko.observable(undefined);self.searchQuery=ko.observable(undefined);self.searchQuery.subscribe(function(){self.performSearch();});self.freeSpace=ko.observable(undefined);self.totalSpace=ko.observable(undefined);self.freeSpaceString=ko.pureComputed(function(){if(!self.freeSpace())return"-";return formatSize(self.freeSpace());});self.totalSpaceString=ko.pureComputed(function(){if(!self.totalSpace())return"-";return formatSize(self.totalSpace());});self.diskusageWarning=ko.pureComputed(function(){return(self.freeSpace()!==undefined&&self.freeSpace()0);},sd:function(data){return data["origin"]&&data["origin"]==="sdcard";},local:function(data){return!(data["origin"]&&data["origin"]==="sdcard");}};var listHelperExclusiveFilters=[["sd","local"]];if(SUPPORTED_FILETYPES.length>1){_.each(SUPPORTED_FILETYPES,function(filetype){listHelperFilters[filetype]=function(data){return(data["type"]&&(data["type"]===filetype||data["type"]==="folder"));};});listHelperExclusiveFilters.push(SUPPORTED_FILETYPES);}
-var sortByName=function(a,b){if(a["display"].toLowerCase()b["display"].toLowerCase())return 1;return 0;};self.listHelper=new ItemListHelper("gcodeFiles",{name:sortByName,upload:function(a,b){if(a["date"]===undefined&&b["date"]===undefined){return sortByName(a,b);}
-if(b["date"]===undefined||a["date"]>b["date"])return-1;if(a["date"]===undefined||a["date"]valB){return-1;}else if(valAb["size"])return-1;if(a["size"]===undefined||a["size"]=1){if(arguments.length>=2){focus={location:arguments[1],path:arguments[0]};}else{focus={location:"local",path:arguments[0]};}}
-if(arguments.length>=3){switchToPath=arguments[2];}
-if(arguments.length>=4){force=arguments[3];}}
-self._filesToFocus=self._filesToFocus||focus;self._switchToPath=self._switchToPath||switchToPath;if(self._otherRequestInProgress!==undefined){return self._otherRequestInProgress;}
-return(self._otherRequestInProgress=OctoPrint.files.list(true,force).done(function(response){self.fromResponse(response,{focus:self._filesToFocus,switchToPath:self._switchToPath});}).fail(function(){self.allItems(undefined);self.listHelper.updateItems([]);}).always(function(){self._otherRequestInProgress=undefined;self._filesToFocus=[];self._switchToPath=undefined;}));};self.fromResponse=function(response,params){var focus=[];var switchToPath;if(_.isObject(params)){focus=params.focus||undefined;switchToPath=params.switchToPath||undefined;}else if(arguments.length>1){log.warn("FilesViewModel.fromResponse called with old argument list. That is deprecated, please use parameter object instead.");if(arguments.length>2){focus={location:arguments[2],path:arguments[1]};}else{focus={location:"local",path:arguments[1]};}
-if(arguments.length>3){switchToPath=arguments[3]||undefined;}}
-var files=response.files;self.allItems(files);var createFolderList=function(entries){var result=[];_.each(entries,function(entry){if(entry.type!=="folder")return;result.push("/"+entry.path);if(entry.children){result=result.concat(createFolderList(entry.children));}});return result;};const folders=createFolderList(files);folders.sort();self.folderList(["/"].concat(folders));var nonrecursive=false;_.each(files,function(file){if(file.type==="folder"&&file.children===undefined){nonrecursive=true;}});if(nonrecursive){log.error("At least one folder doesn't have a 'children' element defined. That means the file list request "+"wasn't actually made with 'recursive=true' in the query.\n\n"+"This can happen on wrong reverse proxy configs that "+"swallow up query parameters, see https://github.com/OctoPrint/OctoPrint/issues/2572");}
-if(!switchToPath){var currentPath=self.currentPath();if(currentPath===undefined){self.listHelper.updateItems(files);self.currentPath("");}else{self.changeFolderByPath(currentPath);}}else{self.changeFolderByPath(switchToPath);}
-if(focus.length){_.each(focus,function(focusItem,index){var entryElement=self.getEntryElement({path:focusItem.path,origin:focusItem.location});if(entryElement){if(index+1===focus.length){self.listElement.scrollTop(entryElement.offsetTop);}
-var element=$(entryElement);element.on("webkitAnimationEnd oanimationend msAnimationEnd animationend",function(e){element.removeClass("highlight");});element.addClass("highlight");}});}
-if(response.free!==undefined){self.freeSpace(response.free);}
-if(response.total!==undefined){self.totalSpace(response.total);}
-self.highlightCurrentFile();};self.changeFolder=function(data){if(data.children===undefined){log.error("Can't switch to folder '"+data.path+"', no children available");return;}
-self.currentPath(data.path);self.listHelper.updateItems(data.children);self.highlightCurrentFile();};self.navigateUp=function(){var path=self.currentPath().split("/");path.pop();self.changeFolderByPath(path.join("/"));};self.changeFolderByPath=function(path){var element=self.elementByPath(path);if(element){self.currentPath(path);self.listHelper.updateItems(element.children);}else{self.currentPath("");self.listHelper.updateItems(self.allItems());}
-self.highlightCurrentFile();};self.showAddFolderDialog=function(){if(!self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD))
-return;if(self.addFolderDialog){self.addFolderName("");self.addFolderDialog.modal("show");}};self.addFolder=function(){if(!self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD))
-return;var name=self.addFolderName();var location="local";self.ignoreUpdatedFilesEvent=true;self.addingFolder(true);OctoPrint.files.createFolder(location,name,self.currentPath()).done(function(data){self.requestData({focus:{path:data.folder.name,location:data.folder.origin}}).done(function(){self.addFolderDialog.modal("hide");}).always(function(){self.addingFolder(false);});}).fail(function(){self.addingFolder(false);}).always(function(){self.ignoreUpdatedFilesEvent=false;});};self.removeFolder=function(folder,event){if(!self.loginState.hasPermission(self.access.permissions.FILES_DELETE))
-return;if(!folder){return;}
-if(folder.type!=="folder"){return;}
-if(folder.weight>0){var options={message:_.sprintf(gettext('You are about to delete the folder "%(folder)s" which still contains files and/or sub folders.'),{folder:_.escape(folder.name)}),onproceed:function(){self._removeEntry(folder,event);}};showConfirmationDialog(options);}else{self._removeEntry(folder,event);}};self.loadFile=function(data,printAfterLoad){if(!self.loginState.hasPermission(self.access.permissions.FILES_SELECT))
-return;if(!data){return;}
-var proceed=function(p){var prevented=false;var callback=function(){OctoPrint.files.select(data.origin,data.path,p);};if(p){callViewModels(self.allViewModels,"onBeforePrintStart",function(method){prevented=prevented||method(callback)===false;});}
-if(!prevented){callback();}};if(printAfterLoad&&self.listHelper.isSelectedByMatcher(function(item){return item&&item.origin===data.origin&&item.path===data.path;})&&self.enablePrint(data)){self.printerState.print();}else{var withinPrintDimensions=self.evaluatePrintDimensions(data,true);var print=printAfterLoad&&withinPrintDimensions;if(print&&self.settingsViewModel.feature_printStartConfirmation()){showConfirmationDialog({message:gettext("This will start a new print job. Please check that the print bed is clear."),question:gettext("Do you want to start the print job now?"),cancel:gettext("No"),proceed:gettext("Yes"),onproceed:function(){proceed(print);},nofade:true});}else{proceed(print);}}};self.showMoveDialog=function(entry,event){if(!self.loginState.hasAllPermissions(self.access.permissions.FILES_UPLOAD,self.access.permissions.FILES_DELETE)){return;}
-if(!entry){return;}
-if(entry.origin!=="local"){return;}
-if(!self.moveDialog){return;}
-var slashPos=entry.path.lastIndexOf("/");var current;if(slashPos>=0){current="/"+entry.path.substr(0,slashPos);}else{current="/";}
-self.moveEntry(entry);self.moveError("");self.moveSource(current);self.moveDestination(current);self.moveSourceFilename(entry.name);self.moveDestinationFilename(entry.name);self.moveDialog.modal("show");};self.removeFile=function(file,event){if(!self.loginState.hasPermission(self.access.permissions.FILES_DELETE))
-return;if(!file){return;}
-if(file.type==="folder"){return;}
-self._removeEntry(file,event);};self.sliceFile=function(file){if(!self.loginState.hasPermission(self.access.permissions.SLICE))return;if(!file){return;}
-self.slicing.show(file.origin,file.path,true,undefined,{display:file.display});};self.initSdCard=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.initSd();};self.releaseSdCard=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.releaseSd();};self.refreshSdFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.refreshSd();};self.moveFileOrFolder=function(source,destination){self.movingFileOrFolder(true);return OctoPrint.files.move("local",source,destination).done(function(){self.requestData().done(function(){self.moveDialog.modal("hide");}).always(function(){self.movingFileOrFolder(false);});}).fail(function(){self.moveError(gettext("Unable to move file or folder")+" "+
-self.moveEntry().display+" "+
-gettext("to")+" "+
-self.moveDestination());self.movingFileOrFolder(false);});};self._removeEntry=function(entry,event){self.activeRemovals.push(entry.origin+":"+entry.path);var finishActiveRemoval=function(){self.activeRemovals(_.filter(self.activeRemovals(),function(e){return e!==entry.origin+":"+entry.path;}));};var activateSpinner=function(){},finishSpinner=function(){};if(event){var element=$(event.currentTarget);if(element.length){var icon=$("i.fa-trash-alt",element);if(icon.length){activateSpinner=function(){icon.removeClass("far fa-trash-alt").addClass("fas fa-spinner fa-spin");};finishSpinner=function(){icon.removeClass("fas fa-spinner fa-spin").addClass("far fa-trash-alt");};}}}
-activateSpinner();var deferred=$.Deferred();OctoPrint.files.delete(entry.origin,entry.path).done(function(){self.requestData().done(function(){deferred.resolve();}).fail(function(){deferred.reject();});}).fail(function(data){deferred.reject();var error=" "+
-gettext("Could not remove entry. Please check octoprint.log for possible reasons.")+"
";if(data.responseJSON&&data.responseJSON.error){error+=pnotifyAdditionalInfo(""+_.escape(data.responseJSON.error)+" ");}
-new PNotify({title:gettext("Failed to remove entry"),text:error,type:"error",hide:false});});return deferred.promise().always(function(){finishActiveRemoval();finishSpinner();});};self.downloadLink=function(data){if(data["refs"]&&data["refs"]["download"]){return data["refs"]["download"];}else{return false;}};self.lastTimePrinted=function(data){if(data["prints"]&&data["prints"]["last"]&&data["prints"]["last"]["date"]){return data["prints"]["last"]["date"];}else{return"-";}};self.getSuccessClass=function(data){if(!data["prints"]||!data["prints"]["last"]){return"";}
-return data["prints"]["last"]["success"]?"text-success":"text-error";};self.templateFor=function(data){return"files_template_"+data.type;};self.getEntryId=function(data){return"gcode_file_"+md5(data["origin"]+":"+data["path"]);};self.getEntryElement=function(data){var entryId=self.getEntryId(data);var entryElements=$("#"+entryId);if(entryElements&&entryElements[0]){return entryElements[0];}else{return undefined;}};self.enableRemove=function(data){if(_.contains(self.activeRemovals(),data.origin+":"+data.path)){return false;}
-var busy=false;if(data.type==="folder"){busy=_.any(self.printerState.busyFiles(),function(name){return _.startsWith(name,data.origin+":"+data.path+"/");});}else{busy=_.contains(self.printerState.busyFiles(),data.origin+":"+data.path);}
-return(self.loginState.hasPermission(self.access.permissions.FILES_DELETE)&&!busy);};self.enableMove=function(data){return(self.loginState.hasAllPermissions(self.access.permissions.FILES_UPLOAD,self.access.permissions.FILES_DELETE)&&data.origin==="local");};self.enableSelect=function(data){return(self.isLoadAndPrintActionPossible()&&!self.listHelper.isSelected(data));};self.enablePrint=function(data){return(self.loginState.hasPermission(self.access.permissions.PRINT)&&self.isOperational()&&!(self.isPrinting()||self.isPaused()||self.isLoading()));};self.enableSelectAndPrint=function(data,printAfterSelect){return self.isLoadAndPrintActionPossible();};self.enableSlicing=function(data){return(self.loginState.hasPermission(self.access.permissions.SLICE)&&self.slicing.enableSlicingDialog()&&self.slicing.enableSlicingDialogForFile(data.name));};self.enableAdditionalData=function(data){return data["gcodeAnalysis"]||(data["prints"]&&data["prints"]["last"]);};self.toggleAdditionalData=function(data){var entryElement=self.getEntryElement(data);if(!entryElement)return;var additionalInfo=$(".additionalInfo",entryElement);additionalInfo.slideToggle("fast",function(){$(".toggleAdditionalData i",entryElement).toggleClass("fa-chevron-down fa-chevron-up");});};self.getAdditionalData=function(data){var output="";if(data["gcodeAnalysis"]){if(data["gcodeAnalysis"]["_empty"]||!data["gcodeAnalysis"]["dimensions"]||(data["gcodeAnalysis"]["dimensions"]["width"]===0&&data["gcodeAnalysis"]["dimensions"]["depth"]===0&&data["gcodeAnalysis"]["dimensions"]["height"]===0)){output+=gettext("Model contains no extrusion. ");}else{if(data["gcodeAnalysis"]["dimensions"]){var dimensions=data["gcodeAnalysis"]["dimensions"];output+=gettext("Model size")+": "+
-_.sprintf("%(width).2fmm (X) × %(depth).2fmm (Y) × %(height).2fmm (Z)",dimensions);output+=" ";}
-if(data["gcodeAnalysis"]["filament"]&&typeof data["gcodeAnalysis"]["filament"]==="object"){var filament=data["gcodeAnalysis"]["filament"];if(_.keys(filament).length===1){output+=gettext("Filament")+": "+
-formatFilament(data["gcodeAnalysis"]["filament"]["tool"+0])+" ";}else if(_.keys(filament).length>1){_.each(filament,function(f,k){if(!_.startsWith(k,"tool")||!f||!f.hasOwnProperty("length")||f["length"]<=0)
-return;output+=gettext("Filament")+" ("+
-gettext("Tool")+" "+
-k.substr("tool".length)+"): "+
-formatFilament(f)+" ";});}}
-output+=gettext("Estimated print time")+": "+
-(self.settingsViewModel.appearance_fuzzyTimes()?formatFuzzyPrintTime(data["gcodeAnalysis"]["estimatedPrintTime"]):formatDuration(data["gcodeAnalysis"]["estimatedPrintTime"]))+" ";}}
-if(data["prints"]&&data["prints"]["last"]){output+=gettext("Last printed")+": "+
-formatTimeAgo(data["prints"]["last"]["date"])+" ";if(data["prints"]["last"]["printTime"]){output+=gettext("Last print time")+": "+
-formatDuration(data["prints"]["last"]["printTime"]);}}
-return output;};self.evaluatePrintDimensions=function(data,notify){if(!self.settingsViewModel.feature_modelSizeDetection()){return true;}
-var analysis=data["gcodeAnalysis"];if(!analysis){return true;}
-var printingArea=data["gcodeAnalysis"]["printingArea"];if(!printingArea){return true;}
-var travelArea=data["gcodeAnalysis"]["travelArea"];if(!travelArea){return true;}
-var printerProfile=self.printerProfiles.currentProfileData();if(!printerProfile){return true;}
-var volumeInfo=printerProfile.volume;if(!volumeInfo){return true;}
-var boundaries;if(_.isPlainObject(volumeInfo.custom_box)){boundaries={minX:volumeInfo.custom_box.x_min(),minY:volumeInfo.custom_box.y_min(),minZ:volumeInfo.custom_box.z_min(),maxX:volumeInfo.custom_box.x_max(),maxY:volumeInfo.custom_box.y_max(),maxZ:volumeInfo.custom_box.z_max()};}else{boundaries={minX:0,maxX:volumeInfo.width(),minY:0,maxY:volumeInfo.depth(),minZ:0,maxZ:volumeInfo.height()};if(volumeInfo.origin()==="center"){boundaries["maxX"]=volumeInfo.width()/2;boundaries["minX"]=-1*boundaries["maxX"];boundaries["maxY"]=volumeInfo.depth()/2;boundaries["minY"]=-1*boundaries["maxY"];}}
-var info="";var objectFits=true;var travelFits=true;function _area_exceeds_boundaries(ax,area){return(area["min"+ax]boundaries["max"+ax]);}
-function _exceed_warning(culprit,dimension){return _.sprintf(gettext("%(culprit)s exceeds print volume in %(dimension)s. "),{culprit:culprit,dimension:dimension});}
-if(_area_exceeds_boundaries("X",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("width"));objectFits=false;}
-if(_area_exceeds_boundaries("Y",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("depth"));objectFits=false;}
-if(_area_exceeds_boundaries("Z",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("height"));objectFits=false;}
-if(_area_exceeds_boundaries("X",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("width"));travelFits=false;}
-if(_area_exceeds_boundaries("Y",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("depth"));travelFits=false;}
-if(_area_exceeds_boundaries("Z",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("height"));travelFits=false;}
-if(travelFits&&objectFits){return true;}else{if(notify){var formatData={name:_.escape(data.name),profile:boundaries,object:printingArea,travel:travelArea,culprit:!objectFits?"Object":"Travel area"};info+=_.sprintf(gettext("Travel area: (%(travel.minX).2f, %(travel.minY).2f, %(travel.minZ).2f) × (%(travel.maxX).2f, %(travel.maxY).2f, %(travel.maxZ).2f)"),formatData);info+=" ";info+=_.sprintf(gettext("Object's bounding box: (%(object.minX).2f, %(object.minY).2f, %(object.minZ).2f) × (%(object.maxX).2f, %(object.maxY).2f, %(object.maxZ).2f)"),formatData);info+=" ";info+=_.sprintf(gettext("Print volume: (%(profile.minX).2f, %(profile.minY).2f, %(profile.minZ).2f) × (%(profile.maxX).2f, %(profile.maxY).2f, %(profile.maxZ).2f)"),formatData);var warning=""+
-_.sprintf(gettext("%(culprit)s in %(name)s exceeds the print volume of the currently selected printer profile, be careful when printing this."),formatData)+"
";warning+=pnotifyAdditionalInfo(info);warning+='You can disable this check via Settings > Features > "Enable model size detection [...]"
';new PNotify({title:_.sprintf(gettext("%(culprit)s exceeds print volume"),formatData),text:warning,type:"warning",hide:false});}
-return false;}};self.clearSearchQuery=function(){self.searchQuery("");};self.performSearch=function(e){var query=self.searchQuery();if(query!==undefined&&query.trim()!==""){query=query.toLocaleLowerCase();var recursiveSearch=function(entry){if(entry===undefined){return false;}
-var success=(entry["display"]&&entry["display"].toLocaleLowerCase().indexOf(query)>-1)||entry["name"].toLocaleLowerCase().indexOf(query)>-1;if(!success&&entry["type"]==="folder"&&entry["children"]){return _.any(entry["children"],recursiveSearch);}
-return success;};self.listHelper.changeSearchFunction(recursiveSearch);}else{self.listHelper.resetSearch();}
-return false;};self.elementByPath=function(path,root){root=root||{children:self.allItems()};var recursiveSearch=function(location,element){if(location.length===0){return element;}
-if(!element.hasOwnProperty("children")||!element.children){return undefined;}
-var name=location.shift();for(var i=0;i{self._uploadExistsOpen=true;});self.uploadExistsDialog.on("hidden",()=>{self._uploadExistsOpen=false;});self.uploadButton=$("#gcode_upload");self.uploadSdButton=$("#gcode_upload_sd");if(!self.uploadSdButton.length){self.uploadSdButton=undefined;}
-self.uploadProgress=$("#gcode_upload_progress");self.uploadProgressBar=$(".bar",self.uploadProgress);self.dropOverlay=$("#drop_overlay");self.dropZone=$("#drop");self.dropZoneLocal=$("#drop_locally");self.dropZoneSd=$("#drop_sd");self.dropZoneBackground=$("#drop_background");self.dropZoneLocalBackground=$("#drop_locally_background");self.dropZoneSdBackground=$("#drop_sd_background");if(CONFIG_SD_SUPPORT){self.localTarget=self.dropZoneLocal;}else{self.localTarget=self.dropZone;self.listHelper.removeFilter("sd");}
-self.sdTarget=self.dropZoneSd;self.dropOverlay.on("drop",self._forceEndDragNDrop);function evaluateDropzones(){var enableLocal=self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD);var enableSd=enableLocal&&CONFIG_SD_SUPPORT&&self.printerState.isSdReady()&&!self.isPrinting();self._setDropzone("local",enableLocal);self._setDropzone("sdcard",enableSd);}
-self.loginState.currentUser.subscribe(evaluateDropzones);self.printerState.isSdReady.subscribe(evaluateDropzones);self.isPrinting.subscribe(evaluateDropzones);evaluateDropzones();};self.onEventUpdatedFiles=function(payload){if(self.ignoreUpdatedFilesEvent){return;}
-if(payload.type!=="printables"){return;}
-self.requestData();};self.onEventSlicingStarted=function(payload){self.uploadProgress.addClass("progress-striped").addClass("active");self.uploadProgressBar.css("width","100%");if(payload.progressAvailable){self.uploadProgressPercentage(0);self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"),{percentage:0}));}else{self.uploadProgressText(gettext("Slicing ..."));}};self.onSlicingProgress=function(slicer,modelPath,machinecodePath,progress){self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"),{percentage:Math.round(progress)}));self.uploadProgressPercentage(Math.round(progress));};self.onEventSlicingCancelled=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);};self.onEventSlicingDone=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Slicing done"),text:_.sprintf(gettext("Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"),{stl:_.escape(payload.stl),gcode:_.escape(payload.gcode),time:payload.time}),type:"success"});self.requestData();};self.onEventSlicingFailed=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);var html=_.sprintf(gettext("Could not slice %(stl)s to %(gcode)s: %(reason)s"),{stl:_.escape(payload.stl),gcode:_.escape(payload.gcode),reason:_.escape(payload.reason)});new PNotify({title:gettext("Slicing failed"),text:html,type:"error",hide:false});};self.onEventMetadataAnalysisFinished=function(payload){self.requestData();};self.onEventMetadataStatisticsUpdated=function(payload){self.requestData();};self.onEventTransferStarted=function(payload){self.uploadProgress.addClass("progress-striped").addClass("active");self.uploadProgressBar.css("width","100%");self.uploadProgressPercentage(100);self.uploadProgressText(gettext("Streaming ..."));};self.onEventTransferDone=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Streaming done"),text:_.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"),{local:_.escape(payload.local),remote:_.escape(payload.remote),time:payload.time}),type:"success"});self.requestData({focus:{location:"sdcard",path:payload.remote}});};self.onEventTransferFailed=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Streaming failed"),text:_.sprintf(gettext("Did not finish streaming %(local)s to %(remote)s on SD"),{local:_.escape(payload.local),remote:_.escape(payload.remote)}),type:"error"});self.requestData();};self._setDropzone=function(dropzone,enable){var button=dropzone==="local"?self.uploadButton:self.uploadSdButton;var drop=dropzone==="local"?self.localTarget:self.sdTarget;var url=API_BASEURL+"files/"+dropzone;if(button===undefined)return;button.fileupload({url:url,dataType:"json",dropZone:enable?drop:null,sequentialUploads:true,drop:function(e,data){},add:self._handleUploadAdd,submit:self._handleUploadStart,done:self._handleUploadDone,fail:self._handleUploadFail,stop:self._handleUploadStop,progressall:self._handleUploadProgress});};self._dragNDropEnabled=false;self._enableDragNDrop=()=>{if(!self.settingsViewModel.feature_enableDragDropUpload())return;if(self._dragNDropEnabled)return;self._dragNDropEnabled=true;$(document).bind("dragenter",self._handleDragEnter);$(document).bind("dragleave",self._handleDragLeave);log.debug("Enabled drag-n-drop");};self._disableDragNDrop=()=>{if(!self._dragNDropEnabled)return;self._dragNDropEnabled=false;$(document).unbind("dragenter",self._handleDragEnter);$(document).unbind("dragleave",self._handleDragLeave);log.debug("Disabled drag-n-drop");};self._setProgressBar=function(percentage,text,active){self.uploadProgressBar.css("width",percentage+"%");self.uploadProgressText(text);self.uploadProgressPercentage(percentage);if(active){self.uploadProgress.addClass("progress-striped active");}else{self.uploadProgress.removeClass("progress-striped active");}};self._uploadExistsQueue=[];self._uploadExistsOpen=false;self._processUploadQueue=function(){if(!self._uploadExistsQueue.length>0||self._uploadExistsOpen)return;const hideAndSubmit=function(data){self.uploadExistsDialog.modal("hide");data.submit();if(self._uploadExistsQueue.length>0){self._processUploadQueue();}};const{data,response,path,fileSizeTooBig}=self._uploadExistsQueue.shift();const file=data.files[0];const formData={};if(path!==""){formData.path=path;}
-$("h3",self.uploadExistsDialog).text(_.sprintf(gettext("File already exists: %(name)s"),{name:file.name}));$("span.existing_size",self.uploadExistsDialog).text(response.size?formatSize(response.size):"unknown");$("span.existing_date",self.uploadExistsDialog).text(response.date?new Date(response.date*1000).toLocaleString():"unknown");$("span.new_size",self.uploadExistsDialog).text(formatSize(file.size));$("span.new_date",self.uploadExistsDialog).text(new Date(file.lastModified).toLocaleString());$("p, form, .file_data",self.uploadExistsDialog).toggle(!fileSizeTooBig);$("span.not_enough_space",self.uploadExistsDialog).toggle(fileSizeTooBig);$("input",self.uploadExistsDialog).val("").prop("placeholder",response.suggestion);$("a.upload-rename",self.uploadExistsDialog).toggle(!fileSizeTooBig).prop("disabled",false).off("click").on("click",function(){var newName=$("input",self.uploadExistsDialog).val();if(newName==="")newName=response.suggestion;OctoPrint.files.exists("local",path,newName).done(function(r){if(r.exists){$(".control-group",self.uploadExistsDialog).addClass("error");$(".help-block",self.uploadExistsDialog).show();}else{$(".control-group",self.uploadExistsDialog).removeClass("error");$(".help-block",self.uploadExistsDialog).hide();formData.filename=newName;formData.noOverwrite=true;data.formData=formData;hideAndSubmit(data);}});});if(self.loginState.hasPermission(self.access.permissions.FILES_DELETE)){$("a.upload-overwrite",self.uploadExistsDialog).off("click").show().on("click",function(){data.formData=formData;hideAndSubmit(data);});}else{$("a.upload-overwrite",self.uploadExistsDialog).hide();}
-self.uploadExistsDialog.modal("show");};self._handleUploadAdd=function(e,data){var file=data.files[0];var path=self.currentPath();var fileSizeTooBig=file.size>self.freeSpace();var formData={};if(path!==""){formData.path=path;}
-if(self.settingsViewModel.feature_uploadOverwriteConfirmation()){OctoPrint.files.exists("local",path,file.name).done(function(response){if(response.exists){const queueEntry={data,response,path,fileSizeTooBig};self._uploadExistsQueue.push(queueEntry);self._processUploadQueue();}else{data.formData=formData;data.submit();}});}else{if(fileSizeTooBig){var error=""+
-gettext("Could not upload the file. There is not enough disk space remaining.")+"
";error+=""+
-_.sprintf(gettext("Free Space: %(freespace)s"),{freespace:self.freeSpaceString()})+" "+
-_.sprintf(gettext("File Size: %(filesize)s"),{filesize:formatSize(file.size)})+" ";new PNotify({title:"Upload failed",text:error,type:"error",hide:false});}else{data.formData=formData;data.submit();}}};self._handleUploadStart=function(e,data){self.ignoreUpdatedFilesEvent=true;return true;};self._handleUploadDone=function(e,data){var focus=undefined;if(data.result.files.hasOwnProperty("sdcard")){focus={location:"sdcard",path:data.result.files.sdcard.path};}else if(data.result.files.hasOwnProperty("local")){focus={location:"local",path:data.result.files.local.path};}
-if(focus){self._filesToFocus.push(focus);}
-if(focus&&_.endsWith(focus.path.toLowerCase(),".stl")){self.slicing.show(focus.location,focus.path);}};self._handleUploadStop=function(e,data){var reset=function(){self.ignoreUpdatedFilesEvent=false;self._setProgressBar(0,"",false);};if(self._filesToFocus.length>0){self._setProgressBar(100,gettext("Refreshing list ..."),true);self.requestData({focus:self._filesToFocus}).always(function(){reset();});}else{reset();}};self._handleUploadFail=function(e,data){var extensions=_.map(SUPPORTED_EXTENSIONS,function(extension){return extension.toLowerCase();}).sort();extensions=extensions.join(", ");var error="
"+_.escape(data.files[0].name)+"
";switch(data.jqXHR.status){case 409:if(e.target.id==="gcode_upload_sd"){error+=gettext("Could not upload the file to the printer's SD. Make sure the SD is initialized and the printer is not busy with a print already.");}else{error+=gettext("Could not upload the file, overwrite not possible. Make sure it is not already printing and that you have allowed overwriting.");}
-break;case 415:error+=_.sprintf(gettext("Could not upload the file. Make sure that it is a readable, valid file with one of these extensions: %(extensions)s"),{extensions:_.escape(extensions)});break;default:error+=gettext("Could not upload the file. Please check octoprint.log for possible reasons.");break;}
-error+="
";if(data.jqXHR.responseJSON&&data.jqXHR.responseJSON.error){error+=pnotifyAdditionalInfo(""+_.escape(data.jqXHR.responseJSON.error)+" ");}
-new PNotify({title:"Upload failed",text:error,type:"error",hide:false});};self._handleUploadProgress=function(e,data){var progress=parseInt((data.loaded/data.total)*100,10);var uploaded=progress>=100;self._setProgressBar(progress,uploaded?gettext("Saving ..."):gettext("Uploading ..."),uploaded);};self._dragNDropTarget=null;self._dragNDropFFTimeout=undefined;self._dragNDropFFTimeoutDelay=100;self._forceEndDragNDrop=function(){self.dropOverlay.removeClass("in");if(self.dropZoneLocal)self.dropZoneLocalBackground.removeClass("hover");if(self.dropZoneSd)self.dropZoneSdBackground.removeClass("hover");if(self.dropZone)self.dropZoneBackground.removeClass("hover");self._dragNDropTarget=null;};self._handleDragLeave=function(e){if(e.target!==self._dragNDropTarget)return;self._forceEndDragNDrop();};self._handleDragEnter=function(e){if(!self.settingsViewModel.feature_enableDragDropUpload()){return;}
-const draggedFiles=Array.from(e.originalEvent.dataTransfer.items).filter((item)=>item.kind==="file");if(!draggedFiles.length){return;}
-self.dropOverlay.addClass("in");var foundLocal=false;var foundSd=false;var found=false;var node=e.target;do{if(self.dropZoneLocal&&node===self.dropZoneLocal[0]){foundLocal=true;break;}else if(self.dropZoneSd&&node===self.dropZoneSd[0]){foundSd=true;break;}else if(self.dropZone&&node===self.dropZone[0]){found=true;break;}
-node=node.parentNode;}while(node!==null);if(foundLocal){self.dropZoneLocalBackground.addClass("hover");self.dropZoneSdBackground.removeClass("hover");}else if(foundSd&&self.printerState.isSdReady()&&!self.isPrinting()){self.dropZoneSdBackground.addClass("hover");self.dropZoneLocalBackground.removeClass("hover");}else if(found){self.dropZoneBackground.addClass("hover");}else{if(self.dropZoneLocalBackground)
-self.dropZoneLocalBackground.removeClass("hover");if(self.dropZoneSdBackground)
-self.dropZoneSdBackground.removeClass("hover");if(self.dropZoneBackground)self.dropZoneBackground.removeClass("hover");}
-self._dragNDropTarget=e.target;self._dragNDropLastOver=Date.now();};self.onServerConnect=self.onServerReconnect=function(payload){self._enableDragNDrop();self.requestData();};self.onServerDisconnect=function(payload){self._disableDragNDrop();};self.onBeforeBinding=function(){self.showInternalFilename(self.settingsViewModel.settings.appearance.showInternalFilename());};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;};self.onStartupComplete=()=>{self.showInternalFilename(self.settingsViewModel.settings.appearance.showInternalFilename());self.settingsViewModel.settings.appearance.showInternalFilename.subscribe((value)=>{self.showInternalFilename(value);});self._enableDragNDrop();self.settingsViewModel.settings.feature.enableDragDropUpload.subscribe((value)=>{if(value){self._enableDragNDrop();}else{self._disableDragNDrop();}});};}
-OCTOPRINT_VIEWMODELS.push({construct:FilesViewModel,name:"filesViewModel",additionalNames:["gcodeFilesViewModel"],dependencies:["settingsViewModel","loginStateViewModel","printerStateViewModel","slicingViewModel","printerProfilesViewModel","accessViewModel"],elements:["#files_wrapper","#add_folder_dialog","#move_file_or_folder_dialog","#upload_exists_dialog"]});});
-;
-
-// source: js/app/viewmodels/firstrun_wizard.js
-$(function(){function FirstRunWizardViewModel(parameters){var self=this;self.dontPrintUnattendedAcknowledged=ko.observable(false);self.dontPortForwardAcknowledged=ko.observable(false);self.fundingRequestAcknowledged=ko.observable(false);self.error=ko.observable(false);self.acknowledgementNeeded=false;self.allAcknowledged=ko.pureComputed(function(){return(self.dontPrintUnattendedAcknowledged()&&self.dontPortForwardAcknowledged()&&self.fundingRequestAcknowledged());});self.onBeforeWizardTabChange=function(next,current){if(!self.acknowledgementNeeded){return true;}
-if(!current||current!=="wizard_firstrun_end"||self.allAcknowledged()){return true;}
-self._showAcknowledgementNeededDialog();return false;};self.onBeforeWizardFinish=function(){if(!self.acknowledgementNeeded||self.allAcknowledged()){return true;}
-self._showAcknowledgementNeededDialog();return false;};self.onAfterBinding=function(){self.acknowledgementNeeded=document.getElementById("wizard_firstrun_end")!==null;};self._showAcknowledgementNeededDialog=function(){self.error(true);showMessageDialog({title:gettext("Please acknowledge the safety warnings and call for funding"),message:gettext("You haven't yet acknowledged all safety warnings and the call for funding. Please do so first.")});};}
-OCTOPRINT_VIEWMODELS.push({construct:FirstRunWizardViewModel,elements:["#wizard_firstrun_start","#wizard_firstrun_end"]});});
-;
-
-// source: js/app/viewmodels/loginstate.js
-$(function(){function LoginStateViewModel(parameters){var self=this;self.loginUser=ko.observable("");self.loginPass=ko.observable("");self.loginRemember=ko.observable(false);self.reauthenticateDialog=undefined;self.reauthenticatePass=ko.observable("");self.reauthenticateFailed=ko.observable(false);self.loggedIn=ko.observable(undefined);self.username=ko.observable(undefined);self.userneeds=ko.observable(undefined);self.isAdmin=ko.observable(false);self.isUser=ko.observable(false);self.allViewModels=undefined;self.startupDeferred=$.Deferred();self.currentUser=ko.observable(undefined);self.currentLoginMechanism=ko.observable(undefined);self.credentialsSeen=ko.observable(undefined);self.elementUsernameInput=undefined;self.elementPasswordInput=undefined;self.elementLoginButton=undefined;self.externalAddressNotification=undefined;self.userMenuText=ko.pureComputed(function(){if(self.loggedIn()){return self.username();}else{return gettext("Login");}});self.userMenuTitle=ko.pureComputed(function(){if(self.loggedIn()){return _.sprintf(gettext("Logged in as %(name)s"),{name:_.escape(self.username())});}else{return gettext("Login");}});self.logoutSupported=ko.pureComputed(function(){var mechanism=self.currentLoginMechanism();return!(mechanism==="apikey"||mechanism==="authheader"||mechanism==="remote_user");});self.logoutTooltip=ko.pureComputed(function(){var mechanism=self.currentLoginMechanism();if(!self.logoutSupported()){var methodMap={apikey:gettext("API key based login"),authheader:gettext("Authorization header based login"),remote_user:gettext("remote user based login")};return _.sprintf(gettext("Logout not supported for %(method)s, please close the browser instead"),{method:methodMap[mechanism]});}else{return gettext("Logout of OctoPrint");}});self.reloadUser=function(){if(self.currentUser()===undefined){return;}
-return OctoPrint.access.users.get(self.currentUser().name).done(self.updateCurrentUserData);};self._reauthenticated=false;self.showReauthenticationDialog=()=>{const result=$.Deferred();self._reauthenticated=false;self.reauthenticateDialog.off("hidden");self.reauthenticateDialog.on("hidden",()=>{self.reauthenticatePass("");self.reauthenticateFailed(false);if(self._reauthenticated){result.resolve();}else{result.reject();}});self.reauthenticateDialog.modal("show");return result.promise();};self.reauthenticate=()=>{const user=self.currentUser().name;const pass=self.reauthenticatePass();return OctoPrint.browser.login(user,pass).done((response)=>{self.fromResponse(response);self.reauthenticateFailed(false);self._reauthenticated=self.credentialsSeen();$("#reauthenticate_dialog").modal("hide");}).fail((response)=>{self.reauthenticatePass("");self.reauthenticateFailed(true);});};self.reauthenticateIfNecessary=(callback)=>{if(!self.checkCredentialsSeen()){self.forceReauthentication(callback);}else{callback();}};self.forceReauthentication=(callback)=>{self.showReauthenticationDialog().done(()=>{callback();}).fail(()=>{});};self.checkCredentialsSeen=()=>{if(CONFIG_REAUTHENTICATION_TIMEOUT<=0)return true;const credentialsSeen=self.credentialsSeen();if(!credentialsSeen){return false;}
-const now=new Date();const seen=new Date(credentialsSeen);return now-seen{if(CONFIG_REAUTHENTICATION_TIMEOUT<=0)return;if(timeout)window.clearTimeout(timeout);return window.setTimeout(callback,(CONFIG_REAUTHENTICATION_TIMEOUT*60+10)*1000);};self.requestData=function(){return OctoPrint.browser.passiveLogin().done(self.fromResponse).fail(function(){self.fromResponse();});};self.fromResponse=function(response){var process=function(){var currentLoggedIn=self.loggedIn();var currentNeeds=self.userneeds();if(response&&response.name){self.loggedIn(true);self.currentLoginMechanism(response._login_mechanism);self.credentialsSeen(response._credentials_seen);self.updateCurrentUserData(response);if(!currentLoggedIn||currentLoggedIn===undefined){callViewModels(self.allViewModels,"onUserLoggedIn",[response]);log.info("User "+response.name+" logged in");}else if(!_.isEqual(currentNeeds,self.userneeds())){callViewModels(self.allViewModels,"onUserPermissionsChanged");log.info("User needs for "+response.name+" changed");}
-if(response.session){OctoPrint.socket.sendAuth(response.name,response.session);}
-var ignorePublicAddressWarning=localStorage["loginState.ignorePublicAddressWarning"];if(ignorePublicAddressWarning===undefined){ignorePublicAddressWarning=false;}else{ignorePublicAddressWarning=JSON.parse(ignorePublicAddressWarning);}
-if(response._is_external_client&&!ignorePublicAddressWarning){var text=gettext("It seems that you are connecting to OctoPrint over the public internet.
"+"This is strongly discouraged unless you have taken proper network security precautions. "+"Your printer is an appliance you really should not be giving access to "+"everyone with an internet connection.
Please see "+'this blog post for '+"ways to safely access your OctoPrint instance from remote.
"+"If you know what you are doing or you are sure this message is "+"mistaken since you are in an isolated LAN, feel free to ignore it.
");text=_.sprintf(text,{url:"https://octoprint.org/blog/2018/09/03/safe-remote-access/"});if(self.externalAddressNotification!==undefined){self.externalAddressNotification.remove();}
-self.externalAddressNotification=new PNotify({title:gettext("Possible external access detected"),text:text,hide:false,type:"error",confirm:{confirm:true,buttons:[{text:gettext("Ignore"),addClass:"btn btn-danger",click:function(notice){notice.remove();localStorage["loginState.ignorePublicAddressWarning"]=JSON.stringify(true);}},{text:gettext("Later"),addClass:"btn btn-primary",click:function(notice){notice.remove();}}]},buttons:{sticker:false}});}
-if(response._login_mechanism){log.info("Login mechanism: "+response._login_mechanism);}}else{self.loggedIn(false);self.currentLoginMechanism(undefined);self.updateCurrentUserData(response);if(currentLoggedIn||currentLoggedIn===undefined){callViewModels(self.allViewModels,"onUserLoggedOut");log.info("User logged out");}else if(!_.isEqual(currentNeeds,self.userneeds())){callViewModels(self.allViewModels,"onUserPermissionsChanged");log.info("User needs for guest changed");}}
-OctoPrint.coreui.updateTab();};if(self.startupDeferred!==undefined){self.startupDeferred.done(process);}else{process();}};self.updateCurrentUserData=function(data){if(data){self.userneeds(data.needs);}else{self.userneeds({});}
-if(data&&data.name){self.username(data.name);self.currentUser(data);self.isUser(data.user);self.isAdmin(data.admin);}else{self.username(undefined);self.currentUser(undefined);self.isUser(false);self.isAdmin(false);}};self.login=function(u,p,r,notifications){var username=u||self.loginUser();var password=p||self.loginPass();var remember=r!==undefined?r:self.loginRemember();notifications=notifications!==false;return OctoPrint.browser.login(username,password,remember).done(function(response){if(notifications){new PNotify({title:gettext("Login successful"),text:_.sprintf(gettext('You are now logged in as "%(username)s"'),{username:_.escape(response.name)}),type:"success"});}
-self.fromResponse(response);self.loginUser("");self.loginPass("");self.loginRemember(false);self.reauthenticatePass("");if(history&&history.replaceState){history.replaceState({success:true},document.title,window.location.pathname);}}).fail(function(response){if(!notifications){return;}
-switch(response.status){case 403:{new PNotify({title:gettext("Login failed"),text:gettext("User unknown, wrong password or account deactivated"),type:"error"});break;}}});};var _logoutInProgress=false;self.logout=function(target,event){if(!self.logoutSupported()){event.stopPropagation();return;}
-if(_logoutInProgress)return;_logoutInProgress=true;return OctoPrint.browser.logout().done(function(response){new PNotify({title:gettext("Logout successful"),text:gettext("You are now logged out"),type:"success"});self.fromResponse(response);}).fail(function(error){if(error&&error.status===403){self.fromResponse(false);}}).always(function(){_logoutInProgress=false;});};self.prepareLogin=function(data,event){if(event&&event.preventDefault){event.preventDefault();}
-self.login();};self.onDataUpdaterReauthRequired=function(reason){if(reason==="logout"||reason==="stale"||reason==="removed"){self.logout();}else{self.requestData();}};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.startupDeferred.resolve();self.startupDeferred=undefined;};self.onStartup=function(){self.reauthenticateDialog=$("#reauthenticate_dialog");self.reauthenticateDialog.on("shown",function(){$("input[type=password]",self.reauthenticateDialog).focus();});self.elementUsernameInput=$("#login_user");self.elementPasswordInput=$("#login_pass");self.elementLoginButton=$("#login_button");var toggle=$("li.dropdown#navbar_login");var button=$("a",toggle);button.on("click",function(e){$(this).parent().toggleClass("open");});$("body").on("click",function(e){if(!toggle.hasClass("open")){return;}
-var anyFormLinkOrButton=$("#login_dropdown_loggedout a, #login_dropdown_loggedin a, #login_dropdown_loggedout button, #login_dropdown_loggedin button");var dropdown=$("li.dropdown#navbar_login");var anyLastpassButton=$("#__lpform_login_user, #__lpform_login_pass");var isLinkOrButton=anyFormLinkOrButton.is(e.target)||anyFormLinkOrButton.has(e.target).length!==0;var isDropdown=dropdown.is(e.target)||dropdown.has(e.target).length!==0;var isLastpass=anyLastpassButton.is(e.target)||anyLastpassButton.has(e.target).length!==0;if(isLinkOrButton||!(isDropdown||isLastpass)){toggle.removeClass("open");}});if(self.elementUsernameInput&&self.elementUsernameInput.length&&self.elementLoginButton&&self.elementLoginButton.length){self.elementLoginButton.blur(function(){self.elementUsernameInput.focus();});}};self.hasPermission=function(permission){var userneeds=self.userneeds();if(userneeds===undefined||permission===undefined)return false;if($.isEmptyObject(userneeds)){return false;}
-return _.any(permission,function(need){return(_.has(userneeds,need.method)&&_.all(need.value,function(value){return _.contains(userneeds[need.method],value);}));});};self.hasAnyPermission=function(){var result=false;_.each(arguments,function(permission){result=result||self.hasPermission(permission);});return result;};self.hasAllPermissions=function(){var result=true;_.each(arguments,function(permission){result=result&&self.hasPermission(permission);});return result;};self.hasPermissionKo=function(permission){return ko.pureComputed(function(){return self.hasPermission(permission);}).extend({notify:"always"});};self.hasAnyPermissionKo=function(){var permissions=arguments;return ko.pureComputed(function(){return self.hasAnyPermission.apply(null,permissions);}).extend({notify:"always"});};self.hasAllPermissionsKo=function(){var permissions=arguments;return ko.pureComputed(function(){return self.hasAllPermissions.apply(null,permissions);});};}
-OCTOPRINT_VIEWMODELS.push({construct:LoginStateViewModel,elements:["#reauthenticate_dialog"]});});
-;
-
-// source: js/app/viewmodels/loginui.js
-$(function(){function LoginUiViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.coreWizardAcl=parameters[2];self.onUserLoggedOut=self.onUserPermissionsChanged=function(){if(!self.loginState.hasAllPermissions(self.access.permissions.STATUS,self.access.permissions.SETTINGS_READ)&&(!CONFIG_FIRST_RUN||(self.coreWizardAcl&&self.coreWizardAcl.setup()))){location.reload();}};}
-OCTOPRINT_VIEWMODELS.push({construct:LoginUiViewModel,dependencies:["loginStateViewModel","accessViewModel","coreWizardAclViewModel"],optional:["coreWizardAclViewModel"]});});
-;
-
-// source: js/app/viewmodels/navigation.js
-$(function(){function NavigationViewModel(parameters){var self=this;self.loginState=parameters[0];self.appearance=parameters[1];self.settings=parameters[2];self.usersettings=parameters[3];self.system=parameters[4];self.access=parameters[5];self.offline=ko.observable(!ONLINE);self.offlinePopoverContent=function(){return(""+
-gettext("OctoPrint cannot reach the internet. If this is not "+"intentional, please check OctoPrint's network settings and "+"the connectivity check configuration. Updates, plugin repository "+"and anything else requiring access to the public internet will not "+"work.")+"
");};self.appearanceClasses=ko.pureComputed(function(){var classes=self.appearance.color();if(self.appearance.colorTransparent()){classes+=" transparent";}
-return classes;});self.onServerReconnect=self.onServerConnect=self.onEventConnectivityChanged=function(){self.offline(!ONLINE);};}
-OCTOPRINT_VIEWMODELS.push({construct:NavigationViewModel,dependencies:["loginStateViewModel","appearanceViewModel","settingsViewModel","userSettingsViewModel","systemViewModel","accessViewModel"],elements:["#navbar"]});});
-;
-
-// source: js/app/viewmodels/printerstate.js
-$(function(){function PrinterStateViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.allViewModels=undefined;self.stateString=ko.observable(undefined);self.errorString=ko.observable(undefined);self.hasErrorString=ko.pureComputed(function(){return!!self.errorString();});self.resendCount=ko.observable(0);self.resendTotalTransmitted=ko.observable(0);self.resendRatio=ko.observable(0);self.resendRatioCritical=ko.pureComputed(function(){return(self.resendRatio()>=self.settings.serial_resendRatioThreshold()&&self.resendTotalTransmitted()>=self.settings.serial_resendRatioStart());});self.resendRatioNotification=undefined;self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isCancelling=ko.observable(undefined);self.isPausing=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.isSdReady=ko.observable(undefined);self.isBusy=ko.pureComputed(function(){return(self.isPrinting()||self.isCancelling()||self.isPausing()||self.isPaused());});self.enablePrint=ko.pureComputed(function(){return(self.isOperational()&&(self.isReady()||self.isPaused())&&!self.isPrinting()&&!self.isCancelling()&&!self.isPausing()&&self.loginState.hasPermission(self.access.permissions.PRINT)&&self.filename());});self.enablePause=ko.pureComputed(function(){return(self.isOperational()&&(self.isPrinting()||self.isPaused())&&!self.isCancelling()&&!self.isPausing()&&self.loginState.hasPermission(self.access.permissions.PRINT));});self.enableCancel=ko.pureComputed(function(){return(self.isOperational()&&(self.isPrinting()||self.isPaused())&&!self.isCancelling()&&!self.isPausing()&&self.loginState.loggedIn());});self.filename=ko.observable(undefined);self.filepath=ko.observable(undefined);self.filedisplay=ko.observable(undefined);self.filesize=ko.observable(undefined);self.filepos=ko.observable(undefined);self.filedate=ko.observable(undefined);self.progress=ko.observable(undefined);self.printTime=ko.observable(undefined);self.printTimeLeft=ko.observable(undefined);self.printTimeLeftOrigin=ko.observable(undefined);self.sd=ko.observable(undefined);self.timelapse=ko.observable(undefined);self.user=ko.observable(undefined);self.busyFiles=ko.observableArray([]);self.filament=ko.observableArray([]);self.estimatedPrintTime=ko.observable(undefined);self.lastPrintTime=ko.observable(undefined);self.currentHeight=ko.observable(undefined);self.errorInfoAvailable=ko.observable(false);self.errorInfo={};self.TITLE_PRINT_BUTTON_PAUSED=gettext("Restarts the print job from the beginning");self.TITLE_PRINT_BUTTON_UNPAUSED=gettext("Starts the print job");self.TITLE_PAUSE_BUTTON_PAUSED=gettext("Resumes the print job");self.TITLE_PAUSE_BUTTON_UNPAUSED=gettext("Pauses the print job");self.titlePrintButton=ko.observable(self.TITLE_PRINT_BUTTON_UNPAUSED);self.titlePauseButton=ko.observable(self.TITLE_PAUSE_BUTTON_UNPAUSED);var estimatedPrintTimeStringHlpr=function(fmt){if(self.lastPrintTime())return fmt(self.lastPrintTime());if(self.estimatedPrintTime())return fmt(self.estimatedPrintTime());return"-";};self.estimatedPrintTimeString=ko.pureComputed(function(){return estimatedPrintTimeStringHlpr(self.settings.appearance_fuzzyTimes()?formatFuzzyPrintTime:formatDuration);});self.estimatedPrintTimeExactString=ko.pureComputed(function(){return estimatedPrintTimeStringHlpr(formatDuration);});self.byteString=ko.pureComputed(function(){if(!self.filesize())return"-";var filepos=self.filepos()?formatSize(self.filepos()):"-";return filepos+" / "+formatSize(self.filesize());});self.heightString=ko.pureComputed(function(){if(!self.currentHeight())return"-";return _.sprintf("%.02fmm",self.currentHeight());});self.printTimeString=ko.pureComputed(function(){if(!self.printTime())return"-";return formatDuration(self.printTime());});var printTimeLeftStringHlpr=function(fmt){if(self.printTimeLeft()===undefined){if(!self.printTime()||!(self.isPrinting()||self.isPaused())){return"-";}else{return gettext("Still stabilizing...");}}else{return fmt(self.printTimeLeft());}};self.printTimeLeftString=ko.pureComputed(function(){return printTimeLeftStringHlpr(self.settings.appearance_fuzzyTimes()?formatFuzzyPrintTime:formatDuration);});self.printTimeLeftExactString=ko.pureComputed(function(){return printTimeLeftStringHlpr(formatDuration);});self.printTimeLeftOriginString=ko.pureComputed(function(){var value=self.printTimeLeftOrigin();switch(value){case"linear":{return gettext("Based on a linear approximation (very low accuracy, especially at the beginning of the print)");}
-case"analysis":{return gettext("Based on the estimate from analysis of file (medium accuracy)");}
-case"mixed-analysis":{return gettext("Based on a mix of estimate from analysis and calculation (medium accuracy)");}
-case"average":{return gettext("Based on the average total of past prints of this model with the same printer profile (usually good accuracy)");}
-case"mixed-average":{return gettext("Based on a mix of average total from past prints and calculation (usually good accuracy)");}
-case"estimate":{return gettext("Based on the calculated estimate (best accuracy)");}
-default:{return"";}}});self.printTimeLeftOriginClass=ko.pureComputed(function(){var value=self.printTimeLeftOrigin();switch(value){default:case"linear":{return"text-error";}
-case"analysis":case"mixed-analysis":{return"text-warning";}
-case"average":case"mixed-average":case"estimate":{return"text-success";}}});self.progressString=ko.pureComputed(function(){if(!self.progress())return 0;return self.progress();});self.progressBarString=ko.pureComputed(function(){if(!self.progress()){return"";}
-return _.sprintf("%d%%",self.progress());});self.pauseString=ko.pureComputed(function(){if(self.isPaused())return gettext("Continue");else return gettext("Pause");});self.timelapseString=ko.pureComputed(function(){var timelapse=self.timelapse();if(!timelapse||!timelapse.hasOwnProperty("type"))return"-";var type=timelapse["type"];if(type==="zchange"){return gettext("On Z Change");}else if(type==="timed"){return(gettext("Timed")+" ("+
-timelapse["options"]["interval"]+" "+
-gettext("sec")+")");}else{return"-";}});self.userString=ko.pureComputed(function(){var user=self.user();if(user==="_api"){user="API client";}
-var file=self.filename();return user?user:file?"-":"";});self.dateString=ko.pureComputed(function(){var date=self.filedate();if(!date){return gettext("unknown");}
-return formatDate(date,{seconds:true});});self.fromCurrentData=function(data){self._fromData(data);};self.fromHistoryData=function(data){self._fromData(data);};self.fromTimelapseData=function(data){self.timelapse(data);};self._fromData=function(data){self._processStateData(data.state);self._processJobData(data.job);self._processProgressData(data.progress);self._processZData(data.currentZ);self._processBusyFiles(data.busyFiles);self._processResends(data.resends);self._checkResendRatioCriticality();};self._processStateData=function(data){var prevPaused=self.isPaused();self.stateString(gettext(data.text));self.errorString(data.error);self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isCancelling(data.flags.cancelling);self.isPausing(data.flags.pausing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isSdReady(data.flags.sdReady);if(self.isPaused()!==prevPaused){if(self.isPaused()){self.titlePrintButton(self.TITLE_PRINT_BUTTON_PAUSED);self.titlePauseButton(self.TITLE_PAUSE_BUTTON_PAUSED);}else{self.titlePrintButton(self.TITLE_PRINT_BUTTON_UNPAUSED);self.titlePauseButton(self.TITLE_PAUSE_BUTTON_UNPAUSED);}}};self._processJobData=function(data){if(data.file){self.filename(data.file.name);self.filepath(data.file.path);self.filesize(data.file.size);self.filedisplay(data.file.display);self.filedate(data.file.date);self.sd(data.file.origin==="sdcard");}else{self.filename(undefined);self.filepath(undefined);self.filesize(undefined);self.filedisplay(undefined);self.filedate(undefined);self.sd(undefined);}
-self.estimatedPrintTime(data.estimatedPrintTime);self.lastPrintTime(data.lastPrintTime);var result=[];if(data.filament&&typeof data.filament==="object"&&_.keys(data.filament).length>0){var keys=_.keys(data.filament);keys.sort();_.each(keys,function(key){if(!_.startsWith(key,"tool")||!data.filament[key]||!data.filament[key].hasOwnProperty("length")||data.filament[key].length<=0)
-return;result.push({name:ko.observable(gettext("Tool")+" "+key.substr("tool".length)),data:ko.observable(data.filament[key])});});}
-self.filament(result);self.user(data.user);};self._processProgressData=function(data){if(data.completion){self.progress(data.completion);}else{self.progress(undefined);}
-self.filepos(data.filepos);self.printTime(data.printTime);self.printTimeLeft(data.printTimeLeft);self.printTimeLeftOrigin(data.printTimeLeftOrigin);};self._processZData=function(data){self.currentHeight(data);};self._processBusyFiles=function(data){var busyFiles=[];_.each(data,function(entry){if(entry.hasOwnProperty("path")&&entry.hasOwnProperty("origin")){busyFiles.push(entry.origin+":"+entry.path);}});self.busyFiles(busyFiles);};self._processResends=function(data){self.resendCount(data.count);self.resendTotalTransmitted(data.transmitted);self.resendRatio(data.ratio);};self._checkResendRatioCriticality=function(){if(self.resendRatioCritical()){if(self.resendRatioNotification===undefined){var message=gettext("%(ratio)d%% of transmitted lines have triggered resend "+"requests. The communication with the printer is unreliable "+"and this will cause print artefacts and failures.
Please "+"see this FAQ entry "+"on tips on how to solve this.
");message=_.sprintf(message,{ratio:self.resendRatio(),url:"https://faq.octoprint.org/communication-errors"});self.resendRatioNotification=new PNotify({title:gettext("Critical resend ratio!"),text:message,type:"error",hide:false});}}else if(self.resendRatioNotification!==undefined){self.resendRatioNotification.remove();self.resendRatioNotification=undefined;}};self.print=function(){if(self.isPaused()){showConfirmationDialog({message:gettext("This will restart the print job from the beginning."),onproceed:function(){OctoPrint.job.restart();}});}else{var proceed=function(p){var prevented=false;var callback=function(){OctoPrint.job.start();};callViewModels(self.allViewModels,"onBeforePrintStart",function(method){prevented=prevented||method(callback)===false;});if(!prevented){callback();}};if(!self.settings.feature_printStartConfirmation()){proceed();}else{showConfirmationDialog({message:gettext("This will start a new print job. Please check that the print bed is clear."),question:gettext("Do you want to start the print job now?"),cancel:gettext("No"),proceed:gettext("Yes"),onproceed:proceed,nofade:true});}}};self.onlyPause=function(){OctoPrint.job.pause();};self.onlyResume=function(){OctoPrint.job.resume();};self.pause=function(action){OctoPrint.job.togglePause();};self.cancel=function(){if(!self.settings.feature_printCancelConfirmation()){OctoPrint.job.cancel();}else{showConfirmationDialog({message:gettext("This will cancel your print."),cancel:gettext("No, continue the print"),proceed:gettext("Yes, cancel the print"),onproceed:function(){OctoPrint.job.cancel();},nofade:true});}};self.showFirmwareErrorModal=(data)=>{if(!data){data=self.errorInfo;}
-if(!data)return;const modal=$("#firmwareErrorModal");if(!modal.length)return;$("#firmwareErrorModalError",modal).text(data.error);switch(data.consequence){case"emergency":{$("#firmwareErrorModalM112",modal).show();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).hide();break;}
-case"disconnect":{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).show();$("#firmwareErrorModalCancel",modal).hide();break;}
-case"cancel":{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).show();break;}
-default:{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).hide();break;}}
-if(data.faq){$("#firmwareErrorModalFaq a",modal).attr("href","https://faq.octoprint.org/"+data.faq);$("#firmwareErrorModalFaq",modal).show();}else{$("#firmwareErrorModalFaq",modal).hide();}
-const logs=$("#firmwareErrorModalLogs",modal);const logOutput=$("#firmwareErrorModalLogsOutput",logs);if(data.logs){logOutput.empty();_.each(data.logs,(line)=>{logOutput.append(''+_.escape(line)+"\n"+" ");});logs.show();}else{logs.hide();}
-modal.modal("show");logOutput.scrollTop(logOutput.prop("scrollHeight"));};self.requestErrorInfo=()=>{OctoPrint.printer.getErrorInfo().then((data)=>{if(data&&data.error&&data.error!==""){self.errorInfoAvailable(true);self.errorInfo=data;}else{self.errorInfoAvailable(false);self.errorInfo={};}});};self.onEventError=(payload)=>{if(payload.reason==="firmware"){self.errorInfo=payload;self.errorInfoAvailable(true);self.showFirmwareErrorModal();}};self.onEventConnecting=self.onEventPrintCancelling=self.onEventPrintStarted=()=>{self.requestErrorInfo();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=()=>{self.requestErrorInfo();};self.onAllBound=(allViewModels)=>{self.allViewModels=allViewModels;};}
-OCTOPRINT_VIEWMODELS.push({construct:PrinterStateViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#state_wrapper","#drop_overlay"]});});
-;
-
-// source: js/app/viewmodels/printerprofiles.js
-$(function(){var cleanProfile=function(){return{id:"",name:"",model:"",color:"default",volume:{formFactor:"rectangular",width:200,depth:200,height:200,origin:"lowerleft",custom_box:false},heatedBed:true,heatedChamber:false,axes:{x:{speed:6000,inverted:false},y:{speed:6000,inverted:false},z:{speed:200,inverted:false},e:{speed:300,inverted:false}},extruder:{count:1,offsets:[[0,0]],nozzleDiameter:0.4,sharedNozzle:false,defaultExtrusionLength:5}};};function EditedProfileViewModel(profiles){var self=this;self.profiles=profiles;self.isNew=ko.observable(false);self.name=ko.observable();self.color=ko.observable();self.identifier=ko.observable();self.identifierPlaceholder=ko.observable();self.model=ko.observable();self.volumeWidth=ko.observable();self.volumeHeight=ko.observable();self.volumeDepth=ko.observable();self.volumeFormFactor=ko.observable();self.volumeOrigin=ko.observable();self.volumeFormFactor.subscribe(function(value){if(value=="circular"){self.volumeOrigin("center");}});self.volumeOrigin.subscribe(function(){self.toBoundingBoxPlaceholders(self.defaultBoundingBox(self.volumeWidth(),self.volumeDepth(),self.volumeHeight(),self.volumeOrigin()));});self.heatedBed=ko.observable();self.heatedChamber=ko.observable();self.nozzleDiameter=ko.observable();self.extruders=ko.observable();self.extruderOffsets=ko.observableArray();self.sharedNozzle=ko.observable();self.defaultExtrusionLength=ko.observable();self.axisXSpeed=ko.observable();self.axisYSpeed=ko.observable();self.axisZSpeed=ko.observable();self.axisESpeed=ko.observable();self.axisXInverted=ko.observable(false);self.axisYInverted=ko.observable(false);self.axisZInverted=ko.observable(false);self.axisEInverted=ko.observable(false);self.customBoundingBox=ko.observable(false);self.boundingBoxMinX=ko.observable();self.boundingBoxMinY=ko.observable();self.boundingBoxMinZ=ko.observable();self.boundingBoxMaxX=ko.observable();self.boundingBoxMaxY=ko.observable();self.boundingBoxMaxZ=ko.observable();self.boundingBoxMinXPlaceholder=ko.observable();self.boundingBoxMinYPlaceholder=ko.observable();self.boundingBoxMinZPlaceholder=ko.observable();self.boundingBoxMaxXPlaceholder=ko.observable();self.boundingBoxMaxYPlaceholder=ko.observable();self.boundingBoxMaxZPlaceholder=ko.observable();self.koExtruderOffsets=ko.pureComputed(function(){var extruderOffsets=self.extruderOffsets();var numExtruders=self.extruders();if(!numExtruders){numExtruders=1;}
-if(numExtruders-1>extruderOffsets.length){for(var i=extruderOffsets.length;i0&&self.volumeWidth()<10000)||!(self.volumeDepth()>0&&self.volumeDepth()<10000)||!(self.volumeHeight()>0&&self.volumeHeight()<10000));});self.identifierInvalid=ko.pureComputed(function(){var identifier=self.identifier();var placeholder=self.identifierPlaceholder();var data=identifier;if(!identifier){data=placeholder;}
-var validCharacters=data&&data==self._sanitize(data);var existingProfile=self.profiles.getItem(function(item){return item.id==data;});return(!data||!validCharacters||(self.isNew()&&existingProfile!=undefined));});self.identifierInvalidText=ko.pureComputed(function(){if(!self.identifierInvalid()){return"";}
-if(!self.identifier()&&!self.identifierPlaceholder()){return gettext("Identifier must be set");}else if(self.identifier()!=self._sanitize(self.identifier())){return gettext("Invalid characters, only a-z, A-Z, 0-9, -, ., _, ( and ) are allowed");}else{return gettext("A profile with such an identifier already exists");}});self.name.subscribe(function(){self.identifierPlaceholder(self._sanitize(self.name()).toLowerCase());});self.valid=function(){return(!self.nameInvalid()&&!self.identifierInvalid()&&!self.sizeInvalid());};self.availableColors=ko.observable([{key:"default",name:gettext("default")},{key:"red",name:gettext("red")},{key:"orange",name:gettext("orange")},{key:"yellow",name:gettext("yellow")},{key:"green",name:gettext("green")},{key:"blue",name:gettext("blue")},{key:"black",name:gettext("black")}]);self.availableOrigins=ko.pureComputed(function(){var formFactor=self.volumeFormFactor();var possibleOrigins={lowerleft:gettext("Lower Left"),center:gettext("Center")};var keys=[];if(formFactor=="rectangular"){keys=["lowerleft","center"];}else if(formFactor=="circular"){keys=["center"];}
-var result=[];_.each(keys,function(key){result.push({key:key,name:possibleOrigins[key]});});return result;});self.fromProfileData=function(data){self.isNew(data===undefined);if(data===undefined){data=cleanProfile();}
-self.identifier(data.id);self.name(data.name);self.color(data.color);self.model(data.model);self.volumeWidth(data.volume.width);self.volumeHeight(data.volume.height);self.volumeDepth(data.volume.depth);self.volumeFormFactor(data.volume.formFactor);self.volumeOrigin(data.volume.origin);if(data.volume.custom_box){self.toBoundingBoxData(data.volume.custom_box,true);}else{var box=self.defaultBoundingBox(data.volume.width,data.volume.depth,data.volume.height,data.volume.origin);self.toBoundingBoxData(box,false);}
-self.heatedBed(data.heatedBed);self.heatedChamber(data.heatedChamber);self.nozzleDiameter(data.extruder.nozzleDiameter);self.sharedNozzle(data.extruder.sharedNozzle);self.defaultExtrusionLength(data.extruder.defaultExtrusionLength);self.extruders(data.extruder.count);var offsets=[];if(data.extruder.count>1){_.each(_.slice(data.extruder.offsets,1),function(offset,index){offsets.push({idx:index+1,x:ko.observable(offset[0]),y:ko.observable(offset[1])});});}
-self.extruderOffsets(offsets);self.axisXSpeed(data.axes.x.speed);self.axisXInverted(data.axes.x.inverted);self.axisYSpeed(data.axes.y.speed);self.axisYInverted(data.axes.y.inverted);self.axisZSpeed(data.axes.z.speed);self.axisZInverted(data.axes.z.inverted);self.axisESpeed(data.axes.e.speed);self.axisEInverted(data.axes.e.inverted);};self.toProfileData=function(){var identifier=self.identifier();if(!identifier){identifier=self.identifierPlaceholder();}
-var defaultProfile=cleanProfile();var valid=function(value,f,def){var v=f(value);if(isNaN(v)){return def;}
-return v;};var runChecks=function(value,def,checks){if(checks.gt!==undefined){if(!(value>checks.gt)){return def;}}
-if(checks.lt!==undefined){if(!(value1){for(var i=0;ib["name"].toLocaleLowerCase())
-return 1;return 0;}},{},"name",[],[],10);self.defaultProfile=ko.observable();self.currentProfile=ko.observable();self.createProfileEditor=function(data){var editor=new EditedProfileViewModel(self.profiles);if(data!==undefined){editor.fromProfileData(data);}
-return editor;};self.editor=self.createProfileEditor();self.currentProfileData=ko.observable();self.enableEditorSubmitButton=ko.pureComputed(function(){return self.editor.valid()&&!self.requestInProgress();});self.makeDefault=function(data){var profile={id:data.id,default:true};self.updateProfile(profile);};self.canMakeDefault=function(data){return!data.isdefault();};self.canRemove=function(data){return!data.iscurrent()&&!data.isdefault();};self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.CONNECTION)){return;}
-return OctoPrint.printerprofiles.list().done(self.fromResponse);};self.fromResponse=function(data){var items=[];var defaultProfile=undefined;var currentProfile=undefined;var currentProfileData=undefined;_.each(data.profiles,function(entry){if(entry.default){defaultProfile=entry.id;}
-if(entry.current){currentProfile=entry.id;currentProfileData=ko.mapping.fromJS(entry,self.currentProfileData);}
-entry["isdefault"]=ko.observable(entry.default);entry["iscurrent"]=ko.observable(entry.current);items.push(entry);});self.profiles.updateItems(items);self.defaultProfile(defaultProfile);if(currentProfile&¤tProfileData){self.currentProfile(currentProfile);self.currentProfileData(currentProfileData);}else{log.warn("Current printer profile could not be detected, using default values");self.currentProfile("");self.currentProfileData(ko.mapping.fromJS(cleanProfile(),self.currentProfileData));}};self.addProfile=function(callback){var profile=self.editor.toProfileData();self.requestInProgress(true);OctoPrint.printerprofiles.add(profile).done(function(){if(callback!==undefined){callback();}
-self.requestData();}).fail(function(xhr){var text=gettext("There was unexpected error while saving the printer profile, please consult the logs.");new PNotify({title:gettext("Could not add profile"),text:text,type:"error",hide:false});}).always(function(){self.requestInProgress(false);});};self.removeProfile=function(data){var perform=function(){self.requestInProgress(true);OctoPrint.printerprofiles.delete(data.id,{url:data.resource}).done(function(){self.requestData().always(function(){self.requestInProgress(false);});}).fail(function(xhr){var text;if(xhr.status==409){text=gettext("Cannot delete the default profile or the currently active profile.");}else{text=gettext("There was unexpected error while removing the printer profile, please consult the logs.");}
-new PNotify({title:gettext("Could not delete profile"),text:text,type:"error",hide:false});self.requestInProgress(false);});};showConfirmationDialog(_.sprintf(gettext('You are about to delete the printer profile "%(name)s".'),{name:_.escape(data.name)}),perform);};self.updateProfile=function(profile,callback){if(profile==undefined){profile=self.editor.toProfileData();}
-self.requestInProgress(true);OctoPrint.printerprofiles.update(profile.id,profile).done(function(){if(callback!==undefined){callback();}
-self.requestData().always(function(){self.requestInProgress(false);});}).fail(function(){var text=gettext("There was unexpected error while updating the printer profile, please consult the logs.");new PNotify({title:gettext("Could not update profile"),text:text,type:"error",hide:false});self.requestInProgress(false);});};self.showEditProfileDialog=function(data){self.editor.fromProfileData(data);var editDialog=$("#settings_printerProfiles_editDialog");var confirmButton=$("button.btn-confirm",editDialog);var dialogTitle=$("h3.modal-title",editDialog);var add=data===undefined;dialogTitle.text(add?gettext("Add Printer Profile"):_.sprintf(gettext('Edit Printer Profile "%(name)s"'),{name:_.escape(data.name)}));confirmButton.unbind("click");confirmButton.bind("click",function(){if(self.enableEditorSubmitButton()){self.confirmEditProfile(add);}});$('ul.nav-pills a[data-toggle="tab"]:first',editDialog).tab("show");editDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});};self.confirmEditProfile=function(add){var callback=function(){$("#settings_printerProfiles_editDialog").modal("hide");};if(add){self.addProfile(callback);}else{self.updateProfile(undefined,callback);}};self.onSettingsShown=self.requestData;self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};}
-OCTOPRINT_VIEWMODELS.push({construct:PrinterProfilesViewModel,dependencies:["loginStateViewModel","accessViewModel"]});});
-;
-
-// source: js/app/viewmodels/settings.js
-$(function(){function SettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.printerProfiles=parameters[2];self.about=parameters[3];self.users=parameters[4];var firstRequest=$.Deferred();self.firstRequest=firstRequest.promise();self.allViewModels=[];self.receiving=ko.observable(false);self.sending=ko.observable(false);self.exchanging=ko.pureComputed(function(){return self.receiving()||self.sending();});self.outstanding=[];self.active=false;self.sawUpdateEventWhileActive=false;self.ignoreNextUpdateEvent=false;self.settingsDialog=undefined;self.settings_dialog_update_detected=undefined;self.translationManagerDialog=undefined;self.translationUploadElement=$("#settings_appearance_managelanguagesdialog_upload");self.translationUploadButton=$("#settings_appearance_managelanguagesdialog_upload_start");self.translationUploadFilename=ko.observable();self.invalidTranslationArchive=ko.pureComputed(function(){var name=self.translationUploadFilename();return name!==undefined&&!_.endsWith(name.toLocaleLowerCase(),".zip");});self.enableTranslationUpload=ko.pureComputed(function(){var name=self.translationUploadFilename();return(name!==undefined&&name.trim()!=""&&!self.invalidTranslationArchive());});self.translations=new ItemListHelper("settings.translations",{locale:function(a,b){if(a["locale"].toLocaleLowerCase()b["locale"].toLocaleLowerCase())
-return 1;return 0;}},{},"locale",[],[],0);self.appearance_available_colors=ko.observable([{key:"default",name:gettext("default")},{key:"red",name:gettext("red")},{key:"orange",name:gettext("orange")},{key:"yellow",name:gettext("yellow")},{key:"green",name:gettext("green")},{key:"blue",name:gettext("blue")},{key:"violet",name:gettext("violet")},{key:"black",name:gettext("black")},{key:"white",name:gettext("white")}]);self.appearance_colorName=function(color){switch(color){case"red":return gettext("red");case"orange":return gettext("orange");case"yellow":return gettext("yellow");case"green":return gettext("green");case"blue":return gettext("blue");case"violet":return gettext("violet");case"black":return gettext("black");case"white":return gettext("white");case"default":return gettext("default");default:return color;}};self.webcam_available_videocodecs=["libx264","mpeg2video"];var auto_locale={language:"_default",display:gettext("Autodetect from browser"),english:undefined};self.locales=ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES),function(n){return n.display;})));self.locale_languages=_.keys(AVAILABLE_LOCALES);self.api_key=ko.observable(undefined);self.api_allowCrossOrigin=ko.observable(undefined);self.apiKeyVisible=ko.observable(false);self.appearance_name=ko.observable(undefined);self.appearance_color=ko.observable(undefined);self.appearance_colorTransparent=ko.observable();self.appearance_colorIcon=ko.observable();self.appearance_defaultLanguage=ko.observable();self.appearance_showFahrenheitAlso=ko.observable(undefined);self.appearance_fuzzyTimes=ko.observable(undefined);self.appearance_closeModalsWithClick=ko.observable(undefined);self.appearance_showInternalFilename=ko.observable(undefined);self.printer_defaultExtrusionLength=ko.observable(undefined);self.webcam_webcamEnabled=ko.observable(undefined);self.webcam_timelapseEnabled=ko.observable(undefined);self.webcam_snapshotTimeout=ko.observable(undefined);self.webcam_snapshotSslValidation=ko.observable(undefined);self.webcam_ffmpegPath=ko.observable(undefined);self.webcam_ffmpegCommandline=ko.observable(undefined);self.webcam_bitrate=ko.observable(undefined);self.webcam_ffmpegThreads=ko.observable(undefined);self.webcam_ffmpegVideoCodec=ko.observable(undefined);self.webcam_watermark=ko.observable(undefined);self.webcam_defaultWebcam=ko.observable(undefined);self.webcam_snapshotWebcam=ko.observable(undefined);self.webcam_webcams=ko.observableArray([]);self.feature_temperatureGraph=ko.observable(undefined);self.feature_sdSupport=ko.observable(undefined);self.feature_keyboardControl=ko.observable(undefined);self.feature_pollWatched=ko.observable(undefined);self.feature_modelSizeDetection=ko.observable(undefined);self.feature_rememberFileFolder=ko.observable(undefined);self.feature_printStartConfirmation=ko.observable(undefined);self.feature_printCancelConfirmation=ko.observable(undefined);self.feature_uploadOverwriteConfirmation=ko.observable(undefined);self.feature_g90InfluencesExtruder=ko.observable(undefined);self.feature_autoUppercaseBlacklist=ko.observable(undefined);self.feature_enableDragDropUpload=ko.observable(undefined);self.gcodeAnalysis_runAt=ko.observable(undefined);self.serial_port=ko.observable();self.serial_baudrate=ko.observable();self.serial_exclusive=ko.observable();self.serial_lowLatency=ko.observable();self.serial_portOptions=ko.observableArray([]);self.serial_baudrateOptions=ko.observableArray([]);self.serial_autoconnect=ko.observable(undefined);self.serial_timeoutConnection=ko.observable(undefined);self.serial_timeoutDetectionFirst=ko.observable(undefined);self.serial_timeoutDetectionConsecutive=ko.observable(undefined);self.serial_timeoutCommunication=ko.observable(undefined);self.serial_timeoutCommunicationBusy=ko.observable(undefined);self.serial_timeoutTemperature=ko.observable(undefined);self.serial_timeoutTemperatureTargetSet=ko.observable(undefined);self.serial_timeoutTemperatureAutoreport=ko.observable(undefined);self.serial_timeoutSdStatus=ko.observable(undefined);self.serial_timeoutSdStatusAutoreport=ko.observable(undefined);self.serial_timeoutPosAutoreport=ko.observable(undefined);self.serial_timeoutBaudrateDetectionPause=ko.observable(undefined);self.serial_timeoutPositionLogWait=ko.observable(undefined);self.serial_log=ko.observable(undefined);self.serial_additionalPorts=ko.observable(undefined);self.serial_additionalBaudrates=ko.observable(undefined);self.serial_blacklistedPorts=ko.observable(undefined);self.serial_blacklistedBaudrates=ko.observable(undefined);self.serial_longRunningCommands=ko.observable(undefined);self.serial_checksumRequiringCommands=ko.observable(undefined);self.serial_blockedCommands=ko.observable(undefined);self.serial_ignoredCommands=ko.observable(undefined);self.serial_pausingCommands=ko.observable(undefined);self.serial_sdCancelCommand=ko.observable(undefined);self.serial_emergencyCommands=ko.observable(undefined);self.serial_helloCommand=ko.observable(undefined);self.serial_serialErrorBehaviour=ko.observable("cancel");self.serial_triggerOkForM29=ko.observable(undefined);self.serial_waitForStart=ko.observable(undefined);self.serial_waitToLoadSdFileList=ko.observable(undefined);self.serial_sendChecksum=ko.observable("print");self.serial_sendChecksumWithUnknownCommands=ko.observable(undefined);self.serial_unknownCommandsNeedAck=ko.observable(undefined);self.serial_sdRelativePath=ko.observable(undefined);self.serial_sdLowerCase=ko.observable(undefined);self.serial_sdAlwaysAvailable=ko.observable(undefined);self.serial_swallowOkAfterResend=ko.observable(undefined);self.serial_repetierTargetTemp=ko.observable(undefined);self.serial_disableExternalHeatupDetection=ko.observable(undefined);self.serial_ignoreIdenticalResends=ko.observable(undefined);self.serial_firmwareDetection=ko.observable(undefined);self.serial_blockWhileDwelling=ko.observable(undefined);self.serial_useParityWorkaround=ko.observable(undefined);self.serial_sanityCheckTools=ko.observable(undefined);self.serial_supportResendsWithoutOk=ko.observable(undefined);self.serial_logPositionOnPause=ko.observable(undefined);self.serial_logPositionOnCancel=ko.observable(undefined);self.serial_abortHeatupOnCancel=ko.observable(undefined);self.serial_maxTimeoutsIdle=ko.observable(undefined);self.serial_maxTimeoutsPrinting=ko.observable(undefined);self.serial_maxTimeoutsLong=ko.observable(undefined);self.serial_capAutoreportTemp=ko.observable(undefined);self.serial_capAutoreportSdStatus=ko.observable(undefined);self.serial_capAutoreportPos=ko.observable(undefined);self.serial_capBusyProtocol=ko.observable(undefined);self.serial_capEmergencyParser=ko.observable(undefined);self.serial_capExtendedM20=ko.observable(undefined);self.serial_capLfnWrite=ko.observable(undefined);self.serial_sendM112OnError=ko.observable(undefined);self.serial_disableSdPrintingDetection=ko.observable(undefined);self.serial_ackMax=ko.observable(undefined);self.serial_resendRatioThreshold=ko.observable(100);self.serial_resendRatioStart=ko.observable(100);self.serial_ignoreEmptyPorts=ko.observable(undefined);self.serial_enableShutdownActionCommand=ko.observable(undefined);self.folder_uploads=ko.observable(undefined);self.folder_timelapse=ko.observable(undefined);self.folder_watched=ko.observable(undefined);self.scripts_gcode_beforePrintStarted=ko.observable(undefined);self.scripts_gcode_afterPrintDone=ko.observable(undefined);self.scripts_gcode_afterPrintCancelled=ko.observable(undefined);self.scripts_gcode_afterPrintPaused=ko.observable(undefined);self.scripts_gcode_beforePrintResumed=ko.observable(undefined);self.scripts_gcode_afterPrinterConnected=ko.observable(undefined);self.scripts_gcode_beforePrinterDisconnected=ko.observable(undefined);self.scripts_gcode_afterToolChange=ko.observable(undefined);self.scripts_gcode_beforeToolChange=ko.observable(undefined);self.temperature_profiles=ko.observableArray(undefined);self.temperature_cutoff=ko.observable(undefined);self.temperature_sendAutomatically=ko.observable(undefined);self.temperature_sendAutomaticallyAfter=ko.observable(undefined);self.system_actions=ko.observableArray([]);self.terminalFilters=ko.observableArray([]);self.server_commands_systemShutdownCommand=ko.observable(undefined);self.server_commands_systemRestartCommand=ko.observable(undefined);self.server_commands_serverRestartCommand=ko.observable(undefined);self.server_diskspace_warning=ko.observable();self.server_diskspace_critical=ko.observable();self.server_diskspace_warning_str=sizeObservable(self.server_diskspace_warning);self.server_diskspace_critical_str=sizeObservable(self.server_diskspace_critical);self.server_onlineCheck_enabled=ko.observable();self.server_onlineCheck_interval=ko.observable();self.server_onlineCheck_host=ko.observable();self.server_onlineCheck_port=ko.observable();self.server_onlineCheck_name=ko.observable();self.server_pluginBlacklist_enabled=ko.observable();self.server_pluginBlacklist_url=ko.observable();self.server_pluginBlacklist_ttl=ko.observable();self.server_allowFraming=ko.observable();self.settings=undefined;self.lastReceivedSettings=undefined;self.webcam_ffmpegPathText=ko.observable();self.webcam_ffmpegPathOk=ko.observable(false);self.webcam_ffmpegPathBroken=ko.observable(false);self.webcam_ffmpegPathReset=function(){self.webcam_ffmpegPathText("");self.webcam_ffmpegPathOk(false);self.webcam_ffmpegPathBroken(false);};self.server_onlineCheckText=ko.observable();self.server_onlineCheckOk=ko.observable(false);self.server_onlineCheckBroken=ko.observable(false);self.server_onlineCheckReset=function(){self.server_onlineCheckText("");self.server_onlineCheckOk(false);self.server_onlineCheckBroken(false);};self.server_onlineCheckResolutionText=ko.observable();self.server_onlineCheckResolutionOk=ko.observable(false);self.server_onlineCheckResolutionBroken=ko.observable(false);self.server_onlineCheckResolutionReset=function(){self.server_onlineCheckResolutionText("");self.server_onlineCheckResolutionOk(false);self.server_onlineCheckResolutionBroken(false);};var folderTypes=["uploads","timelapse","watched"];var checkForDuplicateFolders=function(){_.each(folderTypes,function(folderType){var path=self["folder_"+folderType]();var duplicate=false;_.each(folderTypes,function(otherFolderType){if(folderType!==otherFolderType){duplicate=duplicate||path===self["folder_"+otherFolderType]();}});self.testFolderConfigDuplicate[folderType](duplicate);});};self.testFolderConfigText={};self.testFolderConfigOk={};self.testFolderConfigBroken={};self.testFolderConfigDuplicate={};self.testFolderConfigError={};self.testFolderConfigSuccess={};_.each(folderTypes,function(folderType){self.testFolderConfigText[folderType]=ko.observable("");self.testFolderConfigOk[folderType]=ko.observable(false);self.testFolderConfigBroken[folderType]=ko.observable(false);self.testFolderConfigDuplicate[folderType]=ko.observable(false);self.testFolderConfigError[folderType]=ko.pureComputed(function(){return(self.testFolderConfigBroken[folderType]()||self.testFolderConfigDuplicate[folderType]());});self.testFolderConfigSuccess[folderType]=ko.pureComputed(function(){return(self.testFolderConfigOk[folderType]()&&!self.testFolderConfigDuplicate[folderType]());});self["folder_"+folderType].subscribe(checkForDuplicateFolders);});self.testFolderConfigReset=function(){_.each(folderTypes,function(folderType){self.testFolderConfigText[folderType]("");self.testFolderConfigOk[folderType](false);self.testFolderConfigBroken[folderType](false);});};self.testFoldersDuplicate=ko.pureComputed(function(){var foundDupe=false;_.each(folderTypes,function(folderType){foundDupe=foundDupe||self.testFolderConfigDuplicate[folderType]();});return foundDupe;});self.observableCopies={feature_waitForStart:"serial_waitForStart",feature_waitToLoadSdFileList:"serial_waitToLoadSdFileList",feature_sendChecksum:"serial_sendChecksum",feature_sdRelativePath:"serial_sdRelativePath",feature_sdAlwaysAvailable:"serial_sdAlwaysAvailable",feature_swallowOkAfterResend:"serial_swallowOkAfterResend",feature_repetierTargetTemp:"serial_repetierTargetTemp",feature_disableExternalHeatupDetection:"serial_disableExternalHeatupDetection",feature_ignoreIdenticalResends:"serial_ignoreIdenticalResends",feature_firmwareDetection:"serial_firmwareDetection",feature_blockWhileDwelling:"serial_blockWhileDwelling",serial_:"feature_"};_.each(self.observableCopies,function(value,key){if(self.hasOwnProperty(value)){self[key]=self[value];}});self.webcamCompat={webcam_streamUrl:"streamUrl",webcam_streamRatio:"streamRatio",webcam_streamTimeout:"streamTimeout",webcam_streamWebrtcIceServers:"webrtcIceServers",webcam_snapshotUrl:"snapshotUrl",webcam_flipH:"flipH",webcam_flipV:"flipV",webcam_rotate90:"rotate90",webcam_cacheBuster:"cacheBuster"};self.addTemperatureProfile=function(){self.temperature_profiles.push({name:"New",extruder:0,bed:0,chamber:0});};self.removeTemperatureProfile=function(profile){self.temperature_profiles.remove(profile);};self.addTerminalFilter=function(){self.terminalFilters.push({name:"New",regex:"(Send:\\s+(N\\d+\\s+)?M105)|(Recv:\\s+(ok\\s+([PBN]\\d+\\s+)*)?.*([BCLPR]|T\\d*):-?\\d+)"});};self.removeTerminalFilter=function(filter){self.terminalFilters.remove(filter);};self.testWebcamFfmpegPathBusy=ko.observable(false);self.testWebcamFfmpegPath=function(){if(!self.webcam_ffmpegPath()){return;}
-if(self.testWebcamFfmpegPathBusy()){return;}
-self.testWebcamFfmpegPathBusy(true);OctoPrint.util.testExecutable(self.webcam_ffmpegPath()).done(function(response){if(!response.result){if(!response.exists){self.webcam_ffmpegPathText(gettext("The path doesn't exist"));}else if(!response.typeok){self.webcam_ffmpegPathText(gettext("The path is not a file"));}else if(!response.access){self.webcam_ffmpegPathText(gettext("The path is not an executable"));}}else{self.webcam_ffmpegPathText(gettext("The path is valid"));}
-self.webcam_ffmpegPathOk(response.result);self.webcam_ffmpegPathBroken(!response.result);}).always(function(){self.testWebcamFfmpegPathBusy(false);});};self.testOnlineConnectivityConfigBusy=ko.observable(false);self.testOnlineConnectivityConfig=function(){if(!self.server_onlineCheck_host())return;if(!self.server_onlineCheck_port())return;if(self.testOnlineConnectivityConfigBusy())return;self.testOnlineConnectivityConfigBusy(true);OctoPrint.util.testServer(self.server_onlineCheck_host(),self.server_onlineCheck_port()).done(function(response){if(!response.result){self.server_onlineCheckText(gettext("The server is not reachable"));}else{self.server_onlineCheckText(gettext("The server is reachable"));}
-self.server_onlineCheckOk(response.result);self.server_onlineCheckBroken(!response.result);}).always(function(){self.testOnlineConnectivityConfigBusy(false);});};self.testOnlineConnectivityResolutionConfigBusy=ko.observable(false);self.testOnlineConnectivityResolutionConfig=function(){if(!self.server_onlineCheck_name())return;if(self.testOnlineConnectivityResolutionConfigBusy())return;self.testOnlineConnectivityResolutionConfigBusy(true);OctoPrint.util.testResolution(self.server_onlineCheck_name()).done(function(response){if(!response.result){self.server_onlineCheckResolutionText(gettext("Name cannot be resolved"));}else{self.server_onlineCheckResolutionText(gettext("Name can be resolved"));}
-self.server_onlineCheckResolutionOk(response.result);self.server_onlineCheckResolutionBroken(!response.result);}).always(function(){self.testOnlineConnectivityResolutionConfigBusy(false);});};self.testFolderConfigBusy=ko.observable(false);self.testFolderConfig=function(folder){var observable="folder_"+folder;if(!self.hasOwnProperty(observable))return;if(self.testFolderConfigBusy())return;self.testFolderConfigBusy(true);var opts={check_type:"dir",check_access:"w",allow_create_dir:true,check_writable_dir:true};var path=self[observable]();OctoPrint.util.testPath(path,opts).done(function(response){if(!response.result){if(response.broken_symlink){self.testFolderConfigText[folder](gettext("The path is a broken symlink."));}else if(!response.exists){self.testFolderConfigText[folder](gettext("The path does not exist and cannot be created."));}else if(!response.typeok){self.testFolderConfigText[folder](gettext("The path is not a folder."));}else if(!response.access){self.testFolderConfigText[folder](gettext("The path is not writable."));}}else{self.testFolderConfigText[folder](gettext("The path is valid"));}
-self.testFolderConfigOk[folder](response.result);self.testFolderConfigBroken[folder](!response.result);}).always(function(){self.testFolderConfigBusy(false);});};self.onSettingsHidden=function(){self.webcam_ffmpegPathReset();self.server_onlineCheckReset();self.server_onlineCheckResolutionReset();self.testFolderConfigReset();};self.isDialogActive=function(){return self.settingsDialog.is(":visible");};self.onStartup=function(){self.settingsDialog=$("#settings_dialog");self.settingsUpdatedDialog=$("#settings_dialog_update_detected");self.translationManagerDialog=$("#settings_appearance_managelanguagesdialog");self.translationUploadElement=$("#settings_appearance_managelanguagesdialog_upload");self.translationUploadButton=$("#settings_appearance_managelanguagesdialog_upload_start");self.translationUploadElement.fileupload({dataType:"json",maxNumberOfFiles:1,autoUpload:false,add:function(e,data){if(data.files.length==0){return false;}
-self.translationUploadFilename(data.files[0].name);self.translationUploadButton.unbind("click");self.translationUploadButton.bind("click",function(){data.submit();return false;});},done:function(e,data){self.translationUploadButton.unbind("click");self.translationUploadFilename(undefined);self.fromTranslationResponse(data.result);},fail:function(e,data){self.translationUploadButton.unbind("click");self.translationUploadFilename(undefined);}});};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.settingsDialog.on("show",function(event){OctoPrint.coreui.settingsOpen=true;if(event.target.id=="settings_dialog"){self.requestTranslationData();callViewModels(allViewModels,"onSettingsShown");}});self.settingsDialog.on("hidden",function(event){OctoPrint.coreui.settingsOpen=false;if(event.target.id=="settings_dialog"){callViewModels(allViewModels,"onSettingsHidden");}});self.settingsDialog.on("beforeSave",function(){callViewModels(allViewModels,"onSettingsBeforeSave");});$(".reload_all",self.settingsUpdatedDialog).click(function(e){e.preventDefault();self.settingsUpdatedDialog.modal("hide");self.requestData();return false;});$(".reload_nonconflicts",self.settingsUpdatedDialog).click(function(e){e.preventDefault();self.settingsUpdatedDialog.modal("hide");self.requestData(true);return false;});$('ul.nav-list a[data-toggle="tab"]',self.settingsDialog).on("show",function(){self._resetScrollPosition();});};self.show=function(tab){self.selectTab(tab);self._resetScrollPosition();self.settingsDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});return false;};self.hide=function(){self.settingsDialog.modal("hide");};self.generateApiKey=function(){if(!CONFIG_ACCESS_CONTROL)return;showConfirmationDialog(gettext("This will generate a new API Key. The old API Key will cease to function immediately."),function(){OctoPrint.settings.generateApiKey().done(function(response){self.api_key(response.apikey);self.requestData();});});};self.deleteApiKey=()=>{if(!CONFIG_ACCESS_CONTROL)return;if(!self.api_key())return;showConfirmationDialog(gettext("This will delete the API Key. It will cease to to function immediately."),function(){OctoPrint.settings.deleteApiKey().done(()=>{self.api_key(undefined);});});};self.copyApiKey=function(){copyToClipboard(self.api_key());};self.revealingApiKey=ko.observable(false);self.revealApiKey=()=>{self.loginState.reauthenticateIfNecessary(()=>{self.revealingApiKey(true);self.requestData().always(()=>{self.revealingApiKey(false);});});};self.showTranslationManager=function(){self.translationManagerDialog.modal();return false;};self.requestData=function(local){var callback=undefined;if(arguments.length===2||_.isFunction(local)){var exc=new Error();log.warn("The callback parameter of SettingsViewModel.requestData is deprecated, the method now returns a promise, please use that instead. Stacktrace:",exc.stack||exc.stacktrace||"");if(arguments.length===2){callback=arguments[0];local=arguments[1];}else{callback=local;local=false;}}
-var callbackHandler=function(){if(!callback)return;try{callback();}catch(exc){log.error("Error calling settings callback",callback,":",`${exc.message}\n${exc.stack || exc}`);}};if(self.receiving()){var deferred=$.Deferred();self.outstanding.push(deferred);if(callback){deferred.done(callbackHandler);}
-return deferred.promise();}
-self.receiving(true);return OctoPrint.settings.get().always(function(){self.receiving(false);}).done(function(response){self.fromResponse(response,local);if(callback){var deferred=$.Deferred();deferred.done(callbackHandler);self.outstanding.push(deferred);}
-var args=arguments;_.each(self.outstanding,function(deferred){deferred.resolve(args);});self.outstanding=[];}).fail(function(){var args=arguments;_.each(self.outstanding,function(deferred){deferred.reject(args);});self.outstanding=[];});};self.requestTranslationData=function(){return OctoPrint.languages.list().done(self.fromTranslationResponse);};self.fromTranslationResponse=function(response){var translationsByLocale={};_.each(response.language_packs,function(item,key){_.each(item.languages,function(pack){var locale=pack.locale;if(!_.has(translationsByLocale,locale)){translationsByLocale[locale]={locale:locale,display:pack.locale_display,english:pack.locale_english,packs:[]};}
-translationsByLocale[locale]["packs"].push({identifier:key,display:item.display,pack:pack});});});var translations=[];_.each(translationsByLocale,function(item){item["packs"].sort(function(a,b){if(a.identifier=="_core")return-1;if(b.identifier=="_core")return 1;if(a.displayb.display)return 1;return 0;});translations.push(item);});self.translations.updateItems(translations);};self.languagePackDisplay=function(item){return(item.display+
-(item.english!=undefined?" ("+item.english+")":""));};self.languagePacksAvailable=ko.pureComputed(function(){return self.translations.allSize()>0;});self.deleteLanguagePack=function(locale,pack){OctoPrint.languages.delete(locale,pack).done(self.fromTranslationResponse);};self.getLocalData=function(){var data={};if(self.settings!=undefined){data=ko.mapping.toJS(self.settings);}
-var specialMappings={feature:{autoUppercaseBlacklist:function(){return splitTextToArray(self.feature_autoUppercaseBlacklist(),",",true);}},serial:{additionalPorts:function(){return commentableLinesToArray(self.serial_additionalPorts());},additionalBaudrates:function(){return _.map(splitTextToArray(self.serial_additionalBaudrates(),",",true,function(item){return!isNaN(parseInt(item));}),function(item){return parseInt(item);});},blacklistedPorts:function(){return commentableLinesToArray(self.serial_blacklistedPorts());},blacklistedBaudrates:function(){return _.map(splitTextToArray(self.serial_blacklistedBaudrates(),",",true,function(item){return!isNaN(parseInt(item));}),function(item){return parseInt(item);});},longRunningCommands:function(){return splitTextToArray(self.serial_longRunningCommands(),",",true);},checksumRequiringCommands:function(){return splitTextToArray(self.serial_checksumRequiringCommands(),",",true);},blockedCommands:function(){return splitTextToArray(self.serial_blockedCommands(),",",true);},ignoredCommands:function(){return splitTextToArray(self.serial_ignoredCommands(),",",true);},pausingCommands:function(){return splitTextToArray(self.serial_pausingCommands(),",",true);},emergencyCommands:function(){return splitTextToArray(self.serial_emergencyCommands(),",",true);},externalHeatupDetection:function(){return!self.serial_disableExternalHeatupDetection();},alwaysSendChecksum:function(){return self.serial_sendChecksum()==="always";},neverSendChecksum:function(){return self.serial_sendChecksum()==="never";},ignoreErrorsFromFirmware:function(){return self.serial_serialErrorBehaviour()==="ignore";},disconnectOnErrors:function(){return self.serial_serialErrorBehaviour()==="disconnect";}},scripts:{gcode:function(){var result={};var prefix="scripts_gcode_";var observables=_.filter(_.keys(self),function(key){return _.startsWith(key,prefix);});_.each(observables,function(observable){var script=observable.substring(prefix.length);result[script]=self[observable]();});return result;}},temperature:{profiles:function(){var result=[];_.each(self.temperature_profiles(),function(profile){try{result.push({name:profile.name,extruder:Math.floor(_.isNumber(profile.extruder)?profile.extruder:parseInt(profile.extruder)),bed:Math.floor(_.isNumber(profile.bed)?profile.bed:parseInt(profile.bed)),chamber:Math.floor(_.isNumber(profile.chamber)?profile.chamber:_.isNumber(parseInt(profile.chamber))?parseInt(profile.chamber):0)});}catch(ex){}});return result;}}};var mapFromObservables=function(data,mapping,keyPrefix){var flag=false;var result={};_.forOwn(data,function(value,key){var observable=key;if(keyPrefix!==undefined){observable=keyPrefix+"_"+observable;}
-if(self.observableCopies.hasOwnProperty(observable)){return;}
-if(self.webcamCompat.hasOwnProperty(observable)){return;}
-if(mapping&&mapping[key]&&_.isFunction(mapping[key])){result[key]=mapping[key]();flag=true;}else if(_.isPlainObject(value)){var subresult=mapFromObservables(value,mapping&&mapping[key]?mapping[key]:undefined,observable);if(subresult!==undefined){result[key]=subresult;flag=true;}}else if(self.hasOwnProperty(observable)){result[key]=self[observable]();flag=true;}});return flag?result:undefined;};var dataFromObservables=mapFromObservables(data,specialMappings);data=deepMerge(data,dataFromObservables);return data;};self.reauthenticationTimeout=undefined;self.fromResponse=function(response,local){var serverChangedData;var clientChangedData;if(local){serverChangedData=getOnlyChangedData(response,self.lastReceivedSettings);clientChangedData=getOnlyChangedData(self.getLocalData(),self.lastReceivedSettings);}else{serverChangedData=response;clientChangedData=undefined;}
-self.lastReceivedSettings=response;if(self.settings===undefined){self.settings=ko.mapping.fromJS(serverChangedData);}else{ko.mapping.fromJS(serverChangedData,self.settings);}
-var specialMappings={appearance:{defaultLanguage:function(value){self.appearance_defaultLanguage("_default");if(_.includes(self.locale_languages,value)){self.appearance_defaultLanguage(value);}}},feature:{autoUppercaseBlacklist:function(value){self.feature_autoUppercaseBlacklist(value.join(", "));}},serial:{additionalPorts:function(value){self.serial_additionalPorts(value.join("\n"));},additionalBaudrates:function(value){self.serial_additionalBaudrates(value.join(", "));},blacklistedPorts:function(value){self.serial_blacklistedPorts(value.join("\n"));},blacklistedBaudrates:function(value){self.serial_blacklistedBaudrates(value.join(", "));},longRunningCommands:function(value){self.serial_longRunningCommands(value.join(", "));},checksumRequiringCommands:function(value){self.serial_checksumRequiringCommands(value.join(", "));},blockedCommands:function(value){self.serial_blockedCommands(value.join(", "));},ignoredCommands:function(value){self.serial_ignoredCommands(value.join(", "));},pausingCommands:function(value){self.serial_pausingCommands(value.join(", "));},emergencyCommands:function(value){self.serial_emergencyCommands(value.join(", "));},externalHeatupDetection:function(value){self.serial_disableExternalHeatupDetection(!value);},alwaysSendChecksum:function(value){if(value){self.serial_sendChecksum("always");}},neverSendChecksum:function(value){if(value){self.serial_sendChecksum("never");}},ignoreErrorsFromFirmware:function(value){if(value){self.serial_serialErrorBehaviour("ignore");}},disconnectOnErrors:function(value){if(value){self.serial_serialErrorBehaviour("disconnect");}}},terminalFilters:function(value){self.terminalFilters($.extend(true,[],value));},temperature:{profiles:function(value){self.temperature_profiles($.extend(true,[],value));}}};_.each(self.webcamCompat,(mapped,key)=>{if(self.settings.hasOwnProperty(key))return;if(!self.settings.webcam.hasOwnProperty(mapped))return;const message="Please use the webcam system introduced with 1.9.0, the "+
-key+" config setting is deprecated and will be removed in a future release. Stacktrace:";self[key]=ko.pureComputed({read:()=>{const exc=new Error();log.warn(message,exc.stack||exc.stacktrace||"");return self.settings.webcam[mapped]();},write:(value)=>{const exc=new Error();log.warn(message,exc.stack||exc.stacktrace||"");self.settings.webcam[mapped](value);},owner:self});});var mapToObservables=function(data,mapping,local,keyPrefix){if(!_.isPlainObject(data)){return;}
-_.forOwn(data,function(value,key){var observable=key;if(keyPrefix!=undefined){observable=keyPrefix+"_"+observable;}
-if(self.observableCopies.hasOwnProperty(observable)){return;}
-if(self.webcamCompat.hasOwnProperty(observable)){return;}
-var haveLocalVersion=local&&local.hasOwnProperty(key);if(mapping&&mapping[key]&&_.isFunction(mapping[key])&&!haveLocalVersion){mapping[key](value);}else if(_.isPlainObject(value)){mapToObservables(value,mapping&&mapping[key]?mapping[key]:undefined,local&&local[key]?local[key]:undefined,observable);}else if(!haveLocalVersion&&self.hasOwnProperty(observable)){self[observable](value);}});};mapToObservables(serverChangedData,specialMappings,clientChangedData);firstRequest.resolve();self.apiKeyVisible(self.loginState.checkCredentialsSeen());if(self.apiKeyVisible()){self.reauthenticationTimeout=self.loginState.afterReauthenticationTimeout(()=>{self.requestData();},self.reauthenticationTimeout);}};self.cancelData=function(){self.fromResponse(self.lastReceivedSettings);self.hide();};self.saveData=function(data,successCallback,setAsSending){var options;if(_.isPlainObject(successCallback)){options=successCallback;}else{options={success:successCallback,sending:setAsSending===true};}
-self.settingsDialog.trigger("beforeSave");self.sawUpdateEventWhileSending=false;self.sending(data===undefined||options.sending||false);if(data===undefined){var localData=self.getLocalData();data=getOnlyChangedData(localData,self.lastReceivedSettings);}
-if(self.testFoldersDuplicate()){delete data.folder;}
-self.active=true;return OctoPrint.settings.save(data).done(function(data,status,xhr){self.ignoreNextUpdateEvent=!self.sawUpdateEventWhileSending;self.active=false;self.receiving(true);self.sending(false);try{self.fromResponse(data);if(options.success)options.success(data,status,xhr);}finally{self.receiving(false);}}).fail(function(xhr,status,error){self.sending(false);self.active=false;if(options.error)options.error(xhr,status,error);}).always(function(xhr,status){if(options.complete)options.complete(xhr,status);});};self.onEventSettingsUpdated=function(){if(self.active){self.sawUpdateEventWhileActive=true;}
-var preventSettingsRefresh=_.any(self.allViewModels,function(viewModel){if(viewModel.hasOwnProperty("onSettingsPreventRefresh")){try{return viewModel["onSettingsPreventRefresh"]();}catch(e){log.warn("Error while calling onSettingsPreventRefresh on",viewModel,":",e);return false;}}else{return false;}});if(preventSettingsRefresh){return;}
-if(self.isDialogActive()){if(self.sending()||self.receiving()||self.active||self.ignoreNextUpdateEvent){self.ignoreNextUpdateEvent=false;return;}
-if(!hasDataChanged(self.getLocalData(),self.lastReceivedSettings)){self.requestData();}else{self.settingsUpdatedDialog.modal("show");}}else{self.requestData();}};self._resetScrollPosition=function(){$("#settings_dialog_content",self.settingsDialog).scrollTop(0);$('#settings_dialog_content ul.nav-pills a[data-toggle="tab"]:first',self.settingsDialog).tab("show");$('#settings_dialog_content ul.nav-list a[data-toggle="tab"]:first',self.settingsDialog).tab("show");$('#settings_dialog_content ul.nav-tabs a[data-toggle="tab"]:first',self.settingsDialog).tab("show");};self.selectTab=function(tab){if(tab!=undefined){if(!_.startsWith(tab,"#")){tab="#"+tab;}
-$('ul.nav-list a[href="'+tab+'"]',self.settingsDialog).tab("show");}else{$('ul.nav-list a[data-toggle="tab"]:first',self.settingsDialog).tab("show");}};self.onServerReconnect=function(){self.requestData();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(!self._startupComplete)return;self.requestData();};self.validURL=function(str){var pattern=new RegExp("^(https?:\\/\\/)?"+"((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|"+"((\\d{1,3}\\.){3}\\d{1,3}))"+"(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*"+"(\\?[;&a-z\\d%_.~+=-]*)?"+"(\\#[-a-z\\d_]*)?$","i");return!!pattern.test(str);};}
-OCTOPRINT_VIEWMODELS.push({construct:SettingsViewModel,dependencies:["loginStateViewModel","accessViewModel","printerProfilesViewModel","aboutViewModel","usersViewModel"],elements:["#settings_dialog","#navbar_settings"]});});
-;
-
-// source: js/app/viewmodels/slicing.js
-$(function(){function SlicingViewModel(parameters){var self=this;self.loginState=parameters[0];self.printerProfiles=parameters[1];self.printerState=parameters[2];self.access=parameters[3];self.file=ko.observable(undefined);self.target=undefined;self.path=undefined;self.data=undefined;self.defaultSlicer=undefined;self.defaultProfile=undefined;self.destinationFilename=ko.observable();self.gcodeFilename=self.destinationFilename;self.title=ko.observable();self.slicer=ko.observable();self.slicers=ko.observableArray();self.profile=ko.observable();self.profiles=ko.observableArray();self.printerProfile=ko.observable();self.slicerSameDevice=ko.observable();self.allViewModels=undefined;self.slicersForFile=function(file){if(file===undefined){return[];}
-return _.filter(self.configuredSlicers(),function(slicer){return _.any(slicer.sourceExtensions,function(extension){return _.endsWith(file.toLowerCase(),"."+extension.toLowerCase());});});};self.profilesForSlicer=function(key){if(key==undefined){key=self.slicer();}
-if(key==undefined||!self.data.hasOwnProperty(key)){return;}
-var slicer=self.data[key];var selectedProfile=undefined;self.profiles.removeAll();_.each(_.values(slicer.profiles),function(profile){var name=profile.displayName;if(name==undefined){name=profile.key;}
-if(profile.default){selectedProfile=profile.key;}
-self.profiles.push({key:profile.key,name:name});});self.profile(selectedProfile);self.defaultProfile=selectedProfile;};self.resetProfiles=function(){self.profiles.removeAll();self.profile(undefined);};self.metadataForSlicer=function(key){if(key==undefined||!self.data.hasOwnProperty(key)){return;}
-var slicer=self.data[key];self.slicerSameDevice(slicer.sameDevice);};self.resetMetadata=function(){self.slicerSameDevice(true);};self.configuredSlicers=ko.pureComputed(function(){return _.filter(self.slicers(),function(slicer){return slicer.configured;});});self.matchingSlicers=ko.computed(function(){var slicers=self.slicersForFile(self.file());var containsSlicer=function(key){return _.any(slicers,function(slicer){return slicer.key==key;});};var current=self.slicer();if(!containsSlicer(current)){if(self.defaultSlicer!==undefined&&containsSlicer(self.defaultSlicer)){self.slicer(self.defaultSlicer);}else{self.slicer(undefined);self.resetProfiles();}}else{self.profilesForSlicer(self.slicer());}
-return slicers;});self.afterSlicingOptions=[{value:"none",text:gettext("Do nothing")},{value:"select",text:gettext("Select for printing")},{value:"print",text:gettext("Start printing")}];self.afterSlicing=ko.observable("none");self.show=function(target,file,force,path,options){options=options||{};if(!self.enableSlicingDialog()&&!force){return;}
-var filename=file;if(filename.lastIndexOf("/")!=0){path=path||filename.substr(0,filename.lastIndexOf("/"));filename=filename.substr(filename.lastIndexOf("/")+1);}
-var display=options.display||filename;var destination=display.substr(0,display.lastIndexOf("."));self.requestData();self.target=target;self.file(file);self.path=path;self.title(_.sprintf(gettext("Slicing %(filename)s"),{filename:_.escape(display)}));self.destinationFilename(destination);self.printerProfile(self.printerProfiles.currentProfile());self.afterSlicing("none");$("#slicing_configuration_dialog").modal("show");};self.slicer.subscribe(function(newValue){if(newValue===undefined){self.resetProfiles();self.resetMetadata();}else{self.profilesForSlicer(newValue);self.metadataForSlicer(newValue);}});self.enableSlicingDialog=ko.pureComputed(function(){return self.configuredSlicers().length>0;});self.enableSlicingDialogForFile=function(file){return self.slicersForFile(file).length>0;};self.enableSliceButton=ko.pureComputed(function(){return(self.destinationFilename()!=undefined&&self.destinationFilename().trim()!=""&&self.slicer()!=undefined&&self.profile()!=undefined&&(!(self.printerState.isPrinting()||self.printerState.isPaused())||!self.slicerSameDevice()));});self.sliceButtonTooltip=ko.pureComputed(function(){if(!self.enableSliceButton()){if((self.printerState.isPrinting()||self.printerState.isPaused())&&self.slicerSameDevice()){return gettext("Cannot slice on the same device while printing");}else{return gettext("Cannot slice, not all parameters specified");}}else{return gettext("Start the slicing process");}});self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.SLICE)){return;}
-return OctoPrint.slicing.listAllSlicersAndProfiles().done(function(data){self.fromResponse(data);});};self.destinationExtension=ko.pureComputed(function(){var fallback="???";if(self.slicer()===undefined){return fallback;}
-var slicer=self.data[self.slicer()];if(slicer===undefined){return fallback;}
-var extensions=slicer.extensions;if(extensions===undefined){return fallback;}
-var destinationExtensions=extensions.destination;if(destinationExtensions===undefined||!destinationExtensions.length){return fallback;}
-return destinationExtensions[0]||fallback;});self.fromResponse=function(data){self.data=data;var selectedSlicer=undefined;self.slicers.removeAll();_.each(_.values(data),function(slicer){var name=slicer.displayName;if(name==undefined){name=slicer.key;}
-if(slicer.default&&slicer.configured){selectedSlicer=slicer.key;}
-var props={key:slicer.key,name:name,configured:slicer.configured,sourceExtensions:slicer.extensions.source,destinationExtensions:slicer.extensions.destination,sameDevice:slicer.sameDevice};self.slicers.push(props);});self.defaultSlicer=selectedSlicer;if(self.allViewModels){callViewModels(self.allViewModels,"onSlicingData",[data]);}};self.slice=function(){if(!self.enableSliceButton()){return;}
-var destinationFilename=self.destinationFilename();var destinationExtensions=self.data[self.slicer()]&&self.data[self.slicer()].extensions&&self.data[self.slicer()].extensions.destination?self.data[self.slicer()].extensions.destination:["???"];if(!_.any(destinationExtensions,function(extension){return _.endsWith(destinationFilename.toLowerCase(),"."+extension.toLowerCase());})){destinationFilename=destinationFilename+"."+destinationExtensions[0];}
-var data={slicer:self.slicer(),profile:self.profile(),printerProfile:self.printerProfile(),destination:destinationFilename};if(self.path!=undefined){data["path"]=self.path;}
-if(self.afterSlicing()=="print"){data["print"]=true;}else if(self.afterSlicing()=="select"){data["select"]=true;}
-OctoPrint.files.slice(self.target,self.file(),data).done(function(){$("#slicing_configuration_dialog").modal("hide");self.destinationFilename(undefined);self.slicer(self.defaultSlicer);self.profile(self.defaultProfile);});};self._sanitize=function(name){return name.replace(/[^a-zA-Z0-9\-_\.\(\) ]/g,"").replace(/ /g,"_");};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};self.onEventSettingsUpdated=function(payload){self.requestData();};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;};}
-OCTOPRINT_VIEWMODELS.push({construct:SlicingViewModel,dependencies:["loginStateViewModel","printerProfilesViewModel","printerStateViewModel","accessViewModel"],elements:["#slicing_configuration_dialog"]});});
-;
-
-// source: js/app/viewmodels/system.js
-$(function(){function SystemViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.lastCommandResponse=undefined;self.systemActions=ko.observableArray([]);self._startupNotification=undefined;self.requestData=function(){self.requestCommandData();self.requestStartupData();};self.requestCommandData=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();}
-return OctoPrint.system.getCommands().done(self.fromCommandResponse);};self.fromCommandResponse=function(response){var actions=[];if(response.core&&response.core.length){_.each(response.core,function(data){var action=_.extend({},data);action.actionSource="core";actions.push(action);});if((response.custom&&response.custom.length)||(response.plugin&&response.plugin.length)){actions.push({action:"divider"});}}
-_.each(response.plugin,function(data){var action=_.extend({},data);action.actionSource="plugin";actions.push(action);if(response.custom&&response.custom.length){actions.push({action:"divider"});}});_.each(response.custom,function(data){var action=_.extend({},data);action.actionSource="custom";actions.push(action);});self.lastCommandResponse=response;self.systemActions(actions);};self.requestStartupData=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();}
-return OctoPrint.system.getStartupData().done(self.fromStartupResponse);};self.fromStartupResponse=function(response){const startupData=response.startup;if(startupData.flagged_basefolders){if(self._startupNotification)self._startupNotification.remove();let html=""+
-gettext("The following folder(s) were found to be unusable by OctoPrint during startup and have been turned back to the default:")+"
";html+="";_.each(startupData.flagged_basefolders,(value,key)=>{html+=""+
-_.escape(key)+"
: "+
-_.escape(value)+" ";});html+=" ";html+=""+
-gettext("Please check the permissions of these folders and make sure they are writable by the user running OctoPrint. In case of network shares, make sure they have been mounted before OctoPrint starts.")+"
";self._startupNotification=new PNotify({title:gettext("Warning"),text:html,type:"warning",hide:false});}};self.triggerCommand=function(commandSpec){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();}
-var deferred=$.Deferred();var callback=function(){OctoPrint.system.executeCommand(commandSpec.actionSource,commandSpec.action).done(function(){var text;if(commandSpec.async){text=gettext('The command "%(command)s" was triggered asynchronously');}else{text=gettext('The command "%(command)s" executed successfully');}
-new PNotify({title:"Success",text:_.sprintf(text,{command:_.escape(commandSpec.name)}),type:"success"});deferred.resolve(["success",arguments]);}).fail(function(jqXHR,textStatus,errorThrown){if(!commandSpec.hasOwnProperty("ignore")||!commandSpec.ignore){var error=""+
-_.sprintf(gettext('The command "%(command)s" could not be executed.'),{command:_.escape(commandSpec.name)})+"
";error+=pnotifyAdditionalInfo(""+_.escape(jqXHR.responseText)+" ");new PNotify({title:gettext("Error"),text:error,type:"error",hide:false});deferred.reject(["error",arguments]);}else{deferred.resolve(["ignored",arguments]);}});};if(commandSpec.confirm){showConfirmationDialog({message:commandSpec.confirm,onproceed:function(){callback();},oncancel:function(){deferred.reject("cancelled",arguments);}});}else{callback();}
-return deferred.promise();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(user){if(self.loginState.hasPermission(self.access.permissions.SYSTEM)){self.requestData();}else{self.lastCommandResponse=undefined;self.systemActions([]);}};self.onEventSettingsUpdated=function(){if(self.loginState.hasPermission(self.access.permissions.SYSTEM)){self.requestData();}};}
-OCTOPRINT_VIEWMODELS.push({construct:SystemViewModel,dependencies:["loginStateViewModel","accessViewModel"]});});
-;
-
-// source: js/app/viewmodels/temperature.js
-$(function(){function TemperatureViewModel(parameters){var self=this;self.loginState=parameters[0];self.settingsViewModel=parameters[1];self.access=parameters[2];self.printerState=parameters[3];self._createToolEntry=function(){var entry={name:ko.observable(),key:ko.observable(),actual:ko.observable(0),target:ko.observable(0),offset:ko.observable(0),newTarget:ko.observable(),newOffset:ko.observable()};entry.newTargetValid=ko.pureComputed(function(){var value=entry.newTarget();try{value=parseInt(value);}catch(exc){return false;}
-return value>=0&&value<=999;});entry.newOffsetValid=ko.pureComputed(function(){var value=entry.newOffset();try{value=parseInt(value);}catch(exc){return false;}
-return-50<=value<=50;});entry.offset.subscribe(function(newValue){if(self.changingOffset.item!==undefined&&self.changingOffset.item.key()===entry.key()){self.changingOffset.offset(newValue);}});return entry;};self.changingOffset={offset:ko.observable(0),newOffset:ko.observable(0),name:ko.observable(""),item:undefined,title:ko.pureComputed(function(){return _.sprintf(gettext("Changing Offset of %(name)s"),{name:_.escape(self.changingOffset.name())});}),description:ko.pureComputed(function(){return _.sprintf(gettext('Use the form below to specify a new offset to apply to all temperature commands sent from printed files for "%(name)s"'),{name:_.escape(self.changingOffset.name())});})};self.changeOffsetDialog=undefined;self.loginStateSubscription=undefined;self.tools=ko.observableArray([]);self.hasTools=ko.pureComputed(function(){return self.tools().length>0;});self.hasBed=ko.observable(true);self.hasChamber=ko.observable(false);self.visible=ko.pureComputed(function(){return self.hasTools()||self.hasBed();});self.bedTemp=self._createToolEntry();self.bedTemp["name"](gettext("Bed"));self.bedTemp["key"]("bed");self.chamberTemp=self._createToolEntry();self.chamberTemp["name"](gettext("Chamber"));self.chamberTemp["key"]("chamber");self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.temperature_profiles=self.settingsViewModel.temperature_profiles;self.temperature_cutoff=self.settingsViewModel.temperature_cutoff;self.heaterOptions=ko.observable({});self._printerProfileInitialized=false;self._currentTemperatureDataBacklog=[];self._historyTemperatureDataBacklog=[];self._graphUpdater=undefined;self._printerProfileUpdated=function(){var graphColors=["red","orange","green","brown","purple"];var heaterOptions={};var tools=[];var color;const currentProfileData=self.settingsViewModel.printerProfiles.currentProfileData();if(!currentProfileData)return;var numExtruders=currentProfileData?currentProfileData.extruder.count():0;var sharedNozzle=currentProfileData?currentProfileData.extruder.sharedNozzle():false;if(numExtruders&&numExtruders>1&&!sharedNozzle){for(var extruder=0;extruder=minTime;};_.each(_.keys(self.heaterOptions()),function(d){const actualLen=result[d].actual.length;result[d].actual=_.filter(result[d].actual,filterOld);if(actualLen&&result[d].actual.length<=actualLen){result[d].actual.unshift([minTime,undefined]);}
-const targetLen=result[d].target.length;result[d].target=_.filter(result[d].target,filterOld);if(targetLen&&result[d].target.length<=targetLen){result[d].target.unshift([minTime,undefined]);}});}
-return result;};self.profileText=function(heater,profile){var text=gettext("Set %(name)s (%(value)s)");var format=function(temp){if(temp===0||temp===undefined||temp===null){return gettext("Off");}else{return""+temp+"°C";}};var value;if(heater==="all"){value=gettext("Tool")+": %(extruder)s";if(self.hasBed()){value+="/"+gettext("Bed")+": %(bed)s";}
-if(self.hasChamber()){value+="/"+gettext("Chamber")+": %(chamber)s";}
-value=_.sprintf(value,{extruder:format(profile.extruder),bed:format(profile.bed),chamber:format(profile.chamber)});}else if(heater.key()==="bed"){value=format(profile.bed);}else if(heater.key()==="chamber"){value=format(profile.chamber);}else{value=format(profile.extruder);}
-return _.sprintf(text,{name:_.escape(profile.name),value:_.escape(value)});};self.updatePlot=function(){var graph=$("#temperature-graph");if(!graph.length)return;if(!self.plot)return;var plotInfo=self._getPlotInfo();if(plotInfo===undefined)return;var newMax=Math.max(Math.max.apply(null,plotInfo.max)*1.1,310);if(newMax!==self.plot.getAxes().yaxis.max){self._initializePlot(true,plotInfo);}else{self.plot.setData(plotInfo.data);self.plot.setupGrid();self.updateLegend(self._replaceLegendLabel);self.plot.draw();}};self._drawMarkings=function(){var graph=$("#temperature-graph");if(!self.plot){return[];}
-$(".temperature-mark-label").remove();if(!self.showStateMarks()){return[];}
-var graphWidth=self.plot.width();var yAxisLabelWidth=40;var markingsLabelMargin=0;var lineWidth=2;var marks=self.markings.map(function(mark){var time=parseInt(mark.time*1000);var o=self.plot.pointOffset({x:time,y:self.plot.getAxes().yaxis.max});var markLabel=mark.type;if(mark.label){markLabel=gettext(mark.label);}
-var label=$("
");label.html(markLabel);label.addClass("temperature-mark-label");label.addClass("temperature-mark-type-"+mark.type);if(o.left>yAxisLabelWidth){graph.append(label);if(o.left>graphWidth+
-yAxisLabelWidth-
-label.outerHeight()-
-markingsLabelMargin){label.css("left",o.left-label.outerHeight()-markingsLabelMargin+"px");label.css("border-radius","5px 0 0 0");}else{label.css("left",o.left+markingsLabelMargin+"px");label.css("border-radius","0 0 0 5px");}
-label.css("top",o.top+label.outerWidth()+"px");}
-return{color:label.css("background-color"),lineWidth:lineWidth,xaxis:{from:time,to:time}};});return marks;};[gettext("Start"),gettext("Done"),gettext("Cancel"),gettext("Pause"),gettext("Resume"),gettext("Connected"),gettext("Disconnected")];self._initializePlot=function(force,plotInfo){var graph=$("#temperature-graph");if(!graph.length)return;if(self.plot&&!force)return;plotInfo=plotInfo||self._getPlotInfo();if(plotInfo===undefined)return;var options={yaxis:{min:0,max:Math.max(Math.max.apply(null,plotInfo.max)*1.1,310),ticks:10,tickFormatter:(val,axis)=>{if(val===undefined||val===0)return"";return val+"°C";}},xaxis:{mode:"time",ticks:(axis)=>{if(axis.max===undefined||axis.min===undefined||axis.datamax===axis.datamin)
-return[];const tickSize=5*60*1000;const ticks=[];let val=axis.max;while(val>axis.min){ticks.push(val);val-=tickSize;}
-return ticks;},tickFormatter:(val,axis)=>{var timestampUtc=Date.now();var diff=timestampUtc-val;var diffInMins=Math.round(diff/(60*1000));if(diffInMins<0){return"";}else if(diffInMins===0){return gettext("now");}else{return"- "+diffInMins+" "+gettext("min");}}},legend:{position:"sw",noColumns:2,backgroundOpacity:0}};if(!OctoPrint.coreui.browser.mobile){options["crosshair"]={mode:"x"};options["grid"]={hoverable:true,autoHighlight:false,markings:self._drawMarkings};}
-self.plot=$.plot(graph,plotInfo.data,options);};self._getPlotInfo=function(){var data=[];var heaterOptions=self.heaterOptions();if(!heaterOptions)return undefined;var maxTemps=[310/1.1];var now=Date.now();var showFahrenheit=self._shallShowFahrenheit();_.each(_.keys(heaterOptions),function(type){if(type==="bed"&&!self.hasBed()){return;}
-var actuals=[];var targets=[];if(self.temperatures[type]){actuals=self.temperatures[type].actual;targets=self.temperatures[type].target;}
-var actualTemp=actuals&&actuals.length?formatTemperature(actuals[actuals.length-1][1],showFahrenheit):"-";var targetTemp=targets&&targets.length?formatTemperature(targets[targets.length-1][1],showFahrenheit,1):"-";data.push({label:gettext("Actual")+" "+
-heaterOptions[type].name+": "+
-actualTemp,color:heaterOptions[type].color,data:actuals.length?actuals:[[now,undefined]]});data.push({label:gettext("Target")+" "+
-heaterOptions[type].name+": "+
-targetTemp,color:pusher.color(heaterOptions[type].color).tint(0.5).html(),data:targets.length?targets:[[now,undefined]],dashes:{show:true}});maxTemps.push(self.getMaxTemp(actuals,targets));});return{max:maxTemps,data:data};};self.updateLegend=function(replaceLegendLabel){self.plotLegendTimeout=undefined;var resetLegend=function(){_.each(dataset,function(series,index){var value=series.data&&series.data.length?series.data[series.data.length-1][1]:undefined;replaceLegendLabel(index,series,value);});};var pos=self.plotHoverPos;if(pos&&!OctoPrint.coreui.browser.mobile){var i;var axes=self.plot.getAxes();var dataset=self.plot.getData();if(pos.xaxes.xaxis.max||pos.yaxes.yaxis.max){resetLegend();}else{_.each(dataset,function(series,index){for(i=0;ipos.x){break;}}
-var y;var p1=series.data[i-1];var p2=series.data[i];if(p1===undefined&&p2===undefined){y=undefined;}else if(p1===undefined){y=p2[1];}else if(p2===undefined){y=p1[1];}else{y=p1[1]+
-((p2[1]-p1[1])*(pos.x-p1[0]))/(p2[0]-p1[0]);}
-replaceLegendLabel(index,series,y,true);});}}else{resetLegend();}
-self.plot.setupGrid();};self.getMaxTemp=function(actuals,targets){var maxTemp=0;actuals.forEach(function(pair){if(pair[1]>maxTemp){maxTemp=pair[1];}});targets.forEach(function(pair){if(pair[1]>maxTemp){maxTemp=pair[1];}});return maxTemp;};self.incrementTarget=function(item){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){value=item.target();}
-try{value=parseInt(value);if(value>999)return;item.newTarget(value+1);self.autosendTarget(item);}catch(ex){}};self.decrementTarget=function(item){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){value=item.target();}
-try{value=parseInt(value);if(value<=0)return;item.newTarget(value-1);self.autosendTarget(item);}catch(ex){}};var _sendTimeout={};self.autosendTarget=function(item){if(!self.settingsViewModel.temperature_sendAutomatically())return;var delay=self.settingsViewModel.temperature_sendAutomaticallyAfter()*1000;var name=item.name();if(_sendTimeout[name]){window.clearTimeout(_sendTimeout[name]);}
-_sendTimeout[name]=window.setTimeout(function(){self.setTarget(item);delete _sendTimeout[name];},delay);};self.clearAutosendTarget=function(item){var name=item.name();if(_sendTimeout[name]){window.clearTimeout(_sendTimeout[name]);delete _sendTimeout[name];}};self.setTarget=function(item,form){var value=item.newTarget();if(form!==undefined){$(form).find("input").blur();}
-if(value===undefined||(typeof value==="string"&&value.trim()===""))
-return OctoPrintClient.createRejectedDeferred();self.clearAutosendTarget(item);return self.setTargetToValue(item,value);};self.setTargetsFromProfile=function(temperatureProfile){if(temperatureProfile===undefined){console.log("temperatureProfile is undefined!");return;}
-if(self.hasBed()){self.setTargetFromProfile(self.bedTemp,temperatureProfile);}
-if(self.hasChamber()){self.setTargetFromProfile(self.chamberTemp,temperatureProfile);}
-self.tools().forEach(function(element){self.setTargetFromProfile(element,temperatureProfile);});};self.setTargetFromProfile=function(item,profile){if(!profile)return OctoPrintClient.createRejectedDeferred();self.clearAutosendTarget(item);var target;if(item.key()==="bed"){target=profile.bed;}else if(item.key()==="chamber"){target=profile.chamber;}else{target=profile.extruder;}
-if(target===undefined)target=0;return self.setTargetToValue(item,target);};self.setTargetsToZero=function(){if(self.hasBed()){self.setTargetToZero(self.bedTemp);}
-if(self.hasChamber()){self.setTargetToZero(self.chamberTemp);}
-self.tools().forEach(function(element){self.setTargetToZero(element);});};self.setTargetToZero=function(item){self.clearAutosendTarget(item);return self.setTargetToValue(item,0);};self.setTargetToValue=function(item,value){self.clearAutosendTarget(item);try{value=parseInt(value);}catch(ex){return OctoPrintClient.createRejectedDeferred();}
-if(value<0||value>999)return OctoPrintClient.createRejectedDeferred();var onSuccess=function(){item.target(value);item.newTarget("");};if(item.key()==="bed"){return self._setBedTemperature(value).done(onSuccess);}else if(item.key()==="chamber"){return self._setChamberTemperature(value).done(onSuccess);}else{return self._setToolTemperature(item.key(),value).done(onSuccess);}};self.changeOffset=function(item){self.changingOffset.item=item;self.changingOffset.name(item.name());self.changingOffset.offset(item.offset());self.changingOffset.newOffset(item.offset());self.changeOffsetDialog.modal("show");};self.incrementChangeOffset=function(){var value=self.changingOffset.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()===""))
-value=self.changingOffset.offset();try{value=parseInt(value);if(value>=50)return;self.changingOffset.newOffset(value+1);}catch(ex){}};self.decrementChangeOffset=function(){var value=self.changingOffset.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()===""))
-value=self.changingOffset.offset();try{value=parseInt(value);if(value<=-50)return;self.changingOffset.newOffset(value-1);}catch(ex){}};self.deleteChangeOffset=function(){self.changingOffset.newOffset(0);};self.confirmChangeOffset=function(){var item=self.changingOffset.item;item.newOffset(self.changingOffset.newOffset());self.setOffset(item).done(function(){self.changeOffsetDialog.modal("hide");self.changingOffset.offset(0);self.changingOffset.newOffset(0);self.changingOffset.name("");self.changingOffset.item=undefined;});};self.setOffset=function(item){var value=item.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()===""))
-return OctoPrintClient.createRejectedDeferred();return self.setOffsetToValue(item,value);};self.setOffsetToZero=function(item){return self.setOffsetToValue(item,0);};self.setOffsetToValue=function(item,value){try{value=parseInt(value);}catch(ex){return OctoPrintClient.createRejectedDeferred();}
-if(value<-50||value>50)
-return OctoPrintClient.createRejectedDeferred();var onSuccess=function(){item.offset(value);item.newOffset("");};if(item.key()==="bed"){return self._setBedOffset(value).done(onSuccess);}else if(item.key()==="chamber"){return self._setChamberOffset(value).done(onSuccess);}else{return self._setToolOffset(item.key(),value).done(onSuccess);}};self._setToolTemperature=function(tool,temperature){var data={};data[tool]=parseInt(temperature);return OctoPrint.printer.setToolTargetTemperatures(data);};self._setToolOffset=function(tool,offset){var data={};data[tool]=parseInt(offset);return OctoPrint.printer.setToolTemperatureOffsets(data);};self._setBedTemperature=function(temperature){return OctoPrint.printer.setBedTargetTemperature(parseInt(temperature));};self._setBedOffset=function(offset){return OctoPrint.printer.setBedTemperatureOffset(parseInt(offset));};self._setChamberTemperature=function(temperature){return OctoPrint.printer.setChamberTargetTemperature(parseInt(temperature));};self._setChamberOffset=function(offset){return OctoPrint.printer.setChamberTemperatureOffset(parseInt(offset));};self._replaceLegendLabel=function(index,series,value,emph){var showFahrenheit=self._shallShowFahrenheit();var temp;if(index%2===0){temp=formatTemperature(value,showFahrenheit);}else{temp=formatTemperature(value,showFahrenheit,1);}
-if(emph){temp=""+temp+" ";}
-series.label=series.label.replace(/:.*/,": "+temp);};self._shallShowFahrenheit=function(){return self.settingsViewModel.settings!==undefined?self.settingsViewModel.settings.appearance.showFahrenheitAlso():false;};self.handleEnter=function(event,type,item){if(event.keyCode===13){if(type==="target"){self.setTarget(item).done(function(){event.target.blur();});}else if(type==="offset"){self.confirmChangeOffset();}}};self.handleFocus=function(event,type,item){if(type==="target"){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){item.newTarget(item.target());}
-window.setTimeout(function(){event.target.select();},0);}else if(type==="offset"){window.setTimeout(function(){event.target.select();},0);}};self.initOrUpdate=function(){if(OctoPrint.coreui.selectedTab!=="#temp"||!$("#temp").is(":visible")){return;}
-if(!self.plot){self._initializePlot();}else{self.updatePlot();}};self.onAfterTabChange=function(){self.initOrUpdate();};self.onStartup=function(){var graph=$("#temperature-graph");if(graph.length&&!OctoPrint.coreui.browser.mobile){graph.bind("plothover",function(event,pos,item){self.plotHoverPos=pos;if(!self.plotLegendTimeout){self.plotLegendTimeout=window.setTimeout(function(){self.updateLegend(self._replaceLegendLabel);},50);}});}
-self.changeOffsetDialog=$("#change_offset_dialog");self._graphUpdater=setInterval(()=>{if(self.printerState.isOperational())return;const now=Date.now()/1000;const entry={};_.each(_.keys(self.heaterOptions()),(type)=>{entry[type]={actual:undefined,target:undefined};});entry["time"]=now;self.temperatures=self._processTemperatureData(now,[entry],self.temperatures);self.updatePlot();},1000);};self.onStartupComplete=function(){self.initOrUpdate();self._printerProfileUpdated();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.initOrUpdate();};}
-OCTOPRINT_VIEWMODELS.push({construct:TemperatureViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel","printerStateViewModel"],elements:["#temp","#temp_link","#change_offset_dialog"]});});
-;
-
-// source: js/app/viewmodels/terminal.js
-$(function(){function TerminalViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.tabActive=false;self.previousScroll=undefined;self.log=ko.observableArray([]);self.log.extend({throttle:500});self.plainLogLines=ko.observableArray([]);self.plainLogLines.extend({throttle:500});self.buffer=ko.observable(300);self.upperLimit=ko.observable(1499);self.command=ko.observable(undefined);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.autoscrollEnabled=ko.observable(true);self.filters=self.settings.terminalFilters;self.filterRegex=ko.observable();self.cmdHistory=[];self.cmdHistoryIdx=-1;self.enableFancyFunctionality=ko.observable(true);self.disableTerminalLogDuringPrinting=ko.observable(false);self.acceptableFancyTime=500;self.acceptableUnfancyTime=300;self.reenableTimeout=5000;self.forceFancyFunctionality=ko.observable(false);self.forceTerminalLogDuringPrinting=ko.observable(false);self.fancyFunctionality=ko.pureComputed(function(){return self.enableFancyFunctionality()||self.forceFancyFunctionality();});self.terminalLogDuringPrinting=ko.pureComputed(function(){return(!self.disableTerminalLogDuringPrinting()||self.forceTerminalLogDuringPrinting());});self.displayedLines=ko.pureComputed(function(){if(!self.enableFancyFunctionality()){return self.log();}
-var regex=self.filterRegex();var lineVisible=function(entry){return regex===undefined||!entry.line.match(regex);};var filtered=false;var result=[];var lines=self.log();_.each(lines,function(entry){if(lineVisible(entry)){result.push(entry);filtered=false;}else if(!filtered){result.push(self._toInternalFormat("[...]","filtered"));filtered=true;}});return result;});self.plainLogOutput=ko.pureComputed(function(){if(self.fancyFunctionality()){return;}
-return self.plainLogLines().join("\n");});self.lineCount=ko.pureComputed(function(){if(!self.fancyFunctionality()){return;}
-var regex=self.filterRegex();var lineVisible=function(entry){return regex===undefined||!entry.line.match(regex);};var lines=self.log();var total=lines.length;var displayed=_.filter(lines,lineVisible).length;var filtered=total-displayed;if(filtered>0){if(total>self.upperLimit()){return _.sprintf(gettext("showing %(displayed)d lines (%(filtered)d of %(total)d total lines filtered, buffer full)"),{displayed:displayed,total:total,filtered:filtered});}else{return _.sprintf(gettext("showing %(displayed)d lines (%(filtered)d of %(total)d total lines filtered)"),{displayed:displayed,total:total,filtered:filtered});}}else{if(total>self.upperLimit()){return _.sprintf(gettext("showing %(displayed)d lines (buffer full)"),{displayed:displayed});}else{return _.sprintf(gettext("showing %(displayed)d lines"),{displayed:displayed});}}});self.autoscrollEnabled.subscribe(function(newValue){if(newValue){self.log(self.log.slice(-self.buffer()));}});self.activeFilters=ko.observableArray([]);self.activeFilters.subscribe(function(e){self.updateFilterRegex();});self.blacklist=[];self.settings.feature_autoUppercaseBlacklist.subscribe(function(newValue){self.blacklist=splitTextToArray(newValue,",",true);});self._reenableFancyTimer=undefined;self._reenableUnfancyTimer=undefined;self._disableFancy=function(difference){if(self.enableFancyFunctionality()){log.warn("Terminal: Detected slow client (needed "+
-difference+"ms for processing new log data), disabling fancy terminal functionality");self.enableFancyFunctionality(false);}
-if(self._reenableFancyTimer){window.clearTimeout(self._reenableFancyTimer);self._reenableFancyTimer=undefined;}};self._reenableFancy=function(difference){if(self._reenableFancyTimer)return;if(self.enableFancyFunctionality())return;self._reenableFancyTimer=window.setTimeout(function(){log.info("Terminal: Client speed recovered, enabling fancy terminal functionality");self.enableFancyFunctionality(true);},self.reenableTimeout);};self._disableUnfancy=function(difference){if(!self.disableTerminalLogDuringPrinting()){log.warn("Terminal: Detected very slow client (needed "+
-difference+"ms for processing new log data), completely disabling terminal output during printing");self.disableTerminalLogDuringPrinting(true);}
-if(self._reenableUnfancyTimer){window.clearTimeout(self._reenableUnfancyTimer);self._reenableUnfancyTimer=undefined;}};self._reenableUnfancy=function(){if(self._reenableUnfancyTimer)return;if(!self.disableTerminalLogDuringPrinting())return;self._reenableUnfancyTimer=window.setTimeout(function(){log.info("Terminal: Client speed recovered, enabling terminal output during printing");self.disableTerminalLogDuringPrinting(false);},self.reenableTimeout);};self.fromCurrentData=function(data){self._processStateData(data.state);var start=new Date().getTime();self._processCurrentLogData(data.logs);var end=new Date().getTime();var difference=end-start;if(difference>=self.acceptableFancyTime){self._disableFancy(difference);}else if(difference>=self.acceptableUnfancyTime){self._disableUnfancy(difference);}else if(difference=self.upperLimit()){return;}
-if(!self.terminalLogDuringPrinting()&&self.isPrinting()){var last=self.plainLogLines()[self.plainLogLines().length-1];var disabled="--- client too slow, log output disabled while printing ---";if(last!==disabled){self.plainLogLines.push(disabled);}
-return;}
-var newData=data.length+length>self.upperLimit()?data.slice(0,self.upperLimit()-length):data;if(!newData){return;}
-if(!self.fancyFunctionality()){self.plainLogLines(self.plainLogLines().concat(newData).slice(-self.buffer()));self.updateOutput();return;}
-var newLog=self.log().concat(_.map(newData,function(line){return self._toInternalFormat(line);}));if(newData.length!==data.length){var cutoff="--- too many lines to buffer, cut off ---";newLog.push(self._toInternalFormat(cutoff,"cut"));}
-if(self.autoscrollEnabled()){newLog=newLog.slice(-self.buffer());}
-self.log(newLog);self.updateOutput();};self._processHistoryLogData=function(data){if(!data)return;self.plainLogLines(data);self.log(_.map(data,self._toInternalFormat));self.updateOutput();};self._toInternalFormat=function(line,display,type){if(display===undefined){display="line";}
-if(type===undefined||typeof type!="string"){if(line.startsWith("Recv:")){type="recv";}else if(line.startsWith("Send:")){type="send";}else if(line.startsWith("Warn:")){type="warn";}}
-return{line:escapeUnprintableCharacters(line),display:display,type:type};};self._processStateData=function(data){self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);};self.updateFilterRegex=function(){var filterRegexStr=self.activeFilters().join("|").trim();if(filterRegexStr===""){self.filterRegex(undefined);}else{self.filterRegex(new RegExp(filterRegexStr));}
-self.updateOutput();};self.updateOutput=function(){if(self.tabActive&&OctoPrint.coreui.browserTabVisible&&self.autoscrollEnabled()){self.scrollToEnd();}};self.terminalScrollEvent=_.throttle(function(){var container=self.fancyFunctionality()?$("#terminal-output"):$("#terminal-output-lowfi");var pos=container.scrollTop();var scrollingUp=self.previousScroll!==undefined&&pos0&&self.cmdHistoryIdx>0){self.cmdHistoryIdx--;}else if(keyCode===40&&self.cmdHistoryIdx=0&&self.cmdHistoryIdx%(command)s was not sent "+"to the printer:")+"
%(message)s ";new PNotify({title:gettext("Suppressed command"),text:_.sprintf(text,payload),type:severity,hide:false});};self.onEventInvalidToolReported=function(payload){new PNotify({title:gettext("Invalid tool reported"),text:_.sprintf(gettext("Your printer reported tool T%(tool)d as invalid, "+"reverting back to T%(fallback)d"),payload),type:"error",hide:false});};}
-OCTOPRINT_VIEWMODELS.push({construct:TerminalViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#term","#term_link"]});});
-;
-
-// source: js/app/viewmodels/timelapse.js
-$(function(){function TimelapseViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.settings=parameters[2];self.renderProgressBar=undefined;self.timelapsePopup=undefined;self.defaultFps=25;self.defaultPostRoll=0;self.defaultInterval=10;self.defaultRetractionZHop=0;self.defaultMinDelay=5.0;self.timelapseType=ko.observable(undefined);self.timelapseTimedInterval=ko.observable(self.defaultInterval);self.timelapsePostRoll=ko.observable(self.defaultPostRoll);self.timelapseFps=ko.observable(self.defaultFps);self.timelapseRetractionZHop=ko.observable(self.defaultRetractionZHop);self.timelapseMinDelay=ko.observable(self.defaultMinDelay);self.snapshotWebcam=ko.pureComputed(function(){var snapshotWebcamName=self.settings.webcam_snapshotWebcam();return self.settings.webcam_webcams().find(function(w){return snapshotWebcamName==w.name;});});self.canSnapshot=ko.pureComputed(function(){if(!self.snapshotWebcam()){return false;}else{return self.snapshotWebcam().canSnapshot;}});self.snapshotDisplay=ko.pureComputed(function(){if(!self.snapshotWebcam()){return"";}else{return self.snapshotWebcam().snapshotDisplay;}});self.renderProgress=ko.observable();self.renderTarget=ko.observable();self.renderAnimation=ko.observable(false);self.renderProgressString=ko.pureComputed(function(){if(!self.renderTarget()){return 0;}
-if(self.renderAnimation()){return 100;}
-if(!self.renderProgress()){return 0;}
-return self.renderProgress();});self.renderProgressBarString=ko.pureComputed(function(){if(!self.renderTarget()){return"";}
-if(self.renderAnimation()){return _.sprintf(gettext("Rendering %(target)s..."),{target:self.renderTarget()});}
-var progress=self.renderProgress();if(!progress){progress=0;}
-return _.sprintf(gettext("Rendering %(target)s... (%(progress)d%%)"),{target:self.renderTarget(),progress:progress});});self.serverConfig=ko.observable();self.persist=ko.observable(false);self.isDirty=ko.observable(false);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.markedForFileDeletion=ko.observableArray([]);self.markedForUnrenderedDeletion=ko.observableArray([]);self.isTemporary=ko.pureComputed(function(){return self.isDirty()&&!self.persist();});self.isBusy=ko.pureComputed(function(){return self.isPrinting()||self.isPaused();});self.timelapseTypeSelected=ko.pureComputed(function(){return"off"!==self.timelapseType();});self.intervalInputEnabled=ko.pureComputed(function(){return"timed"===self.timelapseType();});self.saveButtonEnabled=ko.pureComputed(function(){return(self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN)&&self.isDirty()&&!self.isPrinting());});self.resetButtonEnabled=ko.pureComputed(function(){return self.saveButtonEnabled()&&self.serverConfig()!==undefined;});self.timelapseType.subscribe(function(){self.isDirty(true);});self.timelapseTimedInterval.subscribe(function(){self.isDirty(true);});self.timelapsePostRoll.subscribe(function(){self.isDirty(true);});self.timelapseFps.subscribe(function(){self.isDirty(true);});self.timelapseRetractionZHop.subscribe(function(newValue){self.isDirty(true);});self.timelapseMinDelay.subscribe(function(){self.isDirty(true);});self.persist.subscribe(function(){self.isDirty(true);});self.listHelper=new ItemListHelper("timelapseFiles",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase())
-return 1;return 0;},date:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]b["bytes"])return-1;if(a["bytes"]b["name"].toLocaleLowerCase())
-return 1;return 0;},creation:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]b["bytes"])return-1;if(a["bytes"]0){self.timelapseTimedInterval(config.interval);}else{self.timelapseTimedInterval(self.defaultInterval);}
-if(config.type==="zchange"&&config.retractionZHop!==undefined&&config.retractionZHop>0){self.timelapseRetractionZHop(config.retractionZHop);}else{self.timelapseRetractionZHop(self.defaultRetractionZHop);}
-if(config.type==="zchange"&&config.minDelay!==undefined&&config.minDelay>=0){self.timelapseMinDelay(config.minDelay);}else{self.timelapseMinDelay(self.defaultMinDelay);}
-if(config.postRoll!==undefined&&config.postRoll>=0){self.timelapsePostRoll(config.postRoll);}else{self.timelapsePostRoll(self.defaultPostRoll);}
-if(config.fps!==undefined&&config.fps>0){self.timelapseFps(config.fps);}else{self.timelapseFps(self.defaultFps);}
-self.persist(false);self.isDirty(false);};self.fromCurrentData=function(data){self._processStateData(data.state);};self.fromHistoryData=function(data){self._processStateData(data.state);};self._processStateData=function(data){self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);};self.markFilesOnPage=function(){self.markedForFileDeletion(_.uniq(self.markedForFileDeletion().concat(_.map(self.listHelper.paginatedItems(),"name"))));};self.markAllFiles=function(){self.markedForFileDeletion(_.map(self.listHelper.allItems,"name"));};self.clearMarkedFiles=function(){self.markedForFileDeletion.removeAll();};self.isTimelapseViewable=function(data){var url=data.url;return(self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DOWNLOAD)&&url.indexOf(".mp4")>=0);};self.showTimelapsePreview=function(data){if(!self.isTimelapseViewable(data))return;var url=data.url;var previewModal=$("#timelapsePreviewModal");previewModal.children("div.modal-body").children("video").attr("src",url);previewModal.off("hidden.bs.modal").on("hidden.bs.modal",function(){$(this).attr("src","");});previewModal.modal("show");};self.removeFile=function(filename){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DELETE))
-return;var perform=function(){OctoPrint.timelapse.delete(filename).done(function(){self.markedForFileDeletion.remove(filename);self.requestData();}).fail(function(jqXHR){var html=" "+
-_.sprintf(gettext("Failed to remove timelapse %(name)s.
Please consult octoprint.log for details.
"),{name:_.escape(filename)});html+=pnotifyAdditionalInfo(''+
-_.escape(jqXHR.responseText)+" ");new PNotify({title:gettext("Could not remove timelapse"),text:html,type:"error",hide:false});});};showConfirmationDialog(_.sprintf(gettext('You are about to delete timelapse file "%(name)s".'),{name:_.escape(filename)}),perform);};self.removeMarkedFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DELETE))
-return;var perform=function(){self._bulkRemove(self.markedForFileDeletion(),"files").done(function(){self.markedForFileDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d timelapse files."),{count:self.markedForFileDeletion().length}),perform);};self.enableBulkDownload=ko.pureComputed(function(){return(self.markedForFileDeletion().length&&!self.isBusy()&&!self.bulkDownloadUrlTooLong());});self.bulkDownloadUrlTooLong=ko.pureComputed(function(){return BASEURL.length+self.bulkDownloadUrl().length>=2000;});self.bulkDownloadButtonUrl=ko.pureComputed(function(){var files=self.markedForFileDeletion();if(!files.length||self.bulkDownloadUrlTooLong()){return"javascript:void(0)";}
-return self.bulkDownloadUrl();});self.bulkDownloadUrl=function(){var files=self.markedForFileDeletion();return OctoPrint.timelapse.bulkDownloadUrl(files);};self.markUnrenderedOnPage=function(){self.markedForUnrenderedDeletion(_.uniq(self.markedForUnrenderedDeletion().concat(_.map(self.unrenderedListHelper.paginatedItems(),"name"))));};self.markAllUnrendered=function(){self.markedForUnrenderedDeletion(_.map(self.unrenderedListHelper.allItems,"name"));};self.clearMarkedUnrendered=function(){self.markedForUnrenderedDeletion.removeAll();};self.removeUnrendered=function(name){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_MANAGE_UNRENDERED))
-return;var perform=function(){OctoPrint.timelapse.deleteUnrendered(name).done(function(){self.markedForUnrenderedDeletion.remove(name);self.requestData();});};showConfirmationDialog(_.sprintf(gettext('You are about to delete unrendered timelapse "%(name)s".'),{name:_.escape(name)}),perform);};self.removeMarkedUnrendered=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_MANAGE_UNRENDERED))
-return;var perform=function(){self._bulkRemove(self.markedForUnrenderedDeletion(),"unrendered").done(function(){self.markedForUnrenderedDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d unrendered timelapses."),{count:self.markedForUnrenderedDeletion().length}),perform);};self._bulkRemove=function(files,type){var title,message,handler;if(type==="files"){title=gettext("Deleting timelapse files");message=_.sprintf(gettext("Deleting %(count)d timelapse files..."),{count:files.length});handler=function(filename){return OctoPrint.timelapse.delete(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)});var long=_.sprintf(gettext("Deletion of %(filename)s failed: %(error)s"),{filename:_.escape(filename),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};}else if(type==="unrendered"){title=gettext("Deleting unrendered timelapses");message=_.sprintf(gettext("Deleting %(count)d unrendered timelapses..."),{count:files.length});handler=function(filename){return OctoPrint.timelapse.deleteUnrendered(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(){deferred.notify(_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)}),false);});};}else{return;}
-var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:files.length,output:true};showProgressModal(options,promise);var requests=[];_.each(files,function(filename){var request=handler(filename);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};self.renderUnrendered=function(name){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN))
-return;OctoPrint.timelapse.renderUnrendered(name).done(self.requestData);};self.save=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN))
-return;var payload={type:self.timelapseType(),postRoll:self.timelapsePostRoll(),fps:self.timelapseFps(),save:self.persist()};if(self.timelapseType()==="timed"){payload["interval"]=self.timelapseTimedInterval();}
-if(self.timelapseType()==="zchange"){payload["retractionZHop"]=self.timelapseRetractionZHop();payload["minDelay"]=self.timelapseMinDelay();}
-OctoPrint.timelapse.saveConfig(payload).done(self.fromResponse);};self.reset=function(){if(self.serverConfig()===undefined)return;self.fromConfig(self.serverConfig());};self.displayTimelapsePopup=function(options){if(self.timelapsePopup!==undefined){self.timelapsePopup.remove();}
-_.extend(options,{callbacks:{before_close:function(notice){if(self.timelapsePopup===notice){self.timelapsePopup=undefined;}}}});self.timelapsePopup=new PNotify(options);};self.onDataUpdaterReconnect=function(){self.requestData();};self.onEventPostRollStart=function(payload){var title=gettext("Capturing timelapse postroll");var text;if(!payload.postroll_duration){text=_.sprintf(gettext("Now capturing timelapse post roll, this will take only a moment..."));}else{var format={time:moment().add(payload.postroll_duration,"s").format("LT")};if(payload.postroll_duration>60){format.duration=_.sprintf(gettext("%(minutes)d min"),{minutes:payload.postroll_duration/60});text=_.sprintf(gettext("Now capturing timelapse post roll, this will take approximately %(duration)s (so until %(time)s)..."),format);}else{format.duration=_.sprintf(gettext("%(seconds)d sec"),{seconds:payload.postroll_duration});text=_.sprintf(gettext("Now capturing timelapse post roll, this will take approximately %(duration)s..."),format);}}
-self.displayTimelapsePopup({title:title,text:text,hide:false});};self._warnAboutCaptureFailThreshold=3;self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;self.onEventPrintStarted=function(payload){self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;};self.onEventCaptureDone=function(payload){self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;};self.onEventCaptureFailed=function(payload){self._warnAboutCaptureFailCounter++;if(self._warnedAboutCaptureFail||self._warnAboutCaptureFailCounter<=self._warnAboutCaptureFailThreshold){return;}
-self._warnedAboutCaptureFail=true;var html=""+
-gettext("Failed repeatedly to capture timelapse frame from webcam - is the snapshot webcam configured correctly and the camera on?");var additional="";if(payload.snapshotDisplay){additional+='Snapshot info:
'+
-payload.snapshotDisplay+" ";}
-if(payload.webcamDisplay){additional+='Webcam: '+
-payload.webcamDisplay+" ";}
-if(payload.error){additional+='Error: '+payload.error+" ";}
-if(additional){html+=pnotifyAdditionalInfo(additional);}
-new PNotify({title:gettext("Could not capture snapshots"),text:html,type:"error",hide:false});};self.onEventMovieRendering=function(payload){self.displayTimelapsePopup({title:gettext("Rendering timelapse"),text:_.sprintf(gettext("Now rendering timelapse %(movie_prefix)s. Due to performance reasons it is not recommended to start a print job while a movie is still rendering."),{movie_prefix:_.escape(payload.movie_prefix)}),hide:false});self.renderProgress(0);self.renderTarget(payload.movie_prefix);self.renderAnimation(true);};self.onRenderProgress=function(percentage){self.renderProgress(percentage);self.renderAnimation(false);};self.onEventMovieFailed=function(payload){var title,html;if(payload.reason==="no_frames"){title=gettext("Cannot render timelapse");html=""+
-_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s is not possible since no frames were captured. Is the snapshot webcam configured correctly?"),{movie_prefix:_.escape(payload.movie_prefix)})+"
";}else if((payload.reason="returncode")){title=gettext("Rendering timelapse failed");html=""+
-_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s failed with return code %(returncode)s"),{movie_prefix:_.escape(payload.movie_prefix),returncode:_.escape(payload.returncode)})+"
";html+=pnotifyAdditionalInfo(''+payload.error+" ");}else{title=gettext("Rendering timelapse failed");html=""+
-_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s failed due to an unknown error, please consult the log file"),{movie_prefix:_.escape(payload.movie_prefix)})+"
";}
-self.displayTimelapsePopup({title:title,text:html,type:"error",hide:false});self.renderProgress(0);self.renderTarget(undefined);self.renderAnimation(false);};self.onEventMovieDone=function(payload){self.displayTimelapsePopup({title:gettext("Timelapse ready"),text:_.sprintf(gettext("New timelapse %(movie_prefix)s is done rendering."),{movie_prefix:_.escape(payload.movie_prefix)}),type:"success",callbacks:{before_close:function(notice){if(self.timelapsePopup===notice){self.timelapsePopup=undefined;}}}});self.requestData();self.renderProgress(0);self.renderTarget(undefined);self.renderAnimation(false);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();self.renderProgressBar=$("#render_progress");};}
-OCTOPRINT_VIEWMODELS.push({construct:TimelapseViewModel,dependencies:["loginStateViewModel","accessViewModel","settingsViewModel"],elements:["#timelapse","#timelapse_link","#timelapsePreviewModal"]});});
-;
-
-// source: js/app/viewmodels/uistate.js
-$(function(){function UiStateViewModel(parameters){var self=this;self.loading=ko.observable(CONFIG_LOADINGANIMATION);self.loading_error=ko.observable(false);self.visible=ko.pureComputed(function(){return!self.loading();});self.showLoadingError=function(error){log.error("Loading error: "+
-error+" Please check prior messages and 'octoprint.log' for possible reasons.");$("#page-container-loading-header").text("Loading failed");$("#page-container-loading-spinner").removeClass("fa-spinner fa-spin").addClass("fa-exclamation-triangle text-error");$("#page-container-loading-error").html(error+" "+
-_.sprintf("Please check your browser's error console and octoprint.log
for possible reasons.Also make sure that the server is actually running by reloading this page.",{browser:"https://faq.octoprint.org/browser-console",octoprint:"https://faq.octoprint.org/logs"})).show();};}
-OCTOPRINT_VIEWMODELS.push({construct:UiStateViewModel,elements:["#page-container-main","#page-container-loading"]});});
-;
-
-// source: js/app/viewmodels/users.js
-$(function(){function UsersViewModel(parameters){var self=this;self.access=parameters[0];self.deprecatedUsersMethod=function(oldFct){var newFct=oldFct;if(arguments.length===2){newFct=arguments[1];}
-OctoPrintClient.deprecatedMethod(self,"UsersViewModel",oldFct,"AccessViewModel.users",newFct,function(){self.access.users[newFct](this.arguments);});};self.deprecatedUsersVariable=function(oldVar){var newVar=oldVar;if(arguments.length===2){newVar=arguments[1];}
-OctoPrintClient.deprecatedVariable(self,"UsersViewModel",oldVar,"AccessViewModel.users",newVar,function(){return self.access.users[newVar];},function(val){self.access.users[newVar]=val;});};self.deprecatedUsersVariable("listHelper");self.deprecatedUsersVariable("emptyUser");self.deprecatedUsersVariable("currentUser");self.deprecatedUsersVariable("editorUsername");self.deprecatedUsersVariable("editorGroups");self.deprecatedUsersVariable("editorPermissions");self.deprecatedUsersVariable("editorPassword");self.deprecatedUsersVariable("editorRepeatedPassword");self.deprecatedUsersVariable("editorApikey");self.deprecatedUsersVariable("editorActive");self.deprecatedUsersVariable("editorPasswordMismatch");self.deprecatedUsersMethod("requestData");self.deprecatedUsersMethod("fromResponse");self.deprecatedUsersMethod("showAddUserDialog");self.deprecatedUsersMethod("confirmAddUser");self.deprecatedUsersMethod("showEditUserDialog");self.deprecatedUsersMethod("confirmEditUser");self.deprecatedUsersMethod("showChangePasswordDialog");self.deprecatedUsersMethod("confirmChangePassword");self.deprecatedUsersMethod("confirmGenerateApikey");self.deprecatedUsersMethod("copyApikey");self.deprecatedUsersMethod("confirmDeleteApikey");self.deprecatedUsersMethod("_updateApikey");self.deprecatedUsersMethod("addUser");self.deprecatedUsersMethod("removeUser");self.deprecatedUsersMethod("updateUser");self.deprecatedUsersMethod("updatePassword");self.deprecatedUsersMethod("generateApikey");self.deprecatedUsersMethod("deleteApikey");}
-OCTOPRINT_VIEWMODELS.push({construct:UsersViewModel,dependencies:["accessViewModel"]});});
-;
-
-// source: js/app/viewmodels/usersettings.js
-$(function(){function UserSettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.users=self.access.users;self.userSettingsDialog=undefined;var auto_locale={language:"_default",display:gettext("Site default"),english:undefined};self.locales=ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES),function(n){return n.display;})));self.locale_languages=_.keys(AVAILABLE_LOCALES);self.access_password=ko.observable(undefined);self.access_repeatedPassword=ko.observable(undefined);self.access_currentPassword=ko.observable(undefined);self.access_currentPasswordMismatch=ko.observable(false);self.access_apikey=ko.observable(undefined);self.interface_language=ko.observable(undefined);self.currentUser=ko.observable(undefined);self.currentUser.subscribe(function(newUser){self.access_password(undefined);self.access_repeatedPassword(undefined);self.access_currentPassword(undefined);self.access_currentPasswordMismatch(false);self.access_apikey(undefined);self.interface_language("_default");if(newUser!==undefined){self.access_apikey(newUser.apikey);if(newUser.settings.hasOwnProperty("interface")&&newUser.settings.interface.hasOwnProperty("language")){self.interface_language(newUser.settings.interface.language);}}});self.access_currentPassword.subscribe(function(){self.access_currentPasswordMismatch(false);});self.passwordMismatch=ko.pureComputed(function(){return self.access_password()!==self.access_repeatedPassword();});self.show=function(user){if(!CONFIG_ACCESS_CONTROL)return;if(user===undefined){user=self.loginState.currentUser();}
-var process=function(user){self.currentUser(user);self.userSettingsDialog.modal("show");};OctoPrint.access.users.get(user.name).done(function(data){process(data);}).fail(function(){log.warn("Could not fetch current user data, proceeding with client side data copy");process(user);});};self.save=function(){if(!CONFIG_ACCESS_CONTROL)return;self.userSettingsDialog.trigger("beforeSave");function saveSettings(){var settings={interface:{language:self.interface_language()}};self.updateSettings(self.currentUser().name,settings).done(function(){self.currentUser(undefined);self.userSettingsDialog.modal("hide");self.loginState.reloadUser();});}
-if(self.access_password()&&!self.passwordMismatch()){self.users.updatePassword(self.currentUser().name,self.access_password(),self.access_currentPassword()).done(function(){saveSettings();}).fail(function(xhr){if(xhr.status===403){self.access_currentPasswordMismatch(true);}});}else{saveSettings();}};self.copyApikey=function(){copyToClipboard(self.access_apikey());};self.generateApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;var generate=function(){self.users.generateApikey(self.currentUser().name).done(function(response){self.access_apikey(response.apikey);});};if(self.access_apikey()){showConfirmationDialog(gettext("This will generate a new API Key. The old API Key will cease to function immediately."),generate);}else{generate();}};self.deleteApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;if(!self.access_apikey())return;showConfirmationDialog(gettext("This will delete the API Key. It will cease to to function immediately."),function(){self.users.deleteApikey(self.currentUser().name).done(function(){self.access_apikey(undefined);});});};self.updateSettings=function(username,settings){return OctoPrint.access.users.saveSettings(username,settings);};self.saveEnabled=function(){return!self.passwordMismatch();};self.onStartup=function(){self.userSettingsDialog=$("#usersettings_dialog");};self.onAllBound=function(allViewModels){self.userSettingsDialog.on("show",function(){callViewModels(allViewModels,"onUserSettingsShown");});self.userSettingsDialog.on("hidden",function(){callViewModels(allViewModels,"onUserSettingsHidden");});self.userSettingsDialog.on("beforeSave",function(){callViewModels(allViewModels,"onUserSettingsBeforeSave");});};}
-OCTOPRINT_VIEWMODELS.push({construct:UserSettingsViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#usersettings_dialog"]});});
-;
-
-// source: js/app/viewmodels/wizard.js
-$(function(){function WizardViewModel(parameters){var self=this;self.loginState=parameters[0];self.settingsViewModel=parameters[1];self.wizardDialog=undefined;self.reloadOverlay=undefined;self.allViewModels=undefined;self.finishing=false;self.wizards=[];self.isDialogActive=function(){return self.wizardDialog.is(":visible");};self.showDialog=function(){if(!CONFIG_WIZARD||(!CONFIG_FIRST_RUN&&!self.loginState.isAdmin()))
-return;self.getWizardDetails().done(function(response){callViewModels(self.allViewModels,"onWizardDetails",[response]);if(!self.isDialogActive()){self.wizardDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});}
-callViewModels(self.allViewModels,"onWizardShow");callViewModels(self.allViewModels,"onBeforeWizardTabChange",[OCTOPRINT_INITIAL_WIZARD,undefined]);callViewModels(self.allViewModels,"onAfterWizardTabChange",[OCTOPRINT_INITIAL_WIZARD]);});};self.closeDialog=function(){self.wizardDialog.modal("hide");};self.onStartup=function(){self.wizardDialog=$("#wizard_dialog");self.wizardDialog.on("show",function(event){OctoPrint.coreui.wizardOpen=true;});self.wizardDialog.on("hidden",function(event){OctoPrint.coreui.wizardOpen=false;});self.reloadOverlay=$("#reloadui_overlay");};self.onUserLoggedIn=function(){self.showDialog();};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.wizardDialog.bootstrapWizard({tabClass:"nav nav-list",nextSelector:".button-next",previousSelector:".button-previous",finishSelector:".button-finish",withVisible:false,onTabClick:function(){return false;},onTabShow:function(tab,navigation,index){if(index<0||tab.length==0){return true;}
-var total=self.wizardDialog.bootstrapWizard("navigationLength");if(index==total){self.wizardDialog.find(".button-next").hide();self.wizardDialog.find(".button-finish").show().removeClass("disabled");}else{self.wizardDialog.find(".button-finish").hide();self.wizardDialog.find(".button-next").show();}
-var active=tab[0].id;if(active!=undefined){callViewModels(allViewModels,"onAfterWizardTabChange",[active]);}},onTabChange:function(tab,navigation,index,nextTabIndex,nextTab){var current,next;if(index==undefined||index<0||nextTabIndex==undefined||nextTabIndex<0||index==nextTabIndex||tab.length==0||nextTab.length==0){return;}
-current=tab[0].id;next=nextTab[0].id;if(current!=undefined&&next!=undefined){var result=true;callViewModels(allViewModels,"onBeforeWizardTabChange",function(method){result=method(next,current)!==false&&result;});callViewModels(allViewModels,"onWizardTabChange",function(method,viewModel){log.warn("View model",viewModel,'is using deprecated callback "onWizardTabChange", please change to "onBeforeWizardTabChange"');result=method(current,next)!==false&&result;});return result;}},onFinish:function(tab,navigation,index){var closeDialog=true;callViewModels(allViewModels,"onBeforeWizardFinish",function(method){closeDialog=closeDialog&&method()!==false;});if(closeDialog){var reload=false;callViewModels(allViewModels,"onWizardFinish",function(method){reload=method()=="reload"||reload;});self.finishWizard().done(function(){self.closeDialog();if(reload){self.reloadOverlay.show();}
-callViewModels(allViewModels,"onAfterWizardFinish");});}}});self.showDialog();};self.getWizardDetails=function(){return OctoPrint.wizard.get().done(function(response){self.wizards=_.filter(_.keys(response),function(key){return(response[key]&&response[key]["required"]&&!response[key]["ignored"]);});});};self.finishWizard=function(){var deferred=$.Deferred();self.finishing=true;self.settingsViewModel.saveData().done(function(){OctoPrint.wizard.finish(self.wizards).done(function(){deferred.resolve(arguments);}).fail(function(){deferred.reject(arguments);}).always(function(){self.finishing=false;});}).fail(function(){deferred.reject(arguments);});return deferred;};self.onSettingsPreventRefresh=function(){return self.isDialogActive();};}
-OCTOPRINT_VIEWMODELS.push({construct:WizardViewModel,dependencies:["loginStateViewModel","settingsViewModel"],elements:["#wizard_dialog"]});});
-;
-
-// source: js/app/viewmodels/about.js
-$(function(){function AboutViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.aboutDialog=undefined;self.aboutContent=undefined;self.aboutTabs=undefined;self.systeminfo=ko.observableArray();self.devmode=getQueryParameterByName("devmode")!==null;self.getSystemInfo=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM))return;return OctoPrint.system.getInfo().done(self.fromSystemInfo);};self.fromSystemInfo=function(r){var systeminfo=[];_.forOwn(r.systeminfo,function(value,key){systeminfo.push({key:key,value:value});});self.systeminfo(systeminfo);};self.copySystemInfo=function(){var text="";_.each(self.systeminfo(),function(entry){text+=entry.key+": "+entry.value+"\r\n";});copyToClipboard(text);};self.show=function(tab){if(tab){$('a[href="#'+tab+'"]',self.aboutTabs).tab("show");}else{$("a:first",self.aboutTabs).tab("show");}
-self.aboutContent.scrollTop(0);const maxHeight=$.fn.modal.defaults.maxHeight()-80-60;self.aboutDialog.modal({minHeight:function(){return Math.max(maxHeight,250);},maxHeight:maxHeight}).css({"margin-left":function(){return-($(this).width()/2);}});self.getSystemInfo();return false;};self.hide=function(){self.aboutDialog.modal("hide");};self.onStartup=function(){self.aboutDialog=$("#about_dialog");self.aboutTabs=$("#about_dialog_tabs");self.aboutContent=$("#about_dialog_content");$('a[data-toggle="tab"]',self.aboutTabs).on("show",function(){self.aboutContent.scrollTop(0);});};self.onAllBound=function(allViewModels){self.aboutDialog.on("show",function(){callViewModels(allViewModels,"onAboutShown");});self.aboutDialog.on("hidden",function(){callViewModels(allViewModels,"onAboutHidden");});};self.showTab=function(tab){$('a[href="#'+tab+'"]',self.aboutTabs).tab("show");};}
-OCTOPRINT_VIEWMODELS.push({construct:AboutViewModel,elements:["#about_dialog","#footer_about","#footer_achievements","#footer_systeminfo"],dependencies:["loginStateViewModel","accessViewModel"]});});
-;
-
-// source: plugin/achievements/js/achievements.js
-$(function(){function AchievementsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.stats=undefined;self.statsFetched=ko.observable(false);self.dummy=ko.observable();self.achievements=ko.observableArray([]);self.hiddenAchievements=ko.observable();self.achievedAchievements=ko.observable();self.totalAchievements=ko.observable();self.collectingSince=ko.pureComputed(()=>{self.dummy();if(!self.statsFetched()){return"n/a";}
-return`${formatDate(self.stats.created())} (${formatTimeAgo(
- self.stats.created()
- )})`;});self.collectionVersion=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";}
-return`OctoPrint ${self.stats.created_version()}`;});self.prints=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";}
-if(self.stats.prints_started()===0){return gettext("No prints yet");}
-return _.sprintf(gettext("%(prints)s (%(finished)s finished)"),{prints:this.stats.prints_started(),finished:self.stats.prints_finished()});});self.duration=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";}
-if(!self.stats.print_duration_finished()){return _.sprintf(gettext("%(total)s"),{total:formatDuration(self.stats.print_duration_total())});}else{return _.sprintf(gettext("%(total)s (%(finished)s finished)"),{total:formatDuration(self.stats.print_duration_total()),finished:formatDuration(self.stats.print_duration_finished())});}});self.longestPrint=ko.pureComputed(()=>{self.dummy();if(!self.statsFetched()){return"n/a";}
-return _.sprintf(gettext("%(duration)s (finished on %(date)s, %(timeSince)s)"),{duration:formatDuration(self.stats.longest_print_duration()),date:formatDate(self.stats.longest_print_date()),timeSince:formatTimeAgo(self.stats.longest_print_date())});});self.hiddenAchievementsText=ko.pureComputed(()=>{return _.sprintf(gettext("... and %(count)s hidden achievements!"),{count:self.hiddenAchievements()});});self.requestData=()=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;}
-OctoPrint.plugins.achievements.get().done(self.fromResponse);};self.fromResponse=(response)=>{self.fromStatsResponse(response.stats);self.fromAchievementsResponse(response.achievements);const achieved=_.filter(self.achievements(),(achievement)=>achievement.achieved).length;self.achievedAchievements(achieved);self.hiddenAchievements(response.hidden_achievements);self.totalAchievements(response.achievements.length+response.hidden_achievements);};self.fromStatsResponse=(response)=>{if(self.stats===undefined){self.stats=ko.mapping.fromJS(response);self.statsFetched(true);}else{ko.mapping.fromJS(response,self.stats);}};self.fromAchievementsResponse=(response)=>{self.achievements(response);};self.CALLS_TO_ACTION=[gettext('Enjoying OctoPrint? Looks like it! It might be time to give something back then - thank you!'),gettext('Getting value from OctoPrint? Then please consider supporting its sole maintainer with a donation - thank you!'),gettext('Has OctoPrint helped you enjoy your printer more? Then please consider supporting its continued development - thank you!')];self.showAchievement=(achievement)=>{let html=`
${achievement.name} ${achievement.description}
`;if(achievement.nag){const idx=Math.floor(Math.random()*self.CALLS_TO_ACTION.length);const cta=self.CALLS_TO_ACTION[idx];html+=""+
-_.sprintf(cta,{url:"https://octoprint.org/support-octoprint/?utm_source=octoprint&utm_medium=achievement_popup&utm_campaign=funding"})+"
";}
-html+=``+
-gettext("Show all achievements...")+" ";const options={title:gettext("Achievement unlocked!"),text:html,type:"success",icon:"icon-star",hide:false,addclass:"achievement-popup"};new PNotify(options);};self.triggerTestAchievement=(nag)=>{self.showAchievement({name:"Test Achievement",description:"I am a test achievement.",logo:"trophy",nag:!!nag});};self.onEventPluginAchievementsAchievementUnlocked=(payload)=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;}
-self.showAchievement(payload);self.requestData();};self.onServerReconnect=self.onUserLoggedIn=()=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;}
-self.requestData();};self.onAboutShown=()=>{self.dummy.notifySubscribers();};}
-OCTOPRINT_VIEWMODELS.push({construct:AchievementsViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#about_plugin_achievements","#about_plugin_achievements_2"]});});
-;
-
-// source: plugin/action_command_notification/js/action_command_notification.js
-$(function(){function ActionCommandNotificationViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.settings=parameters[2];self.notifications=ko.observableArray([]);self.sortDesc=ko.observable(false);self.sortDesc.subscribe(function(){self._toLocalStorage();});self.regexValid=function(){try{new RegExp(self.settings.settings.plugins.action_command_notification.filter());return true;}catch(e){return false;}};self.toDateTimeString=function(timestamp){return formatDate(timestamp);};self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_SHOW))
-return;OctoPrint.plugins.action_command_notification.get().done(self.fromResponse);};self.fromResponse=function(response){var notifications=response.notifications;if(self.sortDesc()){notifications.reverse();}
-self.notifications(notifications);};self.clear=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_CLEAR))
-return;OctoPrint.plugins.action_command_notification.clear();};self.toggleSorting=function(){self.sortDesc(!self.sortDesc());self.requestData();};self.onStartup=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_SHOW))
-return;if(plugin!=="action_command_notification"){return;}
-self.requestData();if(data.message&&self.settings.settings.plugins.action_command_notification.enable_popups()){new PNotify({title:gettext("Printer Notification"),text:data.message,hide:false,icon:"fa fa-bell-o",buttons:{sticker:false,closer:true}});}};var optionsLocalStorageKey="plugin.action_command_notification.options";self._toLocalStorage=function(){saveToLocalStorage(optionsLocalStorageKey,{sortDesc:self.sortDesc()});};self._fromLocalStorage=function(){var data=loadFromLocalStorage(optionsLocalStorageKey);if(data["sortDesc"]!==undefined){self.sortDesc(!!data["sortDesc"]);}};self._fromLocalStorage();}
-OCTOPRINT_VIEWMODELS.push({construct:ActionCommandNotificationViewModel,dependencies:["loginStateViewModel","accessViewModel","settingsViewModel"],elements:["#sidebar_plugin_action_command_notification_wrapper","#settings_plugin_action_command_notification"]});});
-;
-
-// source: plugin/action_command_prompt/js/action_command_prompt.js
-$(function(){function ActionCommandPromptViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.modal=ko.observable(undefined);self.text=ko.observable();self.buttons=ko.observableArray([]);self.active=ko.pureComputed(function(){return self.text()!==undefined;});self.visible=ko.pureComputed(function(){return self.modal()!==undefined;});self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_PROMPT_INTERACT))
-return;OctoPrint.plugins.action_command_prompt.get().done(self.fromResponse);};self.fromResponse=function(data){if(data&&data.hasOwnProperty("text")&&data.hasOwnProperty("choices")){self.text(data.text);self.buttons(data.choices);self.showPrompt();}else{self.text(undefined);self.buttons([]);}};self.showPrompt=function(){var text=self.text();var buttons=self.buttons();var opts={title:gettext("Message from your printer"),message:text,selections:buttons,maycancel:true,onselect:function(index){if(index>-1){self._select(index);}},onclose:function(){self.modal(undefined);}};self.modal(showSelectionDialog(opts));};self._select=function(index){OctoPrint.plugins.action_command_prompt.select(index);};self._closePrompt=function(){var modal=self.modal();if(modal){modal.modal("hide");}};self.onStartupComplete=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_PROMPT_INTERACT))
-return;if(plugin!=="action_command_prompt"){return;}
-switch(data.action){case"show":{self.text(data.text);self.buttons(data.choices);self.showPrompt();break;}
-case"close":{self.text(undefined);self.buttons([]);self._closePrompt();break;}}};}
-OCTOPRINT_VIEWMODELS.push({construct:ActionCommandPromptViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#navbar_plugin_action_command_prompt"]});});
-;
-
-// source: plugin/announcements/js/announcements.js
-$(function(){function AnnouncementsViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.channels=new ItemListHelper("plugin.announcements.channels",{channel:function(a,b){if(a["channel"].toLocaleLowerCase()b["channel"].toLocaleLowerCase())
-return 1;return 0;}},{},"name",[],[],5);self.unreadArticles=ko.observableArray([]);self.markingAllAsRead=ko.observable(false);self.unread=ko.observable(0);self.unreadText=ko.pureComputed(()=>self.unread()?(self.unread()>9?"∞":""+self.unread()):"");self.unreadSuffix=ko.pureComputed(()=>self.unread()?"("+self.unread()+")":"");self.hiddenChannels=[];self.channelNotifications={};self.announcementDialog=undefined;self.announcementDialogContent=undefined;self.announcementDialogTabs=undefined;self.setupTabLink=function(item){$("a[data-toggle='tab']",item).on("show",self.resetContentScroll);};self.resetContentScroll=function(){self.announcementDialogContent.scrollTop(0);};self.toggleButtonCss=function(data){var icon=data.enabled?"fa fa-toggle-on":"fa fa-toggle-off";var disabled=self.enableToggle(data)?"":" disabled";return icon+disabled;};self.toggleButtonTitle=function(data){return data.forced?gettext("Cannot be toggled"):data.enabled?gettext("Disable Channel"):gettext("Enable Channel");};self.enableToggle=function(data){return!data.forced;};self.cleanedLink=function(data){var link=data.link;if(!link)return link;var queryPos=link.indexOf("?");if(queryPos!==-1){link=link.substr(0,queryPos);}
-return link;};self.markRead=function(channel,until,reload){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ))
-return;reload=!!reload;var url=PLUGIN_BASEURL+"announcements/channels/"+channel;var payload={command:"read",until:until};$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){if(reload){self.retrieveData();}}});};self.markAllRead=function(reload){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ))
-return;reload=!!reload;var url=PLUGIN_BASEURL+"announcements/channels";var payload={command:"read"};self.markingAllAsRead(true);$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){if(reload){self.retrieveData();}}}).always(()=>{self.markingAllAsRead(false);});};self.toggleChannel=function(channel){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_MANAGE))
-return;var url=PLUGIN_BASEURL+"announcements/channels/"+channel;var payload={command:"toggle"};$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){self.retrieveData();}});};self.refreshAnnouncements=function(){self.retrieveData(true);};self.retrieveData=function(force){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ))
-return;var url=PLUGIN_BASEURL+"announcements/channels";if(force){url+="?force=true";}
-$.ajax({url:url,type:"GET",dataType:"json",success:function(data){self.fromResponse(data);}});};self.fromResponse=function(data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ))
-return;var currentTab=$("li.active a",self.announcementDialogTabs).attr("href");var unread=0;var channels=[];var unreadArticles=[];_.each(data.channels,function(value){value.last=value.data.length?value.data[0].published:undefined;value.count=value.data.length;value.title=value.channel+(value.unread?" ("+value.unread+")":"");unread+=value.unread;if(value.unread){_.each(_.filter(value.data,(entry)=>!entry.read),(entry)=>{const extended={...entry};extended.channel=value.channel;unreadArticles.push(extended);});}
-channels.push(value);});self.channels.updateItems(channels);self.unread(unread);unreadArticles.sort((a,b)=>a.published0){text=text.substr(0,firstNewlinePos).trim();}
-return text;};var stripParagraphs=function(text){if(_.startsWith(text,"")){text=text.substr("
".length);}
-if(_.endsWith(text,"
")){text=text.substr(0,text.length-"".length);}
-return text.replace(/<\/p>\s*/gi," ");};_.each(channels,function(value){var key=value.key;var channel=value.channel;var priority=value.priority;var items=value.data;if(value.priority!==1){return;}
-if($.inArray(key,self.hiddenChannels)>-1){return;}
-var newItems=_.filter(items,(entry)=>!entry.read);if(newItems.length==0){return;}
-var displayedItems;if(newItems.length>displayLimit){displayedItems=newItems.slice(0,displayLimit);}else{displayedItems=newItems;}
-var rest=newItems.length-displayedItems.length;var text="
";_.each(displayedItems,function(item){var limitedSummary=stripParagraphs(item.summary_without_images.trim());if(limitedSummary.length>maxLength){limitedSummary=limitedSummary.substr(0,maxLength);limitedSummary=limitedSummary.substr(0,Math.min(limitedSummary.length,limitedSummary.lastIndexOf(" ")));limitedSummary+="...";}
-text+=""+
-cutAfterNewline(item.title)+" "+
-formatTimeAgo(item.published)+" "+
-limitedSummary+"
";});text+=" ";if(rest){text+=""+
-gettext(_.sprintf("... and %(rest)d more.",{rest:rest}))+"
";}
-text+=""+
-gettext("You can edit your announcement subscriptions under Settings > Announcements.")+" ";var options={title:channel,text:text,hide:false,confirm:{confirm:true,buttons:[{text:gettext("Later"),click:function(notice){notice.remove();self.hiddenChannels.push(key);}},{text:gettext("Mark read"),click:function(notice){notice.remove();self.markRead(key,value.last);}},{text:gettext("Read..."),addClass:"btn-primary",click:function(notice){notice.remove();self.showAnnouncementDialog(key);self.markRead(key,value.last);}}]},buttons:{sticker:false,closer:false}};if(priority===1){options.type="error";}
-if(self.channelNotifications[key]){self.channelNotifications[key].remove();}
-self.channelNotifications[key]=new PNotify(options);});};self.hideAnnouncements=function(){_.each(self.channelNotifications,function(notification,key){notification.remove();});self.channelNotifications={};};self.configureAnnouncements=function(){self.settings.show("settings_plugin_announcements");};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)){self.hideAnnouncements();}else{self.retrieveData();}};self.onStartup=function(){self.announcementDialog=$("#plugin_announcements_dialog");self.announcementDialogContent=$("#plugin_announcements_dialog_content");self.announcementDialogTabs=$("#plugin_announcements_dialog_tabs");};self.onEventConnectivityChanged=function(payload){if(!payload||!payload.new)return;self.retrieveData();};}
-OCTOPRINT_VIEWMODELS.push({construct:AnnouncementsViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#plugin_announcements_dialog","#settings_plugin_announcements","#navbar_plugin_announcements"]});});
-;
-
-// source: plugin/appkeys/js/appkeys.js
-$(function(){function AppKeysDialogViewModel(parameters){var self=this;self.dialog=undefined;self.onStartup=function(){self.dialog=$("#plugin_appkeys_keygenerated");self.dialog.on("hidden",()=>{self.resetDialog();});};self.showDialog=function(title,data){if(self.dialog===undefined)return;var qrcode={text:data.api_key,size:180,fill:"#000",background:null,label:"",fontname:"sans",fontcolor:"#000",radius:0,ecLevel:"L"};self.dialog.find("#plugin_appkeys_keygenerated_title").text(title);self.dialog.find("#plugin_appkeys_keygenerated_user").text(data.user_id);self.dialog.find("#plugin_appkeys_keygenerated_app").text(data.app_id);self.dialog.find("#plugin_appkeys_keygenerated_key_text").text(data.api_key);self.dialog.find("#plugin_appkeys_keygenerated_key_copy").off().click(function(){copyToClipboard(data.api_key);});self.dialog.find("#plugin_appkeys_keygenerated_key_qrcode").empty().qrcode(qrcode);self.dialog.modal("show");};self.resetDialog=()=>{if(self.dialog===undefined)return;self.dialog.find("#plugin_appkeys_keygenerated_title").text("");self.dialog.find("#plugin_appkeys_keygenerated_user").text("");self.dialog.find("#plugin_appkeys_keygenerated_app").text("");self.dialog.find("#plugin_appkeys_keygenerated_key_text").text("");self.dialog.find("#plugin_appkeys_keygenerated_key_copy").off();self.dialog.find("#plugin_appkeys_keygenerated_key_qrcode").empty();};}
-function UserAppKeysViewModel(parameters){var self=this;self.dialog=parameters[0];self.loginState=parameters[1];self.keys=new ItemListHelper("plugin.appkeys.userkeys",{app:function(a,b){if(a["app_id"].toLowerCase()b["app_id"].toLowerCase())return 1;return 0;}},{},"app",[],[],5);self.pending={};self.openRequests={};self.editorApp=ko.observable();self.requestData=function(){return OctoPrint.plugins.appkeys.getKeys().done(self.fromResponse);};self.fromResponse=function(response){self.keys.updateItems(response.keys);self.pending=response.pending;_.each(self.pending,function(data,token){self.openRequests[token]=self.promptForAccess(data.app_id,token);});};self.generateKey=function(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.generateKey(self.editorApp()).done(self.requestData).done(function(){self.editorApp("");});});};self.revokeKey=(data)=>{const app=data.app_id;self.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog(_.sprintf(gettext("You are about to revoke the application key for %(app)s."),{app:_.escape(app)}),()=>{OctoPrint.plugins.appkeys.revokeKeyForApp(app).done(self.requestData);});});};self.showKeyDetails=(data)=>{self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.getKey(data.app_id).done((response)=>{self.dialog.showDialog(gettext("Details"),response.key);});});};self.allowApp=function(token){return OctoPrint.plugins.appkeys.decide(token,true).done(self.requestData);};self.denyApp=function(token){return OctoPrint.plugins.appkeys.decide(token,false).done(self.requestData);};self.promptForAccess=function(app,token){var message=gettext('"%(app)s " has requested access to control OctoPrint through the API.');message=_.sprintf(message,{app:_.escape(app)});message=" "+
-message+"
"+
-gettext("Do you want to allow access to this application with your user account?")+"
";return new PNotify({title:gettext("Access Request"),text:message,hide:false,icon:"fa fa-key",confirm:{confirm:true,buttons:[{text:gettext("Allow"),click:function(notice){self.loginState.reauthenticateIfNecessary(()=>{self.allowApp(token);notice.remove();});}},{text:gettext("Deny"),click:function(notice){self.denyApp(token);notice.remove();}}]},buttons:{sticker:false,closer:false}});};self.onUserSettingsShown=function(){self.requestData();};self.onUserLoggedIn=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="appkeys"){return;}
-var app,token,user;if(data.type==="request_access"&&self.loginState.isUser()){app=data.app_name;token=data.user_token;user=data.user_id;if(user&&user!==self.loginState.username()){return;}
-if(self.pending[token]!==undefined){return;}
-self.openRequests[token]=self.promptForAccess(app,token);}else if(data.type==="end_request"){token=data.user_token;if(self.openRequests[token]!==undefined){if(self.openRequests[token].state!=="closed"){self.openRequests[token].remove();}
-delete self.openRequests[token];}}};}
-function AllAppKeysViewModel(parameters){var self=this;self.dialog=parameters[0];self.loginState=parameters[1];self.access=parameters[2];self.keys=new ItemListHelper("plugin.appkeys.allkeys",{user_app:function(a,b){if(a["user_id"]>b["user_id"])return 1;if(a["user_id"]b["app_id"].toLowerCase())return 1;if(a["app_id"].toLowerCase(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.getKey(data.app_id,data.user_id).done((response)=>{self.dialog.showDialog(gettext("Details"),response.key);});});};self.generateKey=function(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.generateKeyForUser(self.editorUser(),self.editorApp()).done(self.requestData).done(function(){self.editorUser(self.loginState.username());self.editorApp("");}).done(function(data){self.dialog.showDialog(gettext("New key generated!"),data);});});};self.revokeKey=function(data){const app=data.app_id;const user=data.user_id;showConfirmationDialog(_.sprintf(gettext("You are about to revoke the application key for %(app)s for user %(user)s."),{app:_.escape(app),user:_.escape(user)}),()=>{self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.revokeKeyForApp(app,user).done(self.requestData);});});};self.revokeMarked=function(){showConfirmationDialog(_.sprintf(gettext("You are about to revoke %(count)d application keys."),{count:self.markedForDeletion().length}),()=>{self.loginState.forceReauthentication(()=>{self._bulkRevoke(self.markedForDeletion()).done(()=>{self.markedForDeletion.removeAll();});});});};self.markAllOnPageForDeletion=function(){self.markedForDeletion(_.uniq(self.markedForDeletion().concat(_.map(self.keys.paginatedItems(),(item)=>`${item.user_id}:${item.app_id}`))));};self.markAllForDeletion=function(){self.markedForDeletion(_.uniq(_.map(self.keys.allItems,(item)=>`${item.user_id}:${item.app_id}`)));};self.markAllByUserForDeletion=function(user){self.markAllByFilterForDeletion(function(e){return e.user_id===user;});};self.markAllByAppForDeletion=function(app){self.markAllByFilterForDeletion(function(e){return e.app_id.toLowerCase()===app;});};self.markAllByFilterForDeletion=function(filter){self.markedForDeletion(_.uniq(self.markedForDeletion().concat(_.map(_.filter(self.keys.allItems,filter),(item)=>`${item.user_id}:${item.app_id}`))));};self.clearMarked=function(){self.markedForDeletion.removeAll();};self._bulkRevoke=function(keys){var title,message,handler;title=gettext("Revoking application keys");message=_.sprintf(gettext("Revoking %(count)d application keys..."),{count:keys.length});handler=function(id){const[user,app]=rsplit(id,":",1);return OctoPrint.plugins.appkeys.revokeKeyForApp(app,user).done(function(){deferred.notify(_.sprintf(gettext("Revoked %(app)s for %(user)s..."),{app:_.escape(app),user:_.escape(user)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Revocation of %(app)s for user %(user)s failed, continuing..."),{app:_.escape(app),user:_.escape(user)});var long=_.sprintf(gettext("Deletion of %(app)s for user %(user)s failed: %(error)s"),{app:_.escape(app),user:_.escape(user),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:keys.length,output:true};showProgressModal(options,promise);var requests=[];_.each(keys,function(key){var request=handler(key);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};}
-OCTOPRINT_VIEWMODELS.push([AppKeysDialogViewModel,[],[]]);OCTOPRINT_VIEWMODELS.push([UserAppKeysViewModel,["appKeysDialogViewModel","loginStateViewModel"],["#usersettings_plugin_appkeys"]]);OCTOPRINT_VIEWMODELS.push([AllAppKeysViewModel,["appKeysDialogViewModel","loginStateViewModel","accessViewModel"],["#settings_plugin_appkeys"]]);});
-;
-
-// source: plugin/backup/js/backup.js
-$(function(){function BackupViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.backups=new ItemListHelper("plugin.backup.backups",{date:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]self.maxUploadSize();};const backupFileuploadOptionsFactory=(source)=>{return{dataType:"json",maxNumberOfFiles:1,autoUpload:false,add:(e,data)=>{if(data.files.length===0){return false;}
-self.backupUploadName(data.files[0].name);self.backupUploadData=data;self.backupUploadSource=source;},done:(e,data)=>{self.backupUploadName(undefined);self.backupUploadData=undefined;self.backupUploadSource=undefined;}};};$("#settings-backup-upload").fileupload(backupFileuploadOptionsFactory("settings"));$("#wizard-backup-upload").fileupload(backupFileuploadOptionsFactory("wizard"));self.restoreInProgress=ko.observable(false);self.restoreTitle=ko.observable();self.restoreDialog=undefined;self.restoreOutput=undefined;self.unknownPlugins=ko.observableArray([]);self.loglines=ko.observableArray([]);self.requestData=function(){OctoPrint.plugins.backup.get().done(self.fromResponse);};self.fromResponse=function(response){self.backups.updateItems(response.backups);self.unknownPlugins(response.unknown_plugins);self.restoreSupported(response.restore_supported);self.maxUploadSize(response.max_upload_size);};self.reauthenticateDownload=(url)=>{self.loginState.reauthenticateIfNecessary(()=>{const link=document.createElement("a");link.href=url;link.download="";document.body.appendChild(link);link.click();document.body.removeChild(link);});};self.createBackup=function(){var excluded=self.excludeFromBackup();OctoPrint.plugins.backup.createBackup(excluded).done(function(){self.excludeFromBackup([]);});};self.removeBackup=function(backup){var perform=function(){OctoPrint.plugins.backup.deleteBackup(backup).done(function(){self.requestData();});};showConfirmationDialog(_.sprintf(gettext('You are about to delete backup file "%(name)s".'),{name:_.escape(backup)}),perform);};self.restoreBackup=function(backup){if(!self.restoreSupported())return;showConfirmationDialog(_.sprintf(gettext('You are about to restore the backup file "%(name)s". This cannot be undone.'),{name:_.escape(backup)}),()=>{self.loginState.reauthenticateIfNecessary(()=>{self.restoreInProgress(true);self.loglines.removeAll();self.loglines.push({line:"Preparing to restore...",stream:"message"});self.loglines.push({line:" ",stream:"message"});self.restoreDialog.modal({keyboard:false,backdrop:"static",show:true});OctoPrint.plugins.backup.restoreBackup(backup);});});};self.performRestoreFromUpload=function(){if(self.backupUploadData===undefined)return;const proceed=()=>{self.restoreInProgress(true);self.loglines.removeAll();self.loglines.push({line:"Uploading backup, this can take a while. Please wait...",stream:"message"});self.loglines.push({line:" ",stream:"message"});self.restoreDialog.modal({keyboard:false,backdrop:"static",show:true});self.backupUploadData.submit();};showConfirmationDialog(_.sprintf(gettext('You are about to upload and restore the backup file "%(name)s". This cannot be undone.'),{name:_.escape(self.backupUploadName())}),()=>{if(self.backupUploadSource==="wizard"){proceed();}else{self.loginState.reauthenticateIfNecessary(proceed);}});};self.deleteUnknownPluginRecord=function(){var perform=function(){OctoPrint.plugins.backup.deleteUnknownPlugins().done(function(){self.requestData();});};showConfirmationDialog(gettext("You are about to delete the record of plugins unknown during the last restore."),perform);};self.markFilesOnPage=function(){self.markedForBackupDeletion(_.uniq(self.markedForBackupDeletion().concat(_.map(self.backups.paginatedItems(),"name"))));};self.markAllFiles=function(){self.markedForBackupDeletion(_.map(self.backups.allItems,"name"));};self.clearMarkedFiles=function(){self.markedForBackupDeletion.removeAll();};self.removeMarkedFiles=function(){var perform=function(){self._bulkRemove(self.markedForBackupDeletion()).done(function(){self.markedForBackupDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d backups."),{count:self.markedForBackupDeletion().length}),perform);};self.onStartup=function(){self.restoreDialog=$("#settings_plugin_backup_restoredialog");self.restoreOutput=$("#settings_plugin_backup_restoredialog_output");};self.onSettingsShown=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="backup")return;if(data.type==="backup_done"){self.requestData();self.backupInProgress(false);new PNotify({title:gettext("Backup created successfully"),type:"success"});}else if(data.type==="backup_started"){self.backupInProgress(true);}else if(data.type==="backup_error"){self.requestData();self.backupInProgress(false);new PNotify({title:gettext("Creating the backup failed"),text:_.sprintf(gettext("OctoPrint could not create your backup. Please consult octoprint.log
for details. Error: %(error)s"),{error:_.escape(data.error)}),type:"error",hide:false});}else if(data.type==="restore_started"){self.loglines.push({line:gettext("Restoring from backup..."),stream:"message"});self.loglines.push({line:" ",stream:"message"});}else if(data.type==="restore_failed"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:gettext("Restore failed! Check the above output and octoprint.log for reasons as to why."),stream:"error"});self.restoreInProgress(false);}else if(data.type==="restore_done"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:gettext("Restore successful! The server will now be restarted!"),stream:"message"});self.restoreInProgress(false);}else if(data.type==="installing_plugin"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext('Installing plugin "%(plugin)s"...'),{plugin:_.escape(data.plugin)}),stream:"message"});}else if(data.type==="plugin_incompatible"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext('Cannot install plugin "%(plugin)s" due to it being incompatible to this OctoPrint version and/or underlying operating system'),{plugin:_.escape(data.plugin.key)}),stream:"stderr"});}else if(data.type==="unknown_plugins"){if(data.plugins.length>0){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext("There are %(count)d plugins you'll need to install manually since they aren't registered on the repository:"),{count:data.plugins.length}),stream:"message"});_.each(data.plugins,function(plugin){self.loglines.push({line:plugin.name+": "+plugin.url,stream:"message"});});self.loglines.push({line:" ",stream:"message"});self.unknownPlugins(data.plugins);}}else if(data.type==="logline"){self.loglines.push(self._preprocessLine({line:data.line,stream:data.stream}));self._scrollRestoreOutputToEnd();}};self._scrollRestoreOutputToEnd=function(){self.restoreOutput.scrollTop(self.restoreOutput[0].scrollHeight-self.restoreOutput.height());};self._forcedStdoutLine=/You are using pip version .*?, however version .*? is available\.|You should consider upgrading via the '.*?' command\./;self._preprocessLine=function(line){if(line.stream==="stderr"&&line.line.match(self._forcedStdoutLine)){line.stream="stdout";}
-return line;};self._bulkRemove=function(files){var title,message,handler;title=gettext("Deleting backups");message=_.sprintf(gettext("Deleting %(count)d backups..."),{count:files.length});handler=function(filename){return OctoPrint.plugins.backup.deleteBackup(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)});var long=_.sprintf(gettext("Deletion of %(filename)s failed: %(error)s"),{filename:_.escape(filename),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:files.length,output:true};showProgressModal(options,promise);var requests=[];_.each(files,function(filename){var request=handler(filename);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};}
-OCTOPRINT_VIEWMODELS.push({construct:BackupViewModel,dependencies:["loginStateViewModel","settingsViewModel"],elements:["#settings_plugin_backup","#wizard_plugin_backup"]});});
-;
-
-// source: plugin/classicwebcam/js/classicwebcam.js
-$(function(){function ClassicWebcamViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.webcamStreamVisible=false;self.webcamDisableTimeout=undefined;self.webcamLoaded=ko.observable(false);self.webcamMjpgEnabled=ko.observable(false);self.webcamHlsEnabled=ko.observable(false);self.webcamWebRTCEnabled=ko.observable(false);self.webcamError=ko.observable(false);self.webcamMuted=ko.observable(true);self.webRTCPeerConnection=null;self.webcamElementHls=null;self.webcamElementWebrtc=null;self.webcamRatioClass=ko.pureComputed(function(){if(self.settings.streamRatio()=="4:3"){return"ratio43";}else{return"ratio169";}});self.webcamClass=ko.pureComputed(function(){if(self.settings.rotate90()){return"webcam_rotated "+self.webcamRatioClass();}else{return"webcam_unrotated "+self.webcamRatioClass();}});self.onBeforeBinding=function(){self.settings.rotate90.subscribe(function(){window.setTimeout(function(){self._updateVideoTagWebcamLayout();},1);});self.streamUrlEscaped=ko.pureComputed(function(){return encodeURI(self.settings.streamUrl());});self.webcamStreamType=ko.pureComputed(function(){try{return self.determineWebcamStreamType(self.streamUrlEscaped());}catch(e){console.error(e);self.webcamError(true);return"mjpg";}});self.webcamStreamValid=ko.pureComputed(function(){var url=self.streamUrlEscaped();return!url||validateWebcamUrl(url);});};self.onWebcamVisibilityChange=function(visible){self.webcamStreamVisible=visible;if(self.webcamStreamVisible){self._enableWebcam();}else{self._disableWebcam();}};self.onWebcamRefresh=function(){var streamType=self.webcamStreamType();if(streamType=="mjpg"){if(OctoPrint.coreui.browser.safari){return;}
-$("#webcam_image").attr("src","");self._switchToMjpgWebcam();log.info("Triggered refresh of mjpg webcam stream");}};self.onEventSettingsUpdated=function(payload){self._enableWebcamIfVisible();};self._getActiveWebcamVideoElement=function(){if(self.webcamWebRTCEnabled()){return self.webcamElementWebrtc;}else{return self.webcamElementHls;}};self.launchWebcamPictureInPicture=function(){self._getActiveWebcamVideoElement().requestPictureInPicture();};self.launchWebcamFullscreen=function(){self._getActiveWebcamVideoElement().requestFullscreen();};self.toggleWebcamMute=function(){self.webcamMuted(!self.webcamMuted());self.webcamElementWebrtc.muted=self.webcamMuted();self.webcamElementHls.muted=self.webcamMuted();};self._disableWebcam=function(){if(OctoPrint.coreui.browser.safari){return;}
-var timeout=self.settings.streamTimeout()||5;self.webcamDisableTimeout=setTimeout(function(){log.debug("Unloading webcam stream after",timeout,"seconds");$("#webcam_image").attr("src","");self.webcamLoaded(false);},timeout*1000);};self._enableWebcamIfVisible=function(){if(self.webcamStreamVisible){self._enableWebcam();}};self._enableWebcam=function(){if(self.webcamDisableTimeout!=undefined){clearTimeout(self.webcamDisableTimeout);}
-if(self.settings.webcamEnabled()==false){console.log("Webcam not enabled");return;}
-var streamType=self.webcamStreamType();if(streamType=="mjpg"){self._switchToMjpgWebcam();}else if(streamType=="hls"){self._switchToHlsWebcam();}else if(isWebRTCAvailable()&&streamType=="webrtc"){self._switchToWebRTCWebcam();}else{throw"Unknown stream type "+streamType;}};self.onWebcamLoaded=function(){if(self.webcamLoaded())return;log.debug("Webcam stream loaded");self.webcamLoaded(true);self.webcamError(false);};self.onWebcamErrored=function(){log.debug("Webcam stream failed to load/was unloaded");self.webcamLoaded(false);self.webcamError(true);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.syncWebcamElements();};self.syncWebcamElements=function(){self.webcamElementHls=document.getElementById("webcam_hls");self.webcamElementWebrtc=document.getElementById("webcam_webrtc");};self.onStartup=function(){self.syncWebcamElements();};self._switchToMjpgWebcam=function(){var webcamImage=$("#webcam_image");var currentSrc=webcamImage.attr("src");if(OctoPrint.coreui.browser.safari&¤tSrc!=undefined){return;}
-var newSrc=self.streamUrlEscaped();if(currentSrc!=newSrc){if(self.settings.cacheBuster()){if(newSrc.lastIndexOf("?")>-1){newSrc+="&";}else{newSrc+="?";}
-newSrc+=new Date().getTime();}
-self.webcamLoaded(false);self.webcamError(false);webcamImage.attr("src",newSrc);self.webcamHlsEnabled(false);self.webcamMjpgEnabled(true);self.webcamWebRTCEnabled(false);}};self._switchToHlsWebcam=function(){var video=self.webcamElementHls;video.onresize=self._updateVideoTagWebcamLayout;if(self.webRTCPeerConnection!=null){self.webRTCPeerConnection.close();self.webRTCPeerConnection=null;}
-if(video!=null&&typeof video.canPlayType!=undefined&&video.canPlayType("application/vnd.apple.mpegurl")=="probably"){video.src=self.streamUrlEscaped();}else if(Hls.isSupported()){self.hls=new Hls();self.hls.loadSource(self.streamUrlEscaped());self.hls.attachMedia(video);}
-self.webcamMjpgEnabled(false);self.webcamHlsEnabled(true);self.webcamWebRTCEnabled(false);};self._switchToWebRTCWebcam=function(){if(!isWebRTCAvailable()){return;}
-var video=self.webcamElementWebrtc;video.onresize=self._updateVideoTagWebcamLayout;if(self.hls!=null){self.webcamElementHls.src=null;self.hls.destroy();self.hls=null;}
-if(self.webRTCPeerConnection!=null&&self.webRTCPeerConnection.connectionState!="connected"){self.webRTCPeerConnection.close();self.webRTCPeerConnection=null;}
-if(self.webRTCPeerConnection==null){self.webRTCPeerConnection=startWebRTC(video,self.streamUrlEscaped(),self.settings.streamWebrtcIceServers());}
-self.webcamMjpgEnabled(false);self.webcamHlsEnabled(false);self.webcamWebRTCEnabled(true);};self._updateVideoTagWebcamLayout=function(){var player=self._getActiveWebcamVideoElement();var rotationContainer=document.querySelector("#webcam_video_container .webcam_rotated");var rotationTarget=document.querySelector("#webcam_video_container .webcam_rotated .rotation_target");var unrotationContainer=document.querySelector("#webcam_video_container .webcam_unrotated");var unrotationTarget=document.querySelector("#webcam_video_container .webcam_unrotated .rotation_target");if(rotationContainer){var height=rotationContainer.offsetWidth;rotationContainer.style.height=height+"px";rotationTarget.style.height=rotationContainer.offsetWidth+"px";rotationTarget.style.width=rotationContainer.offsetHeight+"px";rotationContainer.style.paddingBottom=0;}
-if(unrotationContainer){unrotationContainer.style.height=null;unrotationContainer.style.paddingBottom=0;unrotationTarget.style.height=null;unrotationTarget.style.width=null;}};self.determineWebcamStreamType=function(streamUrl){if(!streamUrl){throw"Empty streamUrl. Cannot determine stream type.";}
-var parsed=validateWebcamUrl(streamUrl);if(!parsed){throw"Invalid streamUrl. Cannot determine stream type.";}
-if(parsed.protocol==="webrtc:"||parsed.protocol==="webrtcs:"){return"webrtc";}
-var lastDotPosition=parsed.pathname.lastIndexOf(".");if(lastDotPosition!==-1){var extension=parsed.pathname.substring(lastDotPosition+1);if(extension.toLowerCase()==="m3u8"){return"hls";}}
-return"mjpg";};}
-OCTOPRINT_VIEWMODELS.push({construct:ClassicWebcamViewModel,dependencies:["loginStateViewModel","classicWebcamSettingsViewModel"],elements:["#classicwebcam_container"]});});
-;
-
-// source: plugin/classicwebcam/js/classicwebcam_settings.js
-$(function(){function ClassicWebcamSettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self._subscriptions=[];self.webRtcServersToText=function(list){self.streamWebrtcIceServersText(self.streamWebrtcIceServers().join(", "));};self.textToWebRtcServers=function(list){self.streamWebrtcIceServers(splitTextToArray(self.streamWebrtcIceServersText(),",",true));};self.onBeforeBinding=function(){self.snapshotUrl=self.settings.settings.plugins.classicwebcam.snapshot;self.snapshotTimeout=self.settings.settings.plugins.classicwebcam.snapshotTimeout;self.snapshotSslValidation=self.settings.settings.plugins.classicwebcam.snapshotSslValidation;self.flipH=self.settings.settings.plugins.classicwebcam.flipH;self.flipV=self.settings.settings.plugins.classicwebcam.flipV;self.rotate90=self.settings.settings.plugins.classicwebcam.rotate90;self.streamUrl=self.settings.settings.plugins.classicwebcam.stream;self.webcamEnabled=self.settings.settings.webcam.webcamEnabled;self.streamRatio=self.settings.settings.plugins.classicwebcam.streamRatio;self.streamTimeout=self.settings.settings.plugins.classicwebcam.streamTimeout;self.streamWebrtcIceServers=self.settings.settings.plugins.classicwebcam.streamWebrtcIceServers;self.streamWebrtcIceServersText=ko.observable("");self.cacheBuster=self.settings.settings.plugins.classicwebcam.cacheBuster;self.available_ratios=["16:9","4:3"];self.webRtcServersToText();self.streamWebrtcIceServers.subscribe(function(value){self.webRtcServersToText();});};self.onSettingsBeforeSave=function(){self.textToWebRtcServers();};self.onUserSettingsHidden=function(){self.webRtcServersToText();};self.streamUrlEscaped=ko.pureComputed(function(){return encodeURI(self.streamUrl());});self.streamType=ko.pureComputed(function(){try{return determineWebcamStreamType(self.streamUrlEscaped());}catch(e){return"";}});self.streamValid=ko.pureComputed(function(){var url=self.streamUrlEscaped();return!url||validateWebcamUrl(url);});self.testWebcamStreamUrlBusy=ko.observable(false);self.testWebcamStreamUrl=function(){var url=self.streamUrlEscaped();if(!url){return;}
-if(self.testWebcamStreamUrlBusy()){return;}
-var text=gettext("If you see your webcam stream below, the entered stream URL is ok.");var streamType;try{streamType=self.streamType();}catch(e){streamType="";}
-var webcam_element;var webrtc_peer_connection;if(streamType==="mjpg"){webcam_element=$(' ');}else if(streamType==="hls"){webcam_element=$(' ');video_element=webcam_element[0];if(video_element.canPlayType("application/vnd.apple.mpegurl")){video_element.src=url;}else if(Hls.isSupported()){var hls=new Hls();hls.loadSource(url);hls.attachMedia(video_element);}}else if(isWebRTCAvailable()&&streamType==="webrtc"){webcam_element=$(' ');video_element=webcam_element[0];webrtc_peer_connection=startWebRTC(video_element,url,self.streamWebrtcIceServers());}else{throw"Unknown stream type "+streamType;}
-var message=$("
").append($("
")).append(text).append(webcam_element);self.testWebcamStreamUrlBusy(true);showMessageDialog({title:gettext("Stream test"),message:message,onclose:function(){self.testWebcamStreamUrlBusy(false);if(webrtc_peer_connection!=null){webrtc_peer_connection.close();webrtc_peer_connection=null;}}});};self.testWebcamSnapshotUrlBusy=ko.observable(false);self.testWebcamSnapshotUrl=function(viewModel,event){if(!self.snapshotUrl()){return;}
-if(self.testWebcamSnapshotUrlBusy()){return;}
-var errorText=gettext("Could not retrieve snapshot URL, please double check the URL");var errorTitle=gettext("Snapshot test failed");self.testWebcamSnapshotUrlBusy(true);OctoPrint.util.testUrl(self.snapshotUrl(),{method:"GET",response:"bytes",timeout:self.settings.settings.webcam.snapshotTimeout(),validSsl:self.settings.settings.webcam.snapshotSslValidation(),content_type_whitelist:["image/*"],content_type_guess:true}).done(function(response){if(!response.result){if(response.status&&response.response&&response.response.content_type){errorText=gettext("Could retrieve the snapshot URL, but it didn't look like an "+"image. Got this as a content type header: %(content_type)s
. Please "+"double check that the URL is returning static images, not multipart data "+"or videos.");errorText=_.sprintf(errorText,{content_type:_.escape(response.response.content_type)});}
-showMessageDialog({title:errorTitle,message:errorText,onclose:function(){self.testWebcamSnapshotUrlBusy(false);}});return;}
-const content=response.response.content;const contentType=response.response.assumed_content_type;const text=gettext("If you see your webcam snapshot picture below, the entered snapshot URL is ok.");const mimeType=contentType?contentType.split(";")[0]:"image/jpeg";const textElement=$("
").text(text);const imgElement=$(" ").attr("src","data:"+mimeType+";base64,"+content).css("border","1px solid black");const message=$("
").append(textElement).append(imgElement);showMessageDialog({title:gettext("Snapshot test"),message:message,onclose:function(){self.testWebcamSnapshotUrlBusy(false);}});}).fail(function(){showMessageDialog({title:errorTitle,message:errorText,onclose:function(){self.testWebcamSnapshotUrlBusy(false);}});});};}
-OCTOPRINT_VIEWMODELS.push({construct:ClassicWebcamSettingsViewModel,dependencies:["loginStateViewModel","settingsViewModel"],elements:["#classicwebcam_settings"]});});
-;
-
-// source: plugin/classicwebcam/js/classicwebcam_wizard.js
-$(function(){function ClassicWebcamWizardViewModel(parameters){var self=this;self.settingsViewModel=parameters[0];self.onWizardFinish=function(){if(self.settingsViewModel.streamUrl()){return"reload";}};}
-OCTOPRINT_VIEWMODELS.push({construct:ClassicWebcamWizardViewModel,dependencies:["classicWebcamSettingsViewModel"],elements:["#wizard_classicwebcam"]});});
-;
-
-// source: plugin/errortracking/js/sentry.min.js
-/*! @sentry/browser 6.18.2 (22f518e) | https://github.com/getsentry/sentry-javascript */
-var Sentry=function(t){var n=function(t,r){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])},n(t,r)};function r(t,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function i(){this.constructor=t}n(t,r),t.prototype=null===r?Object.create(r):(i.prototype=r.prototype,new i)}var i,e=function(){return e=Object.assign||function(t){for(var n,r=1,i=arguments.length;r=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")}function u(t,n){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var i,e,o=r.call(t),u=[];try{for(;(void 0===n||n-- >0)&&!(i=o.next()).done;)u.push(i.value)}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return u}function a(){for(var t=[],n=0;n ".length,a=void 0;r&&e++<5&&!("html"===(a=_(r,n))||e>1&&o+i.length*u+a.length>=80);)i.push(a),o+=a.length,r=r.parentNode;return i.reverse().join(" > ")}catch(t){return""}}function _(t,n){var r,i,e,o,u,a=t,c=[];if(!a||!a.tagName)return"";c.push(a.tagName.toLowerCase());var s=n&&n.length?n.filter((function(t){return a.getAttribute(t)})).map((function(t){return[t,a.getAttribute(t)]})):null;if(s&&s.length)s.forEach((function(t){c.push("["+t[0]+'="'+t[1]+'"]')}));else if(a.id&&c.push("#"+a.id),(r=a.className)&&p(r))for(i=r.split(/\s+/),u=0;u1&&(h=d.slice(0,-1).join("/"),v=d.pop()),v){var l=v.match(/^\d+/);l&&(v=l[0])}return T({host:c,pass:a,path:h,projectId:v,port:f,protocol:i,publicKey:e})}(t):T(t);return n}var R=["fatal","error","warning","log","info","debug","critical"],N=s(),I="Sentry Logger ";function M(t){var n=s();if(!("console"in n))return t();var r=n.console,i={};["debug","info","warn","error","log","assert"].forEach((function(t){t in n.console&&r[t].__sentry_original__&&(i[t]=r[t],r[t]=r[t].__sentry_original__)}));var e=t();return Object.keys(i).forEach((function(t){r[t]=i[t]})),e}var q=function(){function t(){this.t=!1}return t.prototype.disable=function(){this.t=!1},t.prototype.enable=function(){this.t=!0},t.prototype.log=function(){for(var t=[],n=0;n"}try{o.currentTarget=w(e.currentTarget)?E(e.currentTarget):Object.prototype.toString.call(e.currentTarget)}catch(t){o.currentTarget=""}for(var u in"undefined"!=typeof CustomEvent&&x(t,CustomEvent)&&(o.detail=e.detail),e)Object.prototype.hasOwnProperty.call(e,u)&&(o[u]=e[u]);return o}return t}function z(t){return function(t){return~-encodeURI(t).split(/%..|./).length}(JSON.stringify(t))}function G(t,n,r){void 0===n&&(n=3),void 0===r&&(r=102400);var i=Q(t,n);return z(i)>r?G(t,n-1,r):i}function K(t,n){return"domain"===n&&t&&"object"==typeof t&&t.i?"[Domain]":"domainEmitter"===n?"[DomainEmitter]":"undefined"!=typeof global&&t===global?"[Global]":"undefined"!=typeof window&&t===window?"[Window]":"undefined"!=typeof document&&t===document?"[Document]":m(r=t)&&"nativeEvent"in r&&"preventDefault"in r&&"stopPropagation"in r?"[SyntheticEvent]":"number"==typeof t&&t!=t?"[NaN]":void 0===t?"[undefined]":"function"==typeof t?"[Function: "+U(t)+"]":"symbol"==typeof t?"["+String(t)+"]":"bigint"==typeof t?"[BigInt: "+String(t)+"]":t;var r}function V(t,n,r,i){var e,o;void 0===r&&(r=1/0),void 0===i&&(e="function"==typeof WeakSet,o=e?new WeakSet:[],i=[function(t){if(e)return!!o.has(t)||(o.add(t),!1);for(var n=0;n=n)return H(r[0],n);for(var i=r.length;i>0;i--){var e=r.slice(0,i).join(", ");if(!(e.length>n))return i===r.length?e:H(e,n)}return""}function Z(t){var n,r;if(m(t)){var i=t,e={};try{for(var u=o(Object.keys(i)),a=u.next();!a.done;a=u.next()){var c=a.value;void 0!==i[c]&&(e[c]=Z(i[c]))}}catch(t){n={error:t}}finally{try{a&&!a.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}return e}return Array.isArray(t)?t.map(Z):t}function tt(){if(!("fetch"in s()))return!1;try{return new Headers,new Request(""),new Response,!0}catch(t){return!1}}function nt(t){return t&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}function rt(){if(!tt())return!1;try{return new Request("_",{referrerPolicy:"origin"}),!0}catch(t){return!1}}var it,et=s(),ot={},ut={};function at(t){if(!ut[t])switch(ut[t]=!0,t){case"console":!function(){if(!("console"in et))return;["debug","info","warn","error","log","assert"].forEach((function(t){t in et.console&&X(et.console,t,(function(n){return function(){for(var r=[],i=0;i2?n[2]:void 0;if(i){var e=it,o=String(i);it=o,st("history",{from:e,to:o})}return t.apply(this,n)}}et.onpopstate=function(){for(var n=[],r=0;r":r||""}function xt(t,n,r){var i=t.exception=t.exception||{},e=i.values=i.values||[],o=e[0]=e[0]||{};o.value||(o.value=n||""),o.type||(o.type=r||"Error")}function Et(t,n){var r=wt(t);if(r){var i=r.mechanism;if(r.mechanism=e(e(e({},{type:"generic",handled:!0}),i),n),n&&"data"in n){var o=e(e({},i&&i.data),n.data);r.mechanism.data=o}}}function _t(t){if(t&&t.__sentry_captured__)return!0;try{B(t,"__sentry_captured__",!0)}catch(t){}return!1}function jt(t){return new St((function(n){n(t)}))}function kt(t){return new St((function(n,r){r(t)}))}var St=function(){function t(t){var n=this;this.o=0,this.u=[],this.h=function(t){n.v(1,t)},this.l=function(t){n.v(2,t)},this.v=function(t,r){0===n.o&&(g(r)?r.then(n.h,n.l):(n.o=t,n.p=r,n.m()))},this.m=function(){if(0!==n.o){var t=n.u.slice();n.u=[],t.forEach((function(t){t[0]||(1===n.o&&t[1](n.p),2===n.o&&t[2](n.p),t[0]=!0)}))}};try{t(this.h,this.l)}catch(t){this.l(t)}}return t.prototype.then=function(n,r){var i=this;return new t((function(t,e){i.u.push([!1,function(r){if(n)try{t(n(r))}catch(t){e(t)}else t(r)},function(n){if(r)try{t(r(n))}catch(t){e(t)}else e(n)}]),i.m()}))},t.prototype.catch=function(t){return this.then((function(t){return t}),t)},t.prototype.finally=function(n){var r=this;return new t((function(t,i){var e,o;return r.then((function(t){o=!1,e=t,n&&n()}),(function(t){o=!0,e=t,n&&n()})).then((function(){o?i(e):t(e)}))}))},t}();function Ot(t){var n=[];function r(t){return n.splice(n.indexOf(t),1)[0]}return{$:n,add:function(i){if(!(void 0===t||n.length0&&r(!1)}),t);n.forEach((function(t){jt(t).then((function(){--e||(clearTimeout(o),r(!0))}),i)}))}))}}}function Tt(n){return"warn"===n?t.Severity.Warning:function(t){return-1!==R.indexOf(t)}(n)?n:t.Severity.Log}var Dt={nowSeconds:function(){return Date.now()/1e3}};var Rt=function(){var t=s().performance;if(t&&t.now)return{now:function(){return t.now()},timeOrigin:Date.now()-t.now()}}(),Nt=void 0===Rt?Dt:{nowSeconds:function(){return(Rt.timeOrigin+Rt.now())/1e3}},It=Dt.nowSeconds.bind(Dt),Mt=Nt.nowSeconds.bind(Nt);function qt(t,n){return void 0===n&&(n=[]),[t,n]}function At(t){var n=u(t,2),r=n[0],i=n[1],e=JSON.stringify(r);return i.reduce((function(t,n){var r=u(n,2),i=r[0],e=r[1],o=y(e)?String(e):JSON.stringify(e);return t+"\n"+JSON.stringify(i)+"\n"+o}),e)}!function(){var t=s().performance;if(t&&t.now){var n=36e5,r=t.now(),i=Date.now(),e=t.timeOrigin?Math.abs(t.timeOrigin+r-i):n,o=e0?t.breadcrumbs:void 0,t.sdkProcessingMetadata=this.R,this.H(a(Lt(),this.j),t,n)},t.prototype.setSDKProcessingMetadata=function(t){return this.R=e(e({},this.R),t),this},t.prototype.H=function(t,n,r,i){var o=this;return void 0===i&&(i=0),new St((function(u,a){var c=t[i];if(null===n||"function"!=typeof c)u(n);else{var s=c(e({},n),r);g(s)?s.then((function(n){return o.H(t,n,r,i+1).then(u)})).then(null,a):o.H(t,s,r,i+1).then(u).then(null,a)}}))},t.prototype.L=function(){var t=this;this.g||(this.g=!0,this._.forEach((function(n){n(t)})),this.g=!1)},t.prototype.U=function(t){t.fingerprint=t.fingerprint?Array.isArray(t.fingerprint)?t.fingerprint:[t.fingerprint]:[],this.A&&(t.fingerprint=t.fingerprint.concat(this.A)),t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint},t}();function Lt(){var t=s();return t.__SENTRY__=t.__SENTRY__||{},t.__SENTRY__.globalEventProcessors=t.__SENTRY__.globalEventProcessors||[],t.__SENTRY__.globalEventProcessors}function Ut(t){Lt().push(t)}var Ht=function(){function t(t){this.errors=0,this.sid=mt(),this.duration=0,this.status="ok",this.init=!0,this.ignoreDuration=!1;var n=Mt();this.timestamp=n,this.started=n,t&&this.update(t)}return t.prototype.update=function(t){if(void 0===t&&(t={}),t.user&&(!this.ipAddress&&t.user.ip_address&&(this.ipAddress=t.user.ip_address),this.did||t.did||(this.did=t.user.id||t.user.email||t.user.username)),this.timestamp=t.timestamp||Mt(),t.ignoreDuration&&(this.ignoreDuration=t.ignoreDuration),t.sid&&(this.sid=32===t.sid.length?t.sid:mt()),void 0!==t.init&&(this.init=t.init),!this.did&&t.did&&(this.did=""+t.did),"number"==typeof t.started&&(this.started=t.started),this.ignoreDuration)this.duration=void 0;else if("number"==typeof t.duration)this.duration=t.duration;else{var n=this.timestamp-this.started;this.duration=n>=0?n:0}t.release&&(this.release=t.release),t.environment&&(this.environment=t.environment),!this.ipAddress&&t.ipAddress&&(this.ipAddress=t.ipAddress),!this.userAgent&&t.userAgent&&(this.userAgent=t.userAgent),"number"==typeof t.errors&&(this.errors=t.errors),t.status&&(this.status=t.status)},t.prototype.close=function(t){t?this.update({status:t}):"ok"===this.status?this.update({status:"exited"}):this.update()},t.prototype.toJSON=function(){return Z({sid:""+this.sid,init:this.init,started:new Date(1e3*this.started).toISOString(),timestamp:new Date(1e3*this.timestamp).toISOString(),status:this.status,errors:this.errors,did:"number"==typeof this.did||"string"==typeof this.did?""+this.did:void 0,duration:this.duration,attrs:{release:this.release,environment:this.environment,ip_address:this.ipAddress,user_agent:this.userAgent}})},t}(),Ft=function(){function t(t,n,r){void 0===n&&(n=new Ct),void 0===r&&(r=4),this.F=r,this.P=[{}],this.getStackTop().scope=n,t&&this.bindClient(t)}return t.prototype.isOlderThan=function(t){return this.F=t&&(clearInterval(e),r(!1)))}),1)}))},t.prototype.nt=function(){return this.V},t.prototype.it=function(){return!1!==this.getOptions().enabled&&void 0!==this.Z},t.prototype.at=function(t,n,r){var i=this,o=this.getOptions().normalizeDepth,u=void 0===o?3:o,a=e(e({},t),{event_id:t.event_id||(r&&r.event_id?r.event_id:mt()),timestamp:t.timestamp||It()});this.ct(a),this.st(a);var c=n;r&&r.captureContext&&(c=Ct.clone(c).update(r.captureContext));var s=jt(a);return c&&(s=c.applyToEvent(a,r)),s.then((function(t){return t&&(t.sdkProcessingMetadata=e(e({},t.sdkProcessingMetadata),{normalizeDepth:Q(u)})),"number"==typeof u&&u>0?i.ft(t,u):t}))},t.prototype.ft=function(t,n){if(!t)return null;var r=e(e(e(e(e({},t),t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map((function(t){return e(e({},t),t.data&&{data:Q(t.data,n)})}))}),t.user&&{user:Q(t.user,n)}),t.contexts&&{contexts:Q(t.contexts,n)}),t.extra&&{extra:Q(t.extra,n)});return t.contexts&&t.contexts.trace&&(r.contexts.trace=t.contexts.trace),t.sdkProcessingMetadata=e(e({},t.sdkProcessingMetadata),{baseClientNormalized:!0}),r},t.prototype.ct=function(t){var n=this.getOptions(),r=n.environment,i=n.release,e=n.dist,o=n.maxValueLength,u=void 0===o?250:o;"environment"in t||(t.environment="environment"in n?r:"production"),void 0===t.release&&void 0!==i&&(t.release=i),void 0===t.dist&&void 0!==e&&(t.dist=e),t.message&&(t.message=H(t.message,u));var a=t.exception&&t.exception.values&&t.exception.values[0];a&&a.value&&(a.value=H(a.value,u));var c=t.request;c&&c.url&&(c.url=H(c.url,u))},t.prototype.st=function(t){var n=Object.keys(this.G);n.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=a(t.sdk.integrations||[],n))},t.prototype.ht=function(t){this.nt().sendEvent(t)},t.prototype.rt=function(t,n,r){return this.vt(t,n,r).then((function(t){return t.event_id}),(function(t){A.error(t)}))},t.prototype.vt=function(t,n,r){var i=this,e=this.getOptions(),o=e.beforeSend,u=e.sampleRate,a=this.getTransport();function c(t,n){a.recordLostEvent&&a.recordLostEvent(t,n)}if(!this.it())return kt(new k("SDK not enabled, will not capture event."));var s="transaction"===t.type;return!s&&"number"==typeof u&&Math.random()>u?(c("sample_rate","event"),kt(new k("Discarding event because it's not included in the random sample (sampling rate = "+u+")"))):this.at(t,r,n).then((function(r){if(null===r)throw c("event_processor",t.type||"event"),new k("An event processor returned null, will not send event.");return n&&n.data&&!0===n.data.__sentry__||s||!o?r:function(t){var n="`beforeSend` method has to return `null` or a valid event.";if(g(t))return t.then((function(t){if(!m(t)&&null!==t)throw new k(n);return t}),(function(t){throw new k("beforeSend rejected with "+t)}));if(!m(t)&&null!==t)throw new k(n);return t}(o(r,n))})).then((function(n){if(null===n)throw c("before_send",t.type||"event"),new k("`beforeSend` returned `null`, will not send event.");var e=r&&r.getSession&&r.getSession();return!s&&e&&i.ut(e,n),i.ht(n),n})).then(null,(function(t){if(t instanceof k)throw t;throw i.captureException(t,{data:{__sentry__:!0},originalException:t}),new k("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: "+t)}))},t.prototype.tt=function(t){var n=this;this.K+=1,t.then((function(t){return n.K-=1,t}),(function(t){return n.K-=1,t}))},t}();var on=function(){function t(){}return t.prototype.sendEvent=function(t){return jt({reason:"NoopTransport: Event has been skipped because no Dsn is configured.",status:"skipped"})},t.prototype.close=function(t){return jt(!0)},t}(),un=function(){function t(t){this.Y=t,this.Y.dsn||A.warn("No DSN provided, backend will not do anything."),this.dt=this.lt()}return t.prototype.eventFromException=function(t,n){throw new k("Backend has to implement `eventFromException` method")},t.prototype.eventFromMessage=function(t,n,r){throw new k("Backend has to implement `eventFromMessage` method")},t.prototype.sendEvent=function(t){this.dt.sendEvent(t).then(null,(function(t){0}))},t.prototype.sendSession=function(t){this.dt.sendSession&&this.dt.sendSession(t).then(null,(function(t){0}))},t.prototype.getTransport=function(){return this.dt},t.prototype.lt=function(){return new on},t}();function an(t){if(t.metadata&&t.metadata.sdk){var n=t.metadata.sdk;return{name:n.name,version:n.version}}}function cn(t,n){var r,i=an(n),o=t.type||"event",u="transaction"===o||!!n.tunnel,c=(t.sdkProcessingMetadata||{}).transactionSampling||{},s=c.method,f=c.rate;!function(t,n){n&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||n.name,t.sdk.version=t.sdk.version||n.version,t.sdk.integrations=a(t.sdk.integrations||[],n.integrations||[]),t.sdk.packages=a(t.sdk.packages||[],n.packages||[]))}(t,n.metadata.sdk),t.tags=t.tags||{},t.extra=t.extra||{},t.sdkProcessingMetadata&&t.sdkProcessingMetadata.baseClientNormalized||(t.tags.skippedNormalization=!0,t.extra.normalizeDepth=t.sdkProcessingMetadata?t.sdkProcessingMetadata.normalizeDepth:"unset"),delete t.sdkProcessingMetadata;try{r=JSON.stringify(t)}catch(n){t.tags.JSONStringifyError=!0,t.extra.JSONStringifyError=n;try{r=JSON.stringify(Q(t))}catch(t){var h=t;r=JSON.stringify({message:"JSON.stringify error after renormalization",extra:{message:h.message,stack:h.stack}})}}var v={body:r,type:o,url:u?Yt(n.dsn,n.tunnel):Qt(n.dsn)};if(u){var d=qt(e(e({event_id:t.event_id,sent_at:(new Date).toISOString()},i&&{sdk:i}),!!n.tunnel&&{dsn:O(n.dsn)}),[[{type:o,sample_rates:[{id:s,rate:f}]},v.body]]);v.body=At(d)}return v}var sn,fn="6.18.2",hn=function(){function t(){this.name=t.id}return t.prototype.setupOnce=function(){sn=Function.prototype.toString,Function.prototype.toString=function(){for(var t=[],n=0;n=0;n--){var r=t[n];if(r&&""!==r.filename&&"[native code]"!==r.filename)return r.filename||null}return null},t.prototype.jt=function(t){try{if(t.stacktrace)return this.kt(t.stacktrace.frames);var n;try{n=t.exception.values[0].stacktrace.frames}catch(t){}return n?this.kt(n):null}catch(t){return null}},t.id="InboundFilters",t}(),ln=Object.freeze({__proto__:null,FunctionToString:hn,InboundFilters:dn}),pn="?";function yn(t,n,r,i){var e={filename:t,function:n,in_app:!0};return void 0!==r&&(e.lineno=r),void 0!==i&&(e.colno=i),e}var mn=/^\s*at (?:(.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,bn=/\((\S*)(?::(\d+))(?::(\d+))\)/,wn=[30,function(t){var n=mn.exec(t);if(n){if(n[2]&&0===n[2].indexOf("eval")){var r=bn.exec(n[2]);r&&(n[2]=r[1],n[3]=r[2],n[4]=r[3])}var i=u(Dn(n[1]||pn,n[2]),2),e=i[0];return yn(i[1],e,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],gn=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,xn=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,En=[50,function(t){var n,r=gn.exec(t);if(r){if(r[3]&&r[3].indexOf(" > eval")>-1){var i=xn.exec(r[3]);i&&(r[1]=r[1]||"eval",r[3]=i[1],r[4]=i[2],r[5]="")}var e=r[3],o=r[1]||pn;return o=(n=u(Dn(o,e),2))[0],yn(e=n[1],o,r[4]?+r[4]:void 0,r[5]?+r[5]:void 0)}}],_n=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,jn=[40,function(t){var n=_n.exec(t);return n?yn(n[2],n[1]||pn,+n[3],n[4]?+n[4]:void 0):void 0}],kn=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,Sn=[10,function(t){var n=kn.exec(t);return n?yn(n[2],n[3]||pn,+n[1]):void 0}],On=/ line (\d+), column (\d+)\s*(?:in (?:]+)>|([^)]+))\(.*\))? in (.*):\s*$/i,Tn=[20,function(t){var n=On.exec(t);return n?yn(n[5],n[3]||n[4]||pn,+n[1],+n[2]):void 0}],Dn=function(t,n){var r=-1!==t.indexOf("safari-extension"),i=-1!==t.indexOf("safari-web-extension");return r||i?[-1!==t.indexOf("@")?t.split("@")[0]:pn,r?"safari-extension:"+n:"safari-web-extension:"+n]:[t,n]};function Rn(t){var n=In(t),r={type:t&&t.name,value:qn(t)};return n.length&&(r.stacktrace={frames:n}),void 0===r.type&&""===r.value&&(r.value="Unrecoverable error caught"),r}function Nn(t){return{exception:{values:[Rn(t)]}}}function In(t){var n=t.stacktrace||t.stack||"",r=function(t){if(t){if("number"==typeof t.framesToPop)return t.framesToPop;if(Mn.test(t.message))return 1}return 0}(t);try{return function(){for(var t=[],n=0;n=200&&n<300?"success":429===n?"rate_limit":n>=400&&n<500?"invalid":n>=500?"failed":"unknown";this.qt(i);"success"!==u?o(r):e({status:u})},t.prototype.At=function(t){var n=Bn(t);return this.Ot[n]||this.Ot.all},t.prototype.Ct=function(t){return this.At(t)>new Date(Date.now())},t.prototype.qt=function(t){var n,r,i,e,u=Date.now(),a=t["x-sentry-rate-limits"],c=t["retry-after"];if(a){try{for(var s=o(a.trim().split(",")),f=s.next();!f.done;f=s.next()){var h=f.value.split(":",2),v=parseInt(h[0],10),d=1e3*(isNaN(v)?60:v);try{for(var l=(i=void 0,o(h[1].split(";"))),p=l.next();!p.done;p=l.next()){var y=p.value;this.Ot[y||"all"]=new Date(u+d)}}catch(t){i={error:t}}finally{try{p&&!p.done&&(e=l.return)&&e.call(l)}finally{if(i)throw i.error}}}}catch(t){n={error:t}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}return!0}return!!c&&(this.Ot.all=new Date(u+function(t,n){void 0===n&&(n=Date.now());var r=parseInt(""+t,10);if(!isNaN(r))return 1e3*r;var i=Date.parse(""+t);return isNaN(i)?6e4:i-n}(c,u)),!0)},t}(),Jn=function(t){function n(n,r){void 0===r&&(r=Pn());var i=t.call(this,n)||this;return i.Lt=r,i}return r(n,t),n.prototype.It=function(t,n){var r=this;if(this.Ct(t.type))return this.recordLostEvent("ratelimit_backoff",t.type),Promise.reject({event:n,type:t.type,reason:"Transport for "+t.type+" requests locked till "+this.At(t.type)+" due to too many requests.",status:429});var i={body:t.body,method:"POST",referrerPolicy:rt()?"origin":""};return void 0!==this.options.fetchParameters&&Object.assign(i,this.options.fetchParameters),void 0!==this.options.headers&&(i.headers=this.options.headers),this.St.add((function(){return new St((function(n,e){r.Lt(t.url,i).then((function(i){var o={"x-sentry-rate-limits":i.headers.get("X-Sentry-Rate-Limits"),"retry-after":i.headers.get("Retry-After")};r.Mt({requestType:t.type,response:i,headers:o,resolve:n,reject:e})})).catch(e)}))})).then(void 0,(function(n){throw n instanceof k?r.recordLostEvent("queue_overflow",t.type):r.recordLostEvent("network_error",t.type),n}))},n}($n),zn=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return r(n,t),n.prototype.It=function(t,n){var r=this;return this.Ct(t.type)?(this.recordLostEvent("ratelimit_backoff",t.type),Promise.reject({event:n,type:t.type,reason:"Transport for "+t.type+" requests locked till "+this.At(t.type)+" due to too many requests.",status:429})):this.St.add((function(){return new St((function(n,i){var e=new XMLHttpRequest;for(var o in e.onreadystatechange=function(){if(4===e.readyState){var o={"x-sentry-rate-limits":e.getResponseHeader("X-Sentry-Rate-Limits"),"retry-after":e.getResponseHeader("Retry-After")};r.Mt({requestType:t.type,response:e,headers:o,resolve:n,reject:i})}},e.open("POST",t.url),r.options.headers)Object.prototype.hasOwnProperty.call(r.options.headers,o)&&e.setRequestHeader(o,r.options.headers[o]);e.send(t.body)}))})).then(void 0,(function(n){throw n instanceof k?r.recordLostEvent("queue_overflow",t.type):r.recordLostEvent("network_error",t.type),n}))},n}($n),Gn=Object.freeze({__proto__:null,BaseTransport:$n,FetchTransport:Jn,XHRTransport:zn}),Kn=function(n){function i(){return null!==n&&n.apply(this,arguments)||this}return r(i,n),i.prototype.eventFromException=function(t,n){return An(t,n,this.Y.attachStacktrace)},i.prototype.eventFromMessage=function(n,r,i){return void 0===r&&(r=t.Severity.Info),Cn(n,r,i,this.Y.attachStacktrace)},i.prototype.lt=function(){if(!this.Y.dsn)return n.prototype.lt.call(this);var t=e(e({},this.Y.transportOptions),{dsn:this.Y.dsn,tunnel:this.Y.tunnel,sendClientReports:this.Y.sendClientReports,Rt:this.Y.Rt});return this.Y.transport?new this.Y.transport(t):tt()?new Jn(t):new zn(t)},i}(un),Vn=s(),Qn=0;function Yn(){return Qn>0}function Zn(){Qn+=1,setTimeout((function(){Qn-=1}))}function tr(t,n,r){if(void 0===n&&(n={}),"function"!=typeof t)return t;try{var i=t.__sentry_wrapped__;if(i)return i;if($(t))return t}catch(n){return t}var sentryWrapped=function(){var i=Array.prototype.slice.call(arguments);try{r&&"function"==typeof r&&r.apply(this,arguments);var o=i.map((function(t){return tr(t,n)}));return t.apply(this,o)}catch(t){throw Zn(),zt((function(r){r.addEventProcessor((function(t){return n.mechanism&&(xt(t,void 0,void 0),Et(t,n.mechanism)),t.extra=e(e({},t.extra),{arguments:i}),t})),captureException(t)})),t}};try{for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(sentryWrapped[o]=t[o])}catch(t){}W(sentryWrapped,t),B(t,"__sentry_wrapped__",sentryWrapped);try{Object.getOwnPropertyDescriptor(sentryWrapped,"name").configurable&&Object.defineProperty(sentryWrapped,"name",{get:function(){return t.name}})}catch(t){}return sentryWrapped}function nr(t){if(void 0===t&&(t={}),Vn.document&&t.eventId&&t.dsn){var n=Vn.document.createElement("script");n.async=!0,n.src=function(t,n){var r=D(t),i=Gt(r)+"embed/error-page/",e="dsn="+O(r);for(var o in n)if("dsn"!==o)if("user"===o){if(!n.user)continue;n.user.name&&(e+="&name="+encodeURIComponent(n.user.name)),n.user.email&&(e+="&email="+encodeURIComponent(n.user.email))}else e+="&"+encodeURIComponent(o)+"="+encodeURIComponent(n[o]);return i+"?"+e}(t.dsn,t),t.onLoad&&(n.onload=t.onLoad);var r=Vn.document.head||Vn.document.body;r&&r.appendChild(n)}}var rr=function(){function t(n){this.name=t.id,this.Ut={onerror:ir,onunhandledrejection:er},this.Y=e({onerror:!0,onunhandledrejection:!0},n)}return t.prototype.setupOnce=function(){Error.stackTraceLimit=50;var t=this.Y;for(var n in t){var r=this.Ut[n];r&&t[n]&&(ur(n),r(),this.Ut[n]=void 0)}},t.id="GlobalHandlers",t}();function ir(){ct("error",(function(n){var r=u(cr(),2),i=r[0],e=r[1];if(i.getIntegration(rr)){var o=n.msg,a=n.url,c=n.line,s=n.column,f=n.error;if(!(Yn()||f&&f.__sentry_own_request__)){var h=void 0===f&&p(o)?function(t,n,r,i){var e=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i,o=d(t)?t.message:t,u="Error",a=o.match(e);a&&(u=a[1],o=a[2]);return or({exception:{values:[{type:u,value:o}]}},n,r,i)}(o,a,c,s):or(Ln(f||o,void 0,e,!1),a,c,s);h.level=t.Severity.Error,ar(i,f,h,"onerror")}}}))}function er(){ct("unhandledrejection",(function(n){var r=u(cr(),2),i=r[0],e=r[1];if(i.getIntegration(rr)){var o=n;try{"reason"in n?o=n.reason:"detail"in n&&"reason"in n.detail&&(o=n.detail.reason)}catch(t){}if(Yn()||o&&o.__sentry_own_request__)return!0;var a=y(o)?{exception:{values:[{type:"UnhandledRejection",value:"Non-Error promise rejection captured with value: "+String(o)}]}}:Ln(o,void 0,e,!0);a.level=t.Severity.Error,ar(i,o,a,"onunhandledrejection")}}))}function or(t,n,r,i){var e=t.exception=t.exception||{},o=e.values=e.values||[],u=o[0]=o[0]||{},a=u.stacktrace=u.stacktrace||{},c=a.frames=a.frames||[],f=isNaN(parseInt(i,10))?void 0:i,h=isNaN(parseInt(r,10))?void 0:r,v=p(n)&&n.length>0?n:function(){var t=s();try{return t.document.location.href}catch(t){return""}}();return 0===c.length&&c.push({colno:f,filename:v,function:"?",in_app:!0,lineno:h}),t}function ur(t){0}function ar(t,n,r,i){Et(r,{handled:!1,type:i}),t.captureEvent(r,{originalException:n})}function cr(){var t=Bt(),n=t.getClient();return[t,n&&n.getOptions().attachStacktrace]}var sr=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],fr=function(){function t(n){this.name=t.id,this.Y=e({XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0},n)}return t.prototype.setupOnce=function(){var t=s();this.Y.setTimeout&&X(t,"setTimeout",hr),this.Y.setInterval&&X(t,"setInterval",hr),this.Y.requestAnimationFrame&&X(t,"requestAnimationFrame",vr),this.Y.XMLHttpRequest&&"XMLHttpRequest"in t&&X(XMLHttpRequest.prototype,"send",dr);var n=this.Y.eventTarget;n&&(Array.isArray(n)?n:sr).forEach(lr)},t.id="TryCatch",t}();function hr(t){return function(){for(var n=[],r=0;r"}0!==r.length&&Bt().addBreadcrumb({category:"ui."+n.name,message:r},{event:n.event,name:n.name,global:n.global})}return n}(this.Y.dom)),this.Y.xhr&&ct("xhr",mr),this.Y.fetch&&ct("fetch",br),this.Y.history&&ct("history",wr)},t.id="Breadcrumbs",t}();function yr(t){var n={category:"console",data:{arguments:t.args,logger:"console"},level:Tt(t.level),message:F(t.args," ")};if("assert"===t.level){if(!1!==t.args[0])return;n.message="Assertion failed: "+(F(t.args.slice(1)," ")||"console.assert"),n.data.arguments=t.args.slice(1)}Bt().addBreadcrumb(n,{input:t.args,level:t.level})}function mr(t){if(t.endTimestamp){if(t.xhr.__sentry_own_request__)return;var n=t.xhr.__sentry_xhr__||{},r=n.method,i=n.url,e=n.status_code,o=n.body;Bt().addBreadcrumb({category:"xhr",data:{method:r,url:i,status_code:e},type:"http"},{xhr:t.xhr,input:o})}else;}function br(n){n.endTimestamp&&(n.fetchData.url.match(/sentry_key/)&&"POST"===n.fetchData.method||(n.error?Bt().addBreadcrumb({category:"fetch",data:n.fetchData,level:t.Severity.Error,type:"http"},{data:n.error,input:n.args}):Bt().addBreadcrumb({category:"fetch",data:e(e({},n.fetchData),{status_code:n.response.status}),type:"http"},{input:n.args,response:n.response})))}function wr(t){var n=s(),r=t.from,i=t.to,e=bt(n.location.href),o=bt(r),u=bt(i);o.path||(o=e),e.protocol===u.protocol&&e.host===u.host&&(i=u.relative),e.protocol===o.protocol&&e.host===o.host&&(r=o.relative),Bt().addBreadcrumb({category:"navigation",data:{from:r,to:i}})}var gr=function(){function t(n){void 0===n&&(n={}),this.name=t.id,this.Ht=n.key||"cause",this.Ft=n.limit||5}return t.prototype.setupOnce=function(){Ut((function(n,r){var i=Bt().getIntegration(t);return i?function(t,n,r,i){if(!(r.exception&&r.exception.values&&i&&x(i.originalException,Error)))return r;var e=xr(n,i.originalException,t);return r.exception.values=a(e,r.exception.values),r}(i.Ht,i.Ft,n,r):n}))},t.id="LinkedErrors",t}();function xr(t,n,r,i){if(void 0===i&&(i=[]),!x(n[r],Error)||i.length+1>=t)return i;var e=Rn(n[r]);return xr(t,n[r],r,a([e],i))}var Er=s(),_r=function(){function t(){this.name=t.id}return t.prototype.setupOnce=function(){Ut((function(n){if(Bt().getIntegration(t)){if(!Er.navigator&&!Er.location&&!Er.document)return n;var r=n.request&&n.request.url||Er.location&&Er.location.href,i=(Er.document||{}).referrer,o=(Er.navigator||{}).userAgent,u=e(e(e({},n.request&&n.request.headers),i&&{Referer:i}),o&&{"User-Agent":o}),a=e(e({},r&&{url:r}),{headers:u});return e(e({},n),{request:a})}return n}))},t.id="UserAgent",t}(),jr=function(){function t(){this.name=t.id}return t.prototype.setupOnce=function(n,r){n((function(n){var i=r().getIntegration(t);if(i){try{if(function(t,n){if(!n)return!1;if(function(t,n){var r=t.message,i=n.message;if(!r&&!i)return!1;if(r&&!i||!r&&i)return!1;if(r!==i)return!1;if(!Sr(t,n))return!1;if(!kr(t,n))return!1;return!0}(t,n))return!0;if(function(t,n){var r=Or(n),i=Or(t);if(!r||!i)return!1;if(r.type!==i.type||r.value!==i.value)return!1;if(!Sr(t,n))return!1;if(!kr(t,n))return!1;return!0}(t,n))return!0;return!1}(n,i.Pt))return A.warn("Event dropped due to being a duplicate of previously captured event."),null}catch(t){return i.Pt=n}return i.Pt=n}return n}))},t.id="Dedupe",t}();function kr(t,n){var r=Tr(t),i=Tr(n);if(!r&&!i)return!0;if(r&&!i||!r&&i)return!1;if(r=r,(i=i).length!==r.length)return!1;for(var e=0;eIt looks like you are tracking an OctoPrint RC release channel. It "+"would be great if you would enable error reporting so that any kind of errors that occur "+"with an RC can be looked into more easily. Thank you!"+"You can find more information on error reporting "+"under Settings > Error Tracking
"),hide:false,confirm:{confirm:true,buttons:[{text:gettext("Ignore"),click:function(){notification.remove();notification=undefined;new PNotify({text:gettext('You can still enable error tracking via "Settings" > "Error Tracking"')});if(Modernizr.localstorage){localStorage["plugin.errortracking.notification_ignored"]=JSON.stringify(true);}}},{text:gettext("Enable"),addClass:"btn-primary",click:function(){self.settings.saveData({plugins:{errortracking:{enabled:true}}}).done(function(){notification.remove();notification=undefined;location.reload(true);});}}]},buttons:{closer:false,sticker:false}});}else if(notification!==undefined){notification.remove();notification=undefined;}};var subbed=false;self.onStartup=self.onUserLoggedIn=self.onUserLoggedOut=function(){performCheck();if(self.settings&&self.settings.settings&&self.settings.settings.plugins&&self.settings.settings.plugins.softwareupdate&&!subbed){subbed=true;self.settings.settings.plugins.softwareupdate.octoprint_release_channel.subscribe(performCheck);}};}
-OCTOPRINT_VIEWMODELS.push({construct:ErrorTrackingViewModel,dependencies:["settingsViewModel","loginStateViewModel"]});});
-;
-
-// source: plugin/eventmanager/js/events.js
-$(function(){function eventManagerViewModel(parameters){var self=this;self.settingsViewModel=parameters[0];self.selectedCommand=ko.observable();self.eventDetails=function(data){if(data===false){return{event:ko.observable(""),command:ko.observable(""),name:ko.observable(""),type:ko.observable(""),enabled:ko.observable(true),debug:ko.observable(false)};}else{if(!data.hasOwnProperty("enabled")){data["enabled"]=ko.observable(true);}
-if(!data.hasOwnProperty("debug")){data["debug"]=ko.observable(false);}
-return data;}};self.addEvent=function(){self.selectedCommand(self.eventDetails(false));self.settingsViewModel.settings.plugins.eventmanager.subscriptions.push(self.selectedCommand());$("#EventManagerEditor").modal("show");};self.editEvent=function(data){self.selectedCommand(self.eventDetails(data));$("#EventManagerEditor").modal("show");};self.removeEvent=function(data){self.settingsViewModel.settings.plugins.eventmanager.subscriptions.remove(data);};}
-OCTOPRINT_VIEWMODELS.push({construct:eventManagerViewModel,dependencies:["settingsViewModel"],elements:["#settings_plugin_eventmanager"]});});
-;
-
-// source: plugin/file_check/js/file_check.js
-$(function(){function FileCheckViewModel(parameters){const self=this;self.loginState=parameters[0];self.access=parameters[1];self.settingsViewModel=parameters[2];self.printerState=parameters[3];self.filesViewModel=parameters[4];self.fullCheckAvailable=ko.observable(false);self.checkResult=ko.observable();self.checkRunning=ko.observable(false);self.lastCheckTimestamp=ko.observable();self.lastCheckCurrent=ko.observable();self.issueNotification=undefined;const ISSUES={travel_speed:{title:gettext("Travel Speed Placeholder"),message:gettext("Your file still contains a place holder {travel_speed}
. "+"This is a common issue when using old start/stop GCODE code snippets in current versions of "+"Cura, as the placeholder name switched to {speed_travel}
at some point and "+"no longer gets replaced in current versions. You need to fix this in your slicer and reslice "+"your file, do not print it like it is as it will cause issues!")},leaked_api_key:{title:gettext("Leaked API Key"),message:gettext("Your file contains an API key that is not supposed to be there. "+"This is caused by a bug in your slicer, and known to happen with PrusaSlicer (<= 2.1.1), "+"BambuStudio (<= 1.8.4) and OrcaSlicer (<= 1.9.0). "+"Do not share this file with anyone, update your slicer to a patched version immediately, "+"and reslice your file. Also consider changing your API key in OctoPrint, as it might have been leaked by your slicer "+"to third parties through any GCODE files shared previously."),severity:"error"}};self.checksArray=ko.pureComputed(()=>{return Object.keys(ISSUES).map((key)=>{return{key:key,title:ISSUES[key].title,message:ISSUES[key].message,enabled:ko.pureComputed({read:()=>{return!self.settingsViewModel.settings.plugins.file_check.ignored_checks().includes(key);},write:(value)=>{if(value){self.settingsViewModel.settings.plugins.file_check.ignored_checks.remove(key);}else{self.settingsViewModel.settings.plugins.file_check.ignored_checks.push(key);}}})};});});self.lastCheckTimestampText=ko.pureComputed(()=>{return formatDate(self.lastCheckTimestamp(),{placeholder:gettext("unknown")});});self.lastCheckStateText=ko.pureComputed(()=>{if(self.lastCheckCurrent()){return gettext("Up to date");}else{return gettext("Outdated");}});self.lastCheckStateClass=ko.pureComputed(()=>{if(self.lastCheckCurrent()){return"text-success";}else{return"text-error";}});self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_FILE_CHECK_RUN))
-return $.Deferred().reject();return OctoPrint.plugins.file_check.get().done(self.fromResponse);};self.fromResponse=function(response){self.fullCheckAvailable(response.native_grep);self.checkResult(response.check_result);self.lastCheckTimestamp(response.last_full_check.timestamp);self.lastCheckCurrent(response.last_full_check.current);};self.checkAll=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_FILE_CHECK_RUN))
-return;showConfirmationDialog({title:gettext("Run File Check on all files?"),message:gettext("This will perform a check of all of your uploaded files for known issues. "+"Depending on the amount of files this could take several minutes. "+"It should not be done while a print is running."),onproceed:()=>{self.checkRunning(true);OctoPrint.plugins.file_check.checkAll();}});};self.hasCheckResult=function(storage,file){if(!storage)return null;if(_.isPlainObject(storage)){file=storage.path;storage=storage.origin;}else if(!file){file=storage;storage="local";}
-const key=`${storage}:${file}`;return(self.checkResult()&&self.checkResult()[key]&&self.loginState.hasPermission(self.access.permissions.PLUGIN_FILE_CHECK_RUN));};self.showCheckResult=function(storage,file){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_FILE_CHECK_RUN))
-return;if(_.isPlainObject(storage)){file=storage.path;storage=storage.origin;}else if(!file){file=storage;storage="local";}
-const key=`${storage}:${file}`;const data=self.checkResult()[key];if(!data)return;const getMessage=(issue)=>{return $("
",{html:ISSUES[issue].message});};const getReadMore=(issue)=>{return $("
").append($(" ",{href:"https://faq.octoprint.org/file-check-"+
-issue.replaceAll("_","-"),target:"_blank",rel:"noreferrer noopener",text:gettext("Read more...")}));};const title=gettext("File Check detected the following issues:");let message;if(data.length===1){const issue=data[0];message=$("
").append(getMessage(issue)).append(getReadMore(issue));}else{message=$("").append(data.map((issue)=>$(" ").append(getMessage(issue)).append(getReadMore(issue))));}
-showMessageDialog({title:title,message:message});};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="file_check")return;if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_FILE_CHECK_RUN))
-return;switch(data["action"]){case"notify":{self._handleNotification(data);break;}
-case"check_update":{self._handleCheckUpdate(data);break;}}};self._handleNotification=function(data){let severity="warning";const result=[];for(const t of data["types"]){if(!ISSUES[t])continue;const spec=ISSUES[t];const message=spec["message"];if(spec["severity"]==="error"){severity="error";}
-const faq=""+
-gettext("Read more...")+" ";result.push(""+message+"
"+faq+"
");}
-if(result.length===0){return;}
-let text;if(result.length===1){text=result[0];}else{text=""+result.map((r)=>`${r} `).join("")+" ";}
-self.issueNotification&&self.issueNotification.remove();self.issueNotification=new PNotify({title:_.sprintf(gettext("File Check detected issues with %(path)s!"),data),text:text,hide:false,type:severity});self._handleCheckUpdate();};self._handleCheckUpdate=function(data){self.requestData().done(()=>{self.checkRunning(false);});};self.onStartup=function(){self.filesViewModel.fileCheckViewModel=self;self.printerState.fileCheckViewModel=self;const regex=//;const template="
";$("#files_template_machinecode").text((idx,text)=>{const position=text.search(regex);return text.substring(0,position)+template+text.substring(position);});$("#state .accordion-inner hr:nth-of-type(2)").before($("
",{attr:{"data-bind":"visible: $root.fileCheckViewModel.hasCheckResult($root.filepath()) && $root.loginState.hasPermission($root.access.permissions.PLUGIN_FILE_CHECK_RUN)"}}).append($("
",{href:"javascript:void(0);",class:"text-error",style:"text-decoration: underline",attr:{"data-bind":"click: function() { $root.fileCheckViewModel.showCheckResult($root.filepath()) }"}}).append($("
",{class:"fas fa-exclamation-circle"})).append(" "+
-gettext("File Check detected issues with this file!"))).after($("
")));};self.onAfterBinding=function(){self.settingsViewModel.settings.plugins.file_check.ignored_checks.subscribe(()=>{self.requestData();});};self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};}
-OCTOPRINT_VIEWMODELS.push({construct:FileCheckViewModel,dependencies:["loginStateViewModel","accessViewModel","settingsViewModel","printerStateViewModel","filesViewModel"],elements:["#wizard_plugin_file_check","#settings_plugin_file_check"]});});
-;
-
-// source: plugin/firmware_check/js/firmware_check.js
-$(function(){function FirmwareCheckViewModel(parameters){var self=this;self.loginState=parameters[0];self.printerState=parameters[1];self.access=parameters[2];self.settings=parameters[3];self.warnings=ko.observableArray([]);self.infos=ko.observableArray([]);self.disablingInfos=ko.observable(false);self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_FIRMWARE_CHECK_DISPLAY)){self.warnings([]);return;}
-OctoPrint.plugins.firmware_check.get().done(self.fromResponse).fail(function(){self.warnings([]);});};self.fromResponse=function(data){var warnings=[];var infos=[];_.each(data,function(data,warning_type){var item={type:warning_type,message:gettext(data.message),severity:data.severity,url:data.url};if(data.severity==="info"){if(!self.settings.settings.plugins.firmware_check.ignore_infos()){infos.push(item);}}else{warnings.push(item);}});self.warnings(warnings);self.infos(infos);};self.onStartup=function(){self.requestData();};var subbed=false;self.onStartup=self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(self.settings&&self.settings.settings&&self.settings.settings.plugins&&self.settings.settings.plugins.firmware_check&&!subbed){subbed=true;self.settings.settings.plugins.firmware_check.ignore_infos.subscribe(function(){self.requestData();});}
-self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="firmware_check")return;if(!data.hasOwnProperty("type"))return;if(data.type==="update"){self.requestData();}};self.cssClass=function(data){if(data.severity){return"firmware_check_warning_"+data.severity;}else{return undefined;}};self.warningText=function(data){switch(data.type){case"firmware-unsafe":return gettext("Critical Warning: Firmware Unsafe");case"firmware-broken":return gettext("Warning: Firmware Broken");case"firmware-development":return gettext("Info: Firmware Development Build");default:return data.severity==="critical"?gettext("Critical Warning"):data.severity==="warning"?gettext("Warning"):gettext("Info");}};self.disableInfos=function(){if(self.loginState.hasPermission(self.access.permissions.SETTINGS)){self.disablingInfos(true);OctoPrint.settings.savePluginSettings("firmware_check",{ignore_infos:true}).always(function(){self.disablingInfos(false);});}};}
-OCTOPRINT_VIEWMODELS.push({construct:FirmwareCheckViewModel,dependencies:["loginStateViewModel","printerStateViewModel","accessViewModel","settingsViewModel"],elements:["#sidebar_plugin_firmware_check_warning_wrapper","#sidebar_plugin_firmware_check_info_wrapper"]});});
-;
-
-// source: plugin/gcodeviewer/js/gcodeviewer.js
-$(function(){function GcodeViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.sizeThresholdStr=undefined;self.mobileSizeThresholdStr=undefined;self.compressionSizeThresholdStr=undefined;self.ui_progress_busy=ko.observable(false);self.ui_progress_percentage=ko.observable();self.ui_progress_type=ko.observable();self.ui_progress_text=ko.pureComputed(function(){var text="";switch(self.ui_progress_type()){case"parsing":{text=gettext("Parsing...")+" ("+
-self.ui_progress_percentage().toFixed(0)+"%)";break;}
-case"analyzing":{text=gettext("Analyzing...")+" ("+
-self.ui_progress_percentage().toFixed(0)+"%)";break;}
-case"done":{text=gettext("Ready!");break;}}
-return text;});self.ui_modelInfo=ko.observable("");self.ui_layerInfo=ko.observable("");self.tabActive=false;self.enableReload=ko.observable(false);self.waitForApproval=ko.observable(false);self.selectedFile={path:ko.observable(undefined),date:ko.observable(undefined),size:ko.observable(undefined)};self.needsLoad=false;self.renderer_centerModel=ko.observable(false);self.renderer_centerViewport=ko.observable(false);self.renderer_zoomOnModel=ko.observable(false);self.renderer_showMoves=ko.observable(true);self.renderer_showRetracts=ko.observable(true);self.renderer_showPrinthead=ko.observable(true);self.renderer_showSegmentStarts=ko.observable(false);self.renderer_showDebugArcs=ko.observable(false);self.renderer_chromeArcFix=ko.observable(OctoPrint.coreui.browser.chrome);self.renderer_showBoundingBox=ko.observable(false);self.renderer_showLayerBoundingBox=ko.observable(false);self.renderer_showFullSize=ko.observable(false);self.renderer_extrusionWidthEnabled=ko.observable(false);self.renderer_extrusionWidth=ko.observable(2);self.renderer_showNext=ko.observable(false);self.renderer_showCurrent=ko.observable(false);self.renderer_showPrevious=ko.observable(false);self.renderer_syncProgress=ko.observable(true);self.reader_hideEmptyLayers=ko.observable(true);self.reader_ignoreOutsideBed=ko.observable(true);self.reader_forceCompression=ko.observable(false);self.layerSelectionEnabled=ko.observable(false);self.layerUpEnabled=ko.observable(false);self.layerDownEnabled=ko.observable(false);self.synchronizeOptionsAndReload=function(additionalRendererOptions,additionalReaderOptions){self.synchronizeOptions(additionalRendererOptions,additionalReaderOptions);self.reload();};self.synchronizeOptions=function(additionalRendererOptions,additionalReaderOptions){var renderer={moveModel:self.renderer_centerModel(),centerViewport:self.renderer_centerViewport(),showMoves:self.renderer_showMoves(),showRetracts:self.renderer_showRetracts(),showHead:self.renderer_showPrinthead(),showSegmentStarts:self.renderer_showSegmentStarts(),showDebugArcs:self.renderer_showDebugArcs(),chromeArcFix:self.renderer_chromeArcFix(),showBoundingBox:self.renderer_showBoundingBox(),showLayerBoundingBox:self.renderer_showLayerBoundingBox(),showFullSize:self.renderer_showFullSize(),extrusionWidth:self.renderer_extrusionWidthEnabled()?self.renderer_extrusionWidth():1,showNextLayer:self.renderer_showNext(),showCurrentLayer:self.renderer_showCurrent(),showPreviousLayer:self.renderer_showPrevious(),zoomInOnModel:self.renderer_zoomOnModel(),onInternalOptionChange:self._onInternalRendererOptionChange};if(additionalRendererOptions){_.extend(renderer,additionalRendererOptions);}
-var reader={purgeEmptyLayers:self.reader_hideEmptyLayers(),ignoreOutsideBed:self.reader_ignoreOutsideBed(),alwaysCompress:self.settings.settings.plugins.gcodeviewer.alwaysCompress(),compressionSizeThreshold:self.settings.settings.plugins.gcodeviewer.compressionSizeThreshold(),forceCompression:self.reader_forceCompression()};if(additionalReaderOptions){_.extend(reader,additionalReaderOptions);}
-GCODE.ui.updateOptions({renderer:renderer,reader:reader});};self.rendererOptionUpdated=function(){self.synchronizeOptions();self._toLocalStorage();};self.readerOptionUpdated=function(){self.synchronizeOptionsAndReload();self._toLocalStorage();};self.renderer_centerModel.subscribe(self.rendererOptionUpdated);self.renderer_centerViewport.subscribe(self.rendererOptionUpdated);self.renderer_zoomOnModel.subscribe(self.rendererOptionUpdated);self.renderer_showMoves.subscribe(self.rendererOptionUpdated);self.renderer_showRetracts.subscribe(self.rendererOptionUpdated);self.renderer_showPrinthead.subscribe(self.rendererOptionUpdated);self.renderer_showSegmentStarts.subscribe(self.rendererOptionUpdated);self.renderer_showDebugArcs.subscribe(self.rendererOptionUpdated);self.renderer_chromeArcFix.subscribe(self.rendererOptionUpdated);self.renderer_showBoundingBox.subscribe(self.rendererOptionUpdated);self.renderer_showLayerBoundingBox.subscribe(self.rendererOptionUpdated);self.renderer_showFullSize.subscribe(self.rendererOptionUpdated);self.renderer_extrusionWidthEnabled.subscribe(self.rendererOptionUpdated);self.renderer_extrusionWidth.subscribe(self.rendererOptionUpdated);self.renderer_showNext.subscribe(self.rendererOptionUpdated);self.renderer_showCurrent.subscribe(self.rendererOptionUpdated);self.renderer_showPrevious.subscribe(self.rendererOptionUpdated);self.reader_hideEmptyLayers.subscribe(self.readerOptionUpdated);self.reader_ignoreOutsideBed.subscribe(self.readerOptionUpdated);self.reader_forceCompression.subscribe(self.readerOptionUpdated);self._printerProfileUpdated=function(){if(!self.enabled)return;var currentProfileData=self.settings.printerProfiles.currentProfileData();if(!currentProfileData)return;var options={reader:{},renderer:{}};var dirty=false;var toolOffsets=self._retrieveToolOffsets(currentProfileData);if(toolOffsets){options.reader.toolOffsets=toolOffsets;dirty=true;}
-var bedDimensions=self._retrieveBedDimensions(currentProfileData);if(bedDimensions){options.renderer.bed=bedDimensions;options.reader.bed=bedDimensions;dirty=true;}
-if(dirty){GCODE.ui.updateOptions(options);}};self.settings.printerProfiles.currentProfileData.subscribe(function(){self._printerProfileUpdated();if(self.settings.printerProfiles.currentProfileData()){if(self.settings.printerProfiles.currentProfileData().extruder){self.settings.printerProfiles.currentProfileData().extruder.count.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().extruder.sharedNozzle.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().extruder.offsets.subscribe(self._printerProfileUpdated);}
-if(self.settings.printerProfiles.currentProfileData().volume){self.settings.printerProfiles.currentProfileData().volume.width.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().volume.depth.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().volume.formFactor.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().volume.origin.subscribe(self._printerProfileUpdated);}
-if(self.settings.printerProfiles.currentProfileData().axes){self.settings.printerProfiles.currentProfileData().axes.x.inverted.subscribe(self._printerProfileUpdated);self.settings.printerProfiles.currentProfileData().axes.y.inverted.subscribe(self._printerProfileUpdated);}}});self.settings.feature_g90InfluencesExtruder.subscribe(function(){GCODE.ui.updateOptions({reader:{g90InfluencesExtruder:self.settings.feature_g90InfluencesExtruder()}});});self._retrieveBedDimensions=function(currentProfileData){if(currentProfileData===undefined){currentProfileData=self.settings.printerProfiles.currentProfileData();}
-if(currentProfileData&¤tProfileData.volume&¤tProfileData.volume.formFactor()&¤tProfileData.volume.width()&¤tProfileData.volume.depth()){var x=undefined,y=undefined,r=undefined,circular=false,centeredOrigin=false;var formFactor=currentProfileData.volume.formFactor();if(formFactor==="circular"){r=currentProfileData.volume.width()/2;circular=true;centeredOrigin=true;}else{x=currentProfileData.volume.width();y=currentProfileData.volume.depth();if(currentProfileData.volume.origin){centeredOrigin=currentProfileData.volume.origin()==="center";}}
-return{x:x,y:y,r:r,circular:circular,centeredOrigin:centeredOrigin};}else{return undefined;}};self._retrieveToolOffsets=function(currentProfileData){if(currentProfileData==undefined){currentProfileData=self.settings.printerProfiles.currentProfileData();}
-if(currentProfileData&¤tProfileData.extruder){var offsets=[];if(currentProfileData.extruder.offsets()&&!currentProfileData.extruder.sharedNozzle()){_.each(currentProfileData.extruder.offsets(),function(offset){offsets.push({x:offset[0],y:offset[1]});});}
-return offsets;}else{return undefined;}};self._retrieveAxesConfiguration=function(currentProfileData){if(currentProfileData==undefined){currentProfileData=self.settings.printerProfiles.currentProfileData();}
-if(currentProfileData&¤tProfileData.axes){var invertX=false,invertY=false;if(currentProfileData.axes.x){invertX=currentProfileData.axes.x.inverted();}
-if(currentProfileData.axes.y){invertY=currentProfileData.axes.y.inverted();}
-return{x:invertX,y:invertY};}else{return undefined;}};self.loadedFilepath=undefined;self.loadedFileDate=undefined;self.loadedFileSize=undefined;self.status="idle";self.enabled=false;self.currentlyPrinting=false;self.layerSlider=undefined;self.layerCommandSlider=undefined;self.currentLayer=undefined;self.currentCommand=undefined;self.maxLayer=undefined;self.initialize=function(){self.sizeThresholdStr=sizeObservable(self.settings.settings.plugins.gcodeviewer.sizeThreshold);self.mobileSizeThresholdStr=sizeObservable(self.settings.settings.plugins.gcodeviewer.mobileSizeThreshold);self.compressionSizeThresholdStr=sizeObservable(self.settings.settings.plugins.gcodeviewer.compressionSizeThreshold);var layerSliderElement=$("#gcode_slider_layers");var commandSliderElement=$("#gcode_slider_commands");var containerElement=$("#gcode_canvas");if(!(layerSliderElement.length&&commandSliderElement.length&&containerElement.length)){return;}
-self._configureLayerSlider(layerSliderElement);self._configureLayerCommandSlider(commandSliderElement);self._configureContainerElement(containerElement);self.settings.firstRequest.done(function(){var initResult=GCODE.ui.init({container:"#gcode_canvas",onProgress:self._onProgress,onModelLoaded:self._onModelLoaded,onLayerSelected:self._onLayerSelected,onFileLoaded:self._onFileLoaded,bed:self._retrieveBedDimensions(),toolOffsets:self._retrieveToolOffsets(),invertAxes:self._retrieveAxesConfiguration(),bedZ:self.settings.settings.gcodeAnalysis.bedZ()});if(!initResult){log.info("Could not initialize GCODE viewer component");return;}
-self.settings.settings.plugins.gcodeviewer.alwaysCompress.subscribe(self.readerOptionUpdated);self.settings.settings.plugins.gcodeviewer.compressionSizeThreshold.subscribe(self.readerOptionUpdated);self.synchronizeOptions();self.enabled=true;self._fromLocalStorage();});};self.reset=function(){self.enableReload(false);self.loadedFilepath=undefined;self.loadedFileDate=undefined;self.loadedFileSize=undefined;self.clear();};self.resetViewport=function(){GCODE.ui.resetViewport();};self.resetOptions=function(){self.renderer_centerModel(false);self.renderer_centerViewport(false);self.renderer_zoomOnModel(false);self.renderer_showMoves(true);self.renderer_showRetracts(true);self.renderer_showPrinthead(true);self.renderer_showSegmentStarts(false);self.renderer_showDebugArcs(false);self.renderer_chromeArcFix(OctoPrint.coreui.browser.chrome);self.renderer_showBoundingBox(false);self.renderer_showLayerBoundingBox(false);self.renderer_showFullSize(false);self.renderer_extrusionWidthEnabled(false);self.renderer_extrusionWidth(2);self.renderer_showNext(false);self.renderer_showCurrent(false);self.renderer_showPrevious(false);self.renderer_syncProgress(true);self.reader_hideEmptyLayers(true);self.reader_ignoreOutsideBed(true);self.reader_forceCompression(false);};self.clear=function(){GCODE.ui.clear();};self._configureLayerSlider=function(layerSliderElement){self.layerSlider=layerSliderElement.slider({id:"gcode_layer_slider",reversed:true,selection:"after",orientation:"vertical",min:0,max:1,step:1,value:0,enabled:false,formatter:function(value){return("Layer #"+
-(value+1)+" (Z = "+
-GCODE.renderer.getZ(value)+")");}}).on("slide",self.changeLayer);};self._configureLayerCommandSlider=function(commandSliderElement){self.layerCommandSlider=commandSliderElement.slider({id:"gcode_command_slider",orientation:"horizontal",min:0,max:1,step:1,value:[0,1],enabled:false}).on("slide",self.changeCommandRange);};self._configureContainerElement=function(containerElement){containerElement.mousedown(function(event){if(event.which===2){event.preventDefault();}});};self.loadFile=function(path,date,size,force){self.enableReload(false);self.needsLoad=false;if(self.status==="idle"&&(force||self.cachedPath!==path||self.cachedDate!==date||self.cachedSize!==size)){self.status="request";self.cachedPath=path;self.cachedDate=date;self.cachedSize=size;var par={url:OctoPrint.files.downloadPath("local",path),path:path,size:size,skipUntil:self.settings.settings.plugins.gcodeviewer.skipUntilThis()};GCODE.renderer.clear();self._onProgress("parsing");GCODE.gCodeReader.loadFile(par);if(self.layerSlider!==undefined){self.layerSlider.slider("disable");}
-if(self.layerCommandSlider!==undefined){self.layerCommandSlider.slider("disable");}}};self._onFileLoaded=function(){self.loadedFilepath=self.cachedPath;self.loadedFileDate=self.cachedDate;self.loadedFileSize=self.cachedSize;self.status="idle";self.enableReload(true);};self.reload=function(){if(!self.enableReload())return;self.loadFile(self.loadedFilepath,self.loadedFileDate,self.loadedFileSize,true);};self.fromHistoryData=function(data){self._processData(data);};self.fromCurrentData=function(data){self._processData(data);};self._renderPercentage=function(percentage){var cmdIndex=GCODE.gCodeReader.getCmdIndexForPercentage(percentage);if(!cmdIndex)return;GCODE.renderer.render(cmdIndex.layer,0,cmdIndex.cmd);GCODE.ui.updateLayerInfo(cmdIndex.layer);if(self.layerSlider!==undefined){self.layerSlider.slider("setValue",cmdIndex.layer);}
-if(self.layerCommandSlider!==undefined){self.layerCommandSlider.slider("setValue",[0,cmdIndex.cmd]);}};self._processData=function(data){if(!data.job.file||(!data.job.file.path&&(self.loadedFilepath||self.loadedFileDate))){self.waitForApproval(false);self.loadedFilepath=undefined;self.loadedFileDate=undefined;self.loadedFileSize=undefined;self.selectedFile.path(undefined);self.selectedFile.date(undefined);self.selectedFile.size(undefined);self.clear();return;}
-if(!self.enabled)return;self.currentlyPrinting=data.state.flags&&(data.state.flags.printing||data.state.flags.paused);if(self.loadedFilepath&&self.loadedFilepath===data.job.file.path&&self.loadedFileDate===data.job.file.date&&self.loadedFileSize===data.job.file.size){if(OctoPrint.coreui.browserTabVisible&&self.tabActive&&self.currentlyPrinting&&self.renderer_syncProgress()&&!self.waitForApproval()){self._renderPercentage(data.progress.completion);}}else{if(self.status==="idle")self.clear();if(data.job.file.path&&data.job.file.origin!=="sdcard"&&self.status!=="request"&&(!self.waitForApproval()||self.selectedFile.path()!==data.job.file.path||self.selectedFile.date()!==data.job.file.date||self.selectedFile.size()!==data.job.file.size)){self.selectedFile.path(data.job.file.path);self.selectedFile.date(data.job.file.date);self.selectedFile.size(data.job.file.size);if(data.job.file.size>self.settings.settings.plugins.gcodeviewer.sizeThreshold()||(OctoPrint.coreui.browser.mobile&&data.job.file.size>self.settings.settings.plugins.gcodeviewer.mobileSizeThreshold())){self.waitForApproval(true);self.loadedFilepath=undefined;self.loadedFileDate=undefined;self.loadedFileSize=undefined;}else{self.waitForApproval(false);if(self.tabActive){self.loadFile(data.job.file.path,data.job.file.date,data.job.file.size);}else{self.needsLoad=true;}}}}};self.onEventPrintDone=function(){if(self.renderer_syncProgress()&&!self.waitForApproval()){self._renderPercentage(100.0);}};self.approveLargeFile=function(){self.waitForApproval(false);self.loadFile(self.selectedFile.path(),self.selectedFile.date(),self.selectedFile.size());};self._onProgress=function(type,percentage){self.ui_progress_type(type);self.ui_progress_percentage(percentage===undefined?100:percentage);self.ui_progress_busy(percentage===undefined);};self._onModelLoaded=function(model){if(!model){self.ui_modelInfo("");if(self.layerSlider!==undefined){self.layerSlider.slider("disable");self.layerSlider.slider("setMax",1);self.layerSlider.slider("setValue",0);self.layerSelectionEnabled(false);self.layerDownEnabled(false);self.layerUpEnabled(false);}
-self.currentLayer=0;self.maxLayer=0;}else{var output=[];output.push(gettext("Model size")+": "+
-model.width.toFixed(2)+"mm × "+
-model.depth.toFixed(2)+"mm × "+
-model.height.toFixed(2)+"mm");output.push(gettext("Estimated layer height")+": "+
-model.layerHeight.toFixed(2)+
-gettext("mm"));output.push(gettext("Estimated total print time")+": "+
-formatFuzzyPrintTime(model.printTime));output.push(gettext("Layers with extrusion")+": "+
-model.layersPrinted.toFixed(0));self.ui_modelInfo(output.join("
"));self.maxLayer=model.layersActive-1;if(self.layerSlider!==undefined){self.layerSlider.slider("enable");self.layerSlider.slider("setMax",self.maxLayer);self.layerSlider.slider("setValue",0);self.layerSelectionEnabled(true);self.layerDownEnabled(false);self.layerUpEnabled(self.maxLayer>0);}}};self._onLayerSelected=function(layer){if(!layer){self.ui_layerInfo("");if(self.layerCommandSlider!==undefined){self.layerCommandSlider.slider("disable");self.layerCommandSlider.slider("setMax",1);self.layerCommandSlider.slider("setValue",[0,1]);self.layerDownEnabled(false);self.layerUpEnabled(false);}
-self.currentCommand=[0,1];}else{var output=[];output.push(gettext("Layer number")+": "+(layer.number+1));output.push(gettext("Layer height")+" (mm): "+layer.height);output.push(gettext("GCODE commands")+": "+layer.commands);if(layer.filament!==undefined){if(layer.filament.length===1){output.push(gettext("Filament")+": "+
-layer.filament[0].toFixed(2)+"mm");}else{for(var i=0;i
"));if(self.layerCommandSlider!==undefined){self.layerCommandSlider.slider("enable");self.layerCommandSlider.slider("setMax",layer.commands-1);self.layerCommandSlider.slider("setValue",[0,layer.commands-1]);self.layerDownEnabled(layer.number>0);self.layerUpEnabled(layer.number0){if(errorList){errorList.innerHTML="";}
-console.log("Initialization failed: unsupported browser.");return false;}
-if(!Modernizr.webgl&&GCODE.renderer3d){warnings.push("Your browser doesn't seem to support HTML5 Web GL, 3d mode is not recommended, going to be SLOW! ");GCODE.renderer3d.setOption({rendererType:"canvas"});}
-if(warnings.length>0){if(errorList){errorList.innerHTML="";}
-console.log("Initialization succeeded with warnings.",warnings);}
-return true;};var setOptions=function(options){if(!options)return;for(var opt in options){if(options[opt]===undefined)continue;if(options.hasOwnProperty(opt)){uiOptions[opt]=options[opt];}}};return{worker:undefined,init:function(options){if(options)setOptions(options);if(!options.container){return false;}
-var capabilitiesResult=checkCapabilities();if(!capabilitiesResult){return false;}
-setProgress("",0);this.worker=new Worker(GCODE_WORKER);this.worker.addEventListener("message",processMessage,false);GCODE.renderer.setOption({container:options.container,bed:options.bed});GCODE.gCodeReader.setOption({toolOffsets:options.toolOffsets,bed:options.bed,bedZ:options.bedZ});GCODE.renderer.render(0,0);return true;},clear:function(){GCODE.gCodeReader.clear();GCODE.renderer.clear();setProgress("",0);if(uiOptions["onLayerSelected"]){uiOptions.onLayerSelected();}
-if(uiOptions["onModelLoaded"]){uiOptions.onModelLoaded();}},resetViewport:function(){GCODE.renderer.resetViewport();},updateLayerInfo:function(layerNum){switchLayer(layerNum,true);},updateOptions:function(options){setOptions(options.ui);if(options.reader){GCODE.gCodeReader.setOption(options.reader);}
-if(options.renderer){GCODE.renderer.setOption(options.renderer);}},changeSelectedLayer:function(newLayerNum){switchLayer(newLayerNum);},changeSelectedCommands:function(layerNum,first,last){switchCommands(layerNum,first,last);}};})();
-;
-
-// source: plugin/gcodeviewer/js/viewer/reader.js
-GCODE.gCodeReader=(function(){var gcode,lines;var max={x:undefined,y:undefined,z:undefined};var min={x:undefined,y:undefined,z:undefined};var modelSize={x:undefined,y:undefined,z:undefined};var boundingBox={minX:undefined,maxX:undefined,minY:undefined,maxY:undefined,minZ:undefined,maxZ:undefined};var filamentByLayer={};var printTimeByLayer;var totalFilament=0;var printTime=0;var speeds={};var speedsByLayer={};var gCodeOptions={sortLayers:false,purgeEmptyLayers:true,analyzeModel:false,toolOffsets:[{x:0,y:0}],bed:{x:undefined,y:undefined,r:undefined,circular:undefined,centeredOrigin:undefined},ignoreOutsideBed:false,g90InfluencesExtruder:false,bedZ:0,alwaysCompress:false,compressionSizeThreshold:0,forceCompression:false};var model=[];var emptyLayers=[];var percentageByLayer=[];var rendererModel=undefined;var rendererEmptyLayers=undefined;var rendererPercentageByLayer=undefined;var layerPercentageLookup=[];var cachedLayer=undefined;var cachedCmd=undefined;var prepareGCode=function(totalSize){if(!lines)return;gcode=[];var i,byteCount;byteCount=0;for(i=0;ikey)
-return middle;if(layerPercentageLookup[middle][0]>key){upper=middle-1;}else{lower=middle+1;}}
-return lower;}
-function searchInCmds(layer,lower,upper,key){var cmds=GCODE.renderer.getLayer(layer);while(lowerkey))
-return middle;if(cmds[middle].percentage>key){upper=middle-1;}else{lower=middle+1;}}
-return lower;}
-if(rendererModel===undefined)return undefined;if(key==null)return{layer:cachedLayer,cmd:cachedCmd};var layer=searchInLayers(0,rendererModel.length-1,key);var cmds=GCODE.renderer.getLayer(layer);if(cmds===undefined)return undefined;var cmd=searchInCmds(layer,0,cmds.length-1,key);cachedLayer=layer;cachedCmd=cmd;return{layer:layer,cmd:cmd};};var cleanModel=function(m){if(!m)return[];var result=[];rendererEmptyLayers=[];rendererPercentageByLayer=[];for(var i=0;i0){for(var i=0;i0&&gCodeOptions["compressionSizeThreshold"]<=reader.size);GCODE.ui.worker.postMessage({cmd:"downloadAndParseGCode",msg:{url:reader.url,path:reader.path,skipUntil:reader.skipUntil,options:{firstReport:5,toolOffsets:gCodeOptions["toolOffsets"],bed:gCodeOptions["bed"],ignoreOutsideBed:gCodeOptions["ignoreOutsideBed"],g90InfluencesExtruder:gCodeOptions["g90InfluencesExtruder"],bedZ:gCodeOptions["bedZ"],compress:mustCompress}}});},setOption:function(options){var dirty=false;_.forOwn(options,function(value,key){if(value===undefined)return;dirty=dirty||gCodeOptions[key]!==value;gCodeOptions[key]=value;});if(dirty){if(model&&model.length>0)this.passDataToRenderer();}},passDataToRenderer:function(){rendererModel=cleanModel(model);rebuildLayerPercentageLookup(rendererModel);GCODE.renderer.doRender(rendererModel,0);return rendererModel;},processLayersFromWorker:function(msg){for(var i=0;i0){drawLayer(layerNumStore-1,0,GCODE.renderer.getLayerNumSegments(layerNumStore-1),true);}
-drawLayer(layerNumStore,progressStore.from,progressStore.to);}else{console.log("Got request to render non-existent layer");}
-cleanCache(layerNumStore);}};function getLayerBounds(layer){if(!model||!model[layer])return;var cmds=getLayer(layer);var firstExtrusion;var i;var factorIn=function(cmd){return cmd&&cmd.extrude&&(cmd.x!==undefined||cmd.y!==undefined);};for(i=0;i=angle&&(eA<=angle||eA>sA))||(sA<=angle&&eA<=angle&&eA>sA));};if(intersectsAngle(startAngle,endAngle,deg0)){maxX=Math.max(maxX,arc.x+arc.r);}
-if(intersectsAngle(startAngle,endAngle,deg90)){maxY=Math.max(maxY,arc.y+arc.r);}
-if(intersectsAngle(startAngle,endAngle,deg180)){minX=Math.min(minX,arc.x-arc.r);}
-if(intersectsAngle(startAngle,endAngle,deg270)){minY=Math.min(minY,arc.y-arc.r);}}}}
-return{minX:minX,maxX:maxX,minY:minY,maxY:maxY};}
-function getArcParams(cmd){var x=cmd.x!==undefined?cmd.x:cmd.prevX;var y=cmd.y!==undefined?cmd.y:cmd.prevY;var centerX=cmd.prevX+cmd.i;var centerY=cmd.prevY+cmd.j;return{x:centerX,y:centerY,r:Math.sqrt(cmd.i*cmd.i+cmd.j*cmd.j),startAngle:Math.atan2(cmd.prevY-centerY,cmd.prevX-centerX),endAngle:Math.atan2(y-centerY,x-centerX),startX:cmd.prevX,startY:cmd.prevY,endX:x,endY:y};}
-function trackTransforms(ctx){var svg=document.createElementNS("http://www.w3.org/2000/svg","svg");var xform=svg.createSVGMatrix();ctx.getTransform=function(){return xform;};var savedTransforms=[];var save=ctx.save;ctx.save=function(){savedTransforms.push(xform.translate(0,0));return save.call(ctx);};var restore=ctx.restore;ctx.restore=function(){xform=savedTransforms.pop();viewportChanged=true;return restore.call(ctx);};var scale=ctx.scale;ctx.scale=function(sx,sy){xform=xform.scaleNonUniform(sx,sy);viewportChanged=true;return scale.call(ctx,sx,sy);};var rotate=ctx.rotate;ctx.rotate=function(radians){xform=xform.rotate((radians*180)/Math.PI);viewportChanged=true;return rotate.call(ctx,radians);};var translate=ctx.translate;ctx.translate=function(dx,dy){xform=xform.translate(dx,dy);viewportChanged=true;return translate.call(ctx,dx,dy);};var transform=ctx.transform;ctx.transform=function(a,b,c,d,e,f){var m2=svg.createSVGMatrix();m2.a=a;m2.b=b;m2.c=c;m2.d=d;m2.e=e;m2.f=f;xform=xform.multiply(m2);viewportChanged=true;return transform.call(ctx,a,b,c,d,e,f);};var setTransform=ctx.setTransform;ctx.setTransform=function(a,b,c,d,e,f){xform.a=a;xform.b=b;xform.c=c;xform.d=d;xform.e=e;xform.f=f;viewportChanged=true;return setTransform.call(ctx,a,b,c,d,e,f);};var pt=svg.createSVGPoint();ctx.transformedPoint=function(x,y){pt.x=x;pt.y=y;return pt.matrixTransform(xform.inverse());};}
-var bezierArc=function(x,y,radius,startAngle,endAngle,anticlockwise){var signedLength;var tau=2*Math.PI;if(!anticlockwise&&endAngle-startAngle>=tau){signedLength=tau;}else if(anticlockwise&&startAngle-endAngle>=tau){signedLength=-tau;}else{var delta=endAngle-startAngle;signedLength=delta-tau*Math.floor(delta/tau);if(Math.abs(delta)>1e-12&&signedLength<1e-12)signedLength=tau;if(anticlockwise&&signedLength>0)signedLength=signedLength-tau;}
-var minCurves=Math.ceil(Math.abs(signedLength)/(Math.PI/2));var numCurves=Math.ceil(Math.max(minCurves,Math.sqrt(radius)));var cpRadius=radius*(2-Math.cos(signedLength/(numCurves*2)));var step=signedLength/numCurves;this.lineTo(x+radius*Math.cos(startAngle),y+radius*Math.sin(startAngle));for(var i=0,a=startAngle+step,a2=startAngle+step/2;i-1){if(renderOptions["chromeArcFix"]){ctx.arc=bezierArc;log.info("Chrome Arc Fix enabled");}else{ctx.arc=ctx.origArc;log.info("Chrome Arc Fix disabled");}}};var startCanvas=function(){var jqueryCanvas=$(renderOptions["container"]);canvas=jqueryCanvas[0];ctx=canvas.getContext("2d");applyContextPatches();canvas.style.height=canvas.height+"px";canvas.style.width=canvas.width+"px";canvas.height=canvas.height*pixelRatio;canvas.width=canvas.width*pixelRatio;ctxHeight=canvas.height;ctxWidth=canvas.width;lastX=ctxWidth/2;lastY=ctxHeight/2;ctx.lineWidth=2*lineWidthFactor;ctx.lineCap="round";trackTransforms(ctx);canvas.addEventListener("mousedown",function(event){document.body.style.mozUserSelect=document.body.style.webkitUserSelect=document.body.style.userSelect="none";lastX=(event.offsetX||event.pageX-canvas.offsetLeft)*pixelRatio;lastY=(event.offsetY||event.pageY-canvas.offsetTop)*pixelRatio;var pt=ctx.transformedPoint(lastX,lastY);if(!renderOptions["onDragStart"]||renderOptions["onDragStart"](pt)!==false)
-dragStart=pt;},false);canvas.addEventListener("mousemove",function(event){lastX=(event.offsetX||event.pageX-canvas.offsetLeft)*pixelRatio;lastY=(event.offsetY||event.pageY-canvas.offsetTop)*pixelRatio;if(dragStart!==undefined){var pt=ctx.transformedPoint(lastX,lastY);if(renderOptions["onDrag"]&&renderOptions["onDrag"](pt)===false)
-return;ctx.translate(pt.x-dragStart.x,pt.y-dragStart.y);reRender();renderOptions["centerViewport"]=false;renderOptions["zoomInOnModel"]=false;renderOptions["zoomInOnBed"]=false;offsetModelX=0;offsetModelY=0;offsetBedX=0;offsetBedY=0;scaleX=1;scaleY=1;if(renderOptions["onInternalOptionChange"]!==undefined){renderOptions["onInternalOptionChange"]({centerViewport:false,moveModel:false,zoomInOnModel:false,zoomInOnBed:false});}}},false);canvas.addEventListener("mouseup",function(event){dragStart=undefined;if(renderOptions["onDragStop"]){var x=(event.offsetX||event.pageX-canvas.offsetLeft)*pixelRatio;var y=(event.offsetY||event.pageY-canvas.offsetTop)*pixelRatio;renderOptions["onDragStop"](ctx.transformedPoint(x,y));}},false);var zoom=function(clicks){var pt=ctx.transformedPoint(lastX,lastY);ctx.translate(pt.x,pt.y);var factor=Math.pow(scaleFactor,clicks);ctx.scale(factor,factor);ctx.translate(-pt.x,-pt.y);reRender();renderOptions["zoomInOnModel"]=false;renderOptions["zoomInOnBed"]=false;offsetModelX=0;offsetModelY=0;offsetBedX=0;offsetBedY=0;scaleX=1;scaleY=1;if(renderOptions["onInternalOptionChange"]!==undefined){renderOptions["onInternalOptionChange"]({zoomInOnModel:false,zoomInOnBed:false});}};var handleScroll=function(event){var delta;if(event.detail<0||event.wheelDelta>0){delta=zoomFactorDelta;}else{delta=-1*zoomFactorDelta;}
-if(delta)zoom(delta);return event.preventDefault()&&false;};canvas.addEventListener("DOMMouseScroll",handleScroll,false);canvas.addEventListener("mousewheel",handleScroll,false);};var drawGrid=function(){ctx.translate(offsetBedX,offsetBedY);if(renderOptions["bed"]["circular"]){drawCircularGrid();}else{drawRectangularGrid();}
-ctx.translate(-offsetBedX,-offsetBedY);};var drawRectangularGrid=function(){var x,y;var width=renderOptions["bed"]["x"];var height=renderOptions["bed"]["y"];var minX,maxX,minY,maxY;if(renderOptions["bed"]["centeredOrigin"]){var halfWidth=width/2;var halfHeight=height/2;minX=-halfWidth;maxX=halfWidth;minY=-halfHeight;maxY=halfHeight;}else{minX=0;maxX=width;minY=0;maxY=height;}
-ctx.beginPath();ctx.strokeStyle=renderOptions["colorGrid"];ctx.fillStyle="#ffffff";ctx.lineWidth=2*lineWidthFactor;ctx.rect(minX,minY,width,height);ctx.moveTo(minX,0);ctx.lineTo(maxX,0);ctx.moveTo(0,minY);ctx.lineTo(0,maxY);ctx.fill();ctx.stroke();ctx.beginPath();ctx.circle(0,0,2);ctx.stroke();ctx.strokeStyle=renderOptions["colorGrid"];var gridline=0;for(x=0;x<=maxX;x+=gridStep){ctx.beginPath();if(gridline%5===0){ctx.lineWidth=1.5*lineWidthFactor;}else{ctx.lineWidth=lineWidthFactor;}
-gridline+=1;ctx.moveTo(x,minY);ctx.lineTo(x,maxY);if(renderOptions["bed"]["centeredOrigin"]){ctx.moveTo(-1*x,minY);ctx.lineTo(-1*x,maxY);}
-ctx.stroke();}
-gridline=0;for(y=0;y<=maxY;y+=gridStep){ctx.beginPath();if(gridline%5===0){ctx.lineWidth=1.5*lineWidthFactor;}else{ctx.lineWidth=lineWidthFactor;}
-gridline+=1;ctx.moveTo(minX,y);ctx.lineTo(maxX,y);if(renderOptions["bed"]["centeredOrigin"]){ctx.moveTo(minX,-1*y);ctx.lineTo(maxX,-1*y);}
-ctx.stroke();}};var drawCircularGrid=function(){var i;ctx.strokeStyle=renderOptions["colorGrid"];ctx.fillStyle="#ffffff";ctx.lineWidth=2*lineWidthFactor;ctx.beginPath();var r=renderOptions["bed"]["r"];ctx.circle(0,0,r);ctx.moveTo(-1*r,0);ctx.lineTo(r,0);ctx.moveTo(0,r);ctx.lineTo(0,-1*r);ctx.fill();ctx.stroke();ctx.beginPath();ctx.circle(0,0,2);ctx.stroke();ctx.strokeStyle=renderOptions["colorGrid"];ctx.lineWidth=lineWidthFactor;ctx.beginPath();for(i=0;i<=r;i+=gridStep){var x=i;var y=Math.sqrt(r*r-x*x);ctx.moveTo(x,-1*y);ctx.lineTo(x,y);ctx.moveTo(y,-1*x);ctx.lineTo(-1*y,-1*x);ctx.moveTo(-1*x,-1*y);ctx.lineTo(-1*x,y);ctx.moveTo(y,x);ctx.lineTo(-1*y,x);}
-ctx.stroke();};var drawBoundingBox=function(layerNum){if(!modelInfo)return;var minX,minY,width,height;var draw=function(x,y,w,h,c){ctx.beginPath();ctx.strokeStyle=c;ctx.setLineDash([2,5]);ctx.rect(x,y,w,h);ctx.stroke();};if(renderOptions["showFullSize"]){minX=modelInfo.min.x;minY=modelInfo.min.y;width=modelInfo.modelSize.x;height=modelInfo.modelSize.y;draw(minX,minY,width,height,"#0000ff");}
-if(renderOptions["showBoundingBox"]){minX=modelInfo.boundingBox.minX;minY=modelInfo.boundingBox.minY;width=modelInfo.boundingBox.maxX-minX;height=modelInfo.boundingBox.maxY-minY;draw(minX,minY,width,height,"#ff0000");}
-if(renderOptions["showLayerBoundingBox"]){var layerBounds=getLayerBounds(layerNum);if(layerBounds){minX=layerBounds.minX;minY=layerBounds.minY;width=layerBounds.maxX-minX;height=layerBounds.maxY-minY;draw(minX,minY,width,height,"#00ff00");}}
-ctx.setLineDash([1,0]);};var drawTriangle=function(centerX,centerY,length,up){var ax,bx,cx,ay,by,cy;var h=Math.sqrt(0.75*length*length)/2;ax=centerX-length/2;bx=ax+length;cx=centerX;if(up){ay=centerY-h;by=centerY-h;cy=centerY+h;}else{ay=centerY+h;by=centerY+h;cy=centerY-h;}
-var origLineJoin=ctx.lineJoin;ctx.lineJoin="miter";ctx.beginPath();ctx.moveTo(ax,ay);ctx.lineTo(bx,by);ctx.moveTo(bx,by);ctx.lineTo(cx,cy);ctx.lineTo(ax,ay);ctx.stroke();ctx.fill();ctx.lineJoin=origLineJoin;};var drawCross=function(centerX,centerY,size){var x1,y1,x2,y2;var half=size/2;x1=centerX-half;x2=centerX+half;y1=centerY-half;y2=centerY+half;ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.moveTo(x1,y2);ctx.lineTo(x2,y1);ctx.stroke();};var drawDebugArc=function(arc,ccw){ctx.moveTo(arc.x,arc.y);ctx.lineTo(arc.startX,arc.startY);ctx.moveTo(arc.x,arc.y);ctx.lineTo(arc.endX,arc.endY);ctx.moveTo(arc.startX,arc.startY);ctx.lineTo(arc.endX,arc.endY);ctx.moveTo(arc.startX,arc.startY);ctx.arc(arc.x,arc.y,arc.r,arc.startAngle,arc.endAngle,ccw);};var drawLayer=function(layerNum,fromProgress,toProgress,isNotCurrentLayer){log.trace("Drawing layer "+
-layerNum+" from "+
-fromProgress+" to "+
-toProgress+" (current: "+
-!isNotCurrentLayer+")");var i;isNotCurrentLayer=isNotCurrentLayer!==undefined?isNotCurrentLayer:false;if(!model||!model[layerNum])return;var cmds=getLayer(layerNum);var x,y;if(cmds[0].prevX!==undefined&&cmds[0].prevY!==undefined){prevX=cmds[0].prevX;prevY=cmds[0].prevY;}else if(fromProgress>0){prevX=cmds[fromProgress-1].x;prevY=cmds[fromProgress-1].y;}else if(model[layerNum-1]){prevX=undefined;prevY=undefined;var prevModelLayer=getLayer(layerNum-1);for(i=prevModelLayer.length-1;i>=0;i--){if(prevX===undefined&&prevModelLayer[i].x!==undefined){prevX=prevModelLayer[i].x;if(prevY!==undefined)break;}
-if(prevY===undefined&&prevModelLayer[i].y!==undefined){prevY=prevModelLayer[i].y;if(prevX!==undefined)break;}}}
-if(prevX===undefined)prevX=0;if(prevY===undefined)prevY=0;var sizeRetractSpot=renderOptions["sizeRetractSpot"]*lineWidthFactor*2;var sizeSegmentStart=renderOptions["sizeSegmentStart"]*lineWidthFactor*2;var alpha=(renderOptions["showNextLayer"]||renderOptions["showCurrentLayer"]||renderOptions["showPreviousLayer"])&&isNotCurrentLayer?0.3:1.0;var colorLine={};var colorMove={};var colorRetract={};var colorRestart={};var colorSegmentStart={};function getColorLineForTool(tool){var rv=colorLine[tool];if(rv===undefined){var lineColor=renderOptions["colorLine"][tool];if(lineColor===undefined)lineColor=renderOptions["colorLine"][0];var shade=tool*0.15;rv=colorLine[tool]=pusher.color(lineColor).shade(shade).alpha(alpha).html();}
-return rv;}
-function getColorMoveForTool(tool){var rv=colorMove[tool];if(rv===undefined){var shade=tool*0.15;rv=colorMove[tool]=pusher.color(renderOptions["colorMove"]).shade(shade).alpha(alpha).html();}
-return rv;}
-function getColorRetractForTool(tool){var rv=colorRetract[tool];if(rv===undefined){var shade=tool*0.15;rv=colorRetract[tool]=pusher.color(renderOptions["colorRetract"]).shade(shade).alpha(alpha).html();}
-return rv;}
-function getColorRestartForTool(tool){var rv=colorRestart[tool];if(rv===undefined){var shade=tool*0.15;rv=colorRestart[tool]=pusher.color(renderOptions["colorRestart"]).shade(shade).alpha(alpha).html();}
-return rv;}
-function getColorSegmentStartForTool(tool){var rv=colorSegmentStart[tool];if(rv===undefined){var shade=tool*0.15;rv=colorSegmentStart[tool]=pusher.color(renderOptions["colorSegmentStart"]).shade(shade).alpha(alpha).html();}
-return rv;}
-var prevPathType="fill";function strokePathIfNeeded(newPathType,strokeStyle){if(newPathType!==prevPathType||newPathType==="fill"){if(prevPathType!=="fill"){ctx.stroke();}
-prevPathType=newPathType;ctx.beginPath();if(newPathType!=="fill"){ctx.strokeStyle=strokeStyle;ctx.moveTo(prevX,prevY);}}}
-ctx.lineJoin="round";for(i=fromProgress;i<=toProgress;i++){if(typeof cmds[i]==="undefined")continue;var cmd=cmds[i];if(cmd.prevX!==undefined&&cmd.prevY!==undefined){prevX=cmd.prevX;prevY=cmd.prevY;}
-if(cmd.x===undefined||isNaN(cmd.x)){x=prevX;}else{x=cmd.x;}
-if(cmd.y===undefined||isNaN(cmd.y)){y=prevY;}else{y=cmd.y;}
-var tool=cmd.tool||0;if(!cmd.extrude&&!cmd.noMove){if(cmd.retract==-1){if(renderOptions["showRetracts"]&&!isNotCurrentLayer){strokePathIfNeeded("fill");ctx.fillStyle=getColorRetractForTool(tool);ctx.strokeStyle=ctx.fillStyle;drawTriangle(prevX,prevY,sizeRetractSpot,true);}}
-strokePathIfNeeded("move",getColorMoveForTool(tool));if(renderOptions["showMoves"]&&!isNotCurrentLayer){ctx.lineWidth=lineWidthFactor;if(cmd.direction!==undefined&&cmd.direction!==0){var arc=getArcParams(cmd);var ccw=cmd.direction<0;ctx.arc(arc.x,arc.y,arc.r,arc.startAngle,arc.endAngle,ccw);}else{ctx.lineTo(x,y);}}}else if(cmd.extrude){if(cmd.retract==0){strokePathIfNeeded("extrude",getColorLineForTool(tool));ctx.lineWidth=renderOptions["extrusionWidth"]*lineWidthFactor;if(cmd.direction!==undefined&&cmd.direction!==0){var arc=getArcParams(cmd);var ccw=cmd.direction<0;if(renderOptions["showDebugArcs"]&&!isNotCurrentLayer){strokePathIfNeeded("debugarc","#ff0000");drawDebugArc(arc,ccw);strokePathIfNeeded("extrude",getColorLineForTool(tool));}
-ctx.arc(arc.x,arc.y,arc.r,arc.startAngle,arc.endAngle,ccw);}else{ctx.lineTo(x,y);}}else{if(renderOptions["showRetracts"]&&!isNotCurrentLayer){strokePathIfNeeded("fill");ctx.fillStyle=getColorRestartForTool(tool);ctx.strokeStyle=ctx.fillStyle;drawTriangle(prevX,prevY,sizeRetractSpot,false);}}
-if(renderOptions["showSegmentStarts"]&&!isNotCurrentLayer){strokePathIfNeeded("fill");ctx.strokeStyle=getColorSegmentStartForTool(tool);drawCross(x,y,sizeSegmentStart);}}
-prevX=x;prevY=y;}
-if(prevPathType!="fill"){ctx.stroke();}
-if(renderOptions["showHead"]&&!isNotCurrentLayer){var sizeHeadSpot=renderOptions["sizeHeadSpot"]*lineWidthFactor+lineWidthFactor/2;var shade=tool*0.15;ctx.fillStyle=pusher.color(renderOptions["colorHead"]).shade(shade).alpha(alpha).html();ctx.beginPath();ctx.circle(prevX,prevY,sizeHeadSpot);ctx.fill();}};var applyOffsets=function(layerNum){var canvasCenter;var layerBounds;if(ctx)ctx.translate(-offsetModelX,-offsetModelY);if(renderOptions["centerViewport"]||renderOptions["zoomInOnModel"]){canvasCenter=ctx.transformedPoint(canvas.width/2,canvas.height/2);layerBounds=getLayerBounds(layerNum);if(layerBounds){offsetModelX=canvasCenter.x-(layerBounds.minX+layerBounds.maxX)/2;offsetModelY=canvasCenter.y-(layerBounds.minY+layerBounds.maxY)/2;}else{offsetModelX=0;offsetModelY=0;}
-offsetBedX=0;offsetBedY=0;}else if(renderOptions["moveModel"]){layerBounds=getLayerBounds(layerNum);if(layerBounds){offsetModelX=renderOptions["bed"]["x"]/2-
-(layerBounds.minX+layerBounds.maxX)/2;offsetModelY=renderOptions["bed"]["y"]/2-
-(layerBounds.minY+layerBounds.maxY)/2;offsetBedX=-1*(renderOptions["bed"]["x"]/2-
-(layerBounds.minX+layerBounds.maxX)/2);offsetBedY=-1*(renderOptions["bed"]["y"]/2-
-(layerBounds.minY+layerBounds.maxY)/2);}}else{offsetModelX=0;offsetModelY=0;offsetBedX=0;offsetBedY=0;}
-if(ctx)ctx.translate(offsetModelX,offsetModelY);};var applyZoom=function(layerNum){var pt=ctx.transformedPoint(canvas.width/2,canvas.height/2);var transform=ctx.getTransform();if(scaleX&&scaleY&&transform.a&&transform.d){ctx.translate(pt.x,pt.y);ctx.scale(1/scaleX,1/scaleY);ctx.translate(-pt.x,-pt.y);transform=ctx.getTransform();}
-if(renderOptions["zoomInOnModel"]){var layerBounds=getLayerBounds(layerNum);if(layerBounds){var width=Math.max(layerBounds.maxX-layerBounds.minX,renderOptions["extrusionWidth"]*50);var length=Math.max(layerBounds.maxY-layerBounds.minY,renderOptions["extrusionWidth"]*50);var scaleF=width>length?(canvas.width-10)/width:(canvas.height-10)/length;if(transform.a&&transform.d){scaleX=(scaleF/transform.a)*(renderOptions["invertAxes"]["x"]?-1:1);scaleY=(scaleF/transform.d)*(renderOptions["invertAxes"]["y"]?1:-1);ctx.translate(pt.x,pt.y);ctx.scale(scaleX,scaleY);ctx.translate(-pt.x,-pt.y);}}}};var applyInversion=function(){var width=canvas.width-10;var height=canvas.height-10;if(currentInvertX||currentInvertY){ctx.scale(currentInvertX?-1:1,currentInvertY?-1:1);ctx.translate(currentInvertX?-width:0,currentInvertY?height:0);}
-var invertX=renderOptions["invertAxes"]["x"];var invertY=renderOptions["invertAxes"]["y"];if(invertX||invertY){ctx.translate(invertX?width:0,invertY?-height:0);ctx.scale(invertX?-1:1,invertY?-1:1);}
-currentInvertX=invertX;currentInvertY=invertY;};var resetViewport=function(){ctx.setTransform(1,0,0,1,0,0);ctx.scale(1,-1);var bedWidth=renderOptions["bed"]["x"];var bedHeight=renderOptions["bed"]["y"];if(renderOptions["bed"]["circular"]){bedWidth=bedHeight=renderOptions["bed"]["r"]*2;}
-var viewportRatio=Math.min((canvas.width-10)/bedWidth,(canvas.height-10)/bedHeight);var translationX,translationY;if(renderOptions["bed"]["circular"]||renderOptions["bed"]["centeredOrigin"]){translationX=canvas.width/2;translationY=canvas.height/2;}else{translationX=(canvas.width-bedWidth*viewportRatio)/2;translationY=bedHeight*viewportRatio+
-(canvas.height-bedHeight*viewportRatio)/2;}
-ctx.translate(translationX,-translationY);ctx.scale(viewportRatio,viewportRatio);lineWidthFactor=1/viewportRatio;offsetModelX=0;offsetModelY=0;offsetBedX=0;offsetBedY=0;};return{init:function(){startCanvas();resetViewport();initialized=true;},setOption:function(options){var mustRefresh=false;var mustReset=false;var mustReapplyPatches=false;var dirty=false;for(var opt in options){if(!renderOptions.hasOwnProperty(opt)||!options.hasOwnProperty(opt))
-continue;if(options[opt]===undefined)continue;if(renderOptions[opt]==options[opt])continue;dirty=true;renderOptions[opt]=options[opt];if($.inArray(opt,["moveModel","centerViewport","zoomInOnModel","bed","invertAxes","onViewportChange","chromeArcFix"])>-1){mustRefresh=true;}
-if($.inArray(opt,["bed","onViewportChange"])>-1){mustReset=true;}
-if($.inArray(opt,["chromeArcFix"])>-1){mustReapplyPatches=true;}}
-if(!dirty)return;if(initialized){if(mustReset){resetViewport();}
-if(mustReapplyPatches){applyContextPatches();}
-if(mustRefresh){this.refresh();}else{reRender();}}},getOptions:function(){return renderOptions;},debugGetModel:function(){return model;},render:function(layerNum,fromProgress,toProgress){if(!initialized)this.init();layerNumStore=layerNum;progressStore.from=fromProgress;progressStore.to=toProgress;reRender();},getModelNumLayers:function(){return model?model.length:1;},getLayerNumSegments:function(layer){if(model){return model[layer]?getLayer(layer).length:1;}else{return 1;}},getLayer:function(layer){return getLayer(layer);},clear:function(){offsetModelX=0;offsetModelY=0;offsetBedX=0;offsetBedY=0;scaleX=1;scaleY=1;speeds=[];speedsByLayer={};modelInfo=undefined;layerCache=[];this.doRender([],0);},doRender:function(mdl,layerNum){model=mdl;modelInfo=undefined;prevX=0;prevY=0;if(!initialized)this.init();var toProgress=1;if(model&&model.length){modelInfo=GCODE.gCodeReader.getModelInfo();speeds=modelInfo.speeds;speedsByLayer=modelInfo.speedsByLayer;if(model[layerNum]){toProgress=getLayer(layerNum).length;}}
-applyInversion();scaleX=1;scaleY=1;this.render(layerNum,0,toProgress);},refresh:function(layerNum){if(layerNum===undefined)layerNum=layerNumStore;this.doRender(model,layerNum);},resetViewport:function(){resetViewport();reRender();},getZ:function(layerNum){if(!model||!model[layerNum]){return"-1";}
-var cmds=getLayer(layerNum);for(var i=0;i=0){buf[len]=0;}}
-var STORED_BLOCK=0;var STATIC_TREES=1;var DYN_TREES=2;var MIN_MATCH$1=3;var MAX_MATCH$1=258;var LENGTH_CODES$1=29;var LITERALS$1=256;var L_CODES$1=LITERALS$1+1+LENGTH_CODES$1;var D_CODES$1=30;var BL_CODES$1=19;var HEAP_SIZE$1=2*L_CODES$1+1;var MAX_BITS$1=15;var Buf_size=16;var MAX_BL_BITS=7;var END_BLOCK=256;var REP_3_6=16;var REPZ_3_10=17;var REPZ_11_138=18;var extra_lbits=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);var extra_dbits=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);var extra_blbits=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);var bl_order=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var DIST_CODE_LEN=512;var static_ltree=new Array((L_CODES$1+2)*2);zero$1(static_ltree);var static_dtree=new Array(D_CODES$1*2);zero$1(static_dtree);var _dist_code=new Array(DIST_CODE_LEN);zero$1(_dist_code);var _length_code=new Array(MAX_MATCH$1-MIN_MATCH$1+1);zero$1(_length_code);var base_length=new Array(LENGTH_CODES$1);zero$1(base_length);var base_dist=new Array(D_CODES$1);zero$1(base_dist);function StaticTreeDesc(static_tree,extra_bits,extra_base,elems,max_length){this.static_tree=static_tree;this.extra_bits=extra_bits;this.extra_base=extra_base;this.elems=elems;this.max_length=max_length;this.has_stree=static_tree&&static_tree.length;}
-var static_l_desc;var static_d_desc;var static_bl_desc;function TreeDesc(dyn_tree,stat_desc){this.dyn_tree=dyn_tree;this.max_code=0;this.stat_desc=stat_desc;}
-var d_code=function d_code(dist){return dist<256?_dist_code[dist]:_dist_code[256+(dist>>>7)];};var put_short=function put_short(s,w){s.pending_buf[s.pending++]=w&0xff;s.pending_buf[s.pending++]=(w>>>8)&0xff;};var send_bits=function send_bits(s,value,length){if(s.bi_valid>Buf_size-length){s.bi_buf|=(value<>(Buf_size-s.bi_valid);s.bi_valid+=length-Buf_size;}else{s.bi_buf|=(value<>>=1;res<<=1;}while(--len>0);return res>>>1;};var bi_flush=function bi_flush(s){if(s.bi_valid===16){put_short(s,s.bi_buf);s.bi_buf=0;s.bi_valid=0;}else if(s.bi_valid>=8){s.pending_buf[s.pending++]=s.bi_buf&0xff;s.bi_buf>>=8;s.bi_valid-=8;}};var gen_bitlen=function gen_bitlen(s,desc){var tree=desc.dyn_tree;var max_code=desc.max_code;var stree=desc.stat_desc.static_tree;var has_stree=desc.stat_desc.has_stree;var extra=desc.stat_desc.extra_bits;var base=desc.stat_desc.extra_base;var max_length=desc.stat_desc.max_length;var h;var n,m;var bits;var xbits;var f;var overflow=0;for(bits=0;bits<=MAX_BITS$1;bits++){s.bl_count[bits]=0;}
-tree[s.heap[s.heap_max]*2+1]=0;for(h=s.heap_max+1;hmax_length){bits=max_length;overflow++;}
-tree[n*2+1]=bits;if(n>max_code){continue;}
-s.bl_count[bits]++;xbits=0;if(n>=base){xbits=extra[n-base];}
-f=tree[n*2];s.opt_len+=f*(bits+xbits);if(has_stree){s.static_len+=f*(stree[n*2+1]+
-xbits);}}
-if(overflow===0){return;}
-do{bits=max_length-1;while(s.bl_count[bits]===0){bits--;}
-s.bl_count[bits]--;s.bl_count[bits+1]+=2;s.bl_count[max_length]--;overflow-=2;}while(overflow>0);for(bits=max_length;bits!==0;bits--){n=s.bl_count[bits];while(n!==0){m=s.heap[--h];if(m>max_code){continue;}
-if(tree[m*2+1]!==bits){s.opt_len+=(bits-tree[m*2+1])*tree[m*2];tree[m*2+1]=bits;}
-n--;}}};var gen_codes=function gen_codes(tree,max_code,bl_count){var next_code=new Array(MAX_BITS$1+1);var code=0;var bits;var n;for(bits=1;bits<=MAX_BITS$1;bits++){next_code[bits]=code=(code+bl_count[bits-1])<<1;}
-for(n=0;n<=max_code;n++){var len=tree[n*2+1];if(len===0){continue;}
-tree[n*2]=bi_reverse(next_code[len]++,len);}};var tr_static_init=function tr_static_init(){var n;var bits;var length;var code;var dist;var bl_count=new Array(MAX_BITS$1+1);length=0;for(code=0;code>=7;for(;code8){put_short(s,s.bi_buf);}else if(s.bi_valid>0){s.pending_buf[s.pending++]=s.bi_buf;}
-s.bi_buf=0;s.bi_valid=0;};var copy_block=function copy_block(s,buf,len,header){bi_windup(s);if(header){put_short(s,len);put_short(s,~len);}
-s.pending_buf.set(s.window.subarray(buf,buf+len),s.pending);s.pending+=len;};var smaller=function smaller(tree,n,m,depth){var _n2=n*2;var _m2=m*2;return(tree[_n2]>1;n>=1;n--){pqdownheap(s,tree,n);}
-node=elems;do{n=s.heap[1];s.heap[1]=s.heap[s.heap_len--];pqdownheap(s,tree,1);m=s.heap[1];s.heap[--s.heap_max]=n;s.heap[--s.heap_max]=m;tree[node*2]=tree[n*2]+
-tree[m*2];s.depth[node]=(s.depth[n]>=s.depth[m]?s.depth[n]:s.depth[m])+1;tree[n*2+1]=tree[m*2+1]=node;s.heap[1]=node++;pqdownheap(s,tree,1);}while(s.heap_len>=2);s.heap[--s.heap_max]=s.heap[1];gen_bitlen(s,desc);gen_codes(tree,max_code,s.bl_count);};var scan_tree=function scan_tree(s,tree,max_code){var n;var prevlen=-1;var curlen;var nextlen=tree[0*2+1];var count=0;var max_count=7;var min_count=4;if(nextlen===0){max_count=138;min_count=3;}
-tree[(max_code+1)*2+1]=0xffff;for(n=0;n<=max_code;n++){curlen=nextlen;nextlen=tree[(n+1)*2+1];if(++count=3;max_blindex--){if(s.bl_tree[bl_order[max_blindex]*2+1]!==0){break;}}
-s.opt_len+=3*(max_blindex+1)+5+5+4;return max_blindex;};var send_all_trees=function send_all_trees(s,lcodes,dcodes,blcodes){var rank;send_bits(s,lcodes-257,5);send_bits(s,dcodes-1,5);send_bits(s,blcodes-4,4);for(rank=0;rank>>=1){if(black_mask&1&&s.dyn_ltree[n*2]!==0){return Z_BINARY;}}
-if(s.dyn_ltree[9*2]!==0||s.dyn_ltree[10*2]!==0||s.dyn_ltree[13*2]!==0){return Z_TEXT;}
-for(n=32;n0){if(s.strm.data_type===Z_UNKNOWN$1){s.strm.data_type=detect_data_type(s);}
-build_tree(s,s.l_desc);build_tree(s,s.d_desc);max_blindex=build_bl_tree(s);opt_lenb=(s.opt_len+3+7)>>>3;static_lenb=(s.static_len+3+7)>>>3;if(static_lenb<=opt_lenb){opt_lenb=static_lenb;}}else{opt_lenb=static_lenb=stored_len+5;}
-if(stored_len+4<=opt_lenb&&buf!==-1){_tr_stored_block$1(s,buf,stored_len,last);}else if(s.strategy===Z_FIXED$1||static_lenb===opt_lenb){send_bits(s,(STATIC_TREES<<1)+(last?1:0),3);compress_block(s,static_ltree,static_dtree);}else{send_bits(s,(DYN_TREES<<1)+(last?1:0),3);send_all_trees(s,s.l_desc.max_code+1,s.d_desc.max_code+1,max_blindex+1);compress_block(s,s.dyn_ltree,s.dyn_dtree);}
-init_block(s);if(last){bi_windup(s);}};var _tr_tally$1=function _tr_tally(s,dist,lc){s.pending_buf[s.d_buf+s.last_lit*2]=(dist>>>8)&0xff;s.pending_buf[s.d_buf+s.last_lit*2+1]=dist&0xff;s.pending_buf[s.l_buf+s.last_lit]=lc&0xff;s.last_lit++;if(dist===0){s.dyn_ltree[lc*2]++;}else{s.matches++;dist--;s.dyn_ltree[(_length_code[lc]+LITERALS$1+1)*2]++;s.dyn_dtree[d_code(dist)*2]++;}
-return s.last_lit===s.lit_bufsize-1;};var _tr_init_1=_tr_init$1;var _tr_stored_block_1=_tr_stored_block$1;var _tr_flush_block_1=_tr_flush_block$1;var _tr_tally_1=_tr_tally$1;var _tr_align_1=_tr_align$1;var trees={_tr_init:_tr_init_1,_tr_stored_block:_tr_stored_block_1,_tr_flush_block:_tr_flush_block_1,_tr_tally:_tr_tally_1,_tr_align:_tr_align_1};var adler32=function adler32(adler,buf,len,pos){var s1=(adler&0xffff)|0,s2=((adler>>>16)&0xffff)|0,n=0;while(len!==0){n=len>2000?2000:len;len-=n;do{s1=(s1+buf[pos++])|0;s2=(s2+s1)|0;}while(--n);s1%=65521;s2%=65521;}
-return s1|(s2<<16)|0;};var adler32_1=adler32;var makeTable=function makeTable(){var c,table=[];for(var n=0;n<256;n++){c=n;for(var k=0;k<8;k++){c=c&1?0xedb88320^(c>>>1):c>>>1;}
-table[n]=c;}
-return table;};var crcTable=new Uint32Array(makeTable());var crc32=function crc32(crc,buf,len,pos){var t=crcTable;var end=pos+len;crc^=-1;for(var i=pos;i>>8)^t[(crc^buf[i])&0xff];}
-return crc^-1;};var crc32_1=crc32;var messages={"2":"need dictionary","1":"stream end","0":"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var constants$2={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};var _tr_init=trees._tr_init,_tr_stored_block=trees._tr_stored_block,_tr_flush_block=trees._tr_flush_block,_tr_tally=trees._tr_tally,_tr_align=trees._tr_align;var Z_NO_FLUSH$2=constants$2.Z_NO_FLUSH,Z_PARTIAL_FLUSH=constants$2.Z_PARTIAL_FLUSH,Z_FULL_FLUSH$1=constants$2.Z_FULL_FLUSH,Z_FINISH$3=constants$2.Z_FINISH,Z_BLOCK$1=constants$2.Z_BLOCK,Z_OK$3=constants$2.Z_OK,Z_STREAM_END$3=constants$2.Z_STREAM_END,Z_STREAM_ERROR$2=constants$2.Z_STREAM_ERROR,Z_DATA_ERROR$2=constants$2.Z_DATA_ERROR,Z_BUF_ERROR$1=constants$2.Z_BUF_ERROR,Z_DEFAULT_COMPRESSION$1=constants$2.Z_DEFAULT_COMPRESSION,Z_FILTERED=constants$2.Z_FILTERED,Z_HUFFMAN_ONLY=constants$2.Z_HUFFMAN_ONLY,Z_RLE=constants$2.Z_RLE,Z_FIXED=constants$2.Z_FIXED,Z_DEFAULT_STRATEGY$1=constants$2.Z_DEFAULT_STRATEGY,Z_UNKNOWN=constants$2.Z_UNKNOWN,Z_DEFLATED$2=constants$2.Z_DEFLATED;var MAX_MEM_LEVEL=9;var MAX_WBITS$1=15;var DEF_MEM_LEVEL=8;var LENGTH_CODES=29;var LITERALS=256;var L_CODES=LITERALS+1+LENGTH_CODES;var D_CODES=30;var BL_CODES=19;var HEAP_SIZE=2*L_CODES+1;var MAX_BITS=15;var MIN_MATCH=3;var MAX_MATCH=258;var MIN_LOOKAHEAD=MAX_MATCH+MIN_MATCH+1;var PRESET_DICT=0x20;var INIT_STATE=42;var EXTRA_STATE=69;var NAME_STATE=73;var COMMENT_STATE=91;var HCRC_STATE=103;var BUSY_STATE=113;var FINISH_STATE=666;var BS_NEED_MORE=1;var BS_BLOCK_DONE=2;var BS_FINISH_STARTED=3;var BS_FINISH_DONE=4;var OS_CODE=0x03;var err=function err(strm,errorCode){strm.msg=messages[errorCode];return errorCode;};var rank=function rank(f){return(f<<1)-(f>4?9:0);};var zero=function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}};var HASH_ZLIB=function HASH_ZLIB(s,prev,data){return((prev<strm.avail_out){len=strm.avail_out;}
-if(len===0){return;}
-strm.output.set(s.pending_buf.subarray(s.pending_out,s.pending_out+len),strm.next_out);strm.next_out+=len;s.pending_out+=len;strm.total_out+=len;strm.avail_out-=len;s.pending-=len;if(s.pending===0){s.pending_out=0;}};var flush_block_only=function flush_block_only(s,last){_tr_flush_block(s,s.block_start>=0?s.block_start:-1,s.strstart-s.block_start,last);s.block_start=s.strstart;flush_pending(s.strm);};var put_byte=function put_byte(s,b){s.pending_buf[s.pending++]=b;};var putShortMSB=function putShortMSB(s,b){s.pending_buf[s.pending++]=(b>>>8)&0xff;s.pending_buf[s.pending++]=b&0xff;};var read_buf=function read_buf(strm,buf,start,size){var len=strm.avail_in;if(len>size){len=size;}
-if(len===0){return 0;}
-strm.avail_in-=len;buf.set(strm.input.subarray(strm.next_in,strm.next_in+len),start);if(strm.state.wrap===1){strm.adler=adler32_1(strm.adler,buf,len,start);}else if(strm.state.wrap===2){strm.adler=crc32_1(strm.adler,buf,len,start);}
-strm.next_in+=len;strm.total_in+=len;return len;};var longest_match=function longest_match(s,cur_match){var chain_length=s.max_chain_length;var scan=s.strstart;var match;var len;var best_len=s.prev_length;var nice_match=s.nice_match;var limit=s.strstart>s.w_size-MIN_LOOKAHEAD?s.strstart-(s.w_size-MIN_LOOKAHEAD):0;var _win=s.window;var wmask=s.w_mask;var prev=s.prev;var strend=s.strstart+MAX_MATCH;var scan_end1=_win[scan+best_len-1];var scan_end=_win[scan+best_len];if(s.prev_length>=s.good_match){chain_length>>=2;}
-if(nice_match>s.lookahead){nice_match=s.lookahead;}
-do{match=cur_match;if(_win[match+best_len]!==scan_end||_win[match+best_len-1]!==scan_end1||_win[match]!==_win[scan]||_win[++match]!==_win[scan+1]){continue;}
-scan+=2;match++;do{}while(_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&scanbest_len){s.match_start=cur_match;best_len=len;if(len>=nice_match){break;}
-scan_end1=_win[scan+best_len-1];scan_end=_win[scan+best_len];}}while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!==0);if(best_len<=s.lookahead){return best_len;}
-return s.lookahead;};var fill_window=function fill_window(s){var _w_size=s.w_size;var p,n,m,more,str;do{more=s.window_size-s.lookahead-s.strstart;if(s.strstart>=_w_size+(_w_size-MIN_LOOKAHEAD)){s.window.set(s.window.subarray(_w_size,_w_size+_w_size),0);s.match_start-=_w_size;s.strstart-=_w_size;s.block_start-=_w_size;n=s.hash_size;p=n;do{m=s.head[--p];s.head[p]=m>=_w_size?m-_w_size:0;}while(--n);n=_w_size;p=n;do{m=s.prev[--p];s.prev[p]=m>=_w_size?m-_w_size:0;}while(--n);more+=_w_size;}
-if(s.strm.avail_in===0){break;}
-n=read_buf(s.strm,s.window,s.strstart+s.lookahead,more);s.lookahead+=n;if(s.lookahead+s.insert>=MIN_MATCH){str=s.strstart-s.insert;s.ins_h=s.window[str];s.ins_h=HASH(s,s.ins_h,s.window[str+1]);while(s.insert){s.ins_h=HASH(s,s.ins_h,s.window[str+MIN_MATCH-1]);s.prev[str&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=str;str++;s.insert--;if(s.lookahead+s.inserts.pending_buf_size-5){max_block_size=s.pending_buf_size-5;}
-for(;;){if(s.lookahead<=1){fill_window(s);if(s.lookahead===0&&flush===Z_NO_FLUSH$2){return BS_NEED_MORE;}
-if(s.lookahead===0){break;}}
-s.strstart+=s.lookahead;s.lookahead=0;var max_start=s.block_start+max_block_size;if(s.strstart===0||s.strstart>=max_start){s.lookahead=s.strstart-max_start;s.strstart=max_start;flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}
-if(s.strstart-s.block_start>=s.w_size-MIN_LOOKAHEAD){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}}
-s.insert=0;if(flush===Z_FINISH$3){flush_block_only(s,true);if(s.strm.avail_out===0){return BS_FINISH_STARTED;}
-return BS_FINISH_DONE;}
-if(s.strstart>s.block_start){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}
-return BS_NEED_MORE;};var deflate_fast=function deflate_fast(s,flush){var hash_head;var bflush;for(;;){if(s.lookahead=MIN_MATCH){s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]);hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=s.strstart;}
-if(hash_head!==0&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){s.match_length=longest_match(s,hash_head);}
-if(s.match_length>=MIN_MATCH){bflush=_tr_tally(s,s.strstart-s.match_start,s.match_length-MIN_MATCH);s.lookahead-=s.match_length;if(s.match_length<=s.max_lazy_match&&s.lookahead>=MIN_MATCH){s.match_length--;do{s.strstart++;s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]);hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=s.strstart;}while(--s.match_length!==0);s.strstart++;}else{s.strstart+=s.match_length;s.match_length=0;s.ins_h=s.window[s.strstart];s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+1]);}}else{bflush=_tr_tally(s,0,s.window[s.strstart]);s.lookahead--;s.strstart++;}
-if(bflush){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}}
-s.insert=s.strstart=MIN_MATCH){s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]);hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=s.strstart;}
-s.prev_length=s.match_length;s.prev_match=s.match_start;s.match_length=MIN_MATCH-1;if(hash_head!==0&&s.prev_length4096))){s.match_length=MIN_MATCH-1;}}
-if(s.prev_length>=MIN_MATCH&&s.match_length<=s.prev_length){max_insert=s.strstart+s.lookahead-MIN_MATCH;bflush=_tr_tally(s,s.strstart-1-s.prev_match,s.prev_length-MIN_MATCH);s.lookahead-=s.prev_length-1;s.prev_length-=2;do{if(++s.strstart<=max_insert){s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]);hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=s.strstart;}}while(--s.prev_length!==0);s.match_available=0;s.match_length=MIN_MATCH-1;s.strstart++;if(bflush){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}}else if(s.match_available){bflush=_tr_tally(s,0,s.window[s.strstart-1]);if(bflush){flush_block_only(s,false);}
-s.strstart++;s.lookahead--;if(s.strm.avail_out===0){return BS_NEED_MORE;}}else{s.match_available=1;s.strstart++;s.lookahead--;}}
-if(s.match_available){bflush=_tr_tally(s,0,s.window[s.strstart-1]);s.match_available=0;}
-s.insert=s.strstart=MIN_MATCH&&s.strstart>0){scan=s.strstart-1;prev=_win[scan];if(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]){strend=s.strstart+MAX_MATCH;do{}while(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&scans.lookahead){s.match_length=s.lookahead;}}}
-if(s.match_length>=MIN_MATCH){bflush=_tr_tally(s,1,s.match_length-MIN_MATCH);s.lookahead-=s.match_length;s.strstart+=s.match_length;s.match_length=0;}else{bflush=_tr_tally(s,0,s.window[s.strstart]);s.lookahead--;s.strstart++;}
-if(bflush){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}}
-s.insert=0;if(flush===Z_FINISH$3){flush_block_only(s,true);if(s.strm.avail_out===0){return BS_FINISH_STARTED;}
-return BS_FINISH_DONE;}
-if(s.last_lit){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}
-return BS_BLOCK_DONE;};var deflate_huff=function deflate_huff(s,flush){var bflush;for(;;){if(s.lookahead===0){fill_window(s);if(s.lookahead===0){if(flush===Z_NO_FLUSH$2){return BS_NEED_MORE;}
-break;}}
-s.match_length=0;bflush=_tr_tally(s,0,s.window[s.strstart]);s.lookahead--;s.strstart++;if(bflush){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}}
-s.insert=0;if(flush===Z_FINISH$3){flush_block_only(s,true);if(s.strm.avail_out===0){return BS_FINISH_STARTED;}
-return BS_FINISH_DONE;}
-if(s.last_lit){flush_block_only(s,false);if(s.strm.avail_out===0){return BS_NEED_MORE;}}
-return BS_BLOCK_DONE;};function Config(good_length,max_lazy,nice_length,max_chain,func){this.good_length=good_length;this.max_lazy=max_lazy;this.nice_length=nice_length;this.max_chain=max_chain;this.func=func;}
-var configuration_table=[new Config(0,0,0,0,deflate_stored),new Config(4,4,8,4,deflate_fast),new Config(4,5,16,8,deflate_fast),new Config(4,6,32,32,deflate_fast),new Config(4,4,16,16,deflate_slow),new Config(8,16,32,32,deflate_slow),new Config(8,16,128,128,deflate_slow),new Config(8,32,128,256,deflate_slow),new Config(32,128,258,1024,deflate_slow),new Config(32,258,258,4096,deflate_slow)];var lm_init=function lm_init(s){s.window_size=2*s.w_size;zero(s.head);s.max_lazy_match=configuration_table[s.level].max_lazy;s.good_match=configuration_table[s.level].good_length;s.nice_match=configuration_table[s.level].nice_length;s.max_chain_length=configuration_table[s.level].max_chain;s.strstart=0;s.block_start=0;s.lookahead=0;s.insert=0;s.match_length=s.prev_length=MIN_MATCH-1;s.match_available=0;s.ins_h=0;};function DeflateState(){this.strm=null;this.status=0;this.pending_buf=null;this.pending_buf_size=0;this.pending_out=0;this.pending=0;this.wrap=0;this.gzhead=null;this.gzindex=0;this.method=Z_DEFLATED$2;this.last_flush=-1;this.w_size=0;this.w_bits=0;this.w_mask=0;this.window=null;this.window_size=0;this.prev=null;this.head=null;this.ins_h=0;this.hash_size=0;this.hash_bits=0;this.hash_mask=0;this.hash_shift=0;this.block_start=0;this.match_length=0;this.prev_match=0;this.match_available=0;this.strstart=0;this.match_start=0;this.lookahead=0;this.prev_length=0;this.max_chain_length=0;this.max_lazy_match=0;this.level=0;this.strategy=0;this.good_match=0;this.nice_match=0;this.dyn_ltree=new Uint16Array(HEAP_SIZE*2);this.dyn_dtree=new Uint16Array((2*D_CODES+1)*2);this.bl_tree=new Uint16Array((2*BL_CODES+1)*2);zero(this.dyn_ltree);zero(this.dyn_dtree);zero(this.bl_tree);this.l_desc=null;this.d_desc=null;this.bl_desc=null;this.bl_count=new Uint16Array(MAX_BITS+1);this.heap=new Uint16Array(2*L_CODES+1);zero(this.heap);this.heap_len=0;this.heap_max=0;this.depth=new Uint16Array(2*L_CODES+1);zero(this.depth);this.l_buf=0;this.lit_bufsize=0;this.last_lit=0;this.d_buf=0;this.opt_len=0;this.static_len=0;this.matches=0;this.insert=0;this.bi_buf=0;this.bi_valid=0;}
-var deflateResetKeep=function deflateResetKeep(strm){if(!strm||!strm.state){return err(strm,Z_STREAM_ERROR$2);}
-strm.total_in=strm.total_out=0;strm.data_type=Z_UNKNOWN;var s=strm.state;s.pending=0;s.pending_out=0;if(s.wrap<0){s.wrap=-s.wrap;}
-s.status=s.wrap?INIT_STATE:BUSY_STATE;strm.adler=s.wrap===2?0:1;s.last_flush=Z_NO_FLUSH$2;_tr_init(s);return Z_OK$3;};var deflateReset=function deflateReset(strm){var ret=deflateResetKeep(strm);if(ret===Z_OK$3){lm_init(strm.state);}
-return ret;};var deflateSetHeader=function deflateSetHeader(strm,head){if(!strm||!strm.state){return Z_STREAM_ERROR$2;}
-if(strm.state.wrap!==2){return Z_STREAM_ERROR$2;}
-strm.state.gzhead=head;return Z_OK$3;};var deflateInit2=function deflateInit2(strm,level,method,windowBits,memLevel,strategy){if(!strm){return Z_STREAM_ERROR$2;}
-var wrap=1;if(level===Z_DEFAULT_COMPRESSION$1){level=6;}
-if(windowBits<0){wrap=0;windowBits=-windowBits;}else if(windowBits>15){wrap=2;windowBits-=16;}
-if(memLevel<1||memLevel>MAX_MEM_LEVEL||method!==Z_DEFLATED$2||windowBits<8||windowBits>15||level<0||level>9||strategy<0||strategy>Z_FIXED){return err(strm,Z_STREAM_ERROR$2);}
-if(windowBits===8){windowBits=9;}
-var s=new DeflateState();strm.state=s;s.strm=strm;s.wrap=wrap;s.gzhead=null;s.w_bits=windowBits;s.w_size=1<Z_BLOCK$1||flush<0){return strm?err(strm,Z_STREAM_ERROR$2):Z_STREAM_ERROR$2;}
-var s=strm.state;if(!strm.output||(!strm.input&&strm.avail_in!==0)||(s.status===FINISH_STATE&&flush!==Z_FINISH$3)){return err(strm,strm.avail_out===0?Z_BUF_ERROR$1:Z_STREAM_ERROR$2);}
-s.strm=strm;var old_flush=s.last_flush;s.last_flush=flush;if(s.status===INIT_STATE){if(s.wrap===2){strm.adler=0;put_byte(s,31);put_byte(s,139);put_byte(s,8);if(!s.gzhead){put_byte(s,0);put_byte(s,0);put_byte(s,0);put_byte(s,0);put_byte(s,0);put_byte(s,s.level===9?2:s.strategy>=Z_HUFFMAN_ONLY||s.level<2?4:0);put_byte(s,OS_CODE);s.status=BUSY_STATE;}else{put_byte(s,(s.gzhead.text?1:0)+
-(s.gzhead.hcrc?2:0)+
-(!s.gzhead.extra?0:4)+
-(!s.gzhead.name?0:8)+
-(!s.gzhead.comment?0:16));put_byte(s,s.gzhead.time&0xff);put_byte(s,(s.gzhead.time>>8)&0xff);put_byte(s,(s.gzhead.time>>16)&0xff);put_byte(s,(s.gzhead.time>>24)&0xff);put_byte(s,s.level===9?2:s.strategy>=Z_HUFFMAN_ONLY||s.level<2?4:0);put_byte(s,s.gzhead.os&0xff);if(s.gzhead.extra&&s.gzhead.extra.length){put_byte(s,s.gzhead.extra.length&0xff);put_byte(s,(s.gzhead.extra.length>>8)&0xff);}
-if(s.gzhead.hcrc){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending,0);}
-s.gzindex=0;s.status=EXTRA_STATE;}}
-else{var header=(Z_DEFLATED$2+((s.w_bits-8)<<4))<<8;var level_flags=-1;if(s.strategy>=Z_HUFFMAN_ONLY||s.level<2){level_flags=0;}else if(s.level<6){level_flags=1;}else if(s.level===6){level_flags=2;}else{level_flags=3;}
-header|=level_flags<<6;if(s.strstart!==0){header|=PRESET_DICT;}
-header+=31-(header%31);s.status=BUSY_STATE;putShortMSB(s,header);if(s.strstart!==0){putShortMSB(s,strm.adler>>>16);putShortMSB(s,strm.adler&0xffff);}
-strm.adler=1;}}
-if(s.status===EXTRA_STATE){if(s.gzhead.extra){beg=s.pending;while(s.gzindex<(s.gzhead.extra.length&0xffff)){if(s.pending===s.pending_buf_size){if(s.gzhead.hcrc&&s.pending>beg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-flush_pending(strm);beg=s.pending;if(s.pending===s.pending_buf_size){break;}}
-put_byte(s,s.gzhead.extra[s.gzindex]&0xff);s.gzindex++;}
-if(s.gzhead.hcrc&&s.pending>beg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-if(s.gzindex===s.gzhead.extra.length){s.gzindex=0;s.status=NAME_STATE;}}else{s.status=NAME_STATE;}}
-if(s.status===NAME_STATE){if(s.gzhead.name){beg=s.pending;do{if(s.pending===s.pending_buf_size){if(s.gzhead.hcrc&&s.pending>beg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-flush_pending(strm);beg=s.pending;if(s.pending===s.pending_buf_size){val=1;break;}}
-if(s.gzindexbeg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-if(val===0){s.gzindex=0;s.status=COMMENT_STATE;}}else{s.status=COMMENT_STATE;}}
-if(s.status===COMMENT_STATE){if(s.gzhead.comment){beg=s.pending;do{if(s.pending===s.pending_buf_size){if(s.gzhead.hcrc&&s.pending>beg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-flush_pending(strm);beg=s.pending;if(s.pending===s.pending_buf_size){val=1;break;}}
-if(s.gzindexbeg){strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg);}
-if(val===0){s.status=HCRC_STATE;}}else{s.status=HCRC_STATE;}}
-if(s.status===HCRC_STATE){if(s.gzhead.hcrc){if(s.pending+2>s.pending_buf_size){flush_pending(strm);}
-if(s.pending+2<=s.pending_buf_size){put_byte(s,strm.adler&0xff);put_byte(s,(strm.adler>>8)&0xff);strm.adler=0;s.status=BUSY_STATE;}}else{s.status=BUSY_STATE;}}
-if(s.pending!==0){flush_pending(strm);if(strm.avail_out===0){s.last_flush=-1;return Z_OK$3;}}else if(strm.avail_in===0&&rank(flush)<=rank(old_flush)&&flush!==Z_FINISH$3){return err(strm,Z_BUF_ERROR$1);}
-if(s.status===FINISH_STATE&&strm.avail_in!==0){return err(strm,Z_BUF_ERROR$1);}
-if(strm.avail_in!==0||s.lookahead!==0||(flush!==Z_NO_FLUSH$2&&s.status!==FINISH_STATE)){var bstate=s.strategy===Z_HUFFMAN_ONLY?deflate_huff(s,flush):s.strategy===Z_RLE?deflate_rle(s,flush):configuration_table[s.level].func(s,flush);if(bstate===BS_FINISH_STARTED||bstate===BS_FINISH_DONE){s.status=FINISH_STATE;}
-if(bstate===BS_NEED_MORE||bstate===BS_FINISH_STARTED){if(strm.avail_out===0){s.last_flush=-1;}
-return Z_OK$3;}
-if(bstate===BS_BLOCK_DONE){if(flush===Z_PARTIAL_FLUSH){_tr_align(s);}else if(flush!==Z_BLOCK$1){_tr_stored_block(s,0,0,false);if(flush===Z_FULL_FLUSH$1){zero(s.head);if(s.lookahead===0){s.strstart=0;s.block_start=0;s.insert=0;}}}
-flush_pending(strm);if(strm.avail_out===0){s.last_flush=-1;return Z_OK$3;}}}
-if(flush!==Z_FINISH$3){return Z_OK$3;}
-if(s.wrap<=0){return Z_STREAM_END$3;}
-if(s.wrap===2){put_byte(s,strm.adler&0xff);put_byte(s,(strm.adler>>8)&0xff);put_byte(s,(strm.adler>>16)&0xff);put_byte(s,(strm.adler>>24)&0xff);put_byte(s,strm.total_in&0xff);put_byte(s,(strm.total_in>>8)&0xff);put_byte(s,(strm.total_in>>16)&0xff);put_byte(s,(strm.total_in>>24)&0xff);}else{putShortMSB(s,strm.adler>>>16);putShortMSB(s,strm.adler&0xffff);}
-flush_pending(strm);if(s.wrap>0){s.wrap=-s.wrap;}
-return s.pending!==0?Z_OK$3:Z_STREAM_END$3;};var deflateEnd=function deflateEnd(strm){if(!strm||!strm.state){return Z_STREAM_ERROR$2;}
-var status=strm.state.status;if(status!==INIT_STATE&&status!==EXTRA_STATE&&status!==NAME_STATE&&status!==COMMENT_STATE&&status!==HCRC_STATE&&status!==BUSY_STATE&&status!==FINISH_STATE){return err(strm,Z_STREAM_ERROR$2);}
-strm.state=null;return status===BUSY_STATE?err(strm,Z_DATA_ERROR$2):Z_OK$3;};var deflateSetDictionary=function deflateSetDictionary(strm,dictionary){var dictLength=dictionary.length;if(!strm||!strm.state){return Z_STREAM_ERROR$2;}
-var s=strm.state;var wrap=s.wrap;if(wrap===2||(wrap===1&&s.status!==INIT_STATE)||s.lookahead){return Z_STREAM_ERROR$2;}
-if(wrap===1){strm.adler=adler32_1(strm.adler,dictionary,dictLength,0);}
-s.wrap=0;if(dictLength>=s.w_size){if(wrap===0){zero(s.head);s.strstart=0;s.block_start=0;s.insert=0;}
-var tmpDict=new Uint8Array(s.w_size);tmpDict.set(dictionary.subarray(dictLength-s.w_size,dictLength),0);dictionary=tmpDict;dictLength=s.w_size;}
-var avail=strm.avail_in;var next=strm.next_in;var input=strm.input;strm.avail_in=dictLength;strm.next_in=0;strm.input=dictionary;fill_window(s);while(s.lookahead>=MIN_MATCH){var str=s.strstart;var n=s.lookahead-(MIN_MATCH-1);do{s.ins_h=HASH(s,s.ins_h,s.window[str+MIN_MATCH-1]);s.prev[str&s.w_mask]=s.head[s.ins_h];s.head[s.ins_h]=str;str++;}while(--n);s.strstart=str;s.lookahead=MIN_MATCH-1;fill_window(s);}
-s.strstart+=s.lookahead;s.block_start=s.strstart;s.insert=s.lookahead;s.lookahead=0;s.match_length=s.prev_length=MIN_MATCH-1;s.match_available=0;strm.next_in=next;strm.input=input;strm.avail_in=avail;s.wrap=wrap;return Z_OK$3;};var deflateInit_1=deflateInit;var deflateInit2_1=deflateInit2;var deflateReset_1=deflateReset;var deflateResetKeep_1=deflateResetKeep;var deflateSetHeader_1=deflateSetHeader;var deflate_2$1=deflate$2;var deflateEnd_1=deflateEnd;var deflateSetDictionary_1=deflateSetDictionary;var deflateInfo="pako deflate (from Nodeca project)";var deflate_1$2={deflateInit:deflateInit_1,deflateInit2:deflateInit2_1,deflateReset:deflateReset_1,deflateResetKeep:deflateResetKeep_1,deflateSetHeader:deflateSetHeader_1,deflate:deflate_2$1,deflateEnd:deflateEnd_1,deflateSetDictionary:deflateSetDictionary_1,deflateInfo:deflateInfo};function _typeof(obj){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function(obj){return typeof obj;};}else{_typeof=function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};}
-return _typeof(obj);}
-var _has=function _has(obj,key){return Object.prototype.hasOwnProperty.call(obj,key);};var assign=function assign(obj){var sources=Array.prototype.slice.call(arguments,1);while(sources.length){var source=sources.shift();if(!source){continue;}
-if(_typeof(source)!=="object"){throw new TypeError(source+"must be non-object");}
-for(var p in source){if(_has(source,p)){obj[p]=source[p];}}}
-return obj;};var flattenChunks=function flattenChunks(chunks){var len=0;for(var i=0,l=chunks.length;i=252?6:q>=248?5:q>=240?4:q>=224?3:q>=192?2:1;}
-_utf8len[254]=_utf8len[254]=1;var string2buf=function string2buf(str){if(typeof TextEncoder==="function"&&TextEncoder.prototype.encode){return new TextEncoder().encode(str);}
-var buf,c,c2,m_pos,i,str_len=str.length,buf_len=0;for(m_pos=0;m_pos>>6);buf[i++]=0x80|(c&0x3f);}else if(c<0x10000){buf[i++]=0xe0|(c>>>12);buf[i++]=0x80|((c>>>6)&0x3f);buf[i++]=0x80|(c&0x3f);}else{buf[i++]=0xf0|(c>>>18);buf[i++]=0x80|((c>>>12)&0x3f);buf[i++]=0x80|((c>>>6)&0x3f);buf[i++]=0x80|(c&0x3f);}}
-return buf;};var buf2binstring=function buf2binstring(buf,len){if(len<65534){if(buf.subarray&&STR_APPLY_UIA_OK){return String.fromCharCode.apply(null,buf.length===len?buf:buf.subarray(0,len));}}
-var result="";for(var i=0;i4){utf16buf[out++]=0xfffd;i+=c_len-1;continue;}
-c&=c_len===2?0x1f:c_len===3?0x0f:0x07;while(c_len>1&&i1){utf16buf[out++]=0xfffd;continue;}
-if(c<0x10000){utf16buf[out++]=c;}else{c-=0x10000;utf16buf[out++]=0xd800|((c>>10)&0x3ff);utf16buf[out++]=0xdc00|(c&0x3ff);}}
-return buf2binstring(utf16buf,out);};var utf8border=function utf8border(buf,max){max=max||buf.length;if(max>buf.length){max=buf.length;}
-var pos=max-1;while(pos>=0&&(buf[pos]&0xc0)===0x80){pos--;}
-if(pos<0){return max;}
-if(pos===0){return max;}
-return pos+_utf8len[buf[pos]]>max?pos:max;};var strings={string2buf:string2buf,buf2string:buf2string,utf8border:utf8border};function ZStream(){this.input=null;this.next_in=0;this.avail_in=0;this.total_in=0;this.output=null;this.next_out=0;this.avail_out=0;this.total_out=0;this.msg="";this.state=null;this.data_type=2;this.adler=0;}
-var zstream=ZStream;var toString$1=Object.prototype.toString;var Z_NO_FLUSH$1=constants$2.Z_NO_FLUSH,Z_SYNC_FLUSH=constants$2.Z_SYNC_FLUSH,Z_FULL_FLUSH=constants$2.Z_FULL_FLUSH,Z_FINISH$2=constants$2.Z_FINISH,Z_OK$2=constants$2.Z_OK,Z_STREAM_END$2=constants$2.Z_STREAM_END,Z_DEFAULT_COMPRESSION=constants$2.Z_DEFAULT_COMPRESSION,Z_DEFAULT_STRATEGY=constants$2.Z_DEFAULT_STRATEGY,Z_DEFLATED$1=constants$2.Z_DEFLATED;function Deflate$1(options){this.options=common.assign({level:Z_DEFAULT_COMPRESSION,method:Z_DEFLATED$1,chunkSize:16384,windowBits:15,memLevel:8,strategy:Z_DEFAULT_STRATEGY},options||{});var opt=this.options;if(opt.raw&&opt.windowBits>0){opt.windowBits=-opt.windowBits;}else if(opt.gzip&&opt.windowBits>0&&opt.windowBits<16){opt.windowBits+=16;}
-this.err=0;this.msg="";this.ended=false;this.chunks=[];this.strm=new zstream();this.strm.avail_out=0;var status=deflate_1$2.deflateInit2(this.strm,opt.level,opt.method,opt.windowBits,opt.memLevel,opt.strategy);if(status!==Z_OK$2){throw new Error(messages[status]);}
-if(opt.header){deflate_1$2.deflateSetHeader(this.strm,opt.header);}
-if(opt.dictionary){var dict;if(typeof opt.dictionary==="string"){dict=strings.string2buf(opt.dictionary);}else if(toString$1.call(opt.dictionary)==="[object ArrayBuffer]"){dict=new Uint8Array(opt.dictionary);}else{dict=opt.dictionary;}
-status=deflate_1$2.deflateSetDictionary(this.strm,dict);if(status!==Z_OK$2){throw new Error(messages[status]);}
-this._dict_set=true;}}
-Deflate$1.prototype.push=function(data,flush_mode){var strm=this.strm;var chunkSize=this.options.chunkSize;var status,_flush_mode;if(this.ended){return false;}
-if(flush_mode===~~flush_mode)_flush_mode=flush_mode;else _flush_mode=flush_mode===true?Z_FINISH$2:Z_NO_FLUSH$1;if(typeof data==="string"){strm.input=strings.string2buf(data);}else if(toString$1.call(data)==="[object ArrayBuffer]"){strm.input=new Uint8Array(data);}else{strm.input=data;}
-strm.next_in=0;strm.avail_in=strm.input.length;for(;;){if(strm.avail_out===0){strm.output=new Uint8Array(chunkSize);strm.next_out=0;strm.avail_out=chunkSize;}
-if((_flush_mode===Z_SYNC_FLUSH||_flush_mode===Z_FULL_FLUSH)&&strm.avail_out<=6){this.onData(strm.output.subarray(0,strm.next_out));strm.avail_out=0;continue;}
-status=deflate_1$2.deflate(strm,_flush_mode);if(status===Z_STREAM_END$2){if(strm.next_out>0){this.onData(strm.output.subarray(0,strm.next_out));}
-status=deflate_1$2.deflateEnd(this.strm);this.onEnd(status);this.ended=true;return status===Z_OK$2;}
-if(strm.avail_out===0){this.onData(strm.output);continue;}
-if(_flush_mode>0&&strm.next_out>0){this.onData(strm.output.subarray(0,strm.next_out));strm.avail_out=0;continue;}
-if(strm.avail_in===0)break;}
-return true;};Deflate$1.prototype.onData=function(chunk){this.chunks.push(chunk);};Deflate$1.prototype.onEnd=function(status){if(status===Z_OK$2){this.result=common.flattenChunks(this.chunks);}
-this.chunks=[];this.err=status;this.msg=this.strm.msg;};function deflate$1(input,options){var deflator=new Deflate$1(options);deflator.push(input,true);if(deflator.err){throw deflator.msg||messages[deflator.err];}
-return deflator.result;}
-function deflateRaw$1(input,options){options=options||{};options.raw=true;return deflate$1(input,options);}
-function gzip$1(input,options){options=options||{};options.gzip=true;return deflate$1(input,options);}
-var Deflate_1$1=Deflate$1;var deflate_2=deflate$1;var deflateRaw_1$1=deflateRaw$1;var gzip_1$1=gzip$1;var constants$1=constants$2;var deflate_1$1={Deflate:Deflate_1$1,deflate:deflate_2,deflateRaw:deflateRaw_1$1,gzip:gzip_1$1,constants:constants$1};var BAD$1=30;var TYPE$1=12;var inffast=function inflate_fast(strm,start){var _in;var last;var _out;var beg;var end;var dmax;var wsize;var whave;var wnext;var s_window;var hold;var bits;var lcode;var dcode;var lmask;var dmask;var here;var op;var len;var dist;var from;var from_source;var input,output;var state=strm.state;_in=strm.next_in;input=strm.input;last=_in+(strm.avail_in-5);_out=strm.next_out;output=strm.output;beg=_out-(start-strm.avail_out);end=_out+(strm.avail_out-257);dmax=state.dmax;wsize=state.wsize;whave=state.whave;wnext=state.wnext;s_window=state.window;hold=state.hold;bits=state.bits;lcode=state.lencode;dcode=state.distcode;lmask=(1<>>24;hold>>>=op;bits-=op;op=(here>>>16)&0xff;if(op===0){output[_out++]=here&0xffff;}else if(op&16){len=here&0xffff;op&=15;if(op){if(bits>>=op;bits-=op;}
-if(bits<15){hold+=input[_in++]<>>24;hold>>>=op;bits-=op;op=(here>>>16)&0xff;if(op&16){dist=here&0xffff;op&=15;if(bitsdmax){strm.msg="invalid distance too far back";state.mode=BAD$1;break top;}
-hold>>>=op;bits-=op;op=_out-beg;if(dist>op){op=dist-op;if(op>whave){if(state.sane){strm.msg="invalid distance too far back";state.mode=BAD$1;break top;}}
-from=0;from_source=s_window;if(wnext===0){from+=wsize-op;if(op2){output[_out++]=from_source[from++];output[_out++]=from_source[from++];output[_out++]=from_source[from++];len-=3;}
-if(len){output[_out++]=from_source[from++];if(len>1){output[_out++]=from_source[from++];}}}else{from=_out-dist;do{output[_out++]=output[from++];output[_out++]=output[from++];output[_out++]=output[from++];len-=3;}while(len>2);if(len){output[_out++]=output[from++];if(len>1){output[_out++]=output[from++];}}}}else if((op&64)===0){here=dcode[(here&0xffff)+(hold&((1<>3;_in-=len;bits-=len<<3;hold&=(1<=1;max--){if(count[max]!==0){break;}}
-if(root>max){root=max;}
-if(max===0){table[table_index++]=(1<<24)|(64<<16)|0;table[table_index++]=(1<<24)|(64<<16)|0;opts.bits=1;return 0;}
-for(min=1;min0&&(type===CODES$1||max!==1)){return-1;}
-offs[1]=0;for(len=1;lenENOUGH_LENS$1)||(type===DISTS$1&&used>ENOUGH_DISTS$1)){return 1;}
-for(;;){here_bits=len-drop;if(work[sym]end){here_op=extra[extra_index+work[sym]];here_val=base[base_index+work[sym]];}else{here_op=32+64;here_val=0;}
-incr=1<<(len-drop);fill=1<>drop)+fill]=(here_bits<<24)|(here_op<<16)|here_val|0;}while(fill!==0);incr=1<<(len-1);while(huff&incr){incr>>=1;}
-if(incr!==0){huff&=incr-1;huff+=incr;}else{huff=0;}
-sym++;if(--count[len]===0){if(len===max){break;}
-len=lens[lens_index+work[sym]];}
-if(len>root&&(huff&mask)!==low){if(drop===0){drop=root;}
-next+=min;curr=len-drop;left=1<ENOUGH_LENS$1)||(type===DISTS$1&&used>ENOUGH_DISTS$1)){return 1;}
-low=huff&mask;table[low]=(root<<24)|(curr<<16)|(next-table_index)|0;}}
-if(huff!==0){table[next+huff]=((len-drop)<<24)|(64<<16)|0;}
-opts.bits=root;return 0;};var inftrees=inflate_table;var CODES=0;var LENS=1;var DISTS=2;var Z_FINISH$1=constants$2.Z_FINISH,Z_BLOCK=constants$2.Z_BLOCK,Z_TREES=constants$2.Z_TREES,Z_OK$1=constants$2.Z_OK,Z_STREAM_END$1=constants$2.Z_STREAM_END,Z_NEED_DICT$1=constants$2.Z_NEED_DICT,Z_STREAM_ERROR$1=constants$2.Z_STREAM_ERROR,Z_DATA_ERROR$1=constants$2.Z_DATA_ERROR,Z_MEM_ERROR$1=constants$2.Z_MEM_ERROR,Z_BUF_ERROR=constants$2.Z_BUF_ERROR,Z_DEFLATED=constants$2.Z_DEFLATED;var HEAD=1;var FLAGS=2;var TIME=3;var OS=4;var EXLEN=5;var EXTRA=6;var NAME=7;var COMMENT=8;var HCRC=9;var DICTID=10;var DICT=11;var TYPE=12;var TYPEDO=13;var STORED=14;var COPY_=15;var COPY=16;var TABLE=17;var LENLENS=18;var CODELENS=19;var LEN_=20;var LEN=21;var LENEXT=22;var DIST=23;var DISTEXT=24;var MATCH=25;var LIT=26;var CHECK=27;var LENGTH=28;var DONE=29;var BAD=30;var MEM=31;var SYNC=32;var ENOUGH_LENS=852;var ENOUGH_DISTS=592;var MAX_WBITS=15;var DEF_WBITS=MAX_WBITS;var zswap32=function zswap32(q){return(((q>>>24)&0xff)+
-((q>>>8)&0xff00)+
-((q&0xff00)<<8)+
-((q&0xff)<<24));};function InflateState(){this.mode=0;this.last=false;this.wrap=0;this.havedict=false;this.flags=0;this.dmax=0;this.check=0;this.total=0;this.head=null;this.wbits=0;this.wsize=0;this.whave=0;this.wnext=0;this.window=null;this.hold=0;this.bits=0;this.length=0;this.offset=0;this.extra=0;this.lencode=null;this.distcode=null;this.lenbits=0;this.distbits=0;this.ncode=0;this.nlen=0;this.ndist=0;this.have=0;this.next=null;this.lens=new Uint16Array(320);this.work=new Uint16Array(288);this.lendyn=null;this.distdyn=null;this.sane=0;this.back=0;this.was=0;}
-var inflateResetKeep=function inflateResetKeep(strm){if(!strm||!strm.state){return Z_STREAM_ERROR$1;}
-var state=strm.state;strm.total_in=strm.total_out=state.total=0;strm.msg="";if(state.wrap){strm.adler=state.wrap&1;}
-state.mode=HEAD;state.last=0;state.havedict=0;state.dmax=32768;state.head=null;state.hold=0;state.bits=0;state.lencode=state.lendyn=new Int32Array(ENOUGH_LENS);state.distcode=state.distdyn=new Int32Array(ENOUGH_DISTS);state.sane=1;state.back=-1;return Z_OK$1;};var inflateReset=function inflateReset(strm){if(!strm||!strm.state){return Z_STREAM_ERROR$1;}
-var state=strm.state;state.wsize=0;state.whave=0;state.wnext=0;return inflateResetKeep(strm);};var inflateReset2=function inflateReset2(strm,windowBits){var wrap;if(!strm||!strm.state){return Z_STREAM_ERROR$1;}
-var state=strm.state;if(windowBits<0){wrap=0;windowBits=-windowBits;}else{wrap=(windowBits>>4)+1;if(windowBits<48){windowBits&=15;}}
-if(windowBits&&(windowBits<8||windowBits>15)){return Z_STREAM_ERROR$1;}
-if(state.window!==null&&state.wbits!==windowBits){state.window=null;}
-state.wrap=wrap;state.wbits=windowBits;return inflateReset(strm);};var inflateInit2=function inflateInit2(strm,windowBits){if(!strm){return Z_STREAM_ERROR$1;}
-var state=new InflateState();strm.state=state;state.window=null;var ret=inflateReset2(strm,windowBits);if(ret!==Z_OK$1){strm.state=null;}
-return ret;};var inflateInit=function inflateInit(strm){return inflateInit2(strm,DEF_WBITS);};var virgin=true;var lenfix,distfix;var fixedtables=function fixedtables(state){if(virgin){lenfix=new Int32Array(512);distfix=new Int32Array(32);var sym=0;while(sym<144){state.lens[sym++]=8;}
-while(sym<256){state.lens[sym++]=9;}
-while(sym<280){state.lens[sym++]=7;}
-while(sym<288){state.lens[sym++]=8;}
-inftrees(LENS,state.lens,0,288,lenfix,0,state.work,{bits:9});sym=0;while(sym<32){state.lens[sym++]=5;}
-inftrees(DISTS,state.lens,0,32,distfix,0,state.work,{bits:5});virgin=false;}
-state.lencode=lenfix;state.lenbits=9;state.distcode=distfix;state.distbits=5;};var updatewindow=function updatewindow(strm,src,end,copy){var dist;var state=strm.state;if(state.window===null){state.wsize=1<=state.wsize){state.window.set(src.subarray(end-state.wsize,end),0);state.wnext=0;state.whave=state.wsize;}else{dist=state.wsize-state.wnext;if(dist>copy){dist=copy;}
-state.window.set(src.subarray(end-copy,end-copy+dist),state.wnext);copy-=dist;if(copy){state.window.set(src.subarray(end-copy,end),0);state.wnext=copy;state.whave=state.wsize;}else{state.wnext+=dist;if(state.wnext===state.wsize){state.wnext=0;}
-if(state.whave>>8)&0xff;state.check=crc32_1(state.check,hbuf,2,0);hold=0;bits=0;state.mode=FLAGS;break;}
-state.flags=0;if(state.head){state.head.done=false;}
-if(!(state.wrap&1)||(((hold&0xff)<<8)+(hold>>8))%31){strm.msg="incorrect header check";state.mode=BAD;break;}
-if((hold&0x0f)!==Z_DEFLATED){strm.msg="unknown compression method";state.mode=BAD;break;}
-hold>>>=4;bits-=4;len=(hold&0x0f)+8;if(state.wbits===0){state.wbits=len;}else if(len>state.wbits){strm.msg="invalid window size";state.mode=BAD;break;}
-state.dmax=1<>8)&1;}
-if(state.flags&0x0200){hbuf[0]=hold&0xff;hbuf[1]=(hold>>>8)&0xff;state.check=crc32_1(state.check,hbuf,2,0);}
-hold=0;bits=0;state.mode=TIME;case TIME:while(bits<32){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>8)&0xff;hbuf[2]=(hold>>>16)&0xff;hbuf[3]=(hold>>>24)&0xff;state.check=crc32_1(state.check,hbuf,4,0);}
-hold=0;bits=0;state.mode=OS;case OS:while(bits<16){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>8;}
-if(state.flags&0x0200){hbuf[0]=hold&0xff;hbuf[1]=(hold>>>8)&0xff;state.check=crc32_1(state.check,hbuf,2,0);}
-hold=0;bits=0;state.mode=EXLEN;case EXLEN:if(state.flags&0x0400){while(bits<16){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>8)&0xff;state.check=crc32_1(state.check,hbuf,2,0);}
-hold=0;bits=0;}else if(state.head){state.head.extra=null;}
-state.mode=EXTRA;case EXTRA:if(state.flags&0x0400){copy=state.length;if(copy>have){copy=have;}
-if(copy){if(state.head){len=state.head.extra_len-state.length;if(!state.head.extra){state.head.extra=new Uint8Array(state.head.extra_len);}
-state.head.extra.set(input.subarray(next,next+copy),len);}
-if(state.flags&0x0200){state.check=crc32_1(state.check,input,copy,next);}
-have-=copy;next+=copy;state.length-=copy;}
-if(state.length){break inf_leave;}}
-state.length=0;state.mode=NAME;case NAME:if(state.flags&0x0800){if(have===0){break inf_leave;}
-copy=0;do{len=input[next+copy++];if(state.head&&len&&state.length<65536){state.head.name+=String.fromCharCode(len);}}while(len&©>9)&1;state.head.done=true;}
-strm.adler=state.check=0;state.mode=TYPE;break;case DICTID:while(bits<32){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=bits&7;bits-=bits&7;state.mode=CHECK;break;}
-while(bits<3){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=1;bits-=1;switch(hold&0x03){case 0:state.mode=STORED;break;case 1:fixedtables(state);state.mode=LEN_;if(flush===Z_TREES){hold>>>=2;bits-=2;break inf_leave;}
-break;case 2:state.mode=TABLE;break;case 3:strm.msg="invalid block type";state.mode=BAD;}
-hold>>>=2;bits-=2;break;case STORED:hold>>>=bits&7;bits-=bits&7;while(bits<32){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>16)^0xffff)){strm.msg="invalid stored block lengths";state.mode=BAD;break;}
-state.length=hold&0xffff;hold=0;bits=0;state.mode=COPY_;if(flush===Z_TREES){break inf_leave;}
-case COPY_:state.mode=COPY;case COPY:copy=state.length;if(copy){if(copy>have){copy=have;}
-if(copy>left){copy=left;}
-if(copy===0){break inf_leave;}
-output.set(input.subarray(next,next+copy),put);have-=copy;next+=copy;left-=copy;put+=copy;state.length-=copy;break;}
-state.mode=TYPE;break;case TABLE:while(bits<14){if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=5;bits-=5;state.ndist=(hold&0x1f)+1;hold>>>=5;bits-=5;state.ncode=(hold&0x0f)+4;hold>>>=4;bits-=4;if(state.nlen>286||state.ndist>30){strm.msg="too many length or distance symbols";state.mode=BAD;break;}
-state.have=0;state.mode=LENLENS;case LENLENS:while(state.have>>=3;bits-=3;}
-while(state.have<19){state.lens[order[state.have++]]=0;}
-state.lencode=state.lendyn;state.lenbits=7;opts={bits:state.lenbits};ret=inftrees(CODES,state.lens,0,19,state.lencode,0,state.work,opts);state.lenbits=opts.bits;if(ret){strm.msg="invalid code lengths set";state.mode=BAD;break;}
-state.have=0;state.mode=CODELENS;case CODELENS:while(state.have>>24;here_op=(here>>>16)&0xff;here_val=here&0xffff;if(here_bits<=bits){break;}
-if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=here_bits;bits-=here_bits;state.lens[state.have++]=here_val;}else{if(here_val===16){n=here_bits+2;while(bits>>=here_bits;bits-=here_bits;if(state.have===0){strm.msg="invalid bit length repeat";state.mode=BAD;break;}
-len=state.lens[state.have-1];copy=3+(hold&0x03);hold>>>=2;bits-=2;}else if(here_val===17){n=here_bits+3;while(bits>>=here_bits;bits-=here_bits;len=0;copy=3+(hold&0x07);hold>>>=3;bits-=3;}else{n=here_bits+7;while(bits>>=here_bits;bits-=here_bits;len=0;copy=11+(hold&0x7f);hold>>>=7;bits-=7;}
-if(state.have+copy>state.nlen+state.ndist){strm.msg="invalid bit length repeat";state.mode=BAD;break;}
-while(copy--){state.lens[state.have++]=len;}}}
-if(state.mode===BAD){break;}
-if(state.lens[256]===0){strm.msg="invalid code -- missing end-of-block";state.mode=BAD;break;}
-state.lenbits=9;opts={bits:state.lenbits};ret=inftrees(LENS,state.lens,0,state.nlen,state.lencode,0,state.work,opts);state.lenbits=opts.bits;if(ret){strm.msg="invalid literal/lengths set";state.mode=BAD;break;}
-state.distbits=6;state.distcode=state.distdyn;opts={bits:state.distbits};ret=inftrees(DISTS,state.lens,state.nlen,state.ndist,state.distcode,0,state.work,opts);state.distbits=opts.bits;if(ret){strm.msg="invalid distances set";state.mode=BAD;break;}
-state.mode=LEN_;if(flush===Z_TREES){break inf_leave;}
-case LEN_:state.mode=LEN;case LEN:if(have>=6&&left>=258){strm.next_out=put;strm.avail_out=left;strm.next_in=next;strm.avail_in=have;state.hold=hold;state.bits=bits;inffast(strm,_out);put=strm.next_out;output=strm.output;left=strm.avail_out;next=strm.next_in;input=strm.input;have=strm.avail_in;hold=state.hold;bits=state.bits;if(state.mode===TYPE){state.back=-1;}
-break;}
-state.back=0;for(;;){here=state.lencode[hold&((1<>>24;here_op=(here>>>16)&0xff;here_val=here&0xffff;if(here_bits<=bits){break;}
-if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>last_bits)];here_bits=here>>>24;here_op=(here>>>16)&0xff;here_val=here&0xffff;if(last_bits+here_bits<=bits){break;}
-if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=last_bits;bits-=last_bits;state.back+=last_bits;}
-hold>>>=here_bits;bits-=here_bits;state.back+=here_bits;state.length=here_val;if(here_op===0){state.mode=LIT;break;}
-if(here_op&32){state.back=-1;state.mode=TYPE;break;}
-if(here_op&64){strm.msg="invalid literal/length code";state.mode=BAD;break;}
-state.extra=here_op&15;state.mode=LENEXT;case LENEXT:if(state.extra){n=state.extra;while(bits>>=state.extra;bits-=state.extra;state.back+=state.extra;}
-state.was=state.length;state.mode=DIST;case DIST:for(;;){here=state.distcode[hold&((1<>>24;here_op=(here>>>16)&0xff;here_val=here&0xffff;if(here_bits<=bits){break;}
-if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>last_bits)];here_bits=here>>>24;here_op=(here>>>16)&0xff;here_val=here&0xffff;if(last_bits+here_bits<=bits){break;}
-if(have===0){break inf_leave;}
-have--;hold+=input[next++]<>>=last_bits;bits-=last_bits;state.back+=last_bits;}
-hold>>>=here_bits;bits-=here_bits;state.back+=here_bits;if(here_op&64){strm.msg="invalid distance code";state.mode=BAD;break;}
-state.offset=here_val;state.extra=here_op&15;state.mode=DISTEXT;case DISTEXT:if(state.extra){n=state.extra;while(bits>>=state.extra;bits-=state.extra;state.back+=state.extra;}
-if(state.offset>state.dmax){strm.msg="invalid distance too far back";state.mode=BAD;break;}
-state.mode=MATCH;case MATCH:if(left===0){break inf_leave;}
-copy=_out-left;if(state.offset>copy){copy=state.offset-copy;if(copy>state.whave){if(state.sane){strm.msg="invalid distance too far back";state.mode=BAD;break;}}
-if(copy>state.wnext){copy-=state.wnext;from=state.wsize-copy;}else{from=state.wnext-copy;}
-if(copy>state.length){copy=state.length;}
-from_source=state.window;}else{from_source=output;from=put-state.offset;copy=state.length;}
-if(copy>left){copy=left;}
-left-=copy;state.length-=copy;do{output[put++]=from_source[from++];}while(--copy);if(state.length===0){state.mode=LEN;}
-break;case LIT:if(left===0){break inf_leave;}
-output[put++]=state.length;left--;state.mode=LEN;break;case CHECK:if(state.wrap){while(bits<32){if(have===0){break inf_leave;}
-have--;hold|=input[next++]<=0&&opt.windowBits<16){opt.windowBits=-opt.windowBits;if(opt.windowBits===0){opt.windowBits=-15;}}
-if(opt.windowBits>=0&&opt.windowBits<16&&!(options&&options.windowBits)){opt.windowBits+=32;}
-if(opt.windowBits>15&&opt.windowBits<48){if((opt.windowBits&15)===0){opt.windowBits|=15;}}
-this.err=0;this.msg="";this.ended=false;this.chunks=[];this.strm=new zstream();this.strm.avail_out=0;var status=inflate_1$2.inflateInit2(this.strm,opt.windowBits);if(status!==Z_OK){throw new Error(messages[status]);}
-this.header=new gzheader();inflate_1$2.inflateGetHeader(this.strm,this.header);if(opt.dictionary){if(typeof opt.dictionary==="string"){opt.dictionary=strings.string2buf(opt.dictionary);}else if(toString.call(opt.dictionary)==="[object ArrayBuffer]"){opt.dictionary=new Uint8Array(opt.dictionary);}
-if(opt.raw){status=inflate_1$2.inflateSetDictionary(this.strm,opt.dictionary);if(status!==Z_OK){throw new Error(messages[status]);}}}}
-Inflate$1.prototype.push=function(data,flush_mode){var strm=this.strm;var chunkSize=this.options.chunkSize;var dictionary=this.options.dictionary;var status,_flush_mode,last_avail_out;if(this.ended)return false;if(flush_mode===~~flush_mode)_flush_mode=flush_mode;else _flush_mode=flush_mode===true?Z_FINISH:Z_NO_FLUSH;if(toString.call(data)==="[object ArrayBuffer]"){strm.input=new Uint8Array(data);}else{strm.input=data;}
-strm.next_in=0;strm.avail_in=strm.input.length;for(;;){if(strm.avail_out===0){strm.output=new Uint8Array(chunkSize);strm.next_out=0;strm.avail_out=chunkSize;}
-status=inflate_1$2.inflate(strm,_flush_mode);if(status===Z_NEED_DICT&&dictionary){status=inflate_1$2.inflateSetDictionary(strm,dictionary);if(status===Z_OK){status=inflate_1$2.inflate(strm,_flush_mode);}else if(status===Z_DATA_ERROR){status=Z_NEED_DICT;}}
-while(strm.avail_in>0&&status===Z_STREAM_END&&strm.state.wrap>0&&data[strm.next_in]!==0){inflate_1$2.inflateReset(strm);status=inflate_1$2.inflate(strm,_flush_mode);}
-switch(status){case Z_STREAM_ERROR:case Z_DATA_ERROR:case Z_NEED_DICT:case Z_MEM_ERROR:this.onEnd(status);this.ended=true;return false;}
-last_avail_out=strm.avail_out;if(strm.next_out){if(strm.avail_out===0||status===Z_STREAM_END){if(this.options.to==="string"){var next_out_utf8=strings.utf8border(strm.output,strm.next_out);var tail=strm.next_out-next_out_utf8;var utf8str=strings.buf2string(strm.output,next_out_utf8);strm.next_out=tail;strm.avail_out=chunkSize-tail;if(tail)
-strm.output.set(strm.output.subarray(next_out_utf8,next_out_utf8+tail),0);this.onData(utf8str);}else{this.onData(strm.output.length===strm.next_out?strm.output:strm.output.subarray(0,strm.next_out));}}}
-if(status===Z_OK&&last_avail_out===0)continue;if(status===Z_STREAM_END){status=inflate_1$2.inflateEnd(this.strm);this.onEnd(status);this.ended=true;return true;}
-if(strm.avail_in===0)break;}
-return true;};Inflate$1.prototype.onData=function(chunk){this.chunks.push(chunk);};Inflate$1.prototype.onEnd=function(status){if(status===Z_OK){if(this.options.to==="string"){this.result=this.chunks.join("");}else{this.result=common.flattenChunks(this.chunks);}}
-this.chunks=[];this.err=status;this.msg=this.strm.msg;};function inflate$1(input,options){var inflator=new Inflate$1(options);inflator.push(input);if(inflator.err)throw inflator.msg||messages[inflator.err];return inflator.result;}
-function inflateRaw$1(input,options){options=options||{};options.raw=true;return inflate$1(input,options);}
-var Inflate_1$1=Inflate$1;var inflate_2=inflate$1;var inflateRaw_1$1=inflateRaw$1;var ungzip$1=inflate$1;var constants=constants$2;var inflate_1$1={Inflate:Inflate_1$1,inflate:inflate_2,inflateRaw:inflateRaw_1$1,ungzip:ungzip$1,constants:constants};var Deflate=deflate_1$1.Deflate,deflate=deflate_1$1.deflate,deflateRaw=deflate_1$1.deflateRaw,gzip=deflate_1$1.gzip;var Inflate=inflate_1$1.Inflate,inflate=inflate_1$1.inflate,inflateRaw=inflate_1$1.inflateRaw,ungzip=inflate_1$1.ungzip;var Deflate_1=Deflate;var deflate_1=deflate;var deflateRaw_1=deflateRaw;var gzip_1=gzip;var Inflate_1=Inflate;var inflate_1=inflate;var inflateRaw_1=inflateRaw;var ungzip_1=ungzip;var constants_1=constants$2;var pako={Deflate:Deflate_1,deflate:deflate_1,deflateRaw:deflateRaw_1,gzip:gzip_1,Inflate:Inflate_1,inflate:inflate_1,inflateRaw:inflateRaw_1,ungzip:ungzip_1,constants:constants_1};exports.Deflate=Deflate_1;exports.Inflate=Inflate_1;exports.constants=constants_1;exports["default"]=pako;exports.deflate=deflate_1;exports.deflateRaw=deflateRaw_1;exports.gzip=gzip_1;exports.inflate=inflate_1;exports.inflateRaw=inflateRaw_1;exports.ungzip=ungzip_1;Object.defineProperty(exports,"__esModule",{value:true});});
-;
-
-// source: plugin/logging/js/logging.js
-$(function(){function LoggingViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.availableLoggers=ko.observableArray();self.availableLoggersName=ko.observable();self.availableLoggersLevel=ko.observable();self.configuredLoggers=ko.observableArray();self.configuredLoggersChanged=false;self.serialLogEnabled=ko.observable();self.pluginTimingsLogEnabled=ko.observable();self.freeSpace=ko.observable(undefined);self.totalSpace=ko.observable(undefined);self.markedForDeletion=ko.observableArray([]);self.availableLoggersSorted=ko.computed(function(){return _.sortBy(self.availableLoggers());});self.listHelper=new ItemListHelper("logFiles",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase())
-return 1;return 0;},modification:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]b["size"])return-1;if(a["size"]%(logfile)s enabled. Please remember to turn it off "+"again once your are done debugging whatever issue prompted you to turn it on."),{logfile:logfile})+" "+
-gettext("It can negatively impact print performance and also take up a lot of storage space "+"depending on how long you keep it enabled and thus should only be used for "+"debugging.")+"
";if(free!==undefined&&total!==undefined){content+=""+
-gettext("Log storage:")+" "+
-formatSize(free)+" / "+
-formatSize(total)+"
";}
-return content;};self.configuredLoggersHasChanged=function(){self.configuredLoggersChanged=true;};self.addLogger=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-var component=self.availableLoggersName();if(!component){return;}
-var level=self.availableLoggersLevel();self.configuredLoggers.push({component:component,level:ko.observable(level)});self.availableLoggers.remove(component);self.configuredLoggersHasChanged();};self.removeLogger=function(logger){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-self.configuredLoggers.remove(logger);self.availableLoggers.push(logger.component);self.configuredLoggersHasChanged();};self.removeFile=function(filename){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-var perform=function(){OctoPrint.plugins.logging.deleteLog(filename).done(self.requestData);};showConfirmationDialog(_.sprintf(gettext('You are about to delete log file "%(name)s".'),{name:_.escape(filename)}),perform);};self.markFilesOnPage=function(){self.markedForDeletion(_.uniq(self.markedForDeletion().concat(_.map(self.listHelper.paginatedItems(),"name"))));};self.markAllFiles=function(){self.markedForDeletion(_.map(self.listHelper.allItems,"name"));};self.clearMarkedFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-self.markedForDeletion.removeAll();};self.removeMarkedFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-var perform=function(){self._bulkRemove(self.markedForDeletion(),"files").done(function(){self.markedForDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d log files."),{count:self.markedForDeletion().length}),perform);};self.enableBulkDownload=ko.pureComputed(function(){return self.markedForDeletion().length&&!self.bulkDownloadUrlTooLong();});self.bulkDownloadUrlTooLong=ko.pureComputed(function(){return BASEURL.length+self.bulkDownloadUrl().length>=2000;});self.bulkDownloadButtonUrl=ko.pureComputed(function(){var files=self.markedForDeletion();if(!files.length||self.bulkDownloadUrlTooLong()){return"javascript:void(0)";}
-return self.bulkDownloadUrl();});self.bulkDownloadUrl=function(){var files=self.markedForDeletion();return OctoPrint.plugins.logging.bulkDownloadUrl(files);};self.onServerReconnect=self.onUserLoggedIn=self.onEventSettingsUpdated=self.onSettingsShown=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-self.requestData();};self.onSettingsBeforeSave=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-if(self.configuredLoggersChanged){console.log("ConfiguredLoggers has changed. Saving!");var levels={};_.each(self.configuredLoggers(),function(data){levels[data.component]=data.level();});OctoPrint.plugins.logging.updateLevels(levels);}else{console.log("ConfiguredLoggers has not changed. Not saving.");}};self._bulkRemove=function(files){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_LOGGING_MANAGE)){return;}
-var title=gettext("Deleting log files");var message=_.sprintf(gettext("Deleting %(count)d log files..."),{count:files.length});var handler=function(filename){return OctoPrint.plugins.logging.deleteLog(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)});var long=_.sprintf(gettext("Deletion of %(filename)s failed: %(error)s"),{filename:_.escape(filename),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:files.length,output:true};showProgressModal(options,promise);var requests=[];_.each(files,function(filename){var request=handler(filename);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};}
-OCTOPRINT_VIEWMODELS.push({construct:LoggingViewModel,additionalNames:["logsViewModel"],dependencies:["loginStateViewModel","accessViewModel"],elements:["#settings_plugin_logging","#navbar_plugin_logging_seriallog","#navbar_plugin_logging_plugintimingslog"]});});
-;
-
-// source: plugin/pluginmanager/js/pluginmanager.js
-$(function(){function PluginManagerViewModel(parameters){var self=this;self.loginState=parameters[0];self.settingsViewModel=parameters[1];self.printerState=parameters[2];self.systemViewModel=parameters[3];self.access=parameters[4];self.piSupport=parameters[5];self.config_repositoryUrl=ko.observable();self.config_repositoryTtl=ko.observable();self.config_noticesUrl=ko.observable();self.config_noticesTtl=ko.observable();self.config_pipAdditionalArgs=ko.observable();self.config_pipForceUser=ko.observable();self.config_confirmUninstall=ko.observable();self.config_confirmDisable=ko.observable();self.configurationDialog=$("#settings_plugin_pluginmanager_configurationdialog");self.plugins=new ItemListHelper("plugin.pluginmanager.installedplugins",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase())
-return 1;return 0;}},{"bundled":function(item){return item.bundled;},"3rdparty":function(item){return!item.bundled;},"enabled":function(item){return item.enabled;},"disabled":function(item){return!item.enabled;}},"name",[],[["bundled","3rdparty"],["enabled","disabled"]],0);self.plugins.currentFilters.subscribe(function(){self.clearPluginsSelection();});self.pluginLookup={};self.repositoryplugins=new ItemListHelper("plugin.pluginmanager.repositoryplugins",{title:function(a,b){if(a.title.toLocaleLowerCase()b.title.toLocaleLowerCase())
-return 1;return 0;},published:function(a,b){if(a.published.toLocaleLowerCase()>b.published.toLocaleLowerCase())
-return-1;if(a.published.toLocaleLowerCase()countB)return-1;if(countAvalB)return-1;if(valAvalB)return-1;if(valAvalB)return-1;if(valAb["identifier"].toLocaleLowerCase())
-return 1;return 0;}},{},"identifier",[],[],0);self.selectedPlugins=ko.observableArray([]);self.uploadElement=$("#settings_plugin_pluginmanager_repositorydialog_upload");self.uploadButton=$("#settings_plugin_pluginmanager_repositorydialog_upload_start");self.repositoryAvailable=ko.observable(undefined);self.repositorySearchQuery=ko.observable();self.repositorySearchQuery.subscribe(function(){self.performRepositorySearch();});self.listingSearchQuery=ko.observable();self.listingSearchQuery.subscribe(function(){self.performListingSearch();});self.installUrl=ko.observable();self.uploadFilename=ko.observable();self.loglines=ko.observableArray([]);self.installedPlugins=ko.observableArray([]);self.followDependencyLinks=ko.observable(false);self.pipAvailable=ko.observable(true);self.pipVersion=ko.observable();self.pipInstallDir=ko.observable();self.pipUseUser=ko.observable();self.pipVirtualEnv=ko.observable();self.pipAdditionalArgs=ko.observable();self.pipPython=ko.observable();self.safeMode=ko.observable();self.online=ko.observable();self.supportedArchiveExtensions=ko.observableArray([]);self.supportedPythonExtensions=ko.observableArray([]);self.supportedJsonExtensions=ko.observableArray([]);var createExtensionsHelp=function(extensions){return _.reduce(extensions,function(result,ext,index){return(result+'"'+
-ext+'"'+
-(indexpip that "+"have the extension %(archiveExtensions)s, or single file python "+"plugins with the extension %(pythonExtensions)s, or a plugin list "+"export with the extension %(jsonExtensions)s."),{archiveExtensions:archiveExts,pythonExtensions:pythonExts,jsonExtensions:jsonExts});});self.requestError=ko.observable(false);self.pipUseUserString=ko.pureComputed(function(){return self.pipUseUser()?"yes":"no";});self.pipVirtualEnvString=ko.pureComputed(function(){return self.pipVirtualEnv()?"yes":"no";});self.working=ko.observable(false);self.workingTitle=ko.observable();self.workingDialog=undefined;self.workingOutput=undefined;self.toggling=ko.observable(false);self.restartCommandSpec=undefined;self.systemViewModel.systemActions.subscribe(function(){var lastResponse=self.systemViewModel.lastCommandResponse;if(!lastResponse||!lastResponse.core){self.restartCommandSpec=undefined;return;}
-var restartSpec=_.filter(lastResponse.core,function(spec){return spec.action=="restart";});self.restartCommandSpec=restartSpec!=undefined&&restartSpec.length>0?restartSpec[0]:undefined;});self.noticeNotifications=[];self.hiddenNoticeNotifications={};self.noticeCount=ko.observable(0);self.notification=undefined;self.logContents={steps:[],action:{reload:false,refresh:false,reconnect:false}};self.noticeCountText=ko.pureComputed(function(){var count=self.noticeCount();if(count===0){return gettext("There are no plugin notices. Great!");}else if(count===1){return gettext("There is a plugin notice for one of your installed plugins.");}else{return _.sprintf(gettext("There are %(count)d plugin notices for one or more of your installed plugins."),{count:count});}});self.enableManagement=ko.pureComputed(function(){return!self.printerState.isBusy();});self.enableBulk=function(data){return self.enableToggle(data,true)&&!data.bundled;};self.enableToggle=function(data,ignoreToggling){var command=self._getToggleCommand(data);var not_safemode_victim=!data.safe_mode_victim;var not_blacklisted=!data.blacklisted;var not_incompatible=!data.incompatible;ignoreToggling=!!ignoreToggling;return(self.enableManagement()&&(ignoreToggling||!self.toggling())&&(command==="disable"||(not_safemode_victim&¬_blacklisted&¬_incompatible))&&data.key!=="pluginmanager");};self.enableUninstall=function(data){return(self.enableManagement()&&(data.origin!=="entry_point"||self.pipAvailable())&&data.managable&&!data.bundled&&data.key!=="pluginmanager"&&!data.pending_uninstall);};self.enableCleanup=function(data){return(self.enableManagement()&&data.key!=="pluginmanager"&&!data.pending_uninstall);};self.enableRepoInstall=function(data){return(self.pipAvailable()&&!self.safeMode()&&!self.throttled()&&self.online()&&self.isCompatible(data));};self.throttled=ko.pureComputed(function(){return(self.piSupport&&self.piSupport.currentIssue()&&!self.settingsViewModel.settings.plugins.pluginmanager.ignore_throttled());});self.invalidUrl=ko.pureComputed(function(){var allowedUrlSchemes=["http","https","git","git+http","git+https","git+ssh","git+git","hg+http","hg+https","hg+static-http","hg+ssh","svn","svn+svn","svn+http","svn+https","svn+ssh","bzr+http","bzr+https","bzr+ssh","bzr+sftp","brz+ftp","bzr+lp"];var url=self.installUrl();var lowerUrl=url!==undefined?url.toLocaleLowerCase():undefined;var lowerUrlStartsWithScheme=function(scheme){return _.startsWith(lowerUrl,scheme+"://");};return(url!==undefined&&url.trim()!==""&&!_.any(allowedUrlSchemes,lowerUrlStartsWithScheme));});self.enableUrlInstall=ko.pureComputed(function(){var url=self.installUrl();return(self.enableManagement()&&self.pipAvailable()&&!self.safeMode()&&!self.throttled()&&self.online()&&url!==undefined&&url.trim()!==""&&!self.invalidUrl());});self.hasExtension=function(name,extensions){const lowerName=name.toLocaleLowerCase();return extensions.some((ext)=>lowerName.endsWith(ext));};self.invalidFile=ko.pureComputed(function(){var allowedFileExtensions=self.supportedArchiveExtensions().concat(self.supportedPythonExtensions()).concat(self.supportedJsonExtensions());var name=self.uploadFilename();return name!==undefined&&!self.hasExtension(name,allowedFileExtensions);});self.enableFileInstall=ko.pureComputed(function(){var name=self.uploadFilename();return(self.enableManagement()&&self.pipAvailable()&&!self.safeMode()&&!self.throttled()&&name!==undefined&&name.trim()!==""&&!self.invalidFile());});self.uploadElement.fileupload({dataType:"json",maxNumberOfFiles:1,autoUpload:false,add:function(e,data){if(data.files.length===0){return false;}
-var name=data.files[0].name;self.uploadFilename(name);var isJsonFile=name!==undefined&&self.hasExtension(name,self.supportedJsonExtensions());self.uploadButton.unbind("click");self.uploadButton.bind("click",function(){const proceed=()=>{self.loginState.reauthenticateIfNecessary(()=>{self._markWorking(isJsonFile?gettext("Installing plugins..."):gettext("Installing plugin..."),isJsonFile?gettext("Installing plugins from uploaded file..."):gettext("Installing plugin from uploaded file..."));data.formData={dependency_links:self.followDependencyLinks()};data.submit();});};if(isJsonFile){showConfirmationDialog({title:gettext("Confirm installation of multiple plugins"),message:gettext("Please confirm you want to perform all plugins specified in the json file."),cancel:gettext("Cancel"),proceed:gettext("Install"),proceedClass:"primary",onproceed:proceed});}else{proceed();}
-return false;});},done:function(e,data){var response=data.result;if(!response.in_progress){if(response.result){self._markDone();}else{self._markDone(response.reason);}}
-self.uploadButton.unbind("click");self.uploadFilename(undefined);},fail:function(e,data){if(data&&data.errorThrown==="CONFLICT"){self._markDone("There's already another plugin install in progress.");}else{new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});self._markDone("Could not install plugin, unknown error.");}
-self.uploadButton.unbind("click");self.uploadFilename(undefined);}});self.performListingSearch=function(){var query=self.listingSearchQuery();if(query!==undefined&&query.trim()!==""){query=query.toLocaleLowerCase();self.plugins.changeSearchFunction(function(entry){return(entry&&(entry["name"].toLocaleLowerCase().indexOf(query)>-1||(entry.description&&entry.description.toLocaleLowerCase().indexOf(query)>-1)));});}else{self.plugins.resetSearch();}};self.multiInstallQueue=ko.observableArray([]);self.queuedInstalls=ko.observableArray([]);self.multiInstallRunning=ko.observable(false);self.multiInstallInitialSize=ko.observable(0);self.multiInstallValid=function(){return(self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_INSTALL)&&self.pipAvailable()&&!self.safeMode()&&!self.throttled()&&self.online()&&self.multiInstallQueue().length>0&&self.multiInstallQueue().every(self.isCompatible));};self.repoInstallSelectedButtonText=function(){return self.multiInstallQueue().some(self.installed)?"(Re)install selected":"Install selected";};self.repoInstallSelectedConfirm=function(){if(!self.multiInstallValid())return;if(self.multiInstallQueue().length===1){self.installFromRepository(self.multiInstallQueue()[0]);return;}
-var question="";self.multiInstallQueue().forEach(function(plugin){var action=self.installed(plugin)?gettext("Reinstall"):gettext("Install");question+=_.sprintf("%(action)s %(name)s@%(version)s ",{action:_.escape(action),name:_.escape(plugin.title),version:_.escape(plugin.github.latest_release.tag)});});question+=" ";showConfirmationDialog({title:gettext("Confirm installation of multiple plugins"),message:gettext("Please confirm you want to perform these actions:"),question:question,cancel:gettext("Cancel"),proceed:gettext("Install"),proceedClass:"primary",onproceed:self.startMultiInstall});};self.startMultiInstall=function(){if(self.multiInstallRunning()||!self.multiInstallValid())return;self.multiInstallRunning(true);self.multiInstallInitialSize(self.multiInstallQueue().length);self._markWorking(gettext("Installing multiple plugins"),gettext("Starting installation of multiple plugins..."));self.performMultiInstallJob();};self.performMultiInstallJob=function(){if(!self.multiInstallRunning()||self.multiInstallQueue().length===0)
-return;var plugin=self.multiInstallQueue.pop();self.installFromRepository(plugin);};self.alertMultiInstallJobDone=function(response){if(!self.multiInstallRunning()||response.action!="install"||!response.result)
-return;if(self.multiInstallQueue().length===0){self.installUrl("");self.multiInstallQueue([]);self.multiInstallRunning(false);self._markDone();}else{self.performMultiInstallJob();}};self.performRepositorySearch=function(){var query=self.repositorySearchQuery();if(query!==undefined&&query.trim()!==""){query=query.toLocaleLowerCase();self.repositoryplugins.changeSearchFunction(function(entry){return(entry&&(entry["title"].toLocaleLowerCase().indexOf(query)>-1||entry["description"].toLocaleLowerCase().indexOf(query)>-1));});}else{self.repositoryplugins.resetSearch();}
-return false;};self.fromPluginsResponse=function(data,options){var evalNotices=options.eval_notices||false;var ignoreNoticeHidden=options.ignore_notice_hidden||false;var ignoreNoticeIgnored=options.ignore_notice_ignored||false;if(evalNotices)self._removeAllNoticeNotifications();var installedPlugins=[];var noticeCount=0;var lookup={};_.each(data,function(plugin){lookup[plugin.key]=plugin;installedPlugins.push(plugin.key);if(evalNotices&&plugin.notifications&&plugin.notifications.length){_.each(plugin.notifications,function(notification){noticeCount++;if(!ignoreNoticeIgnored&&self._isNoticeNotificationIgnored(plugin.key,notification.date))
-return;if(!ignoreNoticeHidden&&self._isNoticeNotificationHidden(plugin.key,notification.date))
-return;self._showPluginNotification(plugin,notification);});}});if(evalNotices)self.noticeCount(noticeCount);self.installedPlugins(installedPlugins);self.plugins.updateItems(data);self.pluginLookup=lookup;};self.fromOrphanResponse=function(data){var orphans=[];_.each(data,function(value,key){orphans.push({identifier:key,settings:value.settings,data:value.data});});self.orphans.updateItems(orphans);};self.fromRepositoryResponse=function(data){self.repositoryAvailable(data.available);if(data.available){self.repositoryplugins.updateItems(data.plugins);}else{self.repositoryplugins.updateItems([]);}};self.fromPipResponse=function(data){self.pipAvailable(data.available);if(data.available){self.pipVersion(data.version);self.pipInstallDir(data.install_dir);self.pipUseUser(data.use_user);self.pipVirtualEnv(data.virtual_env);self.pipAdditionalArgs(data.additional_args);self.pipPython(data.python);}else{self.pipVersion(undefined);self.pipInstallDir(undefined);self.pipUseUser(undefined);self.pipVirtualEnv(undefined);self.pipAdditionalArgs(undefined);}};self.fromSupportedExtensionsResponse=function(data){if(!data)return;self.supportedArchiveExtensions(data.archive||[]);self.supportedPythonExtensions(data.python||[]);self.supportedJsonExtensions(data.json||[]);};self.dataPluginsDeferred=undefined;self.requestPluginData=function(options){if(!_.isPlainObject(options)){options={};}
-if(self.dataPluginsDeferred&&self.dataPluginsDeferred.state()==="pending"&&!!!options.refresh){return self.dataPluginsDeferred.promise();}
-var deferred=new $.Deferred();if(!!!options.refresh){self.dataPluginsDeferred=deferred;}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){deferred.fail();return deferred.promise();}
-OctoPrint.plugins.pluginmanager.getPlugins(!!options.refresh).fail(function(){self.requestError(true);deferred.reject();}).done(function(data){self.requestError(false);self.fromPluginsResponse(data.plugins,options);self.fromPipResponse(data.pip);self.fromSupportedExtensionsResponse(data.supported_extensions);self.safeMode(data.safe_mode||false);deferred.resolveWith(data);});return deferred.promise();};self.dataOrphansDeferred=undefined;self.requestOrphanData=function(options){if(!_.isPlainObject(options)){options={};}
-if(self.dataOrphansDeferred&&self.dataOrphansDeferred.state()==="pending"&&!!!options.refresh){return self.dataOrphansDeferred.promise();}
-var deferred=new $.Deferred();if(!!!options.refresh){self.dataOrphansDeferred=deferred;}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){deferred.fail();return deferred.promise();}
-OctoPrint.plugins.pluginmanager.getOrphans(!!options.refresh).fail(function(){deferred.reject();}).done(function(data){self.fromOrphanResponse(data.orphans);deferred.resolveWith(data);});return deferred.promise();};self.dataRepositoryDeferred=undefined;self.requestRepositoryData=function(options){if(!_.isPlainObject(options)){options={};}
-if(self.dataRepositoryDeferred&&self.dataRepositoryDeferred.state()==="pending"&&!!!options.refresh){return self.dataRepositoryDeferred.promise();}
-var deferred=new $.Deferred();if(!!!options.refresh){self.dataRepositoryDeferred=deferred;}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){deferred.fail();return deferred.promise();}
-OctoPrint.plugins.pluginmanager.getRepository(!!options.refresh,{ifModified:true}).fail(function(){deferred.reject();}).done(function(data,status,xhr){if(xhr.status===304)return;self.fromRepositoryResponse(data.repository);self.online(data.online!==undefined?data.online:true);deferred.resolveWith(data);});return deferred.promise();};self.togglePlugin=function(data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){return;}
-if(!self.enableManagement()){return;}
-if(data.key==="pluginmanager")return;var onSuccess=function(){self.requestPluginData().always(function(){self.toggling(false);});},onError=function(){self.toggling(false);new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});};var performDisabling=function(){if(self.toggling())return;self.toggling(true);OctoPrint.plugins.pluginmanager.disable(data.key).done(onSuccess).fail(onError);};var performEnabling=function(){if(data.safe_mode_victim)return;if(self.toggling())return;self.toggling(true);OctoPrint.plugins.pluginmanager.enable(data.key).done(onSuccess).fail(onError);};if(self._getToggleCommand(data)==="enable"){performEnabling();}else{if(data.disabling_discouraged){var message=_.sprintf(gettext('You are about to disable "%(name)s".'),{name:_.escape(data.name)})+""+
-data.disabling_discouraged;showConfirmationDialog({title:gettext("This is not recommended"),message:message,question:gettext("Do you still want to disable it?"),cancel:gettext("Keep enabled"),proceed:gettext("Disable anyway"),onproceed:performDisabling});}
-else if(self.settingsViewModel.settings.plugins.pluginmanager.confirm_disable()){showConfirmationDialog({message:_.sprintf(gettext('You are about to disable "%(name)s"'),{name:_.escape(data.name)}),cancel:gettext("Keep enabled"),proceed:gettext("Disable plugin"),onproceed:performDisabling,nofade:true});}else{performDisabling();}}};self._bulkOperation=function(plugins,title,message,successText,failureText,statusText,callback,alreadyCheck){var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:_.sprintf(message,{count:plugins.length}),max:plugins.length,output:true};showProgressModal(options,promise);var handle=function(key){var d=$.Deferred();var plugin=self.pluginLookup[key];if(!plugin){deferred.notify(_.sprintf(gettext("Can't resolve plugin with key %(key)s, skipping..."),{key:key}),false);d.reject();return d.promise();}
-if(!self.enableBulk(plugin)){deferred.notify(_.sprintf(gettext("Plugin %(plugin)s doesn't support bulk operations, skipping..."),{plugin:plugin.name||key}),false);d.reject();return d.promise();}
-if(alreadyCheck(plugin)){deferred.notify(_.sprintf(gettext("Plugin %(plugin)s is already %(status)s (or pending), skipping..."),{plugin:plugin.name||key,status:statusText}),true);d.reject();return d.promise();}
-callback(plugin).done(function(){deferred.notify(_.sprintf(successText,{plugin:plugin.name||key}),true);d.resolve();}).fail(function(){deferred.notify(_.sprintf(failureText,{plugin:plugin.name||key}),false);d.reject();});return d.promise();};var operations=[];_.each(plugins,function(key){operations.push(handle(key));});$.when.apply($,_.map(operations,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestPluginData();});return promise;};self.enableSelectedPlugins=function(){if(self.selectedPlugins().length===0)return;var callback=function(plugin){return OctoPrint.plugins.pluginmanager.enable(plugin.key);};var check=function(plugin){return plugin.enabled||plugin.pending_enable;};self.toggling(true);self._bulkOperation(self.selectedPlugins(),gettext("Enabling plugins"),gettext("Enabling %(count)i plugins"),gettext("Enabled plugin %(plugin)s..."),gettext("Enabling plugin %(plugin)s failed, continuing..."),gettext("enabled"),callback,check).done(function(){self.selectedPlugins([]);}).always(function(){self.toggling(false);});};self.disableSelectedPlugins=function(){if(self.selectedPlugins().length===0)return;var callback=function(plugin){return OctoPrint.plugins.pluginmanager.disable(plugin.key);};var check=function(plugin){return!plugin.enabled||plugin.pending_disable;};self.toggling(true);self._bulkOperation(self.selectedPlugins(),gettext("Disabling plugins"),gettext("Disabling %(count)i plugins"),gettext("Disabled plugin %(plugin)s..."),gettext("Disabling plugin %(plugin)s failed, continuing..."),gettext("disabled"),callback,check).done(function(){self.selectedPlugins([]);}).always(function(){self.toggling(false);});};self.selectAllVisiblePlugins=function(){var selection=[];_.each(self.plugins.paginatedItems(),function(plugin){if(!self.enableBulk(plugin))return;selection.push(plugin.key);});self.selectedPlugins(selection);};self.clearPluginsSelection=function(){self.selectedPlugins([]);};self.showRepository=()=>{self.loginState.reauthenticateIfNecessary(()=>{self.repositoryDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);},show:true});});};self.pluginDetails=function(data){window.open(data.page);};self.installFromRepository=function(data){self.installPlugin(data.archive,data.title,self.installed(data)?data.id:undefined,data.follow_dependency_links||self.followDependencyLinks(),true);};self.removeFromQueue=function(plugin){var data={plugin:{command:self.installed(plugin)?"reinstall":"install",url:plugin.archive,dependency_links:plugin.follow_dependency_links||self.followDependencyLinks()}};OctoPrint.simpleApiCommand("pluginmanager","clear_queued_plugin",data).done(function(response){self.queuedInstalls(response.queued_installs);});};self.installPlugin=function(url,name,reinstall,followDependencyLinks,fromRepo){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_INSTALL)){return;}
-if(self.throttled()){return;}
-if(url===undefined){url=self.installUrl();}
-if(!url)return;if(followDependencyLinks===undefined){followDependencyLinks=self.followDependencyLinks();}
-self.loginState.reauthenticateIfNecessary(()=>{var workTitle,workText;if(!reinstall){workTitle=gettext("Installing plugin...");if(name){workText=_.sprintf(gettext('Installing plugin "%(name)s" from %(url)s...'),{url:_.escape(url),name:_.escape(name)});}else{workText=_.sprintf(gettext("Installing plugin from %(url)s..."),{url:_.escape(url)});}}else{workTitle=gettext("Reinstalling plugin...");workText=_.sprintf(gettext('Reinstalling plugin "%(name)s" from %(url)s...'),{url:_.escape(url),name:_.escape(name)});}
-if(self.multiInstallRunning()){workTitle=_.sprintf("[%(index)d/%(total)d] ",{index:this.multiInstallInitialSize()-
-self.multiInstallQueue().length,total:this.multiInstallInitialSize()})+workTitle;}
-self._markWorking(workTitle,workText);var onSuccess=function(response){self.installUrl("");if(response.hasOwnProperty("queued_installs")){self.queuedInstalls(response.queued_installs);var text='
'+
-gettext("The following plugins are queued to be installed.")+"
"+
-_.map(response.queued_installs,function(info){var plugin=ko.utils.arrayFirst(self.repositoryplugins.paginatedItems(),function(item){return item.archive===info.url;});return plugin.title;}).join(" ")+" ";if(typeof self.installQueuePopup!=="undefined"){self.installQueuePopup.update({text:text});if(self.installQueuePopup.state==="closed"){self.installQueuePopup.open();}}else{self.installQueuePopup=new PNotify({title:gettext("Plugin installs queued"),text:text,type:"notice"});}
-if(self.multiInstallQueue().length>0){self.performMultiInstallJob();}else{self.multiInstallRunning(false);self.workingDialog.modal("hide");self._markDone();}}},onError=function(jqXHR){if(jqXHR.status===409){self._markDone("There's already another plugin install in progress.");}else{self._markDone("Could not install plugin, unknown error, please consult octoprint.log for details");new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});}};if(reinstall){OctoPrint.plugins.pluginmanager.reinstall(reinstall,url,followDependencyLinks,fromRepo).done(onSuccess).fail(onError);}else{OctoPrint.plugins.pluginmanager.install(url,followDependencyLinks,fromRepo).done(onSuccess).fail(onError);}});};self.uninstallPlugin=function(data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){return;}
-if(!self.enableUninstall(data)){return;}
-if(data.bundled)return;if(data.key==="pluginmanager")return;var performUninstall=function(cleanup){self._markWorking(gettext("Uninstalling plugin..."),_.sprintf(gettext('Uninstalling plugin "%(name)s"'),{name:_.escape(data.name)}));OctoPrint.plugins.pluginmanager.uninstall(data.key,cleanup).done(function(){self.requestPluginData();}).fail(function(){new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});}).always(function(){self._markDone();});};showConfirmationDialog({message:_.sprintf(gettext('You are about to uninstall the plugin "%(name)s"'),{name:_.escape(data.name)}),cancel:gettext("Keep installed"),proceed:[gettext("Uninstall"),gettext("Uninstall & clean up data")],onproceed:function(button){performUninstall(button===1);},nofade:true});};self.cleanupPlugin=function(data){var key,name;if(_.isObject(data)){key=data.key;name=data.name;}else{key=name=data;}
-if(!self.loginState.isAdmin()){return;}
-if(key==="pluginmanager")return;var performCleanup=function(){self._markWorking(gettext("Cleaning up plugin data..."),_.sprintf(gettext('Cleaning up data of plugin "%(name)s"'),{name:_.escape(name)}));OctoPrint.plugins.pluginmanager.cleanup(key).done(function(){self.requestOrphanData();}).fail(function(){new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});}).always(function(){self._markDone();});};showConfirmationDialog({message:_.sprintf(gettext('You are about to cleanup the plugin data of "%(name)s". This operation cannot be reversed.'),{name:_.escape(name)}),cancel:gettext("Keep data"),proceed:gettext("Cleanup data"),onproceed:performCleanup,nofade:true});};self.cleanupAll=function(){if(!self.loginState.isAdmin()){return;}
-var performCleanup=function(){var title=gettext("Cleaning up all left over plugin data...");self._markWorking(title,title);OctoPrint.plugins.pluginmanager.cleanupAll().fail(function(){new PNotify({title:gettext("Something went wrong"),text:gettext("Please consult octoprint.log for details"),type:"error",hide:false});}).always(function(){self._markDone();});};showConfirmationDialog({message:gettext("You are about to cleanup left over plugin settings and data of plugins no longer installed. This operation cannot be reversed."),cancel:gettext("Keep data"),proceed:gettext("Cleanup all data"),onproceed:performCleanup,nofade:true});};self.refreshRepository=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_INSTALL)){return;}
-self.requestRepositoryData({refresh:true});};self.refreshNotices=function(){if(!self.loginState.isAdmin()){return;}
-self.requestPluginData({refresh:true,eval_notices:true,ignore_notice_hidden:true,ignore_notice_ignored:true});};self.reshowNotices=function(){if(!self.loginState.isAdmin()){return;}
-self.requestPluginData({eval_notices:true,ignore_notice_hidden:true,ignore_notice_ignored:true});};self.showPluginSettings=function(){self._copyConfig();self.configurationDialog.modal();};self.savePluginSettings=function(){var repository=self.config_repositoryUrl();if(repository!==null&&repository.trim()===""){repository=null;}
-var repositoryTtl;try{repositoryTtl=parseInt(self.config_repositoryTtl());}catch(ex){repositoryTtl=null;}
-var notices=self.config_noticesUrl();if(notices!==null&¬ices.trim()===""){notices=null;}
-var noticesTtl;try{noticesTtl=parseInt(self.config_noticesTtl());}catch(ex){noticesTtl=null;}
-var pipArgs=self.config_pipAdditionalArgs();if(pipArgs!==null&&pipArgs.trim()===""){pipArgs=null;}
-var data={plugins:{pluginmanager:{repository:repository,repository_ttl:repositoryTtl,notices:notices,notices_ttl:noticesTtl,pip_args:pipArgs,pip_force_user:self.config_pipForceUser(),confirm_disable:self.config_confirmDisable()}}};self.settingsViewModel.saveData(data,function(){self.configurationDialog.modal("hide");self._copyConfig();self.requestPluginData({refresh:true,eval_notices:true});if(self.repositoryAvailable()!==undefined){self.requestRepositoryData({refresh:true});}});};self._copyConfig=function(){self.config_repositoryUrl(self.settingsViewModel.settings.plugins.pluginmanager.repository());self.config_repositoryTtl(self.settingsViewModel.settings.plugins.pluginmanager.repository_ttl());self.config_noticesUrl(self.settingsViewModel.settings.plugins.pluginmanager.notices());self.config_noticesTtl(self.settingsViewModel.settings.plugins.pluginmanager.notices_ttl());self.config_pipAdditionalArgs(self.settingsViewModel.settings.plugins.pluginmanager.pip_args());self.config_pipForceUser(self.settingsViewModel.settings.plugins.pluginmanager.pip_force_user());self.config_confirmDisable(self.settingsViewModel.settings.plugins.pluginmanager.confirm_disable());};self.installed=function(data){return _.includes(self.installedPlugins(),data.id);};self.isCompatible=function(data){return(data.is_compatible.octoprint&&data.is_compatible.os&&data.is_compatible.python);};self.installButtonAction=function(data){if(self.enableRepoInstall(data)){if(!self.installQueued(data)){self.installFromRepository(data);}else{self.removeFromQueue(data);}}else{return false;}};self.installButtonText=function(data){if(!self.isCompatible(data)){if(data.disabled){return gettext("Disabled");}else{return gettext("Incompatible");}}
-if(self.installQueued(data)){return gettext("Dequeue");}else if(self.installed(data)){return gettext("Reinstall");}else{return gettext("Install");}};self._processPluginManagementResult=function(response,action,plugin){if(response.type=="partial_result"){if(!response.result){self.loglines.push({line:gettext("Error!"),stream:"error"});self.loglines.push({line:response.reason,stream:"error"});if(response.faq){self.loglines.push({line:_.sprintf(gettext("You can find more info on this issue in the FAQ at %(url)s"),{url:faq}),stream:"error"});}}
-self.loglines.push({line:"",stream:"separator"});self.loglines.push({line:_.repeat("+",50),stream:"separator"});self.loglines.push({line:"",stream:"separator"});}else{if(response.result){if(self.queuedInstalls().length>0&&action==="install"){var plugin_dequeue=ko.utils.arrayFirst(self.queuedInstalls(),function(item){return item.url===response.source;});if(plugin_dequeue){self.queuedInstalls.remove(plugin_dequeue);}
-if(self.queuedInstalls().length===0){self.multiInstallRunning(false);self._markDone();}}else if(self.multiInstallRunning()&&action==="install"){self.alertMultiInstallJobDone(response);}else{self._markDone();}}else{self._markDone(response.reason,response.faq);}}
-self._addPluginManagementLog(response,action,plugin);self._displayPluginManagementNotification();};self._extractActionAndNameFromResult=function(result){var action=result.action;var name="Unknown";if(result.hasOwnProperty("plugin")){if(result.plugin!=="unknown"){if(_.isPlainObject(result.plugin)){name=result.plugin.name;}else{name=result.plugin;}}}
-return{action:action,name:name};};self._addPluginManagementLog=function(response,action,plugin){self.logContents.action.restart=self.logContents.action.restart||response.needs_restart;self.logContents.action.refresh=self.logContents.action.refresh||response.needs_refresh;self.logContents.action_reconnect=self.logContents.action.reconnect||response.needs_reconnect;self.logContents.steps.push({action:action,plugin:plugin,result:response.result,faq:response.faq});};self._displayPluginManagementNotification=function(){var title=gettext("Plugin management log");var text="
";var steps=self.logContents.steps;if(steps.length>5){var count=steps.length-5;var line;if(count>1){line=gettext("%(count)d earlier actions...");}else{line=gettext("%(count)d earlier action");}
-text+=""+_.sprintf(line,{count:count})+" ";steps=steps.slice(steps.length-5);}
-var negativeResult=false;_.each(steps,function(step){var line=undefined;switch(step.action){case"install":{line=gettext("Install %(plugin)s : %(result)s");break;}
-case"uninstall":{line=gettext("Uninstall %(plugin)s : %(result)s");break;}
-case"enable":{line=gettext("Enable %(plugin)s : %(result)s");break;}
-case"disable":{line=gettext("Disable %(plugin)s : %(result)s");break;}
-case"cleanup":{line=gettext("Cleanup %(plugin)s : %(result)s");break;}
-case"cleanup_all":{line=gettext("Cleanup all: %(result)s");break;}
-default:{return;}}
-text+=""+
-_.sprintf(line,{plugin:_.escape(step.plugin),result:step.result?' ':' '})+
-(step.result===false&&step.faq?' ('+
-gettext("Why?")+" )":"")+" ";negativeResult=negativeResult||step.result===false;});text+=" ";var confirm=undefined;var type="success";if(self.logContents.action.restart){text+=""+
-gettext("A restart is needed for the changes to take effect.")+"
";type="warning";if(self.restartCommandSpec&&!self.multiInstallRunning()&&!self.working()){var restartClicked=false;confirm={confirm:true,buttons:[{text:gettext("Restart now"),click:function(notice){if(restartClicked)return;restartClicked=true;showConfirmationDialog({message:gettext("This will restart your OctoPrint server. This action may disrupt any ongoing print jobs (depending on your printer's controller and general setup that might also apply to prints run directly from your printer's internal storage)."),onproceed:function(){OctoPrint.system.executeCommand("core","restart").done(function(){notice.remove();new PNotify({title:gettext("Restart in progress"),text:gettext("The server is now being restarted in the background")});}).fail(function(){new PNotify({title:gettext("Something went wrong"),text:gettext("Trying to restart the server produced an error, please check octoprint.log for details. You'll have to restart manually.")});});},onclose:function(){restartClicked=false;}});}}]};}}else if(self.logContents.action.refresh){text+="
"+
-gettext("A refresh is needed for the changes to take effect.")+"
";type="warning";if(!self.multiInstallRunning()&&!self.working()){var refreshClicked=false;confirm={confirm:true,buttons:[{text:gettext("Reload now"),click:function(){if(refreshClicked)return;refreshClicked=true;location.reload(true);}}]};}}else if(self.logContents.action_reconnect){text+=""+
-gettext("A reconnect to the printer is needed for the changes to take effect.")+"
";type="warning";}
-if(negativeResult)type="error";var options={title:title,text:text,type:type,hide:false};if(confirm!==undefined){options.confirm=confirm;if(self.logNotification===undefined){self.logNotification=PNotify.singleButtonNotify(options);}else{self.logNotification.update(options);self.logNotification=PNotify.fixSingleButton(self.logNotification,options);}}else{if(self.logNotification===undefined){self.logNotification=new PNotify(options);}else{self.logNotification.update(options);}}
-if(self.logNotification.state!=="open"&&self.logNotification.state!=="opening"){self.logNotification.open();}};self._markWorking=function(title,line){self.working(true);self.workingTitle(title);self.loglines.removeAll();self.loglines.push({line:line,stream:"message"});self._scrollWorkingOutputToEnd();self.workingDialog.modal({keyboard:false,backdrop:"static",show:true});};self._markDone=function(error,faq){self.working(false);if(error){self.loglines.push({line:gettext("Error!"),stream:"error"});self.loglines.push({line:error,stream:"error"});if(faq){self.loglines.push({line:_.sprintf(gettext("You can find more info on this issue in the FAQ at %(url)s"),{url:faq}),stream:"error"});}}else{self.loglines.push({line:gettext("Done!"),stream:"message"});}
-self._scrollWorkingOutputToEnd();};self._scrollWorkingOutputToEnd=function(){self.workingOutput.scrollTop(self.workingOutput[0].scrollHeight-self.workingOutput.height());};self._getToggleCommand=function(data){var disable=(data.enabled||(data.safe_mode_victim&&!data.forced_disabled)||data.pending_enable)&&!data.pending_disable;return disable?"disable":"enable";};self.toggleButtonCss=function(data){var icon,disabled;if(self.toggling()){icon="fa fa-spin fa-spinner";disabled=" disabled";}else{icon=self._getToggleCommand(data)==="enable"?"fa fa-toggle-off":"fa fa-toggle-on";disabled=self.enableToggle(data)?"":" disabled";}
-return icon+disabled;};self.toggleButtonTitle=function(data){var command=self._getToggleCommand(data);if(command==="enable"){if(data.blacklisted){return gettext("Blacklisted");}else if(data.safe_mode_victim){return gettext("Disabled due to active safe mode");}else{return gettext("Enable Plugin");}}else{return gettext("Disable Plugin");}};self.showPluginNotifications=function(plugin){if(!plugin.notifications||plugin.notifications.length===0)return;self._removeAllNoticeNotificationsForPlugin(plugin.key);_.each(plugin.notifications,function(notification){self._showPluginNotification(plugin,notification);});};self.showPluginNotificationsLinkText=function(plugins){if(!plugins.notifications||plugins.notifications.length===0)return;var count=plugins.notifications.length;var importantCount=_.filter(plugins.notifications,function(notification){return notification.important;}).length;if(count>1){if(importantCount){return _.sprintf(gettext("There are %(count)d notices (%(important)d marked as important) available regarding this plugin - click to show!"),{count:count,important:importantCount});}else{return _.sprintf(gettext("There are %(count)d notices available regarding this plugin - click to show!"),{count:count});}}else{if(importantCount){return gettext("There is an important notice available regarding this plugin - click to show!");}else{return gettext("There is a notice available regarding this plugin - click to show!");}}};self._showPluginNotification=function(plugin,notification){var name=plugin.name;var version=plugin.version;var important=notification.important;var link=notification.link;var title;if(important){title=_.sprintf(gettext('Important notice regarding plugin "%(name)s"'),{name:_.escape(name)});}else{title=_.sprintf(gettext('Notice regarding plugin "%(name)s"'),{name:_.escape(name)});}
-var text="";if(notification.versions&¬ification.versions.length>0){var versions=_.map(notification.versions,function(v){return v===version?""+_.escape(v)+" ":_.escape(v);}).join(", ");text+=""+
-_.sprintf(gettext("Affected versions: %(versions)s"),{versions:versions})+" ";}else{text+=""+gettext("Affected versions: all")+" ";}
-text+=""+notification.text+"
";if(link){text+=""+
-gettext("Read more...")+"
";}
-var beforeClose=function(notification){if(!self.noticeNotifications[plugin.key])return;self.noticeNotifications[plugin.key]=_.without(self.noticeNotifications[plugin.key],notification);};var options={title:title,text:text,type:important?"error":"notice",before_close:beforeClose,hide:false,confirm:{confirm:true,buttons:[{text:gettext("Later"),click:function(notice){self._hideNoticeNotification(plugin.key,notification.date);notice.remove();notice.get().trigger("pnotify.cancel",notice);}},{text:gettext("Mark read"),click:function(notice){self._ignoreNoticeNotification(plugin.key,notification.date);notice.remove();notice.get().trigger("pnotify.cancel",notice);}}]},buttons:{sticker:false,closer:false}};if(!self.noticeNotifications[plugin.key]){self.noticeNotifications[plugin.key]=[];}
-self.noticeNotifications[plugin.key].push(new PNotify(options));};self._removeAllNoticeNotifications=function(){_.each(_.keys(self.noticeNotifications),function(key){self._removeAllNoticeNotificationsForPlugin(key);});};self._removeAllNoticeNotificationsForPlugin=function(key){if(!self.noticeNotifications[key]||!self.noticeNotifications[key].length)
-return;_.each(self.noticeNotifications[key],function(notification){notification.remove();});};self._hideNoticeNotification=function(key,date){if(!self.hiddenNoticeNotifications[key]){self.hiddenNoticeNotifications[key]=[];}
-if(!_.contains(self.hiddenNoticeNotifications[key],date)){self.hiddenNoticeNotifications[key].push(date);}};self._isNoticeNotificationHidden=function(key,date){if(!self.hiddenNoticeNotifications[key])return false;return _.any(_.map(self.hiddenNoticeNotifications[key],function(d){return date===d;}));};var noticeLocalStorageKey="plugin.pluginmanager.seen_notices";self._ignoreNoticeNotification=function(key,date){if(!Modernizr.localstorage)return false;if(!self.loginState.isAdmin())return false;var currentString=localStorage[noticeLocalStorageKey];var current;if(currentString===undefined){current={};}else{current=JSON.parse(currentString);}
-if(!current[self.loginState.username()]){current[self.loginState.username()]={};}
-if(!current[self.loginState.username()][key]){current[self.loginState.username()][key]=[];}
-if(!_.contains(current[self.loginState.username()][key],date)){current[self.loginState.username()][key].push(date);localStorage[noticeLocalStorageKey]=JSON.stringify(current);}};self._isNoticeNotificationIgnored=function(key,date){if(!Modernizr.localstorage)return false;if(localStorage[noticeLocalStorageKey]===undefined)return false;var knownData=JSON.parse(localStorage[noticeLocalStorageKey]);if(!self.loginState.isAdmin())return true;var userData=knownData[self.loginState.username()];if(userData===undefined)return false;return userData[key]&&_.contains(userData[key],date);};self.onBeforeBinding=function(){self.settings=self.settingsViewModel.settings;};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){self.requestPluginData({eval_notices:true});}else{self._resetNotifications();}};self.onSettingsShown=function(){if(self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){self.requestRepositoryData();self.requestOrphanData();}};self.onEventConnectivityChanged=function(payload){self.requestPluginData({eval_notices:true});};self._resetNotifications=function(){self._closeAllNotifications();self.logContents.action.restart=self.logContents.action.reload=self.logContents.action.reconnect=false;self.logContents.steps=[];};self._closeAllNotifications=function(){if(self.logNotification){self.logNotification.remove();}};self.onServerDisconnect=function(){self._resetNotifications();return true;};self.onStartup=function(){self.workingDialog=$("#settings_plugin_pluginmanager_workingdialog");self.workingOutput=$("#settings_plugin_pluginmanager_workingdialog_output");self.repositoryDialog=$("#settings_plugin_pluginmanager_repositorydialog");};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="pluginmanager"){return;}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_PLUGINMANAGER_MANAGE)){return;}
-if(!data.hasOwnProperty("type")){return;}
-var messageType=data.type;if(messageType==="loglines"&&(self.working()||self.queuedInstalls().length>0)){_.each(data.loglines,function(line){self.loglines.push(self._preprocessLine(line));});self._scrollWorkingOutputToEnd();}else if(messageType==="result"||messageType==="partial_result"){var{action,name}=self._extractActionAndNameFromResult(data);self._processPluginManagementResult(data,action,name);if(messageType==="result"){self._displayPluginManagementNotification();self.requestPluginData();}}else if(messageType==="queued_installs"){if(data.hasOwnProperty("queued")){self.queuedInstalls(data.queued);var queuedInstallsPopupOptions={title:gettext("Queued Installs"),text:"",type:"notice",icon:false,hide:false,buttons:{closer:false,sticker:false},history:{history:false}};if(data.print_failed&&data.queued.length>0){queuedInstallsPopupOptions.title=gettext("Queued Installs Paused");queuedInstallsPopupOptions.text=''+
-gettext("The following plugins are queued to be installed.")+"
"+
-_.map(self.queuedInstalls(),function(info){var plugin=ko.utils.arrayFirst(self.repositoryplugins.paginatedItems(),function(item){return item.archive===info.url;});return plugin.title;}).join(" ")+" ";queuedInstallsPopupOptions.confirm={confirm:true,buttons:[{text:gettext("Continue Installs"),addClass:"btn-block btn-primary",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.continue",[notice,value]);}},{text:gettext("Cancel Installs"),addClass:"btn-block btn-danger",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.cancel",[notice,value]);}}]};}else if(data.hasOwnProperty("timeout_value")&&data.timeout_value>0&&data.queued.length>0){var progress_percent=Math.floor((data.timeout_value/60)*100);var progress_class=progress_percent<25?"progress-danger":progress_percent>75?"progress-success":"progress-warning";var countdownText=_.sprintf(gettext("Installing in %(sec)i secs..."),{sec:data.timeout_value});queuedInstallsPopupOptions.title=gettext("Starting Queued Installs");queuedInstallsPopupOptions.text=''+
-gettext("The following plugins are going to be installed.")+"
"+
-_.map(self.queuedInstalls(),function(info){var plugin=ko.utils.arrayFirst(self.repositoryplugins.paginatedItems(),function(item){return item.archive===info.url;});return plugin.title;}).join(" ")+' '+
-countdownText+'
'+
-countdownText+"
";queuedInstallsPopupOptions.confirm={confirm:true,buttons:[{text:gettext("Cancel Installs"),addClass:"btn-block btn-danger",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.cancel",[notice,value]);}},{text:"",addClass:"hidden"}]};}else if(data.hasOwnProperty("timeout_value")&&data.timeout_value===0&&data.queued.length>0){self.multiInstallRunning(true);self._markWorking(gettext("Installing queued plugins"),gettext("Starting installation of multiple plugins..."));self.queuedInstallsPopup.remove();self.queuedInstallsPopup=undefined;return;}else{if(typeof self.queuedInstallsPopup!=="undefined"){self.queuedInstallsPopup.remove();self.queuedInstallsPopup=undefined;}
-return;}
-if(typeof self.queuedInstallsPopup!=="undefined"){self.queuedInstallsPopup.update(queuedInstallsPopupOptions);}else{self.queuedInstallsPopup=new PNotify(queuedInstallsPopupOptions);self.queuedInstallsPopup.get().on("pnotify.cancel",function(){self.queuedInstallsPopup=undefined;self.cancelQueuedInstalls();});self.queuedInstallsPopup.get().on("pnotify.continue",function(){self.queuedInstallsPopup=undefined;self.performQueuedInstalls();});}}}};self.cancelQueuedInstalls=function(){OctoPrint.simpleApiCommand("pluginmanager","clear_queued_installs",{}).done(function(response){self.queuedInstalls(response.queued_installs);});};self.installQueued=function(plugin){var plugin_queued=ko.utils.arrayFirst(self.queuedInstalls(),function(item){return item.url===plugin.archive;});return typeof plugin_queued!=="undefined";};self.performQueuedInstalls=function(){self.queuedInstalls().forEach(function(plugin){var queued_plugin=ko.utils.arrayFirst(self.repositoryplugins.paginatedItems(),function(item){return plugin.url===item.archive;});self.multiInstallQueue.push(queued_plugin);});self.startMultiInstall();};self._forcedStdoutLine=/You are using pip version .*?, however version .*? is available\.|You should consider upgrading via the '.*?' command\./;self._preprocessLine=function(line){if(line.stream==="stderr"&&line.line.match(self._forcedStdoutLine)){line.stream="stdout";}
-return line;};}
-OCTOPRINT_VIEWMODELS.push({construct:PluginManagerViewModel,dependencies:["loginStateViewModel","settingsViewModel","printerStateViewModel","systemViewModel","accessViewModel","piSupportViewModel"],optional:["piSupportViewModel"],elements:["#settings_plugin_pluginmanager"]});});
-;
-
-// source: plugin/softwareupdate/js/softwareupdate.js
-$(function(){function SoftwareUpdateViewModel(parameters){var self=this;self.loginState=parameters[0];self.printerState=parameters[1];self.settings=parameters[2];self.access=parameters[3];self.piSupport=parameters[4];self.popup=undefined;self.updateInProgress=false;self.cancelInProgress=false;self.waitingForRestart=false;self.restartTimeout=undefined;self.currentlyBeingUpdated=[];self.queuedUpdates=ko.observableArray([]);self.working=ko.observable(false);self.workingTitle=ko.observable();self.workingDialog=undefined;self.workingOutput=undefined;self.loglines=ko.observableArray([]);self.checking=ko.observable(false);self.octoprintReleasedVersion=ko.observable();self.octoprintUnconfigured=ko.pureComputed(function(){return(self.settings.settings.plugins.softwareupdate.octoprint_type()==="git_commit"&&self.error_checkoutFolder());});self.octoprintUnreleased=ko.pureComputed(function(){return(self.settings.settings.plugins.softwareupdate.octoprint_type()==="github_release"&&!self.octoprintReleasedVersion());});self.environmentSupported=ko.observable(true);self.environmentVersions=ko.observableArray([]);self.storageSufficient=ko.observable(true);self.storageFree=ko.observableArray([]);self.cacheTimestamp=ko.observable();self.cacheTimestampText=ko.pureComputed(function(){return formatDate(self.cacheTimestamp());});self.config_cacheTtl=ko.observable();self.config_notifyUsers=ko.observable();self.config_trackedBranch=ko.observable();self.config_checkoutFolder=ko.observable();self.config_pipTarget=ko.observable();self.config_checkType=ko.observable();self.config_releaseChannel=ko.observable();self.config_pipEnableCheck=ko.observable();self.config_minimumFreeStorage=ko.observable();self.config_githubToken=ko.observable();self.config_githubTokenSet=ko.observable(false);self.error_checkoutFolder=ko.pureComputed(function(){return(self.config_checkType()==="git_commit"&&(!self.config_checkoutFolder()||self.config_checkoutFolder().trim()===""));});self.enableUpdate=ko.pureComputed(function(){return(!self.updateInProgress&&self.environmentSupported()&&self.storageSufficient()&&!self.throttled());});self.enableUpdateAll=ko.pureComputed(function(){return self.enableUpdate()&&self.availableAndPossible().length>0;});self.enableUpdateEnabled=ko.pureComputed(function(){return(self.enableUpdate()&&self.availableAndPossibleAndEnabled().length>0);});self.enableCancelQueued=ko.pureComputed(function(){return self.queuedUpdates().length>0;});self.updateQueued=function(item){return self.queuedUpdates().indexOf(item.key)>-1;};self.enable_configSave=ko.pureComputed(function(){return(self.config_checkType()==="github_release"||self.config_checkType()==="github_commit"||(self.config_checkType()==="git_commit"&&!self.error_checkoutFolder()));});self.configurationDialog=undefined;self._updateClicked=false;self.config_availableCheckTypes=ko.observableArray([]);self.config_availableReleaseChannels=ko.observableArray([]);self.reloadOverlay=$("#reloadui_overlay");self.versions=new ItemListHelper("plugin.softwareupdate.versions",{name:function(a,b){if(a.key.toLocaleLowerCase()==="octoprint")return-1;if(b.key.toLocaleLowerCase()==="octoprint")return 1;if(a.displayName.toLocaleLowerCase()b.displayName.toLocaleLowerCase())
-return 1;return 0;}},{},"name",[],[],0);self.octoprintData={item:undefined,current:ko.observable("unknown"),available:ko.observable("unknown")};self.updatelog=ko.observableArray([]);self.availableAndPossible=ko.pureComputed(function(){return _.filter(self.versions.items(),function(info){return info.updateAvailable&&info.updatePossible;});});self.availableAndPossibleAndEnabled=ko.pureComputed(function(){return _.filter(self.versions.items(),function(info){return info.updateAvailable&&info.updatePossible&&!info.disabled;});});self.availableAndQueued=ko.pureComputed(function(){return _.filter(self.versions.items(),function(info){return(info.updateAvailable&&info.updatePossible&&self.queuedUpdates.indexOf(info.key)>-1);});});self.throttled=ko.pureComputed(function(){return(self.piSupport&&self.piSupport.currentIssue()&&!self.settings.settings.plugins.softwareupdate.ignore_throttled());});self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_CHECK)){self.performCheck();}else{self._closePopup();}
-if(self.loginState.hasPermission(self.access.permissions.ADMIN)){self.requestUpdatelog();}};self._showPopup=function(options,eventListeners,singleButtonNotify){singleButtonNotify=singleButtonNotify||false;self._closePopup();if(singleButtonNotify){self.popup=PNotify.singleButtonNotify(options);}else{self.popup=new PNotify(options);}
-if(eventListeners){var popupObj=self.popup.get();_.each(eventListeners,function(value,key){popupObj.on(key,value);});}};self._updatePopup=function(options){if(self.popup===undefined){self._showPopup(options);}else{self.popup.update(options);}};self._closePopup=function(){if(self.popup!==undefined){self.popup.remove();}};self.showPluginSettings=function(){self._copyConfig();self.configurationDialog.modal();};self.deleteGithubTokenApiKey=function(){var data={plugins:{softwareupdate:{credentials:{github:undefined}}}};self.settings.saveData(data,{success:function(){self.performCheck();},complete:function(){self.config_githubToken("");self.config_githubTokenSet(false);},sending:true});};self.savePluginSettings=function(viewModel,event){var target=$(event.target);target.prepend(' ');var githubToken=self.config_githubToken();var data={plugins:{softwareupdate:{cache_ttl:parseInt(self.config_cacheTtl()),notify_users:self.config_notifyUsers(),octoprint_type:self.config_checkType(),octoprint_release_channel:self.config_releaseChannel(),octoprint_checkout_folder:self.config_checkoutFolder(),octoprint_tracked_branch:self.config_trackedBranch(),octoprint_pip_target:self.config_pipTarget(),pip_enable_check:self.config_pipEnableCheck(),minimum_free_storage:self.config_minimumFreeStorage()}}};if(githubToken){data.plugins.softwareupdate.credentials={github:githubToken};}
-self.settings.saveData(data,{success:function(){self.configurationDialog.modal("hide");self._copyConfig();self.performCheck();},complete:function(){$("i.fa-spinner",target).remove();self.config_githubToken("");},sending:true});};self.onBeforeBinding=function(){self.queuedUpdates(self.settings.settings.plugins.softwareupdate.queued_updates());};self._copyConfig=function(){var availableCheckTypes=[{key:"github_release",name:gettext("Release")},{key:"github_commit",name:gettext("Github Commit")},{key:"git_commit",name:gettext("Local checkout")}];self.config_availableCheckTypes(availableCheckTypes);var availableReleaseChannels=[];_.each(self.settings.settings.plugins.softwareupdate.octoprint_branch_mappings(),function(mapping){availableReleaseChannels.push({key:mapping.branch(),name:gettext(mapping.name()||mapping.branch())});});self.config_availableReleaseChannels(availableReleaseChannels);self.config_cacheTtl(self.settings.settings.plugins.softwareupdate.cache_ttl());self.config_notifyUsers(self.settings.settings.plugins.softwareupdate.notify_users());self.config_checkType(self.settings.settings.plugins.softwareupdate.octoprint_type());self.config_releaseChannel(self.settings.settings.plugins.softwareupdate.octoprint_release_channel());self.config_checkoutFolder(self.settings.settings.plugins.softwareupdate.octoprint_checkout_folder());self.config_trackedBranch(self.settings.settings.plugins.softwareupdate.octoprint_tracked_branch());self.config_pipTarget(self.settings.settings.plugins.softwareupdate.octoprint_pip_target());self.config_pipEnableCheck(self.settings.settings.plugins.softwareupdate.pip_enable_check());self.config_minimumFreeStorage(self.settings.settings.plugins.softwareupdate.minimum_free_storage());self.config_githubTokenSet(self.settings.settings.plugins.softwareupdate.credentials.github_set());};self._copyConfigBack=function(){self.settings.settings.plugins.softwareupdate.octoprint_checkout_folder(self.config_checkoutFolder());self.settings.settings.plugins.softwareupdate.octoprint_type(self.config_checkType());};self._enrichInformation=function(key,information){information["key"]=key;if(!information.hasOwnProperty("displayName")||information.displayName===""){information.displayName=information.key;}
-if(!information.hasOwnProperty("displayVersion")||information.displayVersion===""){information.displayVersion=information.information.local.name;}
-if(!information.hasOwnProperty("releaseNotes")||information.releaseNotes===""){information.releaseNotes=undefined;}
-var fullNameTemplate=gettext("%(name)s: %(version)s");information.fullNameLocal=_.sprintf(fullNameTemplate,{name:_.escape(information.displayName),version:_.escape(information.displayVersion)});var fullNameRemoteVars={name:_.escape(information.displayName),version:gettext("unknown")};if(information.hasOwnProperty("information")&&information.information.hasOwnProperty("remote")&&information.information.remote.hasOwnProperty("name")){fullNameRemoteVars.version=_.escape(information.information.remote.name);}
-information.fullNameRemote=_.sprintf(fullNameTemplate,fullNameRemoteVars);if(information.releaseChannels&&information.releaseChannels.current){information.releaseChannels.current=ko.observable(information.releaseChannels.current);information.releaseChannels.current.subscribe(function(selected){var patch={};patch[key]={channel:selected};OctoPrint.plugins.softwareupdate.configure(patch).done(function(){self.performCheck(false,false,false,[key]);});});}
-information.toggleDisabled=function(){var patch={};patch[key]={disabled:!information.disabled};OctoPrint.plugins.softwareupdate.configure(patch).done(function(){self.performCheck(false,false,false,[key]);});};information.notificationIconTitle=function(){var update=information.updateAvailable?gettext("Update available"):gettext("Up-to-date");var notifications=information.disabled?gettext("notifications are muted"):gettext("notifications are enabled");return update+" ("+notifications+")";};return information;};self.fromCheckResponse=function(data,ignoreSeen,showIfNothingNew){self.cacheTimestamp(data.timestamp);var versions=[];_.each(data.information,function(value,key){self._enrichInformation(key,value);versions.push(value);});self.versions.updateItems(versions);var octoprint=data.information["octoprint"];self.octoprintReleasedVersion(!octoprint||octoprint.releasedVersion);self.environmentSupported(data.environment.supported);self.environmentVersions(data.environment.versions);self.storageSufficient(data.storage.sufficient);self.storageFree(data.storage.free);if(data.status==="inProgress"){self._markWorking(gettext("Updating..."),gettext("Updating, please wait."));return;}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_UPDATE)&&!self.settings.settings.plugins.softwareupdate.notify_users())
-return;if(data.status==="updateAvailable"||data.status==="updatePossible"){var text=""+
-gettext("There are updates available for the following components:");text+="
";_.each(self.versions.items(),function(update_info){if(update_info.updateAvailable&&!update_info.disabled&&update_info.compatible){text+=""+" "+""+
-update_info.fullNameRemote+" "+
-(update_info.releaseNotes?''+
-gettext("Release Notes")+" ":"")+" ";}});text+=" ";if(!self.environmentSupported()){text+="
"+
-gettext("This version of the Python environment is not supported for direct updates.")+"
";}else if(!self.storageSufficient()){text+="
"+
-gettext("There's currently not enough free disk space available for a direct update.")+"
";}else{text+="
"+
-gettext('Those components marked with can be updated directly.')+"
";}
-if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_UPDATE)){text+="
"+
-gettext("To have updates applied, get in touch with an administrator of this OctoPrint instance.")+"
";}
-text+="
";var options={title:gettext("Update Available"),text:text,hide:false};var eventListeners={};var singleButtonNotify=false;if(data.status==="updatePossible"&&self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_UPDATE)){options["confirm"]={confirm:true,buttons:[{text:gettext("Ignore"),click:function(){self._markNotificationAsSeen(data.information);self._showPopup({text:gettext('You can make this message display again via "Settings" > "Software Update" > "Check for update now"')});}},{text:gettext("Update now"),addClass:"btn-primary",click:function(){if(self._updateClicked)return;self._updateClicked=true;self.updateEnabled();}}]};options["buttons"]={closer:false,sticker:false};}else{options["confirm"]={confirm:true,buttons:[{text:gettext("Ignore"),click:function(notice){notice.remove();self._markNotificationAsSeen(data.information);}}]};options["buttons"]={closer:false,sticker:false};singleButtonNotify=true;}
-if((ignoreSeen||!self._hasNotificationBeenSeen(data.information))&&!OctoPrint.coreui.wizardOpen){self._showPopup(options,eventListeners,singleButtonNotify);}}else if(data.status==="current"){if(showIfNothingNew){self._showPopup({title:gettext("Everything is up-to-date"),type:"success"});}else{self._closePopup();}}};self.performCheck=function(showIfNothingNew,force,ignoreSeen,entries){self.checking(true);OctoPrint.plugins.softwareupdate.check({entries:entries,force:force}).done(function(data){self.fromCheckResponse(data,ignoreSeen,showIfNothingNew);}).always(function(){self.checking(false);});};self.fromUpdatelogResponse=function(response){self.updatelog(response.updatelog);};self.requestUpdatelog=function(){OctoPrint.plugins.softwareupdate.getUpdatelog().done(self.fromUpdatelogResponse);};self.iconTitleForEntry=function(data){if(data.updatePossible){return"";}else if(!data.online&&data.information&&data.information.needs_online){return gettext("No internet connection");}else if(data.error){return self.errorTextForEntry(data);}else{return gettext("Update not possible");}};self.errorTextForEntry=function(data){if(!data.error){return"";}
-switch(data.error){case"unknown_check":{return gettext("Unknown update check, configuration ok?");}
-case"needs_online":{return gettext("Cannot check for update, need online connection");}
-case"network":{return gettext("Network error while checking for update, please check the logs");}
-case"api":{return gettext("API error while checking for update, please check the logs");}
-case"ratelimit":{return gettext("Rate limit exceeded while checking for update, please try again later");}
-case"check":{return gettext("Check internal error while checking for update, please check the logs");}
-case"unknown":{return gettext("Unknown error while checking for update, please check the logs");}
-case"update":{return gettext("Unknown error while checking if update is possible, please check the logs");}
-case"windows":{return _.sprintf(gettext('Update not possible under Windows due to its strict file locking behaviour, please see the FAQ '),{url:"https://faq.octoprint.org/update-not-possible-windows"});}
-default:{return"";}}};self._markNotificationAsSeen=function(data){if(!Modernizr.localstorage)return false;var currentString=localStorage["plugin.softwareupdate.seen_information"];var current;if(currentString===undefined){current={};}else{current=JSON.parse(currentString);}
-current[self.loginState.username()]=self._informationToRemoteVersions(data);localStorage["plugin.softwareupdate.seen_information"]=JSON.stringify(current);};self._hasNotificationBeenSeen=function(data){if(!Modernizr.localstorage)return false;if(localStorage["plugin.softwareupdate.seen_information"]===undefined)
-return false;var knownData=JSON.parse(localStorage["plugin.softwareupdate.seen_information"]);var userData=knownData[self.loginState.username()];if(userData===undefined)return false;var freshData=self._informationToRemoteVersions(data);var hasBeenSeen=true;_.each(freshData,function(value,key){if(!_.has(userData,key)||userData[key]!==freshData[key]){hasBeenSeen=false;}});return hasBeenSeen;};self._informationToRemoteVersions=function(data){var result={};_.each(data,function(value,key){result[key]=value.information.remote.value;});return result;};self.performUpdate=function(force,items){if(!self.updateAccess())return;self.updateInProgress=true;var options={title:gettext("Updating..."),text:gettext("Now updating, please wait."),icon:"fa fa-cog fa-spin",hide:false,buttons:{closer:false,sticker:false}};self._showPopup(options);OctoPrint.plugins.softwareupdate.update(items,force).done(function(data){if(data.hasOwnProperty("queued")){self.queuedUpdates(data.queued);var message=""+
-gettext("The install of the following plugin update(s) has been queued for after current print is finished or cancelled.")+'
'+
-_.map(self.availableAndQueued(),function(info){return info.displayName;}).join(" ")+" ";self._showPopup({title:gettext("Updates Queued"),text:message,type:"info",buttons:{sticker:false}});self.updateInProgress=false;return;}
-self.currentlyBeingUpdated=data.checks;self._markWorking(gettext("Updating..."),gettext("Updating, please wait."));}).fail(function(response){self.updateInProgress=false;var message=""+
-gettext("The update could not be started. Is it already active? Please consult octoprint.log for details.")+"
"+
-_.escape(response.responseJSON.error)+" ";self._showPopup({title:gettext("Update not started!"),text:message,type:"error",hide:false,buttons:{sticker:false}});});};self.updateAll=function(force){return self.update(force,self.availableAndPossible());};self.updateEnabled=function(force){return self.update(force,self.availableAndPossibleAndEnabled());};self.updateAccess=function(){return(self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_UPDATE)||CONFIG_FIRST_RUN);};self.update=function(force,items){if(self.updateInProgress||!self.updateAccess()){self._updateClicked=false;return;}
-if(items===undefined){items=self.availableAndPossibleAndEnabled();}
-if(self.throttled()){self._showPopup({title:gettext("Can't update while throttled"),text:gettext("Your system is currently throttled. OctoPrint refuses to run updates while in this state due to possible stability issues."),type:"error"});self._updateClicked=false;return;}
-var html=""+
-gettext("This will update the following components and restart the server:")+"
";html+="";_.each(items,function(item){html+=""+''+
-item.fullNameRemote+" ";if(item.releaseNotes){html+=''+
-gettext("Release Notes")+" ";}
-html+=" ";});html+=" ";html+=""+
-gettext("Be sure to read through any linked release notes, especially those for OctoPrint since they might contain important information you need to know before upgrading.")+"
"+""+
-gettext("Updates will be queued if currently printing,")+" "+
-gettext("however this action may disrupt any ongoing print if OctoPrint is not currently controlling it.")+" "+"
"+""+
-gettext("Are you sure you want to proceed?")+"
";showConfirmationDialog({title:gettext("Are you sure you want to update now?"),html:html,proceed:gettext("Proceed"),onproceed:function(){self.performUpdate(force===true,_.map(items,function(info){return info.key;}));},onclose:function(){self._updateClicked=false;}});};self._showWorkingDialog=function(title){if(!(self.loginState.hasPermission(self.access.permissions.PLUGIN_SOFTWAREUPDATE_CHECK)||CONFIG_FIRST_RUN)){return;}
-self.working(true);self.workingTitle(title);self.workingDialog.modal({keyboard:false,backdrop:"static",show:true});};self._markWorking=function(title,line,stream){if(stream===undefined){stream="message";}
-self.loglines.removeAll();self.loglines.push({line:line,stream:stream});self._showWorkingDialog(title);};self._markDone=function(line,stream){if(stream===undefined){stream="message";}
-self.working(false);self.loglines.push({line:"",stream:stream});self.loglines.push({line:line,stream:stream});self._scrollWorkingOutputToEnd();};self._scrollWorkingOutputToEnd=function(){self.workingOutput.scrollTop(self.workingOutput[0].scrollHeight-self.workingOutput.height());};self.onBeforeWizardTabChange=function(next,current){if(next&&next==="#wizard_plugin_softwareupdate"){self._copyConfig();}else if(current&¤t==="#wizard_plugin_softwareupdate"){self._copyConfigBack();}
-return true;};self.onAfterWizardFinish=function(){self.performCheck();};self.onStartup=function(){self.workingDialog=$("#settings_plugin_softwareupdate_workingdialog");self.workingOutput=$("#settings_plugin_softwareupdate_workingdialog_output");self.configurationDialog=$("#settings_plugin_softwareupdate_configurationdialog");};self.onServerDisconnect=function(){if(self.restartTimeout!==undefined){clearTimeout(self.restartTimeout);}
-return true;};self.onEventConnectivityChanged=function(payload){if(!payload||!payload.new)return;self.performCheck();};self.onWizardDetails=function(data){if(data.softwareupdate&&data.softwareupdate.details&&data.softwareupdate.details.update){var value=data.softwareupdate.details.update;self._enrichInformation("octoprint",value);self.octoprintData.item=value;self.octoprintData.current(value.information.local.name);self.octoprintData.available(value.information.remote.name);}};self.onDataUpdaterReconnect=function(){if(self.waitingForRestart){self.waitingForRestart=false;self.updateInProgress=false;if(!self.reloadOverlay.is(":visible")){self.reloadOverlay.show();}}};self.cancelQueued=function(items){self.cancelInProgress=true;OctoPrint.plugins.softwareupdate.cancelQueued({targets:_.map(items,function(info){return info.key;})}).done(function(data){self.queuedUpdates(data.queued);self.cancelInProgress=false;}).fail(function(response){console.log(response);self.cancelInProgress=false;});};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="softwareupdate"){return;}
-var messageType=data.type;var messageData=data.data;var options=undefined;var restartType=undefined;var title=undefined;var text=undefined;switch(messageType){case"loglines":case"updating":case"restarting":case"restart_manually":case"restart_failed":case"success":case"error":{if(!self.working()){self._markWorking(gettext("Updating..."),gettext("Updating, please wait."));}
-break;}}
-switch(messageType){case"loglines":{_.each(messageData.loglines,function(line){self.loglines.push(self._preprocessLine(line));});self._scrollWorkingOutputToEnd();break;}
-case"updating":{text=_.sprintf(gettext("Now updating %(name)s to %(version)s"),{name:_.escape(messageData.name),version:_.escape(messageData.version)});self.loglines.push({line:"",stream:"separator"});self.loglines.push({line:_.repeat("+",text.length),stream:"separator"});self.loglines.push({line:text,stream:"message"});self.loglines.push({line:_.repeat("+",text.length),stream:"separator"});self._scrollWorkingOutputToEnd();self._updatePopup({text:text,hide:false,buttons:{sticker:false}});break;}
-case"restarting":{title=gettext("Update successful, restarting!");text=gettext("The update finished successfully and the server will now be restarted.");options={title:title,text:text,type:"success",hide:false,buttons:{sticker:false}};self.loglines.push({line:text,stream:"message"});self._scrollWorkingOutputToEnd();self.waitingForRestart=true;self.restartTimeout=setTimeout(function(){title=gettext("Restart failed");text=gettext("The server apparently did not restart by itself, you'll have to do it manually. Please consult octoprint.log on what went wrong.");self._showPopup({title:title,text:text,type:"error",hide:false,buttons:{sticker:false}});self.waitingForRestart=false;self._markDone(text,"message_error");},60000);break;}
-case"restart_manually":{restartType=messageData.restart_type;text=gettext("The update finished successfully, please restart OctoPrint now.");if(restartType==="environment"){text=gettext("The update finished successfully, please reboot the server now.");}
-title=gettext("Update successful, restart required!");options={title:title,text:text,type:"success",hide:false,buttons:{sticker:false}};self.updateInProgress=false;self._markDone(text);break;}
-case"restart_failed":{restartType=messageData.restart_type;text=gettext("Restarting OctoPrint failed, please restart it manually. You might also want to consult octoprint.log on what went wrong here.");if(restartType==="environment"){text=gettext("Rebooting the server failed, please reboot it manually. You might also want to consult octoprint.log on what went wrong here.");}
-title=gettext("Restart failed");options={title:title,test:text,type:"error",hide:false,buttons:{sticker:false}};self.waitingForRestart=false;self.updateInProgress=false;self._markDone(text,"message_error");break;}
-case"success":{title=gettext("Update successful!");text=gettext("The update finished successfully.");options={title:title,text:text,type:"success",hide:false,buttons:{sticker:false}};self.updateInProgress=false;self._markDone(text);break;}
-case"error":{title=gettext("Update failed!");text=gettext("The update did not finish successfully. Please consult octoprint.log
and plugin_softwareupdate_console.log
for details.");self._showPopup({title:title,text:text,type:"error",hide:false,buttons:{sticker:false}});self.updateInProgress=false;self._markDone(text,"message_error");break;}
-case"update_versions":{self.performCheck();break;}
-case"queued_updates":{if(!self.updateAccess()){return;}
-if(messageData.hasOwnProperty("targets")){self.queuedUpdates(messageData.targets);var queuedUpdatesPopupOptions={title:title,text:text,type:"notice",icon:false,hide:false,buttons:{closer:false,sticker:false},history:{history:false}};if(messageData.print_failed&&messageData.targets.length>0){queuedUpdatesPopupOptions.title=gettext("Queued Updates Paused");queuedUpdatesPopupOptions.text=''+
-_.map(self.availableAndQueued(),function(info){return info.displayName;}).join(" ")+" ";queuedUpdatesPopupOptions.confirm={confirm:true,buttons:[{text:gettext("Continue Updates"),addClass:"btn-block btn-primary",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.continue",[notice,value]);}},{text:gettext("Cancel Updates"),addClass:"btn-block btn-danger",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.cancel",[notice,value]);}}]};}else if(messageData.hasOwnProperty("timeout_value")&&messageData.timeout_value>0&&messageData.targets.length>0){var progress_percent=Math.floor((messageData.timeout_value/60)*100);var progress_class=progress_percent<25?"progress-danger":progress_percent>75?"progress-success":"progress-warning";var countdownText=_.sprintf(gettext("Updating in %(sec)i secs..."),{sec:messageData.timeout_value});queuedUpdatesPopupOptions.title=gettext("Starting Queued Updates");queuedUpdatesPopupOptions.text='
'+
-_.map(self.availableAndQueued(),function(info){return info.displayName;}).join(" ")+' '+
-countdownText+'
'+
-countdownText+"
";queuedUpdatesPopupOptions.confirm={confirm:true,buttons:[{text:gettext("Cancel Updates"),addClass:"btn-block btn-danger",promptTrigger:true,click:function(notice,value){notice.remove();notice.get().trigger("pnotify.cancel",[notice,value]);}},{text:"",addClass:"hidden"}]};}else{if(typeof self.queuedUpdatesPopup!=="undefined"){self.queuedUpdatesPopup.remove();self.queuedUpdatesPopup=undefined;}
-return;}
-if(typeof self.queuedUpdatesPopup!=="undefined"){self.queuedUpdatesPopup.update(queuedUpdatesPopupOptions);}else{self.queuedUpdatesPopup=new PNotify(queuedUpdatesPopupOptions);self.queuedUpdatesPopup.get().on("pnotify.cancel",function(){self.queuedUpdatesPopup=undefined;self.cancelQueued();});self.queuedUpdatesPopup.get().on("pnotify.continue",function(){self.queuedUpdatesPopup=undefined;self.performUpdate(true,self.queuedUpdates());self._updateClicked=false;});}}else{if(typeof self.queuedUpdatesPopup!=="undefined"){self.queuedUpdatesPopup.remove();self.queuedUpdatesPopup=undefined;}}}
-if(options!==undefined){self._showPopup(options);}}
-self._forcedStdoutPatterns=["You are using pip version .*?, however version .*? is available.","You should consider upgrading via the '.*?' command.","'.*?' does not exist -- can't clean it"];self._forcedStdoutLine=new RegExp(self._forcedStdoutPatterns.join("|"));self._preprocessLine=function(line){if(line.stream==="stderr"&&line.line.match(self._forcedStdoutLine)){line.stream="stdout";}
-return line;};};}
-OCTOPRINT_VIEWMODELS.push({construct:SoftwareUpdateViewModel,dependencies:["loginStateViewModel","printerStateViewModel","settingsViewModel","accessViewModel","piSupportViewModel"],optional:["piSupportViewModel"],elements:["#settings_plugin_softwareupdate","#softwareupdate_confirmation_dialog","#wizard_plugin_softwareupdate_update","#wizard_plugin_softwareupdate_settings"]});});
-;
-
-// source: plugin/tracking/js/usage.js
-$(function(){function UsageViewModel(parameters){var self=this;self.settingsViewModel=parameters[0];self.setup=ko.observable(false);self.decision=ko.observable();self.active=ko.observable();self.required=false;self.onStartupComplete=function(){OctoPrint.plugins.tracking.track("webui_load",{browser_name:OctoPrint.coreui.browser.browser_name,browser_version:OctoPrint.coreui.browser.browser_version,os_name:OctoPrint.coreui.browser.os_name,os_version:OctoPrint.coreui.browser.os_version});};self.enableUsage=function(){self.settingsViewModel.settings.plugins.tracking.enabled(true);self.decision(true);self._sendData();};self.disableUsage=function(){self.settingsViewModel.settings.plugins.tracking.enabled(false);self.decision(false);self._sendData();};self.onBeforeWizardTabChange=function(next,current){if(!self.required)return true;if(!current||!_.startsWith(current,"wizard_plugin_tracking")||self.setup()){return true;}
-self._showDecisionNeededDialog();return false;};self.onBeforeWizardFinish=function(){if(!self.required)return true;if(self.setup()){return true;}
-self._showDecisionNeededDialog();return false;};self.onWizardDetails=function(response){self.required=response&&response.tracking&&response.tracking.required;};self._showDecisionNeededDialog=function(){showMessageDialog({title:gettext("Please set up anonymous usage tracking"),message:gettext("You haven't yet decided on whether to enable or disable anonymous usage tracking. You need to either enable or disable it before continuing.")});};self._sendData=function(){var data={plugins:{tracking:{enabled:self.settingsViewModel.settings.plugins.tracking.enabled()}}};self.active(true);self.settingsViewModel.saveData(data).done(function(){self.setup(true);self.active(false);}).fail(function(){self.decision(false);self.setup(true);self.active(false);var message=gettext("Please open a "+"bug report on this. Make sure to include all requested information, including your "+"JS console and "+"octoprint.log
.");new PNotify({title:gettext("Something went wrong"),text:_.sprintf(message,{bugreport:"https://github.com/OctoPrint/OctoPrint/blob/master/CONTRIBUTING.md#how-to-file-a-bug-report",jsconsole:"https://webmasters.stackexchange.com/a/77337"}),type:"error",hide:false});});};}
-OCTOPRINT_VIEWMODELS.push([UsageViewModel,["settingsViewModel"],"#wizard_plugin_tracking"]);});
-;
-
-// source: js/app/dataupdater.js
-function DataUpdater(allViewModels,connectCallback,disconnectCallback){var self=this;self.allViewModels=allViewModels;self.connectCallback=connectCallback;self.disconnectCallback=disconnectCallback;self._pluginHash=undefined;self._configHash=undefined;self._connectedDeferred=undefined;self._initializedDeferred=undefined;self._throttleFactor=1;self._baseProcessingLimit=500.0;self._lastProcessingTimes=[];self._lastProcessingTimesSize=20;self._safeModePopup=undefined;self._reloadPopup=undefined;self.increaseThrottle=function(){self.setThrottle(self._throttleFactor+1);};self.decreaseThrottle=function(){if(self._throttleFactor<=1){return;}
-self.setThrottle(self._throttleFactor-1);};self.setThrottle=function(throttle){self._throttleFactor=throttle;self._send("throttle",self._throttleFactor);log.debug("DataUpdater: New SockJS throttle factor:",self._throttleFactor," new processing limit:",self._baseProcessingLimit*self._throttleFactor);};self._send=function(message,data){var payload={};payload[message]=data;self._socket.send(JSON.stringify(payload));};self.connect=function(){if(self._connectedDeferred){self._connectedDeferred.reject("reconnect");}
-self._connectedDeferred=$.Deferred();OctoPrint.socket.connect({debug:!!SOCKJS_DEBUG,connectTimeout:SOCKJS_CONNECT_TIMEOUT});return self._connectedDeferred.promise();};self.reconnect=function(){if(self._connectedDeferred){self._connectedDeferred.reject("reconnect");}
-self._connectedDeferred=$.Deferred();OctoPrint.socket.reconnect();return self._connectedDeferred.promise();};self.initialized=function(){if(self._initializedDeferred){self._initializedDeferred.resolve();self._initializedDeferred=undefined;}};self._onReconnectAttempt=function(trial){if(trial<=0){return;}
-var handled=false;callViewModelsIf(self.allViewModels,"onServerDisconnect",function(){return!handled;},function(method){var result=method();handled=(result!==undefined&&!result)||handled;});if(handled){return true;}
-showOfflineOverlay(gettext("Server is offline"),gettext("The server appears to be offline, at least I'm not getting any response from it. I'll try to reconnect automatically over the next couple of minutes , however you are welcome to try a manual reconnect anytime using the button below."),self.reconnect);};self._onReconnectFailed=function(){var handled=false;callViewModelsIf(self.allViewModels,"onServerDisconnect",function(){return!handled;},function(method){var result=method();handled=(result!==undefined&&!result)||handled;});if(handled){return;}
-$("#offline_overlay_title").text(gettext("Server is offline"));$("#offline_overlay_message").html(gettext("The server appears to be offline, at least I'm not getting any response from it. I could not reconnect automatically , but you may try a manual reconnect using the button below."));};self._onDisconnected=function(code){if(self._initializedDeferred){self._initializedDeferred.reject();}
-self._initializedDeferred=undefined;if(self.disconnectCallback){self.disconnectCallback();}};self._onConnectTimeout=function(){if(self._connectedDeferred){self._connectedDeferred.reject("timeout");}};self._onConnectMessage=function(event){if(self._initializedDeferred){self._initializedDeferred.reject();}
-self._initializedDeferred=$.Deferred();if(self.connectCallback){self.connectCallback();}
-var data=event.data;PERMISSIONS=data["permissions"];var oldVersion=VERSION;VERSION=data["version"];DISPLAY_VERSION=data["display_version"];BRANCH=data["branch"];PYTHON_VERSION=data["python_version"];$("span.version").text(DISPLAY_VERSION);$("span.python_version").text(PYTHON_VERSION);ONLINE=data["online"];var oldPluginHash=self._pluginHash;self._pluginHash=data["plugin_hash"];var oldConfigHash=self._configHash;self._configHash=data["config_hash"];log.info("Connected to the server");if(self._connectedDeferred){self._connectedDeferred.resolve();self._connectedDeferred=undefined;}
-self._ifInitialized(function(){if(self._safeModePopup)self._safeModePopup.remove();if(data["safe_mode"]){log.info("❗ Safe mode is active. Third party plugins and language packs are disabled and cannot be enabled.");log.info("❗ Reason for safe mode: "+data["safe_mode"]);var reason=gettext("Unknown");switch(data["safe_mode"]){case"flag":{reason=gettext("Command line flag");break;}
-case"settings":{reason=gettext("Setting in config.yaml");break;}
-case"incomplete_startup":{reason=gettext("Problem during last startup");break;}}
-self._safeModePopup=new PNotify({title:gettext("Safe mode is active"),text:_.sprintf(gettext("The server is currently running in safe mode. Third party plugins and language packs are disabled and cannot be enabled.
Reason: %(reason)s
"),{reason:_.escape(reason)}),hide:false});}
-if($("#offline_overlay").is(":visible")){hideOfflineOverlay();log.info("Triggering reconnect on all view models");callViewModels(self.allViewModels,"onServerReconnect");callViewModels(self.allViewModels,"onDataUpdaterReconnect");}else{log.info("Triggering connect on all view models");callViewModels(self.allViewModels,"onServerConnect");}
-const versionChanged=oldVersion!==VERSION;const pluginsChanged=oldPluginHash!==undefined&&oldPluginHash!==self._pluginHash;const configChanged=oldConfigHash!==undefined&&oldConfigHash!==self._configHash;if(versionChanged){showReloadOverlay();}else if(pluginsChanged||configChanged){if(self._reloadPopup)self._reloadPopup.remove();let text;if(pluginsChanged&&configChanged){text=gettext("A client reconnect happened and the configuration of the server and the active UI relevant plugins have changed.");}else if(pluginsChanged){text=gettext("A client reconnect happened and the active UI relevant plugins have changed.");}else if(configChanged){text=gettext("A client reconnect happened and the configuration of the server has changed.");}
-self._reloadPopup=new PNotify({title:gettext("Page reload recommended"),text:""+
-text+"
"+""+
-gettext("Due to this a reload of the UI is recommended. "+"Please reload the UI now by clicking "+'the "Reload" button below. This will not interrupt '+"any print jobs you might have ongoing.")+"
",hide:false,confirm:{confirm:true,buttons:[{text:gettext("Ignore"),click:function(){self._reloadPopup.remove();}},{text:gettext("Reload"),addClass:"btn-primary",click:function(){self._reloadPopup.remove();location.reload(true);}}]},buttons:{closer:false,sticker:false}});}
-log.info("Server (re)connect processed");});};self._onHistoryData=function(event){self._ifInitialized(function(){callViewModels(self.allViewModels,"fromHistoryData",[event.data]);});};self._onCurrentData=function(event){self._ifInitialized(function(){callViewModels(self.allViewModels,"fromCurrentData",[event.data]);});};self._onSlicingProgress=function(event){self._ifInitialized(function(){$("#gcode_upload_progress").find(".bar").text(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"),{percentage:Math.round(event.data["progress"])}));var data=event.data;callViewModels(self.allViewModels,"onSlicingProgress",[data["slicer"],data["model_path"],data["machinecode_path"],data["progress"]]);});};self._onRenderProgress=function(event){self._ifInitialized(function(){var data=event.data;callViewModels(self.allViewModels,"onRenderProgress",[data["progress"]]);});};self._printerErrorCancelNotification=undefined;self._printerErrorDisconnectNotification=undefined;self._printerResetNotification=undefined;self._onEvent=function(event){self._ifInitialized(function(){var type=event.data["type"];var payload=event.data["payload"];var title,text,severity;log.debug("Got event "+type+" with payload: "+JSON.stringify(payload));if(type==="PrintCancelling"&&payload.firmwareError){if(self._printerErrorCancelNotification!==undefined){self._printerErrorCancelNotification.remove();}
-self._printerErrorCancelNotification=new PNotify({title:gettext("Error reported by printer"),text:_.sprintf(gettext("Your printer's firmware reported an error. Due to that the ongoing print job will be cancelled. Reported error: %(firmwareError)s"),{firmwareError:_.escape(payload.firmwareError)}),type:"error",hide:false});}else if(type==="Error"&&payload.error){severity="error";switch(payload.reason){case"firmware":{title=gettext("Error reported by printer");text=_.sprintf(gettext("Your printer's firmware reported an error. Due to that OctoPrint will disconnect. Reported error: %(error)s"),{error:_.escape(payload.error)});break;}
-case"resend":case"resend_loop":case"timeout":{title=gettext("Communication error");text=_.sprintf(gettext("There was a communication error while talking to your printer. Please consult the terminal output and octoprint.log for details. Error: %(error)s"),{error:_.escape(payload.error)});break;}
-case"connection":{title=gettext("Error connecting to printer");text=_.sprintf(gettext("There was an error while trying to connect to your printer. Error: %(error)s"),{error:_.escape(payload.error)});break;}
-case"start_print":{title=gettext("Error starting a print");text=_.sprintf(gettext("There was an error while trying to start a print job. Error: %(error)s"),{error:_.escape(payload.error)});break;}
-case"autodetect":{title=gettext("Could not autodetect your printer");text=_.sprintf(gettext('No working connection parameters could be found. Are you sure your printer is physically connected and supported? Refer to the FAQ for help in debugging this.'),{url:"https://faq.octoprint.org/connection-error"});break;}
-default:{title=gettext("Unknown error");text=_.sprintf(gettext("There was an unknown error while talking to your printer. Please consult the terminal output and octoprint.log for details. Error: %(error)s"),{error:_.escape(payload.error)});break;}}
-if(title&&text){if(self._printerErrorDisconnectNotification!==undefined){self._printerErrorDisconnectNotification.remove();}
-self._printerErrorDisconnectNotification=new PNotify({title:title,text:text,type:severity,hide:false});}}else if(type==="PrinterReset"){if(payload.idle){text=gettext("It looks like your printer reset while a connection was active. If this was intentional you may safely ignore this message. Otherwise you should investigate why your printer reset itself, since this will interrupt prints and also file transfers to your printer's SD.");severity="alert";}else{text=gettext("It looks like your printer reset while a connection was active. Due to this the ongoing job was aborted. If this was intentional you may safely ignore this message. Otherwise you should investigate why your printer reset itself, since this will interrupt prints and also file transfers to your printer's SD.");severity="error";}
-if(self._printerResetNotification!==undefined){self._printerResetNotification.remove();}
-self._printerResetNotification=new PNotify({title:gettext("Printer reset detected"),text:text,type:severity,hide:false});}else if(type==="ConnectivityChanged"){ONLINE=payload.new;}else if(type==="SettingsUpdated"){self._configHash=payload.config_hash;}
-var legacyEventHandlers={UpdatedFiles:"onUpdatedFiles",MetadataStatisticsUpdated:"onMetadataStatisticsUpdated",MetadataAnalysisFinished:"onMetadataAnalysisFinished",SlicingDone:"onSlicingDone",SlicingCancelled:"onSlicingCancelled",SlicingFailed:"onSlicingFailed"};const camelCaseType=type.split("_").map((item)=>item.charAt(0).toUpperCase()+item.slice(1)).join("");_.each(self.allViewModels,function(viewModel){if(viewModel.hasOwnProperty("onEvent"+camelCaseType)){viewModel["onEvent"+camelCaseType](payload);}else if(type!==camelCaseType&&viewModel.hasOwnProperty("onEvent"+type)){viewModel["onEvent"+type](payload);}else if(legacyEventHandlers.hasOwnProperty(type)&&viewModel.hasOwnProperty(legacyEventHandlers[type])){log.warn("View model "+
-viewModel.name+" is using legacy event handler "+
-legacyEventHandlers[type]+", new handler is called "+
-legacyEventHandlers[type]);viewModel[legacyEventHandlers[type]](payload);}});});};self._onTimelapse=function(event){self._ifInitialized(function(){callViewModels(self.allViewModels,"fromTimelapseData",[event.data]);});};self._onPluginMessage=function(event){self._ifInitialized(function(){callViewModels(self.allViewModels,"onDataUpdaterPluginMessage",[event.data.plugin,event.data.data]);});};self._onReauthMessage=function(event){self._ifInitialized(function(){callViewModels(self.allViewModels,"onDataUpdaterReauthRequired",[event.data.reason]);});};self._onIncreaseRate=function(measurement,minimum){log.debug("We are fast ("+measurement+" < "+minimum+"), increasing refresh rate");OctoPrint.socket.increaseRate();};self._onDecreaseRate=function(measurement,maximum){log.debug("We are slow ("+measurement+" > "+maximum+"), reducing refresh rate");OctoPrint.socket.decreaseRate();};self._ifInitialized=function(callback){if(self._initializedDeferred){self._initializedDeferred.done(callback);}else{callback();}};OctoPrint.socket.onDisconnected=self._onDisconnected;OctoPrint.socket.onReconnectAttempt=self._onReconnectAttempt;OctoPrint.socket.onReconnectFailed=self._onReconnectFailed;OctoPrint.socket.onConnectTimeout=self._onConnectTimeout;OctoPrint.socket.onRateTooHigh=self._onDecreaseRate;OctoPrint.socket.onRateTooLow=self._onIncreaseRate;OctoPrint.socket.onMessage("connected",self._onConnectMessage).onMessage("history",self._onHistoryData).onMessage("current",self._onCurrentData).onMessage("slicingProgress",self._onSlicingProgress).onMessage("renderProgress",self._onRenderProgress).onMessage("event",self._onEvent).onMessage("timelapse",self._onTimelapse).onMessage("plugin",self._onPluginMessage).onMessage("reauthRequired",self._onReauthMessage);}
-;
-
-// source: js/app/helpers.js
-function ItemListHelper(listType,supportedSorting,supportedFilters,defaultSorting,defaultFilters,exclusiveFilters,defaultPageSize,persistPageSize){var self=this;self.listType=listType;self.supportedSorting=supportedSorting;self.supportedFilters=supportedFilters;self.defaultSorting=defaultSorting;self.defaultFilters=defaultFilters;self.exclusiveFilters=exclusiveFilters;self.defaultPageSize=defaultPageSize;self.persistPageSize=!!persistPageSize;self.searchFunction=undefined;self.allItems=[];self.allSize=ko.observable(0);self.items=ko.observableArray([]);self.pageSize=ko.observable(self.defaultPageSize);self.currentPage=ko.observable(0);self.currentSorting=ko.observable(self.defaultSorting);self.currentFilters=ko.observableArray(self.defaultFilters);self.selectedItem=ko.observable(undefined);self.filterSearch=ko.observable(true);self.storageIds={currentSorting:self.listType+"."+"currentSorting",currentFilters:self.listType+"."+"currentFilters",pageSize:self.listType+"."+"pageSize"};self.refresh=function(){self._updateItems();};self.updateItems=function(items){if(items===undefined)items=[];self.allItems=items;self.allSize(items.length);self._updateItems();};self.selectItem=function(matcher){var itemList=self.items();for(var i=0;i-1){self.allItems.splice(index,1);self._updateItems();}};self.updateItem=function(matcher,item){var index=self.allItems.findIndex(matcher);if(index>-1){self.allItems[index]=item;self._updateItems();}};self.addItem=function(item){self.allItems.push(item);self._updateItems();};self.paginatedItems=ko.dependentObservable(function(){if(self.items()===undefined){return[];}else if(self.pageSize()===0){return self.items();}else{var from=Math.max(self.currentPage()*self.pageSize(),0);var to=Math.min(from+self.pageSize(),self.items().length);return self.items().slice(from,to);}});self.lastPage=ko.dependentObservable(function(){return self.pageSize()===0?1:Math.ceil(self.items().length/self.pageSize())-1;});self.pages=ko.dependentObservable(function(){var pages=[];var i;if(self.pageSize()===0){pages.push({number:0,text:1});}else if(self.lastPage()<7){for(i=0;iself.lastPage()-5){pages.push({number:-1,text:"…"});for(i=self.lastPage()-4;i-1){var page=Math.floor(pos/self.pageSize());self.changePage(page);}};self.changePage=function(newPage){if(newPage<0||newPage>self.lastPage())return;self.currentPage(newPage);};self.prevPage=function(){if(self.currentPage()>0){self.currentPage(self.currentPage()-1);}};self.nextPage=function(){if(self.currentPage()-1?self.allItems[index]:undefined;}else{return index>-1?self.items()[index]:undefined;}};self.resetPage=function(){if(self.currentPage()>self.lastPage()){self.currentPage(self.lastPage());}};self.changeSearchFunction=function(searchFunction){self.searchFunction=searchFunction;self.changePage(0);self._updateItems();};self.resetSearch=function(){self.changeSearchFunction(undefined);};self.changeSorting=function(sorting){if(!_.contains(_.keys(self.supportedSorting),sorting))return;self.currentSorting(sorting);self._saveCurrentSortingToLocalStorage();self.changePage(0);self._updateItems();};self.setFilterSearch=function(enabled){if(self.filterSearch()===enabled)return;self.filterSearch(enabled);self.changePage(0);self._updateItems();};self.toggleFilterSearch=function(){self.setFilterSearch(!self.filterSearch());};self.toggleFilter=function(filter){if(!_.contains(_.keys(self.supportedFilters),filter))return;if(_.contains(self.currentFilters(),filter)){self.removeFilter(filter);}else{self.addFilter(filter);}};self.addFilter=function(filter){if(!_.contains(_.keys(self.supportedFilters),filter))return;for(var i=0;i=1){if(hours>=16){replacements.days+=1;if(replacements.days===1){text=gettext("%(days)d day");}else{text=gettext("%(days)d days");}}else if(hours>=8&&hours<16){text=gettext("%(days)d.5 days");}else{if(days===1){text=gettext("%(days)d day");}else{text=gettext("%(days)d days");}}}else if(hours>=1){if(hours<12){if(minutes<15){if(hours===1){text=gettext("%(hours)d hour");}else{text=gettext("%(hours)d hours");}}else if(minutes>=15&&minutes<45){text=gettext("%(hours)d.5 hours");}else{replacements.hours+=1;if(replacements.hours===1){text=gettext("%(hours)d hour");}else{text=gettext("%(hours)d hours");}}}else{if(hours===23&&minutes>30){text=gettext("1 day");}else{if(minutes>30){replacements.hours+=1;}
-text=gettext("%(hours)d hours");}}}else if(minutes>=1){if(minutes<2){if(seconds<30){text=gettext("a minute");}else{text=gettext("2 minutes");}}else if(minutes<30){if(seconds>30){replacements.minutes+=1;}
-text=gettext("%(minutes)d minutes");}else if(minutes<=40){text=gettext("40 minutes");}else if(minutes<=50){text=gettext("50 minutes");}else{text=gettext("1 hour");}}else{if(seconds<30){text=gettext("a few seconds");}else{text=gettext("less than a minute");}}
-return _.sprintf(text,replacements);}
-function formatDate(unixTimestamp,options){if(!options){options={seconds:false};}
-var placeholder=options.placeholder||"-";if(!unixTimestamp)return placeholder;var format=gettext("YYYY-MM-DD HH:mm");if(options.seconds){format=gettext("YYYY-MM-DD HH:mm:ss");}
-return moment.unix(unixTimestamp).format(format);}
-function formatTimeAgo(unixTimestamp,placeholder){placeholder=placeholder||"-";if(!unixTimestamp)return placeholder;return moment.unix(unixTimestamp).fromNow();}
-function formatFilament(filament){if(!filament||!filament["length"])return"-";var result="%(length).02fm";if(filament.hasOwnProperty("volume")&&filament.volume){result+=" / "+"%(volume).02fcm³";}
-return _.sprintf(result,{length:filament["length"]/1000,volume:filament["volume"]});}
-function cleanTemperature(temp,offThreshold){if(temp===undefined||!_.isNumber(temp))return"-";if(offThreshold!==undefined&&temp1000){num=num/1000.0;return _.sprintf("%.2fk",num);}else{return _.sprintf("%i",num);}}
-function rsplit(str,sep,limit){const parts=str.split(sep);return limit?[parts.slice(0,-limit).join(sep)].concat(parts.slice(-limit)):parts;}
-function pnotifyAdditionalInfo(inner){return('");}
-function ping(url,callback){var img=new Image();var calledBack=false;img.onload=function(){callback(true);calledBack=true;};img.onerror=function(){if(!calledBack){callback(true);calledBack=true;}};img.src=url;setTimeout(function(){if(!calledBack){callback(false);calledBack=true;}},1500);}
-function showOfflineOverlay(title,message,reconnectCallback){if(title===undefined){title=gettext("Server is offline");}
-$("#offline_overlay_title").text(title);$("#offline_overlay_message").html(message);$("#offline_overlay_reconnect").click(reconnectCallback);var overlay=$("#offline_overlay");if(!overlay.is(":visible"))overlay.show();}
-function hideOfflineOverlay(){$("#offline_overlay").hide();}
-function showMessageDialog(msg,options){options=options||{};if(_.isPlainObject(msg)){options=msg;}else{options.message=msg;}
-var title=options.title||"";var message=options.message||"";var close=options.close||gettext("Close");var onclose=options.onclose||undefined;var onshow=options.onshow||undefined;var onshown=options.onshown||undefined;var nofade=options.nofade||false;if(_.isString(message)){message=$(""+message+"
");}
-var modalHeader=$('× '+
-title+" ");var modalBody=$(message);var modalFooter=$(''+
-close+" ");var modal=$("
").addClass("modal hide");if(!nofade){modal.addClass("fade-in");}
-modal.append($("
").addClass("modal-header").append(modalHeader)).append($("
").addClass("modal-body").append(modalBody)).append($("
").addClass("modal-footer").append(modalFooter));modal.on("hidden",function(){if(onclose&&_.isFunction(onclose)){onclose();}});if(onshow){modal.on("show",onshow);}
-if(onshown){modal.on("shown",onshown);}
-modal.modal("show");return modal;}
-function showConfirmationDialog(msg,onacknowledge,options){options=options||{};if(_.isPlainObject(msg)){options=msg;}else{options.message=msg;options.onproceed=onacknowledge;}
-var title=options.title||gettext("Are you sure?");var message=options.message||"";var question=options.question||gettext("Are you sure you want to proceed?");var html=options.html;var checkboxes=options.checkboxes;var cancel=options.cancel||gettext("Cancel");var proceed=options.proceed||gettext("Proceed");var proceedClass=options.proceedClass||"danger";var onproceed=options.onproceed||undefined;var oncancel=options.oncancel||undefined;var onclose=options.onclose||undefined;var dialogClass=options.dialogClass||"";var nofade=options.nofade||false;var noclose=options.noclose||false;var modalHeader;if(noclose){modalHeader=$(""+title+" ");}else{modalHeader=$('× '+
-title+" ");}
-var modalBody;if(html){modalBody=$(html);}else{modalBody=$(""+message+"
"+question+"
");}
-var cancelButton=$(''+cancel+" ").attr("data-dismiss","modal").attr("aria-hidden","true");if(!_.isArray(proceed)){proceed=[proceed];}
-var proceedButtons=[];_.each(proceed,function(text){proceedButtons.push($(''+text+" ").addClass("btn-"+proceedClass));});var modal=$("
").addClass("modal hide");if(!nofade){modal.addClass("fade-in");}
-var buttons=$("
").addClass("modal-footer").append(cancelButton);_.each(proceedButtons,function(button){buttons.append(button);});modal.addClass(dialogClass).append($("
").addClass("modal-header").append(modalHeader)).append($("
").addClass("modal-body").append(modalBody)).append(buttons);modal.on("hidden",function(event){if(onclose&&_.isFunction(onclose)){onclose(event);}});var modalOptions={};if(noclose){modalOptions.backdrop="static";modalOptions.keyboard=false;}
-modal.modal(modalOptions);_.each(proceedButtons,function(button,idx){button.click(function(e){e.preventDefault();if(onproceed&&_.isFunction(onproceed)){onproceed(idx,e);}
-modal.modal("hide");});});cancelButton.click(function(e){if(oncancel&&_.isFunction(oncancel)){oncancel(e);}});return modal;}
-function showSelectionDialog(options){var title=options.title;var message=options.message||undefined;var selections=options.selections||[];var maycancel=options.maycancel||false;var cancel=options.cancel||undefined;var onselect=options.onselect||undefined;var onclose=options.onclose||undefined;var dialogClass=options.dialogClass||"";var nofade=options.nofade||false;var modalHeader;if(maycancel){modalHeader=$('× '+
-title+" ");}else{modalHeader=$(""+title+" ");}
-var buttons=[];var selectionBody=$("
");var container;var additionalClass;if(selections.length===1){container=selectionBody;additionalClass="btn-block";}else if(selections.length===2){container=$("
");selectionBody.append(container);additionalClass="span6";}else{container=selectionBody;additionalClass="btn-block";}
-_.each(selections,function(s,i){var button=$(''+
-selections[i]+" ");if(additionalClass){button.addClass(additionalClass);}
-container.append(button);buttons.push(button);if(selections.length>2&&i ");selectionBody.append(container);}});var headerDiv=$("
").addClass("modal-header").append(modalHeader);var bodyDiv=$("
").addClass("modal-body");if(message){bodyDiv.append($(""+message+"
"));}
-bodyDiv.append(selectionBody);var modal=$("
").addClass("modal hide");if(!nofade){modal.addClass("fade-in");}
-if(!cancel){modal.data("backdrop","static").data("keyboard","false");}
-modal.addClass(dialogClass).append(headerDiv).append(bodyDiv);modal.on("hidden",function(event){if(onclose&&_.isFunction(onclose)){onclose(event);}});modal.modal("show");_.each(buttons,function(button){button.click(function(e){e.preventDefault();var index=button.data("index");if(index<0){return;}
-if(onselect&&_.isFunction(onselect)){onselect(index,e);}
-modal.modal("hide");});});return modal;}
-function showProgressModal(options,promise){var title=options.title||gettext("Progress");var message=options.message||"";var buttonText=options.button||gettext("Close");var max=options.max||undefined;var close=options.close||false;var output=options.output||false;var dialogClass=options.dialogClass||"";var barClassSuccess=options.barClassSuccess||"";var barClassFailure=options.barClassFailure||"bar-danger";var outputClassSuccess=options.outputClassSuccess||"";var outputClassFailure=options.outputClassFailure||"text-error";var modalHeader=$(""+title+" ");var paragraph=$(""+message+"
");var progress=$('
');var progressBar=$('
').addClass(barClassSuccess);var progressText=$(' ');if(max===undefined){progress.addClass("progress-striped active");progressBar.width("100%");}
-progress.append(progressBar).append(progressText);var button=$(''+buttonText+" ").prop("disabled",true).attr("data-dismiss","modal").attr("aria-hidden","true");var modalBody=$("
").addClass("modal-body").append(paragraph).append(progress);var pre;if(output){pre=$(" ");modalBody.append(pre);}
-var modal=$("
").addClass("modal hide fade-in").addClass(dialogClass).append($("
").addClass("modal-header").append(modalHeader)).append(modalBody).append($("
").addClass("modal-footer").append(button));modal.modal({keyboard:false,backdrop:"static",show:true});var counter=0;promise.progress(function(){var short,long,success;if(arguments.length===2){short=long=arguments[0];success=arguments[1];}else if(arguments.length===3){short=arguments[0];long=arguments[1];success=arguments[2];}else{throw Error("Invalid parameters for showProgressModal, expected either (text, success) or (short, long, success)");}
-var value;if(max===undefined||max<=0){value=100;}else{counter++;value=Math.max(Math.min((counter*100)/max,100),0);}
-progressBar.width(String(value)+"%");progressText.text(short);if(value<50&&progressText.hasClass("progress-text-front")){progressText.removeClass("progress-text-front").addClass("progress-text-back");}else if(value>=50&&progressText.hasClass("progress-text-back")){progressText.removeClass("progress-text-back").addClass("progress-text-front");}
-if(!success&&!progressBar.hasClass(barClassFailure)){progressBar.removeClass(barClassSuccess).addClass(barClassFailure);}
-if(output&&pre){if(success){pre.append($(""+long+" "));}else{pre.append($(""+long+" "));}
-pre.scrollTop(pre[0].scrollHeight-pre.height());}}).done(function(){button.prop("disabled",false);if(close){modal.modal("hide");}}).fail(function(){button.prop("disabled",false);});return modal;}
-function showReloadOverlay(){$("#reloadui_overlay").show();}
-function wrapPromiseWithAlways(p){var deferred=$.Deferred();p.always(function(){deferred.resolve.apply(deferred,arguments);});return deferred.promise();}
-function commentableLinesToArray(lines){return splitTextToArray(lines,"\n",true,function(item){return!_.startsWith(item,"#");});}
-function splitTextToArray(text,sep,stripEmpty,filter){return _.filter(_.map(text.split(sep),function(item){return item?item.trim():"";}),function(item){return(stripEmpty?item:true)&&(filter?filter(item):true);});}
-function hasDataChanged(data,oldData){if(data==oldData&&data==undefined){return false;}
-if(_.isPlainObject(data)&&_.isPlainObject(oldData)){return _.any(_.keys(data),function(key){return hasDataChanged(data[key],oldData[key]);});}else{return!_.isEqual(data,oldData);}}
-function getOnlyChangedData(data,oldData){if(data==undefined){return{};}
-if(oldData==undefined){return data;}
-var f=function(root,oldRoot){if(!_.isPlainObject(root)){return root;}
-var retval={};_.forOwn(root,function(value,key){var oldValue=undefined;if(oldRoot!=undefined&&oldRoot.hasOwnProperty(key)){oldValue=oldRoot[key];}
-if(_.isPlainObject(value)){if(oldValue==undefined){retval[key]=value;}else if(hasDataChanged(value,oldValue)){retval[key]=f(value,oldValue);}}else{if(!(value==oldValue&&value==undefined)&&!_.isEqual(value,oldValue)){retval[key]=value;}}});return retval;};return f(data,oldData);}
-function setOnViewModels(allViewModels,key,value){setOnViewModelsIf(allViewModels,key,value,undefined);}
-function setOnViewModelsIf(allViewModels,key,value,condition){if(!allViewModels)return;_.each(allViewModels,function(viewModel){setOnViewModelIf(viewModel,key,value,condition);});}
-function setOnViewModel(viewModel,key,value){setOnViewModelIf(viewModel,key,value,undefined);}
-function setOnViewModelIf(viewModel,key,value,condition){if(condition===undefined||!_.isFunction(condition)){condition=function(){return true;};}
-try{if(!condition(viewModel)){return;}
-viewModel[key]=value;}catch(exc){if(typeof Sentry!=="undefined"){Sentry.captureException(exc);}
-log.error("Error while setting",key,"to",value,"on view model",viewModel.constructor.name,":",`${exc.message}\n${exc.stack || exc}`);}}
-function callViewModels(allViewModels,method,callback){callViewModelsIf(allViewModels,method,undefined,callback);}
-function callViewModelsIf(allViewModels,method,condition,callback){if(!allViewModels)return;_.each(allViewModels,function(viewModel){try{callViewModelIf(viewModel,method,condition,callback);}catch(exc){if(typeof Sentry!=="undefined"){Sentry.captureException(exc);}
-log.error("Error calling",method,"on view model",viewModel.constructor.name,":",`${exc.message}\n${exc.stack || exc}`);}});}
-function callViewModel(viewModel,method,callback,raiseErrors){callViewModelIf(viewModel,method,undefined,callback,raiseErrors);}
-function callViewModelIf(viewModel,method,condition,callback,raiseErrors){raiseErrors=raiseErrors===true||false;if(condition===undefined||!_.isFunction(condition)){condition=function(){return true;};}
-if(!_.isFunction(viewModel[method])||!condition(viewModel,method))return;var parameters=undefined;if(!_.isFunction(callback)){if(callback===undefined){parameters=undefined;log.trace("Calling method",method,"on view model");}else if(_.isArray(callback)){parameters=callback;log.trace("Calling method",method,"on view model with specified parameters",parameters);}else{return;}
-callback=undefined;}else{log.trace("Providing method",method,"on view model to specified callback",callback);}
-try{if(callback===undefined){if(parameters!==undefined){viewModel[method].apply(viewModel,parameters);}else{viewModel[method]();}}else{callback(viewModel[method],viewModel);}}catch(exc){if(typeof Sentry!=="undefined"){Sentry.captureException(exc);}
-if(raiseErrors){throw exc;}else{log.error("Error calling",method,"on view model",viewModel.constructor.name,":",`${exc.message}\n${exc.stack || exc}`);}}}
-var sizeObservable=function(observable){return ko.computed({read:function(){return formatSize(observable());},write:function(value){var result=bytesFromSize(value);if(result!==undefined){observable(result);}}});};var getQueryParameterByName=function(name,url){if(!url){url=fetchWindowLocation().href;}
-name=name.replace(/[\[\]]/g,"\\$&");var regex=new RegExp("[?&]"+name+"(=([^]*)|&|#|$)"),results=regex.exec(url);if(!results)return null;if(!results[2])return"";return decodeURIComponent(results[2].replace(/\+/g," "));};var escapeUnprintableCharacters=function(str){var result="";var index=0;var charCode;while(!isNaN((charCode=str.charCodeAt(index)))){if((charCode<32&&charCode!==9&&charCode!==10&&charCode!==13)||charCode===127||(charCode>=128&&charCode<=159)||charCode===255){result+="\\x"+(charCode>15?"":"0")+charCode.toString(16);}else{result+=str[index];}
-index++;}
-return result;};var copyToClipboard=function(text){var temp=$("