@openmouse/protocol 0.1.0

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 (547) hide show
  1. package/CONTRIBUTING.md +167 -0
  2. package/README.md +89 -0
  3. package/dist/asus/index.d.ts +52 -0
  4. package/dist/asus/index.d.ts.map +1 -0
  5. package/dist/asus/index.js +248 -0
  6. package/dist/asus/index.js.map +1 -0
  7. package/dist/atk/index.d.ts +200 -0
  8. package/dist/atk/index.d.ts.map +1 -0
  9. package/dist/atk/index.js +480 -0
  10. package/dist/atk/index.js.map +1 -0
  11. package/dist/bitmouse/index.d.ts +284 -0
  12. package/dist/bitmouse/index.d.ts.map +1 -0
  13. package/dist/bitmouse/index.js +396 -0
  14. package/dist/bitmouse/index.js.map +1 -0
  15. package/dist/compx/codec.d.ts +31 -0
  16. package/dist/compx/codec.d.ts.map +1 -0
  17. package/dist/compx/codec.js +50 -0
  18. package/dist/compx/codec.js.map +1 -0
  19. package/dist/corsair/index.d.ts +147 -0
  20. package/dist/corsair/index.d.ts.map +1 -0
  21. package/dist/corsair/index.js +223 -0
  22. package/dist/corsair/index.js.map +1 -0
  23. package/dist/dareu/index.d.ts +136 -0
  24. package/dist/dareu/index.d.ts.map +1 -0
  25. package/dist/dareu/index.js +344 -0
  26. package/dist/dareu/index.js.map +1 -0
  27. package/dist/drivers/asus/hid.d.ts +29 -0
  28. package/dist/drivers/asus/hid.d.ts.map +1 -0
  29. package/dist/drivers/asus/hid.js +419 -0
  30. package/dist/drivers/asus/hid.js.map +1 -0
  31. package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
  32. package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
  33. package/dist/drivers/atk/bitmouse-hid.js +501 -0
  34. package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
  35. package/dist/drivers/atk/hid.d.ts +163 -0
  36. package/dist/drivers/atk/hid.d.ts.map +1 -0
  37. package/dist/drivers/atk/hid.js +1368 -0
  38. package/dist/drivers/atk/hid.js.map +1 -0
  39. package/dist/drivers/atk/products.d.ts +13 -0
  40. package/dist/drivers/atk/products.d.ts.map +1 -0
  41. package/dist/drivers/atk/products.js +13 -0
  42. package/dist/drivers/atk/products.js.map +1 -0
  43. package/dist/drivers/attackshark/dpi.d.ts +41 -0
  44. package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
  45. package/dist/drivers/attackshark/dpi.js +215 -0
  46. package/dist/drivers/attackshark/dpi.js.map +1 -0
  47. package/dist/drivers/attackshark/hid.d.ts +124 -0
  48. package/dist/drivers/attackshark/hid.d.ts.map +1 -0
  49. package/dist/drivers/attackshark/hid.js +728 -0
  50. package/dist/drivers/attackshark/hid.js.map +1 -0
  51. package/dist/drivers/corsair/hid.d.ts +70 -0
  52. package/dist/drivers/corsair/hid.d.ts.map +1 -0
  53. package/dist/drivers/corsair/hid.js +414 -0
  54. package/dist/drivers/corsair/hid.js.map +1 -0
  55. package/dist/drivers/dareu/hid.d.ts +59 -0
  56. package/dist/drivers/dareu/hid.d.ts.map +1 -0
  57. package/dist/drivers/dareu/hid.js +478 -0
  58. package/dist/drivers/dareu/hid.js.map +1 -0
  59. package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
  60. package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
  61. package/dist/drivers/endgame/egg-op1-hid.js +605 -0
  62. package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
  63. package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
  64. package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
  65. package/dist/drivers/endgame/egg-we-control.js +87 -0
  66. package/dist/drivers/endgame/egg-we-control.js.map +1 -0
  67. package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
  68. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
  69. package/dist/drivers/endgame/egg-we-hid.js +514 -0
  70. package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
  71. package/dist/drivers/fantech/hid.d.ts +106 -0
  72. package/dist/drivers/fantech/hid.d.ts.map +1 -0
  73. package/dist/drivers/fantech/hid.js +295 -0
  74. package/dist/drivers/fantech/hid.js.map +1 -0
  75. package/dist/drivers/finalmouse/hid.d.ts +31 -0
  76. package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
  77. package/dist/drivers/finalmouse/hid.js +181 -0
  78. package/dist/drivers/finalmouse/hid.js.map +1 -0
  79. package/dist/drivers/gearhub/hid.d.ts +191 -0
  80. package/dist/drivers/gearhub/hid.d.ts.map +1 -0
  81. package/dist/drivers/gearhub/hid.js +542 -0
  82. package/dist/drivers/gearhub/hid.js.map +1 -0
  83. package/dist/drivers/glorious/classic-hid.d.ts +62 -0
  84. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
  85. package/dist/drivers/glorious/classic-hid.js +326 -0
  86. package/dist/drivers/glorious/classic-hid.js.map +1 -0
  87. package/dist/drivers/glorious/hid.d.ts +39 -0
  88. package/dist/drivers/glorious/hid.d.ts.map +1 -0
  89. package/dist/drivers/glorious/hid.js +203 -0
  90. package/dist/drivers/glorious/hid.js.map +1 -0
  91. package/dist/drivers/gwolves/hid.d.ts +27 -0
  92. package/dist/drivers/gwolves/hid.d.ts.map +1 -0
  93. package/dist/drivers/gwolves/hid.js +225 -0
  94. package/dist/drivers/gwolves/hid.js.map +1 -0
  95. package/dist/drivers/gwolves/products.d.ts +17 -0
  96. package/dist/drivers/gwolves/products.d.ts.map +1 -0
  97. package/dist/drivers/gwolves/products.js +58 -0
  98. package/dist/drivers/gwolves/products.js.map +1 -0
  99. package/dist/drivers/hyperx/hid.d.ts +59 -0
  100. package/dist/drivers/hyperx/hid.d.ts.map +1 -0
  101. package/dist/drivers/hyperx/hid.js +229 -0
  102. package/dist/drivers/hyperx/hid.js.map +1 -0
  103. package/dist/drivers/incott/hid.d.ts +513 -0
  104. package/dist/drivers/incott/hid.d.ts.map +1 -0
  105. package/dist/drivers/incott/hid.js +1173 -0
  106. package/dist/drivers/incott/hid.js.map +1 -0
  107. package/dist/drivers/index.d.ts +5 -0
  108. package/dist/drivers/index.d.ts.map +1 -0
  109. package/dist/drivers/index.js +5 -0
  110. package/dist/drivers/index.js.map +1 -0
  111. package/dist/drivers/keychron/m6-hid.d.ts +81 -0
  112. package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
  113. package/dist/drivers/keychron/m6-hid.js +486 -0
  114. package/dist/drivers/keychron/m6-hid.js.map +1 -0
  115. package/dist/drivers/keychron/nape-hid.d.ts +60 -0
  116. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
  117. package/dist/drivers/keychron/nape-hid.js +432 -0
  118. package/dist/drivers/keychron/nape-hid.js.map +1 -0
  119. package/dist/drivers/ksnake/hid.d.ts +74 -0
  120. package/dist/drivers/ksnake/hid.d.ts.map +1 -0
  121. package/dist/drivers/ksnake/hid.js +368 -0
  122. package/dist/drivers/ksnake/hid.js.map +1 -0
  123. package/dist/drivers/lamzu/hid.d.ts +58 -0
  124. package/dist/drivers/lamzu/hid.d.ts.map +1 -0
  125. package/dist/drivers/lamzu/hid.js +414 -0
  126. package/dist/drivers/lamzu/hid.js.map +1 -0
  127. package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
  128. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
  129. package/dist/drivers/lamzu-atlantis/hid.js +587 -0
  130. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
  131. package/dist/drivers/logitech/bolt.d.ts +41 -0
  132. package/dist/drivers/logitech/bolt.d.ts.map +1 -0
  133. package/dist/drivers/logitech/bolt.js +105 -0
  134. package/dist/drivers/logitech/bolt.js.map +1 -0
  135. package/dist/drivers/logitech/hidpp.d.ts +525 -0
  136. package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
  137. package/dist/drivers/logitech/hidpp.js +2774 -0
  138. package/dist/drivers/logitech/hidpp.js.map +1 -0
  139. package/dist/drivers/logitech/mode-status.d.ts +53 -0
  140. package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
  141. package/dist/drivers/logitech/mode-status.js +52 -0
  142. package/dist/drivers/logitech/mode-status.js.map +1 -0
  143. package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
  144. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
  145. package/dist/drivers/logitech/onboard-profiles.js +965 -0
  146. package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
  147. package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
  148. package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
  149. package/dist/drivers/logitech/rgb-effects.js +93 -0
  150. package/dist/drivers/logitech/rgb-effects.js.map +1 -0
  151. package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
  152. package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
  153. package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
  154. package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
  155. package/dist/drivers/mchose/dock-hid.d.ts +26 -0
  156. package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
  157. package/dist/drivers/mchose/dock-hid.js +176 -0
  158. package/dist/drivers/mchose/dock-hid.js.map +1 -0
  159. package/dist/drivers/mchose/hid.d.ts +118 -0
  160. package/dist/drivers/mchose/hid.d.ts.map +1 -0
  161. package/dist/drivers/mchose/hid.js +550 -0
  162. package/dist/drivers/mchose/hid.js.map +1 -0
  163. package/dist/drivers/mchose/v3-hid.d.ts +109 -0
  164. package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
  165. package/dist/drivers/mchose/v3-hid.js +572 -0
  166. package/dist/drivers/mchose/v3-hid.js.map +1 -0
  167. package/dist/drivers/microsoft/hid.d.ts +25 -0
  168. package/dist/drivers/microsoft/hid.d.ts.map +1 -0
  169. package/dist/drivers/microsoft/hid.js +247 -0
  170. package/dist/drivers/microsoft/hid.js.map +1 -0
  171. package/dist/drivers/moddo/hid.d.ts +31 -0
  172. package/dist/drivers/moddo/hid.d.ts.map +1 -0
  173. package/dist/drivers/moddo/hid.js +154 -0
  174. package/dist/drivers/moddo/hid.js.map +1 -0
  175. package/dist/drivers/mouse-types.d.ts +388 -0
  176. package/dist/drivers/mouse-types.d.ts.map +1 -0
  177. package/dist/drivers/mouse-types.js +2 -0
  178. package/dist/drivers/mouse-types.js.map +1 -0
  179. package/dist/drivers/ninjutso/hid.d.ts +62 -0
  180. package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
  181. package/dist/drivers/ninjutso/hid.js +680 -0
  182. package/dist/drivers/ninjutso/hid.js.map +1 -0
  183. package/dist/drivers/orbital/hid.d.ts +24 -0
  184. package/dist/drivers/orbital/hid.d.ts.map +1 -0
  185. package/dist/drivers/orbital/hid.js +85 -0
  186. package/dist/drivers/orbital/hid.js.map +1 -0
  187. package/dist/drivers/orbital/host-protocol.d.ts +59 -0
  188. package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
  189. package/dist/drivers/orbital/host-protocol.js +884 -0
  190. package/dist/drivers/orbital/host-protocol.js.map +1 -0
  191. package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
  192. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
  193. package/dist/drivers/pulsar/pulsar-hid.js +381 -0
  194. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
  195. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
  196. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
  197. package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
  198. package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
  199. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
  200. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
  201. package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
  202. package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
  203. package/dist/drivers/rawm/hid.d.ts +29 -0
  204. package/dist/drivers/rawm/hid.d.ts.map +1 -0
  205. package/dist/drivers/rawm/hid.js +210 -0
  206. package/dist/drivers/rawm/hid.js.map +1 -0
  207. package/dist/drivers/razer/cobra-hid.d.ts +63 -0
  208. package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
  209. package/dist/drivers/razer/cobra-hid.js +282 -0
  210. package/dist/drivers/razer/cobra-hid.js.map +1 -0
  211. package/dist/drivers/razer/hid-open.d.ts +13 -0
  212. package/dist/drivers/razer/hid-open.d.ts.map +1 -0
  213. package/dist/drivers/razer/hid-open.js +29 -0
  214. package/dist/drivers/razer/hid-open.js.map +1 -0
  215. package/dist/drivers/razer/hid.d.ts +231 -0
  216. package/dist/drivers/razer/hid.d.ts.map +1 -0
  217. package/dist/drivers/razer/hid.js +772 -0
  218. package/dist/drivers/razer/hid.js.map +1 -0
  219. package/dist/drivers/razer/viper-hid.d.ts +33 -0
  220. package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
  221. package/dist/drivers/razer/viper-hid.js +177 -0
  222. package/dist/drivers/razer/viper-hid.js.map +1 -0
  223. package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
  224. package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
  225. package/dist/drivers/razer/viper-mini-hid.js +273 -0
  226. package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
  227. package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
  228. package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
  229. package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
  230. package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
  231. package/dist/drivers/registry.d.ts +70 -0
  232. package/dist/drivers/registry.d.ts.map +1 -0
  233. package/dist/drivers/registry.js +146 -0
  234. package/dist/drivers/registry.js.map +1 -0
  235. package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
  236. package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
  237. package/dist/drivers/steelseries/aerox3-hid.js +172 -0
  238. package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
  239. package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
  240. package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
  241. package/dist/drivers/steelseries/aerox5-hid.js +173 -0
  242. package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
  243. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
  244. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
  245. package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
  246. package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
  247. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
  248. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
  249. package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
  250. package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
  251. package/dist/drivers/steelseries/hid.d.ts +48 -0
  252. package/dist/drivers/steelseries/hid.d.ts.map +1 -0
  253. package/dist/drivers/steelseries/hid.js +157 -0
  254. package/dist/drivers/steelseries/hid.js.map +1 -0
  255. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
  256. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
  257. package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
  258. package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
  259. package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
  260. package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
  261. package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
  262. package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
  263. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
  264. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
  265. package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
  266. package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
  267. package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
  268. package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
  269. package/dist/drivers/steelseries/rival310-hid.js +182 -0
  270. package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
  271. package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
  272. package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
  273. package/dist/drivers/steelseries/rival650-hid.js +209 -0
  274. package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
  275. package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
  276. package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
  277. package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
  278. package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
  279. package/dist/drivers/teevolution/hid.d.ts +82 -0
  280. package/dist/drivers/teevolution/hid.d.ts.map +1 -0
  281. package/dist/drivers/teevolution/hid.js +607 -0
  282. package/dist/drivers/teevolution/hid.js.map +1 -0
  283. package/dist/drivers/vendors.d.ts +254 -0
  284. package/dist/drivers/vendors.d.ts.map +1 -0
  285. package/dist/drivers/vendors.js +587 -0
  286. package/dist/drivers/vendors.js.map +1 -0
  287. package/dist/drivers/vgn/hid.d.ts +33 -0
  288. package/dist/drivers/vgn/hid.d.ts.map +1 -0
  289. package/dist/drivers/vgn/hid.js +213 -0
  290. package/dist/drivers/vgn/hid.js.map +1 -0
  291. package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
  292. package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
  293. package/dist/drivers/wallhack/keyboard-hid.js +80 -0
  294. package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
  295. package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
  296. package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
  297. package/dist/drivers/wallhack/mouse-hid.js +288 -0
  298. package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
  299. package/dist/drivers/webhid.d.ts +59 -0
  300. package/dist/drivers/webhid.d.ts.map +1 -0
  301. package/dist/drivers/webhid.js +2 -0
  302. package/dist/drivers/webhid.js.map +1 -0
  303. package/dist/drivers/wlmouse/hid.d.ts +81 -0
  304. package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
  305. package/dist/drivers/wlmouse/hid.js +576 -0
  306. package/dist/drivers/wlmouse/hid.js.map +1 -0
  307. package/dist/drivers/wooting/hid.d.ts +86 -0
  308. package/dist/drivers/wooting/hid.d.ts.map +1 -0
  309. package/dist/drivers/wooting/hid.js +320 -0
  310. package/dist/drivers/wooting/hid.js.map +1 -0
  311. package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
  312. package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
  313. package/dist/drivers/zaunkoenig/hid.js +162 -0
  314. package/dist/drivers/zaunkoenig/hid.js.map +1 -0
  315. package/dist/endgame-gear/op1.d.ts +165 -0
  316. package/dist/endgame-gear/op1.d.ts.map +1 -0
  317. package/dist/endgame-gear/op1.js +384 -0
  318. package/dist/endgame-gear/op1.js.map +1 -0
  319. package/dist/endgame-gear/wireless.d.ts +93 -0
  320. package/dist/endgame-gear/wireless.d.ts.map +1 -0
  321. package/dist/endgame-gear/wireless.js +242 -0
  322. package/dist/endgame-gear/wireless.js.map +1 -0
  323. package/dist/fantech/index.d.ts +9 -0
  324. package/dist/fantech/index.d.ts.map +1 -0
  325. package/dist/fantech/index.js +11 -0
  326. package/dist/fantech/index.js.map +1 -0
  327. package/dist/finalmouse/index.d.ts +41 -0
  328. package/dist/finalmouse/index.d.ts.map +1 -0
  329. package/dist/finalmouse/index.js +106 -0
  330. package/dist/finalmouse/index.js.map +1 -0
  331. package/dist/gearhub/index.d.ts +210 -0
  332. package/dist/gearhub/index.d.ts.map +1 -0
  333. package/dist/gearhub/index.js +282 -0
  334. package/dist/gearhub/index.js.map +1 -0
  335. package/dist/glorious/index.d.ts +89 -0
  336. package/dist/glorious/index.d.ts.map +1 -0
  337. package/dist/glorious/index.js +236 -0
  338. package/dist/glorious/index.js.map +1 -0
  339. package/dist/glorious-classic/index.d.ts +103 -0
  340. package/dist/glorious-classic/index.d.ts.map +1 -0
  341. package/dist/glorious-classic/index.js +304 -0
  342. package/dist/glorious-classic/index.js.map +1 -0
  343. package/dist/gwolves/index.d.ts +82 -0
  344. package/dist/gwolves/index.d.ts.map +1 -0
  345. package/dist/gwolves/index.js +197 -0
  346. package/dist/gwolves/index.js.map +1 -0
  347. package/dist/hyperx/index.d.ts +181 -0
  348. package/dist/hyperx/index.d.ts.map +1 -0
  349. package/dist/hyperx/index.js +303 -0
  350. package/dist/hyperx/index.js.map +1 -0
  351. package/dist/incott/index.d.ts +1067 -0
  352. package/dist/incott/index.d.ts.map +1 -0
  353. package/dist/incott/index.js +1482 -0
  354. package/dist/incott/index.js.map +1 -0
  355. package/dist/index.d.ts +30 -0
  356. package/dist/index.d.ts.map +1 -0
  357. package/dist/index.js +30 -0
  358. package/dist/index.js.map +1 -0
  359. package/dist/keychron/index.d.ts +194 -0
  360. package/dist/keychron/index.d.ts.map +1 -0
  361. package/dist/keychron/index.js +341 -0
  362. package/dist/keychron/index.js.map +1 -0
  363. package/dist/ksnake/index.d.ts +157 -0
  364. package/dist/ksnake/index.d.ts.map +1 -0
  365. package/dist/ksnake/index.js +314 -0
  366. package/dist/ksnake/index.js.map +1 -0
  367. package/dist/lamzu/atlantis.d.ts +237 -0
  368. package/dist/lamzu/atlantis.d.ts.map +1 -0
  369. package/dist/lamzu/atlantis.js +263 -0
  370. package/dist/lamzu/atlantis.js.map +1 -0
  371. package/dist/lamzu/index.d.ts +60 -0
  372. package/dist/lamzu/index.d.ts.map +1 -0
  373. package/dist/lamzu/index.js +86 -0
  374. package/dist/lamzu/index.js.map +1 -0
  375. package/dist/logitech/controls.d.ts +138 -0
  376. package/dist/logitech/controls.d.ts.map +1 -0
  377. package/dist/logitech/controls.js +184 -0
  378. package/dist/logitech/controls.js.map +1 -0
  379. package/dist/logitech/friendly-name.d.ts +50 -0
  380. package/dist/logitech/friendly-name.d.ts.map +1 -0
  381. package/dist/logitech/friendly-name.js +74 -0
  382. package/dist/logitech/friendly-name.js.map +1 -0
  383. package/dist/logitech/haptics.d.ts +97 -0
  384. package/dist/logitech/haptics.d.ts.map +1 -0
  385. package/dist/logitech/haptics.js +116 -0
  386. package/dist/logitech/haptics.js.map +1 -0
  387. package/dist/logitech/hosts.d.ts +55 -0
  388. package/dist/logitech/hosts.d.ts.map +1 -0
  389. package/dist/logitech/hosts.js +80 -0
  390. package/dist/logitech/hosts.js.map +1 -0
  391. package/dist/logitech/index.d.ts +127 -0
  392. package/dist/logitech/index.d.ts.map +1 -0
  393. package/dist/logitech/index.js +233 -0
  394. package/dist/logitech/index.js.map +1 -0
  395. package/dist/logitech/wheel.d.ts +117 -0
  396. package/dist/logitech/wheel.d.ts.map +1 -0
  397. package/dist/logitech/wheel.js +133 -0
  398. package/dist/logitech/wheel.js.map +1 -0
  399. package/dist/mchose/a5-gen1.d.ts +38 -0
  400. package/dist/mchose/a5-gen1.d.ts.map +1 -0
  401. package/dist/mchose/a5-gen1.js +60 -0
  402. package/dist/mchose/a5-gen1.js.map +1 -0
  403. package/dist/mchose/buttons.d.ts +66 -0
  404. package/dist/mchose/buttons.d.ts.map +1 -0
  405. package/dist/mchose/buttons.js +184 -0
  406. package/dist/mchose/buttons.js.map +1 -0
  407. package/dist/mchose/dock.d.ts +77 -0
  408. package/dist/mchose/dock.d.ts.map +1 -0
  409. package/dist/mchose/dock.js +133 -0
  410. package/dist/mchose/dock.js.map +1 -0
  411. package/dist/mchose/index.d.ts +299 -0
  412. package/dist/mchose/index.d.ts.map +1 -0
  413. package/dist/mchose/index.js +429 -0
  414. package/dist/mchose/index.js.map +1 -0
  415. package/dist/mchose/v3-buttons.d.ts +64 -0
  416. package/dist/mchose/v3-buttons.d.ts.map +1 -0
  417. package/dist/mchose/v3-buttons.js +258 -0
  418. package/dist/mchose/v3-buttons.js.map +1 -0
  419. package/dist/mchose/v3.d.ts +380 -0
  420. package/dist/mchose/v3.d.ts.map +1 -0
  421. package/dist/mchose/v3.js +608 -0
  422. package/dist/mchose/v3.js.map +1 -0
  423. package/dist/microsoft/index.d.ts +19 -0
  424. package/dist/microsoft/index.d.ts.map +1 -0
  425. package/dist/microsoft/index.js +22 -0
  426. package/dist/microsoft/index.js.map +1 -0
  427. package/dist/moddo/index.d.ts +72 -0
  428. package/dist/moddo/index.d.ts.map +1 -0
  429. package/dist/moddo/index.js +147 -0
  430. package/dist/moddo/index.js.map +1 -0
  431. package/dist/ninjutso/index.d.ts +74 -0
  432. package/dist/ninjutso/index.d.ts.map +1 -0
  433. package/dist/ninjutso/index.js +133 -0
  434. package/dist/ninjutso/index.js.map +1 -0
  435. package/dist/orbital/index.d.ts +14 -0
  436. package/dist/orbital/index.d.ts.map +1 -0
  437. package/dist/orbital/index.js +19 -0
  438. package/dist/orbital/index.js.map +1 -0
  439. package/dist/pulsar/index.d.ts +81 -0
  440. package/dist/pulsar/index.d.ts.map +1 -0
  441. package/dist/pulsar/index.js +185 -0
  442. package/dist/pulsar/index.js.map +1 -0
  443. package/dist/rawm/index.d.ts +55 -0
  444. package/dist/rawm/index.d.ts.map +1 -0
  445. package/dist/rawm/index.js +229 -0
  446. package/dist/rawm/index.js.map +1 -0
  447. package/dist/razer/codec.d.ts +504 -0
  448. package/dist/razer/codec.d.ts.map +1 -0
  449. package/dist/razer/codec.js +648 -0
  450. package/dist/razer/codec.js.map +1 -0
  451. package/dist/razer/devices.d.ts +156 -0
  452. package/dist/razer/devices.d.ts.map +1 -0
  453. package/dist/razer/devices.js +540 -0
  454. package/dist/razer/devices.js.map +1 -0
  455. package/dist/razer/index.d.ts +2 -0
  456. package/dist/razer/index.d.ts.map +1 -0
  457. package/dist/razer/index.js +2 -0
  458. package/dist/razer/index.js.map +1 -0
  459. package/dist/razer/v4.d.ts +19 -0
  460. package/dist/razer/v4.d.ts.map +1 -0
  461. package/dist/razer/v4.js +51 -0
  462. package/dist/razer/v4.js.map +1 -0
  463. package/dist/steelseries/aerox3.d.ts +236 -0
  464. package/dist/steelseries/aerox3.d.ts.map +1 -0
  465. package/dist/steelseries/aerox3.js +311 -0
  466. package/dist/steelseries/aerox3.js.map +1 -0
  467. package/dist/steelseries/aerox5-wireless.d.ts +300 -0
  468. package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
  469. package/dist/steelseries/aerox5-wireless.js +389 -0
  470. package/dist/steelseries/aerox5-wireless.js.map +1 -0
  471. package/dist/steelseries/aerox5.d.ts +228 -0
  472. package/dist/steelseries/aerox5.d.ts.map +1 -0
  473. package/dist/steelseries/aerox5.js +294 -0
  474. package/dist/steelseries/aerox5.js.map +1 -0
  475. package/dist/steelseries/aerox9-wireless.d.ts +213 -0
  476. package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
  477. package/dist/steelseries/aerox9-wireless.js +305 -0
  478. package/dist/steelseries/aerox9-wireless.js.map +1 -0
  479. package/dist/steelseries/devices.d.ts +82 -0
  480. package/dist/steelseries/devices.d.ts.map +1 -0
  481. package/dist/steelseries/devices.js +310 -0
  482. package/dist/steelseries/devices.js.map +1 -0
  483. package/dist/steelseries/index.d.ts +13 -0
  484. package/dist/steelseries/index.d.ts.map +1 -0
  485. package/dist/steelseries/index.js +13 -0
  486. package/dist/steelseries/index.js.map +1 -0
  487. package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
  488. package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
  489. package/dist/steelseries/prime-mini-wireless.js +351 -0
  490. package/dist/steelseries/prime-mini-wireless.js.map +1 -0
  491. package/dist/steelseries/prime-plus.d.ts +179 -0
  492. package/dist/steelseries/prime-plus.d.ts.map +1 -0
  493. package/dist/steelseries/prime-plus.js +275 -0
  494. package/dist/steelseries/prime-plus.js.map +1 -0
  495. package/dist/steelseries/rival3-wireless.d.ts +222 -0
  496. package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
  497. package/dist/steelseries/rival3-wireless.js +308 -0
  498. package/dist/steelseries/rival3-wireless.js.map +1 -0
  499. package/dist/steelseries/rival3.d.ts +99 -0
  500. package/dist/steelseries/rival3.d.ts.map +1 -0
  501. package/dist/steelseries/rival3.js +147 -0
  502. package/dist/steelseries/rival3.js.map +1 -0
  503. package/dist/steelseries/rival310.d.ts +230 -0
  504. package/dist/steelseries/rival310.d.ts.map +1 -0
  505. package/dist/steelseries/rival310.js +322 -0
  506. package/dist/steelseries/rival310.js.map +1 -0
  507. package/dist/steelseries/rival650.d.ts +215 -0
  508. package/dist/steelseries/rival650.d.ts.map +1 -0
  509. package/dist/steelseries/rival650.js +284 -0
  510. package/dist/steelseries/rival650.js.map +1 -0
  511. package/dist/steelseries/sensei-ten.d.ts +283 -0
  512. package/dist/steelseries/sensei-ten.d.ts.map +1 -0
  513. package/dist/steelseries/sensei-ten.js +389 -0
  514. package/dist/steelseries/sensei-ten.js.map +1 -0
  515. package/dist/teevolution/index.d.ts +211 -0
  516. package/dist/teevolution/index.d.ts.map +1 -0
  517. package/dist/teevolution/index.js +458 -0
  518. package/dist/teevolution/index.js.map +1 -0
  519. package/dist/valkyrie/index.d.ts +19 -0
  520. package/dist/valkyrie/index.d.ts.map +1 -0
  521. package/dist/valkyrie/index.js +43 -0
  522. package/dist/valkyrie/index.js.map +1 -0
  523. package/dist/valkyrie/settings.d.ts +28 -0
  524. package/dist/valkyrie/settings.d.ts.map +1 -0
  525. package/dist/valkyrie/settings.js +84 -0
  526. package/dist/valkyrie/settings.js.map +1 -0
  527. package/dist/vgn/index.d.ts +59 -0
  528. package/dist/vgn/index.d.ts.map +1 -0
  529. package/dist/vgn/index.js +165 -0
  530. package/dist/vgn/index.js.map +1 -0
  531. package/dist/wallhack/index.d.ts +165 -0
  532. package/dist/wallhack/index.d.ts.map +1 -0
  533. package/dist/wallhack/index.js +226 -0
  534. package/dist/wallhack/index.js.map +1 -0
  535. package/dist/wlmouse/index.d.ts +4 -0
  536. package/dist/wlmouse/index.d.ts.map +1 -0
  537. package/dist/wlmouse/index.js +7 -0
  538. package/dist/wlmouse/index.js.map +1 -0
  539. package/dist/wooting/index.d.ts +225 -0
  540. package/dist/wooting/index.d.ts.map +1 -0
  541. package/dist/wooting/index.js +296 -0
  542. package/dist/wooting/index.js.map +1 -0
  543. package/dist/zaunkoenig/index.d.ts +49 -0
  544. package/dist/zaunkoenig/index.d.ts.map +1 -0
  545. package/dist/zaunkoenig/index.js +127 -0
  546. package/dist/zaunkoenig/index.js.map +1 -0
  547. package/package.json +193 -0
