micrOSDevToolKit 3.4.1__tar.gz → 3.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. {microsdevtoolkit-3.4.1/micrOSDevToolKit.egg-info → microsdevtoolkit-3.5.0}/PKG-INFO +1 -1
  2. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/devToolKit.py +22 -5
  3. microsdevtoolkit-3.4.1/micrOS/micropython/micrOS-esp32-1.28.0-3.4.0-0.bin → microsdevtoolkit-3.5.0/micrOS/micropython/micrOS-esp32-1.28.0-3.5.0-0.bin +0 -0
  4. microsdevtoolkit-3.4.1/micrOS/micropython/micrOS-esp32c3-1.28.0-3.4.0-0.bin → microsdevtoolkit-3.5.0/micrOS/micropython/micrOS-esp32c3-1.28.0-3.5.0-0.bin +0 -0
  5. microsdevtoolkit-3.4.1/micrOS/micropython/micrOS-esp32c6-1.28.0-3.4.0-0.bin → microsdevtoolkit-3.5.0/micrOS/micropython/micrOS-esp32c6-1.28.0-3.5.0-0.bin +0 -0
  6. microsdevtoolkit-3.4.1/micrOS/micropython/micrOS-esp32s3-1.28.0-3.4.0-0.bin → microsdevtoolkit-3.5.0/micrOS/micropython/micrOS-esp32s3-1.28.0-3.5.0-0.bin +0 -0
  7. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/release_info/micrOS_ReleaseInfo/system_analysis_sum.json +5 -5
  8. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Shell.py +1 -1
  9. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Web.py +5 -3
  10. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Files.cpython-312.pyc +0 -0
  11. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Web.cpython-312.pyc +0 -0
  12. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_web.py +1 -1
  13. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/auth.js +19 -3
  14. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/config.js +1 -2
  15. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/index.html +29 -9
  16. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/uapi.js +2 -2
  17. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/uapi_widgets.js +27 -1
  18. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_web_engine.py +28 -0
  19. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0/micrOSDevToolKit.egg-info}/PKG-INFO +1 -1
  20. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOSDevToolKit.egg-info/SOURCES.txt +7 -4
  21. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/setup.py +1 -1
  22. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/SystemTest.py +28 -5
  23. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/micrOSClient.py +15 -8
  24. microsdevtoolkit-3.5.0/toolkit/simulator_lib/__pycache__/ntptime.cpython-312.pyc +0 -0
  25. microsdevtoolkit-3.5.0/toolkit/simulator_lib/__pycache__/webrepl.cpython-312.pyc +0 -0
  26. microsdevtoolkit-3.5.0/toolkit/user_data/webhooks/__pycache__/generic.cpython-312.pyc +0 -0
  27. microsdevtoolkit-3.5.0/toolkit/user_data/webhooks/__pycache__/macro.cpython-312.pyc +0 -0
  28. microsdevtoolkit-3.5.0/toolkit/user_data/webhooks/__pycache__/template.cpython-312.pyc +0 -0
  29. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Shell.mpy +0 -0
  30. microsdevtoolkit-3.5.0/toolkit/workspace/precompiled/Web.mpy +0 -0
  31. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_web.mpy +0 -0
  32. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/auth.js +5 -3
  33. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/config.js +1 -1
  34. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/index.html +29 -9
  35. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/uapi.js +2 -2
  36. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/uapi_widgets.js +3 -1
  37. microsdevtoolkit-3.4.1/toolkit/simulator_lib/__pycache__/ntptime.cpython-312.pyc +0 -0
  38. microsdevtoolkit-3.4.1/toolkit/simulator_lib/__pycache__/webrepl.cpython-312.pyc +0 -0
  39. microsdevtoolkit-3.4.1/toolkit/workspace/precompiled/Web.mpy +0 -0
  40. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/LICENSE +0 -0
  41. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/MANIFEST.in +0 -0
  42. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/README.md +0 -0
  43. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/__init__.py +0 -0
  44. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/.DS_Store +0 -0
  45. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/CP210xVCPInstaller_x64.exe +0 -0
  46. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/CP210xVCPInstaller_x86.exe +0 -0
  47. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/CP210x_Universal_Windows_Driver_ReleaseNotes.txt +0 -0
  48. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/SLAB_License_Agreement_VCP_Windows.txt +0 -0
  49. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/arm/silabser.sys +0 -0
  50. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/arm64/silabser.sys +0 -0
  51. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/dpinst.xml +0 -0
  52. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/silabser.cat +0 -0
  53. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/silabser.inf +0 -0
  54. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/x64/silabser.sys +0 -0
  55. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/CP210x_Universal_Windows_Driver/x86/silabser.sys +0 -0
  56. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/macOS_VCP_Driver/SiLabsUSBDriverDisk.dmg +0 -0
  57. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/env/driver_cp210x/macOS_VCP_Driver/macOS_VCP_Driver_Release_Notes.txt +0 -0
  58. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/__init__.py +0 -0
  59. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/dnd.png +0 -0
  60. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/logo.png +0 -0
  61. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/logo_mini.png +0 -0
  62. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/usb_port_icon.png +0 -0
  63. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/media/wifi_icon.png +0 -0
  64. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/__init__.py +0 -0
  65. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/board_commands.json +0 -0
  66. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32-20251209-v1.27.0.bin +0 -0
  67. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32c3-20251209-v1.27.0.bin +0 -0
  68. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32c5-20251209-v1.27.0.bin +0 -0
  69. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32c6-20251209-v1.27.0.bin +0 -0
  70. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32cam-v1.21.0_camera.bin +0 -0
  71. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32s2-20251209-v1.27.0.bin +0 -0
  72. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32s2-LOLIN_MINI-20251209-v1.27.0.bin +0 -0
  73. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32s3-4MBflash-20241129-v1.24.1.bin +0 -0
  74. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32s3-8MBflash-20251209-v1.27.0.bin +0 -0
  75. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/esp32s3_spiram_oct-20251209-v1.27.0.bin +0 -0
  76. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/rpi-pico-w-20251209-v1.27.0.uf2 +0 -0
  77. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/micropython/tinypico-20251209-v1.27.0.bin +0 -0
  78. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/.DS_Store +0 -0
  79. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Auth.py +0 -0
  80. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Buffer.py +0 -0
  81. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Common.py +0 -0
  82. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Config.py +0 -0
  83. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Debug.py +0 -0
  84. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Files.py +0 -0
  85. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Hooks.py +0 -0
  86. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/InterConnect.py +0 -0
  87. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Interrupts.py +0 -0
  88. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Logger.py +0 -0
  89. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Network.py +0 -0
  90. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Notify.py +0 -0
  91. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Pacman.py +0 -0
  92. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Scheduler.py +0 -0
  93. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Server.py +0 -0
  94. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Tasks.py +0 -0
  95. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Time.py +0 -0
  96. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/Types.py +0 -0
  97. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Auth.cpython-312.pyc +0 -0
  98. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Buffer.cpython-312.pyc +0 -0
  99. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Common.cpython-312.pyc +0 -0
  100. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Config.cpython-312.pyc +0 -0
  101. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Debug.cpython-312.pyc +0 -0
  102. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Hooks.cpython-312.pyc +0 -0
  103. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/InterConnect.cpython-312.pyc +0 -0
  104. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Interrupts.cpython-312.pyc +0 -0
  105. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Logger.cpython-312.pyc +0 -0
  106. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Pacman.cpython-312.pyc +0 -0
  107. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Power.cpython-312.pyc +0 -0
  108. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Scheduler.cpython-312.pyc +0 -0
  109. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Server.cpython-312.pyc +0 -0
  110. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Shell.cpython-312.pyc +0 -0
  111. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Tasks.cpython-312.pyc +0 -0
  112. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Time.cpython-312.pyc +0 -0
  113. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/Types.cpython-312.pyc +0 -0
  114. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/micrOS.cpython-312.pyc +0 -0
  115. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/microIO.cpython-312.pyc +0 -0
  116. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/replhelper.cpython-312.pyc +0 -0
  117. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/__pycache__/urequests.cpython-312.pyc +0 -0
  118. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/config/_git.keep +0 -0
  119. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/helpers.py +0 -0
  120. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/main.py +0 -0
  121. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/mespnow.py +0 -0
  122. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/micrOS.py +0 -0
  123. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/micrOSloader.py +0 -0
  124. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/microIO.py +0 -0
  125. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32.py +0 -0
  126. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32c3.py +0 -0
  127. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32c5.py +0 -0
  128. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32c6.py +0 -0
  129. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32s2.py +0 -0
  130. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_esp32s3.py +0 -0
  131. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_m5stamp.py +0 -0
  132. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_qtpy.py +0 -0
  133. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_rp2.py +0 -0
  134. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/IO_tinypico.py +0 -0
  135. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_aht10.py +0 -0
  136. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_bme280.py +0 -0
  137. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_buzzer.py +0 -0
  138. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_cct.py +0 -0
  139. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_cluster.py +0 -0
  140. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_dht11.py +0 -0
  141. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_dht22.py +0 -0
  142. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_dimmer.py +0 -0
  143. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_ds18.py +0 -0
  144. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_esp32.py +0 -0
  145. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_espnow.py +0 -0
  146. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_fileserver.py +0 -0
  147. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_gameOfLife.py +0 -0
  148. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_genIO.py +0 -0
  149. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_i2c.py +0 -0
  150. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_i2s_mic.py +0 -0
  151. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_light_sensor.py +0 -0
  152. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_neoeffects.py +0 -0
  153. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_neopixel.py +0 -0
  154. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_oled.py +0 -0
  155. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_oled_sh1106.py +0 -0
  156. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_oled_ui.py +0 -0
  157. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_pacman.py +0 -0
  158. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_presence.py +0 -0
  159. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_rencoder.py +0 -0
  160. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_rest.py +0 -0
  161. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_rgb.py +0 -0
  162. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_rgbcct.py +0 -0
  163. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_robustness.py +0 -0
  164. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_rp2w.py +0 -0
  165. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_sdcard.py +0 -0
  166. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_servo.py +0 -0
  167. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_stepper.py +0 -0
  168. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_switch.py +0 -0
  169. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_system.py +0 -0
  170. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_telegram.py +0 -0
  171. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_tinyrgb.py +0 -0
  172. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/LM_veml7700.py +0 -0
  173. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_cct.cpython-312.pyc +0 -0
  174. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_dht11.cpython-312.pyc +0 -0
  175. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_dht22.cpython-312.pyc +0 -0
  176. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_dimmer.cpython-312.pyc +0 -0
  177. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_neopixel.cpython-312.pyc +0 -0
  178. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_pacman.cpython-312.pyc +0 -0
  179. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_rencoder.cpython-312.pyc +0 -0
  180. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_rgb.cpython-312.pyc +0 -0
  181. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_rgbcct.cpython-312.pyc +0 -0
  182. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_roboarm.cpython-312.pyc +0 -0
  183. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_robustness.cpython-312.pyc +0 -0
  184. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_system.cpython-312.pyc +0 -0
  185. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/modules/__pycache__/LM_web.cpython-312.pyc +0 -0
  186. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/urequests.py +0 -0
  187. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/config.css +0 -0
  188. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/config.html +0 -0
  189. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/dashboard.html +0 -0
  190. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/editor.js +0 -0
  191. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/editor_plugins.js +0 -0
  192. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/favicon.ico +0 -0
  193. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/filesui.html +0 -0
  194. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/filesui.js +0 -0
  195. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/ubashboard.css +0 -0
  196. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/udashboard.js +0 -0
  197. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/ustyle.css +0 -0
  198. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/uwidgets.js +0 -0
  199. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/source/web/uwidgets_pro.js +0 -0
  200. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/__init__.py +0 -0
  201. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_buffer.py +0 -0
  202. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_config.py +0 -0
  203. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_pacman.py +0 -0
  204. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_scheduler.py +0 -0
  205. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_time.py +0 -0
  206. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_urequests.py +0 -0
  207. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOS/utests/test_urequests_real_api.py +0 -0
  208. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOSDevToolKit.egg-info/dependency_links.txt +0 -0
  209. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOSDevToolKit.egg-info/requires.txt +0 -0
  210. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/micrOSDevToolKit.egg-info/top_level.txt +0 -0
  211. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/setup.cfg +0 -0
  212. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/DevEnvCompile.py +0 -0
  213. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/DevEnvOTA.py +0 -0
  214. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/DevEnvUSB.py +0 -0
  215. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/Gateway.py +0 -0
  216. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/LM_to_compile.dat +0 -0
  217. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/MicrOSDevEnv.py +0 -0
  218. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/WebRepl.py +0 -0
  219. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/__init__.py +0 -0
  220. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/BackupRestore.py +0 -0
  221. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/CCTDemo.py +0 -0
  222. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/CCTTest.py +0 -0
  223. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/CamStream.py +0 -0
  224. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/CatGame.py +0 -0
  225. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/Dimmer.py +0 -0
  226. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/GetVersion.py +0 -0
  227. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/MicrophoneTest.py +0 -0
  228. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/NeoEffectsDemo.py +0 -0
  229. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/NeopixelTest.py +0 -0
  230. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/PresenceTest.py +0 -0
  231. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/QMI8685_GYRO.py +0 -0
  232. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/RGBTest.py +0 -0
  233. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/RoboArm.py +0 -0
  234. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/SED_test.py +0 -0
  235. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/SensorsTest.py +0 -0
  236. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/Template_app.py +0 -0
  237. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/__init__.py +0 -0
  238. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/_app_base.py +0 -0
  239. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/_capture.py +0 -0
  240. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/_gyro_visualizer.py +0 -0
  241. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/_micPlotting.py +0 -0
  242. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/_presencePlotting.py +0 -0
  243. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/dashboard_apps/uLightDemo.py +0 -0
  244. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/gateway/gateway.css +0 -0
  245. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/gateway/img_stream.html +0 -0
  246. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/gateway/index.html +0 -0
  247. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/LocalMachine.py +0 -0
  248. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/MicrosFiles.py +0 -0
  249. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/Repository.py +0 -0
  250. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/SafeInput.py +0 -0
  251. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/SearchDevices.py +0 -0
  252. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/SerialDriverHandler.py +0 -0
  253. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/TerminalColors.py +0 -0
  254. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/__init__.py +0 -0
  255. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/macroScript.py +0 -0
  256. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/micrOSClientHistory.py +0 -0
  257. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/lib/pip_package_installer.py +0 -0
  258. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/micrOSDocGen.py +0 -0
  259. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/micrOSImageBuilder.py +0 -0
  260. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/micrOSImageConfig.json +0 -0
  261. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/micrOSdashboard.py +0 -0
  262. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/micrOSlint.py +0 -0
  263. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/.DS_Store +0 -0
  264. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/IO_darwin.py +0 -0
  265. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/IO_darwin.cpython-312.pyc +0 -0
  266. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/Metrics.cpython-312.pyc +0 -0
  267. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/aioespnow.cpython-312.pyc +0 -0
  268. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/camera.cpython-312.pyc +0 -0
  269. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/dht.cpython-312.pyc +0 -0
  270. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/dht.cpython-39.pyc +0 -0
  271. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/dotstar.cpython-312.pyc +0 -0
  272. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/dotstar.cpython-38.pyc +0 -0
  273. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/dotstar.cpython-39.pyc +0 -0
  274. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ds18x20.cpython-312.pyc +0 -0
  275. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ds18x20.cpython-38.pyc +0 -0
  276. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ds18x20.cpython-39.pyc +0 -0
  277. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/esp32.cpython-312.pyc +0 -0
  278. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/esp32.cpython-38.pyc +0 -0
  279. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/esp32.cpython-39.pyc +0 -0
  280. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/framebuf.cpython-312.pyc +0 -0
  281. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/framebuf.cpython-38.pyc +0 -0
  282. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/framebuf.cpython-39.pyc +0 -0
  283. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/machine.cpython-312.pyc +0 -0
  284. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/machine.cpython-38.pyc +0 -0
  285. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/machine.cpython-39.pyc +0 -0
  286. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/micropython.cpython-312.pyc +0 -0
  287. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/micropython.cpython-38.pyc +0 -0
  288. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/micropython.cpython-39.pyc +0 -0
  289. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/mip.cpython-312.pyc +0 -0
  290. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/neopixel.cpython-312.pyc +0 -0
  291. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/neopixel.cpython-38.pyc +0 -0
  292. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/neopixel.cpython-39.pyc +0 -0
  293. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/network.cpython-312.pyc +0 -0
  294. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/network.cpython-38.pyc +0 -0
  295. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/network.cpython-39.pyc +0 -0
  296. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/onewire.cpython-312.pyc +0 -0
  297. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/onewire.cpython-38.pyc +0 -0
  298. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/onewire.cpython-39.pyc +0 -0
  299. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/sim_common.cpython-312.pyc +0 -0
  300. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simgc.cpython-312.pyc +0 -0
  301. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simgc.cpython-38.pyc +0 -0
  302. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simgc.cpython-39.pyc +0 -0
  303. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simulator.cpython-312.pyc +0 -0
  304. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simulator.cpython-38.pyc +0 -0
  305. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/simulator.cpython-39.pyc +0 -0
  306. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/tinypico.cpython-312.pyc +0 -0
  307. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/tinypico.cpython-38.pyc +0 -0
  308. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/tinypico.cpython-39.pyc +0 -0
  309. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/uasyncio.cpython-312.pyc +0 -0
  310. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/uasyncio.cpython-38.pyc +0 -0
  311. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/uasyncio.cpython-39.pyc +0 -0
  312. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/uos.cpython-312.pyc +0 -0
  313. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/urandom.cpython-312.pyc +0 -0
  314. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/usocket.cpython-312.pyc +0 -0
  315. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ussl.cpython-312.pyc +0 -0
  316. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ustruct.cpython-312.pyc +0 -0
  317. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/ustruct.cpython-39.pyc +0 -0
  318. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/utime.cpython-312.pyc +0 -0
  319. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/utime.cpython-38.pyc +0 -0
  320. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/utime.cpython-39.pyc +0 -0
  321. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/webrepl.cpython-38.pyc +0 -0
  322. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/__pycache__/webrepl.cpython-39.pyc +0 -0
  323. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/aioespnow.py +0 -0
  324. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/camera.py +0 -0
  325. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/dht.py +0 -0
  326. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/dotstar.py +0 -0
  327. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/ds18x20.py +0 -0
  328. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/esp32.py +0 -0
  329. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/framebuf.py +0 -0
  330. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/machine.py +0 -0
  331. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/micropython.py +0 -0
  332. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/mip.py +0 -0
  333. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/neopixel.py +0 -0
  334. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/network.py +0 -0
  335. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/node_config.json +0 -0
  336. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/ntptime.py +0 -0
  337. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/onewire.py +0 -0
  338. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/sim_common.py +0 -0
  339. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/simgc.py +0 -0
  340. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/simulator.py +0 -0
  341. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/tinypico.py +0 -0
  342. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/uasyncio.py +0 -0
  343. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/uos.py +0 -0
  344. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/urandom.py +0 -0
  345. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/usocket.py +0 -0
  346. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/ussl.py +0 -0
  347. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/ustruct.py +0 -0
  348. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/utime.py +0 -0
  349. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/view01.jpg +0 -0
  350. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/view02.jpg +0 -0
  351. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/simulator_lib/webrepl.py +0 -0
  352. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/socketClient.py +0 -0
  353. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/user_data/.include +0 -0
  354. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/user_data/webhooks/generic.py +0 -0
  355. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/user_data/webhooks/macro.py +0 -0
  356. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/user_data/webhooks/template.macro +0 -0
  357. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/user_data/webhooks/template.py +0 -0
  358. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/__init__.py +0 -0
  359. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Auth.mpy +0 -0
  360. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Buffer.mpy +0 -0
  361. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Common.mpy +0 -0
  362. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Config.mpy +0 -0
  363. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Debug.mpy +0 -0
  364. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Files.mpy +0 -0
  365. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Hooks.mpy +0 -0
  366. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/InterConnect.mpy +0 -0
  367. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Interrupts.mpy +0 -0
  368. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Logger.mpy +0 -0
  369. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Network.mpy +0 -0
  370. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Notify.mpy +0 -0
  371. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Pacman.mpy +0 -0
  372. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Scheduler.mpy +0 -0
  373. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Server.mpy +0 -0
  374. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Tasks.mpy +0 -0
  375. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Time.mpy +0 -0
  376. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/Types.mpy +0 -0
  377. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/_mpy.version +0 -0
  378. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/config/_git.keep +0 -0
  379. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/helpers.mpy +0 -0
  380. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/main.py +0 -0
  381. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/mespnow.mpy +0 -0
  382. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/micrOS.mpy +0 -0
  383. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/micrOSloader.mpy +0 -0
  384. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/microIO.mpy +0 -0
  385. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32.mpy +0 -0
  386. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32c3.mpy +0 -0
  387. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32c5.mpy +0 -0
  388. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32c6.mpy +0 -0
  389. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32s2.mpy +0 -0
  390. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_esp32s3.mpy +0 -0
  391. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_m5stamp.mpy +0 -0
  392. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_qtpy.mpy +0 -0
  393. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_rp2.mpy +0 -0
  394. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/IO_tinypico.mpy +0 -0
  395. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_aht10.mpy +0 -0
  396. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_bme280.mpy +0 -0
  397. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_buzzer.mpy +0 -0
  398. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_cct.mpy +0 -0
  399. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_cluster.mpy +0 -0
  400. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_dht11.mpy +0 -0
  401. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_dht22.mpy +0 -0
  402. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_dimmer.mpy +0 -0
  403. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_ds18.mpy +0 -0
  404. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_esp32.py +0 -0
  405. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_espnow.py +0 -0
  406. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_fileserver.mpy +0 -0
  407. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_gameOfLife.mpy +0 -0
  408. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_genIO.mpy +0 -0
  409. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_i2c.py +0 -0
  410. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_i2s_mic.mpy +0 -0
  411. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_light_sensor.mpy +0 -0
  412. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_neoeffects.mpy +0 -0
  413. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_neopixel.mpy +0 -0
  414. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_oled.mpy +0 -0
  415. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_oled_sh1106.mpy +0 -0
  416. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_oled_ui.mpy +0 -0
  417. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_pacman.mpy +0 -0
  418. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_presence.mpy +0 -0
  419. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_rencoder.py +0 -0
  420. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_rest.mpy +0 -0
  421. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_rgb.mpy +0 -0
  422. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_rgbcct.mpy +0 -0
  423. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_robustness.py +0 -0
  424. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_rp2w.py +0 -0
  425. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_sdcard.py +0 -0
  426. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_servo.mpy +0 -0
  427. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_stepper.mpy +0 -0
  428. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_switch.mpy +0 -0
  429. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_system.mpy +0 -0
  430. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_telegram.mpy +0 -0
  431. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_tinyrgb.mpy +0 -0
  432. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/modules/LM_veml7700.mpy +0 -0
  433. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/urequests.mpy +0 -0
  434. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/config.css +0 -0
  435. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/config.html +0 -0
  436. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/dashboard.html +0 -0
  437. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/editor.js +0 -0
  438. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/editor_plugins.js +0 -0
  439. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/favicon.ico +0 -0
  440. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/filesui.html +0 -0
  441. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/filesui.js +0 -0
  442. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/ubashboard.css +0 -0
  443. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/udashboard.js +0 -0
  444. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/ustyle.css +0 -0
  445. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/uwidgets.js +0 -0
  446. {microsdevtoolkit-3.4.1 → microsdevtoolkit-3.5.0}/toolkit/workspace/precompiled/web/uwidgets_pro.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: micrOSDevToolKit
3
- Version: 3.4.1
3
+ Version: 3.5.0
4
4
  Summary: Development and deployment environment for micrOS, the diy micropython automation OS (IoT)
5
5
  Home-page: https://github.com/BxNxM/micrOS
6
6
  Author: Marcell Ban
@@ -85,7 +85,7 @@ def arg_parse():
85
85
  dev_group.add_argument("-lint", "--linter", action="store_true", help="Run micrOS system linter (pylint+)")
86
86
  dev_group.add_argument("-webrepl", "--open_webrepl", action="store_true", help="(beta) Open webrepl in default browser, micropython repl + file transfers (built-in)")
87
87
  dev_group.add_argument("--light", action="store_true", help="Skip optional dependency deployments (low level param: add this as first argument always)")
88
- dev_group.add_argument("-ut", "--unittest", action="store_true", help="Run micrOS unit tests - for development")
88
+ dev_group.add_argument("-ut", "--unittest", action="store_true", help="Run micrOS and toolkit unit tests - for development")
89
89
 
90
90
 
91
91
  toolkit_group = parser.add_argument_group("Toolkit development")
@@ -233,10 +233,27 @@ def update_pip_package():
233
233
 
234
234
 
235
235
  def run_unit_tests():
236
- """Run micrOS Unit tests under micrOS/utests/*"""
236
+ """Run the micrOS runtime and host-side toolkit unit tests."""
237
237
  import unittest