@@ -0,0 +1,294 @@
1
+ /**
2
+ * SteelSeries Aerox 5 (wired-only) configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox5.py` — the primary source for every
7
+ * command byte and default here. This profile covers only `1038:1850`
8
+ * ("SteelSeries Aerox 5", endpoint 3) — the plain wired mouse, **not** the
9
+ * separately-sold Aerox 5 Wireless. See `./aerox5-wireless.ts` for that
10
+ * device: it is a genuinely different command layout (different DPI
11
+ * command polling-rate byte values, different RGB zone packing, extra
12
+ * sleep/dim timers, a fixed-argument rainbow command, and a battery read),
13
+ * not just this module with different product ids swapped in. Do not
14
+ * assume the two share a codec.
15
+ * - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — the DPI byte table for
16
+ * this device's TrueMove Air sensor. **Not** `./rival3.ts`'s
17
+ * `TRUEMOVE_CORE_DPI_TO_BYTE` (Aerox 3's sensor) — reused verbatim here
18
+ * from `./rival3-wireless.ts`'s `TRUEMOVE_AIR_DPI_TO_BYTE` instead, since
19
+ * `aerox5.py`'s `output_choices: truemove_air.choices` is byte-for-byte
20
+ * the same table rivalcfg already uses for the Rival 3 Wireless (both spot
21
+ * checked: 400→0x04, 1600→0x12, 18000→0xD6).
22
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — the DPI preset
23
+ * packet shape, same handler as Aerox 3/Rival 3 Wireless, `dpi_length_byte: 1`
24
+ * (one byte per preset, unlike Rival 3 Wireless's two). **`first_preset: 0`
25
+ * here** — unlike Aerox 3 and Rival 3 Wireless (both `first_preset: 1`),
26
+ * `aerox5.py` encodes the selected index directly with no +1 offset. This
27
+ * is the one place this device's DPI framing differs from Aerox 3's
28
+ * despite sharing the same command byte and one-byte preset width.
29
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` / `reactive_rgbcolor.py` — RGB
30
+ * value encoding, byte-identical to `./aerox3.ts`'s usage.
31
+ * - rivalcfg `rivalcfg/handlers/range.py` — LED brightness (linear 0–100
32
+ * passthrough, `range_length_byte` omitted so 1 byte).
33
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
34
+ * field layout, 5 bytes/button, but **9 physical buttons plus scroll
35
+ * up/down** (`button1`…`button9`, `scrollup`, `scrolldown` — 11 slots, 55
36
+ * bytes total) instead of Aerox 3's 6 buttons plus scroll (8 slots).
37
+ * Offsets step by 5 for buttons 1–9 (`0x00`…`0x28`) then scroll up/down
38
+ * continue the same stride (`0x2D`, `0x32`).
39
+ *
40
+ * ## Why this is a separate protocol family from Aerox 3 despite similar shape
41
+ *
42
+ * Superficially close to `./aerox3.ts` (same `0x2D`/`0x2B`/`0x21`/`0x26`/
43
+ * `0x23`/`0x22`/`0x2A`/`0x27`/`0x11 00` command bytes, same RGB zone
44
+ * bitmask-and-padding packing), but genuinely different in the details that
45
+ * matter for correctness:
46
+ *
47
+ * - Different DPI sensor table (TrueMove Air vs. TrueMove Core) — same
48
+ * command byte, disjoint value bytes.
49
+ * - `first_preset: 0` vs. Aerox 3's `first_preset: 1` (see above).
50
+ * - 9 buttons + scroll vs. Aerox 3's 6 buttons + scroll — different packet
51
+ * length and offsets past button 5.
52
+ * - `aerox5.py`'s `rainbow_effect` and `default_lighting` choice tables are
53
+ * byte-identical to `aerox3.py`'s, confirmed by direct comparison, not
54
+ * assumed — reused as identical constants rather than re-derived.
55
+ *
56
+ * Given these differences, PID `0x1850` is registered under its own family
57
+ * (`"aerox5"`), not folded into `"aerox3"`.
58
+ *
59
+ * No corroborating libratbag or OpenRGB source for `1038:1850` specifically
60
+ * was available in this environment (no local libratbag checkout, and
61
+ * OpenRGB's SteelSeries controller files were not reachable this pass) —
62
+ * every command byte above is sourced from rivalcfg alone, same
63
+ * single-source caveat cluster 2 flagged for the Rival 3 Wireless. This
64
+ * should be treated as unverified beyond rivalcfg until corroborated or
65
+ * hardware-tested.
66
+ *
67
+ * Every command is an HID output report, report id `0x00`, on the vendor
68
+ * configuration interface (`"endpoint": 3`). This module is write-only —
69
+ * `aerox5.py` defines no getter for any setting and no firmware-query
70
+ * command, same as Aerox 3. Settings apply immediately; the save command
71
+ * (`11 00`) persists them to onboard flash. None of this has been verified
72
+ * on physical hardware by this project.
73
+ */
74
+ import { TRUEMOVE_AIR_DPI_TO_BYTE } from "./rival3-wireless.js";
75
+ export const AEROX5_REPORT_ID = 0x00;
76
+ /** One-byte command prefixes; the payload is the prefix plus its arguments. */
77
+ export const AEROX5_COMMAND = {
78
+ dpiPresets: [0x2d],
79
+ pollingRate: [0x2b],
80
+ reactiveColor: [0x26],
81
+ ledBrightness: [0x23],
82
+ rainbowEffect: [0x22],
83
+ buttonsMapping: [0x2a],
84
+ defaultLighting: [0x27],
85
+ zoneColor: [0x21],
86
+ };
87
+ /** `11 00` — same byte-pair as Aerox 3's save command. */
88
+ export const AEROX5_SAVE_COMMAND = [0x11, 0x00];
89
+ export const AEROX5_POLLING_RATES = [125, 250, 500, 1000];
90
+ const POLLING_RATE_TO_BYTE = new Map([
91
+ [1000, 0x01],
92
+ [500, 0x02],
93
+ [250, 0x03],
94
+ [125, 0x04],
95
+ ]);
96
+ export const AEROX5_DPI_MIN = 100;
97
+ export const AEROX5_DPI_MAX = 18000;
98
+ export const AEROX5_DPI_STEP = 100;
99
+ export const AEROX5_MAX_DPI_PRESETS = 5;
100
+ export class Aerox5ProtocolError extends Error {
101
+ }
102
+ /** The 180 DPI values the shared TrueMove Air sensor table can express, ascending. */
103
+ export function steelseriesAerox5DpiOptions() {
104
+ return [...TRUEMOVE_AIR_DPI_TO_BYTE.keys()].sort((a, b) => a - b);
105
+ }
106
+ /**
107
+ * `2D <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
108
+ * table. One byte per DPI (`dpi_length_byte: 1`). `selectedIndex` is 0-based
109
+ * and encoded 0-based on the wire (`first_preset: 0` — unlike Aerox 3's
110
+ * `first_preset: 1`, no +1 offset here).
111
+ */
112
+ export function steelseriesAerox5EncodeDpiPresets(presets, selectedIndex) {
113
+ if (presets.length < 1 || presets.length > AEROX5_MAX_DPI_PRESETS) {
114
+ throw new Aerox5ProtocolError(`SteelSeries Aerox 5 supports 1–${AEROX5_MAX_DPI_PRESETS} DPI presets.`);
115
+ }
116
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
117
+ throw new Aerox5ProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
118
+ }
119
+ const encoded = presets.map((dpi) => {
120
+ const byte = TRUEMOVE_AIR_DPI_TO_BYTE.get(dpi);
121
+ if (byte === undefined) {
122
+ throw new Aerox5ProtocolError(`SteelSeries Aerox 5 DPI must be ${AEROX5_DPI_MIN}–${AEROX5_DPI_MAX.toLocaleString()} in ${AEROX5_DPI_STEP} DPI steps.`);
123
+ }
124
+ return byte;
125
+ });
126
+ return new Uint8Array([...AEROX5_COMMAND.dpiPresets, presets.length, selectedIndex, ...encoded]);
127
+ }
128
+ /** `2B <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04 — same mapping as Aerox 3. */
129
+ export function steelseriesAerox5EncodePollingRate(pollingRateHz) {
130
+ const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
131
+ if (byte === undefined) {
132
+ throw new Aerox5ProtocolError("SteelSeries Aerox 5 supports 125, 250, 500, or 1000 Hz polling.");
133
+ }
134
+ return new Uint8Array([...AEROX5_COMMAND.pollingRate, byte]);
135
+ }
136
+ function encodeRgb(r, g, b) {
137
+ for (const channel of [r, g, b]) {
138
+ if (!Number.isInteger(channel) || channel < 0 || channel > 255) {
139
+ throw new Aerox5ProtocolError("RGB channels must be integers 0–255.");
140
+ }
141
+ }
142
+ return [r, g, b];
143
+ }
144
+ /**
145
+ * `21 <bitmask> <padding for skipped zones> <r> <g> <b>` — identical packing
146
+ * to `./aerox3.ts`'s zone-color command: zone 1 = top LED, zone 2 = middle
147
+ * LED, zone 3 = bottom LED.
148
+ */
149
+ export function steelseriesAerox5EncodeZoneColor(zone, r, g, b) {
150
+ const [red, green, blue] = encodeRgb(r, g, b);
151
+ if (zone === 1) {
152
+ return new Uint8Array([...AEROX5_COMMAND.zoneColor, 0x01, red, green, blue]);
153
+ }
154
+ if (zone === 2) {
155
+ return new Uint8Array([...AEROX5_COMMAND.zoneColor, 0x02, 0x00, 0x00, 0x00, red, green, blue]);
156
+ }
157
+ if (zone === 3) {
158
+ return new Uint8Array([
159
+ ...AEROX5_COMMAND.zoneColor, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, red, green, blue,
160
+ ]);
161
+ }
162
+ throw new Aerox5ProtocolError("SteelSeries Aerox 5 has zones 1 (top), 2 (middle), and 3 (bottom) only.");
163
+ }
164
+ /**
165
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled —
166
+ * byte-identical to `./aerox3.ts`'s reactive-color command.
167
+ */
168
+ export function steelseriesAerox5EncodeReactiveColor(color) {
169
+ if (color === null) {
170
+ return new Uint8Array([...AEROX5_COMMAND.reactiveColor, 0x00, 0x00, 0x00, 0x00, 0x00]);
171
+ }
172
+ const [r, g, b] = encodeRgb(color.r, color.g, color.b);
173
+ return new Uint8Array([...AEROX5_COMMAND.reactiveColor, 0x01, 0x00, r, g, b]);
174
+ }
175
+ /** `23 <v>` — linear 0–100 passthrough. */
176
+ export function steelseriesAerox5EncodeLedBrightness(percent) {
177
+ if (!Number.isInteger(percent) || percent < 0 || percent > 100) {
178
+ throw new Aerox5ProtocolError("SteelSeries Aerox 5 LED brightness must be an integer 0–100.");
179
+ }
180
+ return new Uint8Array([...AEROX5_COMMAND.ledBrightness, percent]);
181
+ }
182
+ /** Byte-identical to `AEROX3_RAINBOW_ZONES`, confirmed by direct comparison of the two device files. */
183
+ export const AEROX5_RAINBOW_ZONES = {
184
+ all: 0b111,
185
+ bottom: 0b100,
186
+ middle: 0b010,
187
+ top: 0b001,
188
+ "bottom-middle": 0b110,
189
+ "middle-top": 0b011,
190
+ "bottom-top": 0b101,
191
+ };
192
+ /** `22 <bitmask>` — rainbow effect on the selected zone(s); cleared by setting a color. */
193
+ export function steelseriesAerox5EncodeRainbowEffect(zones) {
194
+ const byte = AEROX5_RAINBOW_ZONES[zones];
195
+ if (byte === undefined) {
196
+ throw new Aerox5ProtocolError(`SteelSeries Aerox 5 rainbow zones must be one of: ${Object.keys(AEROX5_RAINBOW_ZONES).join(", ")}.`);
197
+ }
198
+ return new Uint8Array([...AEROX5_COMMAND.rainbowEffect, byte]);
199
+ }
200
+ /** Byte-identical to `AEROX3_DEFAULT_LIGHTING`, confirmed by direct comparison of the two device files. */
201
+ export const AEROX5_DEFAULT_LIGHTING = {
202
+ off: [0x00, 0x00],
203
+ reactive: [0x00, 0x01],
204
+ rainbow: [0x01, 0x00],
205
+ "reactive-rainbow": [0x01, 0x01],
206
+ };
207
+ /** `27 <v1> <v2>` — what the mouse lights up as before a host ever connects. */
208
+ export function steelseriesAerox5EncodeDefaultLighting(mode) {
209
+ const bytes = AEROX5_DEFAULT_LIGHTING[mode];
210
+ if (bytes === undefined) {
211
+ throw new Aerox5ProtocolError(`SteelSeries Aerox 5 default lighting must be one of: ${Object.keys(AEROX5_DEFAULT_LIGHTING).join(", ")}.`);
212
+ }
213
+ return new Uint8Array([...AEROX5_COMMAND.defaultLighting, ...bytes]);
214
+ }
215
+ /** `11 00` — commit the current settings to onboard flash. */
216
+ export function steelseriesAerox5SaveCommand() {
217
+ return new Uint8Array(AEROX5_SAVE_COMMAND);
218
+ }
219
+ /**
220
+ * `buttons_mapping.buttons` from `aerox5.py`, id + byte offset into the
221
+ * packet — 9 physical buttons (this mouse's extra side-button cluster over
222
+ * Aerox 3's 6) plus scroll up/down, 11 slots total.
223
+ */
224
+ export const AEROX5_BUTTONS = {
225
+ button1: { id: 0x01, offset: 0x00 },
226
+ button2: { id: 0x02, offset: 0x05 },
227
+ button3: { id: 0x03, offset: 0x0a },
228
+ button4: { id: 0x04, offset: 0x0f },
229
+ button5: { id: 0x05, offset: 0x14 },
230
+ button6: { id: 0x06, offset: 0x19 },
231
+ button7: { id: 0x07, offset: 0x1e },
232
+ button8: { id: 0x08, offset: 0x23 },
233
+ button9: { id: 0x09, offset: 0x28 },
234
+ scrollUp: { id: 0x31, offset: 0x2d },
235
+ scrollDown: { id: 0x32, offset: 0x32 },
236
+ };
237
+ const AEROX5_BUTTON_FIELD_LENGTH = 5;
238
+ const AEROX5_BUTTON_DISABLE = 0x00;
239
+ const AEROX5_BUTTON_DPI_SWITCH = 0x30;
240
+ const AEROX5_BUTTON_KEYBOARD = 0x51;
241
+ const AEROX5_BUTTON_MULTIMEDIA = 0x61;
242
+ /**
243
+ * `2A` + one 55-byte (`11 buttons × 5-byte field length`) packet, zero-filled
244
+ * except where a mapping is given. Unmapped buttons are left as all-zero
245
+ * fields (rivalcfg instead fills in per-button defaults; this codec leaves
246
+ * that policy to the caller — pass every button explicitly for parity with
247
+ * rivalcfg's default profile).
248
+ */
249
+ export function steelseriesAerox5EncodeButtonsMapping(mapping) {
250
+ const names = Object.keys(AEROX5_BUTTONS);
251
+ const packet = new Array(names.length * AEROX5_BUTTON_FIELD_LENGTH).fill(0x00);
252
+ for (const [name, action] of Object.entries(mapping)) {
253
+ const slot = AEROX5_BUTTONS[name];
254
+ if (!slot) {
255
+ throw new Aerox5ProtocolError(`Unknown SteelSeries Aerox 5 button "${name}".`);
256
+ }
257
+ const { offset } = slot;
258
+ switch (action.type) {
259
+ case "button": {
260
+ packet[offset] = AEROX5_BUTTONS[action.target].id;
261
+ break;
262
+ }
263
+ case "disabled": {
264
+ packet[offset] = AEROX5_BUTTON_DISABLE;
265
+ break;
266
+ }
267
+ case "dpiSwitch": {
268
+ packet[offset] = AEROX5_BUTTON_DPI_SWITCH;
269
+ break;
270
+ }
271
+ case "keyboard": {
272
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
273
+ throw new Aerox5ProtocolError("Keyboard scan codes must be integers 0–255.");
274
+ }
275
+ packet[offset] = AEROX5_BUTTON_KEYBOARD;
276
+ packet[offset + 1] = action.code;
277
+ break;
278
+ }
279
+ case "multimedia": {
280
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
281
+ throw new Aerox5ProtocolError("Multimedia key codes must be integers 0–255.");
282
+ }
283
+ packet[offset] = AEROX5_BUTTON_MULTIMEDIA;
284
+ packet[offset + 1] = action.code;
285
+ break;
286
+ }
287
+ default: {
288
+ throw new Aerox5ProtocolError(`Unsupported SteelSeries Aerox 5 button action.`);
289
+ }
290
+ }
291
+ }
292
+ return new Uint8Array([...AEROX5_COMMAND.buttonsMapping, ...packet]);
293
+ }
294
+ //# sourceMappingURL=aerox5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox5.js","sourceRoot":"","sources":["../../src/steelseries/aerox5.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * SteelSeries Aerox 9 Wireless configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox9_wireless_wired.py` — the primary source
7
+ * for every command byte, product id, and default here, for the mouse's
8
+ * USB-cabled mode (`1038:185A`, plus the WOW Edition `0x1876`).
9
+ * - rivalcfg `rivalcfg/devices/aerox9_wireless_wireless.py` — the 2.4 GHz
10
+ * dongle mode (`1038:1858`, WOW Edition `0x1874`). Read in full and diffed
11
+ * directly against the wired-mode file: it is **not** a separate command
12
+ * set. It is `aerox9_wireless_wired.py`'s settings dict comprehended
13
+ * through one `_patch_command` helper that (1) ORs `0b01000000` (`0x40`)
14
+ * into every command's first byte and (2) adds a 64-byte `readback_length`.
15
+ * This is the exact same transform cluster 3 found for the Aerox 5
16
+ * Wireless (`./aerox5-wireless.ts`'s `applyWirelessFlag`) — confirmed here
17
+ * by direct `diff` of the two device files, not assumed from precedent.
18
+ * This module implements that transform (`applyAerox9WirelessFlag`, named
19
+ * distinctly from `./aerox5-wireless.ts`'s `applyWirelessFlag` to avoid a
20
+ * re-export collision in `./index.ts`) rather than hand-duplicating the
21
+ * wired-mode byte tables.
22
+ * - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — same TrueMove Air
23
+ * sensor table as Aerox 5 / Aerox 5 Wireless / Rival 3 Wireless — imported
24
+ * from `./rival3-wireless.ts`'s `TRUEMOVE_AIR_DPI_TO_BYTE`, not re-derived
25
+ * (same `input_range`/`output_choices` reference).
26
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — `dpi_length_byte: 1`,
27
+ * `first_preset: 0` (same as Aerox 5 and Aerox 5 Wireless — not 1, unlike
28
+ * Aerox 3 and Rival 3 Wireless), `max_preset_count: 5`.
29
+ * - rivalcfg `rivalcfg/handlers/range.py` — `sleep_timer`/`dim_timer`: same
30
+ * linear range-to-range mapping as Aerox 5 Wireless, same output ranges
31
+ * (`sleep_timer`: `[0x000000, 0x124F80, 60000]` against `[0, 20, 1]`
32
+ * minutes, i.e. `minutes * 60000` ms; `dim_timer`:
33
+ * `[0x000000, 0x124F80, 1000]` against `[0, 1200, 1]` seconds, i.e.
34
+ * `seconds * 1000` ms), little-endian 3 bytes (`range_length_byte: 3`).
35
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` / `reactive_rgbcolor.py` — RGB
36
+ * value encoding, same as every other SteelSeries family in this codebase.
37
+ * - rivalcfg `rivalcfg/handlers/none.py` — `rainbow_effect` is a fixed
38
+ * no-argument enable, `22 FF` (`62 FF` wireless), same shape as Aerox 5
39
+ * Wireless's — **not** the plain Aerox 5's zone-bitmask choice.
40
+ *
41
+ * ## No button-mapping command in this device's rivalcfg profile
42
+ *
43
+ * Despite SteelSeries marketing the Aerox 9 (Wireless) as a 9-button
44
+ * "MMO-style" mouse, `aerox9_wireless_wired.py` defines **no**
45
+ * `buttons_mapping` setting and no button-remap command at all — confirmed
46
+ * by reading the full settings dict, which has exactly nine entries
47
+ * (`sensitivity`, `polling_rate`, `z1_color`, `z2_color`, `z3_color`,
48
+ * `reactive_color`, `sleep_timer`, `dim_timer`, `rainbow_effect`,
49
+ * `default_lighting`) plus `battery_level`/`save_command`, none of them a
50
+ * buttons handler. This is unlike `./aerox5.ts` and `./aerox5-wireless.ts`,
51
+ * both of which do define one. This module therefore exposes no button
52
+ * remap function — there is nothing in the reference implementation to
53
+ * reconstruct it from, not an oversight.
54
+ *
55
+ * ## Why wired-cable-mode and 2.4 GHz-dongle-mode share one module
56
+ *
57
+ * Same pattern as Aerox 5 Wireless: one physical mouse, two USB product-id
58
+ * groups depending on how the host currently sees it, driven by the same
59
+ * command set modulo the fixed `applyAerox9WirelessFlag` transform. Every command
60
+ * byte in `AEROX9_WIRELESS_COMMAND` below is the wired-mode value;
61
+ * `applyAerox9WirelessFlag` produces the 2.4 GHz-mode byte on demand.
62
+ *
63
+ * ## Why this is a separate protocol family from Aerox 5 / Aerox 5 Wireless
64
+ *
65
+ * Aerox 9 Wireless shares several command bytes with Aerox 5 Wireless
66
+ * (`0x2D`/`0x2B`/`0x29`/`0x22`/`0x27`/`0x92`/`0x11 00`, the same
67
+ * `_patch_command` wireless-flag transform, the same `readback_length: 64`),
68
+ * but is a genuinely different device profile, confirmed by direct
69
+ * comparison of the two rivalcfg files rather than assumed from the shared
70
+ * "Aerox" naming and similar wireless architecture:
71
+ *
72
+ * - RGB zone commands are `21 01 <zone> <r> <g> <b>` here, same fixed-packet
73
+ * shape as Aerox 5 Wireless's `steelseriesAerox5WirelessEncodeZoneColor`,
74
+ * confirmed byte-identical (`z1_color`/`z2_color`/`z3_color` commands
75
+ * `[0x21, 0x01, 0x00/0x01/0x02]` match exactly) — reused here as a
76
+ * structurally identical function rather than imported, so each family's
77
+ * codec stays self-contained.
78
+ * - `dim_timer`'s command is `23 0F 01 00 00`, byte-identical to Aerox 5
79
+ * Wireless's.
80
+ * - No button-mapping command at all (see above) — Aerox 5 Wireless has one.
81
+ * - Distinct product-id space entirely: `0x185A`/`0x1876` (wired),
82
+ * `0x1858`/`0x1874` (2.4 GHz) — none overlap Aerox 5 Wireless's
83
+ * `0x1852`/`0x1854`/`0x185C`/`0x185E`/`0x1860`/`0x1862`, or any PID
84
+ * claimed by clusters 1–3.
85
+ *
86
+ * PIDs are therefore registered under their own family
87
+ * (`"aerox9-wireless"`), never `"aerox5-wireless"`.
88
+ *
89
+ * No corroborating libratbag or OpenRGB source for any of these PIDs was
90
+ * available in this environment (no local libratbag checkout, and OpenRGB's
91
+ * SteelSeries controller files were not reachable this pass) — every command
92
+ * byte above is sourced from rivalcfg alone, same single-source caveat
93
+ * clusters 2 and 3 flagged for their devices. This should be treated as
94
+ * unverified beyond rivalcfg until corroborated or hardware-tested.
95
+ *
96
+ * Every command is an HID output report, report id `0x00`, on the vendor
97
+ * configuration interface (`"endpoint": 3` for every model in both rivalcfg
98
+ * files). DPI presets, polling rate, zone colors, reactive color, sleep/dim
99
+ * timers, rainbow, and default lighting are write-only — neither rivalcfg
100
+ * file defines a getter for any of them. Battery level **is** readable (see
101
+ * below). Settings apply immediately; the save command (`11 00`,
102
+ * wireless-mode `51 00`) persists them to onboard flash. None of this has
103
+ * been verified on physical hardware by this project.
104
+ *
105
+ * ## Battery read
106
+ *
107
+ * `aerox9_wireless_wired.py` defines a `battery_level` block identical in
108
+ * shape to Aerox 5 Wireless's: an output-report write of `0x92` gets a
109
+ * 2-byte input-report reply, where `data[1] & 0b10000000` is the charging
110
+ * flag and `((data[1] & ~0b10000000) - 1) * 5` is the percentage (coarse
111
+ * 0–100 scale in steps of 5). Confirmed byte-for-byte identical to
112
+ * `aerox5_wireless_wired.py`'s `battery_level` block by direct comparison —
113
+ * not assumed. 2.4 GHz mode additionally needs `0x92 | 0x40 = 0xD2`, produced
114
+ * by `applyAerox9WirelessFlag`. This is the same battery-response shape as
115
+ * `./aerox5-wireless.ts` and a **different** shape from
116
+ * `./rival3-wireless.ts`'s `AA 01` / 3-byte-reply / plain-percentage-byte
117
+ * battery read — do not conflate the three devices' battery decoding.
118
+ */
119
+ export declare const AEROX9_WIRELESS_REPORT_ID = 0;
120
+ /** Wired-cable-mode command bytes; OR `WIRELESS_FLAG` into byte 0 for 2.4 GHz mode. */
121
+ export declare const AEROX9_WIRELESS_COMMAND: {
122
+ readonly dpiPresets: readonly [45];
123
+ readonly pollingRate: readonly [43];
124
+ readonly zoneColor: readonly [33, 1];
125
+ readonly reactiveColor: readonly [38];
126
+ readonly sleepTimer: readonly [41];
127
+ readonly dimTimer: readonly [35, 15, 1, 0, 0];
128
+ readonly rainbowEffect: readonly [34, 255];
129
+ readonly defaultLighting: readonly [39];
130
+ readonly batteryLevel: readonly [146];
131
+ };
132
+ /** `11 00` wired-mode / `51 00` 2.4 GHz-mode — see `applyAerox9WirelessFlag`. */
133
+ export declare const AEROX9_WIRELESS_SAVE_COMMAND: readonly [17, 0];
134
+ /**
135
+ * `_patch_command`: OR `0b01000000` into the command's first byte. Pass the
136
+ * wired-mode command bytes from `AEROX9_WIRELESS_COMMAND` /
137
+ * `AEROX9_WIRELESS_SAVE_COMMAND`; returns the 2.4 GHz-mode equivalent.
138
+ */
139
+ export declare function applyAerox9WirelessFlag(command: readonly number[]): number[];
140
+ export declare const AEROX9_WIRELESS_POLLING_RATES: readonly [125, 250, 500, 1000];
141
+ export declare const AEROX9_WIRELESS_DPI_MIN = 100;
142
+ export declare const AEROX9_WIRELESS_DPI_MAX = 18000;
143
+ export declare const AEROX9_WIRELESS_DPI_STEP = 100;
144
+ export declare const AEROX9_WIRELESS_MAX_DPI_PRESETS = 5;
145
+ export declare const AEROX9_WIRELESS_BATTERY_RESPONSE_LENGTH = 2;
146
+ export declare class Aerox9WirelessProtocolError extends Error {
147
+ }
148
+ /** The 180 DPI values the shared TrueMove Air sensor table can express, ascending. */
149
+ export declare function steelseriesAerox9WirelessDpiOptions(): number[];
150
+ /**
151
+ * `2D <count> <selected> <v1>…<vN>` (or `6D …` in 2.4 GHz mode). One byte
152
+ * per DPI; `selectedIndex` is 0-based and encoded 0-based on the wire
153
+ * (`first_preset: 0`).
154
+ */
155
+ export declare function steelseriesAerox9WirelessEncodeDpiPresets(presets: readonly number[], selectedIndex: number, wireless: boolean): Uint8Array;
156
+ /** `2B <v>` (`6B` wireless) with 1000→0x00, 500→0x01, 250→0x02, 125→0x03. */
157
+ export declare function steelseriesAerox9WirelessEncodePollingRate(pollingRateHz: number, wireless: boolean): Uint8Array;
158
+ export type Aerox9WirelessZone = 1 | 2 | 3;
159
+ /**
160
+ * `21 01 <zone-index> <r> <g> <b>` (`61 01 …` wireless) — a fixed 6-byte
161
+ * packet. Zone 1 = top LED, zone 2 = middle LED, zone 3 = bottom LED (strip
162
+ * order, per `z1_color`/`z2_color`/`z3_color`'s CLI flag labels).
163
+ */
164
+ export declare function steelseriesAerox9WirelessEncodeZoneColor(zone: Aerox9WirelessZone, r: number, g: number, b: number, wireless: boolean): Uint8Array;
165
+ /**
166
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled
167
+ * (`66 …` wireless) — same shape as every other SteelSeries family here.
168
+ */
169
+ export declare function steelseriesAerox9WirelessEncodeReactiveColor(color: {
170
+ r: number;
171
+ g: number;
172
+ b: number;
173
+ } | null, wireless: boolean): Uint8Array;
174
+ /**
175
+ * `29 <ms LE24>` (`69 …` wireless) — idle minutes before sleep, `0` disables.
176
+ * Encoded as `minutes * 60000` milliseconds, little-endian 3 bytes.
177
+ */
178
+ export declare function steelseriesAerox9WirelessEncodeSleepTimer(minutes: number, wireless: boolean): Uint8Array;
179
+ /**
180
+ * `23 0F 01 00 00 <ms LE24>` (`63 …` wireless) — idle seconds before the LEDs
181
+ * dim, `0` disables. Encoded as `seconds * 1000` milliseconds, little-endian
182
+ * 3 bytes.
183
+ */
184
+ export declare function steelseriesAerox9WirelessEncodeDimTimer(seconds: number, wireless: boolean): Uint8Array;
185
+ /** `22 FF` (`62 FF` wireless) — enables the rainbow effect on all zones; a color write clears it. */
186
+ export declare function steelseriesAerox9WirelessEncodeRainbowEffect(wireless: boolean): Uint8Array;
187
+ /** Byte-identical to `./aerox5-wireless.ts`'s `AEROX5_WIRELESS_DEFAULT_LIGHTING`, confirmed by direct comparison. */
188
+ export declare const AEROX9_WIRELESS_DEFAULT_LIGHTING: {
189
+ readonly off: readonly [0, 0];
190
+ readonly reactive: readonly [0, 1];
191
+ readonly rainbow: readonly [1, 0];
192
+ readonly "reactive-rainbow": readonly [1, 1];
193
+ };
194
+ export type Aerox9WirelessDefaultLighting = keyof typeof AEROX9_WIRELESS_DEFAULT_LIGHTING;
195
+ /** `27 <v1> <v2>` (`67 …` wireless) — what the mouse lights up as before a host ever connects. */
196
+ export declare function steelseriesAerox9WirelessEncodeDefaultLighting(mode: Aerox9WirelessDefaultLighting, wireless: boolean): Uint8Array;
197
+ /** `11 00` wired-mode / `51 00` 2.4 GHz-mode — commit the current settings to onboard flash. */
198
+ export declare function steelseriesAerox9WirelessSaveCommand(wireless: boolean): Uint8Array;
199
+ /** `92` wired-mode / `D2` 2.4 GHz-mode — the device answers with a two-byte input report. */
200
+ export declare function steelseriesAerox9WirelessBatteryQuery(wireless: boolean): Uint8Array;
201
+ export interface Aerox9WirelessBattery {
202
+ /** `((data[1] & ~0x80) - 1) * 5` in rivalcfg — a coarse 0–100 scale in steps of 5. */
203
+ level: number;
204
+ /** `bool(data[1] & 0b10000000)` in rivalcfg. */
205
+ isCharging: boolean;
206
+ }
207
+ /**
208
+ * Decode the two-byte battery response: `data[0]` is unused by rivalcfg's
209
+ * lambdas, `data[1]`'s top bit is the charging flag and the remaining 7 bits
210
+ * (1-indexed, hence `- 1`) scaled by 5 give the percentage.
211
+ */
212
+ export declare function steelseriesAerox9WirelessDecodeBattery(payload: Uint8Array): Aerox9WirelessBattery;
213
+ //# sourceMappingURL=aerox9-wireless.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox9-wireless.d.ts","sourceRoot":"","sources":["../../src/steelseries/aerox9-wireless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqHG;AAIH,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAK9C,uFAAuF;AACvF,eAAO,MAAM,uBAAuB;;;;;;;;;;CAU1B,CAAC;AAEX,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,kBAAwB,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAK5E;AAED,eAAO,MAAM,6BAA6B,gCAAiC,CAAC;AAU5E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,uCAAuC,IAAI,CAAC;AAIzD,qBAAa,2BAA4B,SAAQ,KAAK;CAAG;AAEzD,sFAAsF;AACtF,wBAAgB,mCAAmC,IAAI,MAAM,EAAE,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,GAChB,UAAU,CAsBZ;AAED,6EAA6E;AAC7E,wBAAgB,0CAA0C,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,CAS/G;AAWD,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAI3C;;;;GAIG;AACH,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,kBAAkB,EACxB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,OAAO,GAChB,UAAU,CAUZ;AAED;;;GAGG;AACH,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACjD,QAAQ,EAAE,OAAO,GAChB,UAAU,CAOZ;AAUD;;;GAGG;AACH,wBAAgB,yCAAyC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,CAIxG;AAED;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,CAItG;AAED,qGAAqG;AACrG,wBAAgB,4CAA4C,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAG1F;AAED,qHAAqH;AACrH,eAAO,MAAM,gCAAgC;;;;;CAKnC,CAAC;AAEX,MAAM,MAAM,6BAA6B,GAAG,MAAM,OAAO,gCAAgC,CAAC;AAE1F,kGAAkG;AAClG,wBAAgB,8CAA8C,CAC5D,IAAI,EAAE,6BAA6B,EACnC,QAAQ,EAAE,OAAO,GAChB,UAAU,CASZ;AAED,gGAAgG;AAChG,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAGlF;AAED,6FAA6F;AAC7F,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAGnF;AAED,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,UAAU,GAAG,qBAAqB,CAUjG"}