238
- suite = unittest.defaultTestLoader.discover("micrOS/utests")
239
- unittest.TextTestRunner(verbosity=2).run(suite)
238
+
239
+ test_roots = (
240
+ ("micrOS RUNTIME TESTS", "micrOS/utests"),
241
+ ("DevToolKit HOST TESTS", "toolkit/tests"),
242
+ )
243
+
244
+ all_successful = True
245
+ for index, (title, test_dir) in enumerate(test_roots, start=1):
246
+ print("+--------------------------------------------------+")
247
+ print("| [{}/{}] {:<42} |".format(index, len(test_roots), title))
248
+ print("| ROOT: {:<42} |".format(test_dir))
249
+ print("+--------------------------------------------------+")
250
+ sys.stdout.flush()
251
+
252
+ suite = unittest.defaultTestLoader.discover(os.path.join(MYPATH, test_dir))
253
+ result = unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run(suite)
254
+ all_successful = result.wasSuccessful() and all_successful
255
+
256
+ return all_successful
240
257
 
241
258
 
242
259
  if __name__ == "__main__":
@@ -334,6 +351,6 @@ if __name__ == "__main__":
334
351
  executor.run_micro_script(cmd_args.macro)
335
352
 
336
353
  if cmd_args.unittest:
337
- run_unit_tests()
354
+ sys.exit(0 if run_unit_tests() else 1)
338
355
 
339
356
  sys.exit(0)
@@ -29,7 +29,7 @@
29
29
  3
30
30
  ],
31
31
  "Web.py": [
32
- 9.36,
32
+ 9.35,
33
33
  2
34
34
  ],
35
35
  "Tasks.py": [
@@ -261,7 +261,7 @@
261
261
  0
262
262
  ],
263
263
  "modules/LM_fileserver.py": [
264
- 9.27,
264
+ 9.05,
265
265
  1
266
266
  ]
267
267
  },
@@ -280,7 +280,7 @@
280
280
  23
281
281
  ],
282
282
  "web": [
283
- 190266,
283
+ 192178,
284
284
  18
285
285
  ],
286
286
  "core_dep": [
@@ -292,7 +292,7 @@
292
292
  5
293
293
  ],
294
294
  "core_score": 9.28,
295
- "load_score": 8.36,
296
- "version": "3.4.1-0"
295
+ "load_score": 8.35,
296
+ "version": "3.5.0-0"
297
297
  }
298
298
  }
@@ -28,7 +28,7 @@ IMAGE_MODE = 'rel' if 'micrOS' in uname()[-1] else 'dev'
28
28
 
29
29
  class Shell:
30
30
  __slots__ = ['__devfid', '__auth_mode', '__hwuid', '__auth_ok', '__conf_mode']
31
- MICROS_VERSION = '3.4.1-0'
31
+ MICROS_VERSION = '3.5.0-0'
32
32
 
33
33
  def __init__(self):
34
34
  """
@@ -18,7 +18,7 @@ from io import BytesIO
18
18
  from uos import stat
19
19
  from Tasks import lm_exec, lm_is_loaded, TaskBase
20
20
  from Config import cfgget
21
- from Files import OSPath, path_join
21
+ from Files import OSPath, path_join, abs_path
22
22
  from Buffer import SlidingBuffer, BufferFullError, MemoryPool
23
23
  from Debug import console_write, syslog
24
24
  from Auth import AuthRequired, PWD_KEY
@@ -36,13 +36,15 @@ def url_path_resolve(path:str) -> tuple[bool, str]:
36
36
  Return: isError, absolutePath
37
37
  """
38
38
  # $Extended mount check: WEB_MOUNTS (/modules and /web)
39
- path = path.lstrip("/")
39
+ # Normalize the untrusted request path before joining it to a web root.
40
+ # This keeps parent-directory segments from escaping /web or a mount.
41
+ path = abs_path(path).lstrip("/")
40
42
  if path.startswith("$"):
41
43
  mount_alias = path.split("/")[0]
42
44
  mount_path = WebEngine.WEB_MOUNTS.get(mount_alias, None)
43
45
  if mount_path is None:
44
46
  return True, f"Invalid mount point: {mount_alias}"
45
- mount_path = path.replace(mount_alias, mount_path)
47
+ mount_path = path.replace(mount_alias, mount_path, 1)
46
48
  return False, mount_path
47
49
  # Default web path: /web
48
50
  return False, path_join(OSPath.WEB, path)
@@ -65,7 +65,7 @@ def _cfg_set_clb(_, body):
65
65
  """
66
66
  try:
67
67
  incoming_data = loads(body.decode('utf-8'))
68
- print('Received config update request:', incoming_data)
68
+ print('Received config update keys:', tuple(incoming_data))
69
69
  failed_keys = []
70
70
  for k, v in incoming_data.items():
71
71
  try:
@@ -1,6 +1,6 @@
1
1
  (function () {
2
2
  var ID = 'micrOSAuth', rf = window.fetch && window.fetch.bind(window);
3
- var user = 'admin', pass = '';
3
+ var user = 'admin', pass = '', challenged = {};
4
4
  try {
5
5
  sessionStorage.removeItem(ID);
6
6
  sessionStorage.removeItem('micros.config.auth');
@@ -27,6 +27,14 @@
27
27
  return a.protocol === location.protocol && a.host === location.host;
28
28
  } catch (_) { return false; }
29
29
  }
30
+ function key(i) {
31
+ try {
32
+ var a = document.createElement('a'), u = url(i);
33
+ if (!u || !same(i)) return '';
34
+ a.href = u;
35
+ return a.pathname;
36
+ } catch (_) { return ''; }
37
+ }
30
38
  function hdr(d) {
31
39
  d = d || load();
32
40
  return d.pass ? {'x-micros-auth': d.pass} : {};
@@ -59,9 +67,15 @@
59
67
  }
60
68
  function gf(u, o) {
61
69
  o = o || {};
62
- return af(u, o).then(function (r) {
70
+ var k = key(u), d = load();
71
+ var proactive = o.micrOSAuth !== false && k && challenged[k] && d.pass;
72
+ return af(u, o, proactive ? d : null).then(function (r) {
63
73
  if (r.status !== 401 || o.micrOSAuth === false || !same(u)) return r;
64
- var d = load();
74
+ challenged[k] = true;
75
+ if (proactive) {
76
+ clear();
77
+ return prompt({target: u, request: o, message: 'Auth required', ok: function (pr) { return pr; }});
78
+ }
65
79
  if (d.pass) {
66
80
  return af(u, o, d).then(function (rr) {
67
81
  if (rr.status !== 401) return rr;
@@ -102,6 +116,8 @@
102
116
  return;
103
117
  }
104
118
  save(n);
119
+ var k = key(t);
120
+ if (k) challenged[k] = true;
105
121
  if (o.ok) {
106
122
  rm(p);
107
123
  resolve(o.ok(r, n));
@@ -2033,8 +2033,7 @@ function trackChange(key, value) {
2033
2033
  changedValues[key] = value;
2034
2034
  }
2035
2035
  updateSaveButtonState();
2036
- console.log('Tracked change:', key, '=', value);
2037
- console.log('All changes:', changedValues);
2036
+ console.log('Changed config keys:', Object.keys(changedValues));
2038
2037
  }
2039
2038
 
2040
2039
  function toggleMenu() {
@@ -47,12 +47,6 @@
47
47
  max-width:176px;
48
48
  min-width:0;
49
49
  padding:8px;
50
-
51
- border:1px solid rgba(255,255,255,.16);
52
- border-radius:8px;
53
-
54
- background:rgba(0,0,0,.55);
55
- box-shadow:0 2px 8px rgba(0,0,0,.20);
56
50
  }
57
51
 
58
52
  /* Main endpoint */
@@ -64,10 +58,10 @@
64
58
  width:100%;
65
59
  padding:6px 8px;
66
60
 
67
- border:1px solid rgba(255,255,255,.16);
61
+ border:4px solid rgb(0, 0, 0);
68
62
  border-radius:6px;
69
63
 
70
- background:rgba(255,255,255,.08);
64
+ background:rgba(0,0,0,.55);
71
65
  color:white;
72
66
 
73
67
  text-align:center;
@@ -96,6 +90,25 @@
96
90
  display:flex;
97
91
  flex-wrap:wrap;
98
92
  gap:8px;
93
+ justify-content:space-between;
94
+ }
95
+
96
+ .endpoint-group-actions[hidden] {
97
+ display:none;
98
+ }
99
+
100
+ .endpoint-children-toggle {
101
+ display:flex;
102
+ align-items:center;
103
+ justify-content:center;
104
+ min-height:0;
105
+ height:20px;
106
+ width:100%;
107
+ padding:0;
108
+ border:0;
109
+ background:transparent;
110
+ color:rgba(255, 255, 255, 0.55);
111
+ font-size:20px;
99
112
  }
100
113
 
101
114
  .endpoint-group button {
@@ -103,14 +116,21 @@
103
116
  }
104
117
 
105
118
  .endpoint-group-actions button {
119
+ min-width:47px;
106
120
  min-height:38px;
107
121
  padding:5px 8px;
122
+ background:rgba(0,0,0,.55);
123
+ border:2px solid rgb(0, 0, 0);
108
124
  }
109
125
 
110
- @media (max-width:360px) {
126
+ @media (max-width: 768px) {
111
127
  .endpoint-group {
112
128
  flex-basis:126px;
113
129
  }
130
+
131
+ .endpoint-children-toggle {
132
+ font-size:12px;
133
+ }
114
134
  }
115
135
  </style>
116
136
  <script src="uapi.js" defer></script>
@@ -5,7 +5,7 @@ let REST_CONSOLE_CACHE;
5
5
 
6
6
  function initializeBaseURL() {
7
7
  if (!BASE_URL && typeof window !== 'undefined') {
8
- BASE_URL = `http://${window.location.hostname}${window.location.port ? `:${window.location.port}` : ""}`;
8
+ BASE_URL = window.location.origin;
9
9
  }
10
10
  }
11
11
 
@@ -102,7 +102,7 @@ function restInfo(showPages=true) {
102
102
  const endpoints = result['usr_endpoints'] ? Array.from(result['usr_endpoints']) : [];
103
103
  renderEndpointGroups(endpoints);
104
104
  }
105
- document.getElementById('restInfoHeader').innerHTML = infoHeader;
105
+ document.getElementById('restInfoHeader').textContent = infoHeader;
106
106
  }).catch(error => {
107
107
  console.error('Error in restAPI:', error);
108
108
  });
@@ -119,6 +119,27 @@ function endpointLabel(label, entry) {
119
119
  return icon ? `${icon} ${label}` : label;
120
120
  }
121
121
 
122
+ function collapsibleToggle(label, content) {
123
+ const toggle = makeEl('button', {
124
+ className: 'endpoint-children-toggle',
125
+ type: 'button',
126
+ textContent: '\u25A0',
127
+ title: `Show ${label} endpoints`,
128
+ onclick: () => {
129
+ const expanded = toggle.getAttribute('aria-expanded') === 'true';
130
+ const action = expanded ? 'Show' : 'Hide';
131
+ toggle.setAttribute('aria-expanded', String(!expanded));
132
+ toggle.textContent = expanded ? '\u25A0' : '\u25C6';
133
+ toggle.title = `${action} ${label} endpoints`;
134
+ toggle.setAttribute('aria-label', toggle.title);
135
+ content.hidden = expanded;
136
+ }
137
+ });
138
+ toggle.setAttribute('aria-label', `Show ${label} endpoints`);
139
+ toggle.setAttribute('aria-expanded', 'false');
140
+ return toggle;
141
+ }
142
+
122
143
  function renderEndpointGroups(endpoints) {
123
144
  const container = byId('endpointGroups');
124
145
  if (!container) {return;}
@@ -153,6 +174,11 @@ function renderEndpointGroups(endpoints) {
153
174
  const actions = makeEl('div', {className: 'endpoint-group-actions'});
154
175
  group.children.sort((a, b) => a.entry.localeCompare(b.entry))
155
176
  .forEach(({entry, label}) => actions.appendChild(button(endpointLabel(label, entry), entry)));
156
- container.appendChild(makeEl('div', {className: 'endpoint-group'}, group.children.length ? [mainAction, actions] : [mainAction]));
177
+ const children = [mainAction];
178
+ if (group.children.length) {
179
+ actions.hidden = true;
180
+ children.push(collapsibleToggle(main, actions), actions);
181
+ }
182
+ container.appendChild(makeEl('div', {className: 'endpoint-group'}, children));
157
183
  });
158
184
  }
@@ -81,6 +81,18 @@ def _install_import_stubs():
81
81
  pass
82
82
  m.OSPath = OSPathStub
83
83
  m.path_join = lambda *_a: os.path.join(*_a)
84
+ def abs_path(path):
85
+ stack = []
86
+ for part in path.split("/"):
87
+ if not part or part == ".":
88
+ continue
89
+ if part == "..":
90
+ if stack:
91
+ stack.pop()
92
+ else:
93
+ stack.append(part)
94
+ return "/" + "/".join(stack)
95
+ m.abs_path = abs_path
84
96
  sys.modules["Files"] = m
85
97
 
86
98
  m = types.ModuleType("Config")
@@ -426,6 +438,22 @@ class TestWebStateMachine(unittest.TestCase):
426
438
  self.assertNotIn(b'<script src="/auth.js"></script>', response_head)
427
439
  self.assertEqual(response_handler.getvalue(), body)
428
440
 
441
+ def test_static_path_traversal_remains_under_web_root(self):
442
+ error, path = self.web_module.url_path_resolve("../config/node_config.json")
443
+
444
+ self.assertFalse(error)
445
+ self.assertEqual(path, "/web/config/node_config.json")
446
+
447
+ def test_mounted_path_traversal_falls_back_under_web_root(self):
448
+ self.web_module.WebEngine.WEB_MOUNTS["$data"] = "/data"
449
+ try:
450
+ error, path = self.web_module.url_path_resolve("$data/../config/node_config.json")
451
+ finally:
452
+ self.web_module.WebEngine.WEB_MOUNTS.pop("$data", None)
453
+
454
+ self.assertFalse(error)
455
+ self.assertEqual(path, "/web/config/node_config.json")
456
+
429
457
  def test_mounted_html_streams_without_rewrite(self):
430
458
  body = b"<html><head></head><body>User data</body></html>"
431
459
  self.web_module.WebEngine.WEB_MOUNTS["$data"] = "/data"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: micrOSDevToolKit
3
- Version: 3.4.1
3
+ Version: 3.5.0
4
4
  Summary: Development and deployment environment for micrOS, the diy micropython automation OS (IoT)
5
5
  Home-page: https://github.com/BxNxM/micrOS
6
6
  Author: Marcell Ban
@@ -36,10 +36,10 @@ micrOS/micropython/esp32s2-LOLIN_MINI-20251209-v1.27.0.bin
36
36
  micrOS/micropython/esp32s3-4MBflash-20241129-v1.24.1.bin
37
37
  micrOS/micropython/esp32s3-8MBflash-20251209-v1.27.0.bin
38
38
  micrOS/micropython/esp32s3_spiram_oct-20251209-v1.27.0.bin
39
- micrOS/micropython/micrOS-esp32-1.28.0-3.4.0-0.bin
40
- micrOS/micropython/micrOS-esp32c3-1.28.0-3.4.0-0.bin
41
- micrOS/micropython/micrOS-esp32c6-1.28.0-3.4.0-0.bin
42
- micrOS/micropython/micrOS-esp32s3-1.28.0-3.4.0-0.bin
39
+ micrOS/micropython/micrOS-esp32-1.28.0-3.5.0-0.bin
40
+ micrOS/micropython/micrOS-esp32c3-1.28.0-3.5.0-0.bin
41
+ micrOS/micropython/micrOS-esp32c6-1.28.0-3.5.0-0.bin
42
+ micrOS/micropython/micrOS-esp32s3-1.28.0-3.5.0-0.bin
43
43
  micrOS/micropython/rpi-pico-w-20251209-v1.27.0.uf2
44
44
  micrOS/micropython/tinypico-20251209-v1.27.0.bin
45
45
  micrOS/release_info/micrOS_ReleaseInfo/system_analysis_sum.json
@@ -339,6 +339,9 @@ toolkit/user_data/webhooks/generic.py
339
339
  toolkit/user_data/webhooks/macro.py
340
340
  toolkit/user_data/webhooks/template.macro
341
341
  toolkit/user_data/webhooks/template.py
342
+ toolkit/user_data/webhooks/__pycache__/generic.cpython-312.pyc
343
+ toolkit/user_data/webhooks/__pycache__/macro.cpython-312.pyc
344
+ toolkit/user_data/webhooks/__pycache__/template.cpython-312.pyc
342
345
  toolkit/workspace/__init__.py
343
346
  toolkit/workspace/precompiled/Auth.mpy
344
347
  toolkit/workspace/precompiled/Buffer.mpy
@@ -17,7 +17,7 @@ dependencies = ['adafruit-ampy', 'mpremote', 'esptool', 'ipaddress', 'netaddr',
17
17
 
18
18
  setuptools.setup(
19
19
  name='micrOSDevToolKit',
20
- version='3.4.1',
20
+ version='3.5.0',
21
21
  author='Marcell Ban',
22
22
  author_email='miros.framework@gmail.com',
23
23
  description='Development and deployment environment for micrOS, the diy micropython automation OS (IoT)',
@@ -19,6 +19,7 @@ import requests
19
19
 
20
20
  CLIENT = None
21
21
  TIMEOUT_SEC = 5
22
+ RESULT_CONTINUATION = " " * 51
22
23
 
23
24
  # COLLECT AND SAVE SYSTEM TEST METRICS
24
25
  ENABLE_DATA_COLLECTION = os.environ.get("ENABLE_DATA_COLLECTION", False)
@@ -369,18 +370,40 @@ def micros_alarm_check():
369
370
  return _micros_alarm_legacy_report(info, alarm_data)
370
371
  return False, info + f" invalid alarm response: {output[1]}"
371
372
  if not isinstance(alarm_data.get('health'), bool):
372
- return False, info + f" missing bool health: {alarm_data}"
373
+ return False, info + " missing bool health:\n" + _format_alarm_dump(alarm_data)
373
374
  verdict = alarm_data.get('verdict', '')
374
375
  if not isinstance(verdict, str) or not verdict.startswith(('OK alarm:', 'NOK alarm:')):
375
- return False, info + f" invalid verdict: {alarm_data}"
376
+ return False, info + " invalid verdict:\n" + _format_alarm_dump(alarm_data)
376
377
  log_data = {key: value for key, value in alarm_data.items() if key not in ('health', 'verdict')}
377
378
  if any(key in ('log', 'path', 'text') or not isinstance(value, str) for key, value in log_data.items()):
378
- return False, info + f" invalid dump: {alarm_data}"
379
+ return False, info + " invalid dump:\n" + _format_alarm_dump(alarm_data)
379
380
  # Clean alarms after evaluation.
380
381
  CLIENT.execute(['system alarms clean=True'])
382
+ formatted_dump = _format_alarm_dump(alarm_data)
381
383
  if not alarm_data['health']:
382
- return True, info + f" !!!WARN!!! {verdict} out: {alarm_data}"
383
- return True, info + f" {verdict} out: {alarm_data}"
384
+ return True, info + f" !!!WARN!!! {verdict}\n{formatted_dump}"
385
+ return True, info + f" {verdict}\n{formatted_dump}"
386
+
387
+
388
+ def _format_alarm_dump(alarm_data):
389
+ """Format alarm metadata and multiline logs for the result console."""
390
+ lines = [
391
+ "Alarm dump:",
392
+ " health: {}".format(alarm_data.get('health', '<missing>')),
393
+ " verdict: {}".format(alarm_data.get('verdict', '<missing>')),
394
+ ]
395
+ for path, content in alarm_data.items():
396
+ if path in ('health', 'verdict'):
397
+ continue
398
+ lines.append(" {}:".format(path))
399
+ if isinstance(content, str):
400
+ log_lines = content.rstrip('\n').splitlines()
401
+ lines.extend(" {}".format(line) for line in log_lines)
402
+ if not log_lines:
403
+ lines.append(" <empty>")
404
+ else:
405
+ lines.append(" {!r}".format(content))
406
+ return RESULT_CONTINUATION + ("\n" + RESULT_CONTINUATION).join(lines)
384
407
 
385
408
 
386
409
  def _is_obsolete_alarm_api(output):
@@ -217,7 +217,10 @@ class micrOSClient:
217
217
  # Collect answer data
218
218
  if select.select([self.conn], [], [], read_timeout)[0]:
219
219
  while True:
220
- incoming_data = self.conn.recv(4096).decode('utf-8')
220
+ incoming_bytes = self.conn.recv(4096)
221
+ if not incoming_bytes:
222
+ raise ConnectionError("Device disconnected before sending the command prompt")
223
+ incoming_data = incoming_bytes.decode('utf-8')
221
224
  if stream:
222
225
  incoming_data = incoming_data.replace(self.prompt, f"{color.NC}{color.BOLD}{self.prompt}{color.NC}")
223
226
  print(f"\r{color.LIGHT_GRAY}{incoming_data}{color.NC}", end="")
@@ -314,15 +317,19 @@ class micrOSClient:
314
317
  for cnt in range(0, retry):
315
318
  try:
316
319
  out = self.send_cmd(cmd, timeout, stream=stream)
317
- if out is None or isinstance(out, list):
318
- break
320
+ if out is not None:
321
+ return out
319
322
  except OSError as e:
320
- self.dbg_print("Host is down, timed out: {} sec e: {}".format(timeout, e))
321
- break
323
+ self.dbg_print("Host is down, timed out: {} sec e: {}".format(timeout, e))
322
324
  except Exception as e:
323
- if "Bye!" in str(e):
324
- self.dbg_print("[Count] Send retry: {}/{}".format(cnt+1, retry))
325
- time.sleep(0.2)
325
+ self.dbg_print("Send command failed: {}".format(e))
326
+
327
+ # A failed send closes the connection in send_cmd(). Ensure other
328
+ # failure paths reconnect as well before the next attempt.
329
+ self.close()
330
+ if cnt + 1 < retry:
331
+ self.dbg_print("[Count] Send retry: {}/{}".format(cnt + 1, retry))
332
+ time.sleep(0.2)
326
333
  return out
327
334
 
328
335
  def telnet(self, timeout=5):
@@ -1,20 +1,22 @@
1
- (function(){var ID='micrOSAuth',rf=window.fetch&&window.fetch.bind(window);var user='admin',pass='';try{sessionStorage.removeItem(ID);sessionStorage.removeItem('micros.config.auth');}catch(_){}
1
+ (function(){var ID='micrOSAuth',rf=window.fetch&&window.fetch.bind(window);var user='admin',pass='',challenged={};try{sessionStorage.removeItem(ID);sessionStorage.removeItem('micros.config.auth');}catch(_){}
2
2
  function rm(e){if(e&&e.parentNode)e.parentNode.removeChild(e);}
3
3
  function load(){return{user:user,pass:pass};}
4
4
  function save(d){user=d.user||'admin';pass=d.pass||'';return load();}
5
5
  function clear(){pass='';}
6
6
  function url(i){return typeof i==='string'?i:i&&typeof i.href==='string'?i.href:i&&typeof i.url==='string'?i.url:'';}
7
7
  function same(i){try{var a=document.createElement('a'),u=url(i);if(!u)return false;a.href=u;return a.protocol===location.protocol&&a.host===location.host;}catch(_){return false;}}
8
+ function key(i){try{var a=document.createElement('a'),u=url(i);if(!u||!same(i))return'';a.href=u;return a.pathname;}catch(_){return'';}}
8
9
  function hdr(d){d=d||load();return d.pass?{'x-micros-auth':d.pass}:{};}
9
10
  function ext(a,b){var o={},k;a=a||{};for(k in a)o[k]=a[k];for(k in b)o[k]=b[k];return o;}
10
11
  function mh(a,b){var k,o={};if(window.Headers){try{o=new Headers(a||{});for(k in b)o.set(k,b[k]);return o;}catch(_){}}
11
12
  a=a||{};for(k in a)o[k]=a[k];for(k in b)o[k]=b[k];return o;}
12
13
  function af(u,o,d){o=o||{};if(!rf)return Promise.reject(Error('Fetch unsupported'));return rf(u,ext(o,{headers:mh(o.headers||(u&&u.headers),same(u)&&d?hdr(d):{})}));}
13
- function gf(u,o){o=o||{};return af(u,o).then(function(r){if(r.status!==401||o.micrOSAuth===false||!same(u))return r;var d=load();if(d.pass){return af(u,o,d).then(function(rr){if(rr.status!==401)return rr;clear();return prompt({target:u,request:o,message:'Auth required',ok:function(pr){return pr;}});});}
14
+ function gf(u,o){o=o||{};var k=key(u),d=load();var proactive=o.micrOSAuth!==false&&k&&challenged[k]&&d.pass;return af(u,o,proactive?d:null).then(function(r){if(r.status!==401||o.micrOSAuth===false||!same(u))return r;challenged[k]=true;if(proactive){clear();return prompt({target:u,request:o,message:'Auth required',ok:function(pr){return pr;}});}
15
+ if(d.pass){return af(u,o,d).then(function(rr){if(rr.status!==401)return rr;clear();return prompt({target:u,request:o,message:'Auth required',ok:function(pr){return pr;}});});}
14
16
  return prompt({target:u,request:o,message:'Auth required',ok:function(rr){return rr;}});});}
15
17
  function css(){if(document.getElementById(ID+'Style'))return;var s=document.createElement('style');s.id=ID+'Style';s.textContent='#'+ID+'{position:fixed;top:0;right:0;bottom:0;left:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:#0009;font:14px sans-serif;color:#fff}#'+ID+' form{display:flex;flex-direction:column;width:240px;max-width:90%;padding:14px;border:1px solid #555;border-radius:6px;background:#161022}#'+ID+' input,#'+ID+' button{display:block;width:100%;min-width:0;max-width:none;flex:none;height:32px;min-height:32px;margin:8px 0 0;border-radius:4px;border:1px solid #555;padding:0 9px;box-sizing:border-box;font:14px sans-serif}#'+ID+' input{background:#241a36;color:#fff;font-size:16px}#'+ID+' button{background:#17823a;color:#fff;font-weight:bold}#'+ID+' span{min-height:18px;margin-top:6px;color:#ff9a9a}#'+ID+' pre{white-space:pre-wrap;word-break:break-word}';(document.head||document.getElementsByTagName('head')[0]).appendChild(s);}
16
18
  function prompt(o){o=o||{};css();rm(document.getElementById(ID));var d=load(),p=document.createElement('div'),f,e,m,t;p.id=ID;p.innerHTML='<form><strong>micrOS Auth</strong><input name="user" autocomplete="username" placeholder="Username"><input name="pass" type="password" autocomplete="current-password" placeholder="Password"><button>Unlock</button><span></span></form>';f=p.getElementsByTagName('form')[0];e=f.elements;m=p.getElementsByTagName('span')[0];t=o.target||location.pathname;e.user.value=d.user||'admin';m.textContent=o.message||'';return new Promise(function(resolve,reject){f.onsubmit=function(ev){ev.preventDefault();var n={user:e.user.value||'admin',pass:e.pass.value||''};af(t,o.request||{},n).then(function(r){if(r.status===401){m.textContent='Access denied';return;}
17
- save(n);if(o.ok){rm(p);resolve(o.ok(r,n));return;}
19
+ save(n);var k=key(t);if(k)challenged[k]=true;if(o.ok){rm(p);resolve(o.ok(r,n));return;}
18
20
  r.text().then(function(body){if((r.headers.get('content-type')||'').indexOf('text/html')>=0){document.open();document.write(body);document.close();}else{p.removeAttribute('id');p.innerHTML='<pre></pre>';p.getElementsByTagName('pre')[0].textContent=body;}
19
21
  resolve(r);});}).catch(function(err){m.textContent='Request failed';reject(err);});};document.body.appendChild(p);e.pass.focus();});}
20
22
  function ready(fn){if(document.body)fn();else document.addEventListener('DOMContentLoaded',fn);}
@@ -190,7 +190,7 @@ if(trigKey in groupData){const wrapper=document.createElement('div');wrapper.cla
190
190
  if(cbfKey in groupData){renderMultiParamField(groupWrapper,cbfKey,groupData[cbfKey]);}
191
191
  container.appendChild(groupWrapper);}
192
192
  function trackChange(key,value){if(configData[key]===value){delete changedValues[key];}else{changedValues[key]=value;}
193
- updateSaveButtonState();console.log('Tracked change:',key,'=',value);console.log('All changes:',changedValues);}
193
+ updateSaveButtonState();console.log('Changed config keys:',Object.keys(changedValues));}
194
194
  function toggleMenu(){const menu=document.getElementById('configMenu');if(!menu)return;menu.classList.toggle('open');}
195
195
  function closeMenuOnOutsideClick(event){const menu=document.getElementById('configMenu');const toggle=document.getElementById('menuToggle');if(!menu||!menu.classList.contains('open')||window.innerWidth>768)return;if(menu.contains(event.target)||(toggle&&toggle.contains(event.target)))return;closeMobileMenu();}
196
196
  function initializeConfigUi(){addMenuListeners();const toggle=document.getElementById('menuToggle');if(toggle&&!toggle.dataset.bound){toggle.addEventListener('click',toggleMenu);toggle.dataset.bound='1';